安全渗透测试的常见模块(python)


一、Socket模块

1.简介

  • Socket模块的主要目的是帮助在网络上的两个程序之间建立信息通道。
  • 在Python中提供了两个基本的Socket模块:

服务端Socket
客户端Socket。

当创建了一个服务端Socket 之后,这个Socket就会在本机的一个端口上等待连接
客户端Socket会访问这个端口,当两者完成连接之后,就可以进行交互了。

2.实例化Socket类

在Python中, Socket模块的使用十分简单。
在使用Socket进行编程的时候,需要:首先实例化一个Socket类 ,
这个实例化需要三个参数:

第一个参数是地址族,
第二个参数是流,
第三个参数是使用的协议。

客户端与服务器
使用Socket建立服务端的思路主要是首先实例化一个Socket类 ,然后开始循环监听, 一直可以接收来自客户端的连接。
成功建立连接之后,接收 客户端发来的数据,并再向客户端发送数据,传输完毕之后,关闭这次连接。

使用Socket建立客户端则要简单得多,在实例化一个Socket类之后,连接一个远程的地址,这个地址由IP和端口组成。
成功建立连接之后,开始发送和接收数据,传输完毕之后,关闭这次连接。

Socket的实例化

格式为

socket(family,type[,protocal])

初始化一个TCP类型的Socket,就可以使用如下语句

s = socket.socket()

这条语句实际上相当于

socket.socket(socket.AF_INET,socket.SOCK_STREAM)

希望初始化一个UDP类型的Socket,则可以使用如下语句

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

3.Socket常用的函数-服务端函数

bind():这个函数由服务端Socket调用,会将之前创建Socket与指定的IP地址和端口进行绑定。如果之前使用了AF_INET初始化Socket,那么这里可以使用元组(host,port)的形式表示地址。
例如:

s.bind(('127.0.0.1',2345))

listen():这个函数用于在使用TCP的服务端开启监听模式。
可以使用一个参数来指定可以挂起的最大连接数量。
这个参数的值最小为1,一般设置为5.
例如,要在服务端开启一个监听,可以使用如下语句

s.listen(5)

accept():这个函数用于在使用TCP的 服务端 接收连接,一般是阻塞态。
接受TCP连接并返回(conn,address)
其中,conn是新的套接字对象,可以用来接收和发送数据;address是连接客户端的地址。

4.Socket常用的函数-客户端函数

connect():这个函数用于在使用TCP的 客户端去连接服务端 时使用,使用的参数是一个元组,形式为(hostname,port)
例外,在客户端程序初始化了一个Socket之后,就可以使用这个函数去连接到服务端

s.connect(("127.0.0.1",2345))

send():用于在使用 TCP 时发送数据,完整的形式为 send(string[,flag]),利用这个函数可以将string代表的数据发送到已经连接的Socket,返回值是发送字节的数量。但是可能未将指定的内容全部发送。

sendall():与send()相类似,也是用于在使用TCP时发送数据,完整的形式为 sendall(string[,flag])。与send()的区别是完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。
例如,使用这个函数发送一段字符到Socket,可以使用如下语句。

s.sendall(bytes("Hello,My Friend!",encoding="utf-8"))

5.服务端和客户端都可以使用的函数

recv():这个函数用于在使用TCP时接收数据,完整的形s式为recv(bufsize[,flag]),接收Socket的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量,flag这个参数一般不会使用。例如,通过这个函数接收一段长度为1024的字符Socket,可以使用如下语句。

obj.recv(1024)

sendto():这个函数用于在使用UDP时发送数据,完整的形式为

	sendto(string[,flag],address)

返回值是发送的字节数。address是形式为(ipaddr,port)的元组,指定远程地址。
recvfrom():UDP专用,接收数据,返回数据远端的IP地址和端口,但返回值是(data,address)。其中,data是包含接收数据的字符串,address是发送数据的套接字地址。
close():关闭socket。

二、python-nmap模块

目前Nmap已经具备如下的各种功能。

  • 主机发现功能。向目标计算机发送信息,然后根据目标的反应来确定它是否处于开机并联网的状态。
  • 端口扫描。向目标计算机的指定端口发送信息,然后根据目标端口的反应来判断它是否开放。
  • 服务及版本检测。向目标计算机的目标端口发送特制的信息,然后根据目标的反应来检测它运行服务的服务类型和版本。
  • 操作系统检测。

1.含义

python-nmap是一个可以帮助使用 Nmap功能的 Python 模块文件。
在python-nmap模块的帮助下,可以轻松地在自己的程序中使用Nmap扫描的结果,也可以编写程序自动化地完成扫描任务。

2.基本用法

python-nmap模块的核心就是
PortScanner、PortScannerAsync、PortScannerError、PortScannerHostDict、PortScannerYield等
5个类,其中最为重要的是PortScanner类。

3.实例化

最常使用的是PortScanner类,这个类实现Nmap工具功能的封装。对这个类进行实例化很简单,只需要如下语句即可实现。

nmap.PortScanner()

PortScannerAsync类和PortScanner类的功能相似,但是这个类可以实现异步扫描,对这个类的实例化语句如下

nmap.PortScannerAsync()

4.模块中的函数

scan()函数:这个函数的完整形式为
scan(self, hosts=‘127.0.0.1’, ports=None, arguments=’-sV’,sudo=False),
用来对指定目标进行扫描,其中需要设置的三个参数包括hosts、ports和arguments。

参数arguments的值也是字符串类型,这个参数实际上就是Nmap扫描时所使用的参数,
如“-sP”“-PR”“-sS”“-sT”“-O”“-sV”等。
“-sP”表示对目标进行Ping主机在线扫描,
“-PR”表示对目标进行一个ARP的主机在线扫描,
“-sS”表示对目标进行一个TCP半开(SYN)类型的端口扫描,
“-sT”表示对目标进行一个TCP全开类型的端口扫描,
“-O”表示扫描目标的操作系统类型,
“-sV”表示扫描目标上所安装网络服务软件的版本。

command_line()函数:返回在当前扫描中使用的命令行,如图所示
在这里插入图片描述
csv()函数:返回值是一个CSV(逗号分隔值文件格式)的输出,如图所示。显示一个比较工整的扫描结果
在这里插入图片描述
在这里插入图片描述
has_host(self, host)函数:检查是否有host的扫描结果,如果有则返回True,否则返回False
在这里插入图片描述
scaninfo()函数:列出一个扫描信息的结构
在这里插入图片描述
在这里插入图片描述
实现异步的函数
still_scanning():如果扫描正在进行,则返回True,否则返回False

wait(self, timeout=None):表示等待时间

stop():停止当前的扫描

三、Scapy模块文件

1.基本用法

Scapy提供了和Python一样的交互式命令行。Scapy可以作为Python的一个模块存在,但是Scapy本身就是一个可以运行的工具,它自己具备一个独立的运行环境,因而可以不在Python环境下运行。在Kali Linux 中已经集成了Scapy,既可以在Python环境中使用Scapy,也可以直接使用它。启动一个终端,输入命令“scapy”,就可以启动Scapy环境。

2.Scapy的基本操作

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

ip=IP()  #括号里可以加源地址/网段或目的地址/网段(dst="192.168.1.101"

3.Scapy采用分层的形式来构造数据包

  • 通常最下面的一个协议为 Ether,然后是IP,再之后是TCP或者是UDP。
  • IP( )函数无法用来构造ARP请求和应答数据包,可以使用Ether(),
  • 这个函数可以设置发送方和接收方的MAC地址。
  • Scapy中的分层通过符号“/”实现,一个数据包是由多层协议组合而成,这些协议之间就可以使用“/”分开,按照协议由底而上的顺序从左向右排列

例如
在这里插入图片描述
如果要构造一个HTTP数据包,也可以使用如下这种方式。
在这里插入图片描述
用ls()函数来查看一个类所拥有的属性
在这里插入图片描述

4.Scapy模块中的函数

send()和sendp()
这两个函数的区别在于send()工作在第三层,而sendp()工作在第二层。
send()是用来发送IP数据包的,而sendp()是用来发送Ether数据包的。
例如
在这里插入图片描述
这两个函数的特点是 只发不收,只会将数据包发送出去,但是没有能力处理该数据包的回应包!!

sr()、sr1()和srp()
在Scapy中提供了三个用来 发送和接收数据包的函数,分别是sr()、sr1()和srp(),其中,sr()和sr1()主要用于第三层,例如IP和ARP等。而srp()用于第二层。
在这里插入图片描述当产生的数据包发送出去之后,Scapy就会监听接收到的数据包,并将其中对应的应答数据包筛选出来,显示在下面。Reveived表示收到的数据包个数,answers表示对应的应答数据包。

sr()函数是Scapy的核心,它的返回值是两个列表
第一个列表是收到了应答的包和对应的应答,
第二个列表是未收到应答的包。所以可以使用两个列表来保存sr()的返回值


sr1()函数跟sr()函数作用基本一样,但是只返回一个应答的包。只需要使用一个列表就可以保存这个函数的返回值。

可以利用sr1()函数来测试目标的某个端口是否开放,采用 半开扫描(SYN) 的办法。
在这里插入图片描述
sniff():这个函数可以在自己的程序中捕获经过本机网卡的数据包,在 ctrl+c的时候 获取 sniff()的结果。
这个函数最强大的地方在于可以使用参数filter对数据包进行过滤。

例如,指定只捕获与192.168.1.102有关的数据包,可以使用“host 192.168.1.102”: >>>sniff(filter=" host 192.168.1.102")

同样,也可以使用filter来过滤指定协议,例如,icmp类型的数据包: >>>sniff(filter=“icmp”)

如果要同时满足多个条件可以使用“and”“or”等关系运算符来表达: >>>sniff(filter=" host 192.168.1.102 and icmp")

iface、count 参数:两个很重要的参数是 iface、count。
iface可以用来指定所要进行监听的网卡,count用来指定监听到数据包的数量,达到指定的数量就会停止监听。

5.Scapy模块的常用简单实例

使用Scapy来实现一次ACK类型的端口扫描
ACK扫描:扫描主机向目标主机发送ACK数据包。根据返回的RST数据包有两种方法可以得到端口的信息。方法一是:
若返回的RST数据包的TTL值小于或等于64,则端口 开放,反之端口 关闭

ans,unans = sr(IP(dst="192.168.1.102")/TCP(dport=[21,23,135,443,445],flags="A"))

正常的时候,如果一个开放的端口会回应ack数据包,而关闭的端口会回应rst数据包。
在网络中,一些网络安全设备会过滤掉一部分端口,这些端口不会响应来自外界的数据包,一切发往这些端口的数据包都如同石沉大海。注意这些端口的状态并非是开放或者关闭,而是被屏蔽

如果一个端口处于屏蔽状态,那么它将不会产生任何响应报文。
如果一个端口处于开放状态,那么它在收到syn数据包之后,就会回应一个ack数据包。
反之,如果一个端口处于关闭状态,那么它在收到syn数据包之后,就会回应一个rst数据包

四、情报收集

1.信息收集基础

信息收集获得信息的方法可以分成两种:被动扫描主动扫描
被动扫描主要指的是在目标 无法察觉的情况下 进行的信息收集,例如,如果想了解一个远在天边的人,你会怎么做呢?显然可以选择在搜索引擎中去搜索这个名字。其实这就是一次对目标的被动扫描。

主动扫描一般都是针对目标发送特制的数据包,然后根据目标的反应来获得一些信息。

扫描之后将会获得的信息包括:目标网络的结构,目标网络所使用设备的类型,目标主机上运行的操作系统,目标主机上所开放的端口,目标主机上所提供的服务,目标主机上所运行的应用程序

选择扫描目标的nmap语法如下所示。
(1)扫描指定IP主机:nmap 192.168.169.133
(2)扫描指定域名主机:nmap www.nmap.com。
(3)扫描指定范围主机:nmap 192.168.169.1-20。
(4)扫描一个子网主机:nmap 192.168.169.0/24。
对目标的端口进行扫描的nmap语法如下所示。
(1)扫描一个主机的特定端口:nmap -p 22 192.168. 169.1。
(2)扫描指定范围端口:nmap -p 1-80 192.168. 169.1。
(3)扫描100个最为常用的端口:nmap -F 192.168. 169.1
对目标端口状态进行扫描的nmap语法如下所示。
(1)使用TCP全开扫描:nmap -sT 192.168. 169.1。
(2)使用TCP半开扫描:nmap -sS 192.168. 169.1。
(3)使用UDP扫描:nmap -sU -p 123,161,162 192.168. 169.1。
对目标的操作系统和运行服务进行扫描的nmap语法如下所示。
(1)扫描目标主机上运行的操作系统:nmap -O 192.168.169.1。
(2)扫描目标主机上运行的服务类型:nmap -sV 192.168.169.1。

2.主机状态扫描

基于ARP的活跃主机发现技术
借助Scapy库来完成。其核心思想就是要产生一个ARP请求,首先查看Scapy库中ARP类型数据包中需要的参数
在这里插入图片描述
这里面的大多数参数都有默认值,其中,hwsrc和psrc分别是源硬件地址和源IP地址。
这两个地址不用设置,发送的时候会自动填写本机的地址。
唯一需要设置的是目的IP地址pdst,将这个地址设置为目标即可
lambda:需要在Python 环境下运行 :进入python解释器,导入 scapy模块: from scapy.all import *,再进行下列代码的书写

基于ICMP的活跃主机发现技术
ICMP位于TCP/IP协议族中的网络层,它的目的是用于在IP主机、路由器之间传递控制消息。
ICMP中提供了多种报文,这些报文又可以分成两大类:差错报文和查询报文。其中,查询报文都是由一个请求和一个应答构成的。
ICMP查询报文有4种,分别是响应请求或应答、时间戳请求或应答、地址掩码请求或应答、路由器询问或应答。

借助Scapy库来完成。其核心思想就是要产生一个ICMP请求,首先查看Scapy库中ICMP类型数据包中需要的参数
在这里插入图片描述
这一层和地址有关的参数有两个:dst是目的IP地址,src是源IP地址。

基于TCP的活跃主机发现技术
TCP(Transmission Control Protocol,传输控制协议)是一个位于传输层的协议。它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP的特点是使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答TCP的三次握手SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接.

如果检测到一台主机的某个端口有回应,也一样可以判断这台主机是活跃主机。
如果一台主机处于活跃状态,那么它的端口即使是关闭的,在收到请求时,也会给出一个回应,只不过并不是一个“SYN+ACK”数据包,而是一个拒绝连接的“RST”数据包。
利用TCP实现的活跃主机扫描程序,这个程序有很多种方式可以实现,首先借助Scapy库来完成。核心的思想就是要产生一个TCP请求,

首先查看Scapy库中TCP类型数据包中需要的参数
在这里插入图片描述
这里的大多数参数都不需要设置,需要考虑的是sport、dport和flags。sport是源端口,dport是目的端口,flags是标志位。

基于UDP的活跃主机发现技术
UDP全称是用户数据报协议,在网络中它与TCP一样用于处理数据包,是一种无连接的协议。在OSI模型中位于第4层——传输层,处于IP的上一层。
但基于UDP的活跃主机发现技术和TCP不同,UDP没有三次握手。
当向目标发送一个UDP数据包之后,目标是不会发回任何UDP数据包的。
不过,如果目标主机是处于活跃状态的,但是目标端口是关闭的时候,可以返回一个ICMP数据包,这个数据包的含义为“unreachable”
如果目标主机不处于活跃状态,这时是收不到任何回应的

3.端口扫描

  • 在信息收集阶段就需要对目标的端口开放情况进行扫描:

    • 因为一方面这些端口可能成为进出的通道,
    • 另一方面利用这些端口可以进一步获得目标主机上运行的服务,从而找到可以进行渗透的漏洞。
  • 对于网络安全管理人员来说,对管理范围内主机进行端口扫描也是做好防范措施的第一步

  • 正常的情况下,端口只有open(开放)和closed(关闭)两种状态。

  • 但是有时网络安全机制会屏蔽对端口的探测,因此端口状态可能会出现无法判断的情况,所以在探测的时候需要为端口加上一个filtered状态,表示 无法获悉 目标端口的真正状态。

基于TCP全开的端口扫描技术

TCP全开扫描:如果目标端口是开放的,那么在接到主机端口发出的SYN请求之后,就会返回一个SYN+ACK回应,表示愿意接受这次连接的请求,然后主机端口再回应一个ACK,这样就成功地和目标端口建立了一个TCP连接。

如果目标端口是关闭的,那么在接到主机端口发出的SYN请求之后,就会返回一个RST回应,表示不接受这次连接的请求,这样就中断了这次TCP连接。

目标端口不开放还有另外一种情况,就是当主机端口发出SYN请求之后,没有收到任何的回应。
多种原因都可能造成这种情况,例如,目标主机处于非活跃状态,这时当然无法进行回应,不过这也可以认为端口是关闭的。
另外一些网络安全设备也会屏蔽掉对某些端口的SYN请求,这时也会出现无法进行回应的情况

基于TCP半开的端口扫描技术
基于TCP全开的端口扫描技术还有一些不完善的地方
例如,这次连接可能会被目标主机的日志记录下来,且最为主要的是建立TCP连接三次握手中的最后一次是没用的,在目标返回一个SYN+ACK类型的数据包之后,已经达到了探测的目的,最后发送的ACK类型数据包是不必要的,所以可以考虑去除这一步。

如果目标端口是开放的,那么在接到主机端口发出的SYN请求之后,就会返回一个SYN+ACK回应,表示愿意接受这次连接的请求,然后主机端口不再回应一个ACK,而是发送一个 RST 表示中断这个连接。这样实际上并没有建立好完整的TCP连接,所以称为半开。

如果目标端口是关闭的,半开扫描和全开扫描没有区别

半开扫描实例中,考虑一种更为复杂的情况,那就是目标端口的filtered状态。
这种状态往往是由 包过滤机制 造成的,过滤可能来自专业的防火墙设备、路由器规则或者主机上的软件防火墙。这种情况下会让扫描工作变得很难,因为这些端口几乎不提供任何信息。不过有时候它们也会响应ICMP错误消息,但更多时候包过滤机制不做出任何响应。将没有收到回应数据包的端口归于“filtered”状态。
当TCP连接的数据包被屏蔽时,一般会返回如下所示的几种ICMP错误消息
在这里插入图片描述
如果收到这几种类型的ICMP数据包,也将目标端口的状态归类到“filtered”。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值