Honeypotとは :
Honeypotは、攻撃者がシステムへの侵入を試みた際に攻撃を検出し記録するものです。
ここで扱うHoneypotはSSH Honeypotです。
前置き
この記事は、私が以前公開した「SSH Honeypotを30日間実環境で運用した結果」についての記事の続編です。前回の記事は話題になり、多数の問い合わせを頂き、このSSH Honeypotの設定方法を示してほしいとの要望がありました。
前回の記事 :
Sofianeのブログ - 30日間SSH Honeypotを運用した結果
要件
特別な事前設定なしの通常のVPS上にセットアップします。
[!重要]
このセットアップは研究・テスト目的です。ローカルネットワークや個人・業務利用ネットワークに設定しないでください。
VPS
ご自身に最適なVPSプロバイダーを選択してください。
Cowrie Honeypot
有名なSSH Honeypotはいくつかありますが、ここで使用するのは Cowrieというものです。
これは有名なHoneypot「Kippo」の改良版です。
Docker
インストールにはCowrieのDockerイメージを使用します。
そのため、新規VPSにdockerがインストールされている必要があります。インストール方法は公式Dockerドキュメントをご参照ください。
インストールするパッケージ
- python3
- wget
設定
私は通常、サーバーやマシンのデフォルトSSHポートを変更しています。
一例として、実際のSSHポートを2022などに設定し、HoneypotはデフォルトSSHポート22でリッスンさせる方法を好みます。
インストール
Cowrieはデフォルトでポート2222をリッスンする設定です。Dockerコンテナ内のこのポートをホストの22番ポートにマッピングします。こうすることで、スキャンBotや攻撃者をシームレスに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>
入力例と出力例:
> 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ドキュメントをご覧ください。
ディスカッション
コメントを残す
ゲストコメントはサイトに表示される前に審査されます。
まだコメントはありません。最初のコメントを残してディスカッションを始めましょう!