O
Suricata dentro vários vetores de detecção, possui uma função bem interessante, onde ele calcula o md5 de arquivos sendo enviados/recebidos e o compara com uma lista de md5 maliciosas. Aqui demonstrarei como utilizar a lista do Projeto Malware Patrol.
O Projeto Malware Patrol, apesar do nome em inglês foi criado e é desenvolvido na sua maioria pelo brasileiro André Correa. O projeto possui uma versão gratuita e uma versão paga, que é um investimento bem pequeno e necessário para ter acesso a lista MD5. Para saber mais sobre o projeto acesse
http://malwarepatrol.net .
No site do Suricata, na parte de documentação, temos uma boa parte falando sobre detecção de arquivos on the fly, mas no nosso caso usaremos a parte MD5
Retirado do site
https://redmine.openinfosecfoundation.org/projects/suricata/wiki/File-keywords
filemd5
Match file
MD5 against list of MD5 checksums.
Syntax:
filemd5:[!]filename;
The filename is expanded to include the rule dir. In the default case it will become /etc/suricata/rules/filename. Use the exclamation mark to get a negated match. This allows for white listing.
Examples:
filemd5:md5-blacklist;
filemd5:
!md5-whitelist;
File format
The file format is simple. It's a text file with a single md5 per line, at the start of the line, in hex notation. If there is extra info on the line it is ignored.
Output from md5sum is fine:
2f8d0355f0032c3e6311c6408d7c2dc2 util-path.c
b9cf5cf347a70e02fde975fc4e117760 util-pidfile.c
02aaa6c3f4dbae65f5889eeb8f2bbb8d util-pool.c
dd5fc1ee7f2f96b5f12d1a854007a818 util-print.c
Just MD5's are good as well:
2f8d0355f0032c3e6311c6408d7c2dc2
b9cf5cf347a70e02fde975fc4e117760
02aaa6c3f4dbae65f5889eeb8f2bbb8d
dd5fc1ee7f2f96b5f12d1a854007a818
Entendido o funcionamento, precisará ter sua conta no Malware Patrol para baixar a lista de MD5 (hoje por volta de 70 mil hashes)
Basicamente, terá vinculado com sua conta, uma URL para
"Suricata IDS / IPS - malicious MD5s"
#Diretório das regras
[root@centos-7-x64 ~]# cd /opt/suricata/etc/suricata/rules/
# Baixando arquivo de md5
[root@centos-7-x64 rules]# wget "https://lists.malwarepatrol.net/cgi/getfile?receipt=" -O suricatamd5.txt
--2016-03-07 12:52:22-- https://lists.malwarepatrol.net/cgi/getfile?
Resolving lists.malwarepatrol.net (lists.malwarepatrol.net)... 104.20.78.76, 104.20.77.76, 2400:cb00:2048:1::6814:4e4c, ...
Connecting to lists.malwarepatrol.net (lists.malwarepatrol.net)|104.20.78.76|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: ‘suricatamd5.txt’
Header md5 downloaded
#
# Malware Patrol - Block List - https://www.malwarepatrol.net
# List for Suricata IDS / IPS
# Generated at: 20160308105602 UTC
#
# Please do not update this list more often than every hour.
#
# Copyright (c) 2016 - Andre Correa - Malware Patrol - Malware Block List
# This information is provided as-is and under the Terms and Conditions
# available in the following address:
#
# https://www.malwarepatrol.net/terms.shtml
#
# Using this information indicates your agreement to be bound by these
# terms. If you do not accept them, please delete this file immediately.
#
# You can report false positives or broken rules/signatures to:
# fp (a t) malwarepatrol.net
Com isso, precisamos criar uma regra e apontar para esse arquivo.
Criei um arquivo específico para ele, mas você pode adicionar no local.rules também.
# cat malwarepatrol.rules
alert http any any -> any any (msg:"FILE MD5 Check against Malware Patrol blacklist"; filemd5: suricatamd5.txt; sid:10203040; rev:1;)
Após essa regra, precisaremos finalizar a configuração do arquivo config
# vim /opt/suricata/etc/suricata/suricata.yaml
Adicionaremos na parte de rules-files a entrada com o nome da nossa regra.
# Set the default rule path here to search for the files.
# if not set, it will look at the current working dir
default-rule-path: /opt/suricata/etc/suricata/rules
rule-files:
- malwarepatrol.rules
- botcc.rules
- ciarmy.rules
Feito isso, basta reiniciar o processo e fazer download de algum arquivo malicioso listado lá.
Quando iniciando o processo terá nos logs:
7/3/2016 -- 06:50:10 -
- Loading rule file: /opt/suricata/etc/suricata/rules/malwarepatrol.rules
7/3/2016 -- 06:50:10 - - MD5 hash size 3198000 bytes
Exemplo de saída:
eve.json
{"timestamp":"2016-03-06T11:33:00.638110-0500","flow_id":30172784,"in_iface":"eth0","event_type":"alert","src_ip":"69.163.211.36","src_port":80,"dest_ip":"159.203.10.127","dest_port":40818,"proto":"TCP","tx_id":0,"alert":{"action":"allowed","gid":1,"signature_id":10203040,"rev":1,"signature":"FILE MD5 Check against Malware Patrol blacklist","category":"","severity":3}}
fast.log
03/06/2016-11:33:00.638110 [**] [1:10203040:1] FILE MD5 Check against Malware Patrol blacklist [**] [Classification: (null)] [Priority: 3] {TCP} 69.163.211.36:80 -> 159.203.10.127:40818
Outro ponto interessante da função MD5 é que você pode criar md5 dos arquivos sensiveis e monitorar se o mesmo não está sendo enviado para fora, lembrando que checagem md5 vai além do protocolo http.
* Vale lembrar o uso memória é bem pequeno e suporte a milhões de entrada segundo benchmarks sem afetar a performace "Each MD5 uses 16 bytes of memory. 20 Million MD5's use about 310 MiB of memory."
** Não esqueça ver o valor app-layer.protocols.http.libhtp.default-config.response-body-limit, o default é de apenas 100kb. Para Malware Patrol o ideal seria 4mb, porém sempre bom analisar performance.
Happy Detection!
Rodrigo "Sp0oKeR" Montoro