Posts Tagged ‘storpool’

StorPool-ската игра на OpenFest 2019

Tuesday, November 5th, 2019

В последните няколко годинии (2017, 2018) сглабям по някаква online игра за щанда на StorPool на OpenFest. Тази година пак сглобих нещо такова, и понеже изисква някаква сървърна част, просто ще му напиша описание, а който иска, може да го setup-не някъде, всичките му неща могат да се свалят от quiz.storpool.com/of2019.tgz.

Играта изглеждаше по следния начин: в началото човек се логва на един сървър, и в motd-то го посреща описание от “предишния човек”, който е hack-вал машината:


yo

i kept working on this, but what i've seen that there's
a strange firewall, and we need to get to port 3xxx. there's
some readme in a weird encoding, no idea how to read that.

the guys that wrote this system are the worst, it's a patch
over duct tape over bad stitching.

looking at the way i got this password, they know nothing
about crypto, anyway, so it should be easy.

gl

Информацията в този текст в общи линии е “нещо слуша на порт 3xxx, има странен firewall, има документация във формат, който не мога да прочета, и тия хора от криптография не разбират”.

В директорията освен този файл (“y00dud3”) има още два – kdctl.dump и manual.EBCDIC-INT. kdctl.dump е strace на /opt/kd/linux-x86_64/devel/bin/kdctl, който може да се види как прави connect() до localhost на порт 3xxx (където “xxx” е номерчето на user-а, имаше отделен порт за всеки участник). Ако човек се опиташе да пусне kdctl, му даваше permission denied (и такова нещо няма, сложих просто permission-и 000 на една от директориите по пътя), така че човек трябва сам да се прави на клиента.

manual.EBCDIC-INT представлява малко документация, обърната в EBCDIC, която човек може да си конвертира обратно с iconv (или както се оказа, с dd). Вътре има описание на системата, с която трябва да се говори, и малко development информация за протокола, като част от информацията е криптирана:


KroberDyne access terminal v2.1.18-fcdb1fa
==========================================

!!! This document is property of KroberDyne corporation. A license is
!!! granted to the purchaser of this system for 1 (one) copy. All
!!! unauthorized copies must be destroyed.

Audience
========

This document is for use of the commander of the operation in which
the KroberDyne terminal is used. A simplified version is avaiable
for the operation personnel.

Introduction
============

The KroberDyne(tm) access terminal provides accesss credentials to
authorized users to be able to interact with KroberDyne(tm) Semi-
Autonomous Unmanned Aerial Vehicles. Its goal is to provide the
sufficient authentication of a pilot to provide it back with the
proper codes to authorize the activation of different sensors
and activators.

The terminal authentication is certified to be used with UAVs
that carry nuclear and biological weapons. Please refer to document
KD-25.8069 for more details.

Usage
=====

The terminal is to be used mostly via the main client, kdauth.

Usage: kdauth

The tool will prompt with the relevant codebook names and will
request a password that matches. On success, it'll provide back the
allowed credentials.

Development
===========

The protocol to communicate with the device is line-based and
follows the basic notations of IETF protocols, for convenience.
Return codes in the 2xx mean no problem, 4xx are authentication-
related, and 5xx non-transient errors.

Commands:
AUTH - requests authentication data
PASS - sends password
LANG - sets protocol language for some messages. Currently only
English ("en") is supported.
HELP - short list of commands.

The following extra commands are available for support purposes.
As their usage is dangerous, the following information is encrypted.
Please contact KroberDyne for key access.

JNVG - gur npprff grezvany vf ol qrsnhyg qrynl-yvzvgrq gb abg
biresybj fybj frevny yvaxf. Guvf cnenzrgre pbagebyf qrynl
va zf. Hfntr erfgevpgrq gb grpuavpvnaf.

QOHT - qhzcf n fcrpvsvp gnoyr va fbsgjner.
HFNTR ERFGEVGRQ GB XEBOREQLAR FRPHEVGL FGNSS BAYL.

All rights reserved, KroberDyne corporation(tm)

(“Kroberdyne” е някаква комбинация от cyberdyne (корпорацията във филмите за Terminator) и крокодил)

“Криптирането” е ROT13 (което мисля, че дори се вижда) и вътре има следното:


WAIT - the access terminal is by default delay-limited to not
overflow slow serial links. This parameter controls delay
in ms. Usage restricted to technicians.


DBUG - dumps a specific table in software.
USAGE RESTRITED TO KROBERDYNE SECURITY STAFF ONLY.

И така, имаме протокол, с който да си говорим с един демон локално, и да се опитаме да вземем някакъв auth code. Като направим telnet localhost 3xxx, получаваме:


$ telnet localhost 3001
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
200-KroberDyne terminal VT18. Unathorized access prohibited.
200 Welcome 001
>

Тук има няколко неща, не всички са задължителни:
– LANG en, и след това HELP ще ви даде един списък от команди (иначе казва, че няма такъв файл);
– WAIT 0 ще махне забавянето при печатане (което е random wait м/у всеки 2 букви и изглежда бая странно);
– AUTH ще ви каже 3 codebook-а, от които да извадите парола;
– DBUG codebook ще ви извади всичките пароли от определения codebook, и
– PASS парола (която се среща и в 3-те codebook-а) ще ви даде код да си получите тениската.

(това с DBUG може да ви се струва невероятно, но е по съвсем истински случай, използван от първия worm в Internet)

Няколко неща може би не бяха ясни – например имаше 30-минутен time limit за всички пробващи се и после им lock-ваше account-а (което май не сработи точно както трябваше), и може би не беше ясно до какво точно трябва да се стигне. Хората, решили задачата са малко, доколкото знам, та явно догодина ще трябва повече подсказки. Портовете бяха филтрирани така, че всеки да може да се връзва само на собствения си, и всъщност имах и идеята да изисквам определен range за source port, но не намерих за краткото време, което имах лесен начин човек да си намества source port-а от telnet, и реших да го прескоча.

Иначе, интерактивен сървър с команди се оказа тривиален за правене, с малко python и един rlinetd да се занимава с TCP-то отпред, може да видите колко е тривиален кода вътре.