↑ 点击上方蓝色字关注我们
笔者最近在hackthebox做靶机类的题目时,发现靶机不仅有偏向CTF类的,也有和实战相似的,而且靶机的质量足以让自己在做题的时候学习到很多“干货”,这里分享一个渗透的案例,希望有兴趣的小伙伴可以一起交流做题的思路。
靶机环境信息

信息收集
Nmap扫描:

80端口:

然后对web的目录进行探测,试图找到敏感的文件或者目录。不过很遗憾没有任何信息。

443端口

80端口漏洞挖掘
回到80端口,抓取数据包,发现只有一个post参数。这个参数输入已开始页面的几个选项值,就返回相应的内容。如果输入的内容不存在,返回为空。


这里初步认为是后台通过数据库查询,于是尝试SQL注入。

但是结果并不是自己想象的。尝试使用工具注入,也没有结果。
于是为了节省时间,就自己添加了一些可能的payload做fuzz。
可能是sql注入漏洞
可能有任意文件读取漏洞
可能有栈溢出漏洞
可能有命令执行漏洞
测试的结果显示当输入 |或;时可以执行命令:

在几次尝试burp手工输入命令点击发包之后,想进一步节省时间,就写了一个伪shell的脚本:


查看了来一下web源代码,发现原来是可控参数直接带入os.popen().read()中去执行,导致了任意命令执行的漏洞。
from flask import Flask, request, render_template, abortimport os app = Flask(__name__)@app.route('/select', methods=['POST'])deffortuned(): cmd ='/usr/games/fortune ' dbs =['fortunes','fortunes2','recipes','startrek','zippy'] selection = request.form['db'] shell_cmd = cmd + selection result = os.popen(shell_cmd).read() return render_template('display.html', output=result)
进一步搜索有用的目录和文件夹。在/home/bob/ca目录下看到有certs 和private两个文件夹,里面分别存放了一些私钥和公钥。

其中还有intermediate的公钥和私钥。


这里泄漏了中间证书的公钥和私钥,于是可以用他们来创建end-user certificate证书。
关于证书链的一些基础知识,可以参照如下几个网站:
http://www.bewindoweb.com/274.html
https://tech.igengmei.com/20190520/https-licenses-chain/
这里使用openssl来自建CA:
openssl genrsa -out client.key 2048 //生成客户端的私钥,2048位,保存到client.key中
openssl req -new -key client.key -out client.csr // 生成一个新的证书请求文件、指定client.key为指定的私钥,并保存为client.csr
openssl x509 -req -in client.csr -CA intermediate.cert.pem -CAkey intermediate.key.pem -CAcreateserial -out client.pem -days 1024 -sha256 // 使用x509自建CA
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.pem -certfile intermediate.cert.pem // 生成PKCS12证书。

生成之后在浏览器中导入刚刚生成的证书文件,再次访问10.10.10.127的443端口,就可以看到内容:


这里虽然看到了内容,但是内容要求我们如果没有ssh的key,就需要点击生成一个。

本地保存该私钥,但不代表马上可以登陆。因为目前还缺哪个用户可以使用该私钥。
这里的技巧是通过查看/etc/passwd来看看authpf是哪个用户起的:

在得知nfsuser使用authpf后,就可以ssh登陆:

经过认证之后,改变了访问策略,所以再次扫描端口试试有没有新的端口出现:

果然多出来了三个之前没见过的端口。
查看8081端口,看到如下内容:

pgadmin4 service是Postgres的开源管理工具。

这里想通过已经公布的Nday漏洞打进去,但是失败了,再返回2049端口的nfs,看看能不能有些突破。
对这个不熟悉的可以参照即刻安全的一篇文章:
http://www.secist.com/archives/6192.html
主要的内容就是可以通过nfs来显示共享的文件夹列表,然后可以通过挂载的方式在本地也能正常访问,如果权限足够甚至能直接把ssh的公钥写入然后ssh登陆。
首先先showmount查看哪些目录是可以访问的:

既然看到home目录可以访问,那么不妨进去看看,使用mount -t nfs <IP>:/home /mnt把home目录mount到本机的/mnt目录下方便查看

进chalie目录下查看details,但是发现权限不足。刚才的那篇文章中提到的方法是创建一个和charlie相同的uid,就可以正常查看了,再通过一开始的RCE漏洞,查看charlie的id。

然后在本地创建一个和charlie的uid相同的账户。

既然可以访问了,不妨写入自己的ssh的公钥然后ssh连接上去:


连上之后再看看还有什么有价值的文件夹或者文件,看到mbox的时候看到如下内容:

大意是bob这位管理员把dba的密码设置成和root密码一样。
这样只需要想办法获得dba的密码,就可以用root的账号登陆这台机子获得roo权限。
搜索pgadmin4所在的目录,得到如下几个位置:

然后查找pgadmin4的db数据库文件是保存在哪里的。
通过一番搜索,得知先找到配置文件,再从配置文件中获取数据库名称。

这里得知数据库db文件的名称是pgadmin4.db,于是再用find命令查找,得到如下位置:
/var/appsrv/pgadmin4/pgadmin4.db
然后用scp命令下载到本地:
scp charlie@10.10.10.127:/var/appsrv/pgadmin4/pgadmin4.db .
用sqlitebrowser打开

这里的账户密码不是普通的md5加密,没办法直接解开,但是可以通过查看pgadmin4是怎么进行身份校验就知道怎么获取明文。
先在存放源码的目录下查看有decrypt关键字的文件有哪些:

然后先查看crypto.py这个文件

有了这个脚本也就有了解密函数,但不代表这个时候就能解出明文,还需要知道另一个参数是什么。于是在connection.py中找到。

紧接着查找server表中的user对应的password。

再根据对应的crypto脚本,编写解密脚本。这里直接复制出它的解密和pad函数即可。当然也不要落下padding_string。

运行解密脚本之后可以得到明文密码:

这里直接切换成root权限,输入上面解密后的字符串,便可以得到root权限。

渗透思路梳理
针对本次靶机的渗透,在此处做个简单的总结:


