罠を仕掛けて侵入者を煽ってみよう
前回の記事でcowrieのハニーポットを設置して攻撃者を観察し始めた。しかし眺めているだけでは物足りない。どうせなら罠をもっと巧妙にして、攻撃者をより深く引き込んでみたい。そう思い立って色々と仕掛けを追加した。
新しい攻撃者たちが来た
1日サーバーを放置していたら新顔が増えていた。
sudo grep -a "New connection" /home/cowrie/cowrie/var/log/cowrie/cowrie.log | \
grep -a -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | \
sort | uniq -c | sort -rn
| 回数 | IP | 場所 | 組織 |
|---|---|---|---|
| 163回 | 89.167.108.250 | Helsinki 🇫🇮 | Hetzner |
| 89回 | 138.197.182.192 | Frankfurt 🇩🇪 | DigitalOcean |
| 25回 | 91.202.233.33 | St.Petersburg 🇷🇺 | PROSPERO OOO |
| 25回 | 176.120.22.47 | St.Petersburg 🇷🇺 | Proton66 OOO |
| 8回 | 193.32.162.151 | Timișoara 🇷🇴 | UNMANAGED LTD |
ロシアが新登場。 しかも同じサンクトペテルブルクから2つの組織が来ている。前回ブロックしたルーマニアのUNMANAGED LTDは別のIPで懲りずに来ていた。
試されたパスワードも進化していた。シンガポールのDigitalOceanは passw0rd、P@ssw0rd、P@ssword と微妙に変えながら試してきた。o を 0 に変えたり @ を入れたりして検知を回避しようとするテクニックだ。また firedancer(Solanaのバリデータークライアント)や bsc(Binance Smart Chain)など暗号資産関連のパスワードも引き続き来ている。
userdb.txtに罠を追加
前回 etc/userdb.txt を作成して特定のパスワードでログインできるようにした。しかし新しい攻撃者はそのリストに載っていないパスワードを使うのでCMDが記録されなかった。
実際に試されたパスワードをリストに追加して罠を強化した。
vim etc/userdb.txt
root:dogecoin
root:trade
root:bot123
root:telegramapi
root:solana
root:ethereum
root:btc
root:Aa123456
root:12345
firedancer:firedancer
root:123123
ubnt:ubnt
これで攻撃者がこれらのパスワードを試すと偽の環境に「侵入」できる。CMDとして何をしようとしているか全部記録される。
追記:フォーマットの修正
しかし上記の設定では実際にはCMDが記録されなかった。原因を調査したところ、userdb.txtのフォーマットが間違っていたことが判明した。
cowrieは各行を:で3つのフィールドに分割して読み込む。
ユーザー名:x:パスワード
root:dogecoinのように2フィールドだとパスワードのフィールド(index 2)が存在せずスキップされていた。正しくは以下の通り:
root:x:dogecoin
root:x:trade
root:x:bot123
root:x:telegramapi
root:x:solana
root:x:ethereum
root:x:btc
root:x:Aa123456
root:x:12345
firedancer:x:firedancer
root:x:123123
ubnt:x:ubnt
修正後にcowrieを再起動して設定を反映した。
sudo systemctl restart cowrie
honeyfsに偽ファイルを仕込む
cowrieには honeyfs という偽のファイルシステムがある。攻撃者がログイン後に ls や cat で見るファイルをここで管理できる。
ls honeyfs/
# etc proc
デフォルトでは etc と proc しかない。ここに攻撃者が飛びつきそうなファイルを追加した。
mkdir -p honeyfs/root
echo "bitcoin_wallet_backup_2024" > honeyfs/root/wallet.dat
echo "private_key=5KJvsngHeMpm884wtkJNzQGaCErckhHJBGFsvd3VyK5qMZXj3hS" > honeyfs/root/credentials.txt
echo "server=prod-db01\nuser=admin\npassword=Sup3rS3cr3t!" > honeyfs/root/db_config.txt
攻撃者がログインして ls を打つと wallet.dat、credentials.txt、db_config.txt が見える。cat credentials.txt すると偽の秘密鍵が表示される。全部偽物だが攻撃者はわからない。
ufwとiptables-persistentの競合問題
ここで予期しない問題が発覚した。sudo ufw status を実行するたびに command not found になる。何度インストールしても消える。
原因を調べると apt のログに答えがあった。
cat /var/log/apt/history.log | tail -30
Install: iptables-persistent (1.0.20)
Remove: ufw (0.36.2-6)
...
Install: ufw (0.36.2-6)
Remove: iptables-persistent (1.0.20)
ufw と iptables-persistent が競合していて、片方をインストールすると自動的にもう片方が削除されていた。 交互にインストールするたびに交互に消えていたわけだ。完全にシングルスレッド問題だった。
解決策はどちらか一方に統一することだ。ufw の方が使いやすいので ufw に統一した。iptablesで追加していたサブネットブロックをufwのルールに移行した。
sudo apt remove -y iptables-persistent netfilter-persistent
sudo ufw deny from 43.110.36.191 to any
sudo ufw deny from 2.57.122.0/24 to any
sudo ufw deny from 92.118.39.0/24 to any
sudo ufw deny from 45.148.10.0/24 to any
sudo ufw status
Status: active
To Action From
-- ------ ----
XXXX/tcp ALLOW Anywhere
XX/tcp ALLOW Anywhere
Anywhere DENY 43.110.36.191
Anywhere DENY 2.57.122.0/24
Anywhere DENY 92.118.39.0/24
Anywhere DENY 45.148.10.0/24
これでufwだけで一元管理できるようになった。もう勝手に消えることはない。
現在の状況
罠の準備は整った。攻撃者がuserdb.txtに書いたパスワードで来たときにログインさせてhoneyfsの偽ファイルを見せる。cat wallet.dat や cat credentials.txt を実行した瞬間がCMDとして記録される。
あとはCMDが来るのを待つだけだ。