白帽黑客:一场木马病毒引发的血案

故事发生于某个阳光明媚的某手绘交流群,不知什么时候,来了一位传奇般的雷锋级黑客。

具体他说了什么,就不再复述了,基本就是:"群里谁要QB,我可以帮你刷"。

并且秉着"我一定要为人民服务的中国梦"精神加了我好友,

于是有了以下的一幕:

真的有天上掉馅饼的好事?但是感觉为什么有点不对劲

这意图要不要那么明显?看完顿时产生了一种:"总有刁民想害朕"的危机感。

我决定,看看这个钓鱼程序卖的是什么药

先来看看这款软件可爱的小图标

使用PEid进行查壳:发现加了UPX壳

当然这种这个难度约等于0的压缩壳,使用esp定律或者直接用工具能轻松搞定,脱去upx壳后再次查壳,发现变成了VC++6.0

这个年代,当然基本不会有人还在用VC++6.0了那么基本肯定,这一定是宇宙无敌易语言写的神奇玩意。

在虚拟机中再次运行这个软件

可以观察到,程序的意图基本就是钓取我们的账号密码,不管如何发送,我们至少能够猜到99%是通过网络发送出去的。

网络最一般是通过socket来进行的,socket进行网络通信,用的是tcp udp两种通讯协议,对应最常用的发送数据,应该就是send和sendto这两个函数了。

到这里, 用了一个被用烂了十几年但是仍然有效的技术--------inline hook

打开visualstudio创建项目

编写DLLMain

现在我们需要HookSend和sendto这两个函数,把数据给dump下来(就是保存下来)

保存的文件名格式是(通讯协议_发送IP地址_端口_索引.bin)

最后在DLLMainattach中让hook执行并生效

编译,一次成功(苍天保佑)

最后我们还需要编写一个注入器(这个比较复杂点,但是我们可以用复制黏贴大法在网上抄一段)

注入器的功能,就是把让这个DLL在程序执行之前加载进去,打个比方嘛就是在程序里插入一个内奸。这个内奸就是我们的hook程序,他会不断把这个钓鱼程序的信息报告给我们。

编译,Release,那么到这里,我们的准备工作也就完成了

现在万事俱备,只欠东风,当然,这个程序表面上看"是个钓鱼程序",但是我们也不得不防一手,所以打开虚拟机环境以防万一。

把这个"2016刷qb软件"和我们编写好的hook程序一起放入虚拟机,钓鱼程序重命名为Sample.exe。

其中Injector就是注入器,他会把当前目录的inlineHooker.dll注入到Sample.exe当中,这样我们就能够监视这个程序了

运行Injector,没有出现错误,目标程序也被顺利的打开了。说明注入成功

在QQ号码和密码中,我们随便输入一串数字,比如1111111之类的,然后点击"一键刷qb",在这个"您已成功刷取QB,24小时到账"的忽悠弹窗后,我们发现了桌面上多了点东西.

首先我们成功dump到了这个程序往外发送的一些数据包,可以看到这些数据包是以send函数的形式发送出去的,也就是这个钓鱼程序与某个IP进行了某些肮脏的py交易

我们分析第一个数据包,发现它指向了vip.store.baidupan.com

这是百度网盘还是什么。看这又臭又长的Get请求,那个File字样深深出卖了它似乎又下载了一些别的什么东西.

我索然无味的关掉前几个数据包,显然没有发现什么特别有价值的东西,我接着打开最后一个数据包,似乎出现了一些有意思的东西:

我们发现它指向了www.****.cc这个地址,而qqdaohao不就是"QQ盗号"的汉语拼音缩写嘛,这命名手法确实很"易语言",而name和content这两个参数在传递什么东西。

我蹑手蹑脚地把这个地址放入浏览器然后访问,结果浏览器显示出了ok这个字样,这又代表着什么呢?钓鱼成功?

带着疑问,意识到信息取得的不够多,我第二次执行了这个钓鱼程序,同时刻意把账号和密码设置成了12345678 和 87654321看看这个与name content这两个参数到底有什么关系。

可以看到,数据包被再次dump了下来

然后我们用账号密码都是11111111,重复以上步骤再做一遍,然后把数据剪切出来对齐分析

结果就非常显而易见了,第一部分似乎是没有什么改变,第二部分,清楚的看到

Content是 21 22 23 24…… B1FF 28 27 26 25 24 23……,这B1FF应该是作分隔用的

傻子都看得出来。21代表1;22代表2以此类推。

不得不怀疑下,他的网站空间是否有做完整的数据长度检查呢

就算没有,我是否可以以流量的形式,1kb 1kb地蚕食他的钓鱼空间已绝后患?

既然如此,无需客气,打开SpacerFloodProject,修改config.h代码,把我们的请求代码构造一下,我们每次发送3KB的数据,那么就能消耗其至少3KB的空间,假设一秒发送十次的话30kb的速度,一天就能蚕食它24GB的网络空间,那么不出意外,这个损人利己的钓鱼空间不出2天八成就爆炸了

但这个速度还是太慢了,况且就算我们flood成功了,被这家伙发现删去我们的数据,还不是分分钟的问题,总不能一直和他耗着。

带着这个疑问,我打算更加深入一步,在这个HTTP Get请求包当中,可以明显的看到,这个GET请求被发往了一个www.****.cc网页下面

我蹑手蹑脚地打开这个网站,一股浓浓的中二病杀马特风扑鼻而来

在这个网站得的软件上,我发现了一个有趣的东西,会不会这个钓鱼软件就是这个东西生成的呢?不顾羞耻病发作,我点开链接下载了这个程序

下载之后发现是一堆乱码命名的文件,重复之前的注入步骤,把这个生成器重命名为Sample.exe,执行injector注入

居然还有二维码登陆,本着我不下地狱谁下地狱的精神,我使用我的账号进行登陆,很快,一堆数据包被dump了下来

其中大部分,应该和企鹅的快速登陆有关系,但是我还是找到了一个比较特别的数据包,

115.238.240.152,没错的话,他不就是钓鱼软件发往的地址么。

我同样生成了一个"钓鱼木马",当然这水平叫木马是不是有点太抬举自己的了

重复注入步骤,做了很多次,就不再啰嗦了

在生成的木马面前,输入测试的账号密码11111111

查看dump下来的数据包并复制到之前我们分析的文本文件当中,嘿,Name的参数发生了改变:

到了这里,我就大胆的猜想:

1.钓鱼生成器,请求自己钓取到的账号密码是靠那个Name参数同名的txt文件

2.钓鱼软件,通过一个Get请求,把自己的账号密码发送到name对应的txt文本文件下面

通过浏览器,我访问了这个txt文件,同时也证实了这个猜想

现在我们再来看看这个,我创建了一个文本文件,里面只有一个字母,就是只有一字节,为什么会占用磁盘4KB的空间呢

这个和文件系统有关,但文件系统最小粒度单位,常常是簇,而一个簇的大小,就是4KB

所以,文件大小肯定是4KB的整数倍

既然如此,我就只好用塞文件大法了,我只要发送几十个字节的Get请求,就能足足浪费这个钓鱼空间4KB的空间容量,同时产生大量的文件碎片

这个就不是那么容易删掉了吧

打开spacerFlood项目,重新构造数据包

恩,试了试,效果还不错,皮卡丘,就交给你了

将这个flood扔到某个云主机上运行,然后我们去睡大觉。而这个dbflood在以每秒鈡10个数据包的速度,往这个空间不断塞着辣鸡数据包,而那个钓鱼空间也在以每秒10个文件,每小时36000个文件,每天864000文件塞着一个文件夹,很快这个文件夹就连资源管理器打开都得半个小时了

后续:

已经距离我编写flood执行到现在已经3天时间了,期间dbflood因为连接问题重启了几次,到现在,这个空间这个文件夹下大概有200w以上个文件了,而今天,发现dbflood的请求从OK变为了全是error

再次访问这个目录,发现已经爆炸了,这也意味着,这个一系列害人害己的钓鱼软件的彻底宕机。

访问这个网站,看来这个钓鱼作者也发现自己空间似乎不是那么对劲,于是他删掉了所有值钱钓鱼的数据,好吧,至少以前的阴谋算是破产了,但他居然还不死心,居然开发了新的版本,然而之前这个钓鱼程序,包括已经发布的和还在使用的,都已经彻底报废了。

不过到截止完文为止,这位黑客大神的服务端,似乎还没有做好….

总结:

1.缺少边界与数据检查的服务端,是坑爹又危险的

2. 缺少存储优化,曝露直接文件操作而没有检查的存储权限也是坑爹又危险的

3.当然扯远了这个钓鱼程序的用户安全性=0,我可以任意访问其他用户钓取的账户数据,同样是是坑爹又危险的。

最后,技术本没有对错,但如果用在歪门邪道上,终究是害人害己,就像这次。

如果你也对相关技术感兴趣,或致力于成为一名白帽子做互联网安全的守护者,请关注我,会定期更新有用有趣的内容。