白帽系列01: 抓包

一、WhiteHat是什么?

WhiteHat, 中文名白帽, 是一个网卡抓包、包分析处理的 java 库。

抓包(Packet Capture, 简称 pcap ),就是通过网卡接收网络上的各种数据包(Packet),包括:自己的数据包,也包括别人的数据包。包括TCP、UDP等各种协议的数据包

收取数据包后,可以深入分析数据包,分析或获取情报。

当然,也可以通过网卡发送任意数据包。

数据包处理是维护网络安全的重要手段。白帽黑客通过各种技术手段排查漏洞、维护网络安全。

二、安装依赖库

使用 WhiteHat前, 必须要先安装依赖库 WinPcap 或者 libpcap。请根据你的OS环境选择:

(1) Windows

最简单的方法是安装 Wireshark 软件,则WinPcap库也同步装好了。

也可以单独安装 WinPcap, 下载地址: https://www.winpcap.org/install/bin/WinPcap_4_1_3.exe

(2) Ubuntu

bash 复制代码
apt install libpcap-dev

(3) CentOs

bash 复制代码
yum install libpcap-devel

(4) Mac

bash 复制代码
brew install libpcap

(5) Kali Linux: 一般自带libpcap, 不用装。

三、第一个抓包程序

1, 新建一个java maven 项目,修改 pom.xml, 将 whitehat 引入项目中

XML 复制代码
    <dependency>
    	<groupId>top.whitehat</groupId>
    	<artifactId>whitehat</artifactId>
    	<version>0.2.0</version>
    </dependency>

可以看到,Maven下载下来的 jar包是 whitehat-xxx.jar, 可以打开它,有源码的。

其中: top.whitehat.examples 中有本文所有的示例源码程序。

2, 三个步骤写一个抓包程序

java 复制代码
import top.whitehat.NetCard;  //网卡类

public class App1 {

	public static void main(String[] args) {
		// 第一步:打开网卡 (如果本机有多个网卡,自动首选连接互联网的网卡)
		NetCard card = NetCard.inet();
		
		// 第二步:定义一个接收数据包的 handler 处理程序
		card.onPacket(packet -> {
			// 处理包:打印
			System.out.println(packet);
		});
		
		// 第三步:开始抓包
		card.start(); 
	}
}

运行结果:(注意:在Linux, Mac上运行必须具有 root权限, Windows上不用)

java 复制代码
Tcp, Src: 192.168.100.212:59838, Dst: 121.36.47.3:443, [ACK], Seq=2424216054, Ack=2578474027, Win=509
Tcp, Src: 192.168.100.212:59838, Dst: 121.36.47.3:443, [ACK], Seq=2424217454, Ack=2578474027, Win=509
Tcp, Src: 121.36.47.3:443, Dst: 192.168.100.212:59838, [ACK], Seq=2578474027, Ack=2424218601, Win=499
Tcp, Src: 121.36.47.3:443, Dst: 192.168.100.212:59838, [ACK], Seq=2578474027, Ack=2424218601, Win=499
Tcp, Src: 121.36.47.3:443, Dst: 192.168.100.212:59838, [ACK], Seq=2578474422, Ack=2424218601, Win=499
Tcp, Src: 192.168.100.212:59838, Dst: 121.36.47.3:443, [ACK], Seq=2424218601, Ack=2578474456, Win=514
Udp, Src: 192.168.100.111:2103, Dst: 192.168.100.255:2103

这个程序的唯一作用是打印网卡抓到的各种数据包,可以看到:有各种协议的,有自己的,别人的...

这个程序是个死循环,请在IDE中强行中断运行。

四、过滤 (filter)

由于通过网卡的数据包太多了,我们往往只需要关注某几种,因此需要过滤。

NetCard 对象有一个filter() 方法, 可以用一个字符串形式的表达式,过滤数据包。

java 复制代码
        // 定义filter表达式: 只需要 TCP 包, 且它的IP地址是 192.168.0.1
		String filterStr = "tcp and host 192.168.0.1";

        // 实施过滤
		card.filter(filterStr);  

这种表达式叫作 BPF(Berkeley Packet Filter) 。

一听到Beckeley, 就知道它很有来头。百科:https://baike.baidu.com/item/bpf/5307621

详细说明见: https://www.tcpdump.org/manpages/pcap-filter.7.html

示例程序源码在whitehat.jar中: top.whitehat.examples.Example03_Filter.java 中

五、转存 (dump)为.pcap文件 和 读取.pcap文件

packet dump(数据包转存)是指捕获网络接口上流动的数据包,并将其保存到文件,文件扩展名通常为 .pcap。

read dump 是指读取 .pcap文件,重新处理数据包。

Dump 示例在whitehat.jar中: top.whitehat.examples.Example04_Dump.java 中

readDump 示例在whitehat.jar中: top.whitehat.examples.Example05_ReadDump.java 中

六、ARP协议

ARP协议是一个局域网协议,用于查询IP地址与网卡MAC地址的对应关系。

百科:https://baike.baidu.com/item/ARP/609343

ARP 数据包收发示例在whitehat.jar中: top.whitehat.examples.Example06_ARP.java 中

七、ICMP协议

ICMP(Internet Control Message Protocol)Internet控制报文协议, 就是 ping 使用的协议。

ICMP 数据包收发示例源码在whitehat.jar中: top.whitehat.examples.Example07_ICMP.java 中

八、DNS协议

DNS(Domain Name System)将域名IP地址相互映射

DNS 数据包收发示例源码在whitehat.jar中: top.whitehat.examples.Example08_DNS.java 中

九、DHCP协议

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)

DHCP 数据包收发示例源码在whitehat.jar中: top.whitehat.examples.Example09_DHCP.java 中

十、TCP协议的第一次握手包 SYN包

TCP协议 在建立连接时三次握手, 在结束连接时四次挥手。具体请查看相关文章。

TCP协议建立连接时第一次握手包 是 SYN包,可用于分析哪个是Client,哪个是Server。

TCP SYN数据包 示例源码在whitehat.jar中: top.whitehat.examples.Example10_TCP_SYN.java 中

十一、扫描IP网段

扫描指定网段,比如: 192.168.1.1/24, 发现哪些IP存在,或哪些IP不存在。

扫描的经典程序是 nmap

ScanIP 示例源码在whitehat.jar中: top.whitehat.examples.Example11_ScanIp.java 中

扫描方式可以是ARP扫描、Ping扫描、ICMP TimeStamp 扫描.

扫描速度默认是 5000个IP地址/秒,扫描一个C段 255个IP 仅 1秒, 扫描一个B段约 30秒,这个速度远高于nmap.

十二、扫描端口

扫描指定IP地址段 的 指定端口, 看哪些端口是开放的

比如: scanner.scan("192.168.0.1/24", "80,443"); 扫描网段中所有开放的80或443端口。

ScanPort 示例源码在whitehat.jar中: top.whitehat.examples.Example12_ScanPort.java 中

扫描技术就是SYN扫描, 向指定IP端口发一个SYN包,如果接收到SYN ACK响应包,则端口开放。后续,不建立TCP连接。

扫描速度默认是 5000个端口/秒,这个速度也是高于nmap的。

扫描的王者是 masscan, 号称每秒可以扫描1000万个端口,可以5分钟内扫描整个互联网。

为什么masscan如此之快,据说有四点: 一是无连接,二是无状态,三是异步,四是raw socket.

WhiteHat 库的 ScanPort 与 masscan相比, 异步、无连接做到了,但还是差了一大截。下一版再优化。

今天就到这里,设计两个场景作业:请想一想,动动手,写两个有点小意思的应用:

1, 办公室上下班管理场景:早上9:00检查谁来了谁没来, 晚上21:00检查谁的电脑没有关

2, 聪明的WIFI场景:谁来了、谁走了马上知道

老文章: 让小米路由器变成一个聪明的WIFI:有人回家,它就发短信告诉你

参考上文的思路,用WhiteHat库重做一遍。

相关推荐
sanggou2 小时前
基于Java实现的简易规则引擎(日常开发难点记录)
android·java
先做个垃圾出来………2 小时前
Python测试桩工具
java·开发语言·python
小芳矶2 小时前
【langchain框架——检索链】利用检索链创建自己的购物知识库并完成智能体的商品推荐
java·python·langchain
爱吃山竹的大肚肚2 小时前
优化SQL:如何使用 EXPLAIN
java·数据库·spring boot·sql·spring
行思理2 小时前
FastAdmin新手教程
java·开发语言·fastadmin
向上的车轮2 小时前
Apache Camel 与 Spring Integration的区别是什么?
java·spring·apache
nsjqj2 小时前
JavaEE初阶:计算机是如何工作的
java·java-ee
URBBRGROUN4672 小时前
Spring AI Alibaba入门
java·人工智能·spring