nmap扫描端口 ---- ftp匿名登录下载网站代码 ---- gobuster扫描网站目录 ---- 利用php type juggling漏洞登录网站 ---- 利用LFI获取/etc/passwd ---- john爆破webadmin用户的密码 ---- sudo配合目录遍历提权
靶机:192.168.101.98
攻击机:192.168.101.34
sudo nmap -sV -sC -p- 192.168.101.98
由于上一步中nmap扫描到ftp端口2112可以匿名登录,所以用anonymous登录靶机2112端口,并下载文件index.php.bak
- ftp 192.168.101.98 2112
- ftp> get index.php.bak
gobuster dir -u http://192.168.101.98 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
扫描到/admin和/potato
依次访问发现http://192.168.101.98/admin/是一个登录页面
提交登录信息的表单和index.php.bak中的表单一样一样的
查看index.php.bak文件的php代码部分
我一开始以为是一个密码硬编码问题,但是用用户名admin,密码potato并不能成功登录
后来发现判断用户名是否为admin,密码是否为$pass时用的是==(仅判断值是否相等,不判断类型是否相等),而不是===(类型相等且值相等)
if (strcmp($_POST['username'], "admin") == 0 && strcmp($_POST['password'], $pass) == 0)
在网上找到一种利用方法,最终利用的是PHP中NULL == 0的特性
https://owasp.org/www-pdf-archive/PHPMagicTricks-TypeJuggling.pdf
简单来说就是原本password参数应该提交一个字符串,但这里提交一个空数组,这样strcmp()的结果就是NULL,而根据下表,php中松散比较(==)时NULL等于0,因此满足条件,可以成功登录
具体操作如下:
1、将burp的intercept打开
2、在http://192.168.101.98/admin/登录
3、抓到上图报文之后,将请求体改为
username=admin&password[]=
4、关掉burp的intercept,即可登录成功
点击上图中的dashboard,来到http://192.168.101.98/admin/dashboard.php
点Logs来到http://192.168.101.98/admin/dashboard.php?page=log,选择一个log文件,再点击Get the log按钮
burp中抓到的POST请求体中有个file参数,其值为log文件名
尝试LFI,将log文件名替换为../../../../../../etc/passwd,得到/etc/passwd文件的内容
上图中发现/etc/passwd中包含webadmin用户md5加密的密码,可以尝试用john破解。
先将上图中靶机/etc/passwd的内容保存为文件passwd,然后用john爆破
john passwd
得到webadmin的密码dragon
以用户名webadmin,密码dragon进行ssh登录
ssh webadmin@192.168.101.98
获得第一个flag
sudo -l
发现webadmin可以以任何用户的身份执行/bin/nice /notes/*
查看/bin/nice和 /notes/,以及/notes/下文件的权限,都无法修改或新建文件
尝试能否在执行/bin/nice时跳出/notes/目录
sudo /bin/nice /notes/../bin/bash
成功提权