【问题标题】:python/scapy DNS sniffer and parserpython/scapy DNS嗅探器和解析器
【发布时间】:2014-07-16 23:21:40
【问题描述】:

我有用于 DNS 的 python/scapy 嗅探器。我能够嗅探 DNS 消息并获取 IP/UDP 源和目标 IP 地址和端口,但我在解析 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)

【问题讨论】:

    标签: python dns scapy sniffer


    【解决方案1】:
    >>> 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。

    【讨论】:

    • 谢谢,但我对附加答案和附加记录有疑问。我无法得到它们
    • @user1627588 呃,通过编辑您的原始问题,我的回答现在似乎几乎完全无关紧要。请不要在未来这样做。无法检索字段的问题,和某些特定问题下无法检索字段的问题是完全不同的两个问题。
    • 对不起,伙计。你是完全正确的。编辑后您的答案似乎不相关。我没有这样想。我根本没有想到。我应该以某种方式将其改回来吗?
    • @user1627588 如果可以的话,我认为最好将问题改回之前的实际问题,您可以简单地使用更具体的版本提交一个新问题。希望你的新问题能得到一些答案。干杯。
    • 我做到了,把问题改回来了。再次抱歉
    【解决方案2】:

    我在 谷歌搜索 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多