ブルートフォースアタックってなんか強そう

Blog Single

最近、隣に住むおじさんがあいみょんの曲を弾き語りしていて微笑ましい限りです。高橋です。
先日、個人で運用しているVPSが攻撃を受けました。
攻撃と言っても、損害が出たわけではないのですが、セキュリティに関して無知であることを思い知ったので、この機会に調べてみました。
今回は主にパスワードクラックに関するものとなっています。

ブルートフォースアタック

ブルートフォースアタックとは総当たり攻撃ともいい、次のようなものです。

暗号や暗証番号などで、理論的にありうるパターン全てを入力し解読する暗号解読法。
引用:総当たり攻撃 – Wikipedia

例えば、銀行のキャッシュカードの暗証番号は一般的には4桁で、時間的な制約がない限りは0000から9999までを入力することで、確実に正解に行き着くことができます。(実際には、連続失敗で取引できなくなると思いますが)

ユーザー側の対策としては、パスワードに使用する文字の種類や桁数を増やすことが言われていますが、コンピューターの性能も上がっているためどれほど効果があるか定かではありません。それでも強固に越したことはないと思います。

辞書攻撃

ブルートフォースアタックに類似する暗号解読法として辞書攻撃があります。
辞書攻撃はパスワードを調べたり、スパムメールの送信先のメールアドレスを決める際に用いる手法で、
人間が発想するパスワードがワンパターンであることからよく使われるパスワードを「辞書」的に登録し、攻撃に利用します。
ブルートフォースアタックと比較して確実性は無くなりますが、短時間で正解に行き着くことができると言われています。

先日、セキュリティ企業のSplashDataが「The Top 100 Worst Passwords of 2018」を発表したそうですが、
SplashDataによると北米と西欧のユーザーの10%がワースト25のパスワードの少なくとも1つを使っているそうです。
このワースト25のパスワードを辞書的に登録して攻撃すれば、10回に1回に正解に行き着ける計算になります。

パスワードとは関係ないのですが、自分が受けた攻撃もこの辞書攻撃にあたります。
以下のようなエラーログが1日に数百行溜まり続けています。

2019/01/16 11:14:17 [error] 5698#5698: *269459 open() "/usr/share/nginx/html/wp-config.php" failed (2: No such file or directory), server: localhost, request: "GET /wp-config.php HTTP/1.1"
2019/01/16 11:14:52 [error] 5698#5698: *269473 open() "/usr/share/nginx/html/test.php" failed (2: No such file or directory), server: localhost, request: "POST /test.php HTTP/1.1"
2019/01/16 11:14:54 [error] 5698#5698: *269473 open() "/usr/share/nginx/html/conf1g.php" failed (2: No such file or directory), server: localhost, request: "POST /conf1g.php HTTP/1.1"
2019/01/16 11:14:54 [error] 5698#5698: *269473 open() "/usr/share/nginx/html/confg.php" failed (2: No such file or directory), server: localhost, request: "POST /confg.php HTTP/1.1"
2019/01/16 11:15:31 [error] 5698#5698: *269487 open() "/usr/share/nginx/html/phpmyadmin/index.php" failed (2: No such file or directory), server: localhost, request: "GET /phpmyadmin/index.php HTTP/1.1"
2019/01/16 11:15:31 [error] 5698#5698: *269487 open() "/usr/share/nginx/html/phpMyAdmin/index.php" failed (2: No such file or directory), server: localhost, request: "GET /phpMyAdmin/index.php HTTP/1.1"
2019/01/16 11:15:48 [error] 5698#5698: *269514 open() "/usr/share/nginx/html/mysql/admin/index.php" failed (2: No such file or directory), server: localhost, request: "GET /mysql/admin/index.php HTTP/1.1"
2019/01/16 11:15:49 [error] 5698#5698: *269514 open() "/usr/share/nginx/html/mysql/dbadmin/index.php" failed (2: No such file or directory), server: localhost, request: "GET /mysql/dbadmin/index.php HTTP/1.1"
2019/01/16 11:15:49 [error] 5698#5698: *269514 open() "/usr/share/nginx/html/mysql/sqlmanager/index.php" failed (2: No such file or directory), server: localhost, request: "GET /mysql/sqlmanager/index.php HTTP/1.1"

これは有りがちなファイル名を辞書登録してしらみつぶしにアクセスすることで脆弱性があるファイルを探しているものと思われます。
複数のIPアドレスから攻撃を受けましたが、多くのリクエストが似通っていることから辞書ファイルや辞書攻撃のためのツールが出回っているのではないかと思っています。また、そのIPアドレスを検索すると全て海外からのアクセスで、半分以上が中国に割り当てられていました。サービスによっては日本からのアクセスのみ許可する設定で対処できるかもしれません。

リバースブルートフォースアタック

上記の2種類は、入力に連続で失敗した際にアカウントをロックし、ログインできないようにすることで対応が可能となっています。
一方、このリバースブルートフォースアタックは、パスワードを固定し、辞書登録されたIDを試していく手法となっています。
アカウントロックは同じIDでパスワードの入力を連続で失敗した際にかかるものなので、この攻撃の対策としては無意味であると言えます。

まとめ

今回はパスワードクラックを中心にセキュリティについて調べてみました。
利用者としては、なるべく強固なパスワードを使用し、使い回しをせず、定期的に変更することが必要であると感じました。
提供者としては、パスワードの入力回数の上限を設定し、定期的な変更を促す仕組みや場合によっては二段階認証や本人認証などを検討するしてもいいのかなと感じました。

参考

心無い冗談を愛するエンジニア。音楽とサッカーが好きです。

Other Posts: