1、网络应用程序设计,网络安全相关编程示例 host&port scan ip packet capture,主要内容,1. 主机扫描2. 端口扫描 3. IP包捕获,1. 主机扫描,可以攻击的目标主机在那里?,1. 主机扫描 - ICMP协议的主要功能,1. 主机扫描 - ICMP数据包的结构(1),ICMP数据包的基本结构,1. 主机扫描 - ICMP数据包的结构(2),ICMP包的主要类型ICMP差错控制包:3表示目的站不可达,4表示源站抑制,5表示路由重定向,11表示超时,12表示参数出错ICMP查询包:0与8表示回送请求与响应,9和10表示路由器查询与通告,13与14表示时间戳请求与响应
2、,17与18表示地址掩码请求与响应,1. 主机扫描 - PING程序的工作原理(1),PING(Packet Internet Grope)称为因特网包探索器,是一种测试网络连通性的程序PING程序向目的主机发送一个ICMP回送请求,并接收来自该主机的ICMP回送响应Ping是Windows系统自带的可执行命令,通过它可以检查网络是否连通,1. 主机扫描 - PING程序的工作原理(2),网络主机扫描的工作原理,1. 主机扫描 - PING程序的工作原理(3),ICMP回送请求与响应格式,1. 主机扫描 -设计要求(1),编写一个网络主机扫描程序,具体要求如下 要求实现的程序为图形化界面,可以
3、输入扫描的目的主机的IP地址,输出目的主机的状态(Open或Close)要求扫描支持ICMP协议的单台目的主机。点击“Scan”按钮,实现对目的主机的扫描过程,1. 主机扫描 -设计要求(2),程序图形界面,1. 主机扫描 -关键问题分析(1),创建原始套接字调用socket()函数创建原始套接字,SOCK_RAW表示原始套接字,IPPROTO_ICMP表示ICMP协议调用setsockopt()函数设置发送与接收超时时间,SO_SNDTIMEO表示发送超时,SO_RCVTIMEO表示接收超时,1. 主机扫描 -关键问题分析(2),定义ICMP头部的数据结构构造ICMP头部的数据结构,包括1字
4、节的类型、1字节的代码、2字节的头部校验和、2字节的标识符与2字节的序号构造IP头部的数据结构,1. 主机扫描 -关键问题分析(3),填充与发送ICMP数据包填充ICMP头部的各个字段,包括类型、代码、校验和、标识符与序号,回送请求类型为8,回送请求代码为0 调用sendto()函数来发送ICMP数据包,1. 主机扫描 -关键问题分析(4),接收与解析ICMP数据包用recvfrom()函数来接收ICMP数据包 依次解析ICMP头部的各个字段,包括类型、代码、校验和、标识符与序号,回送响应类型为0,回送响应代码为0,2. 端口扫描,目标主机的哪些端口是开放的?,2. 端口扫描 - 主要的传输层
5、协议,TCP数据包的基本结构,2. 端口扫描 - 主要的传输层协议(2),UDP数据包的基本结构,2. 端口扫描 -端口号的分配方法(1),端口是指网络服务在传输层的地址,它是一个在065535之间的整数TCP端口分配给TCP服务使用,UDP端口分配给UDP服务使用 端口可以分为3种类型:熟知端口、注册端口与临时端口端口分配由Internet赋号管理局(IANA)完成,2. 端口扫描 -端口号的分配方法(2),主要的TCP熟知端口号,2. 端口扫描 -端口号的分配方法(3),主要的UDP熟知端口号,2. 端口扫描 -端口扫描的工作原理(1),TCP端口扫描Connect扫描:调用Connect
6、系统调用尝试连接目的主机的指定端口SYN扫描:向目的主机的指定端口发送SYN=1的TCP包FIN扫描:向目的主机的指定端口发送FIN=1的TCP包,2. 端口扫描 -端口扫描的工作原理(2),UDP端口扫描端口扫描程序向目的主机的指定端口发送零字节的UDP包如果没有接收到任何数据包,并且确定目的主机开启,说明该端口处于开启状态如果接收到端口不可达的ICMP包,说明该端口处于关闭状态,2. 端口扫描 -设计要求(1),编写一个主机端口扫描程序,具体要求如下 要求实现的程序为图形化界面,可以输入扫描的目的主机的IP地址与端口,输出端口的状态(Open或Close) 要求扫描任意支持TCP/IP的主
7、机中的一个端口。点击“Tcp Scan”按钮,扫描TCP端口;点击“Udp Scan”按钮,扫描UDP端口,2. 端口扫描 -设计要求(2),程序图形界面,2. 端口扫描 -关键问题分析(1),TCP端口扫描端口扫描程序调用socket()函数建立套接字,SOCK_STREAM表示流式套接字调用connect()函数请求与目的主机的指定端口建立连接根据TCP连接是否成功建立,判断目的主机中的端口状态,2. 端口扫描 -关键问题分析(2),UDP端口扫描端口扫描程序调用socket()函数建立套接字,SOCK_DGRAM表示数据报套接字 调用ioctlsocket()函数将套接字设置为非阻塞调用
8、sendto()函数发送UDP数据包调用recvfrom()函数接收返回的错误码,判断目的主机的端口状态,3. IP包捕获 - libpcap,Libpcap (Packet Capture library)提供C函数接口 用于捕获经过网络接口的数据包由洛仑兹伯克利(Berkeley)实验室的研究人员Steven McCanne和Van Jacobson于1993年在Usenix93会议上正式提出的一种用于Unix内核数据包过滤体制该函数库支持Linux、Solaris和BSD系统平台。采用libpcap可以捕获本地网络数据链路层上的数据。,3. IP包捕获 - libpcap,广泛应用于:网
9、络参数统计协议分析防火墙入侵检测系统网络调试,3. IP包捕获 - BPF:Berkeley Packet Filter,libpcap库是基于BPF(Berkeley Packet Filter:BSD包过滤器)系统的。BPF是BSD系统在TCP/IP软件实现时所提供的一个接口,通过这个接口,外部程序可以获取到达本机的数据链路层网络数据,同时也可以设置过滤器,嵌入到网络软件中,获得过滤后的数据包。,3. IP包捕获 - BPF过滤机制,3. IP包捕获 - BPF工作过程,BPF是一种内核包捕获的体系结构BPF主要由两部分组成:Network tap和Packet Filter。Networ
10、k tap是一个回调函数(callback function包过滤器决定是否接收该数据包,3. IP包捕获 - Libpcap库函数接口简介,libpcap所提供的主要函数如下:pcap_t *pcap_open_live();用于获取一个包捕获描述符char *pcap_lookupdev();返回一个适于pcap_open_live()和pcap_lookupnet()函数使用的指向网络设备的指针int pcap_lookupnet();用于返回与网络设备相关的网络号和掩码int pcap_dispatch()或int pcap_loop();收集和处理数据包,3. IP包捕获 - Lib
11、pcap库函数接口简介,void pcap_dump();将一个包输出到由pcap_dump_open()打开的文件中保存int pcap_compile();用于将过滤规则字符串编译成一个内核过滤程序int pcap_setfilter();设定一个过滤程序int pcap_datalink();返回数据链路层类型,如10M以太网,SLIP,PPP,FDDI,ATM,IEEE802.3等,3. IP包捕获 - Libpcap库函数接口简介,void pcap_close();关闭关联设备(文件)并回收资源 int pcap_stats(pcap_t *, struct pcap_stat *
12、); 参数统计int pcap_read(pcap_t *, int cnt, pcap_handler, u_char *);打开设备,3. IP包捕获 -一个简单的Libpcap测试程序,#ifdef _cplusplusextern C #endif#include #ifdef _cplusplus#endifvoid printer(u_char * user, const struct pcap_pkthdr * h, const u_char * p)printf(I get one packet! );#define DEFAULT_SNAPLEN 68int main()char ebufPCAP_ERRBUF_SIZE;char *device = pcap_lookupdev(ebuf);bpf_u_int32 localnet, netmask;,3. IP包捕获 -一个简单的Libpcap测试程序,pcap_lookupnet(device, ,3. IP包捕获 -一个简单的Libpcap测试程序,pcap_setfilter(pd, ,