• Suricata – 入侵检测、预防和安全工具


    一、Suricata介绍

    Suricata是一个功能强大、用途广泛的开源威胁检测引擎,提供入侵检测 (IDS)、入侵防御 (IPS) 和网络安全监控功能。它执行深度数据包(网络流量)检查以及模式匹配,在威胁检测中非常强大。
    工作流程:
    主要特点:
    • IDS/IPS – Suricata 是一个基于规则的入侵检测和防御引擎,它利用外部开发的规则集(例如Talos规则集和新兴威胁 Suricata 规则集)来监控网络流量中是否存在任何恶意活动、策略违规和威胁。
    • 自动协议检测——Suricata 引擎自动检测 HTTP 和 HTTPS 等协议。任何端口上的 FTP 和 SMB,并应用适当的检测和日志记录逻辑。这在检测恶意软件和 CnC 通道时派上用场。
    • Lua 脚本——Suricata 可以调用提供高级恶意软件检测的Lua脚本,以检测和解码原本难以检测的恶意软件流量。
    • 多线程——Suricata在确定网络流量时提供速度和重要性。该引擎旨在应用现代多核硬件芯片组提供的增强处理能力。

    二、安装与使用Suricata

    2.1、安装

    因为官方的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 流量发出警报。
       
    应该得到以下输出:
    发送的 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是更新和管理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 timesdefault: *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>;

    五、添加自己的Suricata规则

    1、在/etc/suricata/rules/下创建my.rules文件
     
    2、向my.rules中写入自己的规则
    1. # 百度搜素
    2. alert tcp any any -> any any (msg:"hit baidu.com..."; content:"baidu"; reference:url, www.baidu.com; sid:888888890;)
    3. alert tcp any any -> any any (msg:"hit baidu.com"; content:"baidu"; sid:888888891;)
    4.  
    5. # 登录dvwa
    6. alert http any any <> any any (msg:"dvwa url"; content:"/login.php";  http_uri; nocase; sid:8880; rev:1;)
    7. alert http any any -> any any (msg:"dvwa protocol"; flow:to_server; http_protocol; content:"HTTP/1.1"; sid:8881; rev:1;)
    8. alert http any any -> any any (msg:"dvwa request header";  content:"application/x-www-form-urlencoded"; http_header; sid:8882; rev:1;)
    9. alert http any any -> any any (msg:"dvwa request referer"; http_referer;  content:"http://192.168.11.45/login.php"; sid:8883; rev:1;)
    10. alert http any any -> any any (msg:"dvwa request user agent";  content:"Mozilla/5.0"; http_user_agent; nocase; sid:8884; rev:1;)
    11. alert http any any -> any any (msg:"dvwa request cookie";  content:"security=impossible"; http_cookie; nocase; sid:8885; rev:1;)
    12. alert http any any -> any any (msg:"dvwa request body";  content:"username=admin"; http_client_body; nocase; sid:8886; rev:1;)
    13. alert http any any -> any any (msg:"dvwa request body"; file_data;  content:"username=admin"; content:"password=password"; nocase; sid:88861;  rev:1;)
    14. alert http any any <> any any (msg:"dvwa"; content: "200"; http_stat_code; sid:8887; rev:1;)
    15. alert http any any <> any any (msg:"dvwa"; content: "302"; http_stat_code; sid:8888; rev:1;)
    16. alert http any any <> any any (msg:"dvwa code"; content:"impossible"; nocase; sid:8889; rev:1;)
    17. # sqli-lab
    18. alert http any any -> any any (msg:"SQL注入攻击"; content:"/Less-1"; http_uri; nocase; sid:562001; rev:1;)
    19. alert http any any -> any any (msg:"SQL注入攻击-union."; content:"select"; http_uri; nocase; classtype:web-sql-injection; sid:562002; rev:1;)
    20. alert http any any -> any any (msg:"SQL注入攻击---."; content:"--"; http_uri; nocase; classtype:web-sql-injection; sid:562003; rev:1;)
    21. 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;)
    22. 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
    23. 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 --+

    六、参考

  • 相关阅读:
    一篇文章带你掌握主流数据库框架——MyBatis
    什么是列式存储和行式存储
    过拟合在测试集上的表现,利用卷积性质求卷积
    上架用的SDK三方应用隐私
    springboot+vue网上零食购物商城网站java
    Makefile相关操作
    设计模式与应用:原型模式
    后缀自动机(其二)
    从图灵机到量子计算机,计算机可以解决所有问题吗?
    paddlepaddle安装的问题
  • 原文地址:https://blog.csdn.net/leiwuhen92/article/details/133679717