Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #60, НОЯБРЬ 2005 г.

Охота на КАИНа

payhash[Wolf D.A.]

Спецвыпуск: Хакер, номер #060, стр. 060-064-3


Работа с RAW-сокетами ws2_32.lib мало отличается от работы POSIX RAW-стандарта.

Представим, что мы - крупная контора, которая по спецзаказу определенных силовых структур написала ОС с закрытым кодом, в ядре которой реализована обработка IP-пакета, в котором смотрится поле TOS (к примеру, для того чтобы совершить деструктивные действия, в пакете IP поля TOS содержится число 33 dec.).

Примерно вот так выглядела бы программа для отсылки деструктивного командного IP-пакета:

#include gt;

#include gt;

#include gt;

#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;

}

А на стороне жертвы в ядре стоит примерно такой обработчик на наличие командного пакета:

Назад на стр. 060-064-2  Содержание  Вперед на стр. 060-064-4