×
採用サイトはこちら

【前編】社内LANは信頼できる?ARPスプーフィングの手口を実機で体感しよう

はじめに

「社内ネットワークは信頼できる」

—多くの人がそう考えていますが、実はLAN内には昔から知られる大きな穴があります。

それが今回扱うARPスプーフィングです。

本記事では、用語解説としてARPプロトコルの仕組みと根本的な脆弱性内容を整理し、その上で実機ハンズオンにて、下記を順番に確認していきます。

  1. 攻撃前後のARPテーブルの変化
  2. arpspoof によるARPテーブルの汚染
  3. 透過中継(盗聴型)と偽サイト表示(フィッシング型)、2パターンの中間者攻撃
  4. Wiresharkによる偽のARPリプライパケットとパケット転送の観察
  5. DAI(Dynamic ARP Inspection)による防御

なお本記事のすべての内容は、実機のL3SW(Cisco Catalyst)とサーバ(PC模擬)で検証済みです。コマンド例・IPアドレス・MACアドレスはすべて検証で使った実値に統一し、要所には実際のスクリーンショットを証跡として掲載しています。

目次

記事の概要

本記事は前編と後編の2部構成となっており、前編では ARPの概要及び検証環境/環境構築を行います。
実機を使ったARPスプーフィングの検証に関しましては、後編をご覧ください。
後編はこちら:【後編】社内LANは信頼できる?ARPスプーフィングの手口を実機で体感しよう

前編の内容:
・ ARPとは?
・ ハンズオンの構成
・ ハンズオンStep1: 環境構築

後編の内容:
・ ハンズオンStep2: 攻撃前のARPテーブルの確認
・ ハンズオンStep3: arpspoofによるARPテーブルの上書き
・ ハンズオンStep4: 偽サイトを表示させるパターン(フィッシング型)
・ ハンズオンStep5: Wiresharkによるパケット解析
・ ハンズオンStep6: DAI(Dynamic ARP Inspection)による防御の検証
・ まとめ

座学だけでなく実際に仮想環境で攻撃と防御を体験するハンズオンを通じて、ARPの仕組みとセキュリティ対策を深く学んでいきます。

それでは早速、前編の内容に入っていきましょう!

ARPとは?

ARPの役割とARPテーブルの仕組み

ARP(Address Resolution Protocol)は、同一L2(レイヤー2/データリンク層)セグメント内でIPアドレスからMACアドレスを解決するためのプロトコルです。

PCが同じネットワーク内の別の機器と通信する際、宛先IPアドレスは分かっていてもEthernetフレームを送るためのMACアドレスが分からなければ通信できません。そこで各端末は次のような流れでMACアドレスを解決します。

  1. 送信元が「このIPアドレスを持つ機器のMACアドレスを教えてください」というARPリクエストをブロードキャストで送信する
  2. 該当するIPアドレスを持つ機器が「自分のMACアドレスはこれです」というARPリプライをユニキャストで返す
  3. 送信元は受け取ったIP-MACの対応関係をARPテーブル(ARPキャッシュ)に一定時間保存し、以降の通信で再利用する

このARPテーブルは、WindowsでもLinuxでも arp -a コマンドで確認できます。

Gratuitous ARPの性質

通常のARPはリクエストに対する応答ですが、Gratuitous ARP(GARP)は誰からもリクエストされていないのに自発的に送信されるARPリプライです。

本来GARPは、

  • 自分のIPアドレスがネットワーク内で重複していないかを確認する
  • NIC(Network Interface Card)交換やフェイルオーバーなどでMACアドレスが変わった際に、周囲の機器のARPテーブルを速やかに更新させる

といった正当な目的で使われます。しかし裏を返せば、

「攻撃対象の端末がARPリプライを無条件で受け入れて、ARPテーブルを上書きしてしまう」

という挙動そのものが、なりすましに悪用できる性質だということになります。

ARPに認証機構がないという根本的な脆弱性

ARPの仕様上の弱点を突いた攻撃手法に、ARPスプーフィングがあります。

ARPスプーフィングとは、同一ネットワークセグメント内で通信内容を盗聴・改ざんする中間者攻撃(MITM: Man-in-the-Middle)の糸口としてよく使われる手法です。

システムのバグなどを突くわけではなく、認証機構を持たないARPプロトコルの「設計上の仕様」を逆手にとるため、対策がなされていないネットワークでは非常に成立しやすい攻撃です。

ARPスプーフィングが成立してしまう本質的な理由は、ARPというプロトコルに送信元を検証する仕組みが一切存在しないことにあります。

  • ARPリプライは誰でも自由に送信できる
  • 受信側は「本当にそのIPアドレスの持ち主から送られてきたものか」を確認する手段を持たない
  • 受信側は受け取ったARPリプライの内容を無条件に信頼し、ARPテーブルを上書きする

つまり、攻撃者が「私が<デフォルトゲートウェイのIPアドレス>です」という偽のARPリプライを送りつけるだけで、ターゲットのARPテーブルは何の疑いもなく書き換えられてしまいます。

これがARPスプーフィングの根本原理です。 また、中間者攻撃の手口はARPスプーフィングだけではありません。

DNSの応答を偽装するDNSスプーフィングや、DHCPサーバーになりすますDHCPスプーフィングといった手法も存在します(いずれも本記事では扱わず、今回はARPスプーフィングに絞って検証します)。

ARPスプーフィングはそのなかでも、L2(データリンク層)の性質を悪用する代表的な一つという位置づけになります。

ハンズオンの構成

検証環境

今回は以下の4台構成で検証環境を用意します。

役割機器概要・用途
攻撃元攻撃元PC(Kali)VirtualBox上のKali Linuxでarpspoof や Wireshark を使用した攻撃・解析の実行
攻撃対象ターゲットPC(Windows)被害者役。サーバーと通信を行う
通信先サーバー(AlmaLinux)ターゲットPCからの通信を受信するWebサーバー
中継L2SW(Catalyst 3550)通常のL2スイッチングおよびDAIの設定

以降、本文ではこの4台を 攻撃元PC / ターゲットPC / サーバー / L2SW と呼びます。すべての機器は同一の L2SW に接続し、同一L2セグメントに属する構成とします。

本記事では再現性のため、検証で実際に使ったアドレス・MAC・ポートに統一してコマンド例を記載します。ご自身の環境で試す場合は、以下の値をそれぞれの環境の値に読み替えてください。

▼ 今回のハンズオンで使ったアドレス一覧

役割IPアドレスMACアドレス接続先ポート(L2SW)インターフェイス
攻撃元PC(Kali)192.168.56.108:00:27:5a:87:bcFa0/3eth0
(接続名 :有線接続 1)
サーバー(AlmaLinux)192.168.56.208:00:27:70:f1:c9Fa0/2enp0s3
ターゲットPC(Windows)192.168.56.3f8:e4:3b:a2:c9:2aFa0/1イーサネット
(USB-LAN)

3台はすべてVLAN 10のアクセスポートに接続し、上位スイッチやルータへのアップリンクは持たせていません。ゲートウェイも用意しない、クローズド環境の検証セグメントです。

※arpspoofについて
ネットワーク上の端末へ偽のARPパケットを継続的に送り、相手のARPテーブルを強制的に書き換える(ARPスプーフィングを実行する)CUIツールです。

図: ハンズオン構成。

L2SW(Cisco Catalyst) の Fa0/1 にターゲットPC、Fa0/2 にサーバー、Fa0/3 に攻撃元PC(Kali) を接続。

図: 実機の様子:① L2SW(Cisco Catalyst)の Fa0/1〜0/3 に3台を直結

図: 実機の様子:② ターゲットPC(Windows)と攻撃元PC(Kali)

図: 実機の様子:③ サーバー役の AlmaLinux

正常時はターゲットPCとサーバーが直接ARPで解決し合ったMACアドレス宛に通信しますが、攻撃が成立すると両者の通信は物理的にも論理的にも攻撃元PCを経由するようになります。

注意 : 本記事の手順は、必ず自身が管理する隔離された検証環境(VirtualBoxのホストオンリー/内部ネットワーク等)でのみ実施してください。第三者が利用するネットワークや本番環境で実施すると、通信妨害や不正アクセスとして扱われる可能性があります。

ARPスプーフィングによる通信の盗聴リスクは、実ケースとして「同一セグメント内の暗号化が不十分な社内LAN」や「不特定多数が接続するフリーWi-Fi環境」などで起こりえます。こうした環境では、同一ネットワーク内に悪意ある端末が1台存在するだけで、中間者攻撃による通信内容の盗聴や改ざんが成立してしまいます。

検証の目的について

本検証の目的は、ARPの脆弱性を突いたARPスプーフィング攻撃による偽サイト誘導の脅威を実証した上で、DAIをつかったネットワーク機器の防御機能を適用し、IP通信の安全性を回復する一連のプロセスを理解することです。

検証の流れ

  • Step1: 環境構築(各機器のネットワーク設定)
  • Step2: 攻撃前のARPテーブルの確認
  • Step3: arpspoofによるARPテーブルの上書き
  • Step4: 偽サイトを表示させるパターン(フィッシング型)
  • Step5: Wiresharkによるパケット解析(偽ARPリプライ・パケット転送の観察)
  • Step6: DAIによる防御の検証

ハンズオンStep1: 環境構築

3台をそれぞれ静的IPで 192.168.56.0/24 のセグメントに参加させ、サーバーには検証用のWebページを立てます。ここでは機器ごとに設定手順を分けて説明します。

攻撃元PC(Kali Linux)の準備

まず VirtualBox をインストールし、その上に Kali Linux の仮想マシン(VM)を用意します。Kali Linux 公式サイトの「Pre-built VMs」から VirtualBox 用イメージ(.ova)をダウンロードし、「仮想マシンをインポート」から取り込みます。ネットワークアダプタは VirtualBox の設定でブリッジアダプタにして、ターゲットPC・サーバーと同じL2セグメントに接続されるようにします。

攻撃には dsniff に含まれる arpspoof、解析には Wireshark を使います。最近の Kali にはほぼ最初から入っていますが、念のため確認とインストールをしておきます。

sudo apt update
sudo apt install -y dsniff wireshark
which arpspoof

続いて、arpspoof を撃つたびに手で振り直さなくて済むよう、静的IPを nmcli で恒久設定します。接続名はロケールによって変わり、日本語環境では 有線接続 1 になっていることが多いので、まず実際の名前を確認します。

nmcli connection show

今回は日本語環境で接続名は 有線接続 1 でした。これに対し、IPv4を手動(static)に切り替え、アドレスなどを一つずつ設定していきます。

sudo nmcli connection modify "有線接続 1" ipv4.addresses 192.168.56.1/24

反映後は ip addr で IP と MAC が設定されているか、ip route でルート内容を確認します。

図: Kali の ip addr。eth0 に MAC 08:00:27:5a:87:bc と 192.168.56.1/24 が設定されている。

図: Kali の ip route。この検証用のインターフェイス(eth0)の送信元IPが 192.168.56.1 になっている。

サーバー(AlmaLinux)の準備

サーバーのOSが AlmaLinux です。ターゲットPCはここにサーバーに向けてWebページを取りに行き、攻撃が成立するとその通信が Kali を経由するようになります。

まずはサーバー(AlmaLinux)に Web サーバー(httpd)を導入します(AlmaLinux は RHEL系なので dnf/httpdが該当)。

sudo dnf update -y
sudo dnf install -y httpd

続いて nmcli で静的IPを恒久設定します。今回の環境ではデバイス名・コネクション名ともに enp0s3 で検証しました。

# 静的IPアドレスを割り当てる
sudo nmcli connection modify "有線接続 1" ipv4.addresses 192.168.56.1/24

# DHCP をやめて手動(static)に切り替える
sudo nmcli connection modify "有線接続 1" ipv4.method manual

# ゲートウェイ・DNS は検証用セグメントでは使わないので空にしておく
sudo nmcli connection modify "有線接続 1" ipv4.gateway ""
sudo nmcli connection modify "有線接続 1" ipv4.dns ""

# この接続を既定ルート(インターネットへの出口)にしない
sudo nmcli connection modify "有線接続 1" ipv4.never-default yes

# ここまでの変更を反映するため、コネクションを張りなおす
sudo nmcli connection down "有線接続 1"
sudo nmcli connection up "有線接続 1"

反映後、ip a で IPアドレス と MACアドレス が設定されていることを確認します。

図: enp0s3 に 192.168.56.2/24、MAC 08:00:27:70:f1:c9 が設定されている。

次に httpd を起動し、firewalld で HTTP(80番)を開けます。ここを忘れると、httpdは起動しているのにターゲットPCからサイトが表示されない、という状態になります。

sudo systemctl enable --now httpd
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

最後に、ターゲットPCに見せる「サーバーのページ」を /var/www/html/index.html として配置します。

あとで攻撃を仕掛けたとき「現在画面に表示されているのはサーバー(Alma)か攻撃元(Kali)か」がひと目で分かるよう、Server: の表示を Alma にしてあります。

サーバー(Alma)のHTMLテンプレート
<!doctype html>
<html lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Security Training Page</title>
  <style>
    body {
      margin: 0;
      font-family: Arial, sans-serif;
      background: #f2f4f7;
      color: #222;
    }
    .box {
      max-width: 820px;
      margin: 60px auto;
      padding: 32px;
      background: white;
      border: 1px solid #ddd;
      box-shadow: 0 12px 30px rgba(15, 23, 42, 0.12);
    }
    .top {
      border-top: 8px solid #b21f2d;
      border-bottom: 1px solid #dddddd;
      padding: 24px 40px;
      text-align: center;
    }
    .content {
      margin: 32px 36px;
    }
    .warning {
      border: 1px solid #cccccc;
      background: #f7f7f7;
      padding: 20px 24px;
    }
    .status {
      margin-top: 24px;
      display: flex;
      gap: 12px;
      justify-content: center;
    }
    .pill {
      padding: 10px 14px;
      border-radius: 999px;
      font-size: 14px;
      font-weight: bold;
    }
    .footer {
      margin-top: 24px;
      font-size: 14px;
      color: #667085;
    }
  </style>
</head>
<body>
  <div class="box">
    <div class="top">
      <h1>Security Training Page</h1>
      <p>Alma / ARP Spoofing Lab</p>
    </div>
    <div class="content">
      <div class="warning">
        <h2>This is a training page hosted on AlmaLinux</h2>
        <p>If this page appears unexpectedly, the traffic path may have changed.</p>
        <p>This is page is used for a controlled ARP spoofing lab.<br>
           Do not enter real IDs, passwords, or personal information.</p>
        <p><strong>Server:</strong> Alma Linux</p>
      </div>
      <div class="check">
        <h2>Check Points</h2>
        <ul>
          <li>Check the URL shown in the browser.</li>
          <li>Check whether the page uses HTTP.</li>
          <li>Check the ARP table on the client.</li>
          <li>Check ARP packets with Wireshark.</li>
        </ul>
      </div>
      <div class="status">
        <div class="pill">LAB ONLY</div>
        <div class="pill">HTTP TEST</div>
        <div class="pill">NO REAL DATA</div>
      </div>
      <p class="footer">Training Lab / ARP Spoofing Verification</p>
    </div>
  </div>
</body>
</html>

ターゲットPC(Windows)の準備

ターゲットPCは、普段使いの Windows PC をそのまま L2SW につないで 192.168.56.3 を割り当てます。今回の PC には有線LANポートが無かったので、USB-LANアダプタで有線ポートを増設しました。まずケーブルを L2SW(他の2台と同じ VLAN のポート)に挿してリンクを張ってから設定します。

設定は「ネットワーク接続」画面から行います。Win + R →ncpa.cpl で開き、増設した USB-LAN の「イーサネット」をダブルクリック し「プロパティ」から「インターネット プロトコル バージョン4 (TCP/IPv4)」を選択します。

項目値
IP アドレス192.168.56.3
サブネット マスク255.255.255.0
デフォルト ゲートウェイ空欄
DNS サーバー空欄

図: TCP/IPv4 のプロパティ。「次の IP アドレスを使う」で IP アドレスとサブネットマスクを設定する。

管理者権限の PowerShell でも設定できます。

netsh interface ipv4 set address name="イーサネット" static 192.168.56.3 255.255.255.0
netsh interface ipv4 set dnsservers name="イーサネット" static none

設定後、ipconfig /all で IPv4 アドレスが 192.168.56.3(優先) になっていれば成功です。

ipconfig /all

図: ターゲットPCの ipconfig /all。IPv4 が 192.168.56.3(優先)、物理アドレスは F8-E4-3B-A2-C9-2A。

最後に、3台を起動した状態でターゲットPCから疎通確認をしておきます。

ping 192.168.56.1   # 攻撃元PC(Kali) に届くか
ping 192.168.56.2   # サーバー(Alma) に届くか

-t を付けて連続 ping を流しておくと、あとで攻撃・防御を切り替えたときに通信断が起きないか(あるいはどこで途切れるか)をリアルタイムに確認できます。

図: pingで疎通できている状態。

ターゲットPCのブラウザで http://192.168.56.2 を開くと、サーバーに置いた「サーバーのページ」(Server: Alma Linux)が表示されます。この画面が、Step4で偽ページに置き換わるかどうかを確認する基準になります。

図: 平常時。URL 192.168.56.2 にサーバーのWEBページ(Server: Alma Linux)が出ている。

L2SW側の登録内容

L2SW側では、3台が同じ VLAN 10 のアクセスポート(Fa0/1〜0/3)に収容されていることを確認しておきます。show vlan brief と show mac address-table で、各ポートに正しいMACが学習されていれば土台はOKです。

L2SW1#show vlan brief
VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
10   VLAN0010                         active    Fa0/1, Fa0/2, Fa0/3

L2SW1#show mac address-table
  10    0800.275a.87bc    DYNAMIC     Fa0/3     ← Kali(.1)
  10    0800.2770.f1c9    DYNAMIC     Fa0/2     ← Alma(.2)
  10    f8e4.3ba2.c92a    DYNAMIC     Fa0/1     ← ターゲット(.3)

まとめ

本記事の前編では、下記の内容について解説しました。

  • ARPとは?
  • ハンズオンの構成
  • ハンズオンStep1: 環境構築

後編の記事では実機でARPスプーフィングの手口を検証していきます。
後編はこちら:【後編】社内LANは信頼できる?ARPスプーフィングの手口を実機で体感しよう

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

弊社FindConsulting在籍のエンジニアです。
システム基幹開発からWeb開発、ネットワーク運用、インフラ講師まで、IT業界において幅広い役割を担ってまいりました。
データの流れを設計する開発力と、インフラを安定稼働させる運用力の双方を併せ持っていることが強みです。
本ブログでは、これまでのマルチな経験をベースに、日々のアウトプットとして技術情報を発信していきます。

目次