1.架构
文件提取代码在一些协议解析器之上工作。应用程序层解析器在流重组引擎和UDP流跟踪之上运行。
在HTTP的情况下,解析器负责解压缩并在必要时解压缩请求和/或响应数据。
这意味着流引擎,重组引擎和应用程序层解析器中的设置都会影响文件提取的工作。
实际提取并存储到磁盘的文件由规则语言控制。
支持的协议是:
HTTP
SMTP
FTP
NFS
SMB
2.设置
stream.checksum_validation控制流引擎是否拒绝具有无效校验和的数据包。通常一个好主意,但网络接口执行校验和卸载很多数据包可能似乎被打破。默认情况下启用此设置,可以通过设置为“no”来禁用此设置。请注意,可以按接口控制校验和处理,请参阅示例配置中的“checksum_checks”。
file-store.stream-depth控制流重组的完成程度。超过此值不会重新组装。这意味着在此值之后将不再跟踪HTTP会话。默认情况下,使用1兆字节的设置。0将其设置为无限制。如果设置为no,则禁用它并考虑stream.reassembly.depth。
libhtp.default-config.request-body-limit / libhtp.server-config.<config> .request-body-limit控制http_client_body关键字跟踪检查HTTP请求主体的数量,但也用于限制文件检查。值0表示无限制。
libhtp.default-config.response-body-limit / libhtp.server-config.<config> .response-body-limit与请求主体限制类似,只适用于HTTP响应主体。
3.输出
3.1 File-Store和Eve fileinfo
有两个输出模块用于记录有关提取的文件的信息。第一个是记录记录eve.files的eve子记录器fileinfo。这些fileinfo记录提供有关文件的元数据,但不提供实际的文件内容。
必须在eve输出中启用此选项:
另一个输出模块file-store将实际文件存储到磁盘.
file-store使用它自己的日志目录(默认情况下存储在默认日志目录),并使用日志文件的内容的SHA256作为文件名。然后将每个文件放在名为00到ff的目录中,其中目录共享文件名的前2个字符。例如,如果解压缩文件的SHA256十六进制字符串以“f9bc6d ...”开头,则我们将文件放在目录 filestore/f9中。
使用SHA256作为文件名允许自动重复数据删除提取的文件。但是,如果再次提取相同的文件,则会更新预先存在的文件的时间戳,类似于touch命令。
可选地,fileinfo可以将记录写入其自己的文件,共享与其引用的文件相同的SHA256。为了处理每次出现的提取文件的元数据,这些文件名包含一些额外的字段以确保唯一性。目前的格式是:
<SHA256>.<SECONDS>.<ID>.json
<SECONDS>是触发存储文件的数据包的秒数,并且<ID>是Suricata实例的运行时的唯一ID。不应依赖这些值,仅用于确保唯一性。
这些fileinfo记录对fileinfo记录到eve输出的记录是必不可少的。
3.2 File-Store(V1)
注意:文件存储版本1已被版本2取代,不再推荐使用。
存储的每个文件都将具有名称“file.<id>”。除非使用waldo选项,否则将重置ID并覆盖文件。如果write-meta设置为yes(默认),则生成包含文件元数据的“file.<id> .meta”文件。如果设置了include-pid选项,则文件将改名为“file.<pid>.<id>”,元文件将为“file.<pid>.<id> .meta”。文件在打开时还会带有后缀“.tmp”,只有在最终确定时才会删除。
3.3 File-Log(已弃用)
file-log 是一个独立的记录器,用于记录有关提取的文件的信息。它已被弃用,不应使用。它已被eve.files在Eve输出取代。
4.规则
没有规则就不会进行提取。最简单的规则是:
alert http any any->any any(msg:"FILE store all";filestore;sid:1;rev:1;)
这只会将所有文件存储到磁盘。想要以pdf扩展名存储所有文件?
alert http any any->any any(msg:"FILE PDF file claimed";fileext:"pdf";filestore;sid:2;rev:1;)
或者更确切地说是所有实际的PDF文件
alerthttpanyany->anyany(msg:"FILE pdf detected";filemagic:"PDF document";filestore;sid:3;rev:1;)
或者只是存储来自黑名单校验和md5的文件?
alerthttpanyany->anyany(msg:"Black list checksum match and extract MD5";filemd5:fileextraction-chksum.list;filestore;sid:4;rev:1;)
或者只存储黑名单校验和sha1中的文件?
alerthttpanyany->anyany(msg:"Black list checksum match and extract SHA1";filesha1:fileextraction-chksum.list;filestore;sid:5;rev:1;)
或者最后从黑名单校验和sha256存储文件?
alerthttpanyany->anyany(msg:"Black list checksum match and extract SHA256";filesha256:fileextraction-chksum.list;filestore;sid:6;rev:1;)
绑定Suricata下载是一个包含更多示例规则的文件。在存档中,转到rules/目录并检查files.rules文件。
5.MD5
Suricata可以动态计算文件的MD5校验和并记录它们。
5.1 配置
在suricata yaml:
对于JSON输出,可选:
确保depth: 0 它可以完全跟踪所有文件
确保我们有request-body-limit:0和 response-body-limit:0
5.2 测试
出于测试目的,我们仅在file.rules(测试/示例文件)中使用此规则:
alert http any any->any any(msg:"FILE store all";filestore;sid:1;rev:1;)
上面的规则将保存通过HTTP打开/下载的文件的所有文件数据
启动Suricata(-S选项仅加载指定的规则文件,如果在suricata.yaml中启用了任何其他规则,则忽略它):
suricata -c /etc/suricata/suricata.yaml -S file.rules -i eth0
元数据:
在files-json.log(或eve.json)中:
{"id":1,"timestamp":"05\/01\/2012-11:10:27.693583","ipver":4,"srcip":"2.23.144.170","dstip":"192.168.1.91","protocol":6,"sp":80,"dp":51598,"http_uri":"\/en\/US\/prod\/collateral\/routers\/ps5855\/prod_brochure0900aecd8019dc1f.pdf","http_host":"www.cisco.com","http_referer":"http:\/\/www.google.com\/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDAQFjAA&url=http%3A%2F%2Fwww.cisco.com%2Fen%2FUS%2Fprod%2Fcollateral%2Frouters%2Fps5855%2Fprod_brochure0900aecd8019dc1f.pdf&ei=OqyfT9eoJubi4QTyiamhAw&usg=AFQjCNGdjDBpBDfQv2r3VogSH41V6T5x9Q","filename":"\/en\/US\/prod\/collateral\/routers\/ps5855\/prod_brochure0900aecd8019dc1f.pdf","magic":"PDF document, version 1.6","state":"CLOSED","md5":"59eba188e52467adc11bf2442ee5bf57","stored":true,"size":9485123}
{"id":12,"timestamp":"05\/01\/2012-11:12:57.421420","ipver":4,"srcip":"2.23.144.170","dstip":"192.168.1.91","protocol":6,"sp":80,"dp":51598,"http_uri":"\/en\/US\/prod\/collateral\/routers\/ps5855\/prod_brochure0900aecd8019dc1f.pdf","http_host":"www.cisco.com","http_referer":"http:\/\/www.google.com\/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDAQFjAA&url=http%3A%2F%2Fwww.cisco.com%2Fen%2FUS%2Fprod%2Fcollateral%2Frouters%2Fps5855%2Fprod_brochure0900aecd8019dc1f.pdf&ei=OqyfT9eoJubi4QTyiamhAw&usg=AFQjCNGdjDBpBDfQv2r3VogSH41V6T5x9Q","filename":"\/en\/US\/prod\/collateral\/routers\/ps5855\/prod_brochure0900aecd8019dc1f.pdf","magic":"PDF document, version 1.6","state":"CLOSED","md5":"59eba188e52467adc11bf2442ee5bf57","stored":true,"size":9485123}
5.3 没有任何规则下记录所有MD5
如果你想记录MD5s的所有内容以及通过Suricata检查的流量,但不记录文件本身,那么你所要做的就是禁用文件存储并只启用带强制MD5的JSON输出 - 在suricata.yaml设置如这样: