尝试用docker搭建CTFd平台,阅读了多位博主的博客之后来做一个整合以记录,各个博文链接附上,感谢他们的总结
docker手册
详情:
(1)VMware 15 pro
(2)Ubuntu18.04
(3)docker docker-compose
(4)CTFd平台
博文链接:
docker及其工具的安装配置:
https://www.cnblogs.com/codingbit/p/install-docker-in-ubuntu.html
https://blog.csdn.net/valecalida/article/details/99697574
端口的开放以及持久化规则:
https://blog.csdn.net/hqbootstrap1/article/details/94123307
CTFd访问速度慢解决方法:
http://www.ngui.cc/51cto/show-27571.html
CTFd题目库:
https://github.com/susers/Writeups
目录
1.安装Docker
1.首先刷新软件包
sudo apt-get update
2.安装必要的软件包
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
3.添加Docker官方GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
验证指纹是否为9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
,可以通过搜索指纹的后八位来进行,
sudo apt-key fingerprint 0EBFCD88
result:
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) <docker@docker.com>
sub rsa4096 2017-02-22 [S]
4.使用下面的命令来添加稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
2.安装Docker CE
1.刷新软件包
sudo apt-get update
2.安装最新版的Docker CE和Container
sudo apt-get install docker-ce docker-ce-cli containerd.io
3.通过运行hello-world镜像来验证安装是否成功
sudo docker run hello-word
3.安装Docker-compose
在 Linux 系统,可以通过 Compose repository release page on GitHub 来下载 Docker Compose 二进制文件。
对于 alpine 系统,需要安装以下依赖包: py-pip, python-dev, libffi-dev, openssl-dev,
gcc, libc-dev make
1.运行下面的命令以安装最新稳定版的Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
下载不同的版本只需要更改括号中的版本号即可
2.给文件加上可执行权限
sudo chmod +x /usr/local/bin/docker-compose
注意: 如果安装后执行 docker-compose 失败,请检查 PATH 变量。亦可以建立软连接。
比如:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
1.(可选), 为 bash 和 zsh 安装 command completion 。
2.验证安装是否成功
$ docker-compose --version
docker-compose version 1.24.0, build 1110ad01
4.使用非root用户管理运行Docker
Docker 守护进程绑定在 Unix socket 而不是 TCP 端口。默认情况下 Unix socket 归属于 root 用户,其他用户只能通过 sudo 命令访问。所以 Docker 守护进程总是以 root 用户来运行。
如果你不希望每次运行 docker 命令时在前面加上 sudo,你可以创建一个 docker 用户组并把用户加进去。当 Docker 守护进程启动时,会创建一个 Unix socket 供 docker 用户组成员访问。
警告
docker 用户组成员和 root 用户有相同的权限,请查看 Docker Daemon Attack Surface
以了解更多关于系统安全的影响。
1.创建docker
用户组并添加你的用户
sudo groupadd docker
2.添加你的用户到docker
用户组
sudo usermod -aG docker $USER
3.重新登录以试权限生效
4.验证是否可以不用sudo
命令来运行docker
docker run hello-world
这个命令会下载一个 test 镜像并在容器中运行。运行完成后,会显示欢迎信息并退出。
如果你在把用户加到 docker
用户组之前使用了 sudo
运行过 Docker
命令,可能会遇到下面的错误提示,是因为 ~/.docker/
权限不对导致的。
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied
解决这个问题,可以通过删除 ~/.docker/
目录(自定义设置会丢失),或者用下面的命令来更改权限。
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R
5.CTFd安装
git clone https://github.com/CTFd/CTFd.git && cd CTFd
docker-compose up -d
(ps:该命令的意思是定义和运行多个容器)
3.查看容器
docker-compose ps
结果
Name Command State Ports
-------------------------------------------------------------------------------
ctfd_cache_1 docker-entrypoint.sh redis ... Up
ctfd_ctfd_1 /opt/CTFd/docker-entrypoint.sh Up 0.0.0.0:8000->8000/tcp
ctfd_db_1 docker-entrypoint.sh mysql ... Up
ctfd_nginx_1 nginx -g daemon off; Exit 0
(该命令要在CTFd目录下运行,注意docker和-compose之间没有空格)
这里我是端口映射之后再次运行命令的结果
6.映射ip开放端口(只实现了内网访问)映射端口
1.映射IP
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination IP地址:8000
ps:没有iptables的话按照下方操作安装,命令中的“IP地址”指的是你想访问的IP地址,请更改过后再运行
2.开放端口
根据上一行命令,这里开放8000端口。
没有iptables的话先安装
(1)安装
$ sudo apt-get install iptables
(2)添加规则
$ iptables -I INPUT -p tcp --dport 80 -j ACCEPT
其中“80”为想要开放的端口
(3)保存规则
$ iptables-save
完成上述命令我们就完成了开放指定的端口,但是如果此时服务器重启,上述规则就没有了,所以我们需要对规则进行一下持续化操作
(1) 安装iptables-persistent
$ sudo apt-get install iptables-persistent
(2)持久化规则
$ sudo netfilter-persistent save
$ sudo netfilter-persistent reload
进行到这里就可以永久打开我们所需的端口了
7.CTFd平台访问速度慢解决方法
搭建好CTFd平台之后在url框中输入IP地址:8000进行访问,发现速度极其慢,我通过搜索找到了该问题的原因:
CTFd中的代码中引用了国外网站的css,而网站可能是被墙了,不能访问,每次打开页面的时候,都要调用这个CSS,请求失败后,才会加载其它页面.
解决办法:
查看CTFd的源码,发现fonts.dev.css和fonts.min.css引用了此网站的all.css.
fonts.dev.css和fonts.min.css的第一行代码:
@import url(https://use.fontawesome.com/releases/v5.9.0/css/all.css);
先找到这两个文件所在位置
[root@localhost ~]# find / -name fonts.min.css
[root@localhost ~]# find / -name fonts.dev.css
将文件中的
https://use.fontawesome.com/releases/v5.9.0/css/all.css
替换为
https://cdn.bootcss.com/font-awesome/5.13.0/css/all.css
重启dockers
sudo systemctl restart docker
再次访问页面,毫秒级加载速度 ,体验爽了.
8.关于CTFd题目的上传(待学习更新)
首先思路是有的
你可以直接上传文件,比如CRYPTO类的题目让答题人下载解密,设定好flag值,这个好说
但是如果是上传需要容器的WEB题的话,那么就需要学会开启镜像,需要会写dockerfile
,我现在的水平还是太低,待学习之后再将这一块内容补上