C++入侵检测与网络攻防之DPI项目初始化搭建

目录

 

1.入侵分析--日志查看

2.入侵分析--可以进程

3.报文解析项目介绍

4.dpi项目的需求分析

5.pcap文件的获取

6.pcap文件的介绍

7.pcap文件编程实现报文计数

8.复习

9.dpi库的设计

10.dpi库的接口基本实现

11.pcap透传参数实现以太网报文计数

12.以太网分析packet header长度问题

13.报文分析思路路径

14.解析以太网报文类型

15.ip报文的统计


 

1.入侵分析--日志查看

2.入侵分析--可以进程

3.报文解析项目介绍

1 入侵分析——系统日志
    •   一些常见的系统日志介绍如下:
    o   /var/log/messages: 一般的系统日志
    o   /var/log/kern.log: 系统内核日志   非法接入设备的时候可以在这里查看日志
    o   /var/log/boot.log: 系统启动日志   linux启动的时候输出的日志放到这里
    o   /var/log/auth.log: 登录相关的日志, 比如ssh/sudo成功失败的日志都在这里    
    o   /var/log/cron.d: cron计划任务的执行日志
    •   审计, 审计日志由auditd产生,/etc/audit/auditd.conf为审计配置文件,/etc/audit/audit.rules 为审计规则文件。
        /var/log/audit/* : 为审计记录,可以进一步分析,也许可以发现一些意想不到的痕迹(如果有的话).
 

4.dpi项目的需求分析

2 可疑进程分析
    使用top命令或者ps命令来查看当前正在运行的命令
    查看该进程启动的完整命令行: ps eho command -p $PID
    查看该进程启动时候所在的目录: readlink /proc/$PID/cwd
    查看该进程启动时的完整环境变量: strings -f /proc/$PID/environ | cut -f2 -d ‘ ‘
    列出该进程所打开的所有文件: lsof -p $PID

    查看当前主机的网络连接情况, netstat -apn | grep $PID
    抓包分析,tcpdump 或者 使用图形化抓包工具wireshark
    查看主机防火墙iptables, DNS(/etc/resolv.conf和/etc/resolvconf/)、http代理,或者/etc/hosts, 都可能会导致我们正常的网络请求被攻击者监听并篡改. 这些小小的修改也许不是很明显,可一旦发现自身网络环境’不太对劲’, 就要提高警惕, 仔细排查了.
 

5.pcap文件的获取

3 深度报文解析需求

    传入数据:
        网络的原始报文(可以实时抓包进行分析,也可以使用一些pcap文件进行分析)

    传出数据:
        对应网络报文的协议


    传入pcap文件,最后得到结果,对应的一些应用协议报文有多少....

6.pcap文件的介绍

4 获取pcap文件
    1 tcpdump -i 网卡名 -w 要存储的文件名.pcap [过滤器]
    2 使用wireshark进行抓包,抓包完成之后存成pcap文件即可

    编程基础
    apt install libpcap-dev

    #include <pcap/pcap.h>
    链接库 -lpcap

    1 初始化
        char errbuf[PCAP_ERRBUF_SIZE];
        pcap_t *pcap_open_offline(const char *fname, char *errbuf);
            fname : pcap文件
            errbuf: 错误信息的输出

            返回值:
                句柄,不需要我们去解析里边的内容,给其他api来使用的
                成功返回非0,失败返回NULL,并且errbuf被赋值

7.pcap文件编程实现报文计数

  2 业务处理
        我们业务是从pcap文件里边去解析每一个报文
        每一个报文包含一个packet header + packet data

        需要一个循环来读取每一个报文
       typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,
                                   const u_char *bytes);

       int pcap_loop(pcap_t *p, int cnt,
               pcap_handler callback, u_char *user);

            这是一个循环的函数,用来解析pcap文件中的每个报文

            p : 句柄 ,pcap_open拿到的
            cnt : 遍历多少个报文,如果值为0或者-1 ,遍历所有报文
            callback : 回调函数
                具体回调逻辑可以大概认为如下:

                while(文件还没有到达最后)
                {
                    遍历一个packet header + packet data;
                    callback(user自定义参数,&packetHeader,&packetData);
                }


            user: 自定义回调参数,就是每次调用我们的回调函数的时候会传进来


            返回值:
                成功返回0,出错失败返回-1

8.复习

   3 垃圾回收

         void pcap_close(pcap_t *p);
            p就是pcap_open得到的句柄

5 将dpi 做成一个库

    库对应有更好的灵活性,目前我们要做的东西只是一个大系统的模块


    定义接口:

        句柄就是结果集:
        typedef struct dpi_result
        {
            unsigned int ether_count;        //以太网报文数量
            unsigned int ip_count;           //ip报文数量
            unsigned int tcp_count;          //tcp 报文数量
            unsigned int udp_count;          //udp报文数量
            unsigned int ssh_count;          //ssh报文数量
            //...
        }dpi_result;

        1 初始化
            dpi_result* dpi_init(const char *pcapfile);
                pcapfile :要处理的pcap文件
                返回值:设计一个句柄,这个句柄包含了结果
                    成功返回非空的指针,失败,返回NULL

        2 业务处理
            void dpi_loop(dpi_result *res);
                启动执行报文解析的函数


        3 资源释放
            void dpi_destroy(dpi_result *res);

9.dpi库的设计

6 以太网报文的解析


    每个packet header中都有两个字段  caplen len
        caplen 是抓取到的报文存到pcap文件中的实际大小
        len 是被抓取的报文的理应该大小

        如果抓包的过程中,2k的报文,抓到1k数据后就中断
            caplen = 1k
            len = 2k 

    保护措施,如果这两个值不等,表名报文被中断,不应该再继续做解析


    对于数据中的字段位置确定的,访问方式最好是使用结构体
 

10.dpi库的接口基本实现

  struct eth *hdr = data;
    hdr->type ;   直接操作type就可以操作对应的13-14个字节


    定义一个结构体,标识一个报文的解析的路径信息
    typedef struct dpi_pkt
    {
        uint32_t ether_len;         //以太网报文长度
        char     *ether_packet;     //以太网报文的地址
        uint32_t ip_len;            //ip报文长度
        char     *ip_packet;        //ip网报文的地址
        uint32_t tcp_len;           //tcp报文长度
        char     *tcp_packet;       //tcp报文的地址
        uint32_t udp_len;           //udp报文长度
        char     *udp_packet;       //udp报文的地址
    }dpi_pkt;
 

11.pcap透传参数实现以太网报文计数

 

12.以太网分析packet header长度问题

 

13.报文分析思路路径

 

14.解析以太网报文类型

 

15.ip报文的统计

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值