A1CTF靶场搭建

ISCTF出题送了一个月的4C16G的香港服务器,拿来练一下运维,先搭建一个A1CTF平台试试看

前置要求

A1CTF需要这些,我们一个个安装

SSH平台连接就直接拿平台给的信息连就好了,这边改端口了,不再是22了

我们大概先看看基础信息

可以看到docker还没下载,那我们上来先配置一下docker环境,顺便安装一点基础工具

docker配置

1
2
3
4
5
6
7
8
9
10
11
sudo apt install -y \
vim \
git \
curl \
wget \
htop \
net-tools \
ufw \
nginx \
docker.io \
docker-compose

别的都没啥问题,docker说没这个包,但是docker对于我们后边进行的A1的pull很重要,必须配置好

我们先更新一次索引,看看这样子能不能安装docker

1
2
3
4
5
sudo apt update 
sudo apt install docker.io

sudo systemctl start docker
sudo systemctl enable docker

OK更新索引完毕

这个时候安装docker就没啥阻碍了

docker的安装一切顺利

接下来配置一下防火墙

防火墙配置

1
2
3
4
5
6
7
8
9
10
sudo ufw enable

# 开放必要端口
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 8080/tcp # CTF平台端口

# 查看规则
sudo ufw status numbered

不对啊我去,我没开我的ssh端口,我的ssh端口不是这个

启动一下VNC赶紧关了吧

蠢飞了真的,我们还是先关掉这防火墙吧

然后真的就开上了。。。我真的是蠢飞了吧

第一次检修服务器是自己被自己的防火墙拦住了

继续跟着要求走

接下来配置Node.js

Node.js 22+配置

这个的系统仓库一半到不了22+

1
2
3
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node -v

配置vps的环境比配置服务器取证里的服务器方便和舒服多了,到现在基本上没啥问题,没被奇奇怪怪的报错包围

node配置成功!下一步!

Go 1.24+配置

要求是1.24+,看了看现在已经出到1.25了,但是为了环境等的稳定咱还是下1.24的算了

下个1.24.11的

1
2
3
4
5
6
7
wget https://go.dev/dl/go1.24.11.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.24.11.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc

go version

OK下好了,下一步!

PostgreSQL 15+配置

1
2
3
4
5
sudo sed -i 's/http:\/\/cn.archive.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install postgresql-15

直接输入psql –version即可验证安装情况

下一步!好顺啊

Redis 7+配置

先利用wget进行下载

1
wget https://github.com/redis/redis/archive/7.2.5.tar.gz

接下来进行一系列安装即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tar -xzvf 7.2.5.tar.gz
cd redis-7.2.5

sudo apt update
sudo apt install build-essential
make
make test
sudo make install

# 创建目录
sudo mkdir -p /etc/redis /var/lib/redis
sudo cp redis.conf /etc/redis/

# 后台启动
redis-server /etc/redis/redis.conf --daemonize yes

make一下

那我们就make test一下

满屏绿光看的人赏心悦目

似乎缺少pkg-config,我们也配置一下这个

1
2
sudo apt update
sudo apt install -y pkg-config build-essential tcl libssl-dev

配完之后回去再make一下

1
2
3
4
5
6
7
8
9
# 回到 Redis 目录
cd ~/redis-7.2.5

# 清理之前的编译
make distclean

# 重新编译安装
make
sudo make install

安装完成,我们跑一下make test看看

问题不大(都不影响)

最后利用redis-server –version验证一下版本

Redis 7+配置完毕,最后进入Kubernetes配置

Kubernetes配置

Kubernetes一向麻烦的要死,服务器取证都不想碰到这玩意(

慢慢配置吧,还有一堆的前置

这边注意我们是单节点的Kubernetes配置,不要搞错了

https://zhuanlan.zhihu.com/p/1932852088334951626

跟着这一位师傅走一下

关闭swap

先关闭swap,虚拟内存相关,因为Kubernets读不了这玩意

1
2
swapoff -a
vi /etc/fstab

为了永久关闭,我们需要注释这个文件,不过我这边没有

很干净

后边防火墙什么的也要记得关

内核参数配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建内核参数文件
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

# 加载内核模块
sudo modprobe br_netfilter

# 应用配置
sudo sysctl --system

安装依赖工具

1
2
sudo apt update #更新过很多次了其实没必要了
sudo apt install -y apt-transport-https ca-certificates curl #我其实装过了

安装容器运行时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 添加 Kubernetes 阿里云源
sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

# 添加 GPG 密钥
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-aliyun.gpg

# 更新源
sudo apt update

# 安装 kubelet/kubeadm/kubectl
sudo apt install -y kubelet kubeadm kubectl

# 锁定版本防止自动升级
sudo apt-mark hold kubelet kubeadm kubectl


如图所示,一切正常

锁一下更新

初始化控制面板

1
2
3
4
5
6
7
8
9
10
11
12
# 指定使用 Docker
sudo kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--cri-socket unix:///var/run/cri-dockerd.sock

sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers

# 配置 kubectl
export KUBECONFIG=/etc/kubernetes/admin.conf

# 检查节点状态
kubectl get nodes

非常好我们成功初始化了控制面板

配置kubectl

1
2
3
4
5
6
7
# 按照提示配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 或者使用 root 用户的简捷方式
export KUBECONFIG=/etc/kubernetes/admin.conf

安装网络插件calico

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 检查 Pod 状态(可能显示 ImagePullBackOff)
kubectl get pods -n kube-system

# 解决镜像拉取问题
sudo mkdir -p /etc/containerd/certs.d/docker.io
sudo tee /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://registry.docker-cn.com"
[host."https://registry.docker-cn.com"]
capabilities = ["pull", "resolve"]
EOF

# 重新应用 Calico
kubectl delete -f https://docs.projectcalico.org/manifests/calico.yaml
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

# 等待 Pod 变为 Running
kubectl get pods -n kube-system -w

一片大好

移除污点

1
2
3
4
5
6
7
8
# 检查当前污点
kubectl describe node | grep Taints

# 移除污点
kubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-

# 确认污点已移除
kubectl describe node | grep Taints

OK了

安装Dashboard

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#下载helm
wget https://get.helm.sh/helm-v3.18.4-linux-amd64.tar.gz

#安装helm
tar zxvf helm-v3.18.4-linux-amd64.tar.gz
linux-amd64/
linux-amd64/README.md
linux-amd64/helm
linux-amd64/LICENSE
mv linux-amd64/helm /usr/local/bin/

# 添加 Dashboard 仓库
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/

# 安装 Dashboard
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \
--create-namespace \
--namespace kubernetes-dashboard

# 检查 Dashboard Pods
kubectl get pods -n kubernetes-dashboard

Congratulations!我们终于可以短暂脱离finalshell的大蓝界面了(迟早换了)

访问Dashboard

注意这边我们是云服务器啊,不是本地的,不要搞本地的,要用公网IP进行端口转发

1
2
3
4
5
# 停止之前可能的端口转发
pkill -f "kubectl port-forward"

# 使用公网IP进行端口转发(重要:指定 address='0.0.0.0')
kubectl port-forward -n kubernetes-dashboard svc/kubernetes-dashboard-kong-proxy 8443:443 --address='0.0.0.0' &

成功看见了仪表板,至少也是一大进步了

后边创一下用户搞token

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
27
28
29
30
31
32
33
# 创建管理员 ServiceAccount
cat > dashboard-admin.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF

# 应用配置
kubectl apply -f dashboard-admin.yaml

# 验证一下
kubectl get serviceaccounts -n kubernetes-dashboard

# 查看 ClusterRoleBinding
kubectl get clusterrolebinding admin-user

#终于可以创建令牌了
kubectl -n kubernetes-dashboard create token admin-user

我们进来了!

还能看看节点

常用命令备忘录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pkill -f "kubectl port-forward"
# 使用公网IP进行端口转发(重要:指定 address='0.0.0.0')
kubectl port-forward -n kubernetes-dashboard svc/kubernetes-dashboard-kong-proxy 8443:443 --address='0.0.0.0' &

# 查看所有资源
kubectl get all --all-namespaces

# 查看组件状态
kubectl get componentstatuses

# 查看系统事件
kubectl get events --sort-by='.lastTimestamp'

# 查看 Pod 日志
kubectl logs <pod-name> -n <namespace>

# 进入 Pod
kubectl exec -it <pod-name> -- sh

依我来看,终于配置完前置环境了!!!

A1CTF我们来了!

A1CTF正式搭建

在快速开始(并不快速)的前置要求做完之后,我们终于可以开始正式搭建A1CTF的靶场了

A1CTF/README.md at main · carbofish/A1CTF

跟着这个README走一下,我们下源码,这样子好改

克隆项目

1
2
git clone https://github.com/carbofish/A1CTF.git
cd A1CTF

啊哦,报错了,似乎是因为网络不太好,Git仓库也有点大

1
2
3
git config --global http.postBuffer 524288000
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999

看懂了,就是网速太慢了

干脆wget下也一样

1
2
3
wget https://github.com/carbofish/A1CTF/archive/refs/heads/main.zip
#再解压一下
unzip main.zip

项目结构大概如上,了解一下

接下来配置环境

配置环境

1
2
3
cp config.example.yaml config.yaml
# 编辑 config.yaml 文件,配置数据库和其他服务
# Edit config.yaml to configure database and other services

启动Docker

1
docker-compose up -d

欸没装这个啊,装一下

1
apt  install docker-compose

之后直接docker-compose up -d即可

step有点多啊。看起来要等一会儿时间呢

我去报错了,说没有这个.git文件

我们在这个目录下初始化一下git

1
2
3
4
5
6
7
cd ~/A1CTF
git init
git add .
git commit -m "A1CTF Initial commit"

# 重新构建
docker-compose up -d --build

OK正常了这边,继续Step

构建ing,前端代码稍微有19个警告,问题不大

OK完全成功了

修改端口绑定配置

修改一下,好让别的机器能上

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
version: '3.8'

services:
app:
build: .
image: test-a1ctf:latest
ports:
- "0.0.0.0:7777:7777" # 后端API
- "0.0.0.0:5173:5173" # 前端
- "0.0.0.0:8081:8081" # 监控
environment:
- GIN_MODE=release
volumes:
- ./appdata:/app/data
- ./config.yaml:/app/config.yaml:ro
- ./k8sconfig.yaml:/app/k8sconfig.yaml:ro
depends_on:
- postgres
- redis
restart: unless-stopped
networks:
- a1ctf-network

postgres:
image: postgres:17-alpine
environment:
POSTGRES_DB: a1ctf
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
- ./postgres_data:/var/lib/postgresql/data
ports:
- "0.0.0.0:5433:5432"
restart: unless-stopped
networks:
- a1ctf-network

redis:
image: redis:alpine
# 修改Redis端口映射,避免冲突
# 将外部端口改为63790,内部端口还是6379
ports:
- "0.0.0.0:63790:6379"
restart: unless-stopped
networks:
- a1ctf-network

networks:
a1ctf-network:
driver: bridge

修改完之后更新docker,重启服务

1
2
3
4
5
6
7
8
# 停止当前服务
docker-compose down

# 重新构建(如果代码有修改)
# docker-compose build

# 启动服务
docker-compose up -d

重启的很快

报错修复

但是报错了,Redis端口冲突了

修改了一下上边的代码

一切正常了

说早了,怎么上不去

这个a1ctf_app_1在重启,但是启动起不来

1
docker logs --tail 50 a1ctf_app_1

看看日志先

哦是想创目录但是没权限

改一下吧,改一下权限

1
2
3
4
5
6
7
8
9
# 1. 停止服务
docker-compose down

# 2. 设置正确的目录权限
sudo chown -R 1000:1000 appdata
sudo chmod -R 755 appdata

# 3. 重新启动
docker-compose up -d

这个好了,又有别的问题了

啊是数据库的问题

数据库指向了5432,服务名应该是postgres,而不是localhost

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
postgres:
image: postgres:17-alpine
environment:
POSTGRES_DB: a1ctf
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_INITDB_ARGS: "--encoding=UTF8"
volumes:
- ./postgres_data:/var/lib/postgresql/data
ports:
- "0.0.0.0:5433:5432"
restart: unless-stopped
networks:
- a1ctf-network
# 健康检查 - 确保数据库完全就绪
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d a1ctf"]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s

依旧报错,似乎是config.yml强制了localhost,再去改改

这边改完变成下边这样子

接下来再一次重启

1
docker-compose restart app

我去。。还在报错

k8sconfig.yaml是一个目录而不是文件???

1
2
3
4
5
6
7
8
9
# 进入 A1CTF 目录
cd ~/A1CTF

# 直接把kubernetes的复制粘贴过来
sudo cp /etc/kubernetes/admin.conf ~/A1CTF/k8sconfig.yaml
sudo chown $USER:$USER ~/A1CTF/k8sconfig.yaml

# 重新启动应用
docker-compose restart app

终于好了,感动中国

可以看到开在7777端口了,我们过去看看

非常好,终于搭好了

Kubernetes上边也能看见

后边打算魔改和摸索,先写那么多吧


A1CTF靶场搭建
https://mei-you-qian.github.io/2025/12/18/A1CTF靶场搭建/
作者
Meiyouqian
发布于
2025年12月18日
许可协议