サイト内の現在位置

ポートスキャンツールRustScanのご紹介

NECセキュリティブログ

2022年9月30日

NECサイバーセキュリティ戦略統括部セキュリティ技術センターの長谷川です。
今回のブログでは、ポートスキャンツールRustScannew window[1]のご紹介をしたいと思います。ポートスキャンツールの代表的なものといえば、Nmapnew window[2]を想像される方が多いと思います。今回はNmapとの簡単な比較もしていきたいと思います。

注意事項

本ブログで紹介するツールを許可されていない環境へ使用した場合、不正アクセス禁止法new window[3]などに違反する可能性があります。ツールを使用する場合は仮想マシンなどをご用意していただき、ご自身の管理下、または許可された環境にのみ使用するようお願いいたします。

RustScanとは

RustScanは、Rustで書かれたポートスキャンツールです。GPLv3ライセンスとして公開されています。対象マシンの開いているポートを探し出し、そのポート番号を自動的にNmapへ渡すことができます。これにより、Nmapを使ったスキャンの対象ポートを開きポートに限定して実行でき、取得したいポートの詳細情報のみを取得することでスキャン時間の短縮化につながります。
インストール方法は、docker、Homebrew、yay、ソースコードのコンパイルなどがあります。下記サイトのインストールガイドをご参照ください。

RustScanの使い方

動作環境

  • Kali Linux 2022.2
    • VMware Fusion Pro 12.2.4
    • CPU:4コアプロセッサコア
    • メモリー:4096MB
  • RustScan 2.1.0 (ソースコードのコンパイル)
  • Nmap 7.92
  • スキャン対象
    • Metasploitable 2new window[4]を仮想マシンで立ち上げています。
    • Hack The BoxのRetiredマシン「Lame」

今回使用した仮想マシン検証環境のネットワークです。(図1)

図 1:ネットワーク構成図

基本的な使い方

下記で示すコマンド「rustscan」を使って、引数でIPアドレスを指定して実行することで、そのIPアドレスに対するopenなTCPポートが結果として出力されます。
実行後、最初に開いているポートが列挙され(図2)、最後にポート番号(PORT)、状態(STATE)、サービス名(SERVICE)、開いていると判断した理由のレスポンスパケット(REASON)がまとめて表示されます。(図3)

$ rustscan -a 192.168.78.130

図 2:rustscanコマンドの実行結果の例1

(snip)

図 3:rustscanコマンドの実行結果の例2

RustScan実行後、openなポート番号をNmapへ引き渡し、詳細情報を得るためには下記で示すコマンドを実行します。
「--」以降の部分は、Nmapのオプションを指定することができます。

$ rustscan -a 192.168.78.130 -- -A -sCV -Pn

上記で示したrustscanコマンドは、下記で示すNmapコマンドと同じです。port部分はRustScanでSTATEがopenと判定されたものが指定されます。
また、ポートの詳細情報の出力形式は、通常のNmapの出力形式と同じものとなっています。

$ nmap -vvv -p {{port}} 192.168.78.130 -A -sCV –Pn

RustScanをデフォルト設定で動かした場合、対象サーバーのリソース不足や高速なスキャンなどにより、対象サーバーへの悪影響につながるため、「--ulimit」などのオプションを適宜使用する必要があります。

Nmapとの比較

自分で用意した仮想環境(Metasploitable 2)とHack The Box「Lame」で用意されている環境を使って、RustScanとNmapの実行時間の比較を行います。
まず、下記に示すRustScanのコマンド使用した際の通信をKali Linuxに標準インストールされているWiresharkを使って確認します。

$ rustscan -a 192.168.78.130

通信を確認するとTCPの3ウェイハンドシェイクが実施され、openと判定された場合は通信先からSYN/ACKパケットが返ってきた後、ACKパケットを送っていることが確認できます。(図4)

図 4:RustScanの通信内容例

比較検証ではなるべく同じ条件にするため、異なるポート番号に対して100個同時にopen/closeの判定が実行されるように指定しています。また、図4の結果より、スキャン対象にACKパケットを送っていることが確認できるので、Nmapの「-sS」オプションはつけていません。

ポートの開き状況チェックの時間の比較(Metasploitable 2)

最初にオプションなしでポートのopen/close判定にかかる時間を比較します(表1)。Nmap(調整バージョン)では、表1の実行コマンド欄に記載しているオプションを指定し、RustScanの速度と同じにならないかの検証を行っています。

表 1:ポートの開き状況判定にかかる時間

ツール名 時間[s] 実行コマンド
RustScan 0.07 rustscan -a 192.168.78.130 -b 100
Nmap 8.49 nmap -p- 192.168.78.130 --reason --min-parallelism 100 --max-parallelism 101
Nmap(調整バージョン) 7.29 nmap -p- 192.168.78.130 --min-parallelism 100 --max-parallelism 101 --reason --min-rate=1000 --max-rtt-timeout=100ms --initial-rtt-timeout=3ms
8.33 nmap -p- 192.168.78.130 --min-parallelism 100 --max-parallelism 101 --reason --min-rate=1000 --max-rtt-timeout=200ms --initial-rtt-timeout=3ms
8.32 nmap -p- 192.168.78.130 --min-parallelism 100 --max-parallelism 101 --reason --min-rate=2000 --max-rtt-timeout=100ms --initial-rtt-timeout=3ms
7.49 nmap -p- 192.168.78.130 --min-parallelism 100 --max-parallelism 101 --reason --min-rate=1000 --max-rtt-timeout=50ms --initial-rtt-timeout=3ms
8.00 nmap -p- 192.168.78.130 --min-parallelism 100 --max-parallelism 101 --reason --min-rate=2000 --max-rtt-timeout=50ms --initial-rtt-timeout=3ms
7.18 nmap -p- 192.168.78.130 --min-parallelism 100 --max-parallelism 101 --reason --min-rate=1000 --max-rtt-timeout=30ms --initial-rtt-timeout=3ms
8.04 nmap -p- 192.168.78.130 --min-parallelism 100 --max-parallelism 101 --reason --min-rate=2000 --max-rtt-timeout=30ms --initial-rtt-timeout=3ms
9.40 nmap -p- 192.168.78.130 --reason --min-parallelism 100 --max-parallelism 101 -T5

全ポートのopen/close判定は、RustScanの方が高速に列挙される結果になりました。また、今回の検証では各ツールでスキャン結果が異なるということは確認できませんでした。

ポートの詳細情報を得られるまでの時間の比較(Metasploitable 2)

次にポートの詳細情報の出力までにかかる時間を比較します。(表2)

表 2:ポートの詳細情報の出力までにかかる時間

ツール名 時間[s] 実行コマンド
RustScan 136.96 rustscan -a 192.168.78.130 -b 100 -- -A -sCV
Nmap 141.31 nmap -p- 192.168.78.130 --reason --min-parallelism 100 --max-parallelism 101 -sCV -A

今回用意した仮想マシン上の検証環境では、速度の違いを確認することはできませんでした。また、最終的なポートの詳細情報は同じものが出力されていることを確認しました。

ポート詳細情報を得られるまでの時間の比較(Hack The Box 「Lame」で用意されるマシン)

最後にHack The BoxのRetiredマシンに対して比較検証を行いました。(表3)
使用したマシンは、「Lame」と呼ばれるEasy問題で用意されているマシンです。
Nmapのオプションは、表3に記載しているオプションを指定しています。

表 3:ポートの詳細情報の出力までにかかる時間

ツール名 時間[s] 実行コマンド
RustScan 95.80 rustscan -a 10.10.10.3 -b 100 -- -sCV -A -Pn
Nmap 389.15 nmap -p- 10.10.10.3 --min-parallelism 100 --max-parallelism 101 -sCV -A -Pn --min-rate=1000

RustScanのほうがNmapより短時間で開いているポートの詳細情報を出力されることを確認しました。また、最終的なポートの詳細情報は同じものが出力されることを確認しました。

まとめ

  • 「RustScan」はGPLv3ライセンスとして公開されているポートスキャンツールです。Nmapと組み合わせて使用することで、より高速にポートの詳細情報を知ることができます。
  • open/close判定にはコネクトスキャンを実施しているので、サーバーのログに情報が残る可能性があります。
  • スキャン対象の環境に負荷/不具合を与えてしまうリスクを踏まえて使う必要があります。
  • TCPの全ポートスキャンを実施するならば、RustScanを使うことでスキャン時間を短縮することができます。ですが、UDPポートのスキャンには対応していないため、UDPポートをスキャンする場合はNmapで実行する必要があります。

参考情報

付録

RustScanで使用可能なオプションを以下にまとめています。ご利用の際のご参考になれば幸いです。

Option Description 説明
-a A list of comma separated CIDRs, IPs, or hosts to be scanned スキャン対象のホスト情報を指定
--range To scan a range of ports スキャンするポートの範囲を指定
-p You can input a comma separated list of ports to scan スキャンするポートを個別に指定
-b The batch size for port scanning, it increases or slows the speed of scanning. Depends on the open file limit of your OS. If you do 65535 it will do every port at the same time. Although, your OS may not support this [default: 4500] 一度にスキャンするポート数を指定
-t The timeout in milliseconds before a port is assumed to be closed [default: 1500] タイムアウトを指定
-u Automatically ups the ULIMIT with the value you provided. ファイル制限を指定した値に変更

執筆者プロフィール

長谷川 奨(はせがわ しょう)
セキュリティ技術センター リスクハンティング・システムグループ

ペネトレーションテストや脆弱性診断、ツール開発などに従事。
趣味はゲームや水泳。

執筆者の他の記事を読む

アクセスランキング