2014-07-16 59 views
2

我有用于DNS的python/scapy嗅探器。我能够嗅探DNS消息,并获得IP/UDP源和目标IP地址和端口,但我有问题解析DNS部分 我希望有一些帮助或解决方案来解决这个问题。python/scapy DNS嗅探器和解析器

#!/usr/bin/env python 

from scapy.all import * 
from datetime import datetime 
import time 
import datetime 
import sys 

############# MODIFY THIS PART IF NECESSARY ############### 
interface = 'eth0' 
filter_bpf = 'udp and port 53' 

# ------ SELECT/FILTER MSGS 
def select_DNS(pkt): 
    pkt_time = pkt.sprintf('%sent.time%') 
# ------ SELECT/FILTER DNS MSGS 
    try: 
     if DNSQR in pkt and pkt.dport == 53: 
     # queries 
      print '[**] Detected DNS QR Message at: ' + pkt_time 
      # 
     elif DNSRR in pkt and pkt.sport == 53: 
     # responses 
      print '[**] Detected DNS RR Message at: ' + pkt_time 
# 
    except: 
     pass 
# ------ START SNIFFER 
sniff(iface=interface, filter=filter_bpf, store=0, prn=select_DNS) 

回答

2
>>> ls(DNS) 
id   : ShortField   = (0) 
qr   : BitField    = (0) 
opcode  : BitEnumField   = (0) 
aa   : BitField    = (0) 
tc   : BitField    = (0) 
rd   : BitField    = (0) 
ra   : BitField    = (0) 
z   : BitField    = (0) 
rcode  : BitEnumField   = (0) 
qdcount : DNSRRCountField  = (None) 
ancount : DNSRRCountField  = (None) 
nscount : DNSRRCountField  = (None) 
arcount : DNSRRCountField  = (None) 
qd   : DNSQRField   = (None) 
an   : DNSRRField   = (None) 
ns   : DNSRRField   = (None) 
ar   : DNSRRField   = (None) 
>>> 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   = ('') 
>>> 

如果上面的层定义和领域是不够的,你可以define your own layer,并使用自定义层解码包,或者干脆直接从原始负载检索数据。至于时间戳,你可以做pkt.time。

+0

THX但我有其他问题答案和其他记录。我无法得到他们 – user1627588

+0

@ user1627588呃,通过编辑您的原始问题,我的答案现在似乎几乎完全不相关。请不要在将来这样做。无法检索字段并且无法在某些特定问题下检索字段的问题是两个完全不同的问题。 – wookie919

+0

对不起人。你是完全正确的。编辑完成后,您的答案看起来并不相关。我没有这样想。我根本没有想到。我应该改变它回来? – user1627588

1

我在这里登陆,而谷歌搜索scapy parse DNS queries(在我的情况我处理捕获PCAP文件)

这是我的解决方案:

#!/usr/bin/env python 

from scapy.all import * 
from scapy.layers.dns import DNSRR, DNS, DNSQR 

pcap = '/path/.../to/.../pcap/.../.pcap' 
pkts = rdpcap(pcap) 

for p in pkts: 
    if p.haslayer(DNS): 
     if p.qdcount > 0 and isinstance(p.qd, DNSQR): 
      name = p.qd.qname 
     elif p.ancount > 0 and isinstance(p.an, DNSRR): 
      name = p.an.rdata 
     else: 
      continue 

     print name