python / scapy DNS嗅探器和解析器 [英] python/scapy DNS sniffer and parser

查看:526
本文介绍了python / scapy DNS嗅探器和解析器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 #!/ usr / bin / env python 

from scapy.all import *
from datetime import datetime
进口时间
导入日期时间
导入sys

############修改此部分如果必需######### ######
interface ='eth0'
filter_bpf ='udp和端口53'

#------ SELECT / FILTER MSGS
def select_DNS(pkt):
pkt_time = pkt.sprintf('%sent.time%')
#------选择/过滤DNS MSGS
try:
如果DNSQR在pkt和pkt.dport == 53:
#queries
打印'[**]检测到的DNS QR消息在:'+ pkt_time

elif DNSRR in pkt和pkt.sport == 53:
#responses
print'[**]检测到的DNS RR消息在:'+ pkt_time

除了:
pass
#------ START SNIFFER
sniff(iface = interface,filter = filter_bpf,store = 0,prn = select_DNS)


解决方案

 >>> ls(DNS)
id:ShortField =(0)
qr:BitField =(0)
操作码:BitEnumField =(0)
aa:BitField =(0)
tc:BitField =(0)
rd:BitField =(0)
ra:BitField =(0)
z:BitField =(0)
rcode:BitEnumField = 0)
qdcount:DNSRRCountField =(无)
ancount:DNSRRCountField =(无)
nscount:DNSRRCountField =(无)
arcount:DNSRRCountField =(无)
qd:DNSQRField =(无)
an:DNSRRField =(无)
ns:DNSRRField =(无)
ar:DNSRRField =(无)
>>> ls(DNSQR)
qname:DNSStrField =('。')
qtype:ShortEnumField =(1)
qclass:ShortEnumField =(1)
>>> ls(DNSRR)
rrname:DNSStrField =('。')
类型:ShortEnumField =(1)
rclass:ShortEnumField =(1)
ttl:IntField =(0)
rdlen:RDLenField =(None)
rdata:RDataField =('')
>>>

如果上述层定义和字段不够,您可以定义自己的图层,并使用自定义图层对数据包进行解码,或者直接从原始图像中检索数据有效载荷。至于时间戳,你可以做pkt.time。


I have python/scapy sniffer for DNS. I am able to sniff DNS messages and get IP/UDP source and destination IP address and ports but I have problems parsing DNS part I would appreciate some help or solution to work this out.

#!/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)

解决方案

>>> 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           = ('')
>>> 

If the above layer definitions and fields are not enough, you can either define your own layer and decode the packet using your custom layer, or simply retrieve the data straight from the raw payload. As for the timestamp, you can do pkt.time.

这篇关于python / scapy DNS嗅探器和解析器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆