一、当日工作(或学习)内容及进展情况(以条目式陈述,必要时配图说明)

Libnids读书笔记:

Libnids(Library Network Intusion Detection System)网络入侵检测开发包,基于libpcap和libnet开发,是仿照linux内核中的TCP/IP协议部分而实现的。

libnids主要功能包括捕获网络数据包、IP碎片重组、TCP数据流重组以及端口扫描攻击检测和异常数据包检测等。IP碎片重组是libnids的一个重要内容,是仿照linux内核中的IP重组而实现的,所以非常可靠。libnids提供了TCP数据流重组功能,这是libpcap所不具备的,利用TCP数据流重组,可以分析基于TCP协议的各种应用层协议。另外,LIBNIDS还提供了检测TCP端口扫描攻击的功能,检测异常数据包的功能,这是入侵检测系统(IDS)最基本的功能。

LIBNIDS的使用范围:

  1. 入侵检测系统
  2. 网络协议分析
  3. 网络嗅探(网络监视)

除此之外利用LIBSNIDS还可以重现网络内容,还原网络数据,如重现HTTP协议中传输的网页、POP3协议中传输的电子邮件等。

LIBNIDS数据结构

基本常量

1.报警类型

下面是在LIBSNIDS中定义的警告描述常量

2. LIBNIDS状态

在对TCP数据流进行重组时,必须考虑到TCP的连接状态,在LIBNIDS中为了方便开发而定义了LIBNIDS状态,共有如下6种:

LIBNIDS描述的是连接的逻辑状态。真正的TCP连接状态有11种,它们对应于TCP协议的状态变迁图中的各个状态,定义如下:

3.校验和

实现了关于是否计算校验和的功能

tuple4

是LIBNIDS中最基本的一种数据结构

half_stream

用来描述TCP连接中一端的所有信息,客户端或服务器端。

tcp_stream

是一个TCP连接的所有信息

nids_prm

描述了LIBNIDS的一些全局参数信息

其中ip_filter函数指针,当IP数据包到达时,默认函数nids_ip_filter被调用,如果此函数返回非零值,此数据包就被处理;如果返回零,就被丢弃。nids_ip_filter函数定义如下:

在LIBNIDS中用nids_prm数据结构定义了一个全部变量nids_params,其定义和初始值如下:

在使用LIBNIDS开发程序时,可以首先对nids_params全局变量的值进行修改,这样对整个libnids就全部有效。

nids_chksum_ctl

描述的是计算检验和

LIBNIDS函数

1.基本函数

int nids_init(void);

函数返回值:函数调用成功返回1,失败返回0

对LIBNIDS进行初始化,主要内容包括打开网络接口、打开文件、编译过滤规则、设置过滤规则、判断网络链路类型、进行必要的初始化工作。

void nids_run(void);

欲行LIBNIDS,进入循环捕获数据包状态。实际上是调用LIBPCAP函数pcap_loop()来循环捕获数据包。

int nids_getfd(void);

函数返回值:执行成功就返回文件描述符,失败就返回-1。

获得文件描述符号

int nids_dispatch(int cnt);

函数返回值:函数执行成功就返回个数、失败就返回负数

参数描述:参数cnt表示捕获的数据包的个数

功能是调用LIBPCAP中的捕获数据包函数pcap_dispatch();

int nids_next(void);

函数返回值:成功1,失败0

调用LIBPCAP中捕获数据包函数pcap_next();

void nids_register_chksum_ctl(struct nids_chksum_ctl *ptr, int nr)

参数描述:参数ptr表示nids_chksum_ctl列表,参数nr表示列表中的个数

决定是否计算检验和。是根据数据结构nids_chjsum_ctl中的action进行决定的,如果所要计算的对象不在列表中,则必须都要计算检验和。

2.IP碎片函数

void nids_register_ip_frag(void(*));

参数描述:参数应该是一个回调函数的名字

注册一个能够检测所有IP数据包的回调函数,包括IP碎片。例如可用如下方式调用:

nids_register_ip_frag(ip_frag_function);

这样就注册了一个回调函数ip_ftag_function的定义类型如下:

void ip_frag_function(struct ip *a_packet, int len);

其中a_packet表示接受的IP数据包,参数len表示接受的数据包的长度。

此回调函数中可以检测所有的IP数据包,包括IP碎片。

void nids_register_ip(void(*));

参数描述:参数应该是一个回调函数的名字。

注册一个回调函数,可以接受正常的IP数据包。可以使用如下方式调用:

nids_register_ip(ip_function);

注册一个回调函数ip_function,此回调函数的定义类型如下:

void ip_function(struct ip *a_packet);

其中a_packet表示的是所捕获的IP数据包。

3.TCP数据流重组函数

void nids_register_tcp(void(*));

参数是一个回调函数

注册一个TCP连接的回调函数。定义如下:

void tcp_callback(struct tcp_stream *ns,  void **param);

其中参数ns表示一个TCP连接的所有信息,它的类型是tcp_stream数据结构;参数param表示要传递的连接参数信息,可以指向一个TCP连接的私有数据。

此回调函数接受的TCP数据存放在half_stream的缓存中,应该马上取出来,一旦此回调函数返回,此数据缓存中存储的数据就不存在了。half_stream成员offset描述了呗丢地的数据字节数。如果不想马上取出来,而是等到存储一定数量的数据之后再取出来,那么可以使用函数nids_discard(struct tcp_stream *a_tcp, int num_bytes);来处理。这样回调函数返回时,LIBNIDS将丢弃缓存数据之前的num_bytes字节的数据。如果不调用nids_discard()函数,那么缓存数据的字节应该为count_new字节。一般情况下,缓存中的数据应该是count_offset字节。

void nids_killtcp(struct tcp_stream * a_tcp)

a_tcp表示一个TCP连接

终止TCP连接。实际上是调用LIBNET的函数进行构造数据包,然后发送出去。

void nids_discard(struct tcp_stream *a_tcp, int num)

a_tcp表示一个TCP连接,参数num表示个数

丢弃num字节TCP数据,用于存储更多的数据。

4. UDP注册函数

LIBNIDS也提供了对UDP协议的分析,其注册函数定义如下:

void nids_register_udp(void(*))

参数是一个回调函数

注册一个分析UDP协议的回调函数,定义如下:

void udp_callback(struct tuple4 *addr,  char  * buf,  int  len,  struct  ip *iph)

addr表示地址端口信息,包括UDP发送端的IP地址和端口,以及UDP接收端额IP地址和端口;buf表示UDP协议负载数据内容;len表示UDP负载数据的长度;iph表示一个IP数据包,包括IP首部、UDP首部以及UDP负载内容。

定以后,在此回调函数中就可以对UDP数据包进行分析了。

LIBNIDS的使用

1.显示TCP连接

见附件

次程序的功能是重组TCP数据流,显示它们的连接状态以及传输的详细数据。利用此程序可以分析使用LIBNIDS的开发流程。首先用函数nids_init()进行初始化,然后注册相应的回调函数,最后让调用函数nids_run()进入循环捕获数据包的状态。不同的回调函数实现不同的功能,主要的工作都是在回调函数中实现的。

编译:gcc –o show_tcp_connection tcp.c –lnids –lpcap –lnet

结果如下:

2.显示UDP数据包

在LIBNIDS中,函数nids_register_udp()提供了捕获UDP协议的接口,在此函数中注册回调函数,然后在回调函数中对UDP协议进行分析。其回调函数类型如下:

void udp_callback(struct tuple4 *addr, char *buf, int len, struct ip *iph)

addr一对协议地址和端口;buf表示UDP协议的负载内容;len为buf长度;

代码见附件;

ping了一下suda网站,结果如下:

3.HTTP协议分析

HTTP协议用来实现WEB服务器和WEB浏览器之间的通信,其设计简单而灵活,它是基于客户端、服务器模型的,使用HTTP可以传输任何类型的数据,它是一个无连接的协议,每次连接只限处理一个请求。HTTP

协议是一个无状态的协议,其系统运行效率高,服务器应答速度快,但如果后续处理需要用到前面的信息,则必须重传,这样可能导致每次连接传送的数据量增大。

HTTP协议的运行基本过程主要有四步:首先浏览器与服务器建立连接;其次浏览器向服务器发送请求信息;然后服务器对请求做出应答,并发送给浏览器;最后数据传送完毕,关闭浏览器和服务器之间的连接。

其中最重要的是浏览器发送请求消息给服务器。请求消息包括的内容非常广泛,其中一般有请求行、普通头、HTTP请求头、实体头和实体。所有请求消息都由1个请求行、0个或多个头部行和1个回车换行组成。其中头部行可以是普通头、HTTP请求头或实体头,头部行之后是回车换行,回车换行之后可能有一个实体,也可以没有实体。回车换行表示实体的开始。

HTTP请求头中包括请求方法,HTTP请求方法有GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT。但是最常用的方法是GET,HEAD和POST。

浏览器向服务器发送一个请求,称为请求行,使用方式如下:

Method SP Request-URI SP HTTP-Version CRLF

其中Method表示请求方法。例如,GET表示请求指定的页面信息,并返回实体主体;HEAD表示只请求页面的首部;从客户机到服务器传送数据,在要求服务器和CGI做进一步处理时会用到POST方法,它主要用于HTML文本中FORM的内容,让CGI程序处理。Request-URI表示资源。HTTP-Version表示HTTP的版本。

请求头的内容有很多,在这里就不一一列举了。

浏览器发送给服务器请求信息后,服务器及时做出应答。服务器应答向浏览器返回的应答小异一般包括状态行、普通头、响应头、实体头和实体。

状态行的格式如下:

HTTP-Version SP Status-Code SP Reason-Phrase CRLF

其中Status-Code表示状态码,是3个数字码,分为五类,以1开头的表示信息响应类,以2开头的表示请求被成功处理,以3开头的表示请求被重定向,以4开头的表示客户的请求有错,以5开头的表示服务器不能满足要求。其详细描述也不一一列举了。

无论是客户端的请求信息还是服务器端的应答信息,都可能包括普通头、实体头和实体。其中普通头内容如下。见书。实体头内容也见书。

实体是传输的资源内容,是整个HTTP协议所要传输的真正内容。实体和头部用一个空行分隔开。

在理解了HTTP协议的格式和运行机理之后,可利用LIBNIDS的TCP数据流重组机制来分析HTTP协议的内容。要实现的目标是把HTTP协议中的所有信息都进行详细分析。其完整源代码见附件。

结果如下:

4.FTP协议分析

待看

5.Telnet协议分析

待看

6.POP3协议分析

POP3(Post Office Protocol 3)是适用于客户-服务器结构的脱机模型的电子邮件协议。它规定了怎样将个人计算机连接到Internet邮件服务器和下载电子邮件的电子协议,允许用户从服务器上把邮件存储到本地主机上,同时删除保存在邮件服务器上的邮件。POP3服务器是遵循POP3协议的接收邮件服务器,用来接收电子邮件。

在POP3协议中有三种状态:认可状态、处理状态和更新状态。

当客户机和服务器建立联系时,一旦客户机提供了自己身份并成功确认,即由认可状态转入处理状态,在完成相应的操作后客户机发出QUIT命令,则进入更新状态,更新之后重返认可状态。大多数现有的POP3客户机与服务器执行采用ASCII明文发送用户名和口令,在认可状态等待用户连接的情况下,客户发出连接,并由命令user/pass对在网络上发送明文用户名和口令给服务器进行身份确认。一旦确认成功,便转入处理状态。

POP3命令你刚由1个命令和一些参数组成。所有命令以一个回车换行CRLF结束。命令和参数由可打印的ASCII字符组成,它们之间由空格隔开。命令一般是3到4个字母,每个参数却可达40个字符长。POP3响应是由1个状态码和1个可能有附加信息的命令组成。所有响应也是由回车换行CRL结束的。有两周年高状态码,状态码”+OK”表示成功,状态码“-ERR”表示失败。

对POP3命令进行详细介绍,请参考书。

代码见附件

7.SMTP和ESMTP协议分析

简单邮件传输协议(SMTP, Simple Mail Transfer Protocol)是一组用于由源地址到目的地址传送邮件的协议,用以控制新建的中转方式。SMTP协议用于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,可以把E-mail寄到收信人的服务器上。SMTP服务器则是遵循SMTP协议的邮件发送服务商,用来发送或中转电子邮件。SMTP工作再两种情况下,一是电子邮件从客户机传输到服务器,二是从某一个服务器传输到另一个服务器。SMTP提供了一种邮件传输机制,当收件方和发件方都在一个网络上时,可以把邮件直接传给对方。当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP首先由发件方提出申请,要求与接收方SMTP建立双向的通信渠道。收件方可以是最终收件人,也可以是中间转发的服务器。收件方服务器确认可以建立连接后,双方就可以开始通信。

SMTP协议的基本流程如下:首先,建立连接;其次,客户端发送命令,以标识发件人自己的身份,然后发送邮件命令,服务器端做出响应,表明是否准备接受;再次,客户端发送邮件,以标识该电子邮件的计划接收人,服务器端则表示是否愿意为收件人接收邮件,如果协商成功,则发送邮件;最后,结束此次发送,退出连接。

在SMTP协议中,最重要的内容是SMTP命令和响应状态,这是STMP运行的基础。SMTP命令都以回车换行作为结束标志,下面对它们做详细描述。(见书)

SMTP客户端向SMTP服务器发送命令之后,SMTP服务器就会返回一个应答码。应答码的每一个数字都有特定含义,第一个数字为2时表示命令成功,为5时表示失败,3时表示没有完成。详细描述应答码的含义(见书)

ESMTP待看。

用LIBNIDS分析SMTP的操作过程,代码见附件。

8.IP数据包的捕获和分析

LIBNIDS不仅可以捕获正常的IP数据包,也可以捕获异常的IP数据包和IP碎片。LIBNIDS提供了捕获IP碎片的接口,可对IP碎片进行重组。

代码见附件

9.检测攻击的一个例子

使用LIBNIDS可以检测网络攻击,它是入侵检测系统的开发包。在LIBNIDS中提供了一些基本的检测技术,如对网络扫描攻击的检测,以及对异常IP数据包、异常TCP数据包和异常UDP数据包的检测。

在LIBNIDS提供的所有功能的基础上还可以进行更深入的开发,以检测更多的入侵行为,它为进一步的开发提供了最基本的功能,其中最镇南关要的就是TCP数据流重组功能。在此基础上,可以检测更多的网络攻击行为,另外LIBNIDS已经为开发者提供了一些检测攻击的功能,如上述的端口扫描检测功能,数据包异常检测功能。

检测端口扫描攻击,主要功能来自LIBNIDS中提供的默认函数sys_log()

代码见附件

二、存在问题及分析(以条目式陈述,必要时配图说明)

三、明日工作计划(以条目式陈述)

将对下列例程序的源代码进行分析和改写,着重HTTP协议分析,SMTP和POP3协议分析

1.显示TCP连接

2.显示UDP数据报

3.HTTP协议分析

4.FTP协议分析

5.TELNET协议分析

6.POP3协议分析

7.SMTP和ESMTP协议分析

8.IP数据包的捕获和分析

9.检测攻击的一个例子

Libnids读书笔记 (转)的更多相关文章

  1. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  2. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  3. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  4. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  5. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  6. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

  7. LOMA280保险原理读书笔记

    LOMA是国际金融保险管理学院(Life Office Management Association)的英文简称.国际金融保险管理学院是一个保险和金融服务机构的国际组织,它的创建目的是为了促进信息交流 ...

  8. 《3D Math Primer for Graphics and Game Development》读书笔记2

    <3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...

  9. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

随机推荐

  1. Codeforces Round #501 (Div. 3) F. Bracket Substring

    题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...

  2. BZOJ.4516.[SDOI2016]生成魔咒(后缀数组 RMQ)

    题目链接 后缀自动机做法见这(超好写啊). 后缀数组是可以做的: 本质不同的字符串的个数为 \(子串个数-\sum_{ht[i]}\),即 \(\frac{n(n+1)}{2}-\sum_{ht[i] ...

  3. 简表-Java-Echart报表介绍

    Java后台报表尝试了很多,最终发现了一款,而且是开源的,简表地址:http://www.jatools.com/jor/.问题的引入:该报表支持嵌套,钻去,应对excel类似的报表,足够了.但是,报 ...

  4. Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip dfs 按位考虑

    E. Mahmoud and a xor trip 题目连接: http://codeforces.com/contest/766/problem/E Description Mahmoud and ...

  5. FireDAC 下的 Sqlite [6] - 加密

    主要就是设置 TFDConnection 的两个链接参数: Password, NewPassword, 非常简单. const dbPath = 'C:\Temp\SQLiteTest.sdb'; ...

  6. POJ 1741 Tree (树分治入门)

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 8554   Accepted: 2545 Description ...

  7. Java 线程第三版 第四章 Thread Notification 读书笔记

    一.等待与通知 public final void wait() throws InterruptedException      等待条件的发生. public final void wait(lo ...

  8. JTAG – A technical overview and Timing

    This document provides you with interesting background information about the technology that underpi ...

  9. ARM 非对齐的数据访问操作

    I’m confused about unaligned memory accesses on ARM. My understanding was that they’re not allowed — ...

  10. [Deepin 15] 编译安装 MySQL-5.6.35

    在 Ubuntu 下,先前一直是 二进制包解压安装,详情参考: http://www.cnblogs.com/52php/p/5680906.html 现改为 源码编译安装: #!/bin/bash ...