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

  • Пакет ACK SYN сброшен, ACK установлен seq = 324808531ack = 288666268СерверПакет SYN SYN установлен, ACK сброшен seq = 324808530ack = 0Пакет SYN/A CK

  • 0x440 Анализ сетевых пакетов (сниффинг)

  • 0x441 Сниффер сокетов прямого доступа

  • 0x442 Сниффер libpcap

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


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

    251
    ны оба флага SYN и ACK. Чтобы завершить установление связи, кли- ент посылает пакет, в котором сброшен флаг SYN, но установлен флаг
    ACK. После этого у всех пакетов в соединении флаг ACK установлен, а флаг SYN сброшен. Только у первых двух пакетов в соединении уста- новлен флаг SYN, потому что эти пакеты используются для синхрони- зации порядковых номеров (рис. 4.6).
    Клиент
    Пакет ACK
    SYN сброшен, ACK установлен seq # = 324808531
    ack # = 288666268
    Сервер
    Пакет SYN
    SYN установлен, ACK сброшен seq # = 324808530
    ack # = 0
    Пакет SYN/A CK
    SYN установлен, ACK установлен seq # = 288666267
    ack # = 324808531
    Рис. 4.6.
    Открытие соединения
    Порядковые номера позволяют TCP восстанавливать порядок получае- мых пакетов, обнаруживать потерю пакетов и не допускать смешения пакетов из разных соединений.
    При инициировании соединения на каждом его конце генерируется начальный порядковый номер. Этот номер сообщается другой стороне в первых двух пакетах SYN процедуры открытия соединения. Затем при передаче каждого пакета порядковый номер увеличивается на ко- личество байт в секции данных пакета. Этот порядковый номер вклю- чается в TCP-заголовок пакета. Кроме того, каждый TCP-заголовок содержит номер подтверждения, равный порядковому номеру другой стороны, увеличенному на 1.
    TCP прекрасно действует там, где необходимы надежность и двуна- правленная связь. Однако эти функции оборачиваются дополнитель- ными расходами на связь.
    Для UDP характерен гораздо меньший объем накладных расходов и встроенных функций, чем для TCP. Ограниченная функциональ- ность делает его похожим на протокол IP: он не устанавливает соеди- нение и не надежен. Без встроенных функций для создания соедине- ний и обеспечения надежности UDP оказывается альтернативным про- токолом, предполагающим, что эти проблемы будет решать само при- ложение. Устанавливать соединение требуется не всегда, и в таких си- туациях UDP – более удачный выбор. UDP-заголовок, определенный в RFC 768, относительно невелик. Он состоит из четырех 16-разрядных

    252
    0x400Сетевое взаимодействие значений в таком порядке: порт отправителя, порт получателя, длина и контрольная сумма.
    0x440 Анализ сетевых пакетов (сниффинг)
    На канальном уровне пролегает различие между коммутируемыми и некоммутируемыми сетями. В некоммутируемой сети (unswitched
    network) пакеты Ethernet проходят через каждое имеющееся в сети устройство в предположении, что любое устройство будет рассматри- вать только адресованные ему пакеты. Однако довольно легко задать для устройства неразборчивый режим (promiscuous mode), в котором оно будет принимать все пакеты независимо от их адресата. Большин- ство программ перехвата пакетов, таких как tcpdump, по умолчанию переводят прослушиваемое ими устройство в неразборчивый режим.
    Неразборчивый режим можно установить с помощью команды ifcon- fig
    , как показывает следующий листинг.
    reader@hacking:

    /booksrc $ ifconfig eth0
    eth0 Link encap:Ethernet HWaddr 00:0C:29:34:61:65
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:17115 errors:0 dropped:0 overruns:0 frame:0
    TX packets:1927 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:4602913 (4.3 MiB) TX bytes:434449 (424.2 KiB)
    Interrupt:16 Base address:0x2024
    reader@hacking:/booksrc $ sudo ifconfig eth0 promisc reader@hacking:/booksrc $ ifconfig eth0
    eth0 Link encap:Ethernet HWaddr 00:0C:29:34:61:65
    UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
    RX packets:17181 errors:0 dropped:0 overruns:0 frame:0
    TX packets:1927 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:4668475 (4.4 MiB) TX bytes:434449 (424.2 KiB)
    Interrupt:16 Base address:0x2024
    reader@hacking:/booksrc $
    Перехват пакетов, которые могут быть не предназначены для всеобще- го обозрения, называют сниффингом (от sniff – нюхать). Сниффинг па- кетов, проходящих в некоммутируемой сети, в неразборчивом режиме может дать разнообразную полезную информацию, как показано в сле- дующем листинге.
    reader@hacking:/booksrc $ sudo tcpdump -l -X ‘ip host 192.168.0.118’
    tcpdump: listening on eth0 21:27:44.684964 192.168.0.118.ftp > 192.168.0.193.32778: P 1:42(41) ack 1 win 17316 (DF)
    0x0000 4500 005d e065 4000 8006 97ad c0a8 0076 E..].e@........v
    0x0010 c0a8 00c1 0015 800a 292e 8a73 5ed4 9ce8 ........)..s^...
    0x0020 8018 43a4 a12f 0000 0101 080a 0007 1f78 ..C../.........x

    0x440 Анализ сетевых пакетов (сниффинг)
    253
    0x0030 000e 0a8a 3232 3020 5459 5053 6f66 7420 ....220.TYPSoft.
    0x0040 4654 5020 5365 7276 6572 2030 2e39 392e FTP.Server.0.99.
    0x0050 3133 13 21:27:44.685132 192.168.0.193.32778 > 192.168.0.118.ftp: . ack 42 win 5840
    (DF) [tos 0x10]
    0x0000 4510 0034 966f 4000 4006 21bd c0a8 00c1 E..4.o@.@.!.....
    0x0010 c0a8 0076 800a 0015 5ed4 9ce8 292e 8a9c ...v....^...)...
    0x0020 8010 16d0 81db 0000 0101 080a 000e 0c56 ...............V
    0x0030 0007 1f78 ...x
    21:27:52.406177 192.168.0.193.32778 > 192.168.0.118.ftp: P 1:13(12) ack 42 win 5840 (DF) [tos 0x10]
    0x0000 4510 0040 9670 4000 4006 21b0 c0a8 00c1 E..@.p@.@.!.....
    0x0010 c0a8 0076 800a 0015 5ed4 9ce8 292e 8a9c ...v....^...)...
    0x0020 8018 16d0 edd9 0000 0101 080a 000e 0f5a ...............Z
    0x0030 0007 1f78 5553 4552 206c 6565 6368 0d0a ...xUSER.leech..
    21:27:52.415487 192.168.0.118.ftp > 192.168.0.193.32778: P 42:76(34) ack 13
    win 17304 (DF)
    0x0000 4500 0056 e0ac 4000 8006 976d c0a8 0076 E..V..@....m...v
    0x0010 c0a8 00c1 0015 800a 292e 8a9c 5ed4 9cf4 ........)...^...
    0x0020 8018 4398 4e2c 0000 0101 080a 0007 1fc5 ..C.N,..........
    0x0030 000e 0f5a 3333 3120 5061 7373 776f 7264 ...Z331.Password
    0x0040 2072 6571 7569 7265 6420 666f 7220 6c65 .required.for.le
    0x0050 6563 ec
    21:27:52.415832 192.168.0.193.32778 > 192.168.0.118.ftp: . ack 76 win 5840
    (DF) [tos 0x10]
    0x0000 4510 0034 9671 4000 4006 21bb c0a8 00c1 E..4.q@.@.!.....
    0x0010 c0a8 0076 800a 0015 5ed4 9cf4 292e 8abe ...v....^...)...
    0x0020 8010 16d0 7e5b 0000 0101 080a 000e 0f5b ....[.........[
    0x0030 0007 1fc5 ....
    21:27:56.155458 192.168.0.193.32778 > 192.168.0.118.ftp: P 13:27(14) ack 76
    win 5840 (DF) [tos 0x10]
    0x0000 4510 0042 9672 4000 4006 21ac c0a8 00c1 E..B.r@.@.!.....
    0x0010 c0a8 0076 800a 0015 5ed4 9cf4 292e 8abe ...v....^...)...
    0x0020 8018 16d0 90b5 0000 0101 080a 000e 10d1 ................
    0x0030 0007 1fc5 5041 5353 206c 3840 6e69 7465 ....PASS.l8@nite
    0x0040 0d0a ..
    21:27:56.179427 192.168.0.118.ftp > 192.168.0.193.32778: P 76:103(27) ack 27
    win 17290 (DF)
    0x0000 4500 004f e0cc 4000 8006 9754 c0a8 0076 E..O..@....T...v
    0x0010 c0a8 00c1 0015 800a 292e 8abe 5ed4 9d02 ........)...^...
    0x0020 8018 438a 4c8c 0000 0101 080a 0007 1feb ..C.L...........
    0x0030 000e 10d1 3233 3020 5573 6572 206c 6565 ....230.User.lee
    0x0040 6368 206c 6f67 6765 6420 696e 2e0d 0a ch.logged.in...
    Данные, передаваемые по сети такими сервисами, как telnet, FTP и POP3, не шифруются. В предыдущем примере видно, как пользова- тель leech регистрируется на сервере FTP с помощью пароля l8@nite.
    Так как процедура аутентификации во время входа в систему тоже не шифруется, имена пользователей и пароли содержатся в информаци- онной части передаваемых пакетов.

    254
    0x400Сетевое взаимодействие
    Программа tcpdump – замечательный универсальный сниффер (пере- хватчик пакетов), но есть и специальные инструменты для сниффин- га, предназначенные для извлечения имен пользователей и паролей.
    Например, есть замечательная программа dsniff для выявления дан- ных, представляющих интерес, которую разработал Даг Сонг (Dug
    Song).
    reader@hacking:/booksrc $ sudo dsniff -n dsniff: listening on eth0
    -----------------
    12/10/02 21:43:21 tcp 192.168.0.193.32782 -> 192.168.0.118.21 (ftp)
    USER leech
    PASS l8@nite
    -----------------
    12/10/02 21:47:49 tcp 192.168.0.193.32785 -> 192.168.0.120.23 (telnet)
    USER root
    PASS 5eCr3t
    0x441 Сниффер сокетов прямого доступа
    В наших предыдущих примерах использовались сокеты потоков. При отправке и приеме через сокеты потоков данные инкапсулируются в соединении TCP/IP. При доступе к сеансовому уровню модели OSI
    (5) (см. рис. 4.1) операционная система берет на себя решение всех за- дач передачи, исправления ошибок и маршрутизации на более низком уровне. Возможность доступа к сети на более низких уровнях предо- ставляют сокеты прямого доступа (raw sockets). На этом нижнем уров- не видны все детали, с которыми программист должен работать явным образом. Сокеты прямого доступа создаются, если указать в качестве типа SOCK_RAW. В этом случае имеет значение выбор протокола, посколь- ку предлагается несколько его вариантов. В качестве протокола можно указать IPPROTO_TCP, IPPROTO_UDP или IPPROTO_ICMP. Ниже приведена про- грамма сниффинга TCP, использующая сокеты прямого доступа.
    raw_tcpsniff.c
    #include
    #include
    #include
    #include
    #include
    #include
    #include “hacking.h”
    int main(void) {
    int i, recv_length, sockfd;
    u_char buffer[9000];

    0x440 Анализ сетевых пакетов (сниффинг)
    255
    if ((sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP)) == -1)
    fatal(“in socket”);
    for(i=0; i < 3; i++) {
    recv_length = recv(sockfd, buffer, 8000, 0);
    printf(“Got a %d byte packet\n”, recv_length);
    dump(buffer, recv_length);
    }
    }
    Эта программа открывает сокет TCP прямого доступа и ожидает полу- чения трех пакетов, выводя каждый из них на устройство вывода с по- мощью функции dump(). Обратите внимание: буфер объявлен как пе- ременная типа u_char. Это вспомогательный тип из sys/socket.h, кото- рый раскрывается как unsigned char. Он удобен, потому что беззнако- вые переменные интенсивно используются в сетевом программирова- нии, а печатать каждый раз «unsigned» достаточно утомительно.
    После компиляции программа должна быть запущена с правами root, потому что обращение к сокетам прямого доступа требует прав супер- пользователя. Ниже приведен пример работы программы сниффинга во время посылки некоторого текста нашему простому серверу (simple_
    server.c).
    reader@hacking:/booksrc $ gcc -o raw_tcpsniff raw_tcpsniff.c reader@hacking:/booksrc $ ./raw_tcpsniff
    [!!] Fatal Error in socket: Operation not permitted reader@hacking:/booksrc $ sudo ./raw_tcpsniff
    Got a 68 byte packet
    45 10 00 44 1e 36 40 00 40 06 46 23 c0 a8 2a 01 | E..D.6@.@.F#..*.
    c0 a8 2a f9 8b 12 1e d2 ac 14 cf 92 e5 10 6c c9 | ..*...........l.
    80 18 05 b4 32 47 00 00 01 01 08 0a 26 ab 9a f1 | ....2G......&...
    02 3b 65 b7 74 68 69 73 20 69 73 20 61 20 74 65 | .;e.this is a te
    73 74 0d 0a | st..
    Got a 70 byte packet
    45 10 00 46 1e 37 40 00 40 06 46 20 c0 a8 2a 01 | E..F.7@.@.F ..*.
    c0 a8 2a f9 8b 12 1e d2 ac 14 cf a2 e5 10 6c c9 | ..*...........l.
    80 18 05 b4 27 95 00 00 01 01 08 0a 26 ab a0 75 | ....’.......&..u
    02 3c 1b 28 41 41 41 41 41 41 41 41 41 41 41 41 | .<.(AAAAAAAAAAAA
    41 41 41 41 0d 0a | AAAA..
    Got a 71 byte packet
    45 10 00 47 1e 38 40 00 40 06 46 1e c0 a8 2a 01 | E..G.8@.@.F...*.
    c0 a8 2a f9 8b 12 1e d2 ac 14 cf b4 e5 10 6c c9 | ..*...........l.
    80 18 05 b4 68 45 00 00 01 01 08 0a 26 ab b6 e7 | ....hE......&...
    02 3c 20 ad 66 6a 73 64 61 6c 6b 66 6a 61 73 6b | .< .fjsdalkfjask
    66 6a 61 73 64 0d 0a | fjasd..
    reader@hacking:/booksrc $
    Эта программа может перехватывать пакеты, но она работает нена- дежно и будет пропускать пакеты, особенно при интенсивном трафи- ке. Кроме того, она перехватывает только TCP-пакеты; для перехва-

    256
    0x400Сетевое взаимодействие та UDP- или ICMP-пакетов нужно открывать дополнительные соке- ты прямого доступа. Другая серьезная проблема, связанная с сокета- ми прямого доступа, – это существенные различия между их реализа- циями в разных системах. Код для работы с сокетами прямого досту- па в Linux скорее всего не сможет функционировать в BSD или Solaris.
    Создать мультиплатформенное приложение для работы с сокетами пря- мого доступа практически невозможно.
    0x442 Сниффер libpcap
    Решить проблему несовместимости сокетов прямого доступа на раз- ных платформах позволяет библиотека libpcap. Функции этой библио- теки используют в своей работе сокеты прямого доступа, но делают это правильно, учитывая конкретную архитектуру. Библиотека libpcap ис- пользуется как в tcpdump, так и в dsniff, что позволяет относительно просто компилировать эти программы на любой платформе.
    Напишем сниффер пакетов, используя не собственные функции, а те, которые есть в библиотеке libpcap. Они достаточно понятны интуитив- но, поэтому разберем их на примере следующего листинга.
    pcap_sniff.c
    #include
    #include “hacking.h”
    void pcap_fatal(const char *failed_in, const char *errbuf) {
    printf(“Fatal Error in %s: %s\n”, failed_in, errbuf);
    exit(1);
    }
    Сначала включаем файл pcap.h, который содержит разные структуры и макроопределения, используемые функциями pcap. Кроме того, я на- писал функцию pcap_fatal(), чтобы выводить сообщения о критических ошибках. Функции pcapзаписывают сообщения об ошибке и статусе в буфер, и данная функция отображает этот буфер для пользователя.
    int main() {
    struct pcap_pkthdr header;
    const u_char *packet;
    char errbuf[PCAP_ERRBUF_SIZE];
    char *device;
    pcap_t *pcap_handle;
    int i;
    }
    Переменная errbuf – это уже упомянутый буфер ошибок, а его размер устанавливается в pcap.h равным 256. Переменная header – это структу- ра pcap_pkthdr, которая содержит дополнительные данные о перехвачен- ном пакете, такие как время перехвата и размер. Указатель pcap_handle

    0x440 Анализ сетевых пакетов (сниффинг)
    257
    аналогичен дескриптору файла, но служит для ссылки на объект, веду- щий перехват пакетов.
    device = pcap_lookupdev(errbuf);
    if(device == NULL)
    pcap_fatal(“pcap_lookupdev”, errbuf);
    printf(“Sniffing on device %s\n”, device);
    Функция pcap_lookupdev() ищет устройство, на котором можно вести перехват пакетов. Устройство возвращается в виде указателя на стро- ку, находящуюся в статической памяти функции. В нашей системе это всегда будет устройство /dev/eth0, но на машине с BSD оно будет назы- ваться иначе. Если функция не может найти подходящий интерфейс, она возвращает NULL.
    pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);
    if(pcap_handle == NULL)
    pcap_fatal(“pcap_open_live”, errbuf);
    Аналогично функциям открытия сокета и файла, функция pcap_open_
    live()
    открывает устройство перехвата пакетов и возвращает его де- скриптор. Аргументами для этой функции служат устройство перехва- та, максимальный размер пакета, флаг неразборчивого режима и ука- затель на буфер ошибок. Мы хотим вести перехват в неразборчивом ре- жиме, поэтому флаг установлен в 1.
    for(i=0; i < 3; i++) {
    packet = pcap_next(pcap_handle, &header);
    printf(“Got a %d byte packet\n”, header.len);
    dump(packet, header.len);
    }
    pcap_close(pcap_handle);
    }
    Наконец, в цикле перехвата пакетов вызывается функция pcap_next(), которая захватывает очередной пакет. Этой функции передаются де- скриптор pcap_handle и указатель на структуру pcap_pkthdr, в которую она запишет результаты перехвата. Функция возвращает указатель на пакет и выводит его содержимое, получая размер из заголовка перехва- та. Интерфейс перехвата закрывается посредством pcap_close().
    При компиляции этой программы нужно скомпоновать ее с библио- теками pcap. Это можно сделать с помощью флага -l при вызове GCC, как показано в следующем листинге. Библиотека pcap уже установлена в данной системе, поэтому библиотечные и включаемые файлы уже на- ходятся в стандартных каталогах, известных компилятору.
    reader@hacking:/booksrc $ gcc -o pcap_sniff pcap_sniff.c
    /tmp/ccYgieqx.o: In function `main’:
    pcap_sniff.c:(.text+0x1c8): undefined reference to `pcap_lookupdev’
    pcap_sniff.c:(.text+0x233): undefined reference to `pcap_open_live’

    258
    0x400Сетевое взаимодействие pcap_sniff.c:(.text+0x282): undefined reference to `pcap_next’
    pcap_sniff.c:(.text+0x2c2): undefined reference to `pcap_close’
    collect2: ld returned 1 exit status reader@hacking:/booksrc $ gcc -o pcap_sniff pcap_sniff.c -l pcap reader@hacking:/booksrc $ ./pcap_sniff
    Fatal Error in pcap_lookupdev: no suitable device found reader@hacking:/booksrc $ sudo ./pcap_sniff
    Sniffing on device eth0
    Got a 82 byte packet
    00 01 6c eb 1d 50 00 01 29 15 65 b6 08 00 45 10 | ..l..P..).e...E.
    00 44 1e 39 40 00 40 06 46 20 c0 a8 2a 01 c0 a8 | .D.9@.@.F ..*...
    2a f9 8b 12 1e d2 ac 14 cf c7 e5 10 6c c9 80 18 | *...........l...
    05 b4 54 1a 00 00 01 01 08 0a 26 b6 a7 76 02 3c | ..T.......&..v.<
    37 1e 74 68 69 73 20 69 73 20 61 20 74 65 73 74 | 7.this is a test
    0d 0a | ..
    Got a 66 byte packet
    00 01 29 15 65 b6 00 01 6c eb 1d 50 08 00 45 00 | ..).e...l..P..E.
    00 34 3d 2c 40 00 40 06 27 4d c0 a8 2a f9 c0 a8 | .4=,@.@.’M..*...
    2a 01 1e d2 8b 12 e5 10 6c c9 ac 14 cf d7 80 10 | *.......l.......
    05 a8 2b 3f 00 00 01 01 08 0a 02 47 27 6c 26 b6 | ..+?.......G’l&.
    a7 76 | .v
    Got a 84 byte packet
    00 01 6c eb 1d 50 00 01 29 15 65 b6 08 00 45 10 | ..l..P..).e...E.
    00 46 1e 3a 40 00 40 06 46 1d c0 a8 2a 01 c0 a8 | .F.:@.@.F...*...
    2a f9 8b 12 1e d2 ac 14 cf d7 e5 10 6c c9 80 18 | *...........l...
    05 b4 11 b3 00 00 01 01 08 0a 26 b6 a9 c8 02 47 | ..........&....G
    27 6c 41 41 41 41 41 41 41 41 41 41 41 41 41 41 | ‘lAAAAAAAAAAAAAA
    41 41 0d 0a | AA..
    reader@hacking:/booksrc $
    Обратите внимание: перед текстом в пакете находится много байтов, и многие из них совпадают. Так как это «первичные» (raw) пакеты, то по большей части эти байты принадлежат заголовкам уровней Ether- net, IP и TCP.
    1   ...   23   24   25   26   27   28   29   30   ...   51


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