一、Suricata介绍
Suricata是一个功能强大、用途广泛的开源威胁检测引擎,提供入侵检测 (IDS)、入侵防御 (IPS) 和网络安全监控功能。它执行深度数据包(网络流量)检查以及模式匹配,在威胁检测中非常强大。
工作流程:
主要特点:
-
IDS/IPS – Suricata 是一个基于规则的入侵检测和防御引擎,它利用外部开发的规则集(例如Talos规则集和新兴威胁 Suricata 规则集)来监控网络流量中是否存在任何恶意活动、策略违规和威胁。
-
自动协议检测——Suricata 引擎自动检测 HTTP 和 HTTPS 等协议。任何端口上的 FTP 和 SMB,并应用适当的检测和日志记录逻辑。这在检测恶意软件和 CnC 通道时派上用场。
-
Lua 脚本——Suricata 可以调用提供高级恶意软件检测的Lua脚本,以检测和解码原本难以检测的恶意软件流量。
-
多线程——Suricata在确定网络流量时提供速度和重要性。该引擎旨在应用现代多核硬件芯片组提供的增强处理能力。
二、安装与使用Suricata
2.1、安装
参考2. Quickstart guide — Suricata 7.0.2-dev documentation
因为官方的PPA可以用于安装。要安装最新的稳定Suricata版本,请执行以下步骤:
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt-get update
sudo apt-get install suricata jq
添加了专用的PPA存储库,更新索引后,可以安装Suricata。我们建议此时安装jq工具,因为它将有助于显示Suricata的EVE JSON输出中的信息。
安装Suricata后,您可以检查您运行的Suricata的版本、选项以及服务状态:
sudo suricata --build-info
sudo systemctl status suricata
执行文件:/usr/bin/suricata
配置项与rule规则集:/etc/suricata/
需要重点关注的是suricata.yaml和rules文件夹
-
suricata.yaml文件是对于suricata的软件配置。
-
rules文件夹中存放了相关的检测规则,如果在suricata运行过程中有数据包分析触发了检测规则,则会以日志的形式输出。
日志文件:/var/log/suricata/,也可以在配置文件suricata.yaml中更改default-log-dir
-
eve.json:告警和事件的详细信息
-
fast.log:告警信息简单汇总,一行内容,不是具体信息
-
stats.log:引擎统计信息,比如内存使用计数、数据包数量计数
-
suricata.log:suricata启动过程相关日志
基本指令操作:
升级Suricata:
$ sudo apt-get update
$ sudo apt-get upgrade suricata
删除Suricata:
$ sudo apt-get remove suricata
希望 Suricata 具有内置(启用)调试:
$ sudo apt-get install suricata-dbg
2.2、配置Suricata
> 首先要配置内部网络和外部网络参数,修改配置文件/etc/suricata/suricata.yaml
HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]" # 内网是HOME_NET参数,设置为系统内网网段
EXTERNAL_NET: "!$HOME_NET" # 指定外部网络
> 指定Suricata检查网络流量的网络接口(ip addr查看):
> 确保将default-rule-path属性设置为/etc/suricata/rules:
> 保存更改并关闭配置文件。然后重新启动Suricata以应用更改:
sudo systemctl restart suricata
2.3、更新Suricata规则集
默认情况下,Suricata附带一组有限的检测规则,位于/etc/suricata/rules/目录中。但是这些规则在检测威胁入侵方面能力较弱,可以更新业内知名的第三方规则集来提高检测效果。
Suricata提供了一个名为suricata-update的工具,它允许您从规则集提供者那里获取规则。有些是免费的,例如ET Open set,而有些则需要付费订阅。
它是一个用Python编写的工具,可以使用pip全局安装Suricata-Update供所有用户使用:pip3 install --upgrade suricata-update
要为您的服务器获取最新的规则集,请运行以下命令:
$ sudo suricata-update update-sources # 更新规则集索引
$ sudo suricata-update list-sources # 列出默认的规则提供程序集
$ sudo suricata-update enable-source et/open # 添加规则集et/open
$ sudo suricata-update -o /etc/suricata/rules
从输出中,您可以看到suricata-update获取免费的Emerging Threats ET Open Rules并将它们保存到 Suricata 的/etc/suricata/rules/suricata规则文件。此外,它表示处理的规则数。在此示例中,总共添加了45266个。其中,启用了35359个,删除了6个,修改了131个。
2.4、测试 Suricata 规则
在开始测试Suricata之前,建议先测试一下配置是否正常:
$ sudo suricata -T -c /etc/suricata/suricata.yaml -v
这里将按照Suricata 的快速入门指南的建议,通过模拟入侵来测试ET Open规则集。
通过向作为NIDS(
网络入侵和检测系统)框架的
testmynids.org网站发送 HTTP 请求,将使用签名 ID 2100498 测试 IDS 功能。
2100498:
/etc/suricata/rules/
suricata.rules中存在2100498:
alert ip
any
any
->
any
any
(msg
:
"GPL ATTACK_RESPONSE id check returned root"
; content
:
"uid=0|28|root|29|"
; classtype
:bad
-unknown
; sid
:
2100498
; rev
:
7
; metadata
:created_at
2010_09_23
, updated_at
2010_09_23
;)
这 将对任何在其有效负载中包含内容的 IP 流量发出警报。
$ curl
http://testmynids.org/uid/index.html
应该得到以下输出:
发送的
HTTP请求旨在通过模仿id命令的输出来触发警报,该命令可能通过 shell 在受感染的远程系统上运行。
现在让我们筛选 Suricata 的日志以获取相应的警报。Suricata 附带两个默认启用的日志文件:
-
/fast.log
-
/var/log/suricata/eve.json
将使用grep 命令在/var/log/suricata/fast.log日志文件中检查与curl 请求相对应的日志条目。我们将使用快速入门文档中的2100498规则标识符搜索日志条目:
$ grep 2100948 /var/log/suricata/fast.log,
这样将获得以下表示入侵的输出:
或者,您可以检查/var/log/suricata/eve.log日志文件中的签名 ID 2100498,如图所示
$ jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json
三、suricata-update规则管理
参考
suricata-update规则管理 - 简书 (jianshu.com)
Suricata-Update是更新和管理Suricata规则的官方方式。
安装:
pip3 install --upgrade suricata-update
更新规则
suricata-update命令将执行以下操作:
-
查找suricata路径上的程序以确定其版本;
-
查找/etc/suricata/enable.conf,/etc/suricata/disable.conf,/etc/suricata/drop.conf和/etc/suricata/modify.conf以查找要应用于下载规则的过滤器。这些文件是可选的,不需要存在。
-
下载适用于您的Suricata版本的Emerging Threats Open规则集,如果找不到则默认为4.0.0。
-
应用上面加载的启用,禁用,删除和修改过滤器。
-
写出规则/etc/suricata/rules/suricata.rules。
-
在测试模式下运行Suricata /etc/suricata/rules/suricata.rules
suricata-update用法:
root@node1:/etc/suricata# suricata-update -h
usage: suricata-update update [-h] [-v] [-q] [-D <directory>] [-c <filename>]
[--suricata-conf <filename>] [--suricata <path>]
[--suricata-version <version>]
[--user-agent <user-agent>]
[--no-check-certificate] [-V] [-o <directory>]
[-f] [--yaml-fragment <filename>] [--url <url>]
[--local <path>] [--sid-msg-map <filename>]
[--sid-msg-map-2 <filename>]
[--disable-conf <filename>]
[--enable-conf <filename>]
[--modify-conf <filename>]
[--drop-conf <filename>] [--ignore <pattern>]
[--no-ignore] [--threshold-in <filename>]
[--threshold-out <filename>]
[--dump-sample-configs] [--etopen]
[--reload-command <command>] [--no-reload]
[-T <command>] [--no-test] [--no-merge]
[--offline] [--fail]
optional arguments:
-h, --help show this help message and exit
-v, --verbose 更详细的输出
-q, --quiet 安静地跑。仅显示警告和错误消息
-D <directory>, --data-dir <directory>
设置备用数据目录 (default: /var/lib/suricata)
-c <filename>, --config <filename>
suricata-update配置文件的路径 (default: /etc/suricata/update.yaml)
--suricata-conf <filename>
suricata配置文件的路径 (default: /etc/suricata/suricata.yaml)
--suricata <path> Suricata程序的路径
--suricata-version <version>
将Suricata版本设置为特定版本,而不是检查路径上的Suricata版本。
--user-agent <user-agent>
为HTTP请求设置自定义用户代理字符串
--no-check-certificate
Disable server SSL/TLS certificate verification
-V, --version 显示suricata-update的版本
-o <directory>, --output <directory>
要将规则输出到的目录
-f, --force 强制远程规则文件下载(如果它们不是刚刚下载),或者远程校验和与缓存副本匹配
--yaml-fragment <filename>
Output YAML fragment for rule inclusion
--url <url> 从中下载规则的URL。此选项可以多次使用
--local <path> 要包含的本地规则文件的文件名或目录的路径
--sid-msg-map <filename>
Generate a sid-msg.map file
--sid-msg-map-2 <filename>
Generate a v2 sid-msg.map file
--disable-conf <filename>
Filename of rule disable filters
--enable-conf <filename>
Filename of rule enable filters
--modify-conf <filename>
Filename of rule modification filters
--drop-conf <filename>
Filename of drop rule filters
--ignore <pattern> Filenames to ignore (can be specified multiple times; default: *deleted.rules)
--no-ignore Disables the ignore option.
--threshold-in <filename>
Filename of rule thresholding configuration
--threshold-out <filename>
Output of processed threshold configuration
--dump-sample-configs
Dump sample config files to current directory
--etopen 默认下载ET / Open规则集
--reload-command <command>
Command to run after update if modified
--no-reload 禁用Suricata规则重新加载
-T <command>, --test-command <command> 指定自定义测试命令以在重新加载Suricata之前测试规则
--no-test 禁用测试命令并继续进行,就像它已经通过一样
--no-merge 不要将规则合并到单个规则文件中。警告:如果2个输入规则文件具有相同名称,则不会尝试解决冲突。
--offline Run offline using most recent cached rules
--fail Strictly fail and exit in case of an error
other commands:
update-sources Update the source index
list-sources List available sources
enable-source Enable a source from the index
disable-source Disable an enabled source
remove-source Remove an enabled or disabled source
add-source Add a new source by URL
check-versions Check version of suricata-update
四、Suricata规则
suricata规则由三部分组成:
-
Action:规则匹配后所执行的操作;
-
Header:定义规则的协议、源和目的IP地址、端口和流量方向;
-
Options:选项,指定诸如签名ID(sid)、日志信息、匹配数据包内容的正则表达式、分类类型,以及其他可以帮助缩小识别合法和可疑流量的修饰语 。
一条自定义规则:
alert http any any <> $HOME_NET 80 (msg:"web服务器出现404状态码"; content: "404"; http_stat_code; sid:561001;)
Action取值范围如下:
-
pass:如果匹配到规则,suricate会停止扫描并放行数据包
-
drop:如果程序匹配到了这类规则,这个数据包被阻断将不会被发送到目标。Drop只能在IPS/inline模式下可用。缺点:接收器没有接收到正在发生事情的信息,导致超时(TCP),Suricata对这个数据包生成一个警报。
-
reject:不同于 Drop 直接丢弃数据包,reject 在匹配到规则时会主动进行拒绝数据包。有两种类型的拒绝数据包将自动选择。当违规数据包与TCP有关时,会发送Reset-Packet包。对其他所有协议,会发送ICMP-error包。Suricata同时会生成一个警告。在Inline/IPS模式下,违规数据包也会被drop掉,与Drop action相似。
-
alert:当匹配到规则时,Suricata 不会对数据包进行任何操作,会像对正常数据包一样进行放行,除了会记录一条只有管理员能够看到的警
以上四种操作也是有优先级的,默认的优先级为:Pass > Drop > Reject > Alert。也就是规则在匹配时会优先考虑包含 Pass 的规则,其次才是 Drop,再然后是 Reject,最后再考虑包含 Alert 的规则
Header包含如下几项内容:
-
协议(Protocol):这个字段用来告诉 Suricata当前规则所包含的协议。其取值可以为:tcp,udp,icmp,ip,http,ftp,tls(包含ssl),smb,dns等;这些协议能不能用取决于配置文件suricata.yaml中是否配置了这些协议。
-
源/目的地址(Source and destination):源/目的地址可以设置为 IP 地址或者在配置文件(Suricata.yaml)里定义的变量;
-
端口号(Ports):不同的协议使用不同的端口号,例如 HTTP 使用 80 端口,而 HTTPS则使用 443。通常情况下端口号会设置为 any,这样会影响所有的协议;
-
流向(Direction):流向告诉规则匹配哪些流量数据,是源ip到目标ip的单项流量,还是2个ip往返之间的流量。其中,每条规则都必须有一个箭头如示:->或<>。
Options包含一系列选项,选项以key:value或者key的形式存在,用;进行分隔:<keyword>: <settings>; <keyword>;
常见的选项如下:6. Suricata Rules — Suricata 6.0.3 documentation
五、添加自己的Suricata规则
6.13. HTTP关键字 — Suricata 7.0.0-dev 文档 (osgeo.cn)
suricata HTTP关键字 - 23云恋49枫 - 博客园 (cnblogs.com)
1、在/etc/suricata/rules/下创建my.rules文件
2、向my.rules中写入自己的规则
# 百度搜素
alert tcp any any -> any any (msg:"hit baidu.com..."; content:"baidu"; reference:url, www.baidu.com; sid:888888890;)
alert tcp any any -> any any (msg:"hit baidu.com"; content:"baidu"; sid:888888891;)
# 登录dvwa
alert http any any <> any any (msg:"dvwa url"; content:"/login.php"; http_uri; nocase; sid:8880; rev:1;)
alert http any any -> any any (msg:"dvwa protocol"; flow:to_server; http_protocol; content:"HTTP/1.1"; sid:8881; rev:1;)
alert http any any -> any any (msg:"dvwa request header"; content:"application/x-www-form-urlencoded"; http_header; sid:8882; rev:1;)
alert http any any -> any any (msg:"dvwa request referer"; http_referer; content:"http://192.168.11.45/login.php"; sid:8883; rev:1;)
alert http any any -> any any (msg:"dvwa request user agent"; content:"Mozilla/5.0"; http_user_agent; nocase; sid:8884; rev:1;)
alert http any any -> any any (msg:"dvwa request cookie"; content:"security=impossible"; http_cookie; nocase; sid:8885; rev:1;)
alert http any any -> any any (msg:"dvwa request body"; content:"username=admin"; http_client_body; nocase; sid:8886; rev:1;)
alert http any any -> any any (msg:"dvwa request body"; file_data; content:"username=admin"; content:"password=password"; nocase; sid:88861; rev:1;)
alert http any any <> any any (msg:"dvwa"; content: "200"; http_stat_code; sid:8887; rev:1;)
alert http any any <> any any (msg:"dvwa"; content: "302"; http_stat_code; sid:8888; rev:1;)
alert http any any <> any any (msg:"dvwa code"; content:"impossible"; nocase; sid:8889; rev:1;)
# sqli-lab
alert http any any -> any any (msg:"SQL注入攻击"; content:"/Less-1"; http_uri; nocase; sid:562001; rev:1;)
alert http any any -> any any (msg:"SQL注入攻击-union."; content:"select"; http_uri; nocase; classtype:web-sql-injection; sid:562002; rev:1;)
alert http any any -> any any (msg:"SQL注入攻击---."; content:"--"; http_uri; nocase; classtype:web-sql-injection; sid:562003; rev:1;)
alert http any any -> any any (msg:"SQL注入攻击response."; content:"Your Login name"; http_server_body; nocase; classtype:web-sql-injection; sid:562004; rev:1;)
alert http any any -> any any (msg:"SQL注入攻击response_1."; http_server_body; content:"Your Login name"; content:"Your Password"; nocase; classtype:web-sql-injection; sid:562005; rev:1;) # 语法解析error
alert http any any -> any any (msg:"SQL注入攻击response_2."; file_data; content:"Your Login name"; content:"Your Password"; nocase; classtype:web-sql-injection; sid:562006; rev:1;)
3、更新Suricata配置文件/etc/suricata/suricata.yaml,确保你的本地规则文件已添加到规则列表:
4、如果您必须更正您的规则和/或修改Suricata的YAML配置文件,那么您必须重新启动Suricata。
systemctl restart suricata
5、运行suricata并查看是否正在加载规则。
suricata -c /etc/suricata/suricata.yaml -i ens160
比如错误的规则被检测出来了:
如果规则未能加载,Suricata将显示与它认为该规则不可加载时一样多的信息。特别注意细节:查找特殊字符、空格、大写字符等的错误。
6、虚拟机上网页访问baidu.com或者curl baidu.com
7、笔记本上网页访问http://192.168.11.45/login.php,输入用户密码,登录
8、网页访问http://192.168.11.45:8080/Less-1/?id=-1' UNION SELECT 1,2,3 --+
六、参考
GitHub - OISF/suricata: Suricata is a network Intrusion Detection System, Intrusion Prevention System and Network Security Monitoring engine developed by the OISF and the Suricata community.
7.2. 添加您自己的规则 — Suricata 7.0.0-dev 文档 (osgeo.cn) 官方文档
Suricata – 入侵检测、预防和安全工具 - 知乎 (zhihu.com)
(2条消息) Suricata规则编写_投篮不准的程序员不是一个好车手的博客-CSDN博客
五.Suricata识别http攻击流量 - eveplw - 博客园 (cnblogs.com)