Cum sa scapi de securitatea din NTFS

Published 14 ianuarie 09 11:11 | Bogdan si Razvan Hobeanu 

Aveam nevoie zilele trecute sa copiem fisiere de pe un hard-disk mai vechi formatat cu NTFS care avea permisiile de securitate foarte restrictive. Era vorba de mii de fisiere si ar fi durat foarte mult ca sa aplic metoda clasica in acest caz: take ownership. Imaginati-va ce inseamna pentru sistem sa modifice pe rand permisiile a mii de fisiere. Problema era ca aveam nevoie rapid de datele respective.

Solutia a venit de la o metoda (pe care am descoperit-o acum ceva timp) de pacalire a securitatii din NTFS. Ideea de baza a aparut citind MSDN-ul, mai specific aceasta precizare referitoare la parametrul dwDesiredAccess al functiei CreateFile:

"If this parameter is zero, the application can query certain metadata such as file, directory, or device attributes without accessing that file or device, even if GENERIC_READ access would have been denied." 

Ceea ce a iesit in final este un driver-filtru peste sistemul de fisiere care intermediaza deschiderea fisierului printr-o discutie de genul:

Aplicatie: Vreau drepturi de scriere pentru fisierul restrictionat.doc. Ce spui?

Driver-ul nostru catre sistemul de fisiere: Aplicatia vrea drepturi de scriere pentru fisierul restrictionat.doc

Sistemul de fisiere catre driver-ul nostru: Permisiile de securitate setate pe fisierul respectiv nu-mi permit sa fac acest lucru. Raspunsul este NU.

Driver-ul nostru catre sistemul de fisiere: Aplicatia vrea zero drepturi (dwDesiredAccess = 0) pentru fisierul restrictionat.doc

Sistemul de fisiere catre driver-ul nostru: Ok. Pot permite acest lucru. Raspunsul este DA.

Driver-ul nostru catre aplicatie: Sistemul de fisiere a spus DA.

Astfel pacalim sistemul de fisiere sa ne dea ok-ul pentru o anumita cerere, punand intrebarea la care stim ca sistemul de fisiere va raspunde intotdeauna DA. Deoarece sistemul de fisiere raspunde cu DA, sistemul de operare permite deschiderea handle-ului catre fisierul restrictionat.

In mod intuitiv ati putea crede ca handle-ul deschis are zero drepturi de acces, deci este inutil. Totusi sistemul de operare va crea un handle cu drepturile cerute initial de aplicatie. Folosind aceasta metoda puteti accesa orice fisier, indiferent de permisiile de securitate setate pentru el. Partea si mai frumoasa este ca tot codul din driver care implementeaza aceasta metoda are doar 3 linii. Nu este vorba de hook-uri complicate sau functii nedocumentate. Totul se realizeaza cu API-uri documentate.

Pentru a vedea o demonstratie despre cum lucreaza driver-ul respectiv si mai multe detalii tehnice, puteti accesa post-ul in limba engleza ce contine un video si un document PDF:

http://www.hobeanu.com/blog/bypassing-file-system-security-in-windows/

Aceasta metoda nu este considerata o gaura de securitate deoarece necesita incarcarea unui driver. In momentul in care un atacator are drepturi de a executa cod in kernel mode, sistemul este considerat compromis.

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

# Adi Oltean said on ianuarie 15, 2009 00:33:

Salut,

Nu e nevoie de un driver pentru asta - ce trebuie sa faci (din user mode) este:

1) Rulezi procesul ca administrator sau backup operator.

2) Enablezi privilegiul de "Backup" pe procesul tau

3) Deschizi fisierele cu CreateFile, cu flag-ul FILE_FLAG_BACKUP_SEMANTICS

De fapt, toate aplicatiile de backup (care nu ruleaza ca administrator) folosesc aceasta metoda ca sa acceseze continutul tuturor fisierelor, chiar daca acestea sunt protejate cu "strong ACLs" care nu permit accesul nimanui.

Adi

# Bogdan si Razvan Hobeanu said on ianuarie 16, 2009 22:23:

Salut Adi,

Ai dreptate, daca ai nevoie doar de citire, poti folosi FILE_FLAG_BACKUP_SEMANTICS in colaborare cu privilegiul de backup pe aplicatia ta.

Totusi, in cazul copierii multor fisiere despre care vorbeam, imi era imposibil sa modific codul aplicatiei care facea copierea (explorer, total commander) pentru a putea adauga flag-ul necesar la apelul lui CreateFile.

Mai mult, FILE_FLAG_BACKUP_SEMANTICS permite doar citirea unui fisier (nu si scrierea sau alte operatii) si acest lucru este posibil numai in cazul in care fisierul nu a fost deschis exclusiv.

Metoda prezentata in articol nu are niciunul din neajunsurile metodei “FILE_FLAG_BACKUP_SEMANTICS” si in plus permite scrierea (inclusiv in fisierele executabile ale aplicatiilor care ruleaza in acel moment).

In concluzie, metoda sugerata de tine este cea pe care o recomandam si noi in cazul in care poti sa modifici codul aplicatiei.

In cazul in care vrei doar sa ai acces la fisiere si nu poti modifica sursa aplicatiei (ex: file manager-ul preferat), poti folosi metoda prezentata in articol.

# Andrei said on ianuarie 17, 2009 22:19:

Sau dai copy/paste pe un drive formatat FAT32 ; dispar toate restrictiile.

# Bogdan si Razvan Hobeanu said on ianuarie 17, 2009 23:54:

Dai copy/paste presupunand ca ai la ce sa dai copy, nu? :) In cazul in care nu poti accesa fisierele pentru citire, nu o sa mearga nici copy/paste, nu? :)

Leave a Comment

(required) 
(optional)
(required) 

  
Enter Code Here: Required