用docker简单搭建多层靶场(审计演练)
wptr33 2025-01-27 00:37 20 浏览
本文将利用 docker 的自身功能结合若干开源渗透测试环境,在一台虚拟机中,搭建一套简单的三层渗透测试靶场。部分操作过程可能会稍显繁琐,可维护性也不佳,不足之处希望师傅们能够给出建议,不胜感激。
虚拟机配置
4核CPU
4G内存
60G磁盘存储
系统:Ubuntu 22.04.01桌面版最小化安装
(上述配置可根据自身需要进行修改调整)
1. 安装软件
sudo update
sudo apt install openssh-server git wget vim nano python3 python3-pip docker.io docker-compose gcc g++ ufw -y
2. 拉取 Docker 系统镜像
sudo docker pull ubuntu
3. 利用 ubuntu 镜像创建系统容器,并安装 nginx web 服务器
sudo docker run -itd --net=host --name umiddle ubuntu
sudo docker exec -it umiddle bash
进入 docker 容器 shell 后,安装编译安装 nginx 所需的软件,并下载 nginx 当前最新稳定版源码
# 下载所需软件及环境
apt update
apt install git wget vim nano curl gcc g++ openssl libssl-dev libpcre3 libpcre3-dev zlib* make iputils* iproute2 net-tools
wget https://nginx.org/download/nginx-1.22.0.tar.gz
# 解压源码包
tar -zxvf nginx-1.22.0.tar.gz
# 进入源码目录
cd nginx-1.22.0
# 添加 nginx 用户
useradd -M -s /sbin/nologin nginx
# 编译安装
./configure --prefix=/opt/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
make && make install
cp /opt/nginx/sbin/nginx /bin/ && cp /opt/nginx/sbin/nginx /usr/bin
# 安装无误后退出该容器 shell
exit
4. 创建 docker 网络
docker network create --driver bridge --subnet 172.22.0.0/24 --gateway 172.22.0.1 --ip-range 172.22.0.0/24 dockernet1
docker network create --driver bridge --subnet 172.33.0.0/24 --gateway 172.33.0.1 --ip-range 172.33.0.0/24 dockernet2
下图中,第一块桥接网卡为安装 docker 时默认的桥接网卡
这一步中,也可以创建三块 docker 桥接网卡,在搭建靶机时,分别为第一层靶机分配网络1和网络2的地址,为第二层靶机分配网络2和网络3的地址,为第三层靶机分配网络3的地址即可。
5. 第一层靶机搭建
- 创建新的 docker 容器用于安装宝塔面板或根据个人所需部署相应服务,这里的端口映射可根据自己要求进行调整,也可在后续靶场搭建过程中在合适的位置中放置 flag 。
- docker run -itd --name ubt -p 8888:8888 ubuntu
- 为该容器分配网卡及IP地址,并断开与默认桥接网卡的连接
- docker network connect --ip 172.22.0.10 dockernet1 ubt docker network disconnect -f 默认桥接网卡id ubt
- 进入该容器 shell,并安装相应环境
- docker exec -it ubt bash apt update apt install vim nano git wget curl gcc g++ make net-tools iproute2 iputils*
- 上述安装完成后,相关网络信息如下
- 安装宝塔面板,获取脚本后根据提示一步步进行即可
- wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh ed8484bec
- 安装完成后,若默认配置与 docker 容器现有端口映射配置等存在冲突,可修改 docker 容器配置,或使用 bt 命令,根据提示修改宝塔面板的服务端口
- 查看入口地址进行登录配置(也可以通过 bt 命令,根据提示修改用户名密码及面板地址)
- 浏览器访问宝塔地址(虚拟机 IP+宝塔服务端口+面板入口地址),登录面板后,安装并启动 nginx/apache+mysql+php 环境,也可根据自身需求安装并部署其他服务
- 上述环境安装完成后,首先进入“网站”功能,新建站点。在这一步的关键在于配置站点目录及添加数据库
- 站点创建成功后,可使用开源脆弱系统或部分 CMS 搭建脆弱 web 系统。这一步可能会需要自行通过宝塔面板上传站点文件并修改站点目录权限等。
- 进入在第三步安装有 nginx 的 docker 容器中,修改 nginx 服务相关配置
- # 进入容器内 shell 环境 docker exec -it umiddle bash # 编辑 nginx 配置文件 vi /opt/nginx/conf/nginx.conf
- 相关配置如下(也可根据自身需求配置多个服务及端口映射和代理转发):
- worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; server { listen 80; server_name localhost; charset utf-8; access_log /var/log/nginx/access.log; location / { root html; index index.html index.htm index.php; # proxy_pass 后填写宝塔容器所部署 web 服务的地址及端口 proxy_pass http://172.22.0.10; proxy_redirect off; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 500 502 503 504 400 403 404 /50x.html; location = /50x.html { root html; } } }
保存配置后,执行 nginx 命令启动 nginx 服务
- 访问虚拟机地址及相应 nginx 监听端口,查看并配置 web 脆弱系统是否正常。若站点搭建完毕且服务访问正常,第一层靶机则基本搭建完成。
6. 第二层靶机搭建
# 拉取 shiro 反序列化漏洞镜像
docker pull vulfocus/shiro-cve_2016_4437
# 创建并启动容器
docker run -itd --name shirovuln vulfocus/shiro-cve_2016_4437
# 为该容器分配两块网卡及IP地址,并断开与默认桥接网卡的连接
docker network connect --ip 172.22.0.20 dockernet1 shirovuln
docker network connect --ip 172.33.0.20 dockernet2 shirovuln
docker network disconnect 默认桥接网卡id shirovuln
# 安装部分所需工具及软件
docker exec -it shirovuln bash
apt update
apt install vim nano git wget curl net-tools iproute2 iputils*
完整安装完成后,具体网络配置如下
7. 第三层靶机搭建
# 拉取 thinkphp 任意代码执行漏洞镜像
docker pull vulfocus/thinkphp-cnvd_2018_24942
# 创建并启动容器
docker run -itd --name thinkphpvuln vulfocus/thinkphp-cnvd_2018_24942
# 为该容器分配网卡及IP地址,并断开与默认桥接网卡的连接
docker network connect --ip 172.33.0.30 dockernet2 thinkphpvuln
docker network disconnect 默认桥接网卡id thinkphpvuln
# 安装部分所需工具及软件
docker exec -it thinkphpvuln bash
apt update
apt install vim nano git wget curl net-tools iproute2
安装完成后,具体网络配置如下:
8. 配置检查
若安装配置无误,正常情况下应该第一层靶机仅与第二层靶机互通,第二层靶机分别于第一层和第三层靶机互通,第三层靶机仅与第二层靶机互通
检查配置无误后,执行以下命令,修改 docker 容器为自启
# 容器自启
docker update umiddle --restart=always
docker update ubt --restart=always
docker update shirovuln --restart=always
docker update thinkphpvuln --restart=always
最后进入宝塔所在容器中,将面板服务关闭即可(或直接执行 docker exec -it ubt bt stop )
配置完成后创建当前虚拟机快照即完成此次靶场的全部配置,当然最好是在给虚拟机创建快照之前,给每一台 docker 容器分别创建快照。
相关推荐
- Linux文件系统操作常用命令(linux文件内容操作命令)
-
在Linux系统中,有一些常用的文件系统操作命令,以下是这些命令的介绍和作用:#切换目录,其中./代表当前目录,../代表上一级目录cd#查看当前目录里的文件和文件夹ls#...
- 别小看tail 命令,它难倒了技术总监
-
我把自己以往的文章汇总成为了Github,欢迎各位大佬star...
- lnav:基于 Linux 的高级控制台日志文件查看器
-
lnav是一款开源的控制台日志文件查看器,专为Linux和Unix-like系统设计。它通过自动检测日志文件的格式,提取时间戳、日志级别等关键信息,并将多个日志文件的内容按时间顺序合并显示,...
- 声明式与命令式代码(声明模式和命令模式)
-
编程范式中的术语和差异信不信由你,你可能已经以开发人员的身份使用了多种编程范例。因为没有什么比用编程理论招待朋友更有趣的了,所以这篇文章可以帮助您认识代码中的流行范例。命令式编程命令式编程是我们从As...
- linux中的常用命令(linux常用命令和作用)
-
linux中的常用命令linux中的命令统称shell命令shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互shell终端:我们平时输入命令,执行程序的那个...
- 提高工作效率的--Linux常用命令,能够决解95%以上的问题
-
点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf...
- 如何限制他人操作自己的电脑?(如何控制别人的电脑不让发现)
-
这段时间,小猪罗志祥正处于风口浪尖,具体是为啥?还不知道的小伙伴赶紧去补一下最近的娱乐圈八卦~简单来说,就是我们的小罗同事,以自己超强的体力,以及超强的时间管理能力,重新定义了「多人运动」的含义,重新...
- 最通俗易懂的命令模式讲解(命令模式百科)
-
我们先不讲什么是命令模式,先通过一个场景来引出命令模式,看看命令模式能解决什么样的问题。现在有一个渣男张三,他有还几个女朋友,你现在是不是还是单身狗,你就说你气不气?然后他需要每天分别叫几个女朋友起床...
- 互联网大厂后端必看!Spring Boot 中Runtime执行与停止命令?
-
你是否曾在使用SpringBoot开发项目时,遇到需要执行系统命令的场景?比如调用脚本进行文件处理,又或是启动外部程序?很多后端开发人员会使用Processexec=Runtime.get...
- Linux 常用命令(linux常用的20个命令面试)
-
日志排查类操作命令...
- Java字节码指令:if_icmpgt(0xA3)(java字节码使用的汇编语言)
-
if_icmpgt是Java字节码中的一条条件跳转指令,其全称是"IfIntegerCompareGreaterThan"。它用于比较两个整数值的大小。如果栈顶的第一个...
- 外贸干货|如何增加领英的曝光量和询盘
-
#跨境电商#...
- golang执行linux命令(golang调用shell脚本)
-
需求需要通过openssl生成rsa秘钥,然后保存该秘钥。代码实例packagemainimport("io/ioutil""bytes"&...
- LINUX磁盘挂载(linux磁盘挂载到windows)
-
1、使用root用户查看磁盘挂载情况:fdisk-l2、使用df查看当前磁盘挂载情况,根据和fdisk-l的结果进行对比,查看还有那些磁盘未使用3、挂载:mount磁盘挂载路径...
- Linux命令学习——nl命令(linux ln命令的使用)
-
nl命令主要功能为每一个文件添加行号,每一个输入的文件添加行号后发送到标准输出。当没有文件或文件为-时,读取标准输入...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)