网络安全技术
1.数据包捕获技术操作系统提供的数据包捕获技术主要存在三种:
SOCK_PACKET类型套接口:利用操作系统提供的编程接口来实现
数据链路提供者接口DLPI:
伯克利数据包过滤(BPF):高效数据包捕获技术,工作操作系统内核层
2.网络协议分析三个内容
捕获数据包:使用专业的捕获数据包的开发包。例如Libpcap和Winpcap
过滤数据包:内核层进行数据包过滤;应用层进行数据包过滤。使用Libpcap因为使用了BPF过滤机制在内核层进行过滤效率表现的更高。
协议分析:逐层进行分析。
3.数据包生成技术:代表Libnet,专业的网络数据包生成开发包
4.网络安全扫描技术:扫描、漏洞扫描、特殊扫描
5.防火墙技术
6.入侵检测技术
网络安全开发包种类
- 数据包捕获开发包:Libpcap
- Windows平台专业数据包捕获开发包WinPcap
- 网络数据包构造和发送开发包Libnet
- 网络入侵检测开发包Libnids
- 通用网络安全开发包libdnet
一、网络数据包捕获开发包Libpcap
Libpcap官网:http://www.tcpdump.org/
linux下安装Libpcap:apt-get install libpcap-dev
下载当前最新版本源代码用于分析:wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz(当前最新版本1.9.0)
1.Libpcap的作用主要有三个方面:(1)捕获各种数据包;(2)过滤网络数据包;(3)分析网络数据包;(4)存储网络数据包
2.libpcap的构成:
(1)BPF捕获机制:转发和过滤两部分构成
(2)过滤规则:两类数据构成标识和标识的修饰词(类型、方向、协议)
(3)网卡的设置:libpcap需要将网卡设置为混杂模式
3.文件
(1)pcap安装之后头文件在:/usr/include/pcap目录下在/usr/include下有个pcap.h文件但是该文件内容为#include<pcap/pcap.h>。
/usr/include/pcap下文件结构如下:

4.相关函数:在pcap.h中定义了libpcap的相关使用函数。其中包括接口函数、规则函数、数据包捕获函数、文件相关函数、错误处理函数、以及一些其他辅助函数。
Libpcap使用
- 简单获取接口信息
#include<stdio.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<pcap.h> typedef u_int32_t in_addr_t; int main(int argc,char **argv) { char error_content[PCAP_ERRBUF_SIZE]; struct in_addr net_ip_address; struct in_addr net_mask_address; char *net_interface; char *net_ip_string; char *net_mask_string; u_int32_t net_ip; u_int32_t net_mask; net_interNetwork Interface is:%s\n",net_interface); net_ip_address.s_addr=net_ip; net_ip_string=inet_ntoa(net_ip_address); printf("Network IP Address is:%s\n",net_ip_string); net_mask_address.s_addr=net_mask; net_mask_string=inet_ntoa(net_mask_address); printf("Network Mask Address is:%s\n",net_mask_string); return 0; } |
编译和执行: |
说明:在源代码进行分析之前介绍一个插件工具cscope这个工具本来用于前期分析内核源代码使用的。
cscope安装:apt-getinstall cscope
在/home/Soft/libpcap-1.9.0目录下使用如下命令:
cscope –Rbq
打开vim命令行输入:cscope add cscope.out
然后查询需要找的函数例如:cs find pcap_lookupdev就可以查询相关函数的定义了。
本程序几点需要注意:
(1)inet_ntoa()该函数需要三个头文件:<sys/socket.h>;<netinet/in.h>;<arpa/inet.h>
(2)编译时-lpcap一定不能丢了。
值得注意的是,pcap_lookupdev返回的是eth0的结果。这是因为该函数查找要捕获的默认设备,如果返回结果不为空则返回默认列表的第一个设备。目前该函数已经被废弃由pcap_findalldes函数代替。
pcap_lookupnet则用于获取网络接口信息。
为了能获取所有接口信息,需要对该代码进行改写:
#include<stdio.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<pcap.h> typedef u_int32_t in_addr_t; int main(int argc,char **argv) { char error_content[PCAP_ERRBUF_SIZE]; struct in_addr net_ip_address; struct in_addr net_mask_address; char *net_interface; char *net_ip_string; char *net_mask_string; u_int32_t net_ip; u_int32_t net_mask; pcap_if_t *alldevs; int ret; //net_intererror:%s\n",error_content); return -1; } while(alldevs) { printf("interface:%s\n",alldevs->name); alldevs=alldevs->next; } pcap_freealldevs(alldevs); return 0; } |
编译和执行: |
说明:
本部分用pcap_findalldevs函数代替了pcap_lookupdev能够输出所有端口信息(可以进一步扩展)。值得注意的是这里使用了pcap_if_t.。
typedef struct pcap_if pcap_if_t;
struct pcap_if {
struct pcap_if *next;
char *name;
char *description;
struct pcap_addr *addresses;
u_int flags;
};
struct pcap_addr {
struct pcap_addr *next;
struct sockaddr *addr;
struct sockaddr *netmask;
struct sockaddr *broadaddr;
struct sockaddr *dstaddr;
};
另外一点是使用了pcap_findalldevs函数后需要使用pcap_freealldevs函数进行释放,否则可能出现段错误。