ハニーポット ADBHoney に捕らわれてみた

なおです。
この記事は、Honeypot Advent Calendar 2018 の 9 日目の記事です。

adventar.org

今回は ADBHoney という、adb (Android Debug Bridge) をエミュレートする低対話型ハニーポットの話です。

SSHTelnet、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 搭載のテレビなどで使用することができます。

Android Debug Bridge

ADBHoney とは

github.com

冒頭でも説明したように 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.pynohup で実行するだけです。

$ 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 に捕らわれてみる

検証中の画面はこんな感じです。

ADBHoney

接続

まずは adb コマンドで ADBHoney に接続してみます。

  • 攻撃者側

    adb connect

  • ADBHoney のログ

    adb connect log

うまく接続できているようです。念の為、攻撃者側で端末を正しく認識しているか確認します。

adb devices

こちらも正しく認識されていることを確認できました。どうやら ADBHoney は Samsung の Galaxy S9 SM-G960F だと表示されるようです。しかしながら現状の ADBHoney は端末名が固定となっているので、ハニーポットであることがすぐにバレてしまうと思います。実際にインターネットに公開して攻撃ログを収集する際は、ソースコードを書き換えてデバイス名をランダムで表示するようにしたほうが良いかもしれません。

シェルコマンド

次に実際の adb と比較して、ADBHoney がどのような挙動をするか試してみました。結論から言うと README にも書いてありますが、ADBHoney は開発が始まってからまだかなり日が浅くデバッグビルドの状態のため、ほとんど adb の再現はできていません。ではどんなログを収集することが可能なのか次で解説していきます。

adb connect

adb connect による接続は上述の通り、正常に接続ができ、ログにもセッションの開始が記録されます。

adb shell

adb shell については、adb shell pm list packagesadb shell ls など試してみましたが、レスポンスが帰ってくることはありませんでした。いろいろ試した結果、レスポンスは返さず shell 以降の入力文字列をログに保存するという挙動のようです。

以下は試したコマンドのログの一部です。

  • 攻撃者側

    adb shell

  • ADBHoney のログ

    adb 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 を狙った攻撃が悪用する脆弱性については以下の記事が参考になります。ぜひ読んでみてください。


  1. ここでいうクライアントとは、エミュレートの対象がクライアント端末という意味であり、クライアント側ハニーポットという意味ではありません。