PythonとScapyでネットワークスキャナーを構築する

tags: python, networking, security, tutorial


tags: python, networking, security, tutorial


PythonとScapyでネットワークスキャナーを構築する

デスクに座って、ローカルネットワーク上にどのデバイスが潜んでいるのか、正確に知りたいと思ったことはありませんか?新しく買ったスマートTVは本当に接続されているのか?許可されていない誰かがWi-Fiに接続したのか?当て推量ではなく、ターミナルから即座にすべてのデバイスのIPアドレスとMACアドレスを表示するスクリプトを書くことができます。Pythonと強力なScapyライブラリを使えば、ネットワークスキャナーの構築は可能であるだけでなく、驚くほど簡単で、今日中に動作させることができます。

なぜScapyなのか?

Scapyはパケット操作のために設計されたPythonライブラリです。低レベルでネットワークパケットを作成、送信、分析することができ、ネットワークスキャン、侵入検知、プロトコル分析などのタスクに最適です[1][2]。詳細を抽象化する高レベルツールとは異なり、Scapyは完全な制御を提供します—ネットワークが実際にどのように動作するかを学ぶのに最適です。

環境のセットアップ

コードを書く前に、Scapyをインストールする必要があります。Pythonにはデフォルトで含まれていないため、pip経由で追加します。

Scapyのインストール

LinuxまたはmacOSの場合:

pip install scapy

Enter fullscreen mode Exit fullscreen mode

Windowsの場合、Npcapもインストールし、インストール中にWinPcap API互換モードを有効にする必要があります[3]。その後、以下を実行します:

pip install scapy

Enter fullscreen mode Exit fullscreen mode

クリーンで分離されたセットアップのために、仮想環境の使用を検討してください:

mkdir scanner
cd scanner
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate
pip install scapy

Enter fullscreen mode Exit fullscreen mode

このアプローチにより、スキャナープロジェクトが他のPythonパッケージに干渉しないことが保証されます[7]。

コアアイデア:ARPスキャン

ローカルネットワーク上のデバイスを発見する最も効果的な方法は、ARP(Address Resolution Protocol)スキャンです。ARPはIPアドレスをMACアドレスにマッピングするために使用されます。ネットワーク全体(ブロードキャスト)にARPリクエストを送信すると、受信したすべてのデバイスがIPとMACで応答し、ライブインベントリを提供します[1][2]。

以下にステップバイステップで動作を示します:

  1. ARPリクエストパケットを作成する。
  2. 対象ネットワーク範囲を設定する。
  3. パケットをすべてのデバイスにブロードキャストする。
  4. 応答をキャプチャして解析する。
  5. 各デバイスのIPとMACを表示する。

初めてのネットワークスキャナー:動作するコード

完全で動作するスキャナーを作成しましょう。このスクリプトは、ローカルネットワーク(例:192.168.1.0/24)をスキャンし、すべてのアクティブなデバイスを一覧表示します。

from scapy.all import ARP, Ether, srp

# Define the network range to scan
target_ip = "192.168.1.0/24"

# Create an ARP request packet
arp = ARP(pdst=target_ip)

# Create an Ethernet frame with broadcast destination
ether = Ether(dst="ff:ff:ff:ff:ff:ff")

# Combine them into a packet
packet = ether / arp

# Send and receive packets at layer 2
result = srp(packet, timeout=3)[0]

# Store discovered clients
clients = []

for sent, received in result:
    clients.append({'ip': received.psrc, 'mac': received.hwsrc})

# Print results
print("Available devices in the network:")
print("IP" + " "*18+"MAC")
for client in clients:
    print(client['ip'] + " "*18 + client['mac'])

Enter fullscreen mode Exit fullscreen mode

これをscanner.pyとして保存し、実行します:

python scanner.py

Enter fullscreen mode Exit fullscreen mode

ネットワークに現在接続されているすべてのデバイスのリストが表示されます[2]。

注: このスクリプトにはネットワークアクセス権限が必要です。Linuxではsudoで実行してください。WindowsではNpcapが正しくインストールされていることを確認してください[3]。

実用化:ネットワークに合わせてカスタマイズする

上記の例ではハードコードされたIP範囲を使用しています。今日役立つものにするために、実際のネットワークに合わせて調整します:

ネットワーク範囲を見つける

Linux/macOSの場合:

ip route | grep default

Enter fullscreen mode Exit fullscreen mode

Windowsの場合:

ipconfig

Enter fullscreen mode Exit fullscreen mode

IPv4アドレスとサブネットを探します(例:192.168.1.100/24)。最初の3オクテット + /24を対象として使用します。

たとえば、IPが10.0.0.5の場合、以下を設定します:

target_ip = "10.0.0.0/24"

Enter fullscreen mode Exit fullscreen mode

エラーハンドリングを追加する

スキャンロジックを関数でラップし、タイムアウトを適切に処理します:

def scan_network(target):
    try:
        arp = ARP(pdst=target)
        ether = Ether(dst="ff:ff:ff:ff:ff:ff")
        packet = ether / arp
        result = srp(packet, timeout=3)[0]
        clients = []
        for sent, received in result:
            clients.append({'ip': received.psrc, 'mac': received.hwsrc})
        return clients
    except Exception as e:
        print(f"Error: {e}")
        return []

Enter fullscreen mode Exit fullscreen mode

これでコードのどこからでもscan_network("192.168.1.0/24")を呼び出すことができます。

基本的なスキャンを超えて:次にすることは?

これが動作したら、スキャナーを拡張できます:

  • Pingスキャン:ScapyのICMP機能を使用してIP範囲でpingスイープを実行します[4]。
  • CSVへのエクスポート:ログ記録やレポートのために結果をファイルに保存します。
  • GUIインターフェース:TkinterまたはPyQtと統合してビジュアルダッシュボードを作成します。
  • リアルタイムモニタリング:スキャナーを定期的に実行して、ネットワークに参加する新しいデバイスを検出します。

ScapyはTCP、UDP、カスタムプロトコルの作成もサポートしており、高度なネットワークセキュリティツールの基盤となります[11]。

トラブルシューティングのヒント

  • 自分しか表示されない?(特にVMで)他のデバイスに到達できるように、ブリッジアダプターを使用していることを確認してください[6]。
  • 応答がない?ファイアウォール設定を確認するか、srp()timeoutを増やしてみてください。
  • Windowsの問題?NpcapがWinPcap互換モードでインストールされていることを確認してください[3]。

今日からスキャンを開始する

ローカルネットワーク上のすべてのデバイスを表示する完全に機能するネットワークスキャナーができました—当て推量も、サードパーティツールも必要ありません。ただPython、Scapy、そして数行のコードだけです。

今夜自宅のネットワークで実行してみてください。何が接続されているか確認してください。未知のものを発見してください。そして、興味深い(または疑わしい)ものを見つけたら、以下のコメントであなたの調査結果を共有してください。

あなたの行動喚起:このスクリプトをフォークし、あなたのネットワークに合わせてカスタマイズし、GitHubにプッシュしてください。#python#scapy#networksecurityでタグ付けしてください。ネットワークを深く理解する開発者のコミュニティを構築しましょう。

ネットワークはあなたが探求するためのものです。スキャンを開始しましょう。


これが役に立ったと思ったら、コーヒーをおごってください☕—これらの記事が続くのに役立ちます!

また、私のAIツールコレクションもチェックしてください:AI 次元世界—開発者向けの無料AIツール。