2014-07-16 128 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