冰蝎动态二进制加密WebShell基于流量侧检测方案

概述

冰蝎是一款新型动态二进制加密网站工具。目前已经有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"

本文暂未使用此特征。

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

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

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

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

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

本文暂未使用此特征。

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

冰蝎工具从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的几种可能性

原文地址:https://www.cnblogs.com/0daybug/p/12004574.html

时间: 2024-08-27 07:34:01

冰蝎动态二进制加密WebShell基于流量侧检测方案的相关文章

冰蝎v2.0.1核心部分源码浅析

0x01 为什么要分析冰蝎 冰蝎是一种新型的木马连接工具,具备强大的功能,只要将冰蝎码上传到服务器并能够成功访问,那就可以执行诸多实用的功能,包括获取服务器基本信息,执行系统命令,文件管理,数据库管理,反弹meterpreter,执行自定义代码等,功能强大.而且和同类型的菜刀,蚁剑相比,加密了流量,只要在上传冰蝎码时和密匙协商建立连接的时候流量分析设备不能够检测出来,那么连接成功建立之后,waf,ids,ips就会好难再检测到出来.所以,冰蝎绝对是目前渗透测试,红蓝对抗中红方的一大利器.对于红方

【C/C++学院】0801-重定向以及文件扫描/二进制加密解密/简单加密/按照密码加密/动态库与静态库

重定向以及文件扫描 #define _CRT_SECURE_NO_WARNINGS//关闭安全检查 #include<stdio.h> #include<stdlib.h> void main1() { char str[100] = { 0 }; scanf("%s", str); printf("str=%s\n", str); system(str); } void main2() { char str[100] = { 0 }; fs

(转)java源程序加密解决方案(基于Classloader解密)

转:http://cjnetwork.iteye.com/blog/851544 源程序加密解决方案 1. 概述: Java源程序的加密,有如下两种: 1使用混淆器对源码进行混淆,降低反编译工具的作用 2基于classloader的自定义加密.解密运行 1.1. 混淆器加密 1.2. 自定义classloader加密 1.2.1. 原理 原理:java虚拟机的动态加载机制,为classloader加密方案提供了理论基础.在jvm装载运行程序,初始的时候,只装在了必要的类,如java.lang.S

二进制加密初探

背景:由于swf发反编译,一些项目为了不让自己的代码不暴漏,一般都会采用各种处理,各有各的方法,有混淆的,有加密的等等,在这里我大概介绍一下二进制加密. 方法:编译出来的模块swf,也可以是swc(解压后取出swf),你可以改个后缀,然后进行二进制加密. 首先大家都知道,swf的前三位是固定的,我们可以用文件查看器看到,C W S(二进制依次是67 87 83  ).我们可以将其前三位去掉,可以在前面随便加个什么或者把后面的数据段可以进行各种调位,当然,这些操作必须是可逆的.我们将最后得到的二进

HttpClient基于HTTP协议认证方案

简介 HttpClient支持三种不同形式的HTTP协议验证发难:Basic,Digest和NTLM.这些都可以解决同http服务器或是代理服务器之间的认证. 认证服务器 HttpClient处理服务器认证几乎是透明的,发开者只需要做一件事情,提供一个合法login证书.此证书被保存到HttpState实例中并且可调用方法setCredentials(AuthScopeauthscope, Credentials cred)和getCredentials(AuthScope authscope)

基于人体部件检测子的行人检测

基于人体部件检测子的行人检测 edgelet feature body parts human detection Jointly likelihood function 读"B.Wu, R. Nevatia. Detection of Multiple,Partially Occluded Humans in a Single Image by Bayesian Combination of Edgelet Part Detectors[C], ICCV,2005." 笔记 论文主要

Solr5.5视频教程|基于微博数据检测的Solr5.5实战开发

Solr5.5视频教程之基于微博数据检测的Solr5.5实战开发 课程不错,直接分享下载网盘地址----https://pan.baidu.com/s/1jKkWSV8 密码: y5x6 备用地址(腾讯微云):http://url.cn/5HAAdG6 密码:dg64Im 在海量数据的情况下,传统的关系型数据库已经力不从心,快速检索已经成为了应用系统所必备的功能之一.本课程从实战角度出发,让学员能从实战中学习到: 搜索引擎的原理及架构. 掌握在大数据环境下经典检索算法. 掌握如何使用solr实现

如何设计可以动态扩容缩容的分库分表方案?

对于分库分表来说,主要是面对以下问题: 选择一个数据库中间件,调研.学习.测试: 设计你的分库分表的一个方案,你要分成多少个库,每个库分成多少个表,比如 3 个库,每个库 4 个表: 基于选择好的数据库中间件,以及在测试环境建立好的分库分表的环境,然后测试一下能否正常进行分库分表的读写: 完成单库单表到分库分表的迁移,双写方案: 线上系统开始基于分库分表对外提供服务: 扩容了,扩容成 6 个库,每个库需要 12 个表,你怎么来增加更多库和表呢? 是你必须面对的一个事儿,就是你已经弄好分库分表方案

分库分布的几件小事(三)可以动态扩容缩容的分库分表方案

1.扩容与缩容 这个是你必须面对的一个事儿,就是你已经弄好分库分表方案了,然后一堆库和表都建好了,基于分库分表中间件的代码开发啥的都好了,测试都ok了,数据能均匀分布到各个库和各个表里去,而且接着你还通过双写的方案咔嚓一下上了系统,已经直接基于分库分表方案在搞了. 那么现在问题来了,你现在这些库和表又支撑不住了,要继续扩容咋办?这个可能就是说你的每个库的容量又快满了,或者是你的表数据量又太大了,也可能是你每个库的写并发太高了,你得继续扩容. 缩容就是现在业务不景气了,数据量减少,并发量下降,那么