TCP的三次握手与四次挥手/常见模块/半开扫描
三次握手
、
1.建立连接时,客户端发送SYN包到服务器
2.server收到SYN,必须确认client的SYN,同时自己发SYN+ACK
3.client收到server的SYN+ACK,向server发送确认包ACK
四次挥手

(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
简介:
Socket模块的主要目的是帮助在网络上的两个程序之间建立信息通道。
在Python中提供了两个基本的Socket模块: 服务端Socket 客户端Socket。
当创建了一个 服务端Socket 之后,这个Socket就会在本机的一个端口上 等待连接 客户端Socket 会 访问 这个端口,当两者完成连接之后,就可以进行交互了。
Socket的实例化:
socket(family,type[,protocal])
family是要使用的地址族。
常用的协议族有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX、UNIX域Socket)、AF_ROUTE等。
默认值为socket.AF_INET,通常使用这个默认值即可。
type用来指明Socket类型,
这里可以使用的值有三个: SOCK_STREAM,这是TCP类型,保证数据顺序及可靠性;这个是默认值
SOCK_DGRAM,用于UDP类型
SOCK_RAW,这是原始类型,允许对底层协议如IP或ICMP进行直接访问,基本不会用到
第三个参数指使用的协议,这个参数是可选的。通常赋值“0”,由系统自动选择。
如果希望初始化一个TCP类型的Socket,就可以使用如下语句。
s = socket.socket()
socket常用的函数
bind()
listen()
accept()
connect()
send()
sendall()
recv()
sendto()
recvfrom()
close()
使用Socket编写一个简单的服务端和客户端

python-nmap模块
python-nmap是一个可以帮助使用 Nmap功能的 Python 模块文件。
在python-nmap模块的帮助下,可以轻松地在自己的程序中使用Nmap扫描的结果,也可以编写程序自动化地完成扫描任务。
模块的作者的个人网站为http://xael.org/。
如果希望在Python中正常使用python-nmap模块,必须先在系统中安装Nmap。因为在这个模块文件中会调用Nmap的一些功能。
Windows操作系统下直接下载安装即可
Linux操作系统中则需要使用如下命令。
sudo apt-get install nmap
sudo pip3 install python-nmap

安装成功之后,打开一个终端,启动Python,然后导入Nmap,如下图所示。

python-nmap模块类的实例化
nmap.PortScanner()
python-nmap模块中的函数
scan()函数
all_hosts()函数:返回一个被扫描主机的所有列表
command_line()函数:返回在当前扫描中使用的命令行
csv()函数:返回值是一个CSV(逗号分隔值文件格式)的输出,如图所示。显示一个比较工整的扫描结果
has_host(self, host)函数:检查是否有host的扫描结果,如果有则返回True,否则返回False
scaninfo()函数:列出一个扫描信息的结构

PortScannerAsync类中最为重要的函数也是scan() 用法与PortScanner类中的scan()基本一样,但是多了一个回调函数。
完整的scan()函数格式为
scan(self, hosts='127.0.0.1',ports=None, arguments='-sV', callback=None, sudo=False),这里面的callback是以(host, scan_data)为参数的函数
![]()
编写一个简单的端口扫描器。扫描192.168.1.121 开放从1~1000的哪些端口,这里先使用命令行来完成这个程序。

运行结果:

Scapy模块文件
基本用法
在Kali Linux 中已经集成了Scapy,既可以在Python环境中使用Scapy,也可以直接使用它。启动一个终端,输入命令“scapy”,就可以启动Scapy环境,如图

Scapy的基本操作
在Scapy中,每一个协议就是一个类。 只需要实例化一个协议类,就可以创建一个该协议的数据包。例如,如果要创建一个IP类型的数据包,就可以使用如下命令。

注:IP数据包最重要的属性就是源地址和目的地址,这两个属性可以使用src和dst来设置
![]()
seed()用来发送IP数据包
seedp()用来发送Ether数据包
fuzz():如果希望发送一个内容是随机填充的数据包,而且又要保证这个数据包的正确性,那么可以是fuzz()函数。
sr(),sr1(),srp():在Scapy中提供了三个用来 发送和接收数据包的函数,分别是sr()、sr1()和srp(),其中,sr()和sr1()主要用于第三层,例如IP和ARP等。而srp()用于第二层。
sniff():这个函数可以在自己的程序中捕获经过本机网卡的数据包,这个函数最强大的地方在于可以使用参数filter对数据包进行过滤
![]()
使用Scapy来实现一次ACK类型的端口扫描
ACK扫描:扫描主机向目标主机发送ACK数据包。根据返回的RST数据包有两种方法可以得到端口的信息。方法一是: 若返回的RST数据包的TTL值小于或等于64,则端口开放,反之端口关闭
例如,对192.168.1.102 的 21、23、135、443、445 这5个端口是否被屏蔽进行扫描,注意是屏蔽不是关闭,采用ACK扫描模式,可以构造如下的命令方式。
>>> ans,unans =
sr(IP(dst="192.168.1.102")/TCP(dport=[21,23,135,443,445],flags="A"))
正常的时候,如果一个开放的端口会回应ack数据包,而关闭的端口会回应rst数据包。
在网络中,一些网络安全设备会过滤掉一部分端口,这些端口不会响应来自外界的数据包,一切发往这些端口的数据包都如同石沉大海。注意这些端口的状态并非是开放或者关闭,而是被屏蔽。
半开扫描
半开扫描(half-open scanning),即TCP SYN scan。
它利用了TCP连接建立三次握手的第一步,并且没有建立一个完整的TCP连接。实现办法是向远端主机某端口发送一个只有SYN标志位的TCP报文段,如果主机反馈一个SYN|ACK数据包,那么,这个主机正在监听该端口,如果反馈的是RST数据包,说明,主机没有监听该端口
浙公网安备 33010602011771号