漏洞描述
Jenkins CLI 是 Jenkins 內(nèi)置的命令行頁面。
Jenkins 受影響版本中使用 args4j 庫解析CLI命令參數(shù),該庫默認(rèn)將參數(shù)中 @ 字符后的文件路徑替換為文件內(nèi)容,未授權(quán)的攻擊者可利用該特性使用 Jenkins 控制器進(jìn)程的默認(rèn)字符編碼讀取 Jenkins 控制器文件系統(tǒng)上的任意文件(如加密密鑰的二進(jìn)制文件),并結(jié)合 Resource Root URL、Remember me cookie、存儲型 XSS 或 CSRF 等在 Jenkins 控制器中執(zhí)行任意代碼。
Jenkins 2.442, LTS 2.426.3 版本通過禁用命令解析器讀取 @ 字符后文件路徑的特性修復(fù)此漏洞。
影響版本
jenkins@(-∞, 2.442)
jenkins lts@(-∞, 2.426.3)
jenkins@影響所有版本
org.jenkins-ci.main:jenkins-core@(-∞, 2.442)
漏洞原理
args4j在解析命令行的時候會把@后面的字符作為文件名,并讀取文件內(nèi)容作為參數(shù)的值。
使用限制
1)關(guān)閉了匿名用戶可讀權(quán)限,只能讀取幾行文件
如果jenkins關(guān)閉了匿名用戶可讀的權(quán)限,則Jenkins CLI上大部分的命令都不能執(zhí)行,可以執(zhí)行的只有help和who-am-i,這兩個命令是無需任何權(quán)限的。
如下:如果關(guān)閉了匿名用戶可讀,執(zhí)行其它命令會報錯,ERROR: anonymous is missing the Overall/Read permission
為什么只能讀取幾行?
該漏洞的原理是由于args4j在解析命令行的時候會把@后面的字符作為文件名,并讀取文件內(nèi)容作為參數(shù)的值。那么當(dāng)我們在調(diào)用該命令時如果出錯,args4j就會將錯誤返回給客戶端,而錯誤信息中就包含文件的內(nèi)容。但是有個問題就是如果我們使用@將文件內(nèi)容加載成命令行參數(shù),則會遇到問題,那就是文件中存在空白字符的情況下,會被分割參數(shù)。如一個文件有四行,那么命令解析就會將這四行分別作為一個參數(shù)跟到help命令的后面。
java -jar jenkins-cli.jar -s http://localhost:8080/ help 1 2 3 4
而這個命令只接受前面的幾個參數(shù),報錯的時候也只會把前面的幾個參數(shù)報出來,因此我們不能讀取到文件的全部內(nèi)容。
漏洞復(fù)現(xiàn)
1)復(fù)現(xiàn)的時候需要用到j(luò)enkins-cli.jar,可以找一個jenkins服務(wù),登錄以后訪問/cli/鏈接,下載該jar包
2)關(guān)閉匿名訪問的情況下
ava -jar jenkins-cli.jar -s http://localhost:8080/ help "@/etc/passwd"
這時可以通過報錯信息讀取到前面兩行的信息
如果一個文件只有一行(如/var/jenkins_home/secret.key 和 /var/jenkins_home/secrets/master.key),使用help讀取就會出現(xiàn)“ERROR: You must authenticate to access this Jenkins.”的錯誤:
前面不是說調(diào)用help命令可以不需要權(quán)限嗎?實際上,help命令會先檢查命令的參數(shù)個數(shù)是否正確,后再檢查權(quán)限,如果我們能讓檢查命令參數(shù)個數(shù)的步驟就出錯,就能正常返回錯誤信息了。
所以,可以人為地給help命令后增加一個新參數(shù),比如:
java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/var/jenkins_home/secret.key"
此時help后有兩個參數(shù),參數(shù)個數(shù)太多導(dǎo)致出錯,第二個參數(shù)被爆出,就是我們要讀的文件內(nèi)容:
3)開啟匿名訪問的情況下
開啟匿名訪問
可以通過connect-node命令和reload-job命令讀取文件的全部內(nèi)容
可以讀取那些文件
知道了如何讀取文件,那么我們在實戰(zhàn)中應(yīng)該讀取哪些文件呢?
如果部署Jenkins使用的是官方鏡像,那么Jenkins的數(shù)據(jù)根目錄是在/var/jenkins_home。但并不是所有人都會使用這個目錄作為根目錄,如果像讀取Jenkins相關(guān)的文件,必須先知道Jenkins的根目錄在哪里。
這時可以讀取/proc/self/environ和/proc/self/cmdline,這兩個文件中包含的是當(dāng)前進(jìn)程的環(huán)境變量和cmd啟動命令行,其中就會包含Jenkins的根目錄。
拿到了Jenkins的根目錄,我們就可以來嘗試讀取下面這些敏感文件。
/var/jenkins_home/users/*/config.xml
/var/jenkins_home/secret.key
/var/jenkins_home/secrets/master.key
/var/jenkins_home/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac
后面具體的利用可以查看該鏈接:Jenkins文件讀取漏洞拾遺(CVE-2024-23897)-騰訊云開發(fā)者社區(qū)-騰訊云
?專注分享安全知識,大家可以關(guān)注一下我的微信公眾號,謝謝大家!
不積跬步,無以至千里;不積小流,無以成江河。文章來源:http://www.zghlxwxcb.cn/news/detail-837024.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-837024.html
到了這里,關(guān)于Jenkins CLI 任意文件讀取漏洞復(fù)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!