解决方案:基于机器学习的Webshell检测方法与实现(上)
优采云 发布时间: 2022-11-20 16:21解决方案:基于机器学习的Webshell检测方法与实现(上)
1 概述
WEBSHELL 是攻击者使用的恶意脚本,其目的是升级和维护对已受感染的 WEB 应用程序的持久访问。Webshell 本身无法攻击或利用远程漏洞,因此它始终是攻击的第二步。
攻击者可以利用 SQL 注入、远程文件收录
(RFI)、FTP 等常见漏洞,甚至使用跨站点脚本 (XSS) 作为攻击的一部分来上传恶意脚本。常见功能包括但不限于 shell 命令执行、代码执行、数据库枚举和文件管理。
为什么使用 webshell
?
1. 持续远程访问
Webshell通常收录
一个后门,允许攻击者远程访问服务器并随时控制服务器。这样可以节省攻击者每次访问攻击服务器时利用此漏洞所需的时间。攻击者还可以选择自己修复漏洞,以确保没有其他人会利用该漏洞。这允许攻击者保持低调并避免与管理员进行任何交互。值得一提的是,一些流行的 webshell 使用密码验证和其他技术来确保只有上传 webshell 的攻击者才能访问它。这些技术包括将脚本锁定到特定的自定义 HTTP 标头、特定的 Cookie 值、特定的 IP 地址或这些技术的组合。
2. 权限提升
除非服务器
配置错误,WebShell 将在 Web 服务器的用户权限下运行,该服务器的权限有限。通过使用 webshell,攻击者可以尝试通过利用系统上的本地漏洞来获取根权限来执行权限升级攻击,这在 Linux 和其他基于 Unix 的操作系统中是“超级用户”。通过获得对root帐户的访问权限,攻击者基本上可以在系统上执行任何操作,包括安装软件,更改权限,添加和删除用户,窃取密码,阅读电子邮件等等。黑客入侵网站后,通常会将ASP或PHP后门文件与网站服务器
Web目录中的普通网页文件混合在一起,然后可以使用浏览器访问ASP或PHP后门,获得命令执行环境,达到控制网站服务器的目的。Webshell 一般有三种检测方式:基于流量的模式、基于代理的模式和基于日志的分析模式。本文重点介绍基于流量的 Webshell 检测。整个过程,首先采集
webshell数据,然后
结合网络安全专家知识,观察和研究webshell和正常流量产生的流量,进行统计分析,挖掘出能够区分两种流量的较好特征,然后选择二元分类算法进行训练模型,然后评估算法性能进行参数调整, 等等,最后是设计模型。详细说明依次展开。
2 数据采集
在真实环境中,webshell 样本缺失,基本上在数以万计的 HTTP 流量中,很难有单个 webshell 生成的流量。因此,对于机器学习来说,高质量、大量的样本将是一个挑战。为了解决本示例的难题,我们特意模拟构建了一个 webshell 入侵环境,根据 webshell 的类型和攻击行为编写了自动化脚本,在运行时生成了大量的 webshell 流量,并使用网络嗅探工具(如 Wireshark、Tcpdump 等)来采集
webshell 流量。图 1 基本上显示了整个数据采集
过程。
(图1)。
2.1 构建数据类型
Webshell大致可以分为以下三类:
● 一句话
webshell通过工具菜刀连接,可以实现的功能包括添加和删除文件,数据库的CRUD和命令执行。
● 马来西亚
webshell 文件很大,收录
大量服务器端代码。功能强大,除了添加和删除文件、数据库的 CRUD 和命令执行。它还包括电源升级、内网扫描和回弹外壳等功能。
● 小马
webshell 文件很小,代码量也很小。收录
的功能比较单一,实现的功能是一两个。主要执行文件上传或服务器执行文件下载、命令执行等功能。
在构建数据采集类型时,根据常见的webshell类型进行划分,并结合执行命令,如下所示:
您需要登录吗:
● 直接:无需登录,直接访问就足够了。可以实现许*敏*感*词*;
● 登录:登录需要密码或账号,分为登录前或登录后(前/后);根据
是否需要登录进行划分后,开始按用户行为划分,即操作类型。
操作类型:
● cmd:命令执行;
● 文件:文件操作;
● SQL:数据库操作;
2.2 设置数据采集
环境
这
流量采集
的整体环境如下图 2 所示
(图2)。
系统环境为Linux虚拟机,通过建立桥接模式完成与主机服务器的网络数据交互。各种 webshell 在以下环境中运行:
" />
● PHP:phpstudy
● JSP:jsp研究
● ASP:Ajiu AspWebServer+Mysql
本地主机使用Wireshark来采集
和保存webshell网络流量。
2.3 流量数据生成
● 直接:
直接访问的 webshell 使用脚本批量访问,生成流量数据供 webshell 访问。手动输入文件操作、命令执行和数据库操作的流量。
● 登录:
登录网络外壳,
使用脚本登录,运行Selenium模块模拟浏览器登录WebShell。修复了由于 Cookie 认证机制导致 Webshell 无法成功登录的问题。手动输入文件操作、命令执行和数据库操作的流量。
● 厘米:
webshell以脚本方式使用。根据脚本,实现不同系统命令的执行,得到相应的结果。
● 彩道:
菜刀 webshell 的接口访问和登录是通过脚本批量实现的。
2.4 流量数据分类
流量报文的命名规则为(webshell类型)_(操作),根据具体类型和操作划分并单独采集。确保流量数据类型统一。
2.5 流量采集
本地主机使用 WireShark 进行流量采集
。3
基于流量的Webshell检测3.1 特征工程
使用机器学习构建流量检测模型的一个重要步骤是对 Webshell 流量执行特征挖掘分析。特征工程应结合Webshell的特性和相关专业知识进行挖掘。首先,根据 webshell 的行为特征,总结出 webshell 本身的以下特征。
(1)有系统调用的命令执行函数,如eval、system、cmd_shell、assert等;
(2)有系统调用的文件操作函数,如fopen、fwrite、readdir等;
(3)有数据库操作函数,调用系统自己的存储过程连接到数据库操作;
(4)具有深度的自我隐蔽和伪装,可以长期潜伏在网页源代码中;
(5)衍生变体很多,可以通过自定义加解密功能绕过检测,使用异或、字符串反转、压缩、截断和重组;
(6)访问IP少,访问量少,页面隔离,传统防火墙无法拦截,无系统运行日志;
(7) 生成有效负载流量,记录在网络日志中。
流量检测是为了区分正常访问和 webshell,所以也是 webshell 与正常业务网页有何区别的简单展示,如图 3 所示:
(图3)。
3.1.1 特征挖掘
基于特征工程中采集
的专家经验知识,以及对实际历史数据的统计分析,让我们开始特征分析。(注:太多的技术细节对披露比较敏感,所以只列举了部分特征进行阐述)。
1. 基于关键词的功能
对于webshell本身的行为分析,它有系统调用、系统配置、数据库、文件的操作动作,其行为决定了其数据流量具有一些明显的多皮带参数特征,然后在关键词匹配之前对流量进行解码。在查阅各种Webshell操作方法并观察生成的数据流量进行统计分析后,共采集
了一些关键词,如图4所示。统计发现,这些关键词在正负样本中的比例差异很大,因此非常适合作为特征。下面是阳性和阴性样本中关键词出现次数的比较条形图(图4),显示了分布的差异。
(图4)。
2. 流量中获取/发布参数的数量
已经观察到,一般来说,webshell get/post的参数数量相对较少,可以作为功能使用。
3. 流量中获取/发布的信息熵
大多数请求将数据提交到服务器,WebShell 也不例外。但是,如果提交的数据被加密或编码,则其熵会增加。对于正常的Web业务系统,如果提交到某个URI的数据熵明显大于其他页面,则URI对应的源码文件更可疑。一般来说,webshell提交的数据进行加密通信的熵值会很大,因此可以检测到。例如,按如下方式进行比较:
普通页面:“pid=12673&aut=false&type=low”
Webshell: “ac=ferf234cDV3T234jyrFR3yu4F3rtDW2R354”
4. 基于 Cookie 的特征提取
在正常的 HTTP 访问中,
由于 HTTP 访问是无状态协议,因此服务器不会自动维护客户端的上下文信息,因此它使用 Session 来保存上下文信息。会话存储在服务器端,为了降低服务器存储的成本,所以当有HTTP请求时,服务器会返回一个cookie来记录sessionID并保存在浏览器本地,下次访问请求时,cookie将被携带。Cookie的内容主要包括:名称、值、到期时间、路径和域。路径与域一起构成了 Cookie 的范围。据观察,webShell 生成的一些 cookie 是空的,有些是键值对结构但基本数量非常小,命名没有实际意义。因此,提取此功能以将webShell与普通网站访问区分开来。
此外,从 cookie 的角度来看,你会发现 webshell 的键值对会更加混乱,不像正常流量或参数那样有规律,具有实际可读意义。下面选择一个 webshell cookie,可以发现键值对的值令人困惑。因此,选择键值对的熵值作为特征。
Cookie: KCNLMSXUMLVECYYYBRTQ=DFCXBTJMTFLRLRAJHTQLDNOXSKXPZEIXJUFVNNTA
5. 返回页面结构的相似性值
当黑客进行 webshell 权限提升攻击时,他们通常会使用现有的 webshell 工具,例如直接使用马来西亚或稍微修改它。因此,许多返回的页*敏*感*词*有结构相似性,可以提取网页的结构相似性特征进行比较。设计思路是与采集到的webshell生成的网页结构相似度进行比较,并以返回网页结构相似度为特征。
6. Web 路径图层数
黑客成功入侵一个网站并植入webshell网页,通常需要隐藏这些后门软件,这样网页路径会更深,网页隐藏得更深,不容易被普通浏览者发现。
7. 访问期限
与正常业务相比,webshell的浏览时间不同,黑客通常会选择在正常流量稀缺时访问它。因此,时间特征被提取为一个维度。根据时间类别的特点,可以扩展几个子类别,一天中的哪个时间(hour_0-23),星期几(week_monday...),一年中的哪一周,一年中的哪个季度,工作日,周末。
8. 没有推荐人
在流量中,如果页面未跳转到上一页,则 referer 参数将为空。一般的小马和一句话网壳很少有跳转关系,马来西亚登陆的首页也和上一页没有跳转关系,所以选择这个特征作为辅助判断。
3.1.2 特征提取
总之,总共有这样的功能
如关键词,提取网页路径结构层数、cookie键值对数、返回网页结构相似度、POST/GET熵值、cookie键值对熵值等特征(注:过多的技术细节披露较为敏感,故仅列举部分特征进行阐述)。将数据采集
阶段生成的数据作为数据源生成机器学习模型特征,然后对特征进行归一化。其中,正常流量60349,Webshell流量51,070。
3.2 模型构建与评估
选取adboost、SVM、随机森林和逻辑回归4种算法进行模型训练,包括60349个正常流量和51070个webshell流量。每个模型的训练效果如下图 5 所示。考虑算法运行时间最小化,可解释性最大化,当多种算法检测效果相似时,选择随机森林作为模型算法进行实际产品化。
(图5)。4
4.1检测过程的具体实现
这
基于机器学习的Webshell检测整体业务逻辑如下图6所示,简要描述如下:首先从各种终端设备和第三方库导入数据进行特征提取模型训练;之后,将训练好的模型部署到生产环境中,检测真实数据并生成告警信息进行检测。最后,手动确认检出结果,并将误报数据重新导入训练库,定期重新训练模型。
(图6)。
4.2 技术选择将
基于机器学习的 Webshell 检测部署到生产环境时,需要考虑大数据规模对性能指标(如模型的及时性和吞吐量)的影响。经过多方考虑,最终选择了下图7所示的组件组合作为产品化的技术选择。该解决方案结合了Spark大数据处理的高效率,Kafka的中高性能和数据流的低延迟,以及HBase对*敏*感*词*数据集的实时可读性访问。下图中的技术架构可以保证Webshell在高流量环境下的检测和机器学习模型的自动优化。
(图7)。
5 小结
本文介绍了基于机器学习的Webshell检测方法以及实现中一些技术组件的选择。首先,基于机器学习的webshell检测侧重于需要结合安全专家知识设计来提取高效的模型特征,只有良好的特征构建才能保证模型在真实环境中的检测效果。其次,对于机器学习模型训练阶段,数据一直是最重要的,网络安全领域数据稀缺是普遍现象,我们介绍了如何自动构建webshell异常数据,以保证模型的训练数据量。最后,通过对比验证各算法的检测效果,引入人工审核确认流程,确保模型在产品化阶段能够有规律地进行优化,提高检测精度。
在现有样本中,上述特征已被用于获得相对较好的精度。但是,除了上述方法之外,当仅使用一个流量提取特征并预测结果时,不可避免地会出现误报。因此,除了检测单个交通信息特征外,我们还介绍了需要一定量数据积累和统计才能反映的功能,下面列出
● 访问单个网页的频率;
● 单个访问网页的用户代理之间的区别;
● 统计整个网页图结构中单个网页的不可访问性;
● 单个网页结构与整体网页结构相似度的比较;
这些特征可以从另一个角度表示Webshell的特征,但对于单个数据片段,它们不能很好地表示。因此,统计分析需要一定的累计流量和一定的时间段。基于阶段统计信息整合到Wehshell检测模型特征中,联合分析,我们将在下一部分讲解如何使用上述特征,从样本采集、工程设计、特征工程、模型训练等方面进行具体阐述。敬请关注。我们也期待与您的技术交流。
解决方案:java#解决采集文章防盗链图片不显示问题
我们在网上采集资料进行应用时,经常会遇到目标完整图片中有反盗链链接,导致采集文章中的图片无法在应用中显示。有两种方法可以解决这个问题:
1.采集
的时候把图片下载下来存放在自己的服务器上,把html图片路径换成自己的图片路径。缺点是存储资源太大,采集速度慢;
2.图片不下载,显示时处理,让服务器解决防盗链。下面看看实现方法:
大多数防盗链都是通过Referer判断的,所以我们只需要在服务端拉取图片,转成base64图片即可;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.zip.GZIPInputStream;
import javax.imageio.ImageIO;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import net.coobird.thumbnailator.Thumbnails;
/**
* 将HTML内容链接替换为完整链接,支持将将图片替换为base64,防止图片因防盗链无法显示
* author:gq
*/
public class FixUrlHelper {
/**
* 基于baseUrl,补全content代码中的链接,并且将图片替换为base64,防止图片因防盗链无法显示
*
* @param baseUrl 原文链接或网站域名
* @param content HTML内容
* @param imgSizeK 图片保留的最大KB数
* @return
*/
public static String FixUrl(String baseUrl, String content,boolean isFullImg, int imgSizeK) {
Document document = Jsoup.parse(content);
document.setBaseUri(baseUrl);
Elements elements = document.select("img");
String base64 = "";
for (Element el : elements) {
//此处为特殊代码,修复部分网站使用data-src保存图片路径
if (StringUtils.isNotBlank(el.attr("data-src")) && StringUtils.isBlank( el.attr("src") )) {
el.attr("src", el.absUrl("data-src"));
el.removeAttr("data-src");
}
String imgUrl = el.attr("src");
if (!imgUrl.trim().startsWith("http")) {
el.attr("src", el.absUrl("src"));
}
try {
if(isFullImg) {
base64 = downLoadAndZoomToBase64(el.attr("src"), baseUrl, imgSizeK);
if(base64!=null) {
el.attr("src", base64);
}
}
} catch (Exception ex) {
}
}
elements = document.select("a[href]");
for (Element el : elements) {
String imgUrl = el.attr("href");
if (!imgUrl.trim().startsWith("http")) {
el.attr("href", el.absUrl("href"));
}
<p>
" />
}
if (content.contains("