本次实验经过使用 Python 实现一个 FTP 弱口令扫描器开始,入门 Python 渗透测试技术,实验涉及 FTP 协议原理,ftplib 库的使用等知识点。web
本教程由做者向实验楼投稿发布,完整教程及在线练习地址:Python 实现 FTP 弱口令扫描器编程
具备Python语言基础,不会的同窗请到隔壁班先去学一下安全
Python3.x服务器
本实验涉及以下知识点:网络
认识Ftp服务器函数
Ftplib库的使用测试
argparse库的使用网站
Ubuntu下Ftp服务器的搭建url
本节实验将实现以下功能的 FTP 弱口令扫描器:spa
如下内容整理自百度百科,参考连接:
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。顾名思义,就是专门用来传输文件的协议。简单地说,支持FTP协议的服务器就是FTP服务器。
FTP是仅基于TCP的服务,不支持UDP。不同凡响的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫作控制端口)。一般来讲这两个端口是21(命令端口)和20(数据端口)。但FTP 工做方式的不一样,数据端口并不老是20。这就是主动与被动FTP的最大不一样之处。主要有两种工做模式:
主动FTP
FTP服务器的控制端口是21,数据端口是20,因此在作静态映射的时候只须要开放21端口便可,他会用20端口和客户端主动的发起链接。
被动FTP
服务器的控制端口是21,数据端口是随机的,且是客户端去链接对应的数据端口,因此在作静态的映射话只开放21端口是不能够的。此时须要作DMZ。
本课程开发Ftp扫描器主要从如下两个方面着手:
Ftp匿名登陆的扫描主要应用于批量扫描中,单独针对一个Ftp服务器进行扫描的话成功概率比较小,不过也不排除成功的可能。估计讲到这里的时候,有的同窗就有疑问了!!!如今还有人不设置密码吗?那得傻到啥程度?用东北的话来讲那不就是傻狍子吗!!!(开个玩笑,省得同窗们看个人教程睡着了!)不过言归正传,不少网站都开放Ftp服务方便用户下载资源(这个容许匿名登陆不足为奇),更疯狂的是网站管理人员为了方便网站访问软件的更新也开放了Ftp匿名登陆(估计不是本身家的网站......)。这样就给了咱们不少机会,尤为后者的服务器很容易就受到攻击,后期我会讲解Ftp目录下能够搜到web页面以后怎样拿到Shell(你们多多关注个人教程吧,还有不少精品课程等着你!)。
Ftp弱口令扫描其实就是暴力破解,为什么咱们不称为暴力破解呢?由于咱们只是扫描一些简单的密码组合,并非全部可能得密码组合,并且咱们也没有那么多时间去暴力破解,谁让咱们活不了成千上万年呢!只是一个密码而已,弱口令扫不到就算了,天涯何处无芳草何须单恋一枝花呢!不过你要非喜欢这个Ftp服务器的话,之后我再教你们别的方法渗透服务器!
这里咱们要用到Python的ftplib库中的Ftp这个类,Ftp这个类实现了Ftp客户端的大多数功能,好比链接Ftp服务器、查看服务器中的文件、上传、下载文件等功能,详细用法能够查看一下文档,之后碰到问题也要养成先看文档的习惯!接下来咱们来定义anonScan(hostname)这个函数以实现扫描可匿名登陆的Ftp服务器。代码以下:
#匿名登陆扫描 def anonScan(hostname): #参数是主机名 try: with FTP(hostname) as ftp: #建立Ftp对象 ftp.login() #Ftp匿名登陆 print('\n[*] ' + str(hostname) + " FTP Anonymous login successful!") #不抛出异常则代表登陆成功 return True except Exception as e: #抛出异常则代表匿名登陆失败 print('\n[-] ' + str(hostname) + " FTP Anonymous logon failure!") return False
代码很简短,主要在注释中解释了代码的含义。这里说一下这个函数的思路,首先用主机名构造了一个Ftp对象(即ftp),而后用这个ftp调用不带任何参数的login()函数即表示要匿名登陆这个Ftp服务器,若是登陆过程当中没有产生异常,则代表匿名登陆成功,不然匿名登陆失败!
Ftp弱口令的扫描依赖于用户名和密码字典,咱们的实验环境中会提供 pwd.txt
做为密码字典,字典的格式以下图所示:
接下来咱们针对字典中的格式来实现Ftp弱口令的扫描,代码以下:
#暴力破解 def vlcLogin(hostname, pwdFile): #参数(主机名,字典文件) try: with open(pwdFile, 'r') as pf: #打开字典文件 for line in pf.readlines(): #循环读取字典文件中的每一行 time.sleep(1) #等待1秒 userName = line.split(':')[0] #从读取的内容中取出用户名 passWord = line.split(':')[1].strip('\r').strip('\n') #从读取的内容中取出密码 print('[+] Trying: ' + userName + ':' + passWord) try: with FTP(hostname) as ftp: #以主机名为参数构造Ftp对象 ftp.login(userName, passWord) #使用读取出的用户名密码登陆Ftp服务器 #若是没有产生异常则表示登陆成功,打印主机名、用户名和密码 print('\n[+] ' + str(hostname) + ' FTP Login successful: '+ \ userName + ':' + passWord) return (userName, passWord) except Exception as e: # 产生异常表示没有登陆成功,这里咱们不用管它,继续尝试其余用户名、密码 pass except IOError as e: print('Error: the password file does not exist!') print('\n[-] Cannot crack the FTP password, please change the password dictionary try again!') return (None,None)
这段代码其实就是循环从字典中读取用户名和密码并尝试登录,登录成功则代表找到用户名和密码。因为这个函数将主机名定义成了能够用“,”分割的字符串。找到密码并不会终止程序,而是会继续扫描其余主机的弱口令,直到全部的主机都扫描一遍。
至此咱们的Ftp扫描器已经几乎完成了,代码并很少,也很简单。如今咱们须要作的是让咱们的脚本能够处理命令行输入,以控制扫描哪些主机。处理命令行参数咱们将用到Python中的argparse库,这个库是Python中自带的模块,处理命令行将变得很是简单,下面咱们一块儿见证一下argparse的强大之处,先上代码:
# 这里用描述建立了ArgumentParser对象 parser = argparse.ArgumentParser(description = 'FTP Scanner') # 添加-H命令dest能够理解为我们解析时获取-H参数后面值的变量名,help是这个命令的帮助信息 parser.add_argument('-H',dest='hostName',help='The host list with ","space') parser.add_argument('-f',dest='pwdFile',help='Password dictionary file') options = None try: options = parser.parse_args() except: print(parser.parse_args(['-h'])) exit(0) hostNames = str(options.hostName).split(',') pwdFile = options.pwdFile
经过argparse库来解析命令行参数,能够根据添加参数时指定的help关键字的内容来自动生成帮助文档。具体效果以下图所示:
在处理复杂命令的时候argparse的强大就更明显了,因为这个属于Python基础,因此Python库中自带的库这里我就不作过多的介绍了。
本项目完整代码和环境搭建、测试,可在实验楼中查看并在线完成。
本次项目实现了Ftp弱口令扫描器,主要用到如下知识点:
Ftp服务器的基本概念
使用ftplib如何一步一步的实现Ftp弱口令扫描器
使用argparse解析命令行参数
实验环境的搭建方法
《Python绝技--运用Python成为顶级黑客》
《Python黑帽子-- 黑客与渗透测试编程之道 》
注:本系列项目教学思路,参考自《Python绝技--运用Python成为顶级黑客》,书中代码和教学思路只作参考,本系列教程所有从新设计并基于Python3.x重写。本系列课程旨在教你们渗透测试,维护网络安全,如用于非法目的,自行承担法律责任!