Suricata 基础使用

编译安装

git clone https://github.com/OISF/suricata
cd suricata
git clone https://github.com/OISF/libhtp
./autogen.sh
./configure --prefix=/opt/suricata --enable-luajit
sudo make install-full

configure步骤可能会存在一些安装依赖,如libyamljanssonlibhtp

在这里,使用--prefix来设定安装前缀,也即 Suricata 只会操作/opt/suricata目录,这样可以确保干净安装、卸载。

Suricata 规则集

FTP 文件传输检测

假定场景如下:

商业间谍希望将公司机密文件传输到外部 FTP 服务器。

Suricata 配置

我们希望保存相应的文件及 PCAP 包,作为法律证据。因此需要用到文件截取的功能

alert ftp-data any any -> any any (msg:"SPY!"; filestore; sid:1; rev:1; ftpdata_command:stor;)

还需要配置如下部分

- outputs:
  - eve-log: # 事件记录
    types:
    - files:
      force-magic: no
      force-hash: [md5,sha256]
    # 其他 eve log 配置
  - pcap-log: # pcap 记录
    enabled: yes
    filename: log.pcap
    # 其他 pcap 配置
  - file-store: # 文件存储记录
    version: 2
    enabled: yes
    force-filestore: yes

配置好后,运行如下命令

/opt/suricata/bin/suricata \
    -i eth0 \
    -c /opt/suricata/etc/suricata/suricata.yaml \
    -s /opt/suricata/etc/suricata/rules/test.rules 

接下来,向服务器上传文件即可。

检测结果

首先,在fast.json中,必然会存在相应的警告

12/02/2020-17:39:48.021760  [**] [1:1:1] SPY! [**] [Classification: (null)] [Priority: 3] {TCP} 172.21.178.223:35552 -> 119.45.6.103:21045

接着,需要在eve.json检查相应的触发事件(这里只提取出文件相关的事件)

{
  "timestamp": "2020-12-02T17:39:48.021760+0800",
  "flow_id": 1108348001034938,
  "parent_id": 1458654122957134,
  "in_iface": "eth0",
  "event_type": "fileinfo",
  "src_ip": "172.21.178.223",
  "src_port": 35552,
  "dest_ip": "119.45.6.103",
  "dest_port": 21045,
  "proto": "TCP",
  "app_proto": "ftp-data",
  "fileinfo": {
    "filename": "test",
    "sid": [
      1
    ],
    "magic": "ASCII text",
    "gaps": false,
    "state": "CLOSED",
    "md5": "020861c8c3fe177da19a7e9539a5dbac",
    "sha256": "06577bd4a35a3fb866f891567b5a9ff67223c2f4422fb7629836d0cadb603ed3",
    "stored": true,
    "file_id": 1,
    "size": 8,
    "tx_id": 0
  }
}

通常,文件传输事件前后往往存在大量其他事件,因此这里可以采用另一种思路来快速检索:直接查看 sha256 值。

> cat eve.json | jq | grep sha256

      "sha256": "06577bd4a35a3fb866f891567b5a9ff67223c2f4422fb7629836d0cadb603ed3",
    "sha256": "06577bd4a35a3fb866f891567b5a9ff67223c2f4422fb7629836d0cadb603ed3",

在这里,可以看到,被传输的文件的 sha256 值为06577bd4a35a3fb866f891567b5a9ff67223c2f4422fb7629836d0cadb603ed3。在日志目录下的filestore文件夹内,查看06文件夹即可

> cat filestore/06/06577bd4a35a3fb866f891567b5a9ff67223c2f4422fb7629836d0cadb603ed3
abcdefg

而之前用于测试的文件内容,正是abcdefg

Lua 脚本联动

如果在编译过程中添加了--enable-luajit参数,那么就可以在 Suricata 运行中通过 lua 脚本进行一些操作

如下面的脚本(假设位于/etc/suricata/lua-script/test.lua

function init (args)
    local needs = {}
    needs['type'] = 'file'
    print ("init()")
    return needs
end

function setup (args)
    print ("setup()")
end

function log(args)
    http_host = HttpGetRequestHeader('Host')
    print (http_host)
end

function deinit (args)
    print("deinit()")
end

suricata.yaml中按照如下配置

output:
    - lua:
        enabled: yes
        scripts-dir: /etc/suricata/lua-script
        scripts:
            - test.lua

在执行命令后,有:

> sudo /opt/suricata/bin/suricata \
    -i eth0 \
    -c /opt/suricata/etc/suricata/suricata.yaml

[21399] 2/12/2020 -- 20:19:25 - (suricata.c:1065) <Notice> (LogVersion) -- This is Suricata version 6.0.1-dev (75c0f9bd0 2020-11-19) running in SYSTEM mode
init()
setup()
[21399] 2/12/2020 -- 20:19:25 - (util-ioctl.c:322) <Warning> (SetEthtoolValue) -- [ERRCODE: SC_ERR_SYSCALL(50)] - Failure when trying to set feature via ioctl for 'eth0': Operation not supported (95)
[21400] 2/12/2020 -- 20:19:25 - (log-pcap.c:902) <Notice> (PcapLogInitRingBuffer) -- Ring buffer initialized with 9 files.
[21399] 2/12/2020 -- 20:19:25 - (tm-threads.c:1964) <Notice> (TmThreadWaitOnThreadInit) -- all 4 packet processing threads, 4 management threads initialized, engine started.
www.oyohyee.com

可以看到,在各个部分,都可以触发 lua 脚本,实现更为精细的操作。