Эта статья рассчитана, для новичков. И так начнем.
Что такое сниффер
Снифферы - это программы, которые перехватывают весь сетевой трафик.
Они могут перехватывать и расшифровывать имена и пароли пользователей, конфиденциальную информацию, нарушать работу отдельных компьютеров и сети в целом. Известно, что в большинстве протоколов передачи данных ( FTP , POP, HTTP, telnet ) секретная информация между клиентом и сервером передаётся открытым текстом. Поэтому, не составляет большого труда получить доступ к такой информации.
Методы применения sniff'инга
Sniff'инг - один из наиболее популярных видов атаки. Sniff'инг - один из наиболее популярных видов атаки, используемых хакерами. Наибольшую известность приобрел сниффер Esniff.c - очень маленький, разработанный для работы на SunOS, занимался тем, что вылавливал первые 300 байтов telnet, ftp и rlogin сессий.
Существует множество ethernet sniff'еров, здесь лишь некоторые из них:
sniffers для систем Unix
SunOS: Esniff.c | Etherfind | Snoop (ftp://playground.sun.com/)
DEC Unix: tcpdump
OSF Unix: faq on BPF suppport
DEC Ultrix: tcpdump | faq on BPF suppport
Solaris: tcpdump | Snoop ( ftp://playground.sun.com/) | solsniffer.c
FreeBSD: ftp://gatekeeper.dec.com/pub/BSD/FreeBSD/FreeBSD-current/src/contrib/tcpdump/
NetBSD: ftp://gatekeeper.dec.com/pub/BSD/NetBSD/NetBSD-current/src/usr.sbin/
Linux: ftp://sunsite.unc.edu/pub/Linux/system/Network/management/ | Linsniffer 0.03.9
SGI Irix: nfswatch | Etherman | tcpdump
HP/UX: nettl (monitor) | netfmt (display) | nfswatch
Основы передачи данных в сети
Каждому устройству в сети Ethernet, соответствует уникальный шестибайтовый MAC -адрес ( Media Access Control). Единицей передачи данных, в такой сети является кадр ( frame ), который имеет определённую структуру и несёт в себе информацию о получателе, отправителе и самих данных.
struct ETHERNET_FRAME
{
unsigned char dest[6];// MAC- адрес получателя
unsigned char src[6]; // MAC- адрес отправителя
unsigned short type; // версия : IPv4 0x0800, IPv6 0x86DD, ARP 0x0806
unsigned char data[]; // данные
};
Кадр может иметь размер, примерно от 60 до 1514 байт, из них первые 14 байт являются служебными. Когда требуется передать большое количество данных, они разбиваются на фрагменты и последовательно направляются в сеть. Кадр передаётся по сети и получает его каждое устройство этой сети. Значение поля структуры с именем type определяет тип и версию в кадре. Завершающая секция кадра служит для проверки целостности передаваемых данных и использует код циклического контроля ( CRC 32 - cyclic redundancy check ). Это мощная хэш-функция, для выявления искажённости числовых данных. Обычно она аппаратно реализована в сетевой плате.
В качестве данных может быть IP -пакет или ARP -пакет. ARP ( address resolution protocol ) - это служебный вспомогательный протокол, который осуществляет, трансляцию MAC -адресов в логические IP -адреса на основе широковещательной рассылки запросов.
struct ETHERNET_ARP
{
unsigned short hrd; // Тип аппаратуры (Ethernet), 0x0001.
unsigned short pro; // Протокол (IP), 0x0800.
unsigned char hln; // Длина аппаратного адреса ( MAC ), 6 байт.
unsigned char pln ; // Длина адреса протокола IP, 4 байта.
unsigned short op ; // Вид операции {Запрос, Ответ} = {1, 2}.
unsigned char sha [6];// Аппаратный адрес ( MAC ) отправителя.
unsigned char spa[4] ;// IP -адрес отправителя.
unsigned char tha [6];// Аппаратный адрес ( MAC ) получателя.
unsigned char tpa [4];// IP -адрес получателя.
};
Для доставки пакетов в сети, нужно определить адрес узла назначения. Для этого существует ARP - протокол автоматического определения адресов ( IP <=> MAC ). Когда компьютеру нужно начать обмен данными, он ищет MAC -адрес получателя, затем IP -адрес в ARP-таблице. Если для нужного IP-адреса не найден соответствующий MAC -адрес, то посылается широковещательный запрос ARP, содержащий искомый IP-адрес назначения, а MAC-адрес для широковещательной рассылки заполнен единицами FF:FF:FF:FF:FF:FF. Целевой хост узнает свой IP-адрес, обрабатывает запрос и посылает ответ. Система готова к пересылке данных по локальной сети.
IP –пакеты
Пакет состоит из заголовка, служебной информации ( options ) и данных. На языке Си этот заголовок выглядит, в виде такой структуры:
typedef struct _IPHeader
{
unsigned char verlen ; // версия и длина заголовка
unsigned char tos; // тип сервиса
unsigned short length; // длина всего пакета
unsigned short id; // Id
unsigned short offset; // флаги и смещения
unsigned char ttl; // время жизни
unsigned char protocol; // протокол
unsigned short xsum ; // контрольная сумма
unsigned long src ; // IP -адрес отправителя
unsigned long dest ; // IP -адрес назначения
}IPHeader;
Для нас особый интерес представляют поля заголовка protocol, src и dest . Два последних поля - это хорошо известные IP -адреса отправителя и получателя пакета. Например, шестнадцатеричное значение адреса 0 x 0000140 A соответствует 10.20.0.0.
Поскольку в сети большое количество пакетов, то их лучше отфильтровывать. Критериями фильтрации могут быть IP -адреса, тип вышестоящего протокола ( TCP , UDP , ICMP , PUP ), а также содержимое пакета. Функции фильтрации полезны, так как не только ограничивают собираемую программой информацию, но и просто обеспечивают её нормальную работу.
Структура программы для прослушивания сети
Обладая знаниями, можно приступить к написанию программы, для Windows 2000. Каркас программы может состоять из частей:
1. Драйвер для приёма всех пакетов ( уже установлен в ОС ).
2. Буфер для накопления и обработки пакетов. Это может быть простейший массив из байтов.
3. Анализатор пакетов - набор функций, для управления фильтрацией.
4. Декодер-шифратор (например, декодировать данные из BASE64).
5. Автоматизированный редактор пакетов, который по команде, вносит некоторые изменения в пакет и отправляет его обратно в сеть.
В начале программы, использующей Windows Sockets, находится код инициализации сетевой библиотеки ( WSAStartup ). Затем следует создание сокета, определение имени и IP-адреса компьютера ( gethostbyname ), с которого запущена программа. В заключение устанавливаются параметры сокета ( bind ). Теперь осталось переключить сокет в режим приёма всех пакетов. Управляющая функция ioctlsocket с параметром-командой SIO_RCVALL включает promiscuous mode.
PHP код:
#include <conio.h>
# include < winsock 2. h >
# define MAX _ PACKET _ SIZE 0 x 10000
// Буфер для приёма данных
static BYTE Buffer[MAX_PACKET_SIZE]; // 64 Kb
void main()
{
WSADATA wsadata; // Инициализация WinSock.
SOCKET s; // Слущающий сокет.
char name[128]; // Имя хоста (компьютера).
HOSTENT* phe; // Информация о хосте.
SOCKADDR_IN sa; // Адрес хоста
long flag = 1; // Флаг PROMISC Вкл / выкл.
// инициализация
WSAStartup(MAKEWORD(2,2), &wsadata);
s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
gethostname(name, sizeof (name));
phe = gethostbyname( name );
ZeroMemory( &sa, sizeof (sa) );
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = (( struct in_addr *)phe->h_addr_list[0])->s_addr;
bind(s, (SOCKADDR *)&sa, sizeof (SOCKADDR));
// Включение promiscuous mode.
ioctlsocket(s, SIO_RCVALL, &flag);
// Приём IP -пакетов.
while ( !_kbhit() )
{
int count;
count = recv( s, Buffer, sizeof (Buffer), 0 );
// обработка IP- пакета
if ( count >= sizeof (IPHeader) )
{
IPHeader* hdr = (IPHeader *)Buffer;
//что-то делаем с пакетом...
}
}
// Конец работы .
closesocket( s );
WSACleanup();
}
Для успешной компиляции, следует библиотечный файл " ws 2_32. lib ". Вот и все, что хотелось рассказать в этой статье.
Ps: Спасибо всем, кто уделил свое внимание… Удачи
(с) cash$$$
!-> http://www1.hut.ru/aneksniff/sniffer2.html (прим. -=lebed=-)