先日のブログ移行記事でも書いたように、最近は IoT 機器のリバースエンジニアリングやペネトレーションテストを行っています。
まず調査を行いたい IoT 機器を入手したら、対象機器の正規の使用方法、製品仕様、実際の挙動等を調べるといった事前調査を行います。その後、主要なネットワーク調査ツールである Nmap を用いて、対象機器でどのようなサービスが動いているのかを調査し、その情報を足がかりにさらに詳細な解析を行うといった流れが一般的だと思います。
しかしながら、脆弱なサーバに対する Nmap のノウハウはインターネット上に多くの情報を見かけるのに対し、IoT 機器に対する Nmap の使い方やノウハウはあまり見かけません。そこで今回は、IoT 機器に対するネットワーク調査においてよく使う Nmap オプションをまとめてみました。
※注意
本記事の内容は犯罪行為を助長するものではありません。自身の管理下にあるサーバや機器以外には絶対に行わないようにしてください。
2018/10/29
「オプションの解説」の「その他」で解説している -Pn オプションの説明が誤っていたため、修正しました。
2018/11/01
「UDP スキャンにかかる時間を短縮したい場合」および「充電しながら使用できない、かつ UDP スキャン中に充電がもたない場合」を追加しました。
記事作成時の環境
OS
# uname -a Linux kali 4.18.0-kali1-amd64 #1 SMP Debian 4.18.6-1kali1 (2018-09-10) x86_64 GNU/Linux
ネットワーク調査ツール
# 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 を使用しているが、今はこっち
スキャンの種類
ポートの指定
- -p <PORTS>
- スキャンするポートを指定
- このオプションですべてのポートを指定しても TCP:9100 のバージョン検出はスキップされる
- --allports
- バージョン検出の対象からすべてのポートを除外しない
バージョン検出
- -O
- -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 が送受信したすべてのパケットを出力
出力フォーマット
その他
おわりに
いろいろ調べてやってみた結果、あまりサーバに対して調査するのと変わっていない気もします(笑)
しかし、日本語のブログ記事等は -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