Агрессивная атака: DNS-UDP-IP спуфер

Xakep, номер #048, стр. 048-068-3


1 aa - "авторитетный" ответ.

1 tc - truncated (округление) - обрезан пакет или нет.

1 rd - recursion desired (запрос на рекурсию). Оптимально этот бит устанавливать в 1.

1 ra - recursion available (ответ по рекурсии).

1 z - зарезервировано для будущего использования. Должно быть всегда установлено в 0.

4 rcode - responce code (код ответа). Если 0 - ошибок нет.

2 n/a - зарезервировано.

16 qdcount - кол-во доменов на запрос

16 ancount - количество записей на запрошенный(ые) домен(ы).

16 nscount - количество name серверов ответственных за домен.

16 arcount - количество ip всех name серверов.

quastion секция:

QNAME - непосредственно доменное имя.

QTYPE - тип запроса. (A, B, et).

QCLASS - класс запроса (для internet - класс inet).

У этой секции нет фиксированного размера, т.к. поле QNAME может быть и довольно маленьким, и довольно большим. QTYPE и QCLASS по 2 октета (байта). И можно сказать, что с форматами мы разобрались. После чего пришло время перейти непосредственно к реализации.

Реализация

Что нам нужно знать для того, чтобы написать dns-udp-ip spoofer? Нужно уметь программировать raw сокеты (тип сокета, когда возможно с нуля собирать пакеты), знать C и иметь желание :). Первым такую "связку" написал FuSyS из Soft Project, ссылка на чьи сорсы идет в блок-врезке. Но ничего особо сложного там нет, и тот, кто пишет на С, реализует еще кучу способов без вопросов. Итак, структура программы препростейшей посылки спуфнутого пакета следующая:

1. Открываем raw сокет

2. Ставим опции raw сокета.

3. Составляем dns пакет (заголовок и данные)

4. Составляем udp заголовок

5. Составляем ip заголовок

6. Склеиваем, отправляем и выводим красочные сообщения о гритсах, литсах и т.д.

Как открыть raw сокет

Открывать raw сокет призвана функция socket, аргументы которой - это домен (не те домены), тип и протокол.

int sfd;

if((sfd=socket(AF_INET, SOCK_RAW, IPPROTO_RAW))<0)

{

fprintf(stderr, "raw socket denied");

exit(2);

}

Домены бывают AF_INET (интернет), AF_UNIX (или AF_LOCAL). Для работы с интернет всегда ставится AF_INET. Тип сокета бывает нескольких видов: SOCK_STREAM - tcp, SOCK_DGRAM - udp и SOCK_RAW - что хотим, то и будет (есть еще SOCK_RDM и SOCK_SEQPACKET, но на них останавливаться не будем). И третий аргумент - протокол, в контексте tcp/ip он обычно определяется типом сокета, поэтому в качестве значения задают 0. У нас же SOCK_RAW, а для него имеется несколько возможных протоколов, на которых мы не будем заострять внимание, а воспользуемся только тем, который нас интересует - это IPPROTO_RAW. Итак, мы подняли raw сокет. Теперь ставим опции этого сокета.

Ставим опции raw сокета

Для этого существует функция setsockopt, аргументы которой: указатель на поднятый raw сокет, уровень протокола, непосредственно опция и 2 аргумента для доступа к значениям параметров.

int sfdo=1;

if(setsockopt(sfd, IPPROTO_IP, IP_HDRINCL, &sfdo, sizeof(sfdo))<0)

{

fprintf(stderr, "ip_hdrincl denied");

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