猫型エンジニアのブログ

プログラム/ネットワーク系の技術関連をまとめたページです 

RAWソケットプログラミング(イーサフレーム応用編)

 ここではRAWソケットを用いてARP応答パケットを作成してみます。ARP応答のフォーマットに従って、ポチポチと値を入れていきます。

ARP応答のフォーマット

書き途中

RAWソケットでのプログラミング例

#!/usr/bin/env python
from socket import *
rawSocket = socket(AF_PACKET, SOCK_RAW)
rawSocket.bind(("eth1", 0))

class ether_flame:
     def __init__(self, src_mac, dst_mac, ethertype):
           self.src_mac = src_mac
           self.dst_mac = dst_mac
           self.ethertype = ethertype

     def string(self):
           return self.dst_mac + self.src_mac + self.ethertype

class arp_reply_packet:
     def __init__(self, src_mac, src_ip, dst_mac, dst_ip, hw_type="\x00\x01", proto="\x08\x00", h_len="\x06", p_len="\x04", opcode="\x00\x02"):

         self.hw_type = hw_type
         self.proto = proto
         self.h_len = h_len
         self.p_len = p_len
         self.opcode = opcode
         self.src_mac = src_mac
         self.src_ip = src_ip
         self.dst_mac = dst_mac
         self.dst_ip = dst_ip

     def string(self):
          return self.hw_type + self.proto + self.h_len + self.p_len + self.opcode + self.src_mac + self.src_ip + self.dst_mac + self.dst_ip

SRC_MAC = "\x11\x11\x11\x11\x11\x11"
DST_MAC = "\x22\x22\x22\x22\x22\x22"
ETHER_TYPE = "\x08\x06"
SRC_IP = "\xc0\xa8\x38\x66"
DST_IP = "\xc0\xa8\x38\x67"

flame = ether_flame(SRC_MAC, DST_MAC, ETHER_TYPE)
arp_reply = arp_reply_packet(SRC_MAC, DST_MAC, SRC_IP, DST_IP)

rawSocket.send(flame.string() + arp_reply.string())
~

実行結果

 Wiresharkでキャプチャした結果、無事に所望のARP応答パケットの作成ができました!
f:id:alexei-karamazov:20131130141720p:plain


次はIPパケットに移りたいと思います。