Охота на КАИНа payhash[Wolf D.A.] Спецвыпуск: Хакер, номер #060, стр. 060-064-3 Работа с RAW-сокетами ws2_32.lib мало отличается от работы POSIX RAW-стандарта. Представим, что мы - крупная контора, которая по спецзаказу определенных силовых структур написала ОС с закрытым кодом, в ядре которой реализована обработка IP-пакета, в котором смотрится поле TOS (к примеру, для того чтобы совершить деструктивные действия, в пакете IP поля TOS содержится число 33 dec.). Примерно вот так выглядела бы программа для отсылки деструктивного командного IP-пакета: #include #include #include #define SRCADDR "127.0.0.1" #define DSTADDR "127.0.0.1" typedef struct ip { /* Здесь описываем IP-структуру: */ }IPHEADER; USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; /* Здесь считаем контрольную сумму IP-пакета: */ return (USHORT)(~cksum); } //Функция по сборке IP-пакета static u_char *constructpacket(u_char *inetfragment, struct in_addr srcaddr, struct in_addr dstaddr, u_short dstport); static IPHEADER ippkt; static char tcpip[60]={0}; int main() { /* Объявляем переменные для работы с RAW-сокетом. */ WSADATA WSAData; SOCKET skt; SOCKADDR_IN addr_in; struct in_addr srcaddr, dstaddr; WORD dstport; /*Подготавливаем RAW-сокет, переводя его в различные режимы skt=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0, WSA_FLAG_OVERLAPPED); setsockopt(skt,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag); nTimeOver=1000; if (setsockopt(skt, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR) { printf("setsockopt SO_SNDTIMEO error!\n"); return false; } addr_in.sin_family=AF_INET; addr_in.sin_addr.S_un.S_addr=inet_addr(DSTADDR); //Формируем IP-пакет constructpacket(inetfragment, srcaddr, dstaddr, dstport); //Пишем пакет в RAW-сокет rect=sendto(skt, inetfragment, sizeof(ippkt),0, (struct sockaddr*)&addr_in, sizeof(addr_in)); closesocket(skt); WSACleanup(); return 0; } //Описание функции по сборке пакета static u_char *constructpacket(u_char *inetfragment, struct in_addr srcaddr, struct in_addr dstaddr, u_short dstport) { // Заполняем IP-структуру ippkt.ip_vhl=(4 ippkt.ip_tos=0x21; //Здесь можем подделать TOS, к примеру, поставив значение 33 ippkt.ip_len=htons(sizeof(struct ip )); ippkt.ip_id=1; ippkt.ip_off=0; ippkt.ip_ttl=128; ippkt.ip_p=IPPROTO_TCP; ippkt.ip_sum=0; ippkt.ip_src=srcaddr; ippkt.ip_dst=dstaddr; //Считаем контрольную сумму IP-пакета memcpy(tcpip, &ippkt, sizeof(ippkt)); memset(tcpip+sizeof(ippkt), 0, 4); ippkt.ip_sum=checksum((USHORT *)tcpip, sizeof(ippkt)); memcpy(tcpip, &ippkt, sizeof(ippkt)); //Копируем данные из IP-буфера в буфер, который будем передавать в Сеть memset(inetfragment, 0, sizeof(struct br0_ip)); memcpy(inetfragment, tcpip, sizeof(struct br0_ip)); return inetfragment; } А на стороне жертвы в ядре стоит примерно такой обработчик на наличие командного пакета: |