setodaNote

忘れる用のメモ書き

Cowrie に dmidecode コマンドを追加した話

背景

Cowrie が拾ったコマンドであまり見覚えのないコマンドがあったのでログを確認していたところ、 対応していないコマンドのようだった。 成功すれば寄ってくれるのではないか、ということでコマンドを追加してみた。

見覚えのないコマンドについて

今回の発端となった見慣れないコマンドは dmidecode というもの。 機器のハードウェア情報を取得するものらしく dmidecode | grep Vendor | head -n 1 という形で打ち込まれていた。 この結果で目的の環境かどうかを調査していた様子。

dmidecode を Cowrie に実装する

Cowrie のコマンドはすべて python によって擬似的に再現されている。 それらの python ファイルは cowrie 内の /home/cowrie/cowrie/cowrie/commands/ に格納されている。 デフォルトでは以下のようなファイルが格納されている。

adduser.py
apt.py
base.py
busybox.py
curl.py
dd.py
env.py
ethtool.py
free.py
fs.py
ftpget.py
gcc.py
ifconfig.py
__init__.py
iptables.py
last.py
ls.py
nc.py
netstat.py
nohup.py
perl.py
ping.py
python.py
scp.py
service.py
sleep.py
ssh.py
sudo.py
tar.py
tftp.py
ulimit.py
uname.py
uptime.py
wget.py
which.py

今回は base.py というファイルに追記する形で dmidecode を実装する。 base.py には whoami や ps など複数のコマンドが実装されている。 これを眺めてみるだけでもちょっと楽しい。

Cowrie の設定を変更するのに参考にしたサイト

Cowrie の設定変更手順は以下のサイトを参考にした。 とても分かりやすく、Cowrie 以外にも適用できる汎用的な手順が解説されている。

実装手順

base.py の取り出し

# docker exec -it cowrie sh
$ cp /home/cowrie/cowrie/cowrie/commands/base.py /home/cowrie/cowrie/log/
$ exit

commands ディレクトリを作成し移動

log に直接入れておくのは避けたいので。

# mkdir /data/cowrie/commands
# mv /data/cowrie/log/base.py /data/cowrie/commands/

base.py に dmidecode コマンドの処理を追記

単純に表示するだけであれば、以下のひな形で作成できる。

class command_コマンド名(HoneyPotCommand):
    """
    """
    def call(self):
        """
        """
        self.write(b"""# 表示したい内容を
改行そのまま
ここに記載する
だけでよい\n""")
commands['コマンド名'] = command_コマンド名

下記のような内容をファイル末尾の方に追記した。 出力部分は pastebin 方面から拾ったものを参考にした。

class command_dmidecode(HoneyPotCommand):
    """
    """
    def call(self):
        """
        """
        self.write(b"""# dmidecode 3.1
Getting SMBIOS data from sysfs.
SMBIOS 3.0.0 present.
Table at 0xDDBA4000.

(snip)

Handle 0x0055, DMI type 13, 22 bytes
BIOS Language Information
    Language Description Format: Long
    Installable Languages: 1
        en|US|iso8859-1
    Currently Installed Language: en|US|iso8859-1

Handle 0x0056, DMI type 127, 4 bytes
End Of Table\n""")
commands['dmidecode'] = command_dmidecode

T-Pot を停止

# systemctl stop tpot

tpot.ymlを変更

取り出したファイルが docker に配置されるように設定を追加する。

# vi /opt/tpot/etc/tpot.yml

(snip)
# Cowrie service
(snip)
    volumes:
     - /data/cowrie/downloads:/home/cowrie/cowrie/dl
     - /data/cowrie/keys:/home/cowrie/cowrie/etc
     - /data/cowrie/log:/home/cowrie/cowrie/log
     - /data/cowrie/log/tty:/home/cowrie/cowrie/log/tty
     - /data/cowrie/commands/base.py:/home/cowrie/cowrie/cowrie/commands/base.py #add

T-Pot を起動

# systemctl start tpot

動作確認

実際にハニーポットに port:22 などから ssh してログインし、 コマンドが動作するのか確認しておく。

$ dmidecode | grep Vendor | head -n 1 
    Vendor: **********************

感想

Cowrie のコマンドは python で実装されている。 今回のような単純に出力表示させるだけであればほとんどコピペで済む。 引数などがある場合についてもソースを読めばある程度の実装ができそう。 なにか気になるコマンドがあれば色々追加していくと楽しいかも。

なお、バナー表示やホスト名、uname や /proc/cpuinfo の内容なども割と簡単に変更ができるので、 デフォルトのままだとハニーポットっぽくて嫌だという場合は修正してみるのも楽しい。