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批量同步web服务器代码核心程序
Sep 01 Python
Python实现的批量下载RFC文档
Mar 10 Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
python使用RNN实现文本分类
May 24 Python
python 平衡二叉树实现代码示例
Jul 07 Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
Dec 31 Python
Python SMTP配置参数并发送邮件
Jun 16 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 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
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
javascript引用对象的方法
2007/01/11 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
javascript连续赋值问题
2015/07/08 Javascript
js实现简单的验证码
2015/12/25 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
JavaScript学习笔记之创建对象
2016/03/25 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Python发展简史 Python来历
2019/05/14 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
Python创建数字列表的示例
2019/11/28 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
python绘制玫瑰的实现代码
2020/03/02 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
大学生应聘推荐信范文
2013/11/19 职场文书
培训主管岗位职责
2014/02/01 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书