DNS-спуфинг со временем ожидания клиента scapy - PullRequest
0 голосов
/ 29 июня 2018

Рассмотрим этот простой спуфер Python DNS:

#!/usr/bin/python3
import socket
from scapy.all import *
port = 53

def handle(payload):
    data = payload[0]
    src_ip = payload[1][0]
    src_port = payload[1][1]
    print("-" * 10 + " Incoming "  + "-" * 10)
    a = DNS(data)
    a.show2()
    output = IP(dst=src_ip,  chksum = 0)/ UDP(sport=53, dport=src_port) / DNS(id=a.id, qr=1, opcode=a.opcode, aa=1, tc=0, rd=1, ra=1, z=0, ad=0, cd=0, rcode=0, qdcount=1, ancount=1, nscount=0, arcount=0,qd=DNSQR(qname=a[DNS].qd.qname, qtype=a[DNS].qd.qtype, qclass=a[DNS].qd.qclass), an=DNSRR(rrname='cnn.com', rdata='192.168.1.100'), )
    print("-" * 10 + " Output "  + "-" * 10)
    output.show2()
    send(output)

if __name__ == "__main__":
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # create a socket object
    s.bind(("", port)) 
    while True:
        payload = s.recvfrom(1024)
        handle(payload)

Я бы запустил его из sudo (чтобы я мог подключиться к порту 53 udp):

$ sudo python3 -i ./dns_python.py

Однако мои запросы истекают:

$ host cnn.com 127.0.0.1
;; connection timed out; no servers could be reached

Мне нужна помощь, чтобы выяснить, как успешно подделать:

Некоторые подробности:

$ sudo python3 -i ./dns_python.py 
---------- Incoming ----------
###[ DNS ]### 
  id        = 59652
  qr        = 0
  opcode    = QUERY
  aa        = 0
  tc        = 0
  rd        = 1
  ra        = 0
  z         = 0
  ad        = 0
  cd        = 0
  rcode     = ok
  qdcount   = 1
  ancount   = 0
  nscount   = 0
  arcount   = 0
  \qd        \
   |###[ DNS Question Record ]### 
   |  qname     = 'cnn.com.'
   |  qtype     = A
   |  qclass    = IN
  an        = None
  ns        = None
  ar        = None

---------- Output ----------
###[ IP ]### 
  version   = 4
  ihl       = 5
  tos       = 0x0
  len       = 76
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = udp
  chksum    = 0x0
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \
###[ UDP ]### 
     sport     = domain
     dport     = 36774
     len       = 56
     chksum    = 0xb87f
###[ DNS ]### 
        id        = 59652
        qr        = 1
        opcode    = QUERY
        aa        = 1
        tc        = 0
        rd        = 1
        ra        = 1
        z         = 0
        ad        = 0
        cd        = 0
        rcode     = ok
        qdcount   = 1
        ancount   = 1
        nscount   = 0
        arcount   = 0
        \qd        \
         |###[ DNS Question Record ]### 
         |  qname     = 'cnn.com.'
         |  qtype     = A
         |  qclass    = IN
        \an        \
         |###[ DNS Resource Record ]### 
         |  rrname    = 'cnn.com.'
         |  type      = A
         |  rclass    = IN
         |  ttl       = 0
         |  rdlen     = 4
         |  rdata     = '192.168.1.100'
        ns        = None
        ar        = None

.
Sent 1 packets.

Я вижу пакеты, когда смотрю из окна ngrep -d lo '' src или dst port 53. Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 29 июня 2018

Scapy не работает с 127.0.0.1 или с интерфейсом обратной связи

http://scapy.readthedocs.io/en/latest/troubleshooting.html

Петлевой интерфейс - это очень особенный интерфейс. Проходящие через него пакеты на самом деле не собираются и не разбираются. Ядро направляет пакет к месту назначения, пока оно все еще хранится во внутренней структуре. То, что вы видите с помощью tcpdump -i lo, является лишь подделкой, чтобы заставить вас думать, что все нормально. Ядро не знает, что делает Scapy за его спиной, поэтому то, что вы видите на интерфейсе обратной связи, также является подделкой. Кроме этого не из местной структуры. Таким образом, ядро ​​никогда не получит его.

Чтобы общаться с локальными приложениями, вам нужно собрать пакеты на один уровень выше, используя сокет PF_INET / SOCK_RAW вместо PF_PACKET / SOCK_RAW (или его эквивалент в других системах, кроме Linux):

...