python scapy dns sniff

есть задача, сделать на python scapy мониторинг dns запросов на локальной машине. Что бы просто записывать в файл домены сайтов куда обращалась локальная машина. В интернете не нашел такого, там все про атаки и подмены пакетов, а мне нужно просто мониторить куда обращается машина.

Т.е. если я локально запускаю этот скрипт и через браузер захожу в google, то в файле должно появится time - google.ru


Ответы (1 шт):

Автор решения: Johan

Изначально нужно установить scapy командой:

pip install --pre scapy[basic]

А затем, можно попробовать так:

import subprocess

from scapy.all import sniff


def ip_iface():
    com_run = subprocess.check_output('ip -h -br a | grep UP', shell=True).decode()
    default_interface = com_run.split()[0].strip()
    local_ipv4 = com_run.split()[2].strip().split("/")[0]
    local_ipv6 = com_run.split()[3].strip().split("/")[0]
    return default_interface, local_ipv4, local_ipv6


def packet_sniff(packet):
    qname = packet['DNS Question Record'].qname.decode()
    print(f'Запрос: {qname[0:-1]}')


def main():
    from os import getuid
    if not getuid() == 0:
        print('\n[+] Запустите скрипт с правами суперпользователя!\n')
        return
    print(f'[+] Анализ пакетов... \n')
    sniff(iface=ip_iface()[0], filter='dst port 53', count=0, store=False, prn=packet_sniff)


if __name__ == "__main__":
    main()

у меня Linux, потому скрипт писал под него. Но, если у вас Windows, скрипт будет работать и под ним. Нужно просто из main() удалить все, оставить только sniff.

Из sniff удалить iface, так как это фильтр, который фильтрует запросы только к активной сетевой карте. Ну и соответственно, уберите функцию ip_iface().

В Linux скрипт нужно запускать с повышенными правами, то есть от суперпользователя, так как scapy работает с повышенными правами. А под Windows, если не ошибаюсь, запускать от имени администратора не обязательно. Единственное, что под Windows нужно будет для scapy, чтобы он работал, установить Npcap, в дополнение к scapy.

Ну и скрипт, с учетом всего удаленного будет выглядеть так:

from scapy.all import sniff


def packet_sniff(packet):
    qname = packet['DNS Question Record'].qname.decode()
    print(f'Запрос: {qname[0:-1]}')


def main():
    sniff(filter='dst port 53', count=0, store=False, prn=packet_sniff)


if __name__ == "__main__":
    main()

Я тут немного "поиздевался" над скриптом )). В итоге получилось примерно это:

введите сюда описание изображения

→ Ссылка