この記事は、Honeypot Advent Calendar 2018 の 9 日目の記事です。
今回は ADBHoney という、adb (Android Debug Bridge) をエミュレートする低対話型ハニーポットの話です。
SSH や Telnet、HTTP といったサーバをエミュレートするハニーポットは運用した経験があったのですが、Android のようなクライアント側をエミュレートする1ハニーポットは触ったことがありませんでした。そこで実際に、ADBHoney を手元の環境に導入し、攻撃者目線でどのような挙動をするのか調べてみました。
ADBHoney について
adb (Android Debug Bridge) とは
adb とは Android Debug Bridge の略で、主に Android 端末のデバッグに使用されるコマンドラインツールです。
adb を使用することで、PC から Android 端末に対して以下のような操作を行うことができます。
- アプリケーションのインストール
- ファイルの送受信
- シェルコマンドの発行
- activity manager の呼び出し
- package manager の呼び出し
- スクリーンショット撮影
- 画面の録画
これらは Android 端末と PC を USB で接続するほか、ネットワーク経由でも接続することができます。また、実機の Android 携帯端末以外にも、エミュレータや Android 搭載のテレビなどで使用することができます。
ADBHoney とは
冒頭でも説明したように ADBHoney は adb をエミュレートするハニーポットで、Python で記述されています。Github の README では次のように紹介されています。
以下、日本語訳 (抜粋) です。
このプロジェクトの目的は、攻撃者が意図せず adb の 5555 番ポートを公開している被害者に対して、感染を試みたマルウェアを捕らえるように設計された低対話型ハニーポットを提供することです。
今すぐに ADBHoney に対して adb で接続し、ファイルのアップロードやシェルに入ることが可能です。すべてのデータは標準出力にリダイレクトされ、ファイルはディスクに保存されます。
より高度なコマンド (ネイティブディレクトの表示やインタラクティブなシェルなど) は動作しません。理由は、このようなメカニズムを利用するマルウェアが見つかっていないからです。
ファイルの数は 2 つと少なく、ずいぶんとシンプルな設計でした。残念ながら Android のシェルを高度に再現しているというわけではなさそうです。
環境構築
ADBHoney がどのようなものかは分かりました。次は実際の挙動を調べるためにインストールを行います。
- インストール時の環境
$ cat /etc/os-release | head -n 2 NAME="Ubuntu" VERSION="18.04.1 LTS (Bionic Beaver)" $ uname -a Linux adbhoney 4.15.0-42-generic #45-Ubuntu SMP Thu Nov 15 19:32:57 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
ADBHoney のインストール
ADBHoney のインストールといっても、Python の 2 系をインストールし ADBHoney を Github から clone するだけです。
$ sudo apt update $ sudo apt upgrade $ sudo apt dist-upgrade $ sudo apt autoremove $ sudo apt install python $ python -V Python 2.7.15rc1 $ git clone https://github.com/huuck/ADBHoney.git $ cd ADBHoney $ python main.py --version main.py version 1.00
ADBHoney の使用方法は main.py
を nohup
で実行するだけです。
$ nohup python main.py &
ADBHoney のアクセスログは nohup.out
ファイルに保存されます。
adb のインストール
攻撃者側の環境として adb
コマンドを使用します。
こちらの環境は、Ubuntu 16.04.5 LTS (Xenial Xerus)
、カーネルは 4.4.0-140-generic
となっています。
$ sudo apt install android-tools-adb $ adb version Android Debug Bridge version 1.0.32
ADBHoney に捕らわれてみる
検証中の画面はこんな感じです。
接続
まずは adb
コマンドで ADBHoney に接続してみます。
うまく接続できているようです。念の為、攻撃者側で端末を正しく認識しているか確認します。
こちらも正しく認識されていることを確認できました。どうやら ADBHoney は Samsung の Galaxy S9 SM-G960F だと表示されるようです。しかしながら現状の ADBHoney は端末名が固定となっているので、ハニーポットであることがすぐにバレてしまうと思います。実際にインターネットに公開して攻撃ログを収集する際は、ソースコードを書き換えてデバイス名をランダムで表示するようにしたほうが良いかもしれません。
シェルコマンド
次に実際の adb と比較して、ADBHoney がどのような挙動をするか試してみました。結論から言うと README にも書いてありますが、ADBHoney は開発が始まってからまだかなり日が浅くデバッグビルドの状態のため、ほとんど adb の再現はできていません。ではどんなログを収集することが可能なのか次で解説していきます。
adb connect
adb connect
による接続は上述の通り、正常に接続ができ、ログにもセッションの開始が記録されます。
adb shell
adb shell
については、adb shell pm list packages
や adb shell ls
など試してみましたが、レスポンスが帰ってくることはありませんでした。いろいろ試した結果、レスポンスは返さず shell
以降の入力文字列をログに保存するという挙動のようです。
以下は試したコマンドのログの一部です。
本当はいろいろなコマンドの挙動を比較してみたかったのですが、すべて入力文字列を保存するだけだったのでこれ以上深掘りすることができませんでした。
また上述のようにデバイス名をランダムで返すようにしたとしても、この挙動ではすぐにハニーポットであることがバレてしまいます。こればっかりは今後のアップデートに期待しましょう。笑
adb push
adb push
ではプッシュしたファイルを /path/to/ADBHoney/dl/
に保存するようなのですが、手元の環境ではエラーとなってしまい保存することができませんでした。
nmap をかけてみる
ADBHoeny に対してネットワークスキャンツールである Nmap をかけた場合に、どのような結果になるのか気になったため試してみました。
- nmap の結果
$ sudo nmap -sS -n -p 5555 -A -oN adbhoney.nmap 192.168.10.139 # Nmap 7.01 scan initiated Sat Dec 8 03:03:07 2018 as: nmap -sS -n -p 5555 -A -oN adbhoney.nmap 192.168.10.139 Nmap scan report for 192.168.10.139 Host is up (0.00083s latency). PORT STATE SERVICE VERSION 5555/tcp open freeciv? MAC Address: 08:00:27:7C:08:F5 (Oracle VirtualBox virtual NIC) Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port Device type: general purpose Running: Linux 3.X|4.X OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4 OS details: Linux 3.2 - 4.0 Network Distance: 1 hop TRACEROUTE HOP RTT ADDRESS 1 0.83 ms 192.168.10.139 OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Sat Dec 8 03:05:03 2018 -- 1 IP address (1 host up) scanned in 115.98 seconds
- ADBHoney のログ
$ tail -f nohup.out Listening on 0.0.0.0:5555. 2018-12-07T18:03:09.094006Z 192.168.10.130 connection start (f5f5fa359344) 2018-12-07T18:03:20.108856Z 192.168.10.130 error('unpack requires a string argument of length 4',) : '\r\n\r\n' 2018-12-07T18:03:20.110168Z 192.168.10.130 connection closed (f5f5fa359344) 2018-12-07T18:03:20.110951Z 192.168.10.130 connection start (a245657704b8) 2018-12-07T18:03:25.122831Z 192.168.10.130 connection start (7c7f8057e491) 2018-12-07T18:03:30.134221Z 192.168.10.130 connection start (77899a1fecd7) 2018-12-07T18:03:35.142220Z 192.168.10.130 connection start (1ed9e6e3e362) 2018-12-07T18:03:40.162426Z 192.168.10.130 connection start (34c2b846b0bc) 2018-12-07T18:03:45.158562Z 192.168.10.130 connection start (78e53f2f77d7) 2018-12-07T18:03:50.169018Z 192.168.10.130 connection start (e7d9c71408db) 2018-12-07T18:03:50.190169Z 192.168.10.130 error('unpack requires a string argument of length 4',) : '\x00\x0c\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2018-12-07T18:03:50.190214Z 192.168.10.130 connection closed (e7d9c71408db) 2018-12-07T18:03:50.223037Z 192.168.10.130 connection start (67f5a47951cc) 2018-12-07T18:03:57.730490Z 192.168.10.130 error('unpack requires a string argument of length 4',) : 'HELP\r\n' 2018-12-07T18:03:57.730596Z 192.168.10.130 connection closed (67f5a47951cc) 2018-12-07T18:03:57.743361Z 192.168.10.130 connection start (aea2d5957df9) 2018-12-07T18:03:57.743524Z 192.168.10.130 OverflowError('signed integer is greater than maximum',) : '\x16\x03\x00\x00S\x01\x00\x00O\x03\x00?G\xd7\xf7\xba' 2018-12-07T18:03:57.743553Z 192.168.10.130 connection closed (aea2d5957df9) 2018-12-07T18:03:57.783572Z 192.168.10.130 connection start (a32005dbec77) 2018-12-07T18:04:02.782577Z 192.168.10.130 connection start (5650de11417f) 2018-12-07T18:04:02.794231Z 192.168.10.130 OverflowError('signed integer is greater than maximum',) : '\x00\x00\x00qj\x81n0\x81k\xa1\x03\x02\x01\x05\xa2' 2018-12-07T18:04:02.794281Z 192.168.10.130 connection closed (5650de11417f) 2018-12-07T18:04:02.827852Z 192.168.10.130 connection start (3781c1f131bf) 2018-12-07T18:04:07.800591Z 192.168.10.130 error('unpack requires a string argument of length 4',) : 'l\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00' 2018-12-07T18:04:07.801252Z 192.168.10.130 connection closed (3781c1f131bf) 2018-12-07T18:04:07.850510Z 192.168.10.130 connection start (e91458ea2fbb) 2018-12-07T18:04:12.834326Z 192.168.10.130 connection start (63e51907c727) 2018-12-07T18:04:17.826305Z 192.168.10.130 error('unpack requires a string argument of length 4',) : '\x01default\n' 2018-12-07T18:04:17.826442Z 192.168.10.130 connection closed (63e51907c727) 2018-12-07T18:04:17.851633Z 192.168.10.130 connection start (2b9450502b8c) 2018-12-07T18:04:17.878626Z 192.168.10.130 error('unpack requires a string argument of length 4',) : '0\x0c\x02\x01\x01`\x07\x02\x01\x02\x04\x00\x80\x00' 2018-12-07T18:04:17.878699Z 192.168.10.130 connection closed (2b9450502b8c) 2018-12-07T18:04:17.909633Z 192.168.10.130 connection start (06262523d8be) 2018-12-07T18:04:25.442406Z 192.168.10.130 connection start (bc1373d3e956) 2018-12-07T18:04:30.446742Z 192.168.10.130 connection start (e047bb3c898e) 2018-12-07T18:04:35.426259Z 192.168.10.130 error('unpack requires a string argument of length 4',) : '\x03\x00\x00\x0b\x06\xe0\x00\x00\x00\x00\x00' 2018-12-07T18:04:35.426330Z 192.168.10.130 connection closed (e047bb3c898e) 2018-12-07T18:04:35.466832Z 192.168.10.130 connection start (5f8e7cfa1b2b) 2018-12-07T18:04:35.502972Z 192.168.10.130 connection closed (5f8e7cfa1b2b) 2018-12-07T18:04:35.570245Z 192.168.10.130 connection start (50a3cf0cd8f3) 2018-12-07T18:04:40.538667Z 192.168.10.130 connection start (ae142988bf2d) 2018-12-07T18:04:45.574348Z 192.168.10.130 connection start (20b6fcefb858) 2018-12-07T18:04:50.606403Z 192.168.10.130 connection start (8288c5b6ba1e) 2018-12-07T18:04:55.558684Z 192.168.10.130 connection closed (8288c5b6ba1e) 2018-12-07T18:04:55.606763Z 192.168.10.130 connection start (c66f1efce786) 2018-12-07T18:05:00.537623Z 192.168.10.130 error('unpack requires a string argument of length 4',) : '\x94\x00\xcd\xef\xd1a\x91\x03' 2018-12-07T18:05:00.537757Z 192.168.10.130 connection closed (c66f1efce786) 2018-12-07T18:05:02.454458Z 192.168.10.130 connection start (c3153f42db5b)
当たり前ですが、adb の 5555 番がオープンポートであることは確認できました。しかしながら、adb だとは認識されなかったようです。
おわりに
今回は ADBHoney に捕らわれるということで、ADBHoney の挙動について簡単に調べてみました。実際にインターネット上に公開してログを収集するといったことはまだできていないため、今後時間があればやってみたいと思っています。
また adb を狙った攻撃や、adb を狙った攻撃が悪用する脆弱性については以下の記事が参考になります。ぜひ読んでみてください。