故事发生于某个阳光明媚的某手绘交流群,不知什么时候,来了一位传奇般的雷锋级黑客。
具体他说了什么,就不再复述了,基本就是:“群里谁要QB,我可以帮你刷”。
寡人回了一句,大概意思是:“这是手绘群,打广告别来,QB什么用”之类的云云。
没想到这位雷锋黑客不但不放弃,秉着“我一定要为人民服务的中国梦”精神还加我好友,
寡人也想看看这葫芦里卖的什么药
于是有了已下的一幕:
看来真是天下掉馅饼的好事,为什么不试试呢,但是感觉为什么有点不对劲
骚年,这意图要不要那么明显,顿时产生了一种:“总有刁民想害朕”的危机感。
如果在平时,基本是已经是拉黑删除钓鱼程序结束了,但是今天寡人怨念尤其的深,不知道是不是昨晚喝的咖啡弄的一夜没睡,还是陪母上大人看了一上午的国产雷剧,浑身积攒了满满的负能量,我开始有了一些比较腹黑的想法 (╯°Д°)╯︵ ┻━┻
我决定,看看这个钓鱼程序卖的是什么药
先来看看这款软件闷骚的小图标
使用PEid进行查壳:发现加了UPX壳
当然这种这个难度约等于0的压缩壳,使用esp定律或者直接用工具能轻松搞定,脱去upx壳后再次查壳,发现变成了VC++6.0
这个年代,当然基本不会有人还在用VC++6.0了那么基本肯定,这一定是宇宙无敌易语言写的神奇玩意。
在虚拟机中再次运行这个软件
可以观察到,程序的意图基本就是钓取我们的账号密码,那么,这个账号密码会被发送到哪里呢?
不过不管如何发送,我们至少能够猜到99%是通过网络发送出去的,易语言这个excited的东西啊。网络最一般是通过socket来进行的,socket进行网络通信,用的是tcp udp两种通讯协议,对应最常用的发送数据,应该就是send和sendto这两个函数了。(当然也有WSAsend之类IOCP的做法,不过既然是易语言这种宇宙级语言写出来的东西,我们就不用想的那么复杂)
到这里,寡人决定做一个小小的工具,把这个软件发送的数据给dump下来
到这里,想到一个被用烂了十几年但是仍然有效的技术--------inline hook
至于什么是inline hook,这里我也不继续复述,毕竟这东西网上存在的资料已经非常非常多了,自己动手丰衣足食,不过我还是使用两张图来简单描述一下inline hook
图1.0
首先这是原来正常的函数
然后这是被hook过的函数
显然的,在我们的函数里,我们就可以做一点坏事,比如把传递给原函数的参数进行过滤修改,当然,在这里我们只是想dump下这个软件发送出去的数据,废话就不多说了,打开visualstudio创建项目
编写注入用的DLL(为什么使用DLL呢,因为DLL能够避免很多直接代码注入修改的很多问题,比如代码重定向,例如aslr保护……最主要的是,直接写起来也方便)
编写hook类,自己放大图片看吧,具体代码在附件当中自行查阅
编写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进行了某些肮脏的屁眼交易
从文件名可以看到,这个TCP连接到了27.152.181.114这个地址,而端口是80,显而易见这八成是一个Http协议的通讯,我们用记事本直接打开这个文件,发现它访问了pan.lanzou.com并且Get x/56636里的东西
那么到底是什么玩意呢。不妨打开浏览器浏览一下那个地址,2345????.exe,
看来就是桌面上多出的这个玩意了。真是钓鱼也不忘打广告捞一笔。真不知道这个钓鱼程序和2345间存在着什么更多的py交易
我们接着分析第一个数据包,发现它指向了vip.store.baidupan.com
这是百度网盘还是什么。看这又臭又长的Get请求,那个File字样深深出卖了它似乎又下载了一些别的什么东西.
接着看之后另一个数据包,似乎也是在下载什么东西。我们复制下这个链接
发现迅雷弹出来了,掀桌子,怎么又是这个2345网址导航,看来这个钓鱼程序的作者从一个地方下载还不大放心,从另外的一些地方又下载了一次,莫非下载的多就能进行更多的交易?
我索然无味的关掉前几个数据包,显然没有发现什么特别有价值的东西,我接着打开最后一个数据包,恩,似乎出现了一些有意思的东西
通过数据包,我们发现它指向了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天八成就爆炸了
执行dbFlooder,发现数据发送成功,我们尽量地调整发送的数据速度,使其不被其防火墙过滤而拉黑我们。看了看,效果似乎还不错。
但是,这个速度还是太慢了,况且就算我们flood成功了,等这家伙发现,删去我们的数据,还不是分分钟的问题,总不能我们一直和他耗着。
带着这个疑问,我打算更加深入一步,在这个HTTP Get请求包当中,可以明显的看到,这个GET请求被发往了一个www.****.cc网页下面
我蹑手蹑脚地打开这个网站,一股浓浓的中二病杀马特风扑鼻而来
在这个网站得的软件上,我发现了一个有趣的东西,会不会这个钓鱼软件就是这个东西生成的呢?,不顾羞耻病发作,我点开链接下载了这个程序
下载之后发现是一堆乱码命名的文件,一脸黑人问号,不过这个不影响我们继续分析,不如先打开试试?重复之前的注入步骤,把这个生成器重命名为Sample.exe,执行injector注入
看来,这个软件真是至死不渝的打广告啊,除了广告,还有各种忽悠
居然还有二维码登陆,本着我不下地狱谁下地狱的精神,我使用我的账号进行登陆,很快,一堆数据包被dump了下来
其中大部分,应该和企鹅的快速登陆有关系,但是我还是找到了一个比较特别的数据包,
115.238.240.152,没错的话,他不就是钓鱼软件发往的地址么。
打开这个数据包,发现它在请求一个txt文件,前面的那串文件名怎么感觉那么眼熟好像又不大一样
不管那么多了,我也试试这钓鱼软件肿么样,我同样生成了一个“钓鱼木马”,当然这水平叫木马是不是有点太抬举自己的了
重复注入步骤,做了很多次,就不再啰嗦了
在生成的木马面前,输入测试的账号密码11111111
查看dump下来的数据包
复制到之前我们分析的文本文件当中,嘿,Name的参数发生了改变
到了这里,我就大胆的猜想:
1.钓鱼生成器,请求自己钓取到的账号密码是靠那个Name参数同名的txt文件
2.钓鱼软件,通过一个Get请求,把自己的账号密码发送到name对应的txt文本文件下面
通过浏览器,我访问了这个txt文件,同时也证实了这个猜想
嘛。那么这个txt文件是什么时候创建的呢,是我登陆那个钓鱼软件生成器时,还是钓鱼木马发送账号密码时,我偷偷摸摸地自己构造了一个请求,来证实我这个想法
在下面这个请求中我构造了name为testtesttest,content为hellohello….
之后我去访问testtesttest.txt,嘿,还真有,真是作大死啊
现在我们再来看看这个,我创建了一个文本文件,里面只有一个字母,就是只有一字节,为什么会占用磁盘4KB的空间呢
这个和文件系统有关,但文件系统最小粒度单位,常常是簇,而一个簇的大小,就是4KB
所以,文件大小肯定是4KB的整数倍
除了这个,我还想试试更加excited的东西,比如参数中传递一些非常规字符,假如这个能成功,那就不仅仅是flood那么简单了。但是,可惜的是,似乎这些字符都被过滤掉了00截断同样试了试,未果,他也很识相的写出了参数错误字样
既然如此,我就只好用塞文件大法了,我只要发送几十个字节的Get请求,就能足足浪费这个钓鱼空间4KB的空间容量,同时产生大量的文件碎片
这个就不是那么容易删掉了吧
打开spacerFlood项目,重新构造数据包
恩,试了试,效果还不错,皮卡丘,就交给你了
将这个flood扔到某个云主机上运行,然后我们去睡大觉。而这个dbflood在以每秒鈡10个数据包的速度,往这个空间不断塞着辣鸡数据包,而那个钓鱼空间也在以每秒10个文件,每小时36000个文件,每天864000文件塞着一个文件夹,很快这个文件夹就连资源管理器打开都得半个小时了
再次访问这个目录,发现已经爆炸了,这也意味着,这个一系列害人害己的钓鱼软件的彻底宕机。
访问这个网站,看来这个钓鱼作者也发现自己空间似乎不是那么对劲,于是他删掉了所有值钱钓鱼的数据,好吧,至少以前的阴谋算是破产了,但他居然还不死心,居然开发了新的版本,然而之前这个钓鱼程序,包括已经发布的和还在使用的,都已经彻底报废了。
我晓有兴趣地下载了这个新版本的钓鱼生成器,再次进行分析
我的天,他居然放弃使用空间,而用易语言自己写了服务端,那么81端口是闹哪样,中文数据包仍然显得非常的“易语言”
我似乎看到了一大堆缺少边界检查和字符过滤的服务端。至于是否存在某些溢出漏洞,这里我就不继续探究了。不过到截止完文为止,这位黑客大神的服务端,似乎还没有做好….
总结:
1.缺少边界与数据检查的服务端,是坑爹又危险的
2.缺少存储优化,曝露直接文件操作而没有检查的存储权限也是坑爹又危险的
3.当然扯远了这个钓鱼程序的用户安全性=0,我可以任意访问其他用户钓取的账户数据,同样是是坑爹又危险的。
最后,技术是好东西,但如果用来歪门邪道,终究是害人害己,就像这次这玩意。