ハッカー対策:SSHハニーポットの構築方法

SSHハニーポットの設定方法を解説。攻撃者の認証情報やIPを記録する偽SSHサーバを構築し、リアルタイムでサイバー攻撃を検知・解析。脅威インテリジェンスと防御力を強化します。

Hack the Hacker - How to Setup an SSH Honeypot

Honeypotとは :

Honeypotは、攻撃者がシステムへの侵入を試みた際に攻撃を検出し記録するものです。

ここで扱うHoneypotはSSH Honeypotです。

前置き

この記事は、私が以前公開した「SSH Honeypotを30日間実環境で運用した結果」についての記事の続編です。前回の記事は話題になり、多数の問い合わせを頂き、このSSH Honeypotの設定方法を示してほしいとの要望がありました。

前回の記事 :

Hack the Hacker - How to Setup an SSH Honeypot

Sofianeのブログ - 30日間SSH Honeypotを運用した結果

r/CyberSecurity Reddit

YCombinator Hacker News

要件

特別な事前設定なしの通常のVPS上にセットアップします。

[!重要]
このセットアップは研究・テスト目的です。ローカルネットワークや個人・業務利用ネットワークに設定しないでください。

VPS

ご自身に最適なVPSプロバイダーを選択してください。

Cowrie Honeypot

有名なSSH Honeypotはいくつかありますが、ここで使用するのは Cowrieというものです。

これは有名なHoneypot「Kippo」の改良版です。

Hack the Hacker - How to Setup an SSH Honeypot

Docker

インストールにはCowrieのDockerイメージを使用します。

そのため、新規VPSにdockerがインストールされている必要があります。インストール方法は公式Dockerドキュメントをご参照ください。

Hack the Hacker - How to Setup an SSH Honeypot

インストールするパッケージ

  • python3
  • wget

設定

私は通常、サーバーやマシンのデフォルトSSHポートを変更しています。

一例として、実際のSSHポートを2022などに設定し、HoneypotはデフォルトSSHポート22でリッスンさせる方法を好みます。

インストール

Cowrieはデフォルトでポート2222をリッスンする設定です。Dockerコンテナ内のこのポートをホストの22番ポートにマッピングします。こうすることで、スキャンBotや攻撃者をシームレスにHoneypotに誘導できます。

Hack the Hacker - How to Setup an SSH Honeypot

cowrieユーザーの作成、設定、利用:

> sudo adduser --disabled-password cowrie #ユーザー追加
Adding user 'cowrie' ...
Adding new group 'cowrie' (1002) ...
Adding new user 'cowrie' (1002) with group 'cowrie' ...
Changing the user information for cowrie
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]

> sudo usermod -aG docker cowrie #cowrieをdockerグループに追加

> sudo su - cowrie #cowrieユーザーに切り替え

続ける前に、VPSのディレクトリ内にログを保存するフォルダを作成します。これによりコンテナ内部ではなく直接アクセス可能になります。

また、「cowrielog」および「cowrietty」フォルダに全員読み書き権限を設定します。

> mkdir cowrielog && mkdir cowrietty
> chmod -R a+rw cowrielog/ cowrietty/

Cowrie Honeypotを起動します:

> docker run --name cowrie -p 22:2222 -v /home/cowrie/cowrielog:/cowrie/cowrie-git/var/log/cowrie/ -v /home/cowrie/cowrietty:/cowrie/cowrie-git/var/lib/cowrie/tty cowrie/cowrie:latest
2024-06-17T14:47:28+0000 [-] Python Version 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0]
2024-06-17T14:47:28+0000 [-] Twisted Version 24.3.0
2024-06-17T14:47:28+0000 [-] Cowrie Version 2.5.0
2024-06-17T14:47:28+0000 [-] Loaded output engine: jsonlog
2024-06-17T14:47:28+0000 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 24.3.0 (/cowrie/cowrie-env/bin/python3 3.11.2) starting up.
2024-06-17T14:47:28+0000 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor.
2024-06-17T14:47:28+0000 [-] CowrieSSHFactory starting on 2222
2024-06-17T14:47:28+0000 [cowrie.ssh.factory.CowrieSSHFactory#info] Starting factory <cowrie.ssh.factory.CowrieSSHFactory object at 0x7c4c73951b10>
2024-06-17T14:47:28+0000 [-] Generating new RSA keypair...
2024-06-17T14:47:28+0000 [-] Generating new ECDSA keypair...
2024-06-17T14:47:28+0000 [-] Generating new ed25519 keypair...
2024-06-17T14:47:28+0000 [-] Ready to accept SSH connections

ログ解析

ログファイルは~/cowrielogに、ttyリプレイログは~/cowriettyにあります。

Linuxコマンドを使う

出力のフィルタリングや整理にはjqコマンドが便利です。このツールを使うとJSONデータから必要な情報を正確に抽出できます。

ログをJSONで扱うことには、構造化可読性扱いやすさ堅牢性可視化など多くの利点があり、現代のソフトウェア開発や運用に最適です。

すべてのログイン試行を取得するには:

> jq '.| select(.eventid | startswith("cowrie.login"))' cowrie.json

出力例:

{
  "eventid": "cowrie.login.failed",
  "username": "tserver",
  "password": "tserver",
  "message": "login attempt [tserver/tserver] failed",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:56:07.547278Z",
  "src_ip": "59.24.160.227",
  "session": "6530ab02251d"
}
{
  "eventid": "cowrie.login.failed",
  "username": "student02",
  "password": "student02",
  "message": "login attempt [student02/student02] failed",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:56:12.223248Z",
  "src_ip": "59.24.160.227",
  "session": "56b69171281c"
}
{
  "eventid": "cowrie.login.failed",
  "username": "vyos",
  "password": "vyos",
  "message": "login attempt [vyos/vyos] failed",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:56:16.560385Z",
  "src_ip": "59.24.160.227",
  "session": "c0fcc16bedfc"
}

成功したログイン試行を取得するには:

> jq '. | select(.eventid == "cowrie.login.success")' cowrie.json

出力例:

{
  "eventid": "cowrie.login.success",
  "username": "root",
  "password": "Passw0rd",
  "message": "login attempt [root/Passw0rd] succeeded",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:53:39.274245Z",
  "src_ip": "141.98.10.106",
  "session": "d5c5f7b97455"
}

失敗したログイン試行を取得するには:

> jq '. | select(.eventid == "cowrie.login.failed")' cowrie.json

出力例:

{
  "eventid": "cowrie.login.failed",
  "username": "vsftp",
  "password": "vsftp",
  "message": "login attempt [vsftp/vsftp] failed",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:55:55.663982Z",
  "src_ip": "59.24.160.227",
  "session": "164c6534c698"
}
{
  "eventid": "cowrie.login.failed",
  "username": "yangjie",
  "password": "yangjie",
  "message": "login attempt [yangjie/yangjie] failed",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:55:59.626399Z",
  "src_ip": "59.24.160.227",
  "session": "809749c9eba7"
}
{
  "eventid": "cowrie.login.failed",
  "username": "pedro",
  "password": "pedro",
  "message": "login attempt [pedro/pedro] failed",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:56:03.966702Z",
  "src_ip": "59.24.160.227",
  "session": "b9bee41ed3d2"
}

ログイン試行回数を取得するには:

> cat cowrie.json| grep "cowrie.login" | wc -l

12419

成功したログイン試行回数を取得するには:

> cat cowrie.json| grep "cowrie.login.success" | wc -l

379

失敗したログイン試行回数を取得するには:

> cat cowrie.json| grep "cowrie.login.failed" | wc -l

12040

ソースIPアドレスを取得するには:

> jq '.src_ip' cowrie.json

"141.98.10.106"
"141.98.10.106"
"141.98.10.106"
"141.98.10.106"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"

実行されたコマンドを確認する

ログファイルをフィルタリングして

> jq '. | select(.eventid == "cowrie.command.input")' cowrie.json

出力例:

{
  "eventid": "cowrie.command.input",
  "input": "cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "message": "CMD: cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:38:20.746663Z",
  "src_ip": "121.156.118.253",
  "session": "22e1e1e98a94"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "message": "CMD: cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:38:21.702641Z",
  "src_ip": "121.156.118.253",
  "session": "22e1e1e98a94"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "message": "CMD: cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:40:21.541909Z",
  "src_ip": "95.85.47.10",
  "session": "020967259efb"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "message": "CMD: cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:40:21.676392Z",
  "src_ip": "95.85.47.10",
  "session": "020967259efb"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "message": "CMD: cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:41:28.715153Z",
  "src_ip": "101.32.128.77",
  "session": "31d76f7f481c"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "message": "CMD: cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:41:29.412566Z",
  "src_ip": "101.32.128.77",
  "session": "31d76f7f481c"
}

Cowrie playlogでセッションログをリプレイして確認

playlogを使うと、ttyセッションの再生とその中で実行されたコマンドを確認できます。

> cd ~/cowrietty && wget https://raw.githubusercontent.com/cowrie/cowrie/master/src/cowrie/scripts/playlog.py

> python3 playlog.py <SESSION ID>

Hack the Hacker - How to Setup an SSH Honeypot

入力例と出力例:

> python3 playlog.py cc1eb03e9b5926d8076e25826664a04400de854bf5cc660fa35eb86cbdf7dc0f

cd ~ && rm -rf .ssh && mkdir .ssh && echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~

さらに詳しく?

Cowrieはログ監視ツールと連携可能です。設定・インストール方法は公式のCowrieドキュメントをご覧ください。

I just do cybersecurity stuff.

ディスカッション

コメントを残す

ゲストコメントはサイトに表示される前に審査されます。

まだコメントはありません。最初のコメントを残してディスカッションを始めましょう!

提案やバグの報告がありますか?お問い合わせください!