2022年 11月 3日

Python渗透测试编程技术大全

Python渗透测试编程技术大全

  • 一、漏洞渗透模块
    • 1、测试软件的溢出漏洞
      • (1)栈溢出漏洞发现
    • 2、计算软件溢出的偏移地址
    • 3、查找JMP ESP指令
      • (1)执行恶意的攻击载荷
  • 二、网络嗅探与欺骗
    • 1、网络数据嗅探
      • (1)编写一个网络嗅探工具
      • (2)调用WireShark来查看数据包
    • 2、ARP的原理与缺陷
      • (1)中间人欺骗
      • (2)中间人欺骗的原理
  • 三、拒绝服务攻击
    • 1、数据链路层的拒绝服务攻击
      • (1)攻击方式
    • 2、网络层的拒绝服务攻击
      • (1)网络层的协议:ARP、IP和ICMP等
      • (2)如何提高发送到目标的数据包的数量
    • 3、传输层的拒绝服务攻击
      • (1)TCP协议
      • (2)基于TCP的拒绝攻击方式
    • 4、应用层的拒绝服务攻击
      • (1)DHCP协议
  • 四、身份认证攻击
    • 1、简单网络服务认证的攻击
      • (1)暴力破解
          • 1.纯字典攻击
          • 2.混合攻击
          • 3.完全暴力攻击
    • 2、破解密码字典
      • (1)Kali Linux 系统中词典文件的来源
      • (2)字典的生成
      • (3)简单字典文件的生成过程
    • 3、FTP暴力破解模块
      • (1)概念:
      • (2)FTP工作流程
      • (3)ftplib模块
      • (4)ftplib模块的使用

)

一、漏洞渗透模块

1、测试软件的溢出漏洞

(1)栈溢出漏洞发现

FreeFloat FTP Server会在运行的主机上建立一个FTP,其他计算机上的用户可以登录到这个FTP上来存取文件。
例如,在主机192.168.0.116的C盘中运行这个FTP软件,在另外一台计算机中可以使用FTP下载工具或者命令的方式进行访问。这里采用命令的方式对其进行访问,(使用 FreeFloat FTP Server这个服务器对登录没有任何的限制,输入任意的用户名和密码都可以登录进去)
在这里插入图片描述
在这里插入图片描述
查看这个工具是否存在栈溢出漏洞
在这里插入图片描述
系统并没有崩溃,而是正常的出现了输入密码的界面。
用WireShark来抓包查看此次登录的数据包
在这里插入图片描述
可以发现,实际上发送出去数据包中的字符“a”的数量并没有那么多
无论在登录用户名时输入多么长的用户名,而实际上发送出去的只有 78 个“a”。
自行构造数据包并发送出去,以此来加大字符串的数量引起溢出。
首先编写一个可以自动连接到FreeFloat FTP Server的客户端脚本,先来建立一个到FreeFloat FTP Server的连接。
在这里插入图片描述
执行之后,就建立好一个到目标主机21端口的连接,但是到FTP的连接需要认证,仍然需要向目标服务器提供一个用户名和一个密码。
服务器通常会对用户名和密码的正确性进行验证,也就是将用户的输入与自己保存的记录进行比对。
把FreeFloat FTP Server 用户名的输入作为渗透测试的切入点,首先来检查这个软件是否存在栈溢出的现象,这个检查很简单,在输入用户名的时候,输入成百上千的字符,同时观察目标服务器的反应。
观察正常连接到目标服务器上数据包的格式。
在这里插入图片描述
使用socket套接字中的send()方法可以将一个字符串以数据包的形式发送出去,这里面以成百上千的“A”作为用户名。
在这里插入图片描述
将这个数据包发送到目标FTP服务器上,可以看到这个FTP服务器工具崩溃了
在这里插入图片描述

2、计算软件溢出的偏移地址

这里显示软件FreeFloat FTP Server执行到地址“41414141”处时就无法再继续进行。
出现这种情况的原因是 原本保存下一条地址的EIP寄存器中的地址被溢出的字符“A”所覆盖。
“\x41”在ASCII表中表示的正是字符“A”,也就是说现在EIP寄存器中的内容就是“AAAA”,而操作系统无法在这个地址找到一条可以执行的命令,从而引发系统的崩溃。
在这里插入图片描述
每一次这个软件执行时所分配的地址都是不同的。
所以现在需要知道的不是EIP的绝对地址,而是EIP相对输入数据起始位置的相对位移。
如果这个位移的值不大,可以用逐步尝试的方法获取这个值。但是如果位移比较大,还需要使用到一些工具来提高效率。
可以借助 Metasploit 中内置的两个工具pattern_create和pattern_offset来完成这个任务
pattern_create可以用来创建一段没有重复字符的文本。
将这段文本发送到目标服务器,当发生溢出时,记录下程序发生错误的地址(也就是EIP中的内容),这个地址其实就是文本中的4个字符。
利用pattern_offset快速找到这4个字符在文本中的偏移量,而这个偏移量就是EIP寄存器的地址。
kali虚拟机中进行如下操作:
在这里插入图片描述
生成一段500个字符的文本
在这里插入图片描述
使用这个pattern_create.rb产生的字符来代替那些“A”。仍然使用前面那段连接目标服务器的Python脚本将这个内容发送出去。
在这里插入图片描述
可以看到这个FreeFloat FTP Server软件再次崩溃
在这里插入图片描述
提示信息中的地址“37684136”,使用pattern_offset来查找这个值对应的偏移量
在这里插入图片描述

3、查找JMP ESP指令

(1)执行恶意的攻击载荷

按照栈的设计,ESP寄存器应该就位于EIP寄存器的后面(中间可能有一些空隙)。
使用大量字符来溢出栈的时候,也可以使用特定字符来覆盖ESP,二来虽然无法对ESP寄存器进行定位,但是可以利用一条“JMP ESP”的跳转指令来实现跳转到当前ESP寄存器
在这里插入图片描述
Mona.py的使用方法也很简单,只需要将下载好的这个插件(mona.py)复制到Immunity Debugger安装目录下的PyCommands文件夹中就可以使用了。然后在Immunity Debugger的命令行中输入“!mona”命令
在这里插入图片描述
在命令行中执行“!mona jmp -r esp”来查找“JMP ESP”命令,执行的结果
在这里插入图片描述
这里面选择第一条指令来作为跳转指令,需要记录下地址“77DBF049”

二、网络嗅探与欺骗

1、网络数据嗅探

(1)编写一个网络嗅探工具

1.在Scapy中提供了一种专门用来捕获数据包的函数 sniff( ),这个函数的功能十分强大,首先使用help函数来查看一下它的使用方法

———->help(sniff)
在这里插入图片描述
2.函数sniff()中可以使用多个参数,下面先来了解其中几个比较重要参数的含义。
(1)count:表示要捕获数据包的数量。默认值为0,表示不限制数量。
(2)store:表示是否要保存捕获到的数据包,默认值为1
(3)prn:这个参数是一个函数,这个函数将会应用在每一个捕获到的数据包上。
如果这个函数有返回值,将会显示出来。默认是空
(4)iface:表示要使用的网卡或者网卡列表。
3.sniff()还支持了过滤器的使用
这个规则简称为BPF,利用它可以确定该获取和检查哪些流量,忽略哪些流量。
BPF可以帮助我们通过比较各个层协议中数据字段值的方法对流量进行过滤。
BPF的主要特点是使用一个名为“原语”的方法来完成对网络数据包的描述。
使用这种语法创建出来的过滤器被称为BPF表达式,每个表达式包含一个或多个原语。每个原语中又包含一个或多个限定词,主要有三个限定词:Type、Dir 和 Proto。
(1)Type用来规定使用名字或数字代表的类型,例如host、net和port等。
(2)Dir用来规定流量的方向,例如src、dst和src and dst等。
(3)Proto用来规定匹配的协议,例如ip、tcp和arp等。
在这里插入图片描述
4.接下来编写一个完整的数据嗅探工具,它可以捕获和特定主机通信的1000个数据包,并保存到catch.pcap数据包中。
在这里插入图片描述
运行结果:
在这里插入图片描述
保存的数据包:
在这里插入图片描述

(2)调用WireShark来查看数据包

1.在Scapy中产生一个数据包。
在这里插入图片描述
2.将这个数据包放在一个极为优秀的网络分析工具中打开
在这里插入图片描述
在这里插入图片描述

2、ARP的原理与缺陷

ARP协议的重大缺陷:没有任何的认证机制

(1)中间人欺骗

1.使用Scapy库来完成这个任务,再来看一遍ARP数据包的格式
在这里插入图片描述
2.这里需要设置的值主要有三个:op、psrc 和 pdst。其中,op对应的是ARP类型,默认值已经是1,就是ARP请求,无须改变;psrc的值最关键,psrc对应前面的源IP地址
在这里插入图片描述
3.另外,需要使用Ether层将这个数据包发送出去,查看一下Ether数据包的格式
在这里插入图片描述
这一层只有三个参数,dst是目的硬件地址,src是源硬件地址
在这里插入图片描述
4.构造并发送这个数据包
在这里插入图片描述
5.成功发送这个数据包之后,查看一下被攻击计算机的ARP缓存表

(2)中间人欺骗的原理

让目标主机误认为Kali Linux 才是网关,同时让网关误认为Kali Linux 才是目标主机,这样两者之间的通信方式就变成了如下图所示的形式。
在这里插入图片描述
要实现这一点就需要同时向目标主机和网关发送欺骗数据包。
用来欺骗目标主机的数据包如下。
在这里插入图片描述
用来欺骗网关的数据包如下。
在这里插入图片描述
因为ARP缓存表中表项都有生命周期,所以需要不断对两个主机进行欺骗。
这里使用循环发送来实现这个功能,sendp本身就有循环发送的功能,
使用inter指定间隔时间,使用loop=1来实现循环发送。
在这里插入图片描述

三、拒绝服务攻击

拒绝服务攻击并不是一个攻击方式,而是一类具有相似特征的攻击方式的集合。
黑客可能会利用TCP/IP协议层中数据 链路层、网络层、传输层和应用层各种协议漏洞发起拒绝服务攻击。

1、数据链路层的拒绝服务攻击

(1)攻击方式

1.攻击目标:二层交换机
2.攻击目的:让二层交换机以一种不正常的方式工作—–>让交换机成为“集线器”
3.攻击工具:–macof
在这里插入图片描述
4.实现过程:
(1)构造随机MAC和IP,scapy模块中的RandMAC()和RandIP()可以很方便地实现这一点,也可以生成固定网段IP,如 RandIP(“192.168.1.*”)。
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述
构造其他形式的随机包:
在这里插入图片描述
在这里插入图片描述
(2)数据包中包含指定的源IP和MAC,那么交换机就会记录,例如ARP包
在这里插入图片描述
模拟macof的完整代码如下:
在这里插入图片描述

2、网络层的拒绝服务攻击

(1)网络层的协议:ARP、IP和ICMP等

1.ICMP主要用来在IP主机、路由器之间传递控制消息

(2)如何提高发送到目标的数据包的数量

1.同时使用多台计算机发送ICMP数据包
2.提高发送的ICMP数据包的速度。
3.使用 随机地址 不断向目标发送ICMP包
4.向不同的地址不断发送以受害者的IP地址为源IP地址的数据包
完整的攻击程序:
在这里插入图片描述
使用WireShark来捕获发出的数据包,可以看到快速地以1.1.1.1向各个地址发送ICMP请求,这个地址在收到了请求之后,很快就会向1.1.1.1发回应答。这就是第三种攻击方式
在这里插入图片描述

3、传输层的拒绝服务攻击

(1)TCP协议

1.概念:
TCP协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接。
2.TCP三次握手的过程:
(1)客户端向服务器端发送SYN(SEQ=x)数据包,并进入SYN_SEND状态。
(2)服务器端在收到客户端发出的SYN报文之后,回应一个SYN(SEQ=y)ACK(ACK=x+1)数据包,并进入SYN_RECV状态。
(3)客户端收到服务器端的SYN数据包,回应一个ACK(ACK=y+1)数据包,进入Established状态。
在这里插入图片描述

(2)基于TCP的拒绝攻击方式

1.和目标端口完成三次握手,建立一个完整连接
2.只和目标端口完成三次握手中的前两次,建立的是一个不完整的连接

4、应用层的拒绝服务攻击

(1)DHCP协议

1.主要作用:集中地管理、分配IP地址,使网络环境中的主机动态地获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
2.一次DHCP的过程:
在这里插入图片描述
3.DHCP的攻击目标:服务器
——>怀有恶意的用户伪造大量DHCP请求报文发送到服务器,这样DHCP服务器地址池中的IP地址会很快就分配完毕,从而导致合法用户无法申请到IP地址。
同时大量的DHCP请求也会导致服务器高负荷运行,从而导致设备瘫痪。

4.基于DHCP的攻击一共提供了4种发包形式:
(1)sending RAW packet: 发送原始数据包。
(2)sending DISCOVER packet:发送请求获取IP地址数据包,占用所有的IP,造成拒绝服务。
(3)creating DHCP rogue server:创建虚假DHCP服务器,让用户连接,真正的DHCP无法工作。
(4)sending RELEASE packet:发送释放IP请求到DHCP服务器,致使正在使用的IP全部失效。

四、身份认证攻击

1、简单网络服务认证的攻击

(1)暴力破解

1.纯字典攻击

攻击者只需要利用攻击工具将用户名和字典文件中的密码组合起来,一个个地进行尝试即可

2.混合攻击

依靠一定的算法对字典文件中的单词进行处理之后再使用。一个最简单的算法就是在这些单词前面或者后面添加一些常见的数字.

3.完全暴力攻击

这种方式并不需要字典,而是由攻击工具将所有的密码穷举出来,这种攻击方式通常需要很长的时间,也是最为不可行的一种方式。但是在一些早期的系统中,都采用了6位长度的纯数字密码,这种方法则是非常有效的。

2、破解密码字典

(1)Kali Linux 系统中词典文件的来源

(1)使用字典生成工具来制造自己需要的字典,当需要字典文件,手头又没有合适的字典文件时,就可以考虑使用工具来生成所需要的字典文件。
(2)使用Kali Linux中自带的字典,Kali Linux中将所有的字典都保存在/usr/share/wordlists/目录下
在这里插入图片描述
(3)从互联网上下载热门的字典:可以访问https://wiki.skullsecurity.org/Passwords查看最新的字典文件
在这里插入图片描述

(2)字典的生成

1.字典中包含词汇(也就是密码)的长度。
2.字典中包含词汇所使用的字符。要生成密码包含的字符集(小写字符、大写字符、数字、符号),这个选项是可选的,如果不写这个选项,将使用默认字符集(默认为小写字符)。

(3)简单字典文件的生成过程

1.导入itertools库。
>>>import itertools
2.指定生成字典的字符,这里使用所有的英文字符和数字(但是没有考虑大小写和特殊字符)。
>>>words = “1234568790abcdefghijklmnopqrstuvwxyz”
3.使用itertools中提供的循环器来生成字典文件
>>>temp =itertools.permutations(words,2)
4.打开一个用于保存结果的记事本文件。
>>>passwords = open(“dic.txt”,“a”)
5.使用一个循环将生成的密码写入到一个记事本文件中。
>>>for i in temp:
passwords.write(“”.join(i))
passwords.write(“”.join(“\n”))

3、FTP暴力破解模块

(1)概念:

中文简称为“文传协议”,用于在Internet上控制文件的双向传输。
它也是一个应用程序(Application)。使用FTP时必须首先登录,在远程主机上获得相应的权限以后,方可下载或上传文件。也就是说,要想同哪一台计算机传送文件,就必须具有哪一台计算机的适当授权。换言之,除非有用户ID和口令,否则便无法传送文件。

(2)FTP工作流程

1.客户端去连接目标FTP服务器的21号端口,建立命令通道。服务器会向客户端发送“220 Free Float Ftp Server(Version 1.00)”回应,括号内的信息会因为服务器不同而有不同的显示。
2.客户端向服务器发送“USER用户名\r\n”,服务器会返回“331 Please specify the password .\r\n”。
3.客户端向服务器发送“PASS密码\r\n”,如果密码认证成功服务器会返回“230 User Logged in.\r\n”,如果密码认证错误服务器会返回“200 Switching to Binary mode.\r\n”。

(3)ftplib模块

———>包含了实现ftp登录、上传和下载的函数
(1)ftp.connect(“IP”, “port”) #连接的FTP Server和端口。
(2)ftp.login(“user”, “password”) #连接的用户名,密码。
(3)ftp.retrlines(command[, callback]) #使用文本传输模式返回在服务器上执行命令的结果。

(4)ftplib模块的使用

1.导入需要使用的ftplib库文件。
在这里插入图片描述
2.使用ftplib创建一个FTP对象。
在这里插入图片描述
3.调用这个对象中的connect()函数去连接目标的21号端口。
在这里插入图片描述
4.运行结果
在这里插入图片描述
5.调用这个对象中的login()函数使用admin作为用户名,test作为密码来登录。
在这里插入图片描述
6.如果登录成功,就会得到一个230回应
在这里插入图片描述
7.使用LIST命令(这是FTP本身的命令)来展示FTP服务器中的文件
在这里插入图片描述
8.使用quit()函数断开与FTP服务器的连接
在这里插入图片描述