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 相关文章推荐
简单的通用表达式求10乘阶示例
Mar 03 Python
python使用正则表达式提取网页URL的方法
May 26 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
Python smtplib实现发送邮件功能
May 22 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
python3操作注册表的方法(Url protocol)
Feb 05 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
Python 实现国产SM3加密算法的示例代码
Sep 21 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
Python绘图实现台风路径可视化代码实例
Oct 23 Python
python编写五子棋游戏
May 25 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
php实现jQuery扩展函数
2009/10/30 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
PHP小白必须要知道的php基础知识(超实用)
2017/10/10 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
python实现的防DDoS脚本
2011/02/08 Python
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
python Pygame的具体使用讲解
2017/11/03 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
python如何为创建大量实例节省内存
2018/03/20 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
车队司机自我鉴定
2014/03/02 职场文书
四风问题对照检查材料
2014/09/22 职场文书