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。

python程序设计安全渗透测试常见模块
socket模块

简介:

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数据包,说明,主机没有监听该端口

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-03-29 17:32  hygge!  阅读(534)  评论(0)    收藏  举报