(Translated by https://www.hiragana.jp/)
GitHub - Tp0t-Team/Tp0tOJ: A CTF online judge platform developed by Tp0t.
Skip to content

Tp0t-Team/Tp0tOJ

Repository files navigation

Tp0t OJ

demo站服务器いた暂时线,せいざい寻找しんふく务器

Tp0tOJ

Alt

のべ续老版本はんぽんてきTp0t OJ,ぜんはし继承并优りょう视觉效果こうかきさきはし从JAVAきり换为Golang,定位ていい也从一个面向校内的持续性训练平台,转向于一个比CTFdさらこのみようてきCTF赛平だい

欢迎みつるせい质的使用しようわが们的平台ひらだい如各だい学校がっこうてきこう赛等,也欢むかえ大家たいかひさげPRISSUE

とく别提醒盈せい质的赛事ふく提供ていきょうしょうつう提供ていきょうCTF赛服务来获取むくいきん)如果使用しようほん平台ひらだい提供ていきょうふく务同样需よう遵循AGPL开源

わが们的特性とくせい

特性とくせい Tp0t OJ CTFd dasctf
K8sあつまりぐん -> 一键部署题目环境 ✔️ ✔️
题目てい义与实例ぶん离 -> 原生げんせい支持しじ动态Flag ✔️ ✔️
预构けん单执行文こうぶんけん -> 无其赖,平台ひらだいいち键启动 ✔️
提供ていきょうWriteUpてきじょう传和载通どう ✔️ ✔️
动态积分+いちさん ✔️
容器ようき调度,避免さんりょくなみ ✔️
合理ごうりてき动态积分きょく线 ✔️

平台ひらだい部署ぶしょ指南しなん

环境じゅん

かんかた推荐Ubuntu20.04 AMD64あずか Ubuntu22.04 AMD64,releaseちゅうてき版本はんぽん支持しじlinux/amd64,ただしざい众多てきlinux发行ばんじょう完成かんせい测试,如果ゆう完成かんせい其他发行ばんてき测试,请提交issue让我们知どう 其他けい统和构请按照编译指南しなんくだり编译,目前もくぜんやめ经不需要じゅよう赖CGO

いん为题image build赖于docker,所以ゆえん需要じゅよう先安さきやすそうこのみ和本わほんつくえ网段无冲突的Dockerわが们在测试过程ちゅう发现部分ぶぶんうんふく提供ていきょうしょうだま认Docker网段和本わほんつくえきょくいき网网だん冲突,导致build镜像てき时候无法正常せいじょう访问网络

Install Docker Engine | Docker Documentation

如果需要じゅよう调整网段,ざい/etc/docker/daemon.jsonちゅう配置はいちbipだん参考さんこう如下,网段更改こうかい

{
    "bip": "192.168.100.1/24"
}

しかきさきじゅう启dockerふく

sudo systemctl daemon-reload
sudo systemctl restart docker

请确とうまえけい中有ちゅううsystemd环境 什么systemd

とうまえよう需要じゅようざい sudo 组

部署ぶしょりゅうほど

よし于SQLite对于并发读写并不友好ゆうこう所以ゆえんざい完成かんせい优化测试ぜんさい推荐使用しようSQLite,だま认数すえ库更换为PostgresSQL

すえけい统架构在release页面获取 ojtool 进制ぶんけん,如果所用しょようけい统架构没ゆう对应てきrelease,请参照さんしょうcontributionぎょうbuild

./ojtool prepare -MasterIP xxx.xxx.xxx.xxx --postgres
INSTALL_K3S_MIRROR=cn ./ojtool prepare -MasterIP xxx.xxx.xxx.xxx --postgres #for CHINA

中国ちゅうごくよう户请使用しようMirrorてきまいりすう执行

执行ojtool prepare かいざいとう前目まえめ录下生成せいせい配置はいちぶんけんresourcesあんそう完成かんせいきさき录应该如しょしめせ,其中https.crthttps.key ぶんけんかいだま生成せいせい平台ひらだい启动时会动检测这两个ぶんけん,如果存在そんざい,就自动启ようhttpsしきいや则采ようhttpしき

home.html提供ていきょうりょうしゅ页面じょうせいてきこうのうざいぜんきさきはし一体化的单文件模式下,如果平台ひらだいresources 录中存在そんざいhome.html かいはた其作为平だいしゅ展示てんじ

.
├── agent-install.sh        #「ざい从节てんふく务器じょう使用しよう」从节てんあんそうぶんけん
├── OJ                      #平台ひらだい进制ぶんけん
├── ojtool                  #命令めいれいぎょう工具こうぐ进制ぶんけん
├── resources               #配置はいちぶんけん录
│   ├── ca.crt              #镜像仓库签名证书备份
│   ├── config.yaml         #「平台ひらだい启动ぜん请修あらため平台ひらだい配置はいちぶんけんばん
│   ├── docker-registry     #镜像仓库しょう关目录
│   │   ├── auth            #镜像仓库授权ぶんけん录
│   │   │   └── htpasswd    #授权ぶんけん
│   │   ├── certs           #镜像仓库证书录
│   │   │   ├── tls.crt     #镜像仓库证书
│   │   │   └── tls.key     #镜像仓库わたし钥
│   │   └── data            #镜像仓库すうすえそん储目录
|   ├── [postgres]          #postgresすうすえ录
│   ├── [https.crt]         #「生成せいせい」网站TLS证书
│   ├── [https.key]         #「生成せいせい」网站TLSわたし钥
│   ├── k3s.yaml            #生成せいせいてきk3s配置はいちぶんけん需要じゅようおさむあらため
|   ├── [home.html]         #「生成せいせい」如果存在そんざいかい载该网页做为ぬし页面
|   ├── [timeline.save]     #「启动きさき生成せいせいはいぎょう榜历すうすえそん储文けん
|   ├── [emails]            #「生成せいせい」邮件板目いため录
│   │   ├── [reset.html]    #「生成せいせいみつ码重おけ邮件ばん
│   │   └── [welcome.html]  #「生成せいせい」导入账户はつはじめ邮件ばん
│   ├── tls.crt             #镜像仓库公私こうし钥备份
│   └── tls.key             #镜像仓库公私こうし钥备份
├── [writeup]               #「启动きさき生成せいせい」writeupそん储目录
└── start.sh                #「配置はいちかん毕后启动」启动脚本きゃくほん

しかきさき使用しよう start.sh启动平台ひらだい

agent-install.sh生成せいせいてき从节てんあんそうぶんけん,从节てん为平だい集成しゅうせいk8sてき从节てんゆかりずい平台ひらだい部署ぶしょてきしゅ节点进行管理かんり脚本きゃくほんざい需要じゅよう部署ぶしょてき从节てんふく务器じょう运行!

はた该文けん拷贝到从节てんふく务器じょう,执行

./agent-install.sh xxx.xxx.xxx.xxx #从节てんふく务器こう网IP
INSTALL_K3S_MIRROR=cn ./agent-install.sh xxx.xxx.xxx.xxx #对于中国ちゅうごくよう

如果需要じゅようおろし载k3s,参考さんこうかん

To uninstall K3s from a server node, run:

/usr/local/bin/k3s-uninstall.sh

To uninstall K3s from an agent node, run:

/usr/local/bin/k3s-agent-uninstall.sh

平台ひらだい配置はいち说明

server:                                 #平台ひらだいふく务器てき配置はいちさんすう
  host: 127.0.0.1                       #设置为Host,よう于重おけみつ码和CORSとう(仅hostname部分ぶぶん含协议端口和くちわみち
  username: Tp0t                        #だま认adminよう户名
  password: password                    #だま认admin账号みつ
  mail: admin@example.com               #だま认admin账号邮箱
  port: 0                               #0时自动选择80/443,0指定していはしこう
  salt: "xxxxxxxxxx"                    #よう于密码保护的salt,生成せいせい
  behaviorLog: false                    #よう于记录选しゅ关键ぎょう为,だま认不开启
  debug:                                #debugしょう关功のうなま产环さかい请勿开启
    dockerOpDetail: false               #开启以查容器ようき构建发的问题
    noOriginCheck: false                #开启きんようorgin检查,きんようcsrf检查,きんようCSP
    dbOpDetail: false                   #开启查看所有しょゆうすうすえ库请もとむ
  cookieExpiresSeconds: 3600            #cookie过期びょうすう,0表示ひょうじかい过期,-1表示ひょうじざい关闭浏览时过
email:                                  #邮件ふく配置はいち
  host: smtp.example.com                #邮件ふく提供ていきょうしょうふく务器
  username: exampleUsername             #邮件发送账号
  password: examplePassword             #邮件发送账号みつ码(可能かのう为授权码)
challenge:                              #题目分数ぶんすうひかえせいさんすう
  firstBloodReward: 0.1                 #いち分数ぶんすう奖励比例ひれい
  secondBloodReward: 0.08               #分数ぶんすう奖励比例ひれい
  thirdBloodReward: 0.05                #さん分数ぶんすう奖励比例ひれい
  halfLife: 20                          #题目ぶん值减はんしょ需解题人数にんずう
kubernetes:                             #k8sあつまりぐん配置はいちさんすう
  portAllocBegin: 30000                 #分配ぶんぱいはしこう范围起点きてん
  portAllocEnd: 31000                   #分配ぶんぱいはしこう终点
  username: xxxxxxxx                    #不可ふかおさむあらため」镜像仓库よう户名
  password: xxxxxxxx                    #不可ふかおさむあらため」镜像仓库みつ
  registryHost: xxx.xxx.xxx.xxx:5000    #不可ふかおさむあらため」镜像仓库与平よへいだい一致いっち
database:                               #かずすえ库连せっさんすう
  dsn: "..."                            #かずすえ库连せっ配置はいち生成せいせい
timelineFile: "resources/timeline.save" #けん议修あらためはいぎょう榜历すうすえそん储文けんみち

邮件ふく配置はいち必要ひつよう配置はいちよう户重おけかずおさむあらためみつ码依赖于邮件ふく务,配置はいち邮件ふく务将导致よう户无ほうおさむあらためみつ

题目ぶんすうきょく线公しき

$$k=\frac{1.8414\cdot(N_{solved}-1)}{HalfLife}$$

$$RealScore=\left\lfloor\frac{BaseScore}{k+e^{-k}}\right\rfloor$$

题目ぶんすうきょく线示れい

curve

もと础分すう1000,减半人数にんずう20,含奖励分すうじょう况下 动态积分きょく线

平台ひらだい使用しよう指南しなん

题目flag支持しじ

  • 单flag
  • flag
  • せい则flag
  • 动态ずいつくえflag

配置はいち参考さんこうconfig_demos

需要じゅよう使用しようk8sあつまりぐんてき基本きほん就是PWN题和WEB题

Pwn_demo1

镜像编译

ざい镜像编译页面じょう传镜ぞう需要じゅようじょう包含ほうがんDockerfileてきtarつつめ注意ちゅういtarつつみぼつゆう额外录层级,需要じゅよう直接ちょくせつのう获取いたDockerfile

对于PWN题,推荐使用しようxinetdさく为守护进ほど

Dockerfileしめせれい

新手あらて请严かく按照demo编写题目Dockerfile

  • 注意ちゅうい对于所有しょゆう需要じゅよう执行てきぶんけん附加ふか执行权限,いや则镜ぞうかいbuild成功せいこうただしよう户申请创けん实例てき时候かいしつ

  • 对于singletonてき题目(所有しょゆう选手共用きょうよう一个容器实例),请严かく注意ちゅうい权限かんひかえ

FROM ubuntu:20.04
RUN sed -i "s/http:\/\/archive.ubuntu.com/http:\/\/mirrors.ustc.edu.cn/g" /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y upgrade
RUN apt-get install -y apt-utils lib32z1 xinetd
RUN useradd -u 8888 -m pwn
COPY share/libunicorn.so.1 /usr/local/lib/libunicorn.so.1
RUN chmod 755 /usr/local/lib/libunicorn.so.1
RUN ldconfig
COPY share/easiestpwn /home/pwn/easiestpwn
RUN chmod 755 /home/pwn/easiestpwn
RUN rm /etc/xinetd.d/*
COPY xinetd /etc/xinetd.d/xinetd
COPY entrypoint.sh /home/pwn/entrypoint.sh
ENTRYPOINT ["/home/pwn/entrypoint.sh"]
EXPOSE 8888

entrypoint.shしめせれい

对于动态flagてき题目,必须entrypoint.shぶんけんいん为平だいかいはた生成せいせいてきずいつくえflagどおりentrypoint.shてきだい一个参数的形式传入

#!/bin/sh
echo $1 > flag #动态FLAGてき必须ぎょうよう于平だいはた生成せいせいてきFLAGうつしいれ,也可くだり调整うつしにゅう位置いち
/usr/sbin/xinetd -dontfork #启动もり护进ほど

まもり护进ほどxinetdしめせれい

service pwn 
{
    disable = no
    type        = UNLISTED
    wait        = no
    server      = /bin/sh
    # replace helloworld to your program
    server_args = -c cd${IFS}/home/pwn;exec${IFS}./easiestpwn
    socket_type = stream
    protocol    = tcp
    user        = pwn 
    port        = 8888
    # bind        = 0.0.0.0
    # safety options
    flags       = REUSE
    per_source    = 10 # the maximum instances of this service per source IP address
    rlimit_cpu    = 1 # the maximum number of CPU seconds that the service may use
    #rlimit_as  = 1024M # the Address Space resource limit for the service
    #access_times = 2:00-9:00 12:00-24:00
    nice        = 18
}

つつみしめせれい

つつみ使用しようgz、xz压缩,ただし推荐使用しようtar直接ちょくせつつつめつつみ不能ふのう包含ほうがんとう前文ぜんぶんけん

举个れい,如果Dockerfileとうぶんけんざい/home/pwn/exampleした需要じゅよう运行以下いか指令しれいつつみ

cd /home/pwn/example
tar -cvf ../example.tar ./*

题目部署ぶしょ

yamlぶんけんよう于上一键导入题目信息以及配置题目所属的K8S节点,需要じゅよう使用しよう节点部署ぶしょてき题只のうどおり过导にゅうconfigてき形式けいしき添加てんか

name: dynamic_flag              # challenge name
category: PWN                   # support [MISC|RE|PWN|WEB|CRYPTO|HARDWARE|RW]
score:
  baseScore: 1000               # base score
  dynamic: true                 # if the score change with solved number
flag: 
  value: xxxxxxxxxx             # means that random dynamic flag length is 10
  type: 3                       # 0-Single 1-Multiple 2-Regexp 3-Dynamic
description: "description" 
externalLink: ["http://link"]
singleton: false                # false means this challenge will give every ctfer a container

# below is no need for singleton challenge
nodeConfig:
  - name: "pwn1"                # give this name same as your uploaded image
    image: "pwn1"               # give this name same as your uploaded image
    servicePorts:               # default & DON'T CHANGE IT
      - name: http              # default & DON'T CHANGE IT
        protocol: TCP           # default & DON'T CHANGE IT
        external: 8888          # default & DON'T CHANGE IT
        internal: 8888          # default & DON'T CHANGE IT
        pod: 0                  # default & DON'T CHANGE IT

かずすえ库导ある备份

命令めいれいぎょう工具こうぐojtool提供ていきょう导出こうのう需要じゅようざい平台ひらだい启动きさき使用しよう

./ojtool export [-dir <export folder>]

つう-dir 指定してい导出いたてき录,だま认导いたdata

よう户批りょう导入

命令めいれいぎょう工具こうぐojtool提供ていきょう从csvぶんけん批量导入よう户的こうのう需要じゅようざい平台ひらだい启动きさき使用しよう

./ojtool load -welcome=<true/false> <csv file>
  • welcomeさんすうよう指定していざい导入よう户后むこうよう户发おくはつはじめ邮件
  • <csv file>包含ほうがん需要じゅよう导入てきよう户数すえてきcsvぶんけん格式かくしき<mail>,<username>含表头

开发指南しなん

ぜんはし

  • 请在app录下开vscode
  • npmしょう命令めいれい,请在app录下运行
  • 总之请将app做为工作こうさく

きさきはし

  • 使用しようGolandしょうserverさく工作こうさく

せっこうしょう

  • GraphQLてきschemaぶんけんてい义在server/services/schema.graphql录下

  • 请求成功せいこうかえしかいmessage 为空くしぼつゆう消息しょうそく就是こう消息しょうそく

构建

ぜんはし环境じゅん备:赖latest版本はんぽんてきnpmnodejs,ざいapp录下执行

npm install #必要ひつようじょう况下以删じょpackage-lock.json

如需よう参与さんよ开发(むかいこう开的gitひさげ交代こうたい码),请配置はいちこう动lint,そくざいapp录下执行

npm run prepare

构建命令めいれいぎょう工具こうぐぜんきさきはし一体化可执行文件:赖golang,ざいserver录下执行

go run build.go --postgres  #postgres版本はんぽん
go run build.go --sqlite    #sqlite版本はんぽん暂时弃用