Старый 02.02.2016, 00:23   #1
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
Unhappy Вопросов тред

Невижу смысла плодить много тредов на каждый вопрос, поэтому складываю в кучу.

1) Как в постгресе писать/селектить нуллбайты?
Код:
postgres=# show server_encoding;
 server_encoding 
-----------------
 UTF8
(1 row)

postgres=# show client_encoding;
 client_encoding 
-----------------
 UTF8
(1 row)
postgres=# select version();
                                      version                                      
-----------------------------------------------------------------------------------
 PostgreSQL 9.4.5 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 5.2.0, 64-bit
(1 row)
Код:
postgres=# select chr(0);
ERROR:  null character not permitted
postgres=# select E'\000';
ERROR:  invalid byte sequence for encoding "UTF8": 0x00
postgres=# select E'\x00';                                                                                                                                                                                                                                                        
ERROR:  invalid byte sequence for encoding "UTF8": 0x00
тоже самое если конвертить к bytea. Тоже самое воспроизводится на 8.4, с самыми разными енкодингами.

Зачем?
Код:
copy (select '\x7fELF...') to '/tmp/test.so';
create function pewpew(cstring) returns int as '/tmp/test.so', 'pewpew' language c strict;
Но из-за того что нельзя селектить нуллбайты, записать so-шку не получится(не получается).
Да, можно дефолтные постгресовые либы грузить и будет мне command execution, вопрос скорее академический, чем практический.

2) Как добавить хендлер для http параметров в sqlmap?
Допустим, есть jsonrpc или xml, или параметр в каком-либо другом виде должен быть предоставлен серверу.
Для json допустим понятно:
Код:
./sqlmap.py -u http://host/?q={"id":"*","name":"Vasya"}
Но интересует есть ли возможность прогнать конечный вектор через свою функцию, а результат уже передавать дальше. В ридми такого не видел, не верится что никто такого не запилил.

Код:
commit 65b2b0ad879742c6d4f56059794dc0da86bcb7f7 refs/heads/master
Author: Miroslav Stampar <miroslav.stampar@gmail.com>
Date:   Mon Nov 21 16:41:02 2011 +0000

    adding switch --eval

3) Откуда ядро знает делался setuid процесса или нет

PAM хранит в памяти процесса хеш пароля (не затирает его). После авторизации ssh аттачится к pts и этот процесс уже с uid = тому под кем я авторизовался, но приаттачиться к нему и дампить его память нет пермишенов. Мне вот непонятно почему так?
Как это выглядит: http://paste.lolwut.me/index.php?p=44c38f9c&type=raw
Или ещё короче:
Код:
desktop# cat test.c 
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>

int main(void) {
        setresuid(1000, 1000, 1000);
        return execl("/bin/sh", "sh-", NULL);
}
desktop# cc test.c -o test
desktop# ./test 
[n0body@desktop tmp]$ grep Uid /proc/$$/status
Uid:    1000    1000    1000    1000
[n0body@desktop tmp]$ echo $$
12681
----------------- в другом терминале -----------------
» strace -f -p 12681
strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
P.S. yama/ptrace_scope = 0, дело именно в том что ядро, каким-то хером запоминает что процесс setuid'ился.
P.S.S. привет SynQ

4) Актуальный post-exploitation тулчейн
4.1 Кейлогер для tty/pts
Ничего адекватного не нагуглилось, ещё года 2 назад наговнокодил свой велосипед: https://bitbucket.org/nobody_/terminal-mirror/src но до финальной версии ему ещё далеко.
4.2 Бекконект с плюшками
Пока использую tshd, но кто вникал как он работает, наверняка такой же недовольный как и я. Нужно выбросить в помойку и сделать своё, со всеми надлежащими плюшками типа кроссплатформенности, шифрования, поддержки нормальной передачи файлов, форвардинг портов, etc.

Кому интересно этим заняться, велком в пм.
__________________
Sad panda

Последний раз редактировалось nobody; 02.02.2016 в 09:14..
nobody вне форума   Ответить с цитированием
Старый 02.02.2016, 13:56   #2
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Цитата:
P.S.S. привет SynQ
Привет
А что будет, если попробовать перед setresuid(); добавить setresgid(1000, 1000, 1000); ?


Ход видимо такой:
SYSCALL_ptrace > ptrace_attach() > __ptrace_may_access() > -EPERM
https://github.com/torvalds/linux/bl.../ptrace.c#L240
SynQ вне форума   Ответить с цитированием
Старый 03.02.2016, 00:40   #3
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
По умолчанию

про gid забыл, действительно важно
в моём примере test.c resetresgid(1000,1000,1000); перед setresuid решает проблему и ptrace можно сделать, но в случае в ssh ситуация другая
Код:
» ssh localhost -l n0body
n0body@localhost's password: 
Last login: Wed Feb  3 00:30:00 2016 from ::1
» ps auxf | grep -C 3 $PPID
root     28085  0.0  0.0 163444  2092 ?        Ss   Feb01   0:03 /usr/bin/gpg-agent --daemon
root     24890  0.0  0.0  40424  2124 ?        Ss   00:29   0:00 /usr/bin/sshd
root     25220  0.0  0.0  99916  6696 ?        Ss   00:30   0:00  \_ sshd: n0body [priv]
n0body   25250  0.0  0.0  99916  4000 ?        S    00:30   0:00      \_ sshd: n0body@pts/8
n0body   25251  0.4  0.0  33356  4800 pts/8    Ss   00:30   0:00          \_ -zsh
n0body   25313  0.0  0.0  37816  3444 pts/8    R+   00:30   0:00              \_ ps auxf
n0body   25314  0.0  0.0  11944  2220 pts/8    S+   00:30   0:00              \_ grep --color=auto -C 3 25250
» ls -la /proc/25250/
ls: cannot read symbolic link /proc/25250/cwd: Permission denied
ls: cannot read symbolic link /proc/25250/root: Permission denied
ls: cannot read symbolic link /proc/25250/exe: Permission denied
total 0
dr-xr-xr-x   9 n0body n0body 0 Feb  3 00:30 .
dr-xr-xr-x 137 root   root   0 Feb  1 19:55 ..
dr-xr-xr-x   2 n0body n0body 0 Feb  3 00:30 attr
dr-x------   2 root   root   0 Feb  3 00:30 fd
dr-x------   2 root   root   0 Feb  3 00:30 fdinfo
dr-x------   2 root   root   0 Feb  3 00:30 map_files
dr-xr-xr-x   5 n0body n0body 0 Feb  3 00:30 net
dr-x--x--x   2 root   root   0 Feb  3 00:30 ns
dr-xr-xr-x   3 n0body n0body 0 Feb  3 00:30 task
-rw-r--r--   1 root   root   0 Feb  3 00:30 autogroup
-r--------   1 root   root   0 Feb  3 00:30 auxv
-r--r--r--   1 root   root   0 Feb  3 00:30 cgroup
--w-------   1 root   root   0 Feb  3 00:30 clear_refs
-r--r--r--   1 root   root   0 Feb  3 00:30 cmdline
-rw-r--r--   1 root   root   0 Feb  3 00:30 comm
-rw-r--r--   1 root   root   0 Feb  3 00:30 coredump_filter
-r--r--r--   1 root   root   0 Feb  3 00:30 cpuset
lrwxrwxrwx   1 root   root   0 Feb  3 00:30 cwd
-r--------   1 root   root   0 Feb  3 00:30 environ
lrwxrwxrwx   1 root   root   0 Feb  3 00:30 exe
-r--------   1 root   root   0 Feb  3 00:30 io
-r--r--r--   1 root   root   0 Feb  3 00:30 limits
-r--r--r--   1 root   root   0 Feb  3 00:30 maps
-rw-------   1 root   root   0 Feb  3 00:30 mem
-r--r--r--   1 root   root   0 Feb  3 00:30 mountinfo
-r--r--r--   1 root   root   0 Feb  3 00:30 mounts
-r--------   1 root   root   0 Feb  3 00:30 mountstats
-r--r--r--   1 root   root   0 Feb  3 00:30 numa_maps
-rw-r--r--   1 root   root   0 Feb  3 00:30 oom_adj
-r--r--r--   1 root   root   0 Feb  3 00:30 oom_score
-rw-r--r--   1 root   root   0 Feb  3 00:30 oom_score_adj
-r--------   1 root   root   0 Feb  3 00:30 pagemap
-r--------   1 root   root   0 Feb  3 00:30 personality
lrwxrwxrwx   1 root   root   0 Feb  3 00:30 root
-rw-r--r--   1 root   root   0 Feb  3 00:30 sched
-r--r--r--   1 root   root   0 Feb  3 00:30 schedstat
-r--r--r--   1 root   root   0 Feb  3 00:30 smaps
-r--------   1 root   root   0 Feb  3 00:30 stack
-r--r--r--   1 root   root   0 Feb  3 00:30 stat
-r--r--r--   1 root   root   0 Feb  3 00:30 statm
-r--r--r--   1 root   root   0 Feb  3 00:30 status
-r--------   1 root   root   0 Feb  3 00:30 syscall
-r--r--r--   1 root   root   0 Feb  3 00:30 wchan
» grep 'Uid\|Gid' /proc/25250/status
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
...
» grep -rnw -e 'PR_SET_DUMPABLE' 
./openssh-7.1p2/sftp-server.c:1590:#if defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE)
./openssh-7.1p2/sftp-server.c:1597:     if (prctl(PR_SET_DUMPABLE, 0) != 0)
./openssh-7.1p2/sftp-server.c:1599:#endif /* defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE) */
./openssh-7.1p2/ssh-agent.c:92:#include <sys/prctl.h>   /* For prctl() and PR_SET_DUMPABLE */
./openssh-7.1p2/ssh-agent.c:1198:#if defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE)
./openssh-7.1p2/ssh-agent.c:1200:       prctl(PR_SET_DUMPABLE, 0);
./openssh-7.1p2/ChangeLog:4990:       PR_SET_DUMPABLE, so adjust ifdef; reported by Tom Christensen
тоесть все uid/gid таки сбросились на моего пользователя, но в /proc/pid овнер на всякие status / wchan остался рутом, дело явно не в prctl, в __ptrace_may_access трекается suid/sgid. Короче я нихуя не понимаю
__________________
Sad panda

Последний раз редактировалось nobody; 03.02.2016 в 00:43..
nobody вне форума   Ответить с цитированием
Старый 03.02.2016, 13:28   #4
tex
 
Регистрация: 26.12.2010
Сообщений: 135
Репутация: 41
По умолчанию

Цитата:
Сообщение от nobody Посмотреть сообщение
4.1 Кейлогер для tty/pts
Изучал в свое время тоже эту тему, нашел только два основных решения проблемы - либо использовать файл заглушку/замену запускаемому бинарнику - bash/ssh/su либо инжектить свою либу в процесс. Если инжектить под тем же юзером через LD_PRELOAD - то при смене ID варнинг выскакивает. После пробовал инжектить всем подряд через /etc/ld.preload, определять что дескриптор есть терминал и записывать вывод в файл- но это палево большое и много мусора ловит.


tshd, имхо просто надо самому допиливать, шифрование там есть и так, передачу файлов улучшить и фордеринг портов прикрутить, стелсинг придумать и скрытие дочерних процессов. Плюс еще очень пригодились бы разные фишки тунелирования - типа через dns/icmp/http
tex вне форума   Ответить с цитированием
Старый 03.02.2016, 14:06   #5
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

nobody
Почему-то затыкается на каком-то из двух вызовов ptrace_has_cap().

Код:
 0)               |  SyS_ptrace() {
 0)               |    ptrace_get_task_struct() {
 0)               |      find_task_by_vpid() {
 0)               |        find_task_by_pid_ns() {
 0)   0.896 us    |          find_pid_ns();
 0)   1.913 us    |        }
 0)   2.920 us    |      }
 0)   4.018 us    |    }
 0)               |    ptrace_attach() {
 0)               |      mutex_lock_interruptible() {
 0)   0.100 us    |        _cond_resched();
 0)   1.207 us    |      }
 0)   0.105 us    |      _raw_spin_lock();
 0)               |      __ptrace_may_access() {
 0)               |        ptrace_has_cap() {
 0)               |          has_ns_capability() {
 0)               |            security_capable() {
 0)               |              apparmor_capable() {
 0)   0.185 us    |                cap_capable();
 0)   1.202 us    |              }
 0)   2.420 us    |            }
 0)   3.321 us    |          }
 0)   4.349 us    |        }
 0)   6.277 us    |      }
 0)   0.105 us    |      _raw_spin_unlock();
 0)   0.100 us    |      mutex_unlock();
 0) + 12.239 us   |    }
 0) + 18.381 us   |  }
SynQ вне форума   Ответить с цитированием
Старый 05.02.2016, 03:56   #6
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
По умолчанию

Думал станет понятней, стало только хуже.
Во-первых проблема (непонимание) проявляется только при UsePrivilegeSeparation в конфиге, что дефолт после 6.0 кажется. Если sandbox отрубить, то процесс с pts/# будет от рута, и тогда всё логично.

sandbox который по идее должен затрагивать только net-процесс, тоесть тот самый процесс который обсуживает авторизацию, затрагивает и процесс который появляется и после успешной авторизации. Вернее сказать, самой песочницой там и не пахнет, просто if (use_privsep) встречается и после успешной авторизации.
Код:
#0  permanently_set_uid (pw=pw@entry=0x55bf56ba01a0) at uidswap.c:238
#1  0x000055bf560e0317 in do_setusercontext (pw=0x55bf56ba01a0) at session.c:1564
#2  0x000055bf560d185c in privsep_postauth (authctxt=0x55bf56b9e4a0) at sshd.c:778
#3  main (ac=<optimized out>, av=<optimized out>) at sshd.c:2254
Код:
1489 void
1490 do_setusercontext(struct passwd *pw)
1491 {
/***/
1507     if (setlogin(pw->pw_name) < 0)
1508       error("setlogin failed: %s", strerror(errno));
/**/
1564     permanently_set_uid(pw);
/***/
какой-то bsdшный сискол, который влияет на контекст процесса, как его реализовали sshd если в системе его нет?
Код:
 66 int setlogin(const char *name)
 67 {
 68   return (0);
 69 }
Окей.
Но permanently_set_uid сбрасывает привилегии правильно setresgid() + setresuid().
__________________
Sad panda
nobody вне форума   Ответить с цитированием
Ответ

Метки
боль, postgresql, ptrace, sqlmap, tshd

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot