攻撃者の動向から考察してみた
ひょんなことから、サーバーにハニーポット(Cowrie)を設置して1週間が経とうとしている。(経ったかも…) 最初は「どんな攻撃が来るのか見てみたい」という好奇心だったが、ログを眺めているうちにいくつか興味深いパターンが見えてきたので、今日はそれをまとめてみる。
ハニーポットとは
Cowrieは偽のSSHサーバーとして動作するハニーポットだ。攻撃者がSSHでログインしようとすると、本物のサーバーではなくCowrieに接続される。Cowrieはログインを「成功」させ、攻撃者がどんなコマンドを実行しようとするかをすべて記録する。実際には何も実行されないので安全だと思っている。本当に安全"安心"なのかは懐疑的です。
構成としては、外部からの22番ポートへの接続をiptablesでCowrieのポートにリダイレクトし、本物のSSHは別のポートで待ち受けている。
一日のログイン成功数
まずログイン成功数(Cowrie側)を確認してみた。
sudo cat /path/to/cowrie.json | \
jq -Rc 'try fromjson | select(.eventid == "cowrie.login.success") | .src_ip' | \
wc -l
今日一日だけで300回以上のログイン「成功」が記録されていた。これはすべてCowrieが意図的に通したもので、攻撃者は本物のシェルに入ったと思っている。
試されているパスワードの傾向
sudo cat /path/to/cowrie.json | \
jq -Rc 'try fromjson | select(.eventid == "cowrie.login.failed") | [.username, .password] | @tsv' | \
sort | uniq -c | sort -rn | head -20
試されているパスワードは驚くほど単純だ。上位を占めるのは以下のようなものばかり:
root/123,1234,12345,123456root/password,admin,qwertyadmin/admin,passworduser/1234,123456
これらはいわゆる辞書攻撃で、よく使われるパスワードのリストを上から順に試しているだけだ。逆に言えば、パスワードを少し複雑にするだけでこの手の攻撃はほぼ防げる。
ログイン後の行動パターン
ここからが本題だ。ログインに成功した後、攻撃者は何をするのか。あるIPのセッションを追跡してみた。
sudo cat /path/to/cowrie.json | \
jq -Rc 'try fromjson | select(.src_ip == "x.x.x.x") | {timestamp, eventid, input, session}'
このIPの行動は非常に特徴的だった。ログイン成功直後、毎回同じ長いコマンドを即座に実行して切断している。しかもセッションの滞在時間は1秒未満だ。
実行されているコマンドを要約すると:
# OS・アーキテクチャ・稼働時間を取得
uname -s -v -n -m
uname -m
# CPU情報を取得(複数の方法でフォールバック)
grep -m1 "model name" /proc/cpuinfo
lscpu
# GPU情報を取得
lspci | grep -i vga
lspci | grep -i nvidia
# ログイン履歴を取得
last | head -n 10
これは偵察フェーズのボットだ。自分で何かをするのではなく、「このサーバーは使えるか?」を判断するための情報を収集してC2サーバー(指令サーバー)に送っている。
特にGPU情報(lspci | grep nvidia)を収集しているのが興味深い。これはクリプトマイニングに使えるマシンかどうかを確認するためだと考えられる。NVIDIAのGPUがあれば次のフェーズ(マイナーの設置)に進み、なければ次のターゲットに移るのだろう。現在この点で、攻撃者に偽の情報を流せるようにファイルに少しずつ手を加えていっている。
定期的に来るIPの存在
ログイン成功ログを時系列で眺めていると、あるIPが一日中定期的に現れていることに気づいた。0時台、3時台、7時台、11時台、16時台、21時台と、ほぼ等間隔でアクセスしてくる。
これは明らかにcronジョブかなにかで自動化されたスキャンボットだ。世界中のサーバーを定期的に回り続けているのだろう。
Nginxへの攻撃も同様
SSHだけでなく、NginxへのWebアクセスにも同じような傾向が見られた。あるIPは一度に数十のパスをスキャンしてくる:
/wp-login.php
/wp-admin/
/.env
/cgi-bin/
/phpunit/phpunit/src/Util/PHP/eval-stdin.php
/vendor/phpunit/...
WordPressの管理画面、環境変数ファイル、PHPUnitの既知の脆弱性、cgi-binと、ありとあらゆる既知の攻撃ポイントを順番に叩いている。うちのサーバーにはWordPressもPHPUnitも存在しないのですべて404を返すだけだが、攻撃者はそれを知らずにスキャンし続ける。
対応
これらの攻撃に対して今日追加した対策:
fail2banにnginx-404ルールを追加
[nginx-404]
enabled = true
port = http,https
backend = auto
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 60
bantime = 3600
フィルター:
[Definition]
failregex = ^<HOST> .* "(GET|POST|HEAD).*" 404
ignoreregex =
60秒以内に5回404を返したIPを1時間バンする設定だ。さっそくフィルターのテストをしてみると、今日のアクセスログに対して1,265件マッチした。
まとめ
ハニーポットのログから見えてきたことをまとめると:
- 攻撃の大半は完全に自動化されており、人間が操作しているわけではない
- パスワードは信じられないほど単純なものしか試されていない。複雑なパスワードは最低限の防御として有効
- ログイン後の最初のアクションでボットの目的がわかる。GPU情報を収集するものはマイニングボット、特定のファイルを探すものはランサムウェアの偵察などが考えられる
- SSHとWebの両方から同時に攻撃してくるIPも存在する
セキュリティの勉強として始めたハニーポットだが、教科書では学べないリアルな攻撃の動向が観察できて面白い。引き続きログを眺めながら気づいたことをまとめていく予定だ。