ネットワークセキュリティの分野、特にペネトレーションテストやレッドチーム活動において、対象システムの情報を正確に把握することは極めて重要です。その中でも、ターゲットとなるOSのアーキテクチャ(32ビットか64ビットか)を知ることは、適切なペイロードやエクスプロイトを選択する上で欠かせません。
このブログ記事では、強力なネットワークプロトコル操作ライブラリである Impacket に含まれる便利なスクリプトの一つ、getArch.py
に焦点を当て、その機能、仕組み、使い方、そして注意点について詳しく解説します。
Impacket とは? 🤔
getArch.py
の話に入る前に、まず Impacket について簡単に触れておきましょう。Impacket は、ネットワークプロトコルを扱うためのPythonクラスのコレクションです。Ethernetフレームの構築から、TCP/IP、UDP、ICMP、ARPといった基本的なプロトコル、さらにはSMB、MSRPC、LDAP、MSSQL (TDS)、Kerberosといったより高度なプロトコルまで、幅広く対応しています。
Impacket の特徴は、低レベルのプロトコルアクセスを提供し、プロトコルの実装そのもの(特にSMBやMSRPC)を提供している点にあります。これにより、開発者はプロトコルの詳細を深く理解し、カスタムツールを作成したり、既存のツールを拡張したりすることが可能です。
また、Impacket には多数のサンプルスクリプトが含まれており、これらはそのままペネトレーションテストやセキュリティ評価の現場で強力なツールとして利用できます。getArch.py
もその一つです。
getArch.py とは何か? 🎯
getArch.py
(またはエイリアスの impacket-getArch
) は、リモートのWindowsシステムのOSアーキテクチャ(x86かx64か)を特定するためのスクリプトです。
このスクリプトは、ターゲットマシン(または複数のターゲットマシンのリスト)に接続し、文書化されているMSRPC (Microsoft Remote Procedure Call) の機能を利用してアーキテクチャ情報を収集します。
驚くべきことに、この情報収集テクニックは、多くの場合、認証を必要としません。これは、特定のRPCインターフェースへの問い合わせ方法に起因します。ただし、環境によっては認証情報が必要になる場合もあります。
ペネトレーションテストの偵察(Reconnaissance)フェーズにおいて、getArch.py
は非常に役立ちます。得られたアーキテクチャ情報に基づいて、攻撃者は後続のステップで適切なツールやペイロード(例えば、32ビット版か64ビット版か)を選択できるようになります。
注意点: このテクニックは、ターゲットシステムがSamba(Linux/Unix上でSMB/CIFSプロトコルを提供するソフトウェア)を実行している場合には機能しません。macOSでの動作については明確ではありません。
なぜアーキテクチャ情報が重要なのか? 💡
OSのアーキテクチャを知ることがなぜ重要なのでしょうか?理由はいくつかあります。
- ペイロード/エクスプロイトの選択: 多くのマルウェア、シェルコード、エクスプロイトは、特定のCPUアーキテクチャ向けにコンパイルされています。間違ったアーキテクチャのコードを実行しようとすると、クラッシュしたり、単に機能しなかったりします。
getArch.py
で事前にアーキテクチャを特定しておけば、このような失敗を避けられます。 - 環境理解: ネットワーク内のシステム構成を理解する上で、アーキテクチャ情報は基本的ながら重要な要素です。例えば、すべて64ビット環境であれば、32ビット固有の脆弱性を考慮する必要性が低くなります。
- ツール選択: ペネトレーションテストで使用するツールの中にも、アーキテクチャに依存するものがあります(例: Mimikatz)。ターゲットのアーキテクチャに合わせて適切なバージョンのツールを使用する必要があります。
このように、アーキテクチャ情報は、攻撃の成功率を高め、効率的なテストを実施するために不可欠な情報なのです。
getArch.py はどのように動作するのか? ⚙️
getArch.py
は、MSRPC (Microsoft Remote Procedure Call) の機能を利用してアーキテクチャを特定します。具体的には、ターゲットマシンのTCPポート135 (RPC Endpoint Mapper) に接続を試みます。
ソースコードや関連情報によると、このスクリプトは MSRPC の Endpoint Mapper (EPM) サービスと通信します。特に、RPCインターフェースのネゴシエーションにおいて、異なるNDR (Network Data Representation) トランスファーシンタックスを提示することで、ターゲットが64ビット(NDR64)をサポートしているかどうかを判断しようとします。
具体的には、getArch.py
は UUID 71710533-BEBA-4937-8319-B5DBEF9CCC36
バージョン 1.0
という特定のインターフェース(これは64ビット環境を示すために使われることがあるようです)でのバインドを試みることで、ターゲットの応答からアーキテクチャを推測します。
この手法は、Microsoftによって文書化されているRPCの機能(MSDNのドキュメント参照)を利用しており、多くの場合、認証なしで実行可能です。これは、RPC Endpoint Mapper自体が、利用可能なRPCサービスに関する情報を提供する役割を持っているためです。
getArch.py
は比較的「隠密性」が高いツールとされています。つまり、標準的な検知メカニズムでは検出されにくい傾向があります。これは、RPCヘッダー内の正当な情報交換を利用しているため、悪意のある活動としてフラグが立てられにくいからです。ただし、高度なETW (Event Tracing for Windows) トレースツールなどを使えば、その活動を検知することは可能です。
インストールと前提条件 🛠️
getArch.py
を使用するには、まず Impacket がインストールされている必要があります。Kali Linux などのペネトレーションテスト用ディストリビューションには、通常プリインストールされています。
もしインストールされていない場合は、Python と pip があれば簡単にインストールできます。
# pip を使ってインストール
pip install impacket
# または、GitHub からソースコードをクローンしてインストール
git clone https://github.com/fortra/impacket.git
cd impacket
python setup.py install
前提条件としては以下が挙げられます。
- Python 環境 (Impacket がサポートするバージョン)
- Impacket ライブラリのインストール
- 実行環境からターゲットマシンへのネットワーク接続性 (通常は TCP ポート 135)
- ターゲットマシンで RPC サービスが稼働していること
- (場合によっては) ターゲットマシンへの接続に必要な認証情報
getArch.py の基本的な使い方とオプション ⌨️
getArch.py
の基本的な構文は非常にシンプルです。
getArch.py <ターゲット> [オプション]
または、Kali Linux などでパスが通っている場合はエイリアスも使えます。
impacket-getArch <ターゲット> [オプション]
主要なオプション
-h
または --help
オプションで利用可能なオプション一覧を確認できます。
root@kali:~# impacket-getArch -h
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
usage: getArch.py [-h] [-target TARGET] [-targets TARGETS] [-timeout TIMEOUT] [-debug]
Gets the target system's OS architecture version
options:
-h, --help show this help message and exit
-target TARGET <targetName or address>
-targets TARGETS input file with targets (one per line)
-timeout TIMEOUT socket connect timeout (default: None)
-debug Turn DEBUG output ON
主なオプションを解説します。
オプション | 説明 |
---|---|
-target <ターゲット> |
単一のターゲットを指定します。ターゲット名(NetBIOS名、FQDN)またはIPアドレスを指定できます。 |
-targets <ファイル名> |
ターゲットリストが記述されたファイルを指定します。ファイルには1行につき1つのターゲット(名前またはIPアドレス)を記述します。 |
-timeout <秒数> |
ターゲットへのソケット接続試行時のタイムアウト時間を秒数で指定します。デフォルトは指定なし(システムのデフォルトに依存)。 |
-debug |
デバッグモードを有効にします。より詳細なログが出力され、問題発生時のトラブルシューティングに役立ちます。 |
認証について:
getArch.py
のヘルプメッセージには明示的な認証オプション(-hashes
, -user
, -password
など)は表示されませんが、Impacket の他のスクリプトと同様に、ターゲット文字列内に認証情報を含める形式が利用できる場合があります(例: domain/user:password@target_ip
)。しかし、getArch.py
の主な利点の一つは認証なしで動作することが多い点です。まずは認証情報なしで試してみるのが良いでしょう。もし接続自体がブロックされる、あるいは特定のRPC呼び出しに認証が必要な環境であれば、他のImpacketツール(例えば smbclient.py
で接続を試みるなど)で認証の要否を確認する必要があるかもしれません。
実行例 ✨
単一ターゲットのアーキテクチャを確認する
IPアドレス 192.168.1.100
のアーキテクチャを確認します。
impacket-getArch 192.168.1.100
成功した場合、以下のような出力が得られます。
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Retrieving endpoint list from 192.168.1.100:135
[*] Trying to binding to 71710533-BEBA-4937-8319-B5DBEF9CCC36 1.0@ncacn_ip_tcp:192.168.1.100[135]
[+] Target is x64
この例では、ターゲットが64ビット (x64) であることがわかりました。もし32ビットであれば Target is x86
のように表示されます。
ファイルから複数のターゲットを読み込む
targets.txt
というファイルに以下のようにターゲットIPアドレスが記述されているとします。
192.168.1.100
192.168.1.105
192.168.1.110
このファイルを使って、リスト内の全ターゲットのアーキテクチャを確認します。
impacket-getArch -targets targets.txt
出力は以下のようになります(例)。
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Gathering OS architecture for 3 machines
[*] Socket connect timeout set to None secs
[*] Retrieving endpoint list from 192.168.1.100:135
[*] Trying to binding to 71710533-BEBA-4937-8319-B5DBEF9CCC36 1.0@ncacn_ip_tcp:192.168.1.100[135]
[+] Target 192.168.1.100 is x64
[*] Retrieving endpoint list from 192.168.1.105:135
[*] Trying to binding to 71710533-BEBA-4937-8319-B5DBEF9CCC36 1.0@ncacn_ip_tcp:192.168.1.105[135]
[+] Target 192.168.1.105 is x64
[*] Retrieving endpoint list from 192.168.1.110:135
[*] Trying to binding to 71710533-BEBA-4937-8319-B5DBEF9CCC36 1.0@ncacn_ip_tcp:192.168.1.110[135]
[-] Could not get target architecture: RPC_S_SERVER_UNAVAILABLE
この例では、最初の2つのターゲットはx64アーキテクチャであることがわかりましたが、3つ目のターゲット (192.168.1.110
) からは応答がないか、RPCサービスが利用できないため、アーキテクチャを取得できませんでした。
タイムアウトを設定する
応答が遅いターゲットに対して、タイムアウトを5秒に設定します。
impacket-getArch 192.168.1.200 -timeout 5
5秒以内に接続または応答がなければ、処理は中断されます。
エラーとトラブルシューティング 😥
getArch.py
を使用する際に遭遇する可能性のある一般的なエラーと、その対処法をいくつか紹介します。
-
[-] Could not get target architecture: RPC_S_SERVER_UNAVAILABLE
ターゲットマシンに到達できない、またはターゲットマシン上でRPCサービス (特にポート135のEndpoint Mapper) が稼働していないか、ファイアウォールでブロックされている可能性があります。- ターゲットへのネットワーク接続を確認 (
ping
やnmap -p 135 <target_ip>
など)。 - ターゲットのファイアウォール設定を確認。
- ターゲットでRPC関連サービスが実行されているか確認。
- ターゲットへのネットワーク接続を確認 (
-
[-] Could not get target architecture: connection_timed_out
ターゲットへの接続試行がタイムアウトしました。ネットワーク経路が遅い、またはターゲットが応答しない可能性があります。-timeout
オプションでタイムアウト時間を長く設定してみる。- ネットワーク接続を確認する。
-
[-] Could not get target architecture: connection_refused
ターゲットマシンには到達できましたが、TCPポート135での接続が拒否されました。RPCサービスが実行されていないか、ファイアウォールによって明示的に接続が拒否されている可能性があります。- ターゲットのサービス状態とファイアウォール設定を確認。
-
認証が必要な場合
前述の通り、getArch.py
自体は認証なしで機能することが多いですが、環境によっては認証が必要となる RPC 呼び出しに依存する場合があります。もし上記のエラーがネットワーク的な問題でない場合、認証が必要な可能性も考えられます。その場合は、他の認証可能な Impacket スクリプト (例:smbclient.py
,rpcdump.py
など) を使って、まず認証付きでターゲットに接続できるか確認すると良いでしょう。
問題が解決しない場合は、-debug
オプションを付けて実行し、詳細なログを確認することで、原因究明の手がかりが得られることがあります。
セキュリティ上の考慮事項 🛡️
getArch.py
は、ペネトレーションテストやセキュリティ評価においては非常に有用なツールですが、攻撃者にとっても同様に価値のある情報収集ツールとなり得ます。
- 偵察活動: 攻撃の初期段階で、ネットワーク内のシステム構成を把握するために使用される可能性があります。
- 隠密性: 前述の通り、比較的検出されにくいツールであるため、防御側にとっては検知が難しい場合があります。
- 対策: ネットワークセグメンテーション、不要なポート(特に外部からのポート135)のフィルタリング、RPC通信の監視(異常なパターンや既知の悪性ツールシグネチャ)、ETWなどによる詳細なログ監視などが対策として考えられます。
このツールを使用する際は、必ず適切な権限と目的を持って、法と倫理に従って利用するようにしてください。
まとめ 🎉
Impacket スクリプト getArch.py
は、リモートWindowsシステムのOSアーキテクチャを迅速かつ(多くの場合)認証なしで特定できる、シンプルながら強力なツールです。ペネトレーションテストやセキュリティ評価の偵察フェーズにおいて、ターゲット環境に関する重要な情報を収集し、後続の攻撃計画を立てる上で非常に役立ちます。
その仕組みは MSRPC の文書化された機能を利用しており、比較的隠密性が高いという特徴も持っています。使い方を理解し、その利点と注意点を把握することで、より効果的なセキュリティ評価が可能になるでしょう。
ぜひ、あなたのツールキットに Impacket と getArch.py
を加えてみてください! 💪
コメント