一、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库重做一遍。