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中的join()函数的用法
Apr 07 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
python实现朴素贝叶斯算法
Nov 19 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
wxPython绘图模块wxPyPlot实现数据可视化
Nov 19 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
Nov 21 Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
python能做哪方面的工作
Jun 15 Python
详解java调用python的几种用法(看这篇就够了)
Dec 10 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 取得瑞年与平年的天数的代码
2009/08/10 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
php cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
Python中AND、OR的一个使用小技巧
2015/02/18 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
python 读写中文json的实例详解
2017/10/29 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
python如何统计代码运行的时长
2019/07/24 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
Python中如何引入第三方模块
2020/05/27 Python
python中@contextmanager实例用法
2021/02/07 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
文字自荐书范文
2014/02/10 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
授权委托书
2014/09/17 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS