windyakinってなんて読む

うぃんぢゃきんではない

Kippoログファイルからログイン試行されたIDパスワードの組み合わせを抽出する

書いた。

この記事を作るときにログファイルを集計する必要があった。そのときLinuxに入っていた標準コマンドを使用して集計したのが面白かったので今後のために書き記しておこうと思う。

Kippoはログファイルのサイズが1MBを超えたらファイルを分割し始める。

$ ll
total 90084
-rw-rw-r-- 1 kippo kippo  833519 Dec 11 15:50 kippo.log
-rw-rw-r-- 1 kippo kippo 1000060 Dec 11 09:52 kippo.log.1
-rw-rw-r-- 1 kippo kippo 1000037 Dec 10 20:47 kippo.log.10
-rw-rw-r-- 1 kippo kippo 1000067 Dec 10 18:51 kippo.log.11
-rw-rw-r-- 1 kippo kippo 1000072 Dec 10 10:12 kippo.log.12
-rw-rw-r-- 1 kippo kippo 1000012 Dec 10 09:40 kippo.log.13
-rw-rw-r-- 1 kippo kippo 1000068 Dec 10 09:06 kippo.log.14
:

ちなみにログファイルでログイン試行に関する行はこんな感じの形式。

2014-12-11 09:52:09+0900 [SSHService ssh-userauth on HoneyPotTransport,39727,103.41.124.40] login attempt [root/krystyna] failed

スペース区切りで,失敗すると末尾にfailedで成功すると末尾にsucceededが付く。これ以外にもいろんな情報がログに残っているので,とりあえずログインに関係するログ行だけをgrepコマンドで取り出す。

$ grep -e "login attempt \[.*\]" kippo.log*
2014-12-11 15:57:07+0900 [SSHService ssh-userauth on HoneyPotTransport,40088,103.41.124.31] login attempt [root/010392829] failed
2014-12-11 15:57:09+0900 [SSHService ssh-userauth on HoneyPotTransport,40088,103.41.124.31] login attempt [root/kappleton] failed
:

これをパイプを使ってcutに渡してやる。cutの区切り文字には[を使いたいのでオプションに-d'['を指定した。そうすると今回必要な情報は3番目のブロックにあるので,更にオプションとして-f3を指定。

$ grep -e "login attempt \[.*\]" kippo.log* | cut -d'[' -f3
root/010392829] failed
root/kappleton] failed
:

末尾のfailedとかが必要ないので,今度は]で区切った最初のブロックを取り出してやる(-d']' -f1)。

$ grep -e "login attempt \[.*\]" kippo.log* | cut -d'[' -f3 | cut -d']' -f1
root/010392829
root/kappleton
:

まだこの状態だと重複があるので,今度はuniqコマンドで重複を削除することにした。しかしuniqコマンドはソート済みでないと働いてくれないので,uniqに渡す前に一度sortコマンドを使ってソートしてやる必要がある。このときuniqコマンドのオプションに-cを指定することで重複回数を出力してくれる。

$ grep -e "login attempt \[.*\]" kippo.log* | cut -d'[' -f3 | cut -d']' -f1 | sort | uniq -c
    18 /
     2 /0rd
     2 123/123

この出力はまだ文字列順で重複回数順になっていないので,もう一度sortコマンドを使う。このときオプションに-n-rを指定してやる。-nオプションは先頭の数字を数値としてみなしてくれ,-rは逆順(降順)でソートし一番多い数値を先頭に持ってきてくれる。

$ grep -e "login attempt \[.*\]" kippo.log* | cut -d'[' -f3 | cut -d']' -f1 | sort | uniq -c | sort -nr
   1603 root/root
    582 root/admin

これでログイン試行されたIDとパスワードの一覧が出力ができた(参考)。ただこのコマンドには問題があって,パスワードに]を使われると]以降の文字が削ぎ落とされて正しくカウントできない可能性がある。一度出力してから気づいたのだが「まぁいいだろ」ってことで見捨てた。

ちなみにログイン試行回数はgrepwcで計算できる。

$ grep -e "login attempt \[.*\]" kippo.log* | wc -l
99254

また増えてる…