Skip to content
This repository has been archived by the owner on Nov 15, 2022. It is now read-only.

Latest commit

 

History

History
82 lines (52 loc) · 5.86 KB

WRITEUP.md

File metadata and controls

82 lines (52 loc) · 5.86 KB

На лечение: постмортем

Вероятно, у вас возникли вопросы, поскольку вы не видели этого таска на борде. Действительно, таск был подготовлен, но не использован.

В ходе развёртывания инфраструктуры соревнований случилось неожиданное — на продакшн-серверах перестала работать авторизация в Telegram. В ходе расследования оказалось, что специально заведённый аккаунт был удалён, а новый с таким же номером не зарегистрировать — сим-карта была забанена навечно. Это всё при том, что пользователь не писал никому, кроме команды разработки и её ботов.

Команда разработки приложила все усилия, уничтожив в глазах Телеграма около десятка различных сим-карт и придумывая различные способы развёртывания таска, однако, как только сервис запускался не на личном компьютере разработчика, аккаунт сразу же блокировался. Более того, блокировка происходила даже при использовании одного и того же SOCKS5-прокси в локальной разработке и в инфраструктуре соревнования.

Окончательно мы сдались лишь в конце первого дня, когда поняли, что вылечить таск будет уже невозможно. Да не очень-то и нужно. Однако, оставляем для всех само задание и райтап к нему.


Write-up

В таске дан сайт. Его автор предлагает ввести имя пользователя в мессенджере Telegram, обещая рассказать истории и флаги. Звучит заманчиво.

Вводим свой юзернейм, но ничего не выходит — ошибка «Я интроверт и с людьми не общаюсь». Если ввести название канала или чата, то сайт сообщает, что такого пользователя не существует. Вспоминаем, что в телеграме есть ещё и боты. С помощью @BotFather регистрируем нового бота и отправляем к нему нашего пациента.

P.S. Не забудьте удалить бота, если он вам не нужен — его юзернейм может ещё кому-нибудь пригодиться.

Нам сообщают, что пациент ушёл общаться с ботом. Но как же посмотреть историю их переписки? Давайте напишем код, который будет отвечать на сообщения и заодно логгировать их. Можно воспользоваться любым инструментом для обработки обновлений Telegram-ботов, мы попробуем библиотеку python-telegram-bot. Немного изменим пример echobot.py:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import logging
import telegram
from telegram.error import NetworkError, Unauthorized
from time import sleep


update_id = None


def main():
    global update_id
    bot = telegram.Bot('TOKEN')

    try:
        update_id = bot.get_updates()[0].update_id
    except IndexError:
        update_id = None

    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    while True:
        try:
            echo(bot)
        except NetworkError:
            sleep(1)
        except Unauthorized:
            update_id += 1


def echo(bot):
    global update_id
    for update in bot.get_updates(offset=update_id, timeout=10):
        update_id = update.update_id + 1

        if update.message:
            logging.info(update.message.text)


if __name__ == '__main__':
    main()

Такой бот будет выводить нам всё, что присылают пользователи. Отправив пациента к боту ещё раз, видим, что он написал /start Hi! How do you do?. Вероятно, он ожидает ответа. Модифицируем бота так, чтобы он отвечал отправленным сообщением:

              logging.info(update.message.text)
+             update.message.reply_text(update.message.text)

По логам видим, что бот и пациент вступили в активную полемику. После сотни сообщений в логах видим флаг, а ещё чуть позже пациент успокаивается и перестаёт писать. Наша работа выполнена успешно.

Альтернативный способ

Был и другой способ решить этот таск: существуют альтернативные Telegram-клиенты, которые позволяют пользоваться ботом так же, как обычным аккаунтом — с интерфейсом и возможностью хранить историю сообщений.

Флаг: ugra_hi_how_do_you_do_e93f8cdc8eba