今回はPythonプログラミングのお話です。

ThinkPad X240上で稼働する本ブログサーバに対して攻撃をブロックしたufwのログを
pythonで解析して集計するプログラムをコーディングしました。

一つ前の記事でログフォーマットが新旧で変わる点がありますが、それにも対応しています。
ログの出力フォーマットが異なる部分をif文で「Dec」かどうかで条件分岐しています。

集計に際してはcollectionsという標準ライブラリを使って、counterで集計。
most_commonで最頻値を取ってくるというやり方です。

今回は新機能として、ターゲットにされているポートも含めて集計可能にしました。


新たに見直したPythonコード

コード内容は以下になります。(※以前のコードの修正版です)

#!/usr/bin/python3
import re
import sys
import ipaddress
import geoip2.database
import csv
import collections
filename='/var/log/ufw.log'
ip_address = []
ip_country = []
ip_date = []
ip_dport = []
gip = geoip2.database.Reader("/var/lib/GeoIP/GeoLite2-Country.mmdb")

#
def trans_geoip(ip_addr):
    if '192.168.1.' in ip_addr:
        return ('Private')
    try:
        response = gip.country(ip_addr)
        return (response.country.names['ja'])
    except:
        print('')
#
def trans_word(input_text):
    replacements = {
            'Jan':'01',
            'Feb':'02',
            'Mar':'03',
            'Apl':'04',
            'May':'05',
            'Jun':'06',
            'Jul':'07',
            'Aug':'08',
            'Sep':'09',
            'Oct':'10',
            'Nov':'11',
            'Dec':'12',
            }
    return re.sub('({})'.format('|'.join(map(re.escape,replacements.keys()))),lambda m: replacements[m.group()],input_text)
#
if __name__ == '__main__':

    with open(filename) as f:
        reader = csv.reader(f,delimiter=" ",doublequote=False,lineterminator="\r\n")
        for row in reader:

            if row[0]=='Dec':
                if (len(row))>19:
                    ip_dport.append(row[19].strip("DPT="))
                ip_list = ("2021"+"-"+trans_word(row[0])+"-"+row[1].zfill(2),row[2].zfill(2),row[10].strip("SRC="))
                ip_address.append(row[10].strip("SRC="))
                ip_date.append("2021"+"-"+trans_word(row[0])+"-"+row[1].zfill(2))
                ip_country.append(trans_geoip(row[10].strip("SRC=")))

            if row[0]!='Dec':
                if (len(row))>17:
                    #print(row[17].strip("DPT="))
                    ip_dport.append(row[17].strip("DPT="))
                ip_list = ((row[0][0:10]),row[8].strip("SRC="))
                ip_address.append(row[8].strip("SRC="))
                ip_date.append((row[0][0:10]))
                ip_country.append(trans_geoip(row[8].strip("SRC=")))

        ip_addrgroup = collections.Counter(ip_address)
        ip_dategroup = collections.Counter(ip_date)
        ip_cntrgroup = collections.Counter(ip_country)
        ip_dprtgroup = collections.Counter(ip_dport)
        print(len(ip_addrgroup))
        print(ip_cntrgroup.most_common(10))
        print(ip_dategroup.most_common(10))
        print(ip_addrgroup.most_common(10))
        print(ip_dprtgroup.most_common(10))

上記の出力結果

上記の出力結果ですが、リスト形式で見にくいですが以下になります。
国別はgeoipデータベースとIPアドレスを紐付けて出力しています。

# 国別
[('アメリカ', 2097), ('英国', 1296), ('ロシア', 832), ('中国', 709), ('オランダ王国', 343), ('ドイツ連邦共和国', 205), ('香港', 121), ('シンガポール', 78), ('ウクライナ共和国', 61), ('インドネシア共和国', 59)]

# 日付別
[('2021-12-30', 3281), ('2021-12-29', 1957), ('2021-12-31', 1315)]

# IP別
[('185.156.73.91', 175), ('89.248.163.152', 155), ('89.248.163.165', 143), ('89.248.163.164', 137), ('89.248.163.154', 116), ('45.143.200.110', 71), ('146.88.240.4', 61), ('89.248.163.140', 54), ('193.3.19.33', 51), ('89.248.165.202', 51)]

# Port別
[('23', 163), ('2376', 162), ('2375', 162), ('123', 78), ('1433', 71), ('3389', 61), ('389', 55), ('81', 47), ('53', 46), ('5060', 45)]

どこの国が多い?

アメリカがトップ、次に英国、ロシア、中国と大国が並びます。。。

順位国名ブロック回数
1位アメリカ2097
2位英国1296
3位ロシア832
4位中国709
5位オランダ王国343
6位ドイツ連邦共和国205
7位香港121
8位シンガポール78
9位ウクライナ共和国61
10位インドネシア共和国59

どのポートが狙われている?

今回はポートを追加して上位の10位まで集計してみました。
それではそれぞれ何のポートが狙われているのか見ていきましょう。

順位ポート名サービス
1位23telnet
2位2376Docker REST API (SSL)
3位2375Docker REST API (Plain)
4位123NTP
5位1433MS SQLServer
6位3389MSTerminalServer RDP
7位389LDAP
8位81Torpark(オニオンルーティング)
9位53DNS
10位5060SIP(IP電話)

上記はWikipediaを参照しました。

なるほど、MS関連(SQL、RDP、LDAP(AD))は相変わらずですが、
新しい攻撃先ポートとしてはDockerですかね。

Dockerを使ってのアプリケーション開発が増えているかと思いますが、
攻撃対象となっていますので、ご注意ください。


まとめ

今回はufwのログをpythonで集計するコードと、そこから見えてきた、
新しい攻撃対象ポートの紹介でした。

何かの役に立てば幸いです。

それでは!