ctf平台搭建笔记

搭建什么环境总会遇到一些坑,而又很可能在以后会需要再次搭建,所以健忘的自己来记录一下它~

CTF平台

有一段时间了,所以….该忘的都忘了

当然是选择开源的平台咯,自己又不会写…自己在本地测试过很多平台,最后还是选择了CTFd,它比较轻量,安装也很方便:

1
2
3
git clone https://github.com/CTFd/CTFd.git
cd CTFd/
pip install -r requirements.txt

才开始是使用gunicorn部署的,这是官方推荐的方式:

1
gunicorn --bind 0.0.0.0:80 -w 4 "CTFd:create_app()"

但是在我这里发现它效率不高,在部分电脑上会很慢,自己又把握不了它,另外加上它对我的网站证书似乎不合,于是换了Nginx+uwsgi

1
uwsgi -s 127.0.0.1:4000 -w 'CTFd:create_app()'

Nginx的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 443 ssl;
server_name betamao.me;
ssl on;
root /home/ubuntu/CTFd/CTFd/;
index index.html index.htm;
ssl_certificate ../cert/213997947790966.pem;
ssl_certificate_key ../cert/213997947790966.key;

# ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:4000;
}
location ~* /themes/(original|admin)/static/ {
root /home/ubuntu/CTFd/CTFd/;
autoindex on;
}
}

不过这种搭配的文件上传/下载功能存在问题,获取目录会出错,需要改一下源码,忘了地方啦~

Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
wget http://nginx.org/download/nginx-1.13.5.tar.gz

tar zxvf nginx-1.13.5.tar.gz

cd nginx-1.13.5

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

make

make install

./nginx -s start

o啦~

pwn-docker

emmmm这种神题怎么能放内网环境,于是放服务器,直接放上面还是不靠谱,于是花了点时间部署在docker里,于是开启了采坑之旅。。。
安装

1
2
apt-get update
apt-get install -y docker

更改源
因为是阿里云服务器,就使用了阿里的源,有内网加速嘛~

1
2
3
4
5
6
7
8
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pb199umc.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

写Dockerfile

  1. 首先是权限问题,从下面的命令或许能看出采坑的影子,之前的想法是将相关文件放在低权限用户目录,属主为root,属组为pwn,组没有写权限,结果被告知flag可以被删除,突然想到该目录属主为pwn,他不能修改文件但可以删除文件,于是就简单改下,利用tmp的粘滞位好啦
  2. 基础镜像真的是最小镜像,什么都没有,执行命令一定要先向下是不是shell自带的,不是就一定要先安装,还有32执行环境什么的!

这里先构建基础镜像:

1
2
3
4
5
6
7
8
9
10
11
12
FROM ubuntu
MAINTAINER BetaMao

## 添加 32位支持
RUN dpkg --add-architecture i386

## 更新列表
RUN apt-get update

## 安装基础程序
RUN apt-get install -y libc6:i386 libncurses5:i386 libstdc++6:i386\
&&apt-get install -y socat sudo

然后对于每道题,以这种方式构建镜像:

1
2
3
4
5
6
.
├── Dockerfile
├── bat.sh
└── file
├── flag
└── pwn

Dockerfile这样写啦:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM base/ubuntu:1.2
MAINTAINER BetaMao

## 移动文件
COPY ./file/ /tmp/

## 安装监听程序
#RUN apt-get update\
# &&apt-get install -y socat

## 创建低权限用户
RUN useradd -U -m pwn

## 移动文件到低权限用户目录
#RUN cp /tmp/pwn /home/pwn/\
# &&cp /tmp/flag /home/pwn/

RUN chown root:pwn /tmp/flag\
&&chown root:pwn /tmp/pwn

## 配置权限,程序属于低权限用户,flag属于root与低权限组,组可查看flag
RUN chmod 750 /tmp/pwn\
&&chmod 740 /tmp/flag
CMD -u pwn socat tcp-l:4444,fork exec:/tmp/pwn
#ENTRYPOINT ['sudo','-u']
EXPOSE 4444

这里也被坑了,第一次这样用docker,在ENTRYPOINT处在命令后加了&让它在后台执行,结果docker就直接结束了,排错又浪费了很多时间,最后的构建命令为:

1
2
3
4
#!/bin/sh
read -p "请输入镜像名:" tag
read -p "请输入端口号:" port
docker build -t $tag . && docker run -d -p 0.0.0.0:port:4444 -t $tag

但是这样管理很不方便,docker-compose好像也不方便添加题目,有时间再写个管理脚本吧~

opencv安装

lctf的一道题用到了,记一下:
1.下载源码:https://opencv.org/releases.html,解压
2.安装依赖:

1
2
3
4
5
6
7
#似乎部分装不上也没关系
apt-get install build-essential
apt-get install cmake
apt-get install libgtk2.0-dev
apt-get install pkg-config
apt-get install python-dev python-numpy
apt-get install libavcodec-dev libavformat-dev libswscale-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev

3.在非opencv源码目录创建一个目录,在此目录下运行cmake /[opencvDir]
3.运行

1
2
3
4
make -j $(nproc)
make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf
ldconfig

/记录下那道题用到的工具:https://github.com/jaybosamiya/busysteg/