Главная

Friday, 4 September 2020

Разбор траффика DNS в Scapy.

Всем привет.

Продолжаем опыты со Scapy. Рассмотрим разбор траффика DNS.

Когда мы исследуем запросы протокола DNS в Scapy, мы видим поля которые включены в каждый пакет. DNSQR содержит название запроса (qname), его тип (qtype) и класс (qclass). Для нашего запроса выше мы просим адрес IPv4 для whitehouse.com, который нужно разрешить, делая поле qname равно whitehouse.com. DNS-сервер отвечает добавлением DNSRR который содержит имя записи ресурса (rrname), тип (тип), ресурс класс записи (rclass) и TTL. Зная, как работают fast-flux и domain-flux, теперь мы можем написать несколько скриптов Python и с помощью Scapy провести анализ и выявление подозрительного DNS-траффика.

analyst# scapy
Welcome to Scapy (2.0.1)
>>>ls(DNSQR)
qname : DNSStrField = ('')
qtype : ShortEnumField = (1)
qclass : ShortEnumField = (1)
>>>ls(DNSRR)
rrname : DNSStrField = ('')
type : ShortEnumField = (1)
rclass : ShortEnumField = (1)
ttl : IntField = (0)
rdlen : RDLenField = (None)
rdata : RDataField = ('')

Европейское агентство сетевой и информационной безопасности предоставляет отличный ресурс для анализа сетевого трафика. Они предоставляют Live DVD ISO-образ который содержит несколько сетевых дампов и упражнений к ним. Вы можете скачать копию с http://www.enisa.europa.eu/activities/cert/support/exercise/live-dvdiso-images.
Кроме того, вы можете захотеть заразить виртуальную машину шпионским или вредоносным ПО. и безопасно исследовать трафик в контролируемой лабораторной среде, прежде чем продолжить. Для наших целей предположим, что теперь у нас есть сеть, захваченная в файл с именем fastFlux.pcap, который содержит некоторый DNS-трафик, который мы хотим проанализировать.



Давайте напишем сценарий Python, который читает этот pcap и разбирает все пакеты, cодержащие DNSRR. Scapy содержит мощную функцию haslayer(), которая принимает тип протокола в качестве входных данных и возвращает логическое значение. Если пакет содержит DNSRR, мы извлечем переменные rrname и rdata, которые содержат соответствующее доменное имя и IP-адрес. Затем мы можем проверить доменное имя в соответствии со словарем, который мы храним, с индексацией доменных имен. Если мы находили это доменное имя раньше, мы проверим, был связан с ним предыдущий IP-адрес. Если у него другой предыдущий IP адрес, мы добавляем наш новый адрес в массив, хранящий значения нашего словаря. Или если мы идентифицируем новый домен, мы добавляем его в наш словарь. Мы добавляем IP-адрес домена в качестве первого элемента хранимого массива как значение нашего словаря. На первый взгляд это кажется немного сложным, но мы хотим иметь возможность хранить весь домен имен и различные связанные с ними IP-адреса. Чтобы обнаружить Fast Flux, нам нужно будет знать, какие доменные имена имеют по несколько адресов. После того как мы проверяем все пакеты, распечатываем все доменные имена и по сколько уникальных IP-адресов существует для каждого доменного имени.

from scapy.all import *
dnsRecords = {}
def handlePkt(pkt):
  if pkt.haslayer(DNSRR):
  rrname = pkt.getlayer(DNSRR).rrname
  rdata = pkt.getlayer(DNSRR).rdata
  if dnsRecords.has_key(rrname):
   if rdata not in dnsRecords[rrname]:
    dnsRecords[rrname].append(rdata)
  else:
   dnsRecords[rrname] = []
   dnsRecords[rrname].append(rdata)
def main():
  pkts = rdpcap('fastFlux.pcap')
  for pkt in pkts:
  handlePkt(pkt)
  for item in dnsRecords:
  print '[+] '+item+' has '+str(len(dnsRecords[item])) \
   + ' unique IPs.'
if __name__ == '__main__':
  main()

Запустив наш код, мы видим, что по крайней мере четыре доменных имени имеют множество связанных с ними IP-адресов. Все четыре доменных имени, перечисленных ниже, в прошлом фактически использовали Fast Flux (Nazario, 2008).

analyst# python testFastFlux.py
[+] ibank-halifax.com. has 100,379 unique IPs.
[+] armsummer.com. has 14,233 unique IPs.
[+] boardhour.com. has 11,900 unique IPs.
[+] swimhad.com. has 11, 719 unique IPs.

Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?