背景
定期的に大量アクセスが来る VNC アクセス。 これを検知する Vnclowpot にはイベント件数だけでいうと Cowrie に次ぐ数が記録されている(弊ハニーポット調べ)。 T-Pot にある Vnclowpot のログには John The Ripper 形式の VNC ハンドシェイクが記録されている。 少し調べるとこのログをクラックして平文のパスワードを取得するプログラム(Cracker)を見つけた。 せっかくなのでここ1ヶ月分のログを解析してみた。
目次
Cracker
Cracker の入手
以下のサイトから入手できる。Vnclowpot の配布元っぽい。
GitHub - magisterquis/vnclowpot: Low-interaction VNC honeypot with a static challenge.
git clone https://github.com/magisterquis/vnclowpot cd vnclowpot/ cd cracker/
単語リスト(rockyou.txt)の入手
Cracker でパスワード解析をするには単語リストが必要になるので予め用意する必要がある。 デフォルトでは rockyou.txt が指定されていたので、素直にこれを用意する。 rockyou.txt は以下のサイトなどから入手できる。
wget http://downloads.skullsecurity.org/passwords/rockyou.txt.bz2 bunzip2 rockyou.txt.bz2
Cracker のコンパイルと実行
go言語のコンパイル環境を導入。
sudo apt install golang-go
Cracker (cracker.go) をコンパイルする。
go build cracker.go
単語リスト rockyou.txt を同じディレクトリに置いた状態で vnclowpot のログに対して Cracker を実行する。 単語リストはデフォルトで rockyou.txt が指定されているので省略できる。
./cracker vnclowpot.log
2018/08/23 23:59:21 Read 81 handshakes from v.log 2018/08/23 23:59:21 Attempting to crack 81 handshakes 2018/08/23 23:59:21 FOUND $vnc$*00000000000000000000000000000000*8BD03CDB308F55258BD03CDB308F5525:princess 2018/08/23 23:59:21 FOUND $vnc$*00000000000000000000000000000000*F167F128C29C13F7F167F128C29C13F7:nicole 2018/08/23 23:59:21 FOUND $vnc$*00000000000000000000000000000000*6D391AF0C33D01846D391AF0C33D0184:ashley 2018/08/23 23:59:21 FOUND $vnc$*00000000000000000000000000000000*15902C6D10CED25815902C6D10CED258:joshua (snip) 2018/08/23 23:59:33 FOUND $vnc$*00000000000000000000000000000000*4F1E995B67632F8D4F1E995B67632F8D:bariga 2018/08/23 23:59:49 FOUND $vnc$*00000000000000000000000000000000*41DFAE0516ED40D241DFAE0516ED40D2:pian 2018/08/24 00:00:10 FOUND $vnc$*00000000000000000000000000000000*836FF0E9BACFC18A836FF0E9BACFC18A:gegcbr 2018/08/24 00:00:44 FOUND $vnc$*00000000000000000000000000000000*4D593A20654A32A44D593A20654A32A4:1q3e5t2w 2018/08/24 00:00:53 Found passwords for 54/81 handshakes
上記のような感じで平文のパスワードが取得できた。 総件数とパスワード取得成功件数に差があるのは、ハッシュ値を復元できなかったか、重複したハッシュ値をスキップしたため。
ログ解析
復元できたハッシュ値とパスワード
上記の方法でこれまで約1ヶ月ほどで検知してきた vnclowpot.log からパスワードを復元してみた。 ハッシュ値で集計して件数が多かったもの上位30件を復元したところ、 28件のパスワード復元に成功した。
結果は以下の表の通り。よくありがちなパスワードもあるが 「1」や「princess」などはあまり見ないものも含まれていた。 VNC のパスワードは8文字までという制限があるらしく、 そういう意味で「princess」はちょうど8文字で使われやすいものなのかも。
# | Hash | Password | Count |
---|---|---|---|
1 | 5C97423C7F4FC80A5C97423C7F4FC80A |
P@ssword | 152 |
2 | D94BB74798A107C7D94BB74798A107C7 |
Password | 120 |
3 | FF97502E9422F089FF97502E9422F089 |
password | 93 |
4 | D29F6E7F0456F8DED29F6E7F0456F8DE |
12345678 | 75 |
5 | E56458A7B0DC568AE56458A7B0DC568A |
P@ssw0rd | 75 |
6 | 587029A8254FAA2B587029A8254FAA2B |
administ | 57 |
7 | 227D501DF1BF8456227D501DF1BF8456 |
Passw0rd | 45 |
8 | 3D237A19965ABE973D237A19965ABE97 |
123456 | 41 |
9 | 9AEC969A3C3468C59AEC969A3C3468C5 |
1q2w3e4r | 40 |
10 | DB6C002A7CCA479FDB6C002A7CCA479F |
1 | 33 |
11 | BD76EA55421504DEBD76EA55421504DE |
P@$$w0rd | 32 |
12 | 3CC8A06F2A41BCA73CC8A06F2A41BCA7 |
Pa$$w0rd | 30 |
13 | 9134BAD2D134A6389134BAD2D134A638 |
Administ | 30 |
14 | C686B48801459509C686B48801459509 |
p@ssw0rd | 29 |
15 | 75E2F6CFCFAA6D1B75E2F6CFCFAA6D1B |
passw0rd | 24 |
16 | 6770889C612E9F276770889C612E9F27 |
1234 | 22 |
17 | 7B9511ECB4102AF77B9511ECB4102AF7 |
123 | 21 |
18 | 31FC1A8360CAFE2231FC1A8360CAFE22 |
12345 | 20 |
19 | 35E0B202442EBFCA35E0B202442EBFCA |
P@55w0rd | 19 |
20 | 8BD03CDB308F55258BD03CDB308F5525 |
princess | 19 |
21 | D70AF1BB49C36845D70AF1BB49C36845 |
1234567 | 19 |
22 | 55A5BF699DC2C69855A5BF699DC2C698 |
1qaz2wsx | 18 |
23 | AD07C77E6FB1013AAD07C77E6FB1013A |
P@$$word | 18 |
24 | CD3CF4715B60D59CCD3CF4715B60D59C |
qwertyui | 18 |
25 | D8436A7084EE537BD8436A7084EE537B |
admin123 | 18 |
26 | D92E114D880D3679D92E114D880D3679 |
qwerty12 | 18 |
27 | 0B6864AEA9CFBEC60B6864AEA9CFBEC6 |
pa$$word | 17 |
28 | 6A9AFB57E01E30A26A9AFB57E01E30A2 |
111111 | 17 |
復元できなかったハッシュ値
復元できなかったハッシュ値は以下通り。
Hash | Count |
---|---|
C2707E9F62321212C2707E9F62321212 |
34 |
C6855D06EBD7F96BC6855D06EBD7F96B |
19 |
Cracker の挙動について(補足)
数万件の生ログに対して Cracker を実行したところ、処理が進むほどに遅くなっていった。 処理を中断して結果を確認したところ、元のログではハッシュ値の重複があったにも関わらず、出力されているパスワードはすべて重複していなかった。 どうやら Cracker は単純に1行ずつ処理しているのではなく、既に処理した内容を保持して重複するものは出力しないように設計されているようだった。 (ソースコードを追っての確認まではしていない。)
パスワード件数を集計するには、まずハッシュ値ベースで集計をした後、 Cracker を使ってハッシュ値からパスワードを復元して紐付けるなどする必要があった。