网络攻防——端口扫描
作业题目
本次实验主要对主机扫描和端口扫描原理的理解。使用python(scapy库)编写端口扫描程序,对目标IP(报含IP地址段)进行扫描,完成以下功能:
1)使用icmp协议探测主机是否开启;
2)对本机(关闭防火墙)的开放端口和非开放端口完成半连接、ACK、FIN、Null、Xmas、windows扫描,并与nmap扫描结果进行比较。
3)对远程(有防火墙)主机的开放端口和非开放端口完成半连接、ACK、FIN、Null、Xmas、windows扫描,并与2)进行比较,分析结果。
4)回答问题:样例程序中"conf.L3socket=L3RawSocket"的作用是什么?
实验步骤及结果
- 探测主机是否开启
将IP地址设置为本地回环地址:127.0.0.1,端口号设置为8901,IPY是IPy库中将字符串转为IP地址格式的处理函数,使用for循环处理可以实现"群ping"
第一行代码定义了一个数据报,目标IP地址是前面设置的地址,所用的协议是ICMP协议,数据报的内容是自定义的"leo-port-lab",最后将三层数据报通过"/"符号连接。
第二行代码使用sr1()函数将数据报发送出去,超时限制为1秒,即超过一秒认为数据报没有成果=功发送出去;verbose参数用于控制详细输出的级别,为了不输出无关字符串,设置为False
判断是否有返回的数据报来确定主机是否打开
- 对本机端口进行扫描
Nmap对本机端口的扫描结果
发现8900端口开放
- 半连接扫描:服务器和客户端建立TCP连接会发生三次握手,客户端先发送一个SYN数据报给服务器,如果端口开放,服务器会会返回一个标志位是SYN和ACK的数据报给客户端,如果端口没有开放,则会返回一个标志位是RST和ACK的数据报,为了不留下连接日志,客户端此时不需要返回ACK来建立连接。
使用上面的函数定义要发送的数据报并发送,将所用协议设置为TCP,标志位设置成S,即SYN位为1,函数返回值是返回的数据报,赋值给ans字典变量,将ans中的键值位TCP的值取出,对其flag的值进行判断,也可以使用十六进制数来表示,如RA可以表示为0x14,具体可见TCP数据报规范
对结果进行分析,如果标志位是SA,即SYN+ACK,说明端口开放,如果标志位是RA,即RST+ACK,说明端口关闭
开放端口扫描结果
非开放端口扫描结果
- ACK扫描:ACK扫描不能判断端口是否开放!客户端发送一个带有 ACK 标志和数据报,如果服务器返回一个带有 RST 标志的数据包,说明端口没有被过滤,不存在防火墙;如果目标服务器没有任何回应或者返回ICMP错误类型3且代码为1,2,3,9,10或13的数据报,说明端口被过滤且存在防火墙
开放端口扫描结果
非开放端口扫描结果
- FIN扫描:客户端发送FIN数据报,如果服务器没有返回数据报回应,说明端口开放,如果服务器返回一个 RST 数据报,说明目标端关闭的。
将所用协议设置为TCP,标志位设置成F,即FIN位为1
对结果进行分析,如果标志位是RA,即RST+ACK,说明端口关闭,如果ans==None,即没有返回数据报,说明端口开放
开放端口扫描结果
非开放端口扫描结果
- Null扫描:客户端发送没有标志位的数据报,如果服务器没有返回数据报回应,说明端口开放,如果服务器返回一个 RST 数据报,说明目标端关闭的。
将所用协议设置为TCP,标志位为空,即每个比特位都是0
对结果进行分析,如果标志位是RA,即RST+ACK,说明端口关闭,如果ans==None,即没有返回数据报,说明端口开放
开放端口扫描结果
非开放端口扫描结果
- Xmas扫描:客户端发送标志位为 PSH,FIN,URG的数据报,在正常情况下,三个标志位不能被同时设置,如果服务器没有返回数据报回应,说明端口开放,如果服务器返回一个 RST 数据报,说明目标端关闭的。
将所用协议设置为TCP,标志位为FPU,即PSH、FIN、URG对应比特位的值是1
对结果进行分析,如果标志位是RA,即RST+ACK,说明端口关闭,如果ans==None,即没有返回数据报,说明端口开放
开放端口扫描结果
非开放端口扫描结果
- Windows扫描:客户端发送一个标志位是ACK的数据报,如果返回的RST数据报没有被过滤,检查RST数据报中窗口的值,如果窗口大小的值是个非零值,说明服务器在准备建立连接传输数据,端口开放,窗口大小等于0,说明端口关闭。
将所用协议设置为TCP,标志位为A,即发送ACK报文
对结果进行分析,如果返回的数据报中的窗口值等于0,说明端口关闭,如果返回的数据报中的窗口值大于0,说明端口开放
开放端口扫描结果
非开放端口扫描结果
- 对远程主机进行扫描
- 半连接扫描:
开放端口扫描结果
非开放端口扫描结果
- ACK扫描
开放端口扫描结果
非开放端口扫描结果
- FIN扫描
开放端口扫描结果
非开放端口扫描结果
- Null扫描
开放端口扫描结果
非开放端口扫描结果
- Xmas扫描
开放端口扫描结果
非开放端口扫描结果
- Windows扫描
开放端口扫描结果
非开放端口扫描结果
- "conf.L3socket=L3RawSocket"的作用
设置后可以使用原始套接字进行网络通信,这里指定的是使用第三层(L3)套接字类型,在IP层构造数据包(类推发送ARP数据包则第二层)
- 结果分析
一个端口扫描的结果有三种:开放、关闭、被过滤,被过滤的结果不能够判断端口到底有没有开放,但可以判断出目标主机有防火墙拦截,所以被过滤这种结果并不是没有意义的。端口扫描的意义是区分这三种情况。半开放连接扫描可以根据返回数据报的类型判断是开放还是关闭,通过是否返回数据报判断扫描信息是否被过滤;但FIN,Null,Xmas扫描则不同,其本质是一个开放的端口收到没有设置SYN,ACK或RST标志位的异常数据报时,不会做出反应,而如果这个端口是关闭的,他会返回一个标志位是RST的数据报,这是由TCP协议本身决定的,但这三种方法有局限性,体现在:1)不同操作系统在对待这类事件做出的反应不同 2)如果发送出去的数据报丢失,如被防火墙拦截,会被误判成端口开放的情况。ACK扫描不能决定一个端口是否开放 ,只能判断目标是否有防火墙,所以在实际中可以先使用ACK扫描检查防火墙的状态。
在与有防火墙存在相比较时,由于防火墙类型为状态防火墙,区别于会将某些端口和IP全部拦截的无状态防火墙不同,状态防火墙会根据数据报的类型和TCP握手的阶段进行过滤,即使是同一端口,数据报类型的不同也会导致拦截情况的不同。比如状态防火墙不会过滤ACK包,但会过滤SYN包,因为SYN会建立连接,而防火墙不允许未经授权的陌生IP和服务器建立连接,对待ACK,无论是否关闭都返回RST,对待其他数据报请求,防火墙都会拦截,发出扫描的主机始终没有收到回复数据报,对端口的扫描结果不准确。
本文来自博客园,作者:Leo1017,转载请注明原文链接:https://www.cnblogs.com/leo1017/p/17950586