天天看点

网络安全开发系列--笔记(1)

网络安全技术

1.数据包捕获技术操作系统提供的数据包捕获技术主要存在三种:

SOCK_PACKET类型套接口:利用操作系统提供的编程接口来实现

数据链路提供者接口DLPI:

伯克利数据包过滤(BPF):高效数据包捕获技术,工作操作系统内核层

2.网络协议分析三个内容

         捕获数据包:使用专业的捕获数据包的开发包。例如Libpcap和Winpcap

         过滤数据包:内核层进行数据包过滤;应用层进行数据包过滤。使用Libpcap因为使用了BPF过滤机制在内核层进行过滤效率表现的更高。

         协议分析:逐层进行分析。

3.数据包生成技术:代表Libnet,专业的网络数据包生成开发包

4.网络安全扫描技术:扫描、漏洞扫描、特殊扫描

5.防火墙技术

6.入侵检测技术

网络安全开发包种类

  1. 数据包捕获开发包:Libpcap
  2. Windows平台专业数据包捕获开发包WinPcap
  3. 网络数据包构造和发送开发包Libnet
  4. 网络入侵检测开发包Libnids
  5. 通用网络安全开发包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下文件结构如下:

网络安全开发系列--笔记(1)

4.相关函数:在pcap.h中定义了libpcap的相关使用函数。其中包括接口函数、规则函数、数据包捕获函数、文件相关函数、错误处理函数、以及一些其他辅助函数。

Libpcap使用

  1. 简单获取接口信息

#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;

}

编译和执行:
网络安全开发系列--笔记(1)
网络安全开发系列--笔记(1)

说明:在源代码进行分析之前介绍一个插件工具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;

}

编译和执行:
网络安全开发系列--笔记(1)
加入共色部分代码
网络安全开发系列--笔记(1)

说明:

         本部分用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函数进行释放,否则可能出现段错误。