渗透思路:
nmap扫描 ---- 从404页面获取网站路径 ---- sql注入获取系统用户名和密码 ---- base64解码得到另一个系统用户密码 ---- sudo SETENV提权
环境信息:
靶机:192.168.101.52
攻击机:192.168.101.34
具体步骤:
1、nmap扫描
sudo nmap -sV -sC -p- 192.168.101.52
扫描到22端口ssh,以及8080端口,http-proxy,从扫描结果可以看到,状态码404和200的时候,响应报文的内容有显著不同。
2、404页面泄露网站路径
访问http://192.168.101.52:8080,没什么收获,只是说网站还在搭建
访问一个不存在的页面,比如我这次误打误撞根据nikto的扫描结果访问了http://192.168.101.52:8080/SilverStream,触发了404页面,根据该页面的信息,只有三种链接是可以访问的:
- http://192.168.101.52:8080
- http://192.168.101.52:8080/robots.txt
- http://192.168.101.52:8080/mercuryfacts/
第一个链接看过了,没啥营养,dirb扫描也没扫出什么鬼;
第二个如下所示,也没什么营养
访问http://192.168.101.52:8080/mercuryfacts/试试,终于看到点像样的东西了
点击Load a fact,来到http://192.168.101.52:8080/mercuryfacts/1/
注意url,一开始我想到的是既然有1就可能有2,3,4……没准哪个文件中有敏感信息,然后发现果然1~8都有,不过很可惜,都是关于水星的知识,没啥有用的。
点击See list,来到http://192.168.101.52:8080/mercuryfacts/todo
这里面有两个重要信息:
- users表有用户认证信息
- 网站目前是直接和mysql交互的
3、sql注入获得系统用户名和密码
浏览器地址栏尝试输入发现有sql报错信息,并且非常详细
从下图的sql语句可以知道3件事:
1、sql语句拼接用户输入参数,存在sql注入(虽然已经知道了)。
2、不需要闭合引号。
3、
http://192.168.101.52:8080/mercuryfacts/1/显示的查询结果只有一列。下面开始进行sql注入,目标是获得用户名和密码,没准可以用于ssh登录。
由于已经知道存在users表,因此首先浏览器输入如下payload获得users表的所有列名
从上图可知users表的列有id,password和username。
再在浏览器中输入如下payload得到users表中的所有username和对应的password
得到几对用户名密码:
john:johnny1987
laura:lovemykids111
sam:lovemybeer111
webmaster:mercuryisthesizeof0.056Earths
进行ssh登录尝试,发现只有webmaster能登录
ssh webmaster@192.168.101.52
webmaster家目录下user_flag.txt中得到一个flag
4、base64解码得到linuxmaster用户密码
进入/home/webmaster/mercury_proj目录,发现有个文件叫notes.txt
查看到其内容如下
看起来像是用户名和密码,除了当前用户webmaster的,还有linuxmaster的。
密码像是base64编码的,解码一下linuxmaster的密码:
echo "bWVyY3VyeW1lYW5kaWFtZXRlcmlzNDg4MGttCg==" | base64 --decode
得到linuxmaster的密码为mercurymeandiameteris4880km
尝试用linuxmaster用户进行ssh登录,登录成功
5、sudo SETENV提权
linuxmaster用户shell下输入
sudo -l
并输入密码mercurymeandiameteris4880km,发现其sudo权限是
(root : root) SETENV: /usr/bin/check_syslog.sh
看一下/usr/bin/check_syslog.sh的内容
内容很简单,就是用tail命令看/var/log/syslog的尾部10行。
之前没见过sudoers中配置SETENV的。
网上查了一下,发现sudo运行时默认会启用env_reset选项将命令行设置的环境变量复原,而SETENV会允许用户禁用env_reset选项,允许sudo使用当前用户命令行中设置的环境变量(sudo+SETENV(环境变量)提权 - 隐念笎 - 博客园)。
这样一来,就可以自己写个提权的脚本,命名为tail,然后将其所在目录设置在$PATH的最前面,这样使用sudo命令执行/usr/bin/check_syslog.sh的时候,系统调用的tail命令实际上是我自己写的提权脚本。
提权脚本很简单,内容就是/bin/bash
echo "/bin/bash" > tail
然后给它可执行的权限
chmod +x tail
然后设置环境变量,把当前目录(linuxmaster的家目录,也是提权脚本tail所在目录)放在$PATH变量最前面
export PATH=.:$PATH
最后sudo执行/usr/bin/check_syslog.sh
sudo --preserve-env=PATH /usr/bin/check_syslog.sh
立刻提权到root
获得root的flag
题外话:
虽然网站目录扫描对这个靶机没啥意义,但是这次遇到了gobuster的一个之前没遇到过的功能,所以想记录一下。
简单来说,gobuster默认只不显示404的扫描结果,但这次显示了太多的301,其实是无意义的结果,可以用-b把无意义的状态码排除掉,就像下面这样:
gobuster dir --url http://192.168.101.52:8080/mercuryfacts/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -b 404,301