Wordpress <= 4.6.1 使用语言文件任意代码执行 漏洞分析

作者:Secer 发布时间:October 10, 2016 分类:Web安全 No Comments

Author: p0wd3r (知道创宇404安全实验室)

0x00 漏洞概述

1.漏洞简介

WordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统,近日在github (https://gist.github.com/anonymous/908a087b95035d9fc9ca46cef4984e97)上爆出这样一个漏洞,在其<=4.6.1版本中,如果网站使用攻击者提前构造好的语言文件来对网站、主题、插件等等来进行翻译的话,就可以执行任意代码。

2.漏洞影响

任意代码执行,但有以下两个前提:

1. 攻击者可以上传自己构造的语言文件,或者含有该语言文件的主题、插件等文件夹

2. 网站使用攻击者构造好的语言文件来对网站、主题、插件等进行翻译

这里举一个真实场景中的例子:攻击者更改了某个插件中的语言文件,并更改了插件代码使插件初始化时使用恶意语言文件对插件进行翻译,然后攻击者通过诱导管理员安装此插件来触发漏洞。

3.影响版本

<= 4.6.1

0x01 漏洞复现

1. 环境搭建
docker pull wordpress:4.6.1  
docker pull mysql  
docker run --name wp-mysql -e MYSQL_ROOT_PASSWORD=hellowp -e MYSQL_DATABASE=wp -d mysql  
docker run --name wp --link wp-mysql:mysql -d wordpress
2.漏洞分析

首先我们来看这样一个场景:

clip_image001

在调用create_function时,我们通过}将原函数闭合,添加我们想要执行的内容后再使用/*将后面不必要的部分注释掉,最后即使我们没有调用创建好的函数,我们添加的新内容也依然被执行了。之所以如此,是因为create_function内部使用了eval来执行代码,我们看PHP手册上的说明:

clip_image002

所以由于这个特性,如果我们可以控制create_function的$code参数,那就有了任意代码执行的可能。这里要说一下,create_function这个漏洞最早由80sec在08年提出,这里提供几个链接作为参考:

· https://www.exploit-db.com/exploits/32416/

· https://bugs.php.net/bug.php?id=48231

· http://www.2cto.com/Article/201212/177146.html

接下来我们看Wordpress中一处用到create_function的地方,在wp-includes/pomo/translations.php第203-209行:

/**
 * Makes a function, which will return the right translation index, according to the
 * plural forms header
 * @param int    $nplurals
 * @param string $expression
 */
function make_plural_form_function($nplurals, $expression) {  
    $expression = str_replace('n', '$n', $expression);
    $func_body = "
        \$index = (int)($expression);
        return (\$index < $nplurals)? \$index : $nplurals - 1;";
    return create_function('$n', $func_body);
}

根据注释可以看到该函数的作用是根据字体文件中的plural forms这个header来创建函数并返回,其中$expression用于组成$func_body,而$func_body作为$code参数传入了create_function,所以关键是控制$expresstion的值。

我们看一下正常的字体文件zh_CN.mo,其中有这么一段:

clip_image003

Plural-Froms这个header就是上面的函数所需要处理的,其中nplurals的值即为$nplurals的值,而plural的值正是我们需要的$expression的值。所以我们将字体文件进行如下改动:

clip_image004

然后我们在后台重新加载这个字体文件,同时进行动态调试,可以看到如下情景:

clip_image005

我们payload中的)首先闭合了前面的(,然后;结束前面的语句,接着是我们的一句话木马,然后用/*将后面不必要的部分注释掉,通过这样,我们就将payload完整的传入了create_function,在其创建函数时我们的payload就会被执行,由于访问每个文件时都要用这个对字体文件解析的结果对文件进行翻译,所以我们访问任何文件都可以触发这个payload:

clip_image006

clip_image007

其中访问index.php?c=phpinfo();的函数调用栈如下:

clip_image008

3.补丁分析

目前官方还没有发布补丁,最新版仍存在该漏洞。

0x02 修复方案

在官方发布补丁前建议管理员增强安全意识,不要使用来路不明的字体文件、插件、主题等等。

对于开发者来说,建议对$expression中的特殊符号进行过滤,例如:

$not_allowed = array(";", ")", "}");
$experssion = str_replace($not_allowed, "", $expression);

0x03 参考

https://www.seebug.org/vuldb/ssvid-92459

https://gist.github.com/anonymous/908a087b95035d9fc9ca46cef4984e97

http://php.net/manual/zh/function.create-function.php

https://www.exploit-db.com/exploits/32416/

https://bugs.php.net/bug.php?id=48231

http://www.2cto.com/Article/201212/177146.html

https://codex.wordpress.org/InstallingWordPressinYourLanguage

电信光猫破解-烽火科技

作者:Secer 发布时间:September 12, 2016 分类:黑客技巧,原创文章 No Comments

仅作记录。

型号:烽火科技HG221GS

光猫有个配置文件未授权访问

http://192.168.1.1/cgi-bin/baseinfoSet.cgi

clip_image002

可以看到超管telecomadmin和普通帐户useradmin的密码

通过JS还原一下密码

var s= "120&105&112********"; //TELECOMPASSWORD的密码,已打码

for(var i in s){ res+=String.fromCharCode(s[i]);}

alert(res);

得到密码,使用超管帐户登录光猫

记得关掉DHCP,不然和PPPOE冲突,然后去掉配置同步更新

来到宽带设置->网络连接->连接名称:2_INTERNET_R_VID_1045

连接模式路由改成桥接

clip_image002[4]

Burpsuite之Burp Collaborator模块介绍

作者:Secer 发布时间:July 30, 2016 分类:Web安全,黑客技巧 No Comments

Burp Collaborator.是从Burp suite v1.6.15版本添加的新功能,它几乎是一种全新的渗透测试方法。Burp Collaborator.会渐渐支持blind XSSSSRFasynchronous code injection等其他还未分类的漏洞类型。

本文主要介绍使用Burp Collaborator.对这几种类型漏洞进行探测。

概念:In-band attackout-band attack(带内与带外攻击)

首先介绍两个概念,带内与带外的区别核心在于是否使用不同的通信通道。

在一次攻击当中,只有一条通道,属于in-band(带内)攻击:

clip_image001

现在同一次攻击下,不止一条信道,则属于out-band(带外)攻击:

clip_image002

常规web测试模型

简单的讲,常规的web测试模型就是我们向目标发送payloads,然后分析目标返回的数据。

clip_image003

这个模型很容易建立并且容易理解,但是这个简单的模型漏掉很多bugs,比如:

§ “super-blind” injection。”blind SQL injection”表示当一个payload破坏了正常的sql查询然而应用程序返回的内容没有任何有帮助的错误信息。但是在有些情况下,一个成功的注入在目标应用的返回里面是完全看不到区别的,意思就是,不论返回的内容还是返回的时间,都没有任何区别。举个例子,注入asynchronous logging function就是一个典型的情况

§ 需要存储数据的情况。比如存储型xss理论上通过先提交payloads然后观察返回值是可以发现的。但是其他的存储型bugs很难发现,比如,stored (or second-order) SQL injection,数据先是以安全的方式存储在数据库中,然后再从数据库取出再拼接sql语句。要使用常规渗透模型发现这种漏洞,我们需要爆破每一种请求的组合,要先发送第一个request请求,然后在发送第二个request请求,然后观察返回值。

§ 我们还会漏掉一种漏洞,一次成功的攻击只发生在应用内部,对攻击者是不可见的。比如,存储型xss攻击成功要求管理员访问管理地址。

§ 还有很多涉及到内部系统与外部资源交互的情况,比如SSRF和RFI等漏洞。

加入Burp Collaborator后的web测试模型

Burp Collaborator 给传统web测试模型添加了一个新的部分,Burp Collaborator的功能有:

§ 捕捉由Burp发出的payloads触发的目标与外部系统发生数据交互行为

§ 把Burp Collaborator与目标数据交互行为产生的返回数据传回攻击者

§ 对很多新型漏洞进行可靠的探测。 clip_image004

Burp Collaborator模块包含如下特征:

§ Burp Collaborator 服务器通常运行在公网上。

§ 它使用自己的专用域名,并且这个服务器已注册为该域名的权威DNS服务器。

§ 它提供一个DNS服务,可以响应任何对他的dns请求

§ 它提供HTTP/HTTPS 服务,使用一个有效的SSL证书

§ 将来可以添加其他的服务,比如smtp和ftp。

探测external service interaction(外部服务交互攻击)

与外部服务交互行为发生在一个payload提交到目标应用上,导致目标通过某个网络协议和一个外部的域名进行信息交互。

clip_image005

这种行为有时候被称为SSRF,我们更偏向于称之为外部服务交互(”external service interaction”)攻击,因为这种情况里面,很多行为不仅仅通过HTTP协议触发,还有SMB或者FTP等。

外部服务交互可以代表一个严重的漏洞,因为他可以允许应用服务器作为一个代理来攻击其他的服务器。这包裹公网上面的第三方系统,同一个组织下的内部系统或者监听在本地的服务。根据网络结构,这可以将内部容易被攻击的系统暴露给外部的攻击者。

阅读剩余部分...

Debian 8.3 Mate搭建渗透测试环境

作者:Secer 发布时间:July 21, 2016 分类:Linux笔记 No Comments

Debian 8.3 Mate 下载地址
http://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/
http://cdimage.debian.org/debian-cd/8.3.0-live/amd64/iso-hybrid/debian-live-8.3.0-amd64-mate-desktop.iso
http://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-8.3.0-amd64-mate-desktop.iso
#Ubuntu Mate ISO http://cdimage.ubuntu.com/ubuntu-mate/releases/15.04/release/ubuntu-mate-15.04-desktop-amd64.iso

 

Debian 安装msf # ruby2.3.1

apt-get install pptp-linux network-manager-pptp build-essential zlib1g zlib1g-dev libxml2 libxml2-dev libxslt-dev locate libreadline6-dev libcurl4-openssl-dev git-core libssl-dev libyaml-dev openssl autoconf libtool ncurses-dev bison curl wget postgresql postgresql-contrib libpq-dev libapr1 libaprutil1 libsvn1 libpcap-dev git-core postgresql curl nmap libsqlite3-dev default-jdk screen subversion –y   #必要组件

ruby用rvm装吧

$ curl -sSL https://rvm.io/mpapis.asc | gpg --import -
$ \curl -sSL https://get.rvm.io | bash -s stable
# 如果上面的连接失败,可以尝试:
$ curl -L https://raw.githubusercontent.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable
$ source /etc/profile.d/rvm.sh
rvm install ruby-2.3.1
#rvm install ruby-2.1.8
rvm use 2.3.1 --default
gem install bundler

 

apt-get install rubygems-integration rubygems
gem install wirble sqlite3 bundler
###下面各种报错都是国内网络不稳定造成,直接上vpn解决##
#报错Unable to download data from https://rubygems.org/ - Errno::ECONNRESET: Connection reset by peer - SSL_connect,解决如下

wget https://raw.githubusercontent.com/rubygems/rubygems/master/lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem
gem which rubygems
/usr/lib/ruby/2.1.0/rubygems.rb
cp ~/Downloads/AddTrustExternalCARoot-2048.pem /usr/lib/ruby/2.1.0/rubygems/ssl_certs/
gem install wirble sqlite3 bundler

排错:

#when download from https, may has SSL error, then: gem sources --removehttps://rubygems.org; gem sources --addhttp://rubygems.org or bundle config mirror.https://rubygems.org https://ruby.taobao.org
head -1 /path/to/metasploit-framework/Gemfile
source 'http://rubygems.org'

 

设置Postgresql数据库及用户

sudo -s
su postgres
createuser msf -P -S -R -D
Enter password for new role: ***
Enter it again: ***
createdb -O msf msf
exit

cd /opt/; git clone https://github.com/rapid7/metasploit-framework.git
cd metasploit-framework/
bundle install
bash -c 'for MSF in $(ls msf*); do ln -s /opt/metasploit-framework/$MSF /usr/local/bin/$MSF;done'
nano /opt/metasploit-framework/config/database.yml

production:
adapter: postgresql
database: msf
username: msf
password: msf
host: 127.0.0.1
port: 5432
pool: 75
timeout: 5


sh -c "echo export MSF_DATABASE_CONFIG=/opt/metasploit-framework/config/database.yml >> /etc/profile"
### sh -c "echo export MSF_DATABASE_CONFIG=/opt/metasploit-framework/config/database.yml >> ~/.bashrc"
source /etc/profile
安装中文输入法
apt-get install ibus ibus-googlepinyin ibus-sunpinyin

 

安装Armitage

curl -# -o /tmp/armitage.tgz http://www.fastandeasyhacking.com/download/armitage-latest.tgz
tar -xvzf /tmp/armitage.tgz -C /opt
ln -s /opt/armitage/armitage /usr/local/bin/armitage
ln -s /opt/armitage/teamserver /usr/local/bin/armitage_teamserver
sh -c "echo java -jar /opt/armitage/armitage.jar \$\* > /opt/armitage/armitage"
perl -pi -e 's/armitage.jar/\/opt\/armitage\/armitage.jar/g' /opt/armitage/teamserver

安装CobaltStrike
US代理,获取cobaltstrike

firefox https://www.cobaltstrike.com/download
tar -xvzf /tmp/cobaltstrike.tgz -C /opt
ln -s /opt/cobaltstrike/cobaltstrike /usr/local/bin/cobaltstrike
ln -s /opt/cobaltstrike/teamserver /usr/local/bin/cobaltstrike_teamserver
sh -c "echo java -jar /opt/cobaltstrike/cobaltstrike.jar \$\* > /opt/cobaltstrike/cobaltstrike"
#perl -pi -e 's/cobaltstrike.jar/\/opt\/cobaltstrike\/cobaltstrike.jar/g' /opt/cobaltstrike/teamserver

安装SQLMap

cd /usr/share/; git clone https://github.com/sqlmapproject/sqlmap.git
ln -s /usr/share/sqlmap/sqlmap.py /usr/bin/sqlmap

安装Bettercap

apt-get install build-essential ruby-dev libpcap-dev
gem install bettercap
gem update bettercap

安装 DNSEnum

DNSenum http://dnsenum.googlecode.com/files/dnsenum1.2.tar.gz
git clone https://github.com/fwaeytens/dnsenum.git
cd dnsenum/
安装缺失的模块:cpan XXX::xxx

安装 fierce

$ cd /usr/share
$ svn co https://svn.assembla.com/svn/fierce/fierce2/trunk/ fierce2/
$ cd fierce2/
$ perl Makefile.PL
$ make
$ make test
$ make install
$ ln -s /usr/local/bin/fierce /usr/share/fierce2/fierce
$ mkdir -p /pentest/enumeration/fierce/
$ ln -s /usr/local/bin/fierce /pentest/enumeration/fierce/fierce

cpan Net::DNS #安装缺失的库
cpan Net::DNS::Resolver #貌似可以解决报错 improperly terminated AXFR at D:\tools\fierce-0.9.9\fierce.pl line 228.

安装WPScan

Installing on Debian:
sudo apt-get install git ruby ruby-dev libcurl4-openssl-dev make zlib1g-dev
cd /usr/share/; git clone https://github.com/wpscanteam/wpscan.git
cd wpscan

gem install bundler && bundle install --without test --path vendor/bundle
alias wpscan='ruby /usr/share/wpscan/wpscan.rb --enumerate u --enumerate p --enumerate t --url '

或者安装Docker后安装Docker的wpscan

docker pull wpscanteam/wpscan
docker run --rm wpscanteam/wpscan -u http://yourblog.com [options]

 

安装PPTP VPN支持

apt-get install network-manager-openvpn network-manager-pptp network-manager-pptp-gnome network-manager-vpnc
service network-manager restart

 

 

安装GuardScan

wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
pip install tornado
#安装个lnmp
apt-get install screen
screen -S lnmp
wget -c http://soft.vpser.net/lnmp/lnmp1.2-full.tar.gz && tar zxf lnmp1.2-full.tar.gz && cd lnmp1.2-full && ./install.sh lnmp
#wget -c http://soft.vpser.net/lnmp/lnmp1.3beta-full.tar.gz && tar zxf lnmp1.3beta-full.tar.gz && cd lnmp1.3beta-full && ./install.sh lnmp

 

mysql

create database pscan;
use pscan;
source pscan.sql
CREATE USER 'pscan'@'%' IDENTIFIED BY 'RFwPauXUhF4sWtSq';GRANT USAGE ON *.* TO 'pscan'@'%' IDENTIFIED BY '***' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;GRANT ALL PRIVILEGES ON `pscan`.* TO 'pscan'@'%';

修改conn.php中的数据库信息
修改 ./proxy/isqlmap.py
self.webserver="http://localhost:88/"
改成你自己的主机地址和端口。
修改./proxy/task.py
def update():
url="http://localhost:88/api.php?type=sqlmap_update"
urllib2.urlopen(url).read()
def api_get():
url="http://localhost:88/api.php?type=api_get"
data=urllib2.urlopen(url).read()
改成你的host地址


配置
打开 http://localhost:88/config.php 在list里面添加sqlmapapi节点
格式为
http://127.0.0.1:8775 (不需要最后一个/)
浏览器设置代理,并且添加一个http header
User-Hash: youhash


使用
首先运行sqlmapapi,并且在config里面增加至少一个节点
cd proxy/
python proxy_io.py 8080&
python task.py&
然后将浏览器代理设置为
http 127.0.0.1 8080
然后一顿请求之后可以打开
http://localhost:88/config.php

 

仅作记录,呵呵 工具党。