前言

这是Python渗透测试编程技术,基于python模块是实现的

一、拒绝服务攻击

1.含义

拒绝服务攻击即是攻击者想办法让目标机器停止提供服务,是黑客常用的攻击手段之一。
拒绝服务攻击并不是一个攻击方式,而是一类具有相似特征的攻击方式的集合。

2.数据链路层的拒绝服务攻击

它的攻击目标是二层交换机。
这种攻击方式的目的并不是要二层交换机停止工作,而是要二层交换机以一种不正常的方式工作。

注:根据交换机的特性:当CAM表被填满时,收到未知单播帧,会将这个帧进行广播处理。这时受到攻击的交换机实际上已经退化成了集线器了。这时黑客只需要在自己的计算机上将网卡设置为混杂模式,就可以监听整个网络的通信了。

这里用到一个攻击攻击工具 -macof
使用macof的方法很简单,然后输入macof即可启动这个工具。
在这里插入图片描述
交换机在遭到攻击之后,内部的CAM表很快就被填满。
交换机退化成集线器,会将收到的数据包全部广播出去,从而无法正常向局域网提供转发功能,实现的过程很简单。

第一步:构造随机MAC和IP,scapy模块中的RandMAC()和RandIP()可以很方便地实现这一点,也可以生成固定网段IP,如 RandIP(“192.168.1.*”)。
在这里插入图片描述
运行结果
在这里插入图片描述
构造其他形式的随机包
在这里插入图片描述
第二步:数据包中包含指定的源IP和MAC,那么交换机就会记录,例如ARP包。

Ether(src=RandMAC(),dst="FF:FF:FF:FF:FF:FF")/ARP(op=2,scr="0.0.0.0",hwdst="FF:FF:FF:FF:FF:FF")/Padding(load="X"*18)

或者ICMP包

Ether(src=RandMAC(),dst=RandMAC())/IP(src=RandIP(),dst=RandIP())/ICMP()

模拟macof的完整代码如下
在这里插入图片描述

3.网络层的拒绝服务攻击

位于网络层的协议包括ARP、IP和ICMP等,其中,ICMP主要用来在IP主机、路由器之间传递控制消息。平时检测网络连通情况时使用的Ping命令就是基于ICMP的。
处理少量的ICMP请求并不会对CPU的运行速度产生影响,但是大量的ICMP请求会消耗CPU的资源。
将ICMP数据包设置的足够大,Ping命令发送的数据包大小可以使用 -l 来指定(这个值一般指定为65500),这样构造好的数据包被称作“死亡之Ping”,因为早期的系统无法处理这么大的ICMP数据包,在接收到这种数据包之后就会死机。现在的系统则不会出现这种问题,但是可以考虑使用这种方式向目标连续地发送这种“死亡之Ping”来消耗目标主机的资源。

除了前面使用的RandIP(),还可以使用下面的方法模拟出一个随机IP地址。

i.src=%i.%i.%i.%i” %(random.randint(1,254),random.randint(1,254),random.randint(1,254),random.randint(1,254))     
id.dst=""     
send(IP(dst="1.2.3.4")/ICMP())

下面给出了一个完整的攻击程序
在这里插入图片描述
可以用WireShark来捕获发出的数据包来看到效果

4.传输层的拒绝服务攻击

  • 基于TCP的拒绝攻击方式有两种:
    • 一种是和目标端口完成三次握手,建立一个完整连接;
    • 另一种是只和目标端口完成三次握手中的前两次,建立的是一个不完整的连接

攻击方会向目标端口发送大量设置了SYN标志位的TCP数据包,受攻击的服务器会根据这些数据包建立连接,并将连接的信息存储在 连接表 中,而攻击方不断地发送SYN数据包,很快就会将连接表填满,此时受攻击的服务器就无法接收新来的连接请求了。

在这里插入图片描述
无须使用自身的IP地址作为源地址,只需要使用伪造的地址即可。产生随机地址的方法如下所示:

pdst= "%i.%i.%i.%i" % (random.randint(1,254),random.randint(1,254),random.randint(1,254),random.randint(1,254))

攻击目标时使用TCP,端口为80,将标志位设置为syn。

TCP(dport=80, flags="S")

下面给出完整的程序
在这里插入图片描述

5.应用层的拒绝服务攻击

位于应用层的协议比较多,常见的有HTTP、FTP、DNS、DHCP等。这里面的每个协议都可能被利用来发起拒绝服务攻击

DHCP为例,DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)通常被应用在大型的局域网络环境中,主要作用是集中地管理、分配IP地址,使网络环境中的主机动态地获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
在这里插入图片描述
DHCP攻击的目标也是服务器( DHCP ),怀有恶意的用户伪造大量DHCP请求报文发送到服务器,这样DHCP服务器地址池中的IP地址会很快就分配完毕,从而导致合法用户无法申请到IP地址。
同时大量的DHCP请求也会导致服务器高负荷运行,从而导致设备瘫痪。

编写一段程序来搜索网络中的DHCP服务器,只需要在网络中广播DHCP的discover数据包,源端口为68,目标端口为67.这个构造的过程涉及多个层次。

dhcp_discover = Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP()/DHCP(options=[("message-type","discover"),"end"])

完整的程序如下所示。
在这里插入图片描述
用到两个工具,
一个是Yersinia,这是一个十分强大的拒绝服务攻击工具,另一个是Metasploit

Yersinia进行DHCP攻击实验,这是一款图形化工具,在命令行中输入“yersinia -G”就可以以图形化界面的形式启动这款工具。

在这里插入图片描述

基于DHCP的攻击中一共提供了4种发包形式,这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全部失效。
root@kali:~# msfconsole

成功启动Metasploit之后,可以使用search命令来查找与DoS(拒绝服务攻击)相关的模块

在这里插入图片描述
仍然使用这里的模块对目标进行一次SYN拒绝服务攻,使用auxiliary/dos/tcp/synflood模块来完成这个攻击。首先选择对应的模块:

msf > use auxiliary/dos/tcp/synflood

使用show opinions来查看这个模块的参数
在这里插入图片描述
synflood这个模块需要的参数包括RHOST、RPORT、SNAPLEN和TIMEOUT,后面的三个参数都有默认值,所以需要设置的只有RHOST,这也正是要发起拒绝服务攻击服务器的IP地址。这个目标必须是对外提供HTTP服务的服务器。
在这里插入图片描述然后就可以使用exploit命令发起攻击,很快目标就会因为攻击而停止对外的HTTP服务了。
在这里插入图片描述
还是在Metasploit中启动对应的模块:

msf > use auxiliary/dos/windows/rdp/ms12_020_maxchannelids

这个模块的参数也十分简单,只需要设置一个RHOST即可,这也就是目标的IP地址,在这里将其设置为192.168.0.116
在这里插入图片描述
设置完攻击目标之后,就可以对目标发起攻击,使用run命令发起攻击:如成功,会使主机down机

在这里插入图片描述

二、身份认证攻击

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

网络上很多常见的应用都采用了密码认证的模式,例如FTP、Telnet、SSH等,这些应用被广泛地应用在各种网络设备上,如果这些认证模式出现了问题,那就意味着网络中的大量设备将会沦陷。遗憾的是,目前确实有很多网络的设备因为密码设置不够强壮已经遭到入侵。
四分之三原则:数字 大写字母 小写字母 特殊的字符 不要少于8为 更换密码的频次 不要小于3个月

针对这些简单的网络服务认证,可以采用一种“暴力破解”的方法。这种方法的思路很简单,就是把所有可能的密码都尝试一遍,通常可以将这些密码保存为一个字典文件。

一般有以下三种思路:
(1)纯字典攻击。这种思路最为简单,攻击者只需要利用攻击工具将用户名和字典文件中的密码组合起来,一个个地进行尝试即可。
(2)混合攻击。现在的各种应用对密码的强壮度都有了限制,例如,在注册一些应用的时候,通常都不允许使用“123456”或者“aaaaaaa”这种单纯的数字和字母的组合,因此很多人会采用密码方式
(3)完全暴力攻击。这是一种最为粗暴的攻击方式,实际上这种方式并不需要字典,而是由攻击工具将所有的密码穷举出来,这种攻击方式通常需要很长的时间,也是最为不可行的一种方式。但是在一些早期的系统中,都采用了6位长度的纯数字密码,这种方法则是非常有效的。

2.破解密码字典

常见的字典文件一般是txt或者dic格式:一个常见的破解字典文件
在这里插入图片描述

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

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

使用Python来编写一个生成字典的程序,在这个程序中需要使用到一个新的模块:itertools,这是一个强大的内置模块。
(1)count()函数:这个函数的作用是产生递增的序列,例如count(1,5),生成从1开始的循环器,每次增加5,即1,6,11,16,21,26,…
(2)cycle()函数:这个函数的作用是重复序列中的元素,例如cycle('hello'),将序列中的元素重复,即h,e,l,l,o,h,e,l,l,o,h,…
(3)repeat()函数:这个函数的作用是重复元素,构成无穷循环器,例如Repeat(100),即100,100,100,100,…。

一个简单的字典文件生成过程
第一步:导入itertools库。

import itertools

第二步:指定生成字典的字符,这里使用所有的英文字符和数字(但是没有考虑大小写和特殊字符)。

words = “1234568790abcdefghijklmnopqrstuvwxyz”

第三步:使用itertools中提供的循环器来生成字典文件

temp =itertools.permutations(words,2)

第四步:打开一个用于保存结果的记事本文件。

passwords = open(“dic.txt”,“a”)

第五步:使用一个循环将生成的密码写入到一个记事本文件中。

for i in temp:
passwords.write("".join(i)) passwords.write("".join("\n"))

完整的程序如下:
在这里插入图片描述
这里有一个技巧,如果已经获悉目标的密码为几个特定的字符,例如“q”“w”“e”等,那么可以由用户输入这几个字符。
在这里插入图片描述

3.FTP暴力破解模块

FTP是File Transfer Protocol(文件传输协议)的简称,中文简称为“文传协议”,用于在Internet上控制文件的双向传输。
同时,它也是一个应用程序(Application)。使用FTP时必须首先登录,在远程主机上获得相应的权限以后,方可下载或上传文件。也就是说,要想同哪一台计算机传送文件,就必须具有哪一台计算机的适当授权。换言之,除非有用户ID和口令,否则便无法传送文件。
Python中默认就提供了一个专门用来对FTP进行操作的ftplib模块,这个模块很精简,里面提供了一些用来实现登录、上传和下载的函数。

1)ftp.connect("IP", "port")  #连接的FTP Server和端口。
(2)ftp.login("user", "password") #连接的用户名,密码。
(3)ftp.retrlines(command[, callback]) #使用文本传输模式返回在服务器上执行命令的结果。

接下来编写一个可以对这个FTP服务进行暴力破解的程序。
中为这个程序指定三个参数
192.168.169.133
/root/name.txt /
root/500-worstpasswords.txt
这里面的name.txt是自己编写的,里面只有三个单词,“administrator”“admin”和“root”,而500-worst-passwords.txt是刚刚下载的
在这里插入图片描述

三、网络嗅探与欺骗

1.网络数据嗅探

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

函数sniff()中可以使用多个参数
(1)count:表示要捕获数据包的数量。默认值为0,表示不限制数量。
(2)store:表示是否要保存捕获到的数据包,默认值为1
(3)prn:这个参数是一个函数,这个函数将会应用在每一个捕获到的数据包上。
 如果这个函数有返回值,将会显示出来。默认是空
(4)iface:表示要使用的网卡或者网卡列表。

sniff()还支持了过滤器的使用

  • 这个过滤器使用了一种功能非常强大的过滤语法——“伯克利包过滤”语法。
  • 这个规则简称为BPF,利用它可以确定该获取和检查哪些流量,忽略哪些流量。
  • BPF可以帮助我们通过比较各个层协议中数据字段值的方法对流量进行过滤。
  • BPF的主要特点是使用一个名为“原语”的方法来完成对网络数据包的描述,
    • 例如,可以使用“host”来描述主机,“port”来描述端口,同时也支持“与”“或”“非”等逻辑运算。可以限定的内容包括地址、协议等。

一些常见的过滤器。

  • (1)只捕获与网络中某一个IP的主机进行交互的流量:host 192.168.1.1”。
  • (2)只捕获与网络中某一个MAC地址的主机交互的流量:“ether host 00-1a-a0-52-e2-a0”。
  • (3)只捕获来自网络中某一个IP的主机的流量:“src host 192.168.1.1”。
  • (4)只捕获去往网络中某一个IP的主机的流量:“dst host 192.168.1.1”,host也可以省略。
  • (5)只捕获23端口的流量:“port 23”。
  • (6)捕获除了23端口以外的流量:“!23”。
  • (7)只捕获目的端口为80的流量:“dst port 80”。
  • (8)只捕获ICMP流量:“icmp”。
  • (9)只捕获type为3,code为0的ICMP流量:“icmp[0] = 3 &&icmp[1] = 0”。

2.ARP的原理与缺陷

在以太网中广泛使用的ARP协议,承担着地址转换的角色。在TCP/IP协议栈,ARP协议工作在三层和二层之间,提供网络地址到物理地址的转换。ARP协议的工作流程如下:

首先,假设局域网中存在主机A、主机B,以及局域网默认网管G。相应的,IP(A)、MAC(A),IP(B)、MAC(B),IP(G)、MAC(G)分别为这三台主机的IP地址和MAC地址。

那么,当主机A上的应用程序数据由上层协议传到网络层的时候,如果目的IP地址不是自己,那么该怎么把数据传到目的主机呢?

主机A从自己的IP设置信息和目的IP地址,可以判断出该数据所发往的主机是否与自己在同一个网络

如果数据发往的主机在同个网络,比如说是主机B,那么数据继续封装成链路帧,并把MAC(A)做为源物理地址,而把MAC(B)做为目的物理地址。

如果数据发往的主机在另一个网络,比如说Internet上的主机X,那么数据封装成链路帧,并把MAC(A)做源物理地址,而把MAC(G)做为目的物理地址。

无论是把MAC(B),还是把MAC(G)做为目的物理地址,当主机A首次发送数据时,系统的ARP缓存是没有内容的,主机A也就无从知道去往的主机,其MAC地址是多少。此时,先发送一个ARP Request广播报文,广播的有效范围是整个局域网广播域。整个广播域内的主机都会收到ARP Request报文,并且拿报文上的目的IP地址与自己的IP地址相比教,如果某台主机发现自己的IP地址相符合,则向主机A发送ARP Response,告知自己的MAC地址,而其他主机则不做响应。

A:ARP Request (“谁是 IP(B) 的拥有者?”);

B、C、D、…G…,广播域内所有的主机均收到报文。

B:发现自己的IP真好是IP(B),于是,ARP Response(“我是IP(B)的拥有者,我的MAC是MAC(B).”);

其他主机均保持沉默。主机B发送到主机A的ARP Response包不是以广播的方式发送了,所以与主机A和主机B处于同一个广播域但不在一个冲突域内的主机是无法得知了。

通过ARP广播和响应机制,主机A获得目的主机物理地址后,来自应用程序的数据,就可以从网络层往下封装,并发送了。

同时,也发现ARP的这种从网络地址到物理地址的转换机制存在者缺陷。当网络中的所有主机都遵守规则,那么,该机制工作得很好。当某台主机要捣乱,那么很容易就可形成了ARP欺骗或者中介。需要做的就是发送错误的ARP Response包给被欺骗的主机。

借助WinCap,很容易定制ARP数据包。
————————————————
版权声明:本文为CSDN博主「richul」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/richul/article/details/1735064


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐