Cum sa scapi de securitatea din NTFS
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.