IoT 機器調査向けの Nmap オプション

なおです。

先日のブログ移行記事でも書いたように、最近は IoT 機器のリバースエンジニアリングペネトレーションテストを行っています。

まず調査を行いたい IoT 機器を入手したら、対象機器の正規の使用方法、製品仕様、実際の挙動等を調べるといった事前調査を行います。その後、主要なネットワーク調査ツールである Nmap を用いて、対象機器でどのようなサービスが動いているのかを調査し、その情報を足がかりにさらに詳細な解析を行うといった流れが一般的だと思います。

しかしながら、脆弱なサーバに対する Nmap のノウハウはインターネット上に多くの情報を見かけるのに対し、IoT 機器に対する Nmap の使い方やノウハウはあまり見かけません。そこで今回は、IoT 機器に対するネットワーク調査においてよく使う Nmap オプションをまとめてみました。

※注意
本記事の内容は犯罪行為を助長するものではありません。自身の管理下にあるサーバや機器以外には絶対に行わないようにしてください。

2018/10/29
「オプションの解説」の「その他」で解説している -Pn オプションの説明が誤っていたため、修正しました。

2018/11/01
UDP スキャンにかかる時間を短縮したい場合」および「充電しながら使用できない、かつ UDP スキャン中に充電がもたない場合」を追加しました。

記事作成時の環境

OS

Kali Linux

# uname -a
Linux kali 4.18.0-kali1-amd64 #1 SMP Debian 4.18.6-1kali1 (2018-09-10) x86_64 GNU/Linux

ネットワーク調査ツール

nmap

# nmap -v
Starting Nmap 7.70 ( https://nmap.org ) at 2018-11-01 21:26 JST
Read data files from: /usr/bin/../share/nmap
Nmap done: 0 IP addresses (0 hosts up) scanned in 0.07 seconds
           Raw packets sent: 0 (0B) | Rcvd: 0 (0B)

nmap の使用方法については、公式のドキュメントで非常に詳しく解説されています。実際に使用する場合は、そちらも合わせて参照することをオススメします。ちなみに、日本語訳された公式ドキュメントは更新が遅く情報が古いため、あまりオススメしません。

よく使う Nmap コマンド

ホストの検出

自身のサーバの不要なポートが開いていないかどうかといったことを調査する場合、調査対象の IP アドレスがわかっていることがほとんどだと思います。しかし、IoT 機器においては DHCP を利用しているかつ、割り当てられた IP アドレスを確認する画面がないなど、対象の IP アドレスがわからないことが多々あります。そのため、まず最初に対象機器の IP アドレスを調査します。

# nmap -sn -n -v -oA <OUT_FILE> <TARGET_NETWORK/SUBNET>

このとき、同一ネットワーク内に不要な機器を接続しないほうが、対象機器を判断しやすくなります。また自身の管理下にない IP アドレスに通信が発生しないように注意してください。

TCP ポートスキャン

TCP のすべてのポートに対して、TCP SYN スキャンを実行します。OS の検出、ソフトウェアのバージョンスキャン、スクリプトスキャン、traceroute も有効にしています。

# nmap -sS -n -p 1-65535 -A -v -oA <OUT_FILE> <TARGET_IP>

保存されるファイルは標準出力(.nmap)、Grep しやすい形式(.gnmap)、XML 形式(.xml)の 3 種類です。

UDP ポートスキャン

UDP のすべてのポートに対して、ポートスキャンを実行します。ソフトウェアのバージョンスキャン、スクリプトスキャン、traceroute が有効になっています。

# nmap -sU -n -p 1-65535 -A -v -oA <OUT_FILE> <TARGET_IP>

UDP スキャンにかかる時間を短縮したい場合

最初に -T4 オプションを使用して比較的高速なポートスキャンを行います。その後、オープンポートに対してのみバージョン検出やスクリプトスキャンといった詳細なスキャンを行います。

# nmap -sU -n -p 1-65535 -T4 -v -oA <OUT_FILE> <TARGET_IP>
# nmap -sU -n -p <OPEN_PORTS> -A -v -oA <OUT_FILE> <TARGET_IP>

-T4 オプションよりさらに早い -T5 オプションもありますが、結果の信頼性が犠牲になる場合があるようです。

対象機器が負荷に耐えられない場合

IoT 機器はその特性上、リソースが少ないことがよくあります。上記のポートスキャンで対象機器が落ちてしまう場合などは、-T2 オプションを付与することで負荷を軽減します。

# nmap -sS -n -p 1-65535 -A -T2 -v -oA <OUT_FILE> <TARGET_IP>
# nmap -sU -n -p 1-65535 -A -T2 -v -oA <OUT_FILE> <TARGET_IP>

充電しながら使用できない、かつ UDP スキャン中に充電がもたない場合

ドローンに Nmap をかけようとしたらこのシチュエーションに遭遇しました。1 回のスキャンあたりのポート数は対象機器の稼働時間をもとに決定します。

# nmap -sU -n -p 1-5000 -T4 -v -oA <OUT_FILE> <TARGET_IP>
# nmap -sU -n -p 5001-10000 -T4 -v -oA <OUT_FILE> <TARGET_IP>
......
# nmap -sU -n -p 60001-65535-T4 -v -oA <OUT_FILE> <TARGET_IP>
# nmap -sU -n -p <OPEN_PORTS> -A -v -oA <OUT_FILE> <TARGET_IP>

TCP:9100 がオープンになっている場合

特定のプリンタは TCP:9100 に対してバージョンスキャンを行うと、送信したパケットを大量に印刷してしまいます。そのため、Nmap はデフォルトで TCP:9100 へのバージョンスキャンを無効にしています。もし対象機器の TCP:9100 がオープンになっていた場合、同一ネットワーク内にプリンタがないことを確認して以下のコマンドを実行します。

# nmap -sS -n -p 9100 -A --allports -v -oA <OUT_FILE> <TARGET_IP>

調査対象の IoT 機器がプリンタの場合は、用紙を空にすれば問題ないと思います。(実際に試してはいません)

オプションの解説

Ping スキャン

  • -sn
    • Ping によるホストの検出
    • 古いバージョンの Nmap では -sP を使用しているが、今はこっち

スキャンの種類

  • -sS
    • TCP SYN スキャン
  • -sT
    • TCP connect() スキャン
    • -sS が使えない場合や、IPv6 に対するスキャン時に使える
  • -sU
    • UDP スキャン

ポートの指定

  • -p <PORTS>
    • スキャンするポートを指定
    • このオプションですべてのポートを指定しても TCP:9100 のバージョン検出はスキップされる
  • --allports
    • バージョン検出の対象からすべてのポートを除外しない

バージョン検出

  • -O
    • OS の検出
    • Pingスキャン、TCP スキャンの場合に有効
  • -sV
    • ソフトウェアバージョンの検出
  • -sC
  • --traceroute
    • traceroute を実行する
  • -A
    • OS の検出、ソフトウェアバージョンの検出、スクリプトスキャン、traceroute を有効にする

タイミングオプション

  • -T<TEMPLATE(0-5)>
    • テンプレートを利用してタイミングを設定する
    • (0)paranoid
      • IDS 回避用
    • (1)sneaky
      • IDS 回避用
    • (2)polite
      • スキャン処理速度を落とし、帯域幅と対象機器のリソース使用量を減らす
    • (3)normal
      • デフォルトのタイミング
    • (4)aggressive
      • ネットワークの速度と信頼性が高いことを想定して、スキャン速度を上げる
    • (5)insane
      • 非常に高速なネットワークにいる、または精度と引き換えに速度を上げたい場合に使える

ログの出力レベル

  • -v
    • 冗長性レベルを上げる
  • --version-trace
    • バージョン検出サブシステムのログを出力
  • --packet-trace
    • nmap が送受信したすべてのパケットを出力

出力フォーマット

  • -oN
  • -oX
    • XML 形式での出力
  • -oG
    • Grep しやすい形式での出力
  • -oA
    • 全フォーマット(通常、XMLGrep)形式で出力

その他

  • -Pn
    • Ping スキャンによるホストの検出を行わない
  • -n
    • 検出したホストの DNS 逆引きを行わない

おわりに

いろいろ調べてやってみた結果、あまりサーバに対して調査するのと変わっていない気もします(笑)
しかし、日本語のブログ記事等は -sn、-A オプションの情報が古かったり、出力フォーマットや TCP:9100 に触れていなかったりするので、だれかの参考になれば幸いです。
今後、実際に何かしらの機器に実行した結果や、IoT 機器に対して使えそうなオプションは順次追加していきたいと思っています。このオプションも使えるよ!などあればコメントで教えいただけると嬉しいです。

参考文献

https://nmap.org/book/man.html
http://ra66itblog.hateblo.jp/entry/2016/08/15/222850
http://n.pentest.ninja/?p=32421