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とパスワードの一覧が出力ができた(参考)。ただこのコマンドには問題があって,パスワードに]
を使われると]
以降の文字が削ぎ落とされて正しくカウントできない可能性がある。一度出力してから気づいたのだが「まぁいいだろ」ってことで見捨てた。
ちなみにログイン試行回数はgrep
とwc
で計算できる。
$ grep -e "login attempt \[.*\]" kippo.log* | wc -l 99254
また増えてる…