euniclusRusの力を借りてARPポイズニングツールを実装します。以前c言語でツールを実装しました。ARPポイズニング(ARPスプーフィング)を検証するこれをRustで作るとどのような形になるのかに興味がありました。今回は主に実装を中心に書きたいと思います。Rustのベストプラクティス実現するために必要なものRustで実現するためにひとまずドキュメントを読みました。https://docs.rs/pnet/0.22.0/pnet/index.htmlそこで関連しそうなものをもつけました。MutableEthernetPacketMutableArpPacketおそらくこれらを使うことになるでしょう。pnetを使うことはわかっていました。Rustに限らず低レイヤのパケットを扱うにはRawSocketにアクセスする必要があります。この方法に関しては以前に記事にしました。Rustで低レベルのネットワークプログラムをつくるこの記事ではパケットをキャプチャするプログラムを作りました。今回も同じようにデータリンク層にアクセスします。他にも細かいところで必要なものが出てくると思いますがそれは後々カバーできるでしょう。あとはスプーフィングを実現するプログラムを書いていくだけです。実装まずはCargo.tomlに依存クレートを記載します。"0.22.0"お馴染みのpnetです。このpnetにはしばらくお世話になるとおもいます。必要なモジュールをインポートします。time};どれが何に使われるかはある程度見当がつくと思います。次はパケットを作成します。この部分が一番の悩みどころでした。{arp.set_hardware_type(ArpHardwareType::new(1));arp.set_protocol_type(EtherTypes::Ipv4);arp.set_hw_addr_len(6);arp.set_proto_addr_len(4);arp.set_operation(ArpOperation::new(1));arp.set_sender_hw_addr(s_mac);arp.set_target_hw_addr(d_mac);arp.set_sender_proto_addr(s_ip);arp.set_target_proto_addr(d_ip);}main関数の頭で引数を取得します。取得する引数は5個です。送信元Macアドレス宛先Macアドレス送信元IPアドレス宛先IPアドレスあとはこれらの引数をつかってパケットを作成していきます。make_ethernet_packetとmake_earp_packetがその処理をします。この関数にそれぞれMutableEthernetPacketとMutableArpPacketのインスタンスを渡します。パケットを作り終わったらインターフェースを取得します。これは以前の記事でやりました。interface");interface}そしていよいよパケットの送信です。MutableEthernetPacketのpacket関数でパケットを[u8]にしたものを取得し、パケットを送信する処理そしてくれるsend_packet関数に渡します。None);thread::sleep(time::Duration::from_millis(1000));}}ソースコード全体はこのようになりました。対象ホストのARPテーブルを書き換えることができていたら成功です。ソースコードのクオリティはともかくテクニックの実現はできているようですね。Rustのベストプラクティス今回は一種のハッキングツールを作りました。Rustはまだ参考書も圧倒的に少なくベストプラクティスもあまり確立されていないように思えます。いう時にドキュメント読んで進んで何かを作ってみることは重要なことだと思います。行儀の悪い作り方をしているか不安になります。一日でも早くRustの作法が固まればいいなと思います。