テストと教育の目的で、次のように中間者シナリオを設定したいと思います。
eth0
およびeth1
を持つ中間者です。 Mはeth0
を介してネットワークに接続され、Tはeth1
を介して接続されます。セットアップのポイントは、Tがいくつかの要求に応答できる必要があることです(特にEAPoLを介した802.1X認証、したがってMはTを認証Oracleとして使用しています)。具体的には、デフォルトでは、Tはネットワークに接続され、802.1Xを介して自身を認証しますが、Mはアクセスを拒否されます。逆に、ユーザーはMには管理アクセス権を持っていますが、Tにはアクセスできません。目的は、特権がないためにTからは不可能なネットワーク診断を実行しているときにMをTに見せることです。
2つの可能なアプローチがあります:
関連するフレームを前後にコピーするプログラム(例:python with scapyまたはC with libpcap))を作成します。
ebtables
とiptables
を使用します。
ここでの質問は2に焦点を当てており、単純に次のようになります。目的の結果を達成するにはどうすればよいですか。
最初のステップは、eth0
とeth1
をブリッジすることでした(たとえば、それらをbr0
にアタッチします)。 ebtables
/iptables
ルールがない場合、Tはネットワークに直接接続されているかのように見えます。次に、主にIPv4でTになりすますことに焦点が当てられているため、次のルールを確立しました。
ebtables -A FORWARD -p IPv4 -j DROP
このルールは、IPv4トラフィックがブリッジを通過するのを防ぎます。ここで、Tになりすますために、Mはレイヤー2および3でいくつかのNATを実行する必要があります。
# interception of incoming packets for T:
ebtables -t nat -A PREROUTING -i eth0 -p IPv4 -d $TARGET_MAC_ADDR -j dnat --to-destination $MY_ETH0_MAC_ADDR
iptables -t nat -A PREROUTING -i eth0 -d $TARGET_IP4_ADDR -j DNAT --to-destination $MY_ETH0_IP4_ADDR
# spoofing of outgoing packets as coming from T:
ebtables -t nat -A POSTROUTING -o eth0 -p IPv4 -s $MY_ETH0_MAC_ADDR -j snat --to-source $TARGET_MAC_ADDR
iptables -t nat -A POSTROUTING -o eth0 -s $MY_ETH0_IP4_ADDR -j SNAT --to-source $TARGET_IP4_ADDR
私の素朴な考えは、これでうまくいくはずだということでした。しかし、そうではありません。 Tを「切断」することを除けば、MはTのように動作しません。特に、iptables -t nat -L -v -n
は、SNATルールが期待どおりにトリガーされることを示しますが、DNATルールは不活性です(つまり、何が起こっても0パケット)。ここで何が欠けていますか?
問題は これ に似ていますが、設定は同じではありません。
コメントの中でRuiは、NATを実行すると問題が発生しやすいプロトコルがあると指摘しています。これは、ルーターがアップストリームネットワーク(別名Cone NAT)でホストをマスカレードしている場合です。ただし、これはここでのポイントではありません。このシナリオでは、NATは、TをシェーディングしながらMをTに見せかけるために使用されます。Mは単にTのパケットをドロップします(最初のebtablesルールを参照)
802.1X(より正確には802.1X-2010)は認証のみを提供し、後続の「チャネル」セキュリティは提供しません。これは、TLSハンドシェイクがNULL暗号化と認証をもたらすかのようです-「サプリカント」は認証時にその真正性を証明しますが、認証後の「セッション」はハイジャックされた。
有線接続の解決策はMACsec(別名802.1ae、802.1X-2014の一部)です。 MACsecのワイヤレスペンダントはWPA/WPA2です。驚くべきことに、最も安価なハードウェアでもWPA2をマスターできますが、MACsecが可能なハイエンドスイッチは、そうでないものよりもかなり高価です。
とりわけ、説明されているシナリオは、MACsecなしの802.1Xは無価値であることを示しています。
アプローチ1)を試しても問題ない場合は、EAPOLプロキシの作成を終了しました( https://github.com/kangtastic/peapod )。手動で行いますが、必要に応じて、eth0のMACアドレスをターゲットのMACアドレスと自動的に一致するように変更することもできます。 eth0で静的IPv4アドレスを構成し、接続を取得できるようです。これは、私のプロキシがレイヤー3のものを処理しないためです。とにかく、あなたの説明に基づいて、私はそれがあなたの状況のために働くと確信しています。他にもいくつかのEAPOLプロキシがあり、ほとんどがPythonであり、見ればおそらく同じように機能します。
IPv4接続を取得するためにセッションがDHCP経由で起動した後、EAPOLサプリカントもアップストリームネットワークに「登録」する必要がある場合、アップストリームネットワークが特定のホスト名、クライアント識別子などを必要とするかどうかによって、状況は少し複雑になります。 DHCP要求で送信されます。最悪の場合、TのDHCPクライアントとまったく同じオプションを送信するようにMのdhclientを構成する必要があります。煩わしいですが、十分に永続的であれば、2つを同一にすることができます。サプリカントのMACをeth0に複製すると、そこでも役立ちます。
アプローチ2)eb/iptablesを使用することに設定されている場合-申し訳ありませんが、私はそこではあまり役に立ちません。 EAPOLマルチキャストグループアドレス01-80-C2-00-00-03は、802.1D準拠のブリッジによって転送されないため、EAPOLはデフォルトでLinuxソフトウェアブリッジを通過しません。これに対する解決策は次のとおりです。
echo 8 > /sys/class/net/brX/bridge/group_fwd_mask
(なぜ8であり、他の値ではないのですか?なぜなら https://interestingtraffic.nl/2017/11/21/an-oddly-specific-post-about-group_fwd_mask/ )
ブリッジを介してTに認証を依頼したので、それはすでにわかっていますが、他の人はそうではないかもしれません:)
中間者攻撃を見たことがありますか- https://github.com/mitmproxy/mitmproxy ?それはあなたが求めているすべてを行います。
wget https://github.com/mitmproxy/mitmproxy/releases/download/v2.0.2/mitmproxy-2.0.2-linux.tar.gz
またはPIPを使用
pip3 install mitmproxy
次に、それを実行します。
./mitmproxy --Host
ブラウザでプロキシを設定すると、必要なすべてのトラフィックがMITMになります。