In this note, I organize the commons blue team skill

Event code

Winlog

Event ID 說明
4104 Windows powershell 執行日記
4624 登入成功
4625 登入失敗
4648 明確帳號登入(如 RunAs)
4672 特權登入(如 admin 登入)
4634 使用者登出
4662 Active Directory (AD) 物件上執行了某項操作 ( 偵測 Dscync ,尤其是一般使用者存取時)
4688 建立新程序(程式啟動)
4689 程式結束
4697 安裝新服務(常用於惡意持久化)
4720 建立新帳號
4722 啟用帳戶
4723 嘗試變更自己的密碼
4724 嘗試為他人變更密碼
4725 停用帳戶
4726 刪除帳戶
4732 使用者被加入群組
4768 Kerberos TGT 請求
4769 Kerberos 服務票證請求
4776 NTLM 驗證請求
5140 存取共用資料夾
5156 防火牆允許的網路連線(NetConn 事件)
7045 安裝服務(System log,也可監控持久化)

Sysmon

  • 可以看到更底層的資訊,包含檔案的更新或者創建等等
Event ID 說明
1 Process Create(程式啟動)
2 File creation time changed(時間戳被修改)
3 Network connection(TCP 連線)
5 Process Terminate(程式終止)
6 Driver Loaded(驅動載入)
7 Image Loaded(DLL載入)
8 CreateRemoteThread(遠端執行緒注入)
9 RawAccessRead(磁碟原始存取)
10 ProcessAccess(程式存取他人記憶體)
11 File Create(檔案建立)
12 Registry Key Create(註冊表鍵建立)
13 Registry Value Set(註冊表值修改)
14 Registry Key Delete(註冊表鍵刪除)
15 FileCreateStreamHash(建立 ADS)
22 DNS Query(DNS 查詢事件)
23 File Delete(檔案刪除)
25 Process Tampering(程式記憶體被修改)
26 File Deleted and Overwritten(防止取證)
255 Sysmon 設定被修改(Config change)

IDS/IPS

  • OSSEC

    • HIDS
  • Suricata

    • Suricata 是一個開源的入侵偵測系統(IDS)與入侵防禦系統(IPS),以深度封包檢測、流量分析與威脅偵測聞名。能使用 Suricata 的龐大規則集快速評估網路資料並辨識異常。

      指令如下

      suricata -r B33F50up_blog.pcapng 

      他會產生四個檔案

      • eve.json : Suricata的結構化日誌檔案,包含多種事件類型的詳細記錄
      • fast.log : Suricata 快速警報日誌,包含檢測到的安全威脅警報
      • stats.log : Suricata 運行統計資料,包含詳細的系統運行統計
      • suricata.log : Suricata 主要運行日誌,包含系統啟動和運行資訊

      以下是 fast.log 資訊

      08/09/2025-02:53:47.165861  [**] [1:2019284:3] ET ATTACK_RESPONSE Output of id command from HTTP server [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 192.168.1.125:5000 -> 100.112.165.2:60865
      08/09/2025-02:56:49.767871  [**] [1:2002034:13] ET ATTACK_RESPONSE Possible /etc/passwd via HTTP (linux style) [**] [Classification: Information Leak] [Priority: 2] {TCP} 192.168.1.125:5000 -> 100.112.165.2:61207
    • ls -lah /etc/suricata/rules/ see all rulus

    • suricata -r test.pcap create various logs(etc eve.json,fast.log…)

    • suricata --pcap=ens160 -vv Suricata’s (Live) LibPCAP mod

    • cat /var/log/suricata/old_eve.json | jq -c 'select(.event_type == "http")' | head -1 | jq quury example

  • RITA

  • Snort

    • example:
    sudo snort -c /root/snorty/etc/snort/snort.lua --daq-dir /usr/local/lib/daq -R /home/htb-student/local.rules -r /home/htb-student/pcaps/cerber.pcap -A cmg
    sudo snort -c /root/snorty/etc/snort/snort.lua --daq-dir /usr/local/lib/daq \
    -r XXX.pcap
    sudo snort -c /root/snorty/etc/snort/snort.lua --daq-dir /usr/local/lib/daq \
    -i ens160
  • Zeek

    • Zeek 是一個開源的網路安全監控工具,以強大的資料記錄功能聞名。它能將原始的 pcap 封包檔轉換成結構化的日誌,方便在 Zeek 內查詢與分析,快速提供網路行為的概覽。

      指令如下

      zeek -C -r B33F50up_blog.pcapng

      他會產生以下檔案

      • conn.log : 記錄了所有的網路連接
      • dns.log:記錄了所有的 DNS查詢活動
      • files.log:記錄了通過 HTTP 傳輸的檔案
      • http.log:這是一個 HTTP 協議的流量日誌,記錄了網頁瀏覽和API 請求
      • packet_filter.log:記錄了封包過濾器的配置

      以下是http.log 的形式

      #separator \x09
      #set_separator	,
      #empty_field	(empty)
      #unset_field	-
      #path	http
      #open	2025-09-27-22-26-52
      #fields	ts	uid	id.orig_h	id.orig_p	id.resp_h	id.resp_p	trans_depth	method	host	uri	referrer	version	user_agent	origin	request_body_len	response_body_len	status_code	status_msg	info_code	info_msg	tags	username	password	proxied	orig_fuids	orig_filenames	orig_mime_types	resp_fuids	resp_filenames	resp_mime_types
      #types	time	string	addr	port	addr	port	count	string	string	string	string	string	string	string	count	count	count	string	count	string	set[enum]	string	string	set[string]	vector[string]	vector[string]	vector[string]	vector[string]	vector[string]	vector[string]
      1754678828.272075	CAuRo91flufxXutAke	100.112.165.2	60665	192.168.1.125	5000	1	GET	192.168.1.125:5000	/	-	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	-	0	24859	200	OK	-	-	(empty)	-	-	-	-	-	-	FA9Bk7Ikrr1LVrys	-	text/html
      1754678857.820963	CIRhMK1X97Z1MzFRD1	100.112.165.2	60676	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	15	727	200	OK	-	-	(empty)	-	-	-	FIUrzJ3sbt6deYBXf3	-	text/plain	FyILV9CHbcmUMGtc6	-	text/json
      1754678865.293310	CZnidTF5LIgaMzbRe	100.112.165.2	60677	192.168.1.125	5000	1	POST	192.168.1.125:5000	/system	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	141	185	200	OK	-	-	(empty)	-	-	-	Fvs6lg41SIyuYsReh2	-	-	FqFYD91bNrEWRNR501	-	text/json
      1754679070.738945	CWlCIn4qK2ntw6CuJl	100.112.165.2	60757	192.168.1.125	5000	1	GET	192.168.1.125:5000	/	-	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	-	0	24859	200	OK	-	-	(empty)	-	-	-	-	-	-	FG2QH72aF2jeG9CYC9	-	text/html
      1754679165.228123	C5V1Fn3nYAvFuSQeE	100.112.165.2	60778	192.168.1.125	5000	1	POST	192.168.1.125:5000	/system	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	141	287	200	OK	-	-	(empty)	-	-	-	FnwtMr2TZ1qIS6LLmj	-	-	Fq827u4xABcX563I21	-	text/json
      1754679173.669096	CWXpsv3zrBE7Lx66Sg	100.112.165.2	60779	192.168.1.125	5000	1	POST	192.168.1.125:5000	/system	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	144	13177	200	OK	-	-	(empty)	-	-	-	FxvTqN3Pid7VWQP7y3	-	-	Fi4rGH32Y4P77kznf3	-	text/json
      1754679180.268390	Co6odn3WTbf9HKGcO6	100.112.165.2	60780	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	15	728	200	OK	-	-	(empty)	-	-	-	FYW00SjDihqYC30xe	-	text/plain	FQGbYm3SH1rsO8o9ng	-	text/json
      1754679196.383809	CGjLWoznypKV0Pgt	100.112.165.2	60809	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	16	738	200	OK	-	-	(empty)	-	-	-	FVCJDglco6ai9lzi4	-	text/plain	FB2a4L3x3ZELSSdCQ1	-	text/json
      1754679223.696243	C0s1KA7ZrfQvnIpj	100.112.165.2	60865	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	30	851	200	OK	-	-	(empty)	-	-	-	FA2p79sD6MkhyaCEb	-	text/plain	FwUGICEULGQRyBs78	-	text/json
      1754679257.891805	CtwrhY2Kw9bscBOsX7	100.112.165.2	60874	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	34	755	200	OK	-	-	(empty)	-	-	-	FybSTDKXBk5dCiaYl	-	text/plain	F55jsD1S1vWW8IVBY4	-	text/json
      1754679265.650887	CFgfqH2IasZxXsovkd	100.112.165.2	60875	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	30	869	200	OK	-	-	(empty)	-	-	-	FtvRcZ3D5kRIP1ijy5	-	text/plain	FTYdr5iKtJX11Efma	-	text/json
      1754679315.090163	CEAuN63ly0lHS2zRrj	100.112.165.2	60895	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	30	869	200	OK	-	-	(empty)	-	-	-	Fyt7jP30AEKPs4C0Uj	-	text/plain	F0zHt852ycC25Gpkf	-	text/json
      1754679319.217264	CRWcyt2bda4K3g6Xub	100.112.165.2	60912	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	36	900	200	OK	-	-	(empty)	-	-	-	FUAgus1sr4pPeGnidg	-	text/plain	FqnOWw20dfXD0koyIi	-	text/json
      1754679354.845803	CulPOq3A9IP8ab4Zqd	100.112.165.2	60981	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	48	769	200	OK	-	-	(empty)	-	-	-	FZw17aZHAnZltVkJ	-	text/plain	FQvAYSOVPIbUCfRm7	-	text/json
      1754679406.575000	C9iy0scrJKJuDpi07	100.112.165.2	61207	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	49	2621	200	OK	-	-	(empty)	-	-	-	FiejrYnJjwTaJ5db7	-	text/plain	FKZoSb4yddnL4uzkZf	-	text/json
      1754679827.575533	CV2dqm3aNuGOi4EC0h	100.112.165.2	63113	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	36	912	200	OK	-	-	(empty)	-	-	-	FDaXYp2bh8hJpHMYCi	-	text/plain	FdsBU41nDrcCQ9mTV9	-	text/json
      1754679851.757452	CWSzgl4AsTyJVyRpJf	100.112.165.2	63213	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	44	800	200	OK	-	-	(empty)	-	-	-	FAGwfWDdjCLhcrZX2	-	text/plain	F89dhl1uFy7r4oRtf	-	text/json
      1754679859.655497	C0LErP2jTxCqKmUESd	100.112.165.2	63216	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	47	781	200	OK	-	-	(empty)	-	-	-	FoNYJj2QlLyZkd9tEe	-	text/plain	FUaGCH2RbcOlDQcaOi	-	text/json
      1754679875.655339	CqC0qj2SMoQnSfaju6	100.112.165.2	63217	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	31	762	200	OK	-	-	(empty)	-	-	-	FRGjia4iHeyPzIDRC3	-	text/plain	FwGgDTGi2gHDik2P5	-	text/json
      1754679999.499748	CtN1Vk4RrwIRGOgwHc	100.112.165.2	63280	192.168.1.125	5000	1	POST	192.168.1.125:5000	/ping	http://192.168.1.125:5000/	1.1	Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36	http://192.168.1.125:5000	142	836	200	OK	-	-	(empty)	-	-	-	FFJx4j4PnbpIi0mfD6	-	text/plain	FYpDmc37JMpCuz4Zac	-	text/json
      #close	2025-09-27-22-26-52
      

      另外他也會根據 pcap 檔產生其他log ,參考網址:https://docs.zeek.org/en/master/logs/index.html

xml filter example

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-Sysmon/Operational">
    <Select Path="Microsoft-Windows-Sysmon/Operational">
      *[
        System[
          (EventID=3)
          and TimeCreated[
            @SystemTime >= '2022-01-01T07:41:36.000Z'
            and @SystemTime <= '2022-10-02T07:41:36.999Z'
          ]
        ]
        and EventData[
          Data[@Name='ProcessGuid']='a79137ec-af0f-6338-b702-00000000e901'
        ]
      ]
    </Select>
  </Query>
</QueryList>

SIEM

Continuously, for ongoing detection and alerting

ELK Stack

直接用 docker 架起來的方式 : 連結

Elastic Common Schema (ECS)

字段類型 描述 KQL 範例
event.category 將事件按大型邏輯類別分組,通常與”event.category”字段結合使用進行過濾搜索 • event.category: authentication
• event.category: process
• event.category: file
• event.category: malware
• event.category: network
event.type 作為子分類,通常與”event.category”字段結合使用過濾搜索 • event.type: creation
• event.type: deletion
• event.type: access
event.outcome 指示事件是否成功或失敗 • event.outcome: success
• event.outcome: failure

Common Search Fields

字段 KQL 範例 輸出
@timestamp @timestamp: 2023-01-25 事件發生時間的時間戳(事件來源於該時間而非更早或更晚)
agent.name agent.name: “DESKTOP*” 從代理名稱中搜索指定字符並顯示結果
message message: powershell 在任何含有”powershell”字符的消息中搜索
字段 KQL 範例 輸出
process.name event.category: process and process.name: svchost 尋找進程名為svchost的所有進程
process.command_line process.command_line: (cmd or “/c”) 尋找使用cmd並且含有命令行參數為”/c”的進程
process.pid event.category: process and process.pid: 4360 尋找PID為4360的進程
process.parent.name event.category: process and process.parent.name: cmd.exe and process.name: powershell.exe 尋找父進程為cmd.exe且該進程名為powershell的進程;尋找由cmd.exe父進程啟動的PowerShell進程
process.parent.pid event.category: process and process.parent.pid: 1240 尋找父進程PID為1240的進程
字段 KQL 範例 輸出
source.ip source.ip: 127.0.0.1 尋找源IP地址中的任何出站流量
destination.ip destination.ip: 23.184.192.62 尋找目的IP地址中的任何入站流量
destination.port destination.port: 443 尋找目的端口中的任何入站流量,例如目的端口443
dns.question.name dns.question.name: “www.youtube.com 尋找DNS查詢記錄查看DNS解析,包括網站youtube.com
dns.response_code dns.response_code: “NXDOMAIN” 尋找DNS響應代碼的返回碼,包含NXDOMAIN
destination.geo.country_name destination.geo.country_name: “Canada” 尋找目的地理國家欄位,例如Canada
字段 KQL 範例 輸出
user.name event.category: “authentication” and user.name: john 尋找用戶名john的登錄嘗試
winlog.logon.type event.category: “authentication” and winlog.logon.type: 3 尋找logon type為3(網路登錄)的驗證事件
winlog.event_data.AuthenticationPackageName event.category: “authentication” and winlog.event_data.AuthenticationPackageName: “NTLM” 尋找使用NTLM驗證包的驗證事件

常用查詢語法

event.provider: "Microsoft-Windows-Sysmon" and event.code: 11  and winlog.event_data.TargetFilename  : *.aspx

# DNS相關查詢
agent.type : "packetbeat" and type:"dns"  
dns.question.registered_domain : "XXX"

# 程序監控
event.category: process and process.name: powershell.exe
process.command_line: *encoded* and event.category: process

# 網路流量分析
source.ip: 192.168.1.0/24 and destination.port: (443 or 80)
event.category: network and destination.geo.country_name: "China"

# 驗證事件
event.category: authentication and event.outcome: failure
winlog.event_id: 4625 and user.name: administrator

# 檔案操作
event.category: file and event.type: creation
file.extension: (exe or dll) and file.path: *temp*

DFIR

after an incident has occurred

CTI

Malware Analysis

  • Noriben

    • Noriben is a Python-based script that works in conjunction with Sysinternals Procmon to automatically collect, analyze, and report on runtime indicators of malware.
    • python Noriben.py launch the script
  • VirusTotal

    VirusTotal 是一個線上服務,讓使用者可以上傳檔案、URL、Domain、IP 或 Hash 進行分析,以檢測是否含有惡意軟體、惡意連結、釣魚等威脅,VirusTotal 內把多個防毒引擎、網頁掃描器、威脅情報來源彙整在一起,並且裡面會跑沙箱獲得惡意程式行為

    使用方式是在上方的搜尋欄輸入 Hash、IP、Domain,或至上傳頁面上傳惡意程式

    這裡介紹一下 VirusTotal 分析完後提供的頁面資訊

    Detection

    這個頁面提供了多家的 antivirus 引擎的偵測結果,會顯示出辨識的惡意程式家族與標籤

    Details

    這個頁面會列出惡意程式的大小、型態、雜湊,以及編譯、修改時間

    PE 結構(Sections、Imports/Exports)、簽章資訊、字串等

    Relations

    這個頁面會列出惡意程式連線的 IP、Domain

    以及執行惡意程式時產生的檔案

    Behavior

    這裡會列出惡意程式跑在多種沙箱中的行為

    當中會有 Network 的分析

    當中也有檔案的操作,包含檔案開啟、修改、刪除、創建

    Process 的創建以及 Command 的記錄

    Community

    這個頁面大多數會有人分享其他惡意程式檢測平台的 Report

  • ANY.RUN

    ANY.RUN 是一個互動式線上惡意程式沙箱,允許使用者在受控的虛擬環境中動態執行可疑檔案或網址,觀察其行為、網路活動、檔案/登錄表操作等等

    如果要使用它的沙箱功能,就像 VirusTotal 一樣可以直接丟惡意程式進去分析的話,會需要先註冊帳戶,如果不想註冊的話,可以直接前往 https://app.any.run/submissions 並使用 Hash 查詢有沒有人之前丟過的惡意程式

    假設我查詢 hash 為 ced525930c76834184b4e194077c8c4e7342b3323544365b714943519a0f92af 的惡意程式

    然後點選其中一個,也可以進入到沙箱分析結果頁面

    這邊介紹一下 Report 介面,首先可以先看右邊的功能列,功能包含你可以下載這個惡意程式,以及在惡意程式啟動時執行了什麼行為

    如果想要詳細分析其中一個檔案,點擊他就會出現詳細訊息

    點選 More Info 之後就會進入到這個程式的完整分析內容

    這個頁面有一個很方便的功能,它會列出惡意程式行為的嚴重程度,假設我想要了解 T1053.005 Scheduled Task (1) 這個行為,並且想要知道它下的 Cmdline,可以點擊下方的 Uses Task Scheduler to run other applications 就會跳出視窗並顯示詳細內容

    回到分析主頁,下方是顯示 Network 相關分析結果,也有看檔案操作的頁面

  • MalwareBazaar

    MalwareBazaar 是由 abuse.ch 所運營的惡意軟體樣本分享平台,旨在讓資安研究人員、antivirus 廠商、威脅情報團隊能夠更容易地交換與取得惡意軟體樣本,如果有想要查詢的惡意程式可以來這個網站查

    它有一個查詢的語法,需要照著它的語法不然會找不到

    Search syntax is as follow: keyword:search_term
    
    Following is a list of accepted keywords along with an example search_term
    
    md5:1b109efade90ace7d953507adb1f1563 ( run)
    sha256:11b16ba733f2f4f10ac58021eecaf5668551a73e2a1acfae99745c50bfccbb44 ( run)
    signature:CobaltStrike ( run)
    tag:TA505 ( run)
    file_type:rtf ( run)
    user:malware_traffic ( run)
    clamav:SecuriteInfo.com.Artemis1FBB04F6EAF7.17086.UNOFFICIAL ( run)
    yara:win_asyncrat_j1 ( run)
    serial_number:51CD5393514F7ACE2B407C3DBFB09D8D ( run)
    issuer_cn:Sectigo RSA Code Signing CA ( run)
    imphash:756fdea446bc618b4804509775306c0d ( run)
    tlsh:8DD484F440EF10A2F25F852936ADBE9401B2B1C7DBDA5E08137DE5311BBDA633A0564D ( run)
    telfhash:52d0a7c198b4972c99e60578ed5c5bb29106216620070b20cf10a5d4d83b440f40db59 ( run)
    gimphash:b43f35a8610180bcb184238555a0858a6c160a2d872566e7e9633221308b34fd ( run)
    dhash_icon:f8dcbeffbffecee8 ( run)

    假設我現在要查sha256 是ced525930c76834184b4e194077c8c4e7342b3323544365b714943519a0f92af 的惡意程式

    這樣就成功找到了,首先會列出基本的訊息

    這個網站不錯的地方是它會去整理各大惡意程式檢測平台的 Report,並列出來 Report 網址或者檢測結果

  • Malpedia

    Malpedia 是由 Fraunhofer FKIE所維運的一個「惡意軟體百科 + 參考樣本集」平台,惡意軟體家族百科與研究資源,提供家族描述、別名、已知樣本參考、YARA 規則、相關研究連結。

    假設我們剛剛的 XWorm 惡意程式,可以直接在搜尋欄打上 XWorm

    這些皆是針對於 XWorm 的研究,可以點進去參考

    另外也可以尋找這是哪個組織發出來的

    可以在 Family 頁面中搜尋 XWorm

    點進去後可以看到這隻惡意程式相關的訊息,包含 Actor

    那這邊就可以看到 Actor 是 Hive0137

    點擊後可以看到該 Actor 的相關資訊

  • Triage

    Triage 是由 Hatching 提供的線上惡意程式沙箱台,用來自動執行、分析可疑檔案並生成行為報告,協助安全分析師快速篩選與分類威脅樣本。

    它可以像 VirusTotal 一樣上傳惡意程式並分析或者搜尋之前已經上傳過的惡意程式

    搜尋的方式就是點選右上角的 Search 後也是可以用 Hash 搜尋

    點進去後就會出現分析報告

    而如果是要上傳惡意程式,需要先進行登入,登入後上面列的 Submit 是上傳惡意程式的頁面

    上傳完後也會出現 Report 的頁面

    Report 頁面有包含

    • 環境與 metadata
    • 樣本基本資訊(雜湊、大小、評分、標籤)
    • 提取出的惡意設定(C2、安裝位置、檔案名)
    • 偵測簽章 / 行為標記
    • 進程行為
    • 網路行為
    • MITRE ATT&CK 對應技術
    • 可下載的記憶體 / 生成檔案

Memory Forensics

Volatility Framework

記憶體取證分析工具,用於分析記憶體映像檔案

pslist/pstree

可以幫助我們去查看這台電腦跑了什麼process,他們分析的方式是會根據Symbol Table 找到Windows Kernel的 PsActiveProcessHead 的位址,然後從那個鏈表開始沿 ActiveProcessLinks 指標逐一讀出 EPROCESS 結構並解析必要欄位,如:ImageFileName、UniqueProcessId、CreateTime、ExitTime 等

另外的pstree 以 pslist 的結果為基礎,轉成父子樹狀。

那如果參考 https://ithelp.ithome.com.tw/m/articles/10321120 或者 https://ithelp.ithome.com.tw/articles/10335699 的其中一個方式, 可以發現其實惡意程式是可以去將process 隱藏起來的,並且讓pslist 與 pstree 無法偵測,因此我們可以使用 psscan 嘗試去偵測

psscan

首先要說明,Windows kernel 在為許多核心物件(例如 EPROCESS、ETHREAD、FILE_OBJECT)分配記憶體時,會在 _POOL_HEADER 中放置一個 4-byte 的 pool tag,用來標示該分配的用途或來源。

psscan是一個使用 pool-tag scanning 的掃描器:它會在 memory dump 中搜尋_POOL_HEADER 與 pool tag,並且對找到的候選區塊做結構一致性檢查(例如欄位範圍、指標是否指向可讀記憶體、ProcessName 是否可讀等),來判定該區塊是否為一個有效的 EPROCESS/ETHREAD。因此,即使該程序物件已被從 kernel 的 active list unlink(例如被某些 rootkit 隱藏),只要其 pool 分配尚存在記憶體且尚未被覆寫,psscan 通常可以把它找到。

psxview

這個plugin 會將我們剛剛提到的pslist/pstree與psscan以及其他thrdscan、csrss作比較,如果沒有出現在相對應的掃描上就會出現 False, 否則就會出現 true,因此如果有一個process 他在pslist 出現False 但在psscan出現True 那就可以嘗試去分析看看是不是rootkit

System Profiling

分析項目 插件 命令行
識別作業系統版本 imageinfo python vol.py -f memory.dump imageinfo
分析KDBG結構 kdbgscan python vol.py -f memory.dump --profile=Win7SP1x64 kdbgscan

Processes Analysis

分析項目 插件 命令行
程序列表 pslist python vol.py -f memory.dump --profile=Win7SP1x64 pslist
程序父子關係 pstree python vol.py -f memory.dump --profile=Win7SP1x64 pstree
掃描程序 (含隱藏/終止) psscan python vol.py -f memory.dump --profile=Win7SP1x64 psscan
隱藏程序檢查 psxview python vol.py -f memory.dump --profile=Win7SP1x64 psxview
程序詳細資訊 psinfo python vol.py -f memory.dump --profile=Win7SP1x64 psinfo -p 1640
程序權限 privs python vol.py -f memory.dump --profile=Win7SP1x64 privs -p 1640
程序執行緒 threads python vol.py -f memory.dump --profile=Win7SP1x64 threads -p 1640
程序SID getsids python vol.py -f memory.dump --profile=Win7SP1x64 getsids -p 1640
程序令牌 tokens python vol.py -f memory.dump --profile=Win7SP1x64 tokens -p 1640
轉儲程序執行檔 procdump python vol.py -f memory.dump --profile=Win7SP1x64 procdump -p 1640 --dump-dir=./
虛擬位址描述符 vadinfo python vol.py -f memory.dump --profile=Win7SP1x64 vadinfo -p 1640
VAD樹結構 vadtree python vol.py -f memory.dump --profile=Win7SP1x64 vadtree -p 1640
遍歷VAD vadwalk python vol.py -f memory.dump --profile=Win7SP1x64 vadwalk -p 1640

Network Connections

分析項目 插件 命令行
網路連線/網路活動 netscan python vol.py -f memory.dump --profile=Win7SP1x64 netscan

Persistence Techniques

分析項目 插件 命令行
註冊表鍵值 printkey python vol.py -f memory.dump --profile=Win7SP1x64 printkey -K "Software\Microsoft\Windows\CurrentVersion\Run"
查找所有持久化機制 autoruns python vol.py -f memory.dump --profile=Win7SP1x64 autoruns

Filesystem

分析項目 插件 命令行
解析MFT項目 mftparser python vol.py -f memory.dump --profile=Win7SP1x64 mftparser
掃描檔案物件 filescan python vol.py -f memory.dump --profile=Win7SP1x64 filescan
轉儲檔案 dumpfiles python vol.py -f memory.dump --profile=Win7SP1x64 dumpfiles -Q 0x000000007e410890 --dump-dir=./

Advanced Analysis

分析項目 插件 命令行
掃描DLL dlllist python vol.py -f memory.dump --profile=Win7SP1x64 dlllist -p 1640
檢查處理程序句柄 handles python vol.py -f memory.dump --profile=Win7SP1x64 handles -p 1640 -t Process,Thread
命令行歷史 cmdline python vol.py -f memory.dump --profile=Win7SP1x64 cmdline
環境變數 envars python vol.py -f memory.dump --profile=Win7SP1x64 envars
記憶體字串搜尋 strings strings memory.dump | grep -i password
轉儲程序記憶體 memdump python vol.py -f memory.dump --profile=Win7SP1x64 memdump -p 1640 --dump-dir=./

透過 Volatility 拿到 evtx

Volatility 2

vol.py -f ./memory.dmp --profile=Win10x64_14393 -g 0xf8004a000b20 filescan | grep '.evtx'

Volatility 3

vol -f memory.dmp windows.filescan | grep '.evtx'

我們可以利用 FileScan 的 pugin 幫助我們檢查是否有我們想要的檔案,圖片中可以得知到說確實有,接下來就可以將他們dump下來,Volatility 2 以及Volatility 3 的 Dumpfile 支援 regex ,可以使用它幫助我們找到所有我們需要的 evtx

Volatility 2

vol.py -f ./memory.dmp --profile=Win10x64_14393 -g 0xf8004a000b20  dumpfiles --regex .evtx$ --ignore-case --dump-dir output

Volatility 3

vol -f memory.dmp windows.dumpfiles.DumpFiles --filter .evtx$

這個指令簡單來說就是從memory.dump 中 將結尾為.evtx的檔案全部抓出來,也可以指定看你想要看什麼evtx,再去更改regex即可。

假設我想要dump Security.evtx下來看

Volatility 2

vol.py -f ./memory.dmp --profile=Win10x64_14393 -g 0xf8004a000b20 --regex Security.evtx$ --ignore-case --dump-dir output

Volatility 3

vol -f memory.dmp windows.dumpfiles.DumpFiles --filter Security.evtx$

圖片中發現成功Dump出來東西了,但是怎麼會有兩個檔案,而且這兩個檔案一個是 vacb ,一個是 dat,跟 evtx 的關係不是說沒有感覺是一點關係都沒有,那什麼是 vacb,什麼是 dat ?

  • vacb : Caching Data
  • dat : Less Fragile File

簡單來說這兩個都儲存了 evtx 的資料,只是 dat 的儲存方式比較穩定可靠

因此其實也可以直接把 vacb 或 dat 副檔名直接改成 evtx ,就可以直接用內建的 Event viewer 查看

但另外其實也可以用Evtxcmd 將它變成 CSV 檔查看

根據 https://github.com/EricZimmerman/evtx?tab=readme-ov-file 官方給的使用說明,可以使用以下指令將我們的 evtx 轉換成 csv

.\EvtxECmd.exe -f "..\..\file.0xca82b31c5990.0xca82b3848c70.SharedCacheMap.Security.evtx.vacb" --csv ./

接下來就可以獲得一個csv檔,並且裡面的內容是evtx的內容

PS C:\Users\yunshiuan\Desktop\net9\EvtxeCmd > .\EvtxECmd.exe -f "..\..\file.0xca82b31c5990.0xca82b3848c70.SharedCacheMap.Security.evtx.vacb" --csv ./
EvtxECmd version 1.5.2.0

Author: Eric Zimmerman (saericzimmerman@gmail.com)
https://github.com/EricZimmerman/evtx

Command line: -f ..\..\file.0xca82b31c5990.0xca82b3848c70.SharedCacheMap.Security.evtx.vacb --csv ./

Warning: Administrator privileges not found!

CSV output will be saved to ./20250904074916_EvtxECmd_Output.csv

Maps loaded: 453

Processing C:\Users\yunshiuan\Desktop\file.0xca82b31c5990.0xca82b3848c70.SharedCacheMap.Security.evtx.vacb...
Chunk count: 30, Iterating records...
Record # 68 (Event Record Id: 68): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessName"] not found! Replacing with empty string
Record # 68 (Event Record Id: 68): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessId"] not found! Replacing with empty string
Record # 69 (Event Record Id: 69): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessName"] not found! Replacing with empty string
Record # 69 (Event Record Id: 69): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessId"] not found! Replacing with empty string
Record # 70 (Event Record Id: 70): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessName"] not found! Replacing with empty string
Record # 70 (Event Record Id: 70): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessId"] not found! Replacing with empty string
Record # 71 (Event Record Id: 71): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessName"] not found! Replacing with empty string
Record # 71 (Event Record Id: 71): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessId"] not found! Replacing with empty string
Record # 72 (Event Record Id: 72): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessName"] not found! Replacing with empty string
Record # 72 (Event Record Id: 72): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessId"] not found! Replacing with empty string
Record # 73 (Event Record Id: 73): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessName"] not found! Replacing with empty string
Record # 73 (Event Record Id: 73): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessId"] not found! Replacing with empty string
Record # 78 (Event Record Id: 78): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessName"] not found! Replacing with empty string
Record # 78 (Event Record Id: 78): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessId"] not found! Replacing with empty string
Record # 79 (Event Record Id: 79): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessName"] not found! Replacing with empty string
Record # 79 (Event Record Id: 79): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessId"] not found! Replacing with empty string
Record # 83 (Event Record Id: 83): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessName"] not found! Replacing with empty string
Record # 83 (Event Record Id: 83): In map for event 4718, Property /Event/EventData/Data[@Name="ProcessId"] not found! Replacing with empty string
Record # 2529 (Event Record Id: 2529): In map for event 1100, Property /Event/UserData[@Name="ServiceShutdown"] not found! Replacing with empty string

Event log details
Flags: IsDirty
Chunk count: 30
Stored/Calculated CRC: B5FC0719/B5FC0719
Earliest timestamp: 2024-01-31 23:47:41.1765022
Latest timestamp:   2024-02-01 19:48:31.0253493
Total event log records found: 246

Records included: 246 Errors: 0 Events dropped: 0

Metrics (including dropped events)
Event ID        Count
1100            1
4608            2
4624            58
4625            1
4647            1
4648            7
4672            51
4688            23
4696            2
4717            10
4718            9
4720            1
4725            2
4728            1
4731            11
4732            3
4735            11
4738            6
4739            1
4797            5
4798            7
4799            3
4826            2
4902            2
4907            1
5024            1
5033            1
5379            23

Processed 1 file in 1.8517 seconds

之後就可以用Timeline Explorer 或其他可以開 csv 的軟體去做想要的Event ID查詢或者字串的搜尋。

Malware Detection

分析項目 插件 命令行
檢查程序注入 malfind python vol.py -f memory.dump --profile=Win7SP1x64 malfind
Hook檢測 apihooks python vol.py -f memory.dump --profile=Win7SP1x64 apihooks
SSDT Hook檢測 ssdt python vol.py -f memory.dump --profile=Win7SP1x64 ssdt
驅動程式掃描 driverscan python vol.py -f memory.dump --profile=Win7SP1x64 driverscan

如果你在 Win10 的記憶體 dump 使用 Volatility 2 的 psscan 時,有可能會出現以下的錯誤

$ vol.py -f MemoryDump.mem --profile=Win10x64_19041 psscan

Volatility Foundation Volatility Framework 2.6.1
Offset(P)          Name                PID   PPID PDB                Time created                   Time exited
------------------ ---------------- ------ ------ ------------------ ------------------------------ ------------------------------
WARNING : volatility.debug    : Cannot find nt!ObGetObjectType
WARNING : volatility.debug    : Cannot find nt!ObGetObjectType
Traceback (most recent call last):
  File "/usr/local/bin/vol.py", line 192, in <module>
    main()
  File "/usr/local/bin/vol.py", line 183, in main
    command.execute()
  File "/usr/local/lib/python2.7/dist-packages/volatility/commands.py", line 147, in execute
    func(outfd, data)
  File "/usr/local/lib/python2.7/dist-packages/volatility/plugins/filescan.py", line 428, in render_text
    for eprocess in data:
  File "/usr/local/lib/python2.7/dist-packages/volatility/poolscan.py", line 252, in scan
    skip_type_check = skip_type_check)
  File "/usr/local/lib/python2.7/dist-packages/volatility/plugins/overlays/windows/windows.py", line 1258, in get_object
    return self.get_object_top_down(struct_name, object_type, skip_type_check)
  File "/usr/local/lib/python2.7/dist-packages/volatility/plugins/overlays/windows/windows.py", line 1231, in get_object_top_down
    header.get_object_type() == object_type):
  File "/usr/local/lib/python2.7/dist-packages/volatility/plugins/overlays/windows/win7.py", line 155, in get_object_type
    return self.type_map.get(int(self.TypeIndex), '')
  File "/usr/local/lib/python2.7/dist-packages/volatility/plugins/overlays/windows/win10.py", line 334, in TypeIndex
    return ((addr >> 8) ^ cook ^ indx) & 0xFF
TypeError: unsupported operand type(s) for ^: 'int' and 'NoneType'

這個錯誤是因為win10.py 中在執行時在return ((addr >> 8) ^ cook ^ indx) & 0xFF這段程式出現了 NoneType 的變數。

nt!ObGetObjectType 是什麼?

根據這篇文章的分析,可以知道說 Win 10 的 TypeIndex 被混淆過,並且是根據

Index = TypeIndex ^ 2nd least significate byte of OBJECT_HEADER address ^ nt!ObHeaderCookie

這樣的公式進行混淆,nt!ObGetObjectType 的功用就是將TypeIndex 進行解混淆並回傳解混淆的TypeIndex。

因為 Volatility 2 是開源的,可以去看一下 win10.py 的sourcecode

class _OBJECT_HEADER_10(win8._OBJECT_HEADER):
        
    @property
    def TypeIndex(self):
        """Wrap the TypeIndex member with a property that decodes it 
        with the nt!ObHeaderCookie value."""

        cook = obj.VolMagic(self.obj_vm).ObHeaderCookie.v()
        addr = self.obj_offset 
        indx = int(self.m("TypeIndex"))

        return ((addr >> 8) ^ cook ^ indx) & 0xFF

這邊就可以明顯的看到這三個變數分別代表什麼,並且利用這三個變數解混淆

  • addr : OBJECT_HEADER_address
  • cook : nt!ObHeaderCookie 讀出的cookie 值,Windows 10 是每次開機隨機生成的
  • indx : 混淆過後的TypeIndex

那這邊就是因為 Volatlity2 讀不到 nt!ObHeaderCookie,因此 cook 會是NoneType , 而如果你有在Volatility 2下過 -h 有可能會看過可以下--cookie

$ vol.py -h

Volatility Foundation Volatility Framework 2.6.1
Usage: Volatility - A memory forensics analysis platform.

Options:
  -h, --help            list all available options and their default values.
                        Default values may be set in the configuration file
                        (/etc/volatilityrc)
  --conf-file=/home/yunshiuan/.volatilityrc
                        User based configuration file
  -d, --debug           Debug volatility
  --plugins=PLUGINS     Additional plugin directories to use (colon separated)
  --info                Print information about all registered objects
  --cache-directory=/home/yunshiuan/.cache/volatility
                        Directory where cache files are stored
  --cache               Use caching
  --tz=TZ               Sets the (Olson) timezone for displaying timestamps
                        using pytz (if installed) or tzset
  -f FILENAME, --filename=FILENAME
                        Filename to use when opening an image
  --profile=WinXPSP2x86
                        Name of the profile to load (use --info to see a list
                        of supported profiles)
  -l LOCATION, --location=LOCATION
                        A URN location from which to load an address space
  -w, --write           Enable write support
  --dtb=DTB             DTB Address
  --shift=SHIFT         Mac KASLR shift address
  --output=text         Output in this format (support is module specific, see
                        the Module Output Options below)
  --output-file=OUTPUT_FILE
                        Write output in this file
  -v, --verbose         Verbose information
  --physical_shift=PHYSICAL_SHIFT
                        Linux kernel physical shift address
  --virtual_shift=VIRTUAL_SHIFT
                        Linux kernel virtual shift address
  -g KDBG, --kdbg=KDBG  Specify a KDBG virtual address (Note: for 64-bit
                        Windows 8 and above this is the address of
                        KdCopyDataBlock)
  --force               Force utilization of suspect profile
  -k KPCR, --kpcr=KPCR  Specify a specific KPCR address
  --cookie=COOKIE       Specify the address of nt!ObHeaderCookie (valid for
                        Windows 10 only)

那這個就是讓我們放 nt!ObHeaderCookie 的 address 給 Volatility 2 , 因此接下來只要獲取到nt!ObHeaderCookie 位置的 cookie 應該就可以解決這個問題了。而 nt!ObHeaderCookie 在 ntoskrnl.exe 中可以找到。

因此我們現在要把memory 中的ntoskrnl.exe dump出來,volatility 2 有一個很猛的 moddump Plugin ,他可以將 Kernel Driver 全部 dump 出來

$ vol.py -f MemoryDump.mem --profile=Win10x64_19041 moddump --dump-dir ./

Volatility Foundation Volatility Framework 2.6.1
Module Base        Module Name          Result
------------------ -------------------- ------
0xfffff8076221a000 ntoskrnl.exe         OK: driver.fffff8076221a000.sys
0xfffff80762070000 hal.dll              OK: driver.fffff80762070000.sys
0xfffff80767340000 ucx01000.sys         OK: driver.fffff80767340000.sys
0xfffff80764530000 NETIO.SYS            OK: driver.fffff80764530000.sys
0xfffff80767570000 UsbHub3.sys          OK: driver.fffff80767570000.sys
0xfffff80767020000 USBPORT.SYS          OK: driver.fffff80767020000.sys
0xfffff80767db0000 vm3dmp.sys           OK: driver.fffff80767db0000.sys
0xfffff807643c0000 ndis.sys             OK: driver.fffff807643c0000.sys
0xfffff807679d0000 cldflt.sys           OK: driver.fffff807679d0000.sys
0xfffff80767a80000 bindflt.sys          OK: driver.fffff80767a80000.sys
0xfffff80763fe0000 EhStorClass.sys      OK: driver.fffff80763fe0000.sys
0xfffff807635f0000 CI.dll               OK: driver.fffff807635f0000.sys
0xfffff80763c00000 pdc.sys              OK: driver.fffff80763c00000.sys
0xfffff80767af0000 rspndr.sys           OK: driver.fffff80767af0000.sys
0xfffff80767210000 e1i65x64.sys         OK: driver.fffff80767210000.sys
0xfffff80763e00000 vsock.sys            OK: driver.fffff80763e00000.sys
0xfffff80767440000 rdpbus.sys           OK: driver.fffff80767440000.sys
0xfffff80774a50000 tcpipreg.sys         OK: driver.fffff80774a50000.sys
0xfffff8077a5f0000 ad_driver.10.sys     OK: driver.fffff8077a5f0000.sys
0xfffff80765670000 cdrom.sys            OK: driver.fffff80765670000.sys
0xfffff80774c80000 mpsdrv.sys           OK: driver.fffff80774c80000.sys
0xfffff80763eb0000 storahci.sys         OK: driver.fffff80763eb0000.sys
0xfffff8077a4c0000 condrv.sys           OK: driver.fffff8077a4c0000.sys
0xfffff80765ad0000 watchdog.sys         OK: driver.fffff80765ad0000.sys
0xfffff807656f0000 Beep.SYS             OK: driver.fffff807656f0000.sys
0xfffff80764b70000 mup.sys              OK: driver.fffff80764b70000.sys
0xfffff80767d90000 serenum.sys          OK: driver.fffff80767d90000.sys
0xfffff80763b50000 msisadrv.sys         OK: driver.fffff80763b50000.sys
0xfffff80762160000 FLTMGR.SYS           OK: driver.fffff80762160000.sys
0xfffff80767390000 vmgencounter.sys     OK: driver.fffff80767390000.sys
0xfffff80763fb0000 stornvme.sys         OK: driver.fffff80763fb0000.sys
0xfffff807635c0000 werkernel.sys        OK: driver.fffff807635c0000.sys
0xfffff80765720000 dxgkrnl.sys          OK: driver.fffff80765720000.sys
0xfffff807637f0000 WMILIB.SYS           OK: driver.fffff807637f0000.sys
0xfffff80763d90000 volmgrx.sys          Error: Cannot acquire AS
0xfffff80774a20000 Ndu.sys              OK: driver.fffff80774a20000.sys
0xfffff80763ef0000 storport.sys         OK: driver.fffff80763ef0000.sys
0xfffff80767990000 wcifs.sys            OK: driver.fffff80767990000.sys
0xfffff80763c50000 partmgr.sys          OK: driver.fffff80763c50000.sys
0xfffff80767870000 dxgmms2.sys          OK: driver.fffff80767870000.sys
0xfffff80766e80000 kdnic.sys            OK: driver.fffff80766e80000.sys
0xfffff80767b70000 peauth.sys           OK: driver.fffff80767b70000.sys
0xfffff80764aa0000 volsnap.sys          OK: driver.fffff80764aa0000.sys
0xfffff80763b10000 IntelTA.sys          OK: driver.fffff80763b10000.sys
0xfffff807676c0000 HIDPARSE.SYS         OK: driver.fffff807676c0000.sys
0xfffff80767cd0000 umbus.sys            OK: driver.fffff80767cd0000.sys
0xfffff80767720000 dump_storport.sys    OK: driver.fffff80767720000.sys
0xfffff807673b0000 BATTC.SYS            OK: driver.fffff807673b0000.sys
0xfffff80766da0000 dfsc.sys             OK: driver.fffff80766da0000.sys
0xfffff80763b20000 WindowsTr...roxy.sys OK: driver.fffff80763b20000.sys
0xfffff80764b10000 rdyboost.sys         OK: driver.fffff80764b10000.sys
0xfffff80763d50000 PCIIDEX.SYS          OK: driver.fffff80763d50000.sys
0xfffff80766f80000 afunix.sys           OK: driver.fffff80766f80000.sys
0xfffff80767da0000 vm3dmp_loader.sys    OK: driver.fffff80767da0000.sys
0xfffff80764ba0000 iorate.sys           OK: driver.fffff80764ba0000.sys
0xfffff80767420000 NdisVirtualBus.sys   OK: driver.fffff80767420000.sys
0xfffff80766dd0000 CompositeBus.sys     OK: driver.fffff80766dd0000.sys
0xfffff80774a00000 mmcss.sys            OK: driver.fffff80774a00000.sys
0xfffff80764000000 fileinfo.sys         OK: driver.fffff80764000000.sys
0xfffff80764610000 tcpip.sys            OK: driver.fffff80764610000.sys
0xfffff807637a0000 WDFLDR.SYS           OK: driver.fffff807637a0000.sys
0xfffff80766c20000 rdbss.sys            OK: driver.fffff80766c20000.sys
0xfffff80762080000 kdcom.dll            OK: driver.fffff80762080000.sys
0xfffff80766ca0000 csc.sys              OK: driver.fffff80766ca0000.sys
0xfffffb54a32b0000 win32k.sys           Error: Cannot acquire AS
0xfffff807674e0000 USBD.SYS             OK: driver.fffff807674e0000.sys
0xfffffb54a2c00000 win32kbase.sys       OK: driver.fffffb54a2c00000.sys
0xfffff80763af0000 WindowsTrustedRT.sys OK: driver.fffff80763af0000.sys
0xfffff80774ca0000 mrxsmb.sys           OK: driver.fffff80774ca0000.sys
0xfffff80767d20000 kbdclass.sys         OK: driver.fffff80767d20000.sys
0xfffff80766d40000 nsiproxy.sys         OK: driver.fffff80766d40000.sys
0xfffff80767560000 ksthunk.sys          OK: driver.fffff80767560000.sys
0xfffff80765b70000 crashdmp.sys         OK: driver.fffff80765b70000.sys
0xfffff80763b30000 pcw.sys              OK: driver.fffff80763b30000.sys
0xfffff807643b0000 Fs_Rec.sys           Error: Cannot acquire AS
0xfffff807649c0000 fvevol.sys           OK: driver.fffff807649c0000.sys
0xfffff807635e0000 ntosext.sys          OK: driver.fffff807635e0000.sys
0xfffff80764c00000 CLASSPNP.SYS         OK: driver.fffff80764c00000.sys
0xfffff80766bf0000 winhvr.sys           OK: driver.fffff80766bf0000.sys
0xfffff80762130000 PSHED.dll            OK: driver.fffff80762130000.sys
0xfffff80763e20000 vmci.sys             OK: driver.fffff80763e20000.sys
0xfffff80767430000 swenum.sys           OK: driver.fffff80767430000.sys
0xfffff80767660000 hidusb.sys           OK: driver.fffff80767660000.sys
0xfffff80766b20000 netbios.sys          OK: driver.fffff80766b20000.sys
0xfffff80766ea0000 CimFS.SYS            OK: driver.fffff80766ea0000.sys
0xfffff80774ac0000 HTTP.sys             OK: driver.fffff80774ac0000.sys
0xfffff80767ab0000 lltdio.sys           OK: driver.fffff80767ab0000.sys
0xfffff807670d0000 portcls.sys          OK: driver.fffff807670d0000.sys
0xfffff807656e0000 Null.SYS             Error: Cannot acquire AS
0xfffff80767cf0000 i8042prt.sys         OK: driver.fffff80767cf0000.sys
0xfffff80763910000 mssecflt.sys         OK: driver.fffff80763910000.sys
0xfffff80766f20000 netbt.sys            OK: driver.fffff80766f20000.sys
0xfffff80766b40000 Vid.sys              OK: driver.fffff80766b40000.sys
0xfffff80762150000 BOOTVID.dll          OK: driver.fffff80762150000.sys
0xfffff80767760000 dump_stornvme.sys    OK: driver.fffff80767760000.sys
0xfffff80763d70000 volmgr.sys           OK: driver.fffff80763d70000.sys
0xfffff80763990000 ACPI.sys             OK: driver.fffff80763990000.sys
0xfffff807636e0000 cng.sys              OK: driver.fffff807636e0000.sys
0xfffff80766fa0000 ahcache.sys          OK: driver.fffff80766fa0000.sys
0xfffff80774d90000 vmmemctl.sys         OK: driver.fffff80774d90000.sys
0xfffff80767b10000 msquic.sys           OK: driver.fffff80767b10000.sys
0xfffff807621d0000 cmimcext.sys         OK: driver.fffff807621d0000.sys
0xfffff80766df0000 fastfat.SYS          OK: driver.fffff80766df0000.sys
0xfffff80763400000 clipsp.sys           OK: driver.fffff80763400000.sys
0xfffff807637c0000 SleepStudyHelper.sys OK: driver.fffff807637c0000.sys
0xfffff80764020000 Wof.sys              OK: driver.fffff80764020000.sys
0xfffff80763e70000 ataport.SYS          OK: driver.fffff80763e70000.sys
0xfffff80764a90000 volume.sys           OK: driver.fffff80764a90000.sys
0xfffff807670a0000 HDAudBus.sys         OK: driver.fffff807670a0000.sys
0xfffff807656b0000 filecrypt.sys        OK: driver.fffff807656b0000.sys
0xfffff807638e0000 acpiex.sys           OK: driver.fffff807638e0000.sys
0xfffff80766ef0000 TDI.SYS              OK: driver.fffff80766ef0000.sys
0xfffff8077a4e0000 vmhgfs.sys           OK: driver.fffff8077a4e0000.sys
0xfffff80765b10000 BasicRender.sys      OK: driver.fffff80765b10000.sys
0xfffff80767d50000 mouclass.sys         OK: driver.fffff80767d50000.sys
0xfffff80763d40000 intelide.sys         OK: driver.fffff80763d40000.sys
0xfffffb54a3350000 cdd.dll              Error: Cannot acquire AS
0xfffff80767960000 luafv.sys            OK: driver.fffff80767960000.sys
0xfffff80774c50000 bowser.sys           OK: driver.fffff80774c50000.sys
0xfffff807676e0000 mouhid.sys           OK: driver.fffff807676e0000.sys
0xfffff807677b0000 dump_dumpfve.sys     OK: driver.fffff807677b0000.sys
0xfffff807673d0000 intelppm.sys         OK: driver.fffff807673d0000.sys
0xfffff80765be0000 Msfs.SYS             OK: driver.fffff80765be0000.sys
0xfffff8077a550000 WdFilter.sys         OK: driver.fffff8077a550000.sys
0xfffff80766ff0000 tap0901.sys          OK: driver.fffff80766ff0000.sys
0xfffff80774da0000 srvnet.sys           OK: driver.fffff80774da0000.sys
0xfffff807640d0000 Ntfs.sys             OK: driver.fffff807640d0000.sys
0xfffff80763e40000 mountmgr.sys         OK: driver.fffff80763e40000.sys
0xfffff80767450000 usbhub.sys           OK: driver.fffff80767450000.sys
0xfffff80767a60000 storqosflt.sys       OK: driver.fffff80767a60000.sys
0xfffff80767680000 HIDCLASS.SYS         OK: driver.fffff80767680000.sys
0xfffff80763c90000 spaceport.sys        OK: driver.fffff80763c90000.sys
0xfffff807672a0000 USBXHCI.SYS          OK: driver.fffff807672a0000.sys
0xfffff80766ec0000 tdx.sys              OK: driver.fffff80766ec0000.sys
0xfffff80766ad0000 pacer.sys            OK: driver.fffff80766ad0000.sys
0xfffff80765700000 vmrawdsk.sys         OK: driver.fffff80765700000.sys
0xfffff80767000000 usbuhci.sys          OK: driver.fffff80767000000.sys
0xfffff80763550000 msrpc.sys            Error: Cannot acquire AS
0xfffff80763b60000 pci.sys              OK: driver.fffff80763b60000.sys
0xfffff80767ad0000 mslldp.sys           OK: driver.fffff80767ad0000.sys
0xfffff80767170000 ks.sys               OK: driver.fffff80767170000.sys
0xfffff80766d90000 gpuenergydrv.sys     OK: driver.fffff80766d90000.sys
0xfffff807673a0000 CmBatt.sys           OK: driver.fffff807673a0000.sys
0xfffff807645d0000 ksecpkg.sys          OK: driver.fffff807645d0000.sys
0xfffff80763be0000 vdrvroot.sys         OK: driver.fffff80763be0000.sys
0xfffff807671f0000 usbehci.sys          OK: driver.fffff807671f0000.sys
0xfffff80763800000 Wdf01000.sys         OK: driver.fffff80763800000.sys
0xfffff80764be0000 disk.sys             OK: driver.fffff80764be0000.sys
0xfffff80766d70000 mssmbios.sys         OK: driver.fffff80766d70000.sys
0xfffff80774d40000 mrxsmb20.sys         OK: driver.fffff80774d40000.sys
0xfffff807677d0000 dxgmms1.sys          OK: driver.fffff807677d0000.sys
0xfffff80767d70000 serial.sys           OK: driver.fffff80767d70000.sys
0xfffff80766ab0000 vwififlt.sys         OK: driver.fffff80766ab0000.sys
0xfffff807620c0000 CLFS.SYS             OK: driver.fffff807620c0000.sys
0xfffff807656d0000 tbs.sys              OK: driver.fffff807656d0000.sys
0xfffff80764900000 fwpkclnt.sys         OK: driver.fffff80764900000.sys
0xfffff80766f10000 ws2ifsl.sys          OK: driver.fffff80766f10000.sys
0xfffff80763520000 ksecdd.sys           OK: driver.fffff80763520000.sys
0xfffff80765b30000 Npfs.SYS             OK: driver.fffff80765b30000.sys
0xfffff80767140000 drmk.sys             OK: driver.fffff80767140000.sys
0xfffff80766d60000 npsvctrig.sys        OK: driver.fffff80766d60000.sys
0xfffff80764980000 wfplwfs.sys          OK: driver.fffff80764980000.sys
0xfffff80767d40000 vmmouse.sys          OK: driver.fffff80767d40000.sys
0xfffff807637d0000 WppRecorder.sys      OK: driver.fffff807637d0000.sys
0xfffff80761de0000 mcupdate.dll         OK: driver.fffff80761de0000.sys
0xfffff8077a3f0000 srv2.sys             OK: driver.fffff8077a3f0000.sys
0xfffff80766a00000 afd.sys              OK: driver.fffff80766a00000.sys
0xfffff80763970000 SgrmAgent.sys        OK: driver.fffff80763970000.sys
0xfffff80767620000 usbccgp.sys          OK: driver.fffff80767620000.sys
0xfffff80763c30000 CEA.sys              OK: driver.fffff80763c30000.sys
0xfffff80767700000 vmusbmouse.sys       OK: driver.fffff80767700000.sys
0xfffff80767850000 monitor.sys          OK: driver.fffff80767850000.sys
0xfffff80763e60000 atapi.sys            OK: driver.fffff80763e60000.sys
0xfffff80763a80000 intelpep.sys         OK: driver.fffff80763a80000.sys
0xfffff80762090000 tm.sys               OK: driver.fffff80762090000.sys
0xfffff80766e60000 bam.sys              OK: driver.fffff80766e60000.sys
0xfffffb54a2ee0000 win32kfull.sys       Error: Cannot acquire AS
0xfffff807674f0000 HdAudio.sys          OK: driver.fffff807674f0000.sys
0xfffff80766b00000 ndiscap.sys          OK: driver.fffff80766b00000.sys
0xfffff80765af0000 BasicDisplay.sys     OK: driver.fffff80765af0000.sys

第一個就是ntoskrnl.exe ,把它拿去反編譯之後找到 ObGetObjectType 接下來把前面的8 bytes 的 opcode 記住

接下來用yarascan 把他從記憶體中的位置抓出來

$ sudo python2.7 vol.py -f ../temp_extract_dir/MemoryDump.mem --profile=Win10x64_19041 yarascan -K -Y "{48 8D 41 D0 0F B6 49 E8}"

Volatility Foundation Volatility Framework 2.6.1
Rule: r1
Owner: ntoskrnl.exe
0xf8076291d470  48 8d 41 d0 0f b6 49 e8 48 c1 e8 08 0f b6 c0 48   H.A...I.H......H
0xf8076291d480  33 c1 0f b6 0d a3 92 5f 00 48 33 c1 48 8d 0d ed   3......_.H3.H...
0xf8076291d490  99 5f 00 48 8b 04 c1 c3 cc cc cc cc cc cc cc cc   ._.H............
0xf8076291d4a0  48 83 ec 58 8a 84 24 a0 00 00 00 c7 44 24 48 01   H..X..$.....D$H.
0xf8076291d4b0  00 00 00 88 44 24 40 8b 84 24 98 00 00 00 89 44   ....D$@..$.....D
0xf8076291d4c0  24 38 8b 84 24 90 00 00 00 89 44 24 30 48 8b 84   $8..$.....D$0H..
0xf8076291d4d0  24 88 00 00 00 48 89 44 24 28 48 8b 84 24 80 00   $....H.D$(H..$..
0xf8076291d4e0  00 00 48 89 44 24 20 e8 14 00 00 00 48 83 c4 58   ..H.D$......H..X
0xf8076291d4f0  c3 cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc   ................
0xf8076291d500  4c 8b dc 49 89 5b 08 49 89 73 10 4d 89 4b 20 4d   L..I.[.I.s.M.K.M
0xf8076291d510  89 43 18 57 41 54 41 55 41 56 41 57 48 83 ec 70   .C.WATAUAVAWH..p
0xf8076291d520  48 8b da 48 8b f9 45 33 ed 4d 89 6b b0 4d 89 6b   H..H..E3.M.k.M.k
0xf8076291d530  b8 65 48 8b 04 25 88 01 00 00 48 89 44 24 60 44   .eH..%....H.D$`D
0xf8076291d540  8a b8 32 02 00 00 45 84 ff 0f 84 07 94 12 00 49   ..2...E........I
0xf8076291d550  8b 4b 28 48 b8 00 00 ff ff ff 7f 00 00 48 3b c8   .K(H.........H;.
0xf8076291d560  48 0f 43 c8 8b 01 89 01 44 8b a4 24 d0 00 00 00   H.C.....D..$....

接下來知道 ntoskrnl.exe 的位置在0xf8076291d470後我們就可以寫 script 幫我我們提取ObHeaderCookie

回去看反編譯出來的ObGetObjectType,我們的目標是movzx ecx, byte [rel ObHeaderCookie] 這段

$ sudo python2.7 vol.py -f ../temp_extract_dir/MemoryDump.mem --profile=Win10x64_19041 volshell
Volatility Foundation Volatility Framework 2.6.1
Current context: System @ 0xffffad8185883180, pid=4, ppid=0 DTB=0x1ad002
Welcome to volshell! Current memory image is:
file:///home/yunshiuan/temp_extract_dir/MemoryDump.mem
To get help, type 'hh()'
>>> addr = 0xf8076291d470
>>> for m in getmods():
...     nt_mod = m
...     break
...
>>> mode = distorm3.Decode64Bits
>>> data = nt_mod.obj_vm.read(addr, 100)
>>> ops = distorm3.Decompose(addr, data, mode)
>>> for op in reversed(ops):
...     if (op.size == 7 and 'FLAG_RIP_RELATIVE' in op.flags and len(op.operands) == 2 and op.operands[0].type == 'Register' and op.operands[1].type == 'AbsoluteMemory' and op.operands[1].size == 8):
...         addr2 = op.address + op.size + op.operands[1].disp
...
>>> cookie = obj.Object("unsigned int", offset = addr2, vm = nt_mod.obj_vm)
>>> hex(cookie)
'0x9be88324L'
>>> exit()

這個script 簡單來說

  • 首先先獲取到addr 的第一個函數,那因為我們直接定位的關係,所以這邊nt_mod = ObGetObjectType
  • 接下來分別是設定64 位元反組譯模式、讀取100 位元組的機器碼、進行反組譯得到指令列表
  • 下一部分是尋找movzx ecx, byte [rel ObHeaderCookie]指令
    • op.size == 7:指令長度為 7 位元組
    • 'FLAG_RIP_RELATIVE' in op.flags:使用 RIP相對定址
    • len(op.operands) == 2:有 2 個運算元
    • op.operands[0].type== 'Register':第一個運算元是暫存器
    • op.operands[1].type == 'AbsoluteMemory':第二個運算元是記憶體位址
    • op.operands[1].size== 8:記憶體運算元大小為 8 位元組
  • 找到後計算ObHeaderCookie的實際記憶體位置
    • addr2 = op.address + op.size + op.operands[1].disp
      • op.address:指令地址
      • op.size:指令大小(7 位元組)
      • op.operands[1].disp:RIP 相對位移
  • 最後提取cookie 的值

提取後我們知道cookie 的值為0x9be88324,最後再下一次 psscan 帶上剛剛抓的cookie

sudo python2.7 vol.py -f ../temp_extract_dir/MemoryDump.mem --profile=Win10x64_19041 --cookie=0x9be88324 psscan

發現成功執行


Network Forensics

  • wireshark

    解密封包

    Wireshark 支援可以匯入key ,將加密過後的HTTPS 流量還原成明文

    因為HTTPS 多了一層SSL/TLS,他會將封包進行加密保護傳輸內容不被竊聽

    解密流程如下:

    假設我們要分析一個HTTPS網站的登入過程,將加解密的key 先存在一個檔案中

    export SSLKEYLOGFILE="/home/user/ssl-keys.log"

    然後再Preferences-> Prorocols 裡面找到TLS ,接下來把剛剛儲存的key 路徑丟進去最底下(Pre)-Master-Screct log filename裡面

    另外wireshark 支援的解密為

    1. SSL/TLS解密:最常見的HTTPS流量解密
    2. WEP/WPA/WPA2解密:WiFi加密流量
    3. IPsec解密:VPN流量
    4. Kerberos解密:Windows認證流量
    5. 自定義加密:透過Lua腳本支援

    匯出物件

    wireshark 提供了可以將封包傳輸的物件(如:圖片、檔案、網頁……) dump 下來的功能


  • NetworkMiner

    目前只支援 Windows 作業系統,但是也可以使用其他工具讓它在 Linux 或 Mac 上執行。它可以將 pcap 內的封包拆開、解析、重組,嘗試把裡面的檔案、圖片、郵件、憑證/SSL 證書、使用者帳號密碼等直接還原出來,另外它也可以即時監聽封包並分析

    但是,NetworkMiner 免費版只能分析 pcap 檔案,如果是 pcapng 格式則需要付費才能分析,付費版本需要 1300 USD

    pcapng 也是一種用來儲存網路封包捕捉資料的檔案格式,是舊的 pcap 格式的進化版,它會比 pcap 儲存的資料還要多,可以分析的資訊也越多。目前 Wireshark 從 v1.8 開始,預設就把封包儲存格式改成 pcapng

  • Zui

    • Zui 它的前身是Brim , 是一款用於網路流量分析的工具,它提供了使用者友善的圖形化介面,可以讓使用者能夠快速分析與視覺化大量網路流量

      這個工具裡面整合了兩個網路封包分析工具,分別是Zeek、Suricata,先用 brimcap 將 pcap 送到 Zeek/Suricata 做 summary/log,再在 Zui 內用 correlation view、alert 視窗、或 detail pane 分析事件與原始封包。

      所以只要將pcap 封包丟進去 zeek ,他就會開始進行分析

      分析完後按下Query Pool 就可以看到視覺化的頁面

      另外 Zui 使用 Zed(或稱 Zed query / SuperSQL)來做過濾與轉換查詢可以更快處理大量資料

      以下分享幾個操作

      首先可以篩選出Suricata 警報

      event_type=="alert" #可篩選出 Suricata 警報

      也有像wireshark 一樣可以篩選 ip scr or ip dst

      id.orig_h==100.112.165.2 and id.resp_p==53 #來源ip = 100.112.165.2 目標port = 53

      另外他也可以進行統計與排序

      count() by id.resp_p | sort -r  # 對目標port 進行統計,並降冪排序

      對你想要篩選的資料按右鍵可以自動生成查詢指令

      最後也可以下載官方提供預先寫好的查詢

      連結:[https://github.com/brimdata/brimcap?tab=readme-ov-file#brimcap-queries

      ](https://github.com/brimdata/brimcap?tab=readme-ov-file#brimcap-queries)下載後queries.json 後按下+的藍色按鈕,點選Import Queries

      把剛剛下載的json 檔丟進去,就會匯入預先寫好的query

disk Forensics

常見 Registry 路徑

Registry 路徑 說明
HKLM\SYSTEM\CurrentControlSet\Services 系統服務與驅動程式資訊
HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName 電腦名稱
HKLM\SYSTEM\MountedDevices 磁碟/USB 裝置掛載資訊
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 系統啟動時自動執行程式
HKLM\SAM\SAM\Domains\Account\Users 本機帳號資訊
  • SAM:儲存本地使用者帳號與群組的資訊,例如使用者名稱、建立時間、最後登入時間。
  • SECURITY:包含使用者帳號的安全相關資訊,例如密碼政策。
  • SOFTWARE:紀錄所有已安裝軟體(包含 Windows 內建與第三方軟體)。
  • SYSTEM:儲存系統層級的組態資訊,例如事件日誌設定、硬體(像是 USB 裝置)相關的設定。

$MFT

路徑:<Volume_Root>\$MFT

$MFT 是 NTFS 檔案系統的核心元件,儲存所有檔案和目錄的metadata(如名稱、大小、時間戳、權限等)。
由一系列固定大小的檔案記錄組成,每個記錄包含一個檔案或目錄的所有屬性。

下方圖片是使用 MFT Explorer 把 MFT 內的資料視覺化顯示出來

$UsnJrnl

路徑:<Volume_Root>\$Extend\$UsnJrnl:$J

$UsnJrnl 的主要功能是追蹤 NTFS 上所有文件與目錄的變更。每當文件被創建、修改、刪除、重命名、移動,或其屬性/安全描述符發生變化時,$UsnJrnl 都會記錄一條對應條目。這些條目包括變更類型、發生時間、關聯的 USN(更新序列號)、文件 ID、父目錄 ID、文件名稱、屬性與大小等資訊。

$LogFile

路徑:<Volume_Root>\$LogFile

$LogFile 與 $UsnJrnl 紀錄的內容差不多,但是紀錄的是更底層的操作,其功能是作為 NTFS 的 transaction log,記錄對 metadata 所做的各種操作(如 MFT 新增/修改/刪除、目錄索引更新、Bitmap Allocation、$UsnJrnl 本身的更新等)。在進行 metadata 變更前,系統會先將這些交易寫入 $LogFile,以確保即便系統意外中斷,也可利用日誌進行回滾或重做操作,以保持文件系統的一致性與完整性。

$I30

在 NTFS 檔案系統中,每一個 Directory 都維護一個 Index,用來快速查找該目錄下的檔案與子目錄,當目錄內容改變 (如新增、刪除、重命名) 時,對應的 index entry 也會被修改或標記為已刪除 (Flags 欄位),因為是標記的關係,所以可以在$I30 中找到被刪除的檔案。

Amcache.hve

路徑位置:%WinDir%\AppCompat\Programs\Amcache.hve

自 Windows 8 起引入,記錄了已執行應用程式的詳細資訊,包括檔案路徑、SHA-1 雜湊值、時間戳記等。

若惡意程式本體被刪除或遭清除,無法從映像直接看到該檔案本身時,可以透過 Amcache 的記錄去驗證該程式曾經被執行過

NTUSER.DAT

路徑位置:C:\Users\<username>\NTUSER.DAT

NTUSER.DAT 是 Windows 每個使用者帳戶在其使用者設定檔底下的一個檔案,用來儲存與該帳戶相關的 Registry 設定與使用者偏好,在使用者登入時,系統會將這個檔案對應到註冊表的 HKEY_CURRENT_USER(HKCU) 分支,讓該使用者的作業與應用程式可以讀寫其個人設定;在登出或關機時,這些變更會回寫到 NTUSER.DAT。

可以直接用 RegistryExplorer 查看。

這邊重點提兩個比較特別的 key

UserAssist

key 路徑:Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count

UserAssist 是 Windows 用來追蹤使用者透過圖形介面啟動應用程式或捷徑的統計記錄機制,裡面會包含程式的執行次數、最後執行時間、Focus Count、Focus Time

ShellBags

ShellBags 是 Windows 用於記錄使用者在檔案總管中瀏覽資料夾時的設定偏好與檔案夾訪問紀錄,包括資料夾的視窗配置 / 檢視樣式 / 排列方式 / 大小 / 位置等,代表如有刪除或存取資料夾的操作會被記錄在 ShellBags 當中。

它會依照作業系統存在不同地方

  • <NTUSER.DAT>\Software\Microsoft\Windows\Shell\BagMRU
  • <NTUSER.DAT>\Software\Microsoft\Windows\Shell\Bags
  • 在較新 Windows 版本(如 Windows 7 之後),部分 ShellBags 資料會存於 C:\Users\<username>\AppData\Local\Microsoft\Windows\UsrClass.dat
  • 在某些 Windows 版本或使用者設定中,部分 ShellBags 條目只存在於 UsrClass.dat 而非 NTUSER.DAT

如果直接使用 RegistryExplorer 會很難閱讀,建議使用 Eric Zimmerman’s tools 中的 ShellBags Explorer 查看

Prefetch

位置:%WinDir%\prefetch

Prefetch(.pf)是 Windows 為了加速程式啟動而維護的快取檔案。系統會在 %WinDir%\prefetch 路徑下為執行過的可執行檔建立 .pf 檔,裡面包含:

  1. 執行時間戳:Windows 8 以後的 Prefetch 能記錄多達 8 個執行時間點,可用來建立事件時間線,另外 Prefetch 的時間戳在精確到秒時通常要減掉 10 秒,在做精細時間對帳時要留意此差異,參考網址
  2. Run count:表示該程式被執行了多少次。
  3. 可執行檔名稱與路徑:指出實際被執行的檔案與來源路徑,對判斷惡意軟體的落點很重要。
  4. 程式啟動時存取過的檔案清單:有時會列出其他被呼叫或載入的 DLL、路徑,可用來找出程式的行為鏈,例如開啟哪些檔。
  5. volume / system info、執行檔雜湊等元資料:可用來確認是在哪個 volume / 機器上被執行

檔名通常會長得像 PROGRAM.EXE-XXXXXXXX.pf,後面的 8 字元為路徑雜湊,用來區分相同名稱但路徑不同的執行檔。

為了讀取裡面的資料,可以使用 Eric Zimmerman’s tools 當中的 PECmd 轉換成 CSV 檔

工具:

  • AutoSpy

  • R-studio

    • $MFT viewer
  • NTFS Log Tracker

    NTFS Log Tracker 是一款專門用來解析 NTFS 上 $LogFile 和 UsnJrnl:$J 的工具。 它可以從交易日誌與變更日誌中挑出檔案/目錄操作的記錄。

    填上對應檔案的路徑

    按下右上角的 Parse 之後會先把資料都儲存成一個 DB,這邊幫它取名以及輸出的路徑

    選擇好後就會開始進行分析

    結束後就會出現 $LogFile 以及 UsnJrnl:$J 的內容

    另外也可以把它們匯出成 CSV 檔案

    同樣可以使用 Timeline Explorer 或者其他查看 CSV 檔案的軟體查看

Eric Zimmerman’s Tools

  • MFTECmd

    MFTECmd 是由數位鑑識專家 Eric Zimmerman 開發的 Windows command-line 工具,

    用來解析 NTFS 檔案系統中由 $MFT 與其衍生紀錄,例如:

    • $MFT
    • $LogFile
    • $UsnJrnl
    • $Boot
    • $Secure
    • $Extend\$UsnJrnl
    • $I30

    並將其轉成 CSV 檔案

    首先找到要鑑識的目錄,並提取其 $I30 內容

    接下來下指令將它轉換成 CSV 檔案

    轉換後可以使用 Timeline Explorer 或者其他查看 CSV 檔案的軟體查看

  • SIDR

    • windows Search Index Database Reporter
    • detect the delete file
  • shellbagsexplorer

    ShellBags Explorer 是由 Eric Zimmerman 所開發的一款專門用來瀏覽與解析 Windows ShellBags 資料的工具,將 BagMRU / Bags 的註冊表資料解析為資料夾層級樹狀視圖,可以看到使用者曾瀏覽過哪些資料夾

    它的介面跟 RegistryExplorer 差不多,一樣需要匯入 hive,看作業系統版本匯入 NTUSER.DAT 或者 UsrClass.dat

    匯入後就可以看到 ShellBags 資訊

  • [LECmd]

    • to see link file
      LECmd.exe -d "C:\Users\Administrator\Desktop\Start Here\Artifacts" --csvf lnk.csv --csv "C:\Users\Administrator\Desktop\lnk-files"
  • jumpLists Explorer

  • USB Forensics tracker

  • WxTCMD

    • analyze timeline data base to csv file
    • “C:\Users\ \AppData\Local\ConnectedDevicesPlatform\L.\ActivitiesCache.db”
  • RegistryExplorer

    另外有時候匯入 Hive 時會出現這樣的警告

    此警告表示主 hive 檔案與其 transaction logs (.LOG) 的序號不一致,代表 transaction log 中存在尚未同步到主檔案的變更。

    Windows Registry 採用 write-ahead logging 機制:修改時先寫入記憶體快取,再記錄到 transaction log,最後才定期 flush 到主 hive 檔案。而當 log 檔案的序號大於主檔案時,這個 hive 就會被稱為 Dirty Hive

    按下 Yes 之後就會開始進行與 transaction logs 的合併

    選擇 transaction logs

    選擇後它就會幫你合併,合併完後先儲存到一個地方

    存完後就可以看這個合併過後的 Hive

    Registry Explorer 工具除了可以查看之外它還有預設書籤可以使用,快速定位到想要看的 key

  • WinPrefetchView

  • SrumECmd

  • AmcacheParser

    AmcacheParser 是由數位鑑識專家 Eric Zimmerman 所開發的一款命令列工具,專門用於解析 Windows 系統中的 Amcache.hve 註冊檔,支援將解析結果輸出為 CSV 格式,方便後續分析與處理

    PS C:\Users\yunshiuan\Desktop\net9 > .\AmcacheParser.exe -f C:\Users\yunshiuan\Desktop\Amcache.hve_clean --csv C:\Users\yunshiuan\Desktop
    AmcacheParser version 1.5.2.0
    
    Author: Eric Zimmerman (saericzimmerman@gmail.com)
    https://github.com/EricZimmerman/AmcacheParser
    
    Command line: -f C:\Users\yunshiuan\Desktop\Amcache.hve_clean --csv C:\Users\yunshiuan\Desktop
    
    Warning: Administrator privileges not found!
    
    Unknown value name when processing DevicePnp at path {11517B7C-E79D-4e20-961B-75A811715ADD}\Root\InventoryDevicePnp\display/default_monitor/1&1f0c3c2f&0&uid256: ManifestPath
    
    C:\Users\yunshiuan\Desktop\Amcache.hve_clean is in new format!
    
    Total file entries found: 240
    Total shortcuts found: 51
    Total device containers found: 13
    Total device PnPs found: 94
    Total drive binaries found: 373
    Total driver packages found: 4
    
    Found 123 unassociated file entry
    
    Results saved to: C:\Users\yunshiuan\Desktop
    
    Total parsing time: 0.909 seconds

    它的輸出會有很多 CSV 檔,可能會出現下面檔案

    Amcache_ProgramEntries.csv 程式條目(Programs Entry) 描述註冊在 Amcache “Programs” 分支下的應用程式資訊,如安裝資訊或註冊的程式條目。
    Amcache_AssociatedFileEntries.csv 關聯的檔案條目 指那些能夠被對應(或關聯)到程式條目的檔案條目(File entries)。即那些被安裝程式所擁有或管理的檔案。
    Amcache_UnassociatedFileEntries.csv 無關聯的檔案條目 指那些沒有被關聯到任何程式條目的檔案條目,也就是那些孤立的可執行檔 / 檔案。這是很多調查中重點查看的部分,因為可能是惡意工具或獨立執行檔。
    Amcache_Shortcuts.csv 快捷方式 / 連結資訊 描述系統或應用程式捷徑(.lnk 或類似連結)相關的資訊,例如快捷目標、路徑等。
    Amcache_DeviceContainers.csv 裝置容器 (Device Container) 與裝置(例如 USB 裝置、硬體裝置)或其容器有關的條目。
    Amcache_DevicePnps.csv 裝置 PnP 條目 (Plug-and-Play 裝置) 描述插拔裝置 (PnP 裝置) 的資訊,例如硬體 ID、裝置名稱、相關時間等。
    Amcache_DriveBinaries.csv 驅動程式二進位檔 涉及驅動程式(driver binaries)或在磁碟上可執行但屬驅動程式範疇的條目。
    Amcache_DriverPackages.csv 驅動套件 (Driver Packages) 關於驅動程式套件安裝、驅動套件版本、封裝資訊等。

    接下來就可以用 Timeline Explorer 或者其他可以查看 CSV 檔的程式查看內容

    假設想要知道 notepad.exe 的實際路徑以及它的 SHA-1 值,按照上面的步驟並在 <XXX_UnassociatedFileEntries.csv> 搜尋 notepad.exe

    可以馬上就看到相關資訊

  • PECmd

    PECmd 是由 Eric Zimmerman 開發的一個命令行工具,它的目的是解析 Windows 的 Prefetch 檔案(.pf),抽取其中的 metadata(如執行時間戳、執行次數、被參照的檔案清單等),以便用於鑑識分析

    有一個很方便的功能是可以使用以下指令批量處理 Prefetch 裡面的所有檔案,並把它們合成一個 CSV 檔

    .\PECmd.exe -d C:\Users\yunshiuan\Desktop\The_Enduring_Echo\C\Windows\prefetch --csv "C:\Users\yunshiuan\Desktop\output"

    如果想要單獨轉換某個 .pf 檔的話可以使用 -f

    接下來就會在 output 中出現轉換好的 CSV 檔

    可以使用 Timeline Explorer 或者其他查看 CSV 檔的軟體查看

    假設我想要知道 cmd.exe 執行了幾次,直接按照剛剛的步驟並搜尋 cmd.exe,發現它執行了 26 次

Zone Identifier

當從瀏覽器(如 Edge、Chrome、IE)下載檔案時,Windows 會建立一個 NTFS 區段資料(ADS) 來記錄檔案來源,例如:

[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://example.com
HostUrl=https://example.com/download/file.exe

這通常儲存在 Zone.Identifier 流裡。

要查看可以從FTK imager 中點擊下載的檔案看有沒有附加的Zone.Identifier

瀏覽器紀錄

Windows 系統中,應用程式的使用者資料通常儲存在 AppData 目錄下:

C:\Users\<username>\AppData\
├── Local\
├── Roaming\        
└── LocalLow\       
  • Local : 儲存大容量,臨時或易刪除的資料
  • Roaming : 跨裝置同步資料,會跟著使用者帳戶移動到其他電腦
  • LocalLow:與 Local 類似,但是應用程式被授予的權限較低

以下介紹一些常用的瀏覽器的資料儲存位置以及可以分析的檔案

Google Chrome

位置: C:\Users\<user>\AppData\Local\Google\Chrome\User Data\Default

C:\Users\<user>\AppData\Local\Google\Chrome\User Data\Default\
├── History               # 瀏覽歷史和下載記錄
├── Network\Cookies       # Cookie 資料
├── Login Data            # 儲存的密碼
├── Web Data              # 自動填入資料
├── Bookmarks             # 書籤
├── Preferences           # 使用者偏好設定
├── Cache\                # 快取資料
├── Local Storage\        # 本地儲存
├── Session Storage\      # 會話儲存
└── IndexedDB\            # 索引資料庫

Microsoft Edge

位置: C:\Users\<user>\AppData\Local\Microsoft\Edge\User Data\Default

C:\Users\<user>\AppData\Local\Microsoft\Edge\User Data\Default\
├── History               # 瀏覽歷史和下載記錄
├── Cookies               # Cookie 資料
├── Login Data            # 儲存的密碼
├── Web Data              # 自動填入資料
├── Preferences           # 使用者偏好設定
├── Cache\                # 快取資料
├── Local Storage\        # 本地儲存
├── Session Storage\      # 會話儲存
└── IndexedDB\            # 索引資料庫

Mozilla Firefox

位置: C:\Users\<user>\AppData\Roaming\Mozilla\Firefox\Profiles\<profile>

<profile> 常常會以xxxx.default-release 表示

C:\Users\<user>\AppData\Roaming\Mozilla\Firefox\Profiles\<profile>\
├── places.sqlite        # 瀏覽歷史、書籤、下載記錄
├── cookies.sqlite       # Cookie 資料
├── logins.json          # 儲存的密碼
├── formhistory.sqlite   # 表單歷史
├── permissions.sqlite   # 網站權限
├── prefs.js            # 使用者偏好設定
├── user.js             # 使用者自訂設定
└── storage\            # 本地儲存

有些檔案會是 SQLite 儲存的,這邊推薦一個 GUI 應用程式可以查看 SQLite 資料庫內的內容:DB Browser for SQLite

DB Browser for SQLite

下載連結:https://sqlitebrowser.org/

DB Browser for SQLite 是一款開源的、跨平台的視覺化 SQLite 資料庫管理工具。它讓使用者不用深入指令列就能開啟、瀏覽、查詢、修改 SQLite 資料庫檔案。它支援標準的 SQLite 檔案(.sqlite, .db, .sqlite3 等),也支援匯入/匯出 CSV、SQL dump 等格式

假設我要查看使用者在 Google Chrome 的瀏覽與下載紀錄

首先先把 C:\Users\<user>\AppData\Local\Google\Chrome\User Data\Default\History dump 下來

然後開啟 DB Browser for SQLite,將剛剛 dump 下來的 history 資料丟進 DB Browser for SQLite 內

下面可以看到資料庫內的 Table,如果想要看裡面的資料就點選瀏覽資料的頁面

如果是要看瀏覽記錄就選擇 urls,如果要看下載紀錄的話就看 downloads Table

Acquision

  • Dumpit.exe
    • windows memory image
  • LiME
    • Linux memory image
  • EDD
    • check disk wheather has been encrypted
  • KAPE
    • triage image
  • CyLR
    • inux triage image

if windwos memory dead Acquision

  • hiberfil.sys C:/

  • pagefile.sys C:/


Android

ALEAPP

下載連結:

ALEAPP : https://github.com/abrignoni/ALEAPP

是由 Alexis Brignoni 開發的一個開源工具,用來做 Android 裝置的 證據檔案分析(forensic artifacts parsing)。其目的在於整理 Android 裝置中常見的 log、事件、Protobuf(如 Google Play Services 或其他使用 Protobuf 的 apps)等資料,協助數位鑑識與 incident response 調查人員快速取出與分析有用資料。


今天的Android 的 dumpfiles 會以今年初剛結束的 MVS CTF 2025 中的Android 分類來分享

下載連結 : https://drive.google.com/file/d/1Ay-T4kE8J3NX-XLh0krarFvE9j8SK_LT/view

這個連結下載會給一個Android 手機的 data 資料夾內容,並且是壓縮過後的。

這邊可以分享一下在Android 11 後,沒有 root 的權限是沒有辦法去存取到 data 資料夾的,因此會需要一些第三方的工具才可以把它 dump 下來。

我的猜測,這個 dump 的製作是使用一個Magisk 工具安裝到裝置上,這個工具可以讓你獲得到 root 權限並無需修改系統分區,參考連結

ALEAPP 只支援 tar/zip/gz 檔案,因此我是先從連結上下載後解壓再重新壓縮成 zip 一次

得到檔案之後就可以丟給 ALEAPP,上面是填題目給的檔案,下面是選它產生的分析結果要輸出到哪裡的資料夾

下面的 Module 可以全選

接下來按左下角的 Process 它就會開始做分析,分析完之後它會在你跟剛剛填的路徑下新增一個資料夾

這些就是它將分析的結果轉成 HTML,類似生成一個報告,主要的頁面會在 index.html,點開之後會進入到這個頁面

之後就可以開始去翻有沒有什麼可疑的東西

其中的功能很多,這邊介紹其中一部分的內容

Home page

首頁就會顯示一些手機的名稱、SIM卡資訊等等

APP

APP Icons

這邊可以查看使用者在裝置上安裝了什麼app

Packages

它會解析 packages.xml,記錄了裝置上安裝過的所有套件(應用程式),包含:

• 系統應用(隨 ROM 出廠)

• OEM 廠商附加應用

• 使用者自行安裝的應用(例如從 Google Play Store、adb sideload 等)

Bluetooth

Bluetooth Adapter Information

這邊可以看到藍牙的一些設定

Bluetooth Connections

這邊可以看藍牙裝置連線紀錄


IOS

ILEAPP

下載連結: https://github.com/abrignoni/iLEAPP

iLEAPP 是 Alexis Brignoni 開發的開源工具,用來解析 iOS 裝置(與備份)中的日誌、事件與 plist 等常見鑑識 artefacts,協助快速整理出可供鑑識與調查的資訊。此工具可以快速 triage iOS 欄位:例如系統與應用 logs、通知(notifications)、build / 設備資訊、行動網路資料、應用狀態資料庫(ApplicationState.db)等,將原始檔案轉成可讀的表格/HTML 報告或 timeline,便於調查人員閱讀與分析


今天的IOS 的 dumpfiles 檔會以今年初剛結束的 MVS CTF 2025 檔中的 IOS 分類來分享

檔案下載網址:https://drive.google.com/drive/folders/1yaMc--Va2u2IJzQKci4yBaeftjDGRDya

網址下載下來後應該會是iOS 系統的Applications、private、System 資料夾的壓縮檔

將下載的檔案丟給iLEAPP,上面是填題目給的檔案,下面是選他產生的分析結果要輸出到哪裡的資料夾

下面的Module可以全選

接下來按左下角的 Process 程式就會開始分析

結束之後會產生分析的結果並產生html,

報告的主頁會產生在_HTML 底下的 index.html 打開之後會出現這樣的頁面

之後就可以在左側的功能列翻想要尋找的東西。

這邊介紹幾個我覺得比較特別的分析結果

Home Page

在首頁的Device details 中有顯示裝置基本資訊(型號、序號、iOS 版本)

Keyboard Usage Stats

這邊會顯示

  • tium.totalWordsTyped → 使用者總共輸入的字數
  • tium.totalWordsFromCandidateBar → 從鍵盤候選列選字的次數
  • tium.totalWordsAutocorrected → 自動更正的字數

Itunes Metadata

Itunes Metadata 這邊會列出一些裝置上安裝的APP


Email Security

一個 Email 帳號的組成,會由一個小老鼠@ 將左右隔開

  • 左半部分是依照使用者設定的字串,因此可以取名為aaaabbbccc123adminme 皆可
  • 右半部分是組織的 Domain Name,像是常見的 gmail.com;如果自己有架設 Email Server,就會是自己的 domain,如:yunshiuan.com

source: https://flickr.com/photos/jameschen1/24160994516/

到這邊就會有一個偽造正常信件的方式:如果攻擊者註冊了一個與正常組織幾乎相同、只差一個字的 domain,甚至直接冒用正常組織的 Domain Name 來欺騙使用者,只要使用者一個不注意就可能把它當成正常信件而被釣到,這個攻擊被稱為 Email Spoofing

Email Spoofing

攻擊者會試圖使用與常見組織相似或相同的 email 欺騙使用者認為是正常郵件。

ex : 可以透過 這個網頁 偽造 Email 傳給使用者,這邊將 Email 偽造成support@paypal.com 並傳一封帳號異常的信給使用者

那這樣只單看 Email 是很難分辨是否為釣魚信件,所以會透過郵件驗證協定 DMARC 來偵測郵件偽造攻擊。

DMARC

DMARC 是一種郵件驗證協定,它讓郵件網域擁有者能聲明當收到未通過驗證的郵件時該如何處理。

我在 demo 時寄到我個人的信箱,使用 Cloudflare 的 Email Routing 功能轉發郵件;因此當我把釣魚信寄到自己的信箱時,因未通過 DMARC 驗證而被拒收。

如果DMARC 驗證通過的話會像下方圖示的一樣。

可以看到主要的驗證方式會使用到 SPF 以及 DKIM。

SPF

SPF 是一種電子郵件驗證協定,它讓網域擁有者能夠指定哪些郵件伺服器有權代表該網域寄送郵件。這份「授權清單」會以 DNS TXT 記錄 的形式公開發布,接收方的郵件伺服器則可在收信時檢查寄件伺服器是否被授權,以判斷郵件是否可信。

可以使用 dig 指令查看 SPF

$ dig yunshiuan.com  TXT | grep spf
yunshiuan.com.		377	IN	TXT	"v=spf1 include:_spf.mx.cloudflare.net ~all"
  • v=spf1:指定 SPF 協定版本
  • include:_spf.mx.cloudflare.net:授權清單由 Cloudflare 維護
  • ~all:非授權來源標記為 SoftFail(可疑)
    (若設定 -all 則代表 Fail,非授權來源應被拒絕)

DKIM

DKIM 是電子郵件驗證機制之一,讓收件方可以驗證一封郵件是否真正由該網域授權寄出,並確認郵件在傳送過程中是否被篡改;它透過數位簽章機制實現。寄件方使用私鑰對郵件內容進行簽名,收件方則從 DNS 查出對應的公鑰來驗證。

DKIM 的公鑰會被發布在 DNS TXT 紀錄中,格式如下:

<selector>._domainkey.<domain>

以 Cloudflare 舉例,它的 selector 是 cf2024-1,查詢 DKIM 也可使用 dig 指令

$ dig cf2024-1._domainkey.yunshiuan.com TXT | grep DKIM
cf2024-1._domainkey.yunshiuan.com. 377 IN TXT	"v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiweykoi+o48IOGuP7GR3X0MOExCUDY/BCRHoWBnh3rChl7WhdyCxW3jgq1daEjPPqoi7sJvdg5hEQVsgVRQP4DcnQDVjGMbASQtrY4WmB1VebF+RPJB2ECPsEDTpeiI5ZyUAwJaVX7r6bznU67g7LvFq35yIo4sdlmtZGV+i0H4cpYH9+3JJ78k" "m4KXwaf9xUJCWF6nxeD+qG6Fyruw1Qlbds2r85U9dkNDVAS3gioCvELryh1TxKGiVTkg4wqHTyHfWsp7KD3WQHYJn0RyfJJu6YEmL77zonn7p2SRMvTMP3ZEXibnC9gz3nnhR6wcYL8Q7zXypKTMD58bTixDSJwIDAQAB"

總結來說 DMARC 驗證流程會是:接收方收到郵件後,先檢查 SPF 和 DKIM 認證,再根據 DMARC 政策決定郵件的處理方式(放行、隔離或拒絕)。

DMARC 記錄可以在 _dmarc.<domain> 找到

$ dig _dmarc.any.run TXT                                                                             


; <<>> DiG 9.10.6 <<>> _dmarc.any.run TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31385
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4095
;; QUESTION SECTION:
;_dmarc.any.run.			IN	TXT

;; ANSWER SECTION:
_dmarc.any.run.		377	IN	TXT	"v=DMARC1; p=quarantine; sp=quarantine;"

;; Query time: 226 msec
;; SERVER: 100.100.100.100#53(100.100.100.100)
;; WHEN: Thu Oct 09 20:09:24 CST 2025
;; MSG SIZE  rcvd: 94
  • v=DMARC1 : DMARC 版本
  • p=quarantine : 主要政策,對主域名認證失敗的郵件進行隔離
  • sp=quarantine : 子域名政策,對子域名認證失敗的郵件也進行隔離

Gophish

下載連結:https://github.com/gophish/gophish/releases

Gophish 是一個開源的釣魚模擬平台,用於進行社交工程演練,可以快速建立和發送釣魚郵件,追蹤點擊率和提交率,幫助組織測試員工的資安意識並提供教育訓練。

source : https://ui-code.com/archives/779

安裝很簡單,將 ZIP 下載之後執行裡面的執行檔就能架起

如果要遠端也可以登入admin 介面,要去config.json 將admin 網址改成0.0.0.0:3333

若要遠端也能登入 Admin 介面,請在 config.json 將 Admin 位址改成 0.0.0.0:3333

架起來後會給你帳號密碼,網頁進入0.0.0.0:3333後登入就可以開始使用了

裡面的功能非常豐富,包括

  • 活動管理: 建立/排程釣魚活動,指定目標群組、郵件模板、登入頁與寄件設定,並即時監控結果。
  • 目標群組: 管理收件人清單,支援手動新增與 CSV 匯入。
  • 郵件模板: 視覺化編輯與變數插入(如 {{.FirstName}}),可預覽與測試寄送。
  • 登入頁: 匯入/客製 HTML,選擇是否擷取提交資料,支援點擊後/提交後導向。
  • 寄件設定: 設定 SMTP(主機、帳密、TLS/SSL、自訂寄件者/標頭),支援測試連線。
  • 即時追蹤: 記錄寄送、開啟、點擊、提交資料(含 IP、User-Agent);可選「回報」事件。
  • 儀表板與報表: 活動概況、成效趨勢,結果支援 CSV 匯出。
  • REST API: 提供完整 API 以自動化建立活動、上傳模板/名單、擷取結果。
  • 網域與證書: 自訂追蹤/寄送網域與 TLS 憑證配置,提升可信度與達投遞率。

source : https://ui-code.com/archives/779


OSINT

WaybackMachine

網站連結:http://web.archive.org/

這個網站是由 Internet Archive 維護的一個線上服務。它可以定期將網站的網頁內容 snapshot 存檔,讓人們能夠查看某個網站在過去不同時間點的樣子

例如我想要看一下 https://yunshiuan.com/ 網站之前的樣子,就可以將網址輸入進去後看看。

發現它在 8/15 有被打了一個 snapshot,點進去看看後就可以看到在 8/15 這個網頁時的樣子

Recon-ng

下載方式

apt-get update && apt-get install recon-ng

Recon-ng 是一個用 Python 寫成、以模組化、指令列互動介面為設計的 OSINT 收集框架。它把各類資訊收集功能(DNS、WHOIS、搜尋引擎、API 查詢等)包成「模組」,用戶可以在工作區(workspace)中逐步執行、存檔與匯出調查結果

Recon-ng 的 tutorial 連結: https://hackertarget.com/recon-ng-tutorial/

整體的操作會類似於 Metasploit,一樣會先引入模組,設定參數然後執行

直接執行 recon-ng 後可以使用 marketplace search 查看有什麼可以用的 modules

$ [recon-ng][default] > marketplace search

  +--------------------------------------------------------------------------------------------------+
  |                        Path                       | Version |     Status    |  Updated   | D | K |
  +--------------------------------------------------------------------------------------------------+
  | discovery/info_disclosure/cache_snoop             | 1.1     | not installed | 2020-10-13 |   |   |
  | discovery/info_disclosure/interesting_files       | 1.2     | not installed | 2021-10-04 |   |   |
  | exploitation/injection/command_injector           | 1.0     | not installed | 2019-06-24 |   |   |
  | exploitation/injection/xpath_bruter               | 1.2     | not installed | 2019-10-08 |   |   |
  | import/csv_file                                   | 1.1     | not installed | 2019-08-09 |   |   |
  | import/list                                       | 1.1     | not installed | 2019-06-24 |   |   |
  | import/masscan                                    | 1.0     | not installed | 2020-04-07 |   |   |
  | import/nmap                                       | 1.1     | not installed | 2020-10-06 |   |   |
  | recon/companies-contacts/bing_linkedin_cache      | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/companies-contacts/censys_email_address     | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/companies-contacts/pen                      | 1.1     | not installed | 2019-10-15 |   |   |
  | recon/companies-domains/censys_subdomains         | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/companies-domains/pen                       | 1.1     | not installed | 2019-10-15 |   |   |
  | recon/companies-domains/viewdns_reverse_whois     | 1.1     | not installed | 2021-08-24 |   |   |
  | recon/companies-domains/whoxy_dns                 | 1.1     | not installed | 2020-06-17 |   | * |
  | recon/companies-multi/censys_org                  | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/companies-multi/censys_tls_subjects         | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/companies-multi/github_miner                | 1.1     | not installed | 2020-05-15 |   | * |
  | recon/companies-multi/shodan_org                  | 1.1     | not installed | 2020-07-01 | * | * |
  | recon/companies-multi/whois_miner                 | 1.1     | not installed | 2019-10-15 |   |   |
  | recon/contacts-contacts/abc                       | 1.0     | not installed | 2019-10-11 | * |   |
  | recon/contacts-contacts/mailtester                | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/contacts-contacts/mangle                    | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/contacts-contacts/unmangle                  | 1.1     | not installed | 2019-10-27 |   |   |
  | recon/contacts-credentials/hibp_breach            | 1.2     | not installed | 2019-09-10 |   | * |
  | recon/contacts-credentials/hibp_paste             | 1.1     | not installed | 2019-09-10 |   | * |
  | recon/contacts-domains/censys_email_to_domains    | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/contacts-domains/migrate_contacts           | 1.1     | not installed | 2020-05-17 |   |   |
  | recon/contacts-profiles/fullcontact               | 1.1     | not installed | 2019-07-24 |   | * |
  | recon/credentials-credentials/adobe               | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/credentials-credentials/bozocrack           | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/credentials-credentials/hashes_org          | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/domains-companies/censys_companies          | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/domains-companies/pen                       | 1.1     | not installed | 2019-10-15 |   |   |
  | recon/domains-companies/whoxy_whois               | 1.1     | not installed | 2020-06-24 |   | * |
  | recon/domains-contacts/hunter_io                  | 1.3     | not installed | 2020-04-14 |   | * |
  | recon/domains-contacts/metacrawler                | 1.1     | not installed | 2019-06-24 | * |   |
  | recon/domains-contacts/pen                        | 1.1     | not installed | 2019-10-15 |   |   |
  | recon/domains-contacts/pgp_search                 | 1.4     | not installed | 2019-10-16 |   |   |
  | recon/domains-contacts/whois_pocs                 | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/domains-contacts/wikileaker                 | 1.0     | not installed | 2020-04-08 |   |   |
  | recon/domains-domains/brute_suffix                | 1.1     | not installed | 2020-05-17 |   |   |
  | recon/domains-hosts/binaryedge                    | 1.2     | not installed | 2020-06-18 |   | * |
  | recon/domains-hosts/bing_domain_api               | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/domains-hosts/bing_domain_web               | 1.1     | not installed | 2019-07-04 |   |   |
  | recon/domains-hosts/brute_hosts                   | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/domains-hosts/builtwith                     | 1.1     | not installed | 2021-08-24 |   | * |
  | recon/domains-hosts/censys_domain                 | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/domains-hosts/certificate_transparency      | 1.3     | not installed | 2019-09-16 |   |   |
  | recon/domains-hosts/google_site_web               | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/domains-hosts/hackertarget                  | 1.1     | installed     | 2020-05-17 |   |   |
  | recon/domains-hosts/mx_spf_ip                     | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/domains-hosts/netcraft                      | 1.1     | not installed | 2020-02-05 |   |   |
  | recon/domains-hosts/shodan_hostname               | 1.1     | not installed | 2020-07-01 | * | * |
  | recon/domains-hosts/spyse_subdomains              | 1.1     | not installed | 2021-08-24 |   | * |
  | recon/domains-hosts/ssl_san                       | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/domains-hosts/threatcrowd                   | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/domains-hosts/threatminer                   | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/domains-vulnerabilities/ghdb                | 1.1     | not installed | 2019-06-26 |   |   |
  | recon/domains-vulnerabilities/xssed               | 1.1     | not installed | 2020-10-18 |   |   |
  | recon/hosts-domains/migrate_hosts                 | 1.1     | not installed | 2020-05-17 |   |   |
  | recon/hosts-hosts/bing_ip                         | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/hosts-hosts/censys_hostname                 | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/hosts-hosts/censys_ip                       | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/hosts-hosts/censys_query                    | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/hosts-hosts/ipinfodb                        | 1.2     | not installed | 2021-08-24 |   | * |
  | recon/hosts-hosts/ipstack                         | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/hosts-hosts/resolve                         | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/hosts-hosts/reverse_resolve                 | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/hosts-hosts/ssltools                        | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/hosts-hosts/virustotal                      | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/hosts-locations/migrate_hosts               | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/hosts-ports/binaryedge                      | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/hosts-ports/shodan_ip                       | 1.2     | not installed | 2020-07-01 | * | * |
  | recon/locations-locations/geocode                 | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/locations-locations/reverse_geocode         | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/locations-pushpins/flickr                   | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/locations-pushpins/shodan                   | 1.1     | not installed | 2020-07-07 | * | * |
  | recon/locations-pushpins/twitter                  | 1.1     | not installed | 2019-10-17 |   | * |
  | recon/locations-pushpins/youtube                  | 1.2     | not installed | 2020-09-02 |   | * |
  | recon/netblocks-companies/censys_netblock_company | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/netblocks-companies/whois_orgs              | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/netblocks-hosts/censys_netblock             | 2.1     | not installed | 2022-01-31 | * | * |
  | recon/netblocks-hosts/reverse_resolve             | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/netblocks-hosts/shodan_net                  | 1.2     | not installed | 2020-07-21 | * | * |
  | recon/netblocks-hosts/virustotal                  | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/netblocks-ports/census_2012                 | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/netblocks-ports/censysio                    | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/ports-hosts/migrate_ports                   | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/ports-hosts/ssl_scan                        | 1.1     | not installed | 2021-08-24 |   |   |
  | recon/profiles-contacts/bing_linkedin_contacts    | 1.2     | not installed | 2021-08-24 |   | * |
  | recon/profiles-contacts/dev_diver                 | 1.1     | not installed | 2020-05-15 |   |   |
  | recon/profiles-contacts/github_users              | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/profiles-profiles/namechk                   | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/profiles-profiles/profiler                  | 1.2     | not installed | 2023-12-30 |   |   |
  | recon/profiles-profiles/twitter_mentioned         | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/profiles-profiles/twitter_mentions          | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/profiles-repositories/github_repos          | 1.1     | not installed | 2020-05-15 |   | * |
  | recon/repositories-profiles/github_commits        | 1.0     | not installed | 2019-06-24 |   | * |
  | recon/repositories-vulnerabilities/gists_search   | 1.0     | not installed | 2019-06-24 |   |   |
  | recon/repositories-vulnerabilities/github_dorks   | 1.0     | not installed | 2019-06-24 |   | * |
  | reporting/csv                                     | 1.0     | not installed | 2019-06-24 |   |   |
  | reporting/html                                    | 1.0     | not installed | 2019-06-24 |   |   |
  | reporting/json                                    | 1.0     | not installed | 2019-06-24 |   |   |
  | reporting/list                                    | 1.0     | not installed | 2019-06-24 |   |   |
  | reporting/proxifier                               | 1.0     | not installed | 2019-06-24 |   |   |
  | reporting/pushpin                                 | 1.0     | not installed | 2019-06-24 |   | * |
  | reporting/xlsx                                    | 1.0     | not installed | 2019-06-24 |   |   |
  | reporting/xml                                     | 1.1     | not installed | 2019-06-24 |   |   |
  +--------------------------------------------------------------------------------------------------+

接下來示範用 hackertarget 去尋找 hostname

首先先把 hackertarget 先下載下來

marketplace install hackertarget

再把它 load 進來

modules load hackertarget

接下來用 info 看一下會需要什麼參數

$ [recon-ng][default][hackertarget] > info

      Name: HackerTarget Lookup
    Author: Michael Henriksen (@michenriksen)
   Version: 1.1

Description:
  Uses the HackerTarget.com API to find host names. Updates the 'hosts' table with the results.

Options:
  Name    Current Value  Required  Description
  ------  -------------  --------  -----------
  SOURCE                 yes       source of input (see 'info' for details)

Source Options:
  default        SELECT DISTINCT domain FROM domains WHERE domain IS NOT NULL
  <string>       string representing a single input
  <path>         path to a file containing a list of inputs
  query <sql>    database query returning one column of inputs

接下來可以看到 SOURCE 會需要填東西,那這欄就是要填要偵查的 domain,以 google.com 舉例。

用下面指令設定 SOURCE

options set SOURCE google.com

再看一次 info,可以看到它被設定成了 google.com

$ [recon-ng][default][hackertarget] > info

      Name: HackerTarget Lookup
    Author: Michael Henriksen (@michenriksen)
   Version: 1.1

Description:
  Uses the HackerTarget.com API to find host names. Updates the 'hosts' table with the results.

Options:
  Name    Current Value  Required  Description
  ------  -------------  --------  -----------
  SOURCE  google.com     yes       source of input (see 'info' for details)

Source Options:
  default        SELECT DISTINCT domain FROM domains WHERE domain IS NOT NULL
  <string>       string representing a single input
  <path>         path to a file containing a list of inputs
  query <sql>    database query returning one column of inputs

接下來打 run 就會開始執行

執行的過程中也會出現結果,最後在下 show hosts 指令就會出現表格樣式的結果

Whois.domaintools

網站連結:https://whois.domaintools.com/

這個網站可以找到關於 domain 的一些資訊,包括註冊商、何時註冊、何時到期與最後更新時間等等

Sherlock

下載連結:https://github.com/sherlock-project/sherlock

這是一個可以快速搜尋各大平台用戶名的工具

假設今天我們獲得到了一個用戶叫做yunshiuan 接下來丟進sherlock

發現了跑出許多用戶名稱是yunshiuan 的平台,接下來就可以一一去看是不是自己想要的

HaveIBeenPwned

連結:https://haveibeenpwned.com/

這是一個可以輸入信箱,他會說輸入的信箱是否已經被洩漏出去了

假設輸入一個大家在測試時很常輸入的aaaaa@gmail.com

可以看到這個 email 在 20 多個平台被洩漏了,底下會跟你說是在何時因為什麼而被洩漏

Epieos

網站連結:https://epieos.com/

他提供了email與手機號碼的反向查詢,幫你把和該email / phone 有關的社群帳號、Google 活動、評價、公開痕跡等串起來顯示,方便做初步調查或驗證線索

底下其實還有其他網站或者應用程式的掃描,但那些就會需要付費才能觀看

Phoneinfoga

下載連結:https://github.com/sundowndev/phoneinfoga

這個工具可以查詢這個電話號碼的基本metadata

$ ./phoneinfoga scan -n +886911111111

另外也可以用開server 的方式用網頁查詢

$ ./phoneinfoga serve -p 8080

Listening on :8080

Google Hacking

這是 Google 提供的進階搜尋法,它提供一些方式可以更準確地找到我們想要的資料或網站。

以下是常見的搜尋

site:domain.com — 限定在某個網域搜尋,ex:site:github.com

filetype:pdf / filetype:env / filetype:sql — 找特定檔案類型。

inurl:admin / inurl:login — URL 中含特定字串(找管理頁面)。

intitle:"index of" — 找目錄列舉頁面(常暴露檔案列表)。

"exact phrase" — 精確比對字串(例如機密檔名或參數名)。

• -(負號)排除字詞,ex: site:example.com -site:blog.example.com

另外也可以用 OR+ 來串接多個進階搜尋結果

Google Map / Google Earth

Google 地圖是 Google 提供的網路地圖服務,這個服務提供了多種視圖模式,包括衛星圖、街道圖和地形圖,讓用戶可以根據需求選擇最適合的視角來查看地圖

Google Earth 是一個更進階的 3D 地球瀏覽器,讓用戶能夠以立體的方式探索世界。歷史影像功能讓用戶可以查看不同時期的衛星影像,觀察城市的發展變化,而街景整合功能則在 3D 環境中嵌入了街景視圖,並且可以匯入 KML 檔

Google 智慧鏡頭

Google 智慧鏡頭是一個基於 AI 的視覺搜尋工具,你可以把你想要辨識的圖片丟進去,它會把網路上類似的圖片丟給你

在搜尋列就可以找到智慧鏡頭的 icon

點擊後把圖片丟進去它就會幫你查有沒有類似的圖片

Geohints

網站連結:https://geohints.com/

這個網站整理了很多每個國家的 Google 街景具有特色的部分,像是車牌、道路、電線竿、標誌等照片,如果遇到沒看過的都可以來這邊查

Overpass turbo

網址:https://overpass-turbo.eu/

Overpass Turbo 是一個基於網頁的查詢工具,專門用於查詢 OpenStreetMap 資料庫。它提供了一個直觀的介面,讓用戶能夠使用 Overpass QL 查詢語言來搜尋和提取 OSM 中的地理資料。

OpenStreetMap 是世界上最大的開放地理資料庫,包含了全球各地的道路、建築物、興趣點等詳細資訊。

接下來介紹一下要怎麼使用Overpass QL 查詢我們想要的東西。

首先是 OSM 的資料結構,它使用節點 (nodes)、路徑 (ways) 和關係 (relations) 三種基本元素來描述地理物件:

  • 節點 (Nodes):代表點狀物件,如商店或地標
  • 路徑 (Ways):代表線狀或面狀物件,如道路或建築物
  • 關係 (Relations):用於描述複雜的物件,如多個部分組成的建築物群

最基本的查詢以 [out:json]; 開始,這指定了輸出格式。接著使用 nodewayrelation 來指定要查詢的物件類型,而nwr則可以將三者都包含,然後在方括號中指定搜尋條件,關於搜尋條件的所有的key 跟value 都可以在這邊查到 https://wiki.openstreetmap.org/wiki/Map\_features

像圖示中是L3akCTF 2025的其中一題Fidget Spinner我們想要找在厄蘭島上所有的風車地點,可以這樣寫

[out:json][timeout:25];
//restrict our search to the island
area[name="Öland"];
(
  // search for windmills
  nwr["man_made"="windmill"](area); //(area)的功能是限制在Öland地點上查詢
);
// print results
out geom;

之後出來的結果就會是這樣

接下來它也可以匯出成 KML 檔,然後放到 Google Map / Google Earth 上

接下來就可以去一一驗證是否是題目想要的位置

另外也可以像這樣把想要的區域先匡起來然後查詢

source : https://medium.com/@PretendNotToBe/ea6e8f3fb763

Exiftool

它可以去看圖片的基本資料,例如圖片大小、修改時間等等,但它可以去看這張照片的拍攝地點在哪裡,並且會給你 GPS 定位。

舉個例子:DownUnderCTF 2023 Excellent Vista!

下載之後用 exiftool 看一下

$ exiftool ExcellentVista.jpg

ExifTool Version Number         : 13.10
File Name                       : ExcellentVista.jpg
Directory                       : .
File Size                       : 2.7 MB
File Modification Date/Time     : 2025:09:23 15:41:41+08:00
File Access Date/Time           : 2025:09:23 15:41:45+08:00
File Inode Change Date/Time     : 2025:09:23 15:41:44+08:00
File Permissions                : -rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
Exif Byte Order                 : Big-endian (Motorola, MM)
X Resolution                    : 72
Y Resolution                    : 72
Resolution Unit                 : inches
Y Cb Cr Positioning             : Centered
Date/Time Original              : 2023:08:31 22:58:56
Create Date                     : 2023:08:31 22:58:56
Sub Sec Time Original           : 00
Sub Sec Time Digitized          : 00
GPS Version ID                  : 2.3.0.0
GPS Latitude Ref                : South
GPS Longitude Ref               : East
GPS Altitude Ref                : Above Sea Level
GPS Speed Ref                   : km/h
GPS Speed                       : 0
GPS Img Direction Ref           : True North
GPS Img Direction               : 122.5013812
GPS Dest Bearing Ref            : True North
GPS Dest Bearing                : 122.5013812
GPS Horizontal Positioning Error: 6.055886243 m
Padding                         : (Binary data 2060 bytes, use -b option to extract)
About                           : uuid:faf5bdd5-ba3d-11da-ad31-d33d75182f1b
Image Width                     : 4032
Image Height                    : 3024
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 4032x3024
Megapixels                      : 12.2
Create Date                     : 2023:08:31 22:58:56.00
Date/Time Original              : 2023:08:31 22:58:56.00
GPS Altitude                    : 70.5 m Above Sea Level
GPS Latitude                    : 29 deg 30' 34.33" S
GPS Longitude                   : 153 deg 21' 34.46" E
GPS Position                    : 29 deg 30' 34.33" S, 153 deg 21' 34.46" E

最後它提供了拍照的地點。

What3words

網站連結:https://what3words.com/

這個網站可以只利用三個相關的詞彙去定位到想要的地點,因為有些地方會沒有地址,所以會需要靠這個方式定位

像是成功大學資訊系館是 imported.dull.buns,之後去這個網站查就一樣會定位到這邊