罠を仕掛けて侵入者を煽ってみよう

前回の記事で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.250Helsinki 🇫🇮Hetzner
89回138.197.182.192Frankfurt 🇩🇪DigitalOcean
25回91.202.233.33St.Petersburg 🇷🇺PROSPERO OOO
25回176.120.22.47St.Petersburg 🇷🇺Proton66 OOO
8回193.32.162.151Timișoara 🇷🇴UNMANAGED LTD

ロシアが新登場。 しかも同じサンクトペテルブルクから2つの組織が来ている。前回ブロックしたルーマニアのUNMANAGED LTDは別のIPで懲りずに来ていた。

試されたパスワードも進化していた。シンガポールのDigitalOceanは passw0rdP@ssw0rdP@ssword と微妙に変えながら試してきた。o0 に変えたり @ を入れたりして検知を回避しようとするテクニックだ。また 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 という偽のファイルシステムがある。攻撃者がログイン後に lscat で見るファイルをここで管理できる。

ls honeyfs/
# etc  proc

デフォルトでは etcproc しかない。ここに攻撃者が飛びつきそうなファイルを追加した。

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.datcredentials.txtdb_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)

ufwiptables-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.datcat credentials.txt を実行した瞬間がCMDとして記録される。

あとはCMDが来るのを待つだけだ。