MACアドレスが書き換えるのは、
容易ではないというイメージをお持ちでも
以外と方法を知ってしまえば、
簡単にできてしまうということを
実感できるかと思います。
余談ですが、基本的に
Etherヘッダーは暗号化されていないため、
通信中のパケットを見てしまえば、
MACアドレスが他の人にバレバレです。
また書き換えができてしまうため、
MACアドレスだけを認証に使うのは、
セキュリティ面では不十分だということが
今回のことでよく分かります。
※MACアドレスの書き換えを試すだけ、
であれば、仮想環境でやりましょう。
私の場合は、Kali Linuxを
Virtual Box上で使用しました。
MACアドレスを表示させるコードの
解説はこちらにまとめました。
https://wireless-network.net/macaddress-viewer/
↑を読んでからだと理解しやすいかもです。
MACアドレスを書き換えるコードは、
これに少し追記しただけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include<stdio.h> #include<string.h> #include<sys/ioctl.h> #include<sys/socket.h> #include<net/if.h> #include<net/ethernet.h> #include<arpa/inet.h> int main(void) { struct ifreq ifreq; int s=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if(s<0){ perror("[-]socket()"); } memset(&ifreq, 0, sizeof(struct ifreq)); strncpy(ifreq.ifr_name, "eth1", sizeof(ifreq.ifr_name)-1); if(ioctl(s, SIOCGIFHWADDR, &ifreq)<0) perror("[-]ioctl()"); printf("Mac Address\n"); printf("before <%02x:%02x:%02x:%02x:%02x:%02x>\n", (unsigned char)ifreq.ifr_hwaddr.sa_data[0], (unsigned char)ifreq.ifr_hwaddr.sa_data[1], (unsigned char)ifreq.ifr_hwaddr.sa_data[2], (unsigned char)ifreq.ifr_hwaddr.sa_data[3], (unsigned char)ifreq.ifr_hwaddr.sa_data[4], (unsigned char)ifreq.ifr_hwaddr.sa_data[5]); ifreq.ifr_hwaddr.sa_data[0] = 0x08;//OUI ifreq.ifr_hwaddr.sa_data[1] = 0x00;//OUI ifreq.ifr_hwaddr.sa_data[2] = 0x27;//OUI ifreq.ifr_hwaddr.sa_data[3] = 0xaa; ifreq.ifr_hwaddr.sa_data[4] = 0xaa; ifreq.ifr_hwaddr.sa_data[5] = 0xaa; if(ioctl(s, SIOCSIFHWADDR, &ifreq)<0)perror("[-]ioctl()"); printf("after <%02x:%02x:%02x:%02x:%02x:%02x>\n", (unsigned char)ifreq.ifr_hwaddr.sa_data[0], (unsigned char)ifreq.ifr_hwaddr.sa_data[1], (unsigned char)ifreq.ifr_hwaddr.sa_data[2], (unsigned char)ifreq.ifr_hwaddr.sa_data[3], (unsigned char)ifreq.ifr_hwaddr.sa_data[4], (unsigned char)ifreq.ifr_hwaddr.sa_data[5]); return 0; } |
実行する前にまずは、
MACアドレスを確認します。
ifconfig で確認できます。
以下の画像は、
インタフェース名も指定してあります。

eth1のMACアドレスは、
08 : 00 : 27 : fb : c8 : 85 でした。
上記のコードを実行してみます。

期待通りにMACアドレスの値が
書き換わっていることが分かります。
このときにifconfigで再度確認しても
書き換えた値が表示されます。
ちなみに今回は、
OUI(ベンダコード)はそのままにして、
下位3バイトのみを書き換えました。
ここで全6バイトを書き換えると
どうなるのでしょうか。。。
試しにやってみました。
11 : 11 : 11 : aa : aa : aaで試しました。

MACアドレスをインタフェースに
セットするioctl(SIOCSIFHWADDR)で
エラーが発生しました。
OUIまで書き換えると
上手くいかないみたいですね。
これも上手く書き換える方法は
あるのでしょうか。
さて話をもどしまして、
仮想環境で書き換えると、
実は書き換えたMACアドレスでは、
インターネットにつながりません。
これには以下の原因が考えれます。
仮想環境で書き換えたMACアドレスは、なぜインターネットにつながらないのか
実際にVirtual Boxのサイトで
確認はしていないので、
ここからは私の憶測が少し混じります。
その前にまずは、
Virtual Boxの画面上でMACアドレスを
確認してみましょう。
まずは設置を開きます。
すると以下の画面になります。

左のネットワーク欄をクリックします。
すると、自分が設定している
アダプターリストが開きます。
デフォルトではアダプター1に
「NAT」が割り当てられています。
ホストオンリーアダプター以外であれば、
どのアダプターでも良いのですが、
アダプター欄の下にMACアドレスが
表示されています。
これがインタフェースに割り当てられた
MACアドレスになります。
ちなみに右の緑枠を押すと、
MACアドレスを変更することが出来ます。
では次に仮想環境の内部構造について
もう少し考えてみたいと思います。
仮想環境と実環境のイメージです。

仮想環境のMACアドレスは、
仮想的なMACアドレスです。
実際に通信をする際は仮想スイッチによって、
物理MACアドレスと仮想MACアドレスが
対応づけられることになります。
仮想スイッチは以下の目的があります。
- PC内部にいる複数の仮想OS同士をつなげて、ネットワーク構築する。
- 物理NICと仮想NICを対応付け、仮想OSが外部ネットワークに出られるようにする。
先ほどお見せしたように、
Virutal Box上の画面でMACアドレスを
確認することが出来ます。
つまり仮想スイッチには、
表示されたこのMACアドレスが
仮想スイッチに登録されることになります。
そしてここからが本題ですが、
ネットワークの仮想化において
セキュリティ面を考慮して、
仮想OSを使用しているユーザが勝手に
MACアドレスの変更をしても
仮想スイッチは登録していないアドレスを
フィルタリングするようになっています。
これは正規の通信と見せかけた、
なりすまし防止の効果があります。
したがって今回のように、
MACアドレスを勝手に変更して、
外部ネットワークに出ようとしたところ
仮想スイッチによってパケット破棄された
と考えることができるかと思います。
試したことがないですが、
仮想ではなく実環境であれば
上手く書き換えられるかと思います。
最後まで読んでいただきありがとうございました。
CでIPアドレスを書き換える方法
https://wireless-network.net/ioctl-ip/