Help us understand the problem. What is going on with this article?

【T-Pot 】Suricataログからsignatureの集計

More than 1 year has passed since last update.

やりたいこと

T-Potのダッシュボード画面右下にデフォルトで表示されているsignatureを、フィルタをかけたり、表示数を増やしたりして柔軟に見てみたいので、ログから直接確認する。
スクリーンショット 2018-11-24 2.06.46.png

事前情報

保存先

デフォルトでは、データの格納先は以下のパスになっている。カスタマイズされている方は読み替えてほしい。
/data/suricata/log/suricata_ews.log

データ形式

ここには記載しないので自身で確認してほしいのだが、それぞれの行でkeyが異なっていることがわかる。
従って、何も考えずにJSON形式で読み込もうとするとエラーになる。

cat /data/suricata/log/suricata_ews.log | head -5

signatureの表示

そのままシェルでは処理できなさそうだったので、pythonスクリプトを作ってみた。
動作を確認したバージョンは「Python 3.5.2」だったが、Python 3ならおそらく動作するだろう。

使い方

スクリプトにkeyとなる引数を与える。
今回はsignatureを確認したいので「alert」の中の「signature」を指定する。
他のkeyを引数に与えても他の値を取得できるので色々試してみてほしい。

sample1

# python3 suricata_signature.py /data/suricata/log/suricata_ews.log alert signature | sort | uniq -c | sort -rn | head -5
  39398 ET EXPLOIT [PTsecurity] DoublePulsar Backdoor installation communication
    283 ET POLICY Reserved Internal IP Traffic
    130 ET POLICY SSH session in progress on Expected Port
    100 ET WEB_SERVER SQL Errors in HTTP 200 Response (ORA-)
     84 ET WEB_SERVER SQL Errors in HTTP 200 Response (error in your SQL syntax)

sample2

# python3 suricata_signature.py /data/suricata/log/suricata_ews.log alert signature | sort | uniq -c | sort -rn | nl | grep SQL
     4      100 ET WEB_SERVER SQL Errors in HTTP 200 Response (ORA-)
     5       84 ET WEB_SERVER SQL Errors in HTTP 200 Response (error in your SQL syntax)
     8       41 ET WEB_SERVER SQL Errors in HTTP 200 Response (mysql_query)
    10       29 ET ATTACK_RESPONSE MySQL error in HTTP response, possible SQL injection point
    14       17 ET ATTACK_RESPONSE PostgreSQL error in HTTP response, possible SQL injection point
    18       12 ET ATTACK_RESPONSE Oracle error in HTTP response, possible SQL injection point
    19        6 ET ATTACK_RESPONSE DB2 error in HTTP response, possible SQL injection point

コード

suricata_signature.py
import json
import sys


OPTION_FLAGS = {
    "h": False,
    "k": False
}
THIS_FILE = ""
JSON_FILE = ""
ARGS = []


def parser():
    global THIS_FILE
    global JSON_FILE
    global ARGS

    argvs = sys.argv

    THIS_FILE = argvs.pop(0)
    JSON_FILE = argvs.pop(0)

    options = [option for option in argvs if option.startswith('-')]
    ARGS = [arg for arg in argvs if not arg.startswith('-')]

    for option in options:
        if option == '-h' or option == '--help':
            OPTION_FLAGS["h"] = True
        elif option == "-k":
            OPTION_FLAGS["k"] = True


def read_log(log_name):
    with open(log_name, 'r') as f:
        read_data = f.readlines()
    return read_data


def normal():
    data = read_log(JSON_FILE)

    if len(ARGS) == 0:
        for line in data:
            print(line)
    else:
        for line in data:
            try:
                json_data = json.loads(line)
                for arg in ARGS:
                    key_value = json_data[arg]
                    json_data = json.loads(json.dumps(key_value))
                print(key_value)

            except KeyError:
                pass


def check_json_keys():
    keys = set()
    data = read_log(JSON_FILE)
    for line in data:
        json_data = json.loads(line)
        keys |= set(json_data.keys())

    for key in sorted(keys):
        print(key)


def main():
    if OPTION_FLAGS["h"]:
        print("Help...is...nothing")
        exit(0)
    elif OPTION_FLAGS["k"]:
        check_json_keys()
    else:
        normal()


if __name__ == '__main__':
    parser()
    main()

おまけ

オプションとして「-k」を用意した。
1階層目のkeyを一覧で出力する。
データ分析対象の確認に使用してみてほしい。

# python3 suricata_signature.py /data/suricata/log/suricata_ews.log -k
@timestamp
@version
alert
app_proto
dest_ip
dest_port
dns
event_type
fileinfo
flow_id
geoip
host
http
icmp_code
icmp_type
in_iface
ip_rep
path
payload_printable
proto
src_ip
src_port
ssh
stream
t-pot_hostname
t-pot_ip_ext
t-pot_ip_int
tags
timestamp
tls
tx_id
type

おわり

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away