setodaNote

忘れる用のメモ書き

Vnclowpot のログ解析

背景

定期的に大量アクセスが来る 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 は以下のサイトなどから入手できる。

Passwords - SkullSecurity

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 を使ってハッシュ値からパスワードを復元して紐付けるなどする必要があった。