freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

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

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

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

FreeBuf+小程序

FreeBuf+小程序

冰蝎动态二进制加密WebShell基于流量侧检测方案
2019-12-08 08:00:59

概述

冰蝎是一款新型动态二进制加密网站工具。目前已经有6个版本。对于webshell的网络流量侧检测,主要有三个思路。一:webshell上传过程中文件还原进行样本分析,检测静态文件是否报毒。二:webshell上线或建立连接过程的数据通信流量。三:webshell已连接后执行远程控制命令过程的数据通信流量。本文通过分析多个历史冰蝎版本及五种脚本(asp|aspx|jsp|jspx|php),结合第二点检测冰蝎上线的静态特征,并总结部分snort规则。

冰蝎通讯原理

冰蝎采用AES加密,很多文章已有介绍,并有对应解密脚本,这里不再赘述。

冰蝎上线数据包

V1.0版本冰蝎连接

抓取到的通信流量如下:

Content-Type: application/octet-stream表示以二进制流传输数据。GET请求体返回16位大小写字母或数字。 

V1.1版本冰蝎连接

冰蝎工具从V1.1开始(包含V1.1)新增随机UserAgent支持,每次会话会从17种常见UserAgent中随机选取。这个版本的pass 与其他版本不同,pass(密码) 后跟10位数字。

V2.0.1版本冰蝎连接

php shell上线数据包

asp shell 上线数据包 

特殊的数据包

特殊包类型一

仅在php shell 上线时发现。测试版本 V2.0和V2.0.1

php shell上线时会产生两个POST请求和响应。第一个POST 响应无响应体,第二个POST响应有响应体。这里需要额外写snort判断。用flowbits 设置多包联合检测。

第一个POST响应


第二个POST响应

特殊包类型二

有两条很久以前抓的冰蝎包,写的snort一直匹配不上,忘了是哪个版本。仔细一看,居然没有Content-Length字段。php shell 上线,GET响应居然无强特征 "Content-Length: 16,查资料说如果是 chunked 加密的,可能就不显示这个content-length字段了。这个特殊类型我选择性忽视。

下面也是php GET响应 无强特征 "Content-Length: 16",看上去多了几个字符,是显示的问题,其实并没有多。 

静态特征

弱特征1:密钥传递时URL参数

 

"\.(php|jsp|asp|jspx|aspx)\?\w{1,8}=\d{1,10}HTTP/1\.1"  

这里 \w{1,8} 表示密码的长度,可根据实际需求及探针性能调整。\d{1,10} 表示密码后面跟的数字长度,为了兼容V1.0和V1.1,用1-10。如果只检测V2.1版本,可以调整为 \d{2,3}。

弱特征2:加密时的URL参数

在加密通讯过程中,没有URL参数。是的,没有参数本身也是一种特征。

"\.(php|jsp|asp|jspx|aspx) HTTP/1.1"

本文暂未使用此特征。

强特征3Accept字段(可绕过)

Accept是HTTP协议常用的字段,但冰蝎默认Accept字段的值却很特殊,这个特征存在于冰蝎的任何一个通讯阶段。

Accept: text/html,image/gif, image/jpeg, *; q=.2, */*;q=.2

冰蝎支持自定义HTTP Header,因此该特征可以被绕过。

可以针对此特征做专门的检测,因为大多数人都没有修改Accept 习惯。

本文暂未使用此特征。

强特征4UserAgent字段(可绕过)

冰蝎工具从V1.1开始(包含V1.1)新增随机UserAgent支持,每次会话会从17种常见(较老)UserAgent中随机选取。

如果发现历史流量中同一个源IP访问某个URL时,命中了以下列表(下载地址)中多个UserAgent,那基本确认就是冰蝎了。

大多数人都没有修改Accept 习惯。但冰蝎支持自定义UA,该特征可以被绕过。

本文暂未使用此特征。

强特征5:传递的密钥

加密所用密钥是长度为16的随机字符串,大小写字母+数字组成。密钥传递阶段,密钥存在于get请求的响应体中。需要划重点的是,不管哪种冰蝎脚本的shell,上线过程客户端都是要与服务器商量2次密码的,也就是会发2个get请求,并返回2次 16位的key。 

因此密钥特征如下:

"\r\n\r\n[A-Za-z0-9]{16}$" 

还有一个特征,get请求响应体长度一定是16位的。

"Content-Length: 16"

弱特征6:加密数据上行

jsp|php|jspx 加密数据上行特征如下:

“\r\n\r\n[a-zA-Z\d\+\/]{10,}\/[a-zA-Z\d\/]{50}" 

数字50表示至少出现50字符才匹配,可根据IDS设备实际情况及需求调整。

jsp加密流量上行

php加密流量上行

jspx加密流量上行

asp,aspx 不可用上面的特征。 

 aspx 加密上行流量独有。为减少误报,建议检查加密上行和下行,此特征同样适用aspx加密流量下行。 

数据包中的 “.” 其实是不可见字符。

”[^\w\s><=\-'"\:\;\,\!\(\)\{\}]”

asp加密流量上行

aspx加密流量上行

弱特征7:加密数据下行

jsp加密流量下行 


这里使用正则的“非”匹配二进制非常见字符。

" [^\w\s><=\-'"\:\;\,\!\(\)\{\}][\w]{2}[^\w\s><=\-'"\.\:\;\,\!\(\)\{\}][a-zA-Z\d]{2}"

[^\w\s><=\-'"\:\;\,\!\(\)\{\}] 表示不可见字符

[\w]{2} 表示特殊符号前至少有2个字符,经过大量对比分析,发现可以匹配的字符串例如:

“不可见字符”+”VO?ES”

“不可见字符”+”Fl#fB”

“不可见字符”+”9w+rv”

“不可见字符”+”6G/SW”

“不可见字符”+”mN]ss”

“不可见字符”+”ss[ss”

“不可见字符”+”gV|05”

“不可见字符”+”Iz\8o”

......

且返回状态码 200 OK

另外对于 php|jsp|asp|aspx,响应的Type特征还有

"Content-Type: text/html"

jspx稍有特殊。

jspx加密流量下行

"Content-Type:text/xml"

弱特征8:长连接(可绕过)

冰蝎通讯默认使用长连接,避免了频繁的握手造成的资源开销。因此默认情况下,请求头和响应头里都会带有:

Connection: Keep-Alive

这个特征存在于冰蝎的任何一个通讯阶段。

本文暂未使用此特征。

冰蝎snort规则检测思路

一.从建立连接的第一个GET请求的响应体开始检测,

1.响应体必chujian0定为16位大小写字母或数字,

2.返回状态码200 OK

可以作为IDS的入口正则,防止接入过多流量影响IDS性能。

二.之后检测第二个GET请求,

1.满足上面提取的GET请求弱特征

三.检测第二个GET响应体特征,特征与步骤一一致,但应满足递进关系。

四.这里分为2种情况,

第一种情况,

1.检测POST请求通用特征

2.检测POST响应特征,匹配到则判定为冰蝎 asp|jsp|aspx|php  上线。

第二种情况(不满足第一种情况),

1.检测POST请求 jspx 特征

2.检测POST响应 jspx 特征

冰蝎snort规则总结

综上

alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_client; pcre: "/\r\n\r\n[A-Za-z0-9]{16}$/"; content:"200 OK"; content: "Content-Length: 16"; fast_pattern;nocase; flowbits: set, bx_first_get_resp; noalert; classtype:web-attack;sid:3000021; rev:1; metadata:created_at 2019_11_20, updated_at 2019_11_20;)

alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_server; content:"GET"; http_method; pcre:"/\.(php|jsp|asp|jspx|aspx)\?\w{1,8}=\d{1,10} HTTP/1\.1/";flowbits:isset, bx_first_get_resp; flowbits:set, bx_second_get_req; noalert;classtype:web-attack; sid:3000022; rev:1; metadata:created_at 2019_11_20,updated_at 2019_11_20;)

alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_client; pcre: "/\r\n\r\n[A-Za-z0-9]{16}$/"; content:"Content-Length: 16"; fast_pattern; nocase; flowbits: isset,bx_second_get_req; flowbits:set, bx_second_get_resp; noalert;classtype:web-attack; sid:3000023; rev:1; metadata:created_at 2019_11_20,updated_at 2019_11_20;)

alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_server; content:"POST"; http_method; pcre:"/\.(php|jsp|asp|jspx|aspx) HTTP/1\.1/"; flowbits:isset, bx_second_get_resp;flowbits:set, bx_first_post_req; noalert; classtype:web-attack; sid:3000024;rev:1; metadata:created_at 2019_11_20, updated_at 2019_11_20;)

alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell online detected"; flow:established,to_client; pcre: "/[^\w\s><=\-'"\:\;\,\!\(\)\{\}][\w]{2}[^\w\s><=\-'"\.\:\;\,\!\(\)\{\}][a-zA-Z\d]{2}/";content: "200 OK"; content: "Content-Type: text/html";flowbits: isset, bx_first_post_req; classtype:web-attack; sid:3000025; rev:1;metadata:created_at 2019_11_20, updated_at 2019_11_20;)

alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell-jspx online"; flow:established,to_server; pcre:"/\r\n\r\n[a-zA-Z\d\+\/]{10,}\/[a-zA-Z\d\/]{50}/"; content:"Content-Type: application/octet-stream"; fast_pattern; flowbits:isset, bx_second_get_resp; flowbits: set, bx_req_jspx; noalert;classtype:web-attack; sid:3000026; rev:1; metadata:created_at 2019_11_20,updated_at 2019_11_20;)

alert http any any -> any any(msg:"MALWARE-BACKDOOR Behinder webshell-jspx online"; flow:established,to_client; pcre:"/[^\w\s><=\-'"\:\;\,\!\(\)\{\}][\w]{2}[^\w\s><=\-'"\.\:\;\,\!\(\)\{\}][a-zA-Z\d]{2}/";content: "200 OK"; content: "Content-Type: text/xml";fast_pattern; flowbits: isset, bx_req_jspx; classtype:web-attack; sid:3000027;rev:1; metadata:created_at 2019_11_20, updated_at 2019_11_20;)

参考链接

流量加密又怎样?多种姿势检测“冰蝎”

webshell连接工具冰蝎检测特征提取

http响应头里没有或者有content-length的几种可能性

*本文作者:chujian0,转载请注明来自FreeBuf.COM

# webshell # 二进制 # 冰蝎
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录