Szteganográfia fájlok szerint: az adatok közvetlenül a szektorokban való elrejtése

Egy kis előszó

A szteganográfia, ha valaki nem emlékszik, információkat rejteget egyes tárolókban. Például képekben (megbeszélve itt и itt). Az adatokat a fájlrendszer szolgáltatási tábláiban is elrejtheti (erről írtunk itt), sőt még TCP protokoll szolgáltatáscsomagokban. Sajnos ezeknek a módszereknek van egy hátránya: ahhoz, hogy észrevétlenül „beszúrhassuk” az információkat egy tárolóba, olyan ravasz algoritmusokra van szükség, amelyek figyelembe veszik a tároló belső szerkezetének sajátosságait. Problémák merülnek fel a konténer manipulációval szembeni ellenállásával: például, ha kissé szerkeszti a képet, a rejtett információk elvesznek.

Megoldható-e valahogy a ravasz algoritmusok és az adatokkal kapcsolatos finom manipulációk nélkül, és továbbra is biztosítható a tároló funkcionalitása és a rejtett adatok elfogadható szintű biztonsága? Előre tekintve azt mondom - igen, megteheti! Még egy segédprogramot is ajánlok.

A módszer véres részletei

Az alapötlet olyan egyszerű, mint egy ütés a homlokon: vannak olyan területek a lemezen, amelyekre az operációs rendszer soha nem ír (vagy csak ritkán ír). Annak érdekében, hogy ne kelljen ravasz algoritmusokkal keresni ezeket a területeket, redundanciát fogunk használni - vagyis sokszor-sokszor megkettőzzük rejtett információinkat a lemez összes szektorában. Ezután a pompa tetején létrehozhatja a szükséges partíciókat, formázhatja a fájlrendszereket, írhat fájlokat és telepítheti az operációs rendszereket - mindazonáltal a titkos adatok egy része mentésre kerül és visszakereshető, és az ismételt duplikáció segít nekünk rakd össze a darabokból az eredeti egészet.

Ennek a módszernek az előnye nyilvánvaló: nem függünk a fájlformátumtól, de még csak a használt fájlrendszer típusától sem.

A hátrányok is nyilvánvalóak szerintem:

  • A titkos adatok csak a teljes lemez teljes átírásával módosíthatók, majd a felhasználó számára látható tartalom újra létrehozásával. Nem használhat azonban olyan szoftvert, amely képből hozza létre újra a lemezt: a korábbi titkos adatokat is újra létrehozza.
  • Minél nagyobb a titkos adatok mennyisége, annál nagyobb a valószínűsége annak, hogy bizonyos információkat elveszítenek.
  • Az adatok lekérése a lemezről sokáig tarthat. Néhány perctől több napig (a modern lemezek nagyok).

Most térjünk át a konkrétumokra.

Nyilvánvaló, hogy ha egyszerűen elkenjük a titkos adatokat az egész lemezen, akkor azok csak szabad szem elől lesznek elrejtve. Ha felszereli a tekintetét mondjuk egy lemezszerkesztővel, akkor az adatok teljes pompájában megjelennek. Ezért célszerű lenne titkosítani az adatokat, hogy ne jelenjenek meg. Egyszerűen, de ízlésesen titkosítjuk: az aes256-cbc algoritmussal. Elkérjük a felhasználótól a titkosítási kulcsot, és hagyjuk, hogy kitaláljon egy jó jelszót.

A következő kérdés az, hogyan különböztethetjük meg a „jó” adatokat a rossz adatoktól. Itt egy ellenőrző összeg segít, de nem egy egyszerű, hanem az SHA1. És akkor? Git-nek elég jó, így nekünk is bejön. Döntött: minden tárolt információt ellenőrző összeggel látunk el, és ha a visszafejtés után megegyezik, az azt jelenti, hogy a visszafejtés sikeres volt.

Szüksége lesz a töredékszámra és a titkos adatok teljes hosszára is. A töredékszám annak nyomon követésére szolgál, hogy mely darabokat már megfejtettük, és melyek maradtak meg. A teljes hossz hasznos lesz számunkra az utolsó töredék feldolgozásakor, hogy ne írjunk felesleges adatokat (vagyis kitöltést). Nos, mivel még mindig van fejlécünk, oda adjuk hozzá a titkos fájl nevét. A visszafejtés után hasznos lesz, hogy ne találgassa meg, hogyan kell megnyitni.

A módszer tesztelése a gyakorlatban

Az ellenőrzéshez vegyük a leggyakoribb adathordozót - egy flash meghajtót. Találtam egy régit, 1 GB-os kapacitással, ami teljesen alkalmas kísérletezésre. Ha Ön, mint én, az a gondolata támadt, hogy ne foglalkozzon a fizikai adathordozókkal, hanem tesztelje azt egy fájlon - egy lemezképen, akkor azonnal azt mondom: ez nem fog működni. Egy ilyen „lemez” formázásakor a Linux újra létrehozza a fájlt, és minden nem használt szektor nullákkal lesz kitöltve.

Linuxos gépként sajnos az erkélyen heverő Raspberry Pi 3-on időjárás állomást kellett használnom, nem sok a memória, így nem fogunk nagy fájlokat elrejteni. Maximum 10 megabájtos méretre korlátozzuk magunkat. A túl kicsi fájlok elrejtésének sincs értelme: a segédprogram 4 KB-os fürtökben írja ki az adatokat a lemezre. Ezért az alábbiakban egy 3 kb-os fájlra korlátozzuk magunkat - ez egy ilyen klaszterbe illeszkedik.

A flash meghajtót szakaszosan csúfoljuk, minden szakasz után ellenőrizzük, hogy a rejtett információ olvasható-e:

  1. Gyors formázás FAT16 formátumban 16 KB-os fürtmérettel. Ezt kínálja a Windows 7 olyan flash meghajtóval, amely nem rendelkezik fájlrendszerrel.
  2. A flash meghajtó 50%-os megtöltése mindenféle szeméttel.
  3. A flash meghajtó 100%-os megtöltése mindenféle szeméttel.
  4. „Hosszú” formázás FAT16 formátumban (mindent felülír).

Az első két teszt a várakozásoknak megfelelően teljes győzelemmel zárult: a segédprogram 10 megabájtnyi titkos adatot tudott sikeresen kinyerni a pendrive-ról. De miután a flash meghajtó tele volt fájlokkal, hiba történt:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Amint látható, csak 158 klasztert sikerült visszafejteni (632 kilobájt nyers adat, ami 636424 10 bájt hasznos terhelést ad). Nyilvánvaló, hogy itt nem lehet 1 megabájtot szerezni, de ezek között a klaszterek között egyértelműen duplikációk vannak. Még 3 megabájtot sem lehet így visszaszerezni. De garantálhatjuk, hogy 120 kilobájt titkos adatot visszaállítunk egy pendrive-ról a formázás és a kapacitásra írás után is. A kísérletek azonban azt mutatják, hogy egy ilyen flash meghajtóról XNUMX kilobájt hosszú fájlt lehet kivonni.

Az utolsó teszt sajnos azt mutatta, hogy a teljes flash meghajtót felülírták:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Egyetlen klaszter sem maradt fenn... Szomorú, de nem tragikus! A formázás előtt próbáljunk meg partíciót létrehozni a flash meghajtón, és már benne egy fájlrendszert. Egyébként pontosan ilyen formázással érkezett gyárilag, szóval nem csinálunk semmi gyanúsat.
Várhatóan kissé csökkent a flash meghajtón rendelkezésre álló hely.

Az is nagyon várható, hogy 10 megabájtot nem lehetett elrejteni egy teljesen megtelt lemezen. Most azonban a sikeresen visszafejtett fürtök száma több mint kétszeresére nőtt!

Total clusters read: 250752, decrypted: 405

Sajnos nem lehet darabokból egy megabájtot összerakni, de kétszáz kilobájt egyszerű.

Nos, az utolsó, 4. ellenőrzésről szóló hír ezúttal örömteli: egy ilyen flash meghajtó teljes formázása nem vezetett minden információ megsemmisüléséhez! 120 kilobájtnyi titkos adat tökéletesen elfér a kihasználatlan térben.

Teszt összefoglaló táblázat:

Szteganográfia fájlok szerint: az adatok közvetlenül a szektorokban való elrejtése

Egy kis elméletalkotás: a szabad helyről és a kihasználatlan szektorokról

Ha valaha is partíciókra osztotta merevlemezét, akkor észrevehette, hogy nem mindig lehetséges a lemezen lévő összes szabad terület lefoglalása. Az első szakasz mindig némi behúzással kezdődik (általában 1 megabájt vagy 2048 szektor). Az utolsó rész mögött az is előfordul, hogy marad egy kis „farka” a kihasználatlan szektoroknak. És néha vannak rések a szakaszok között, bár ritkán.

Vagyis a lemezen vannak olyan szektorok, amelyek a lemezzel való normál munka során nem érhetők el, de ezekbe a szektorokba adatokat lehet írni! És ez azt is jelenti, hogy olvassa el. Kiigazítva, hogy van egy partíciós tábla és egy rendszerbetöltő kód is, amelyek a lemez elején található üres területen találhatók.

Szüntessük meg egy kicsit a szakaszokat, és úgymond madártávlatból nézzük meg a korongot. Itt van egy üres partíció a lemezen. Hozzunk létre benne egy fájlrendszert. Mondhatjuk-e, hogy a lemez egyes szektorai törletlenül maradnak?

E-e-e - dobpergés! A válasz szinte mindig igen lesz! Valójában a legtöbb esetben a fájlrendszer létrehozása annyi, hogy csak néhány szolgáltatási blokkot írunk a lemezre, különben a partíció tartalma nem változik.

És azt is - tisztán empirikusan - feltételezhetjük, hogy a fájlrendszer nem mindig tudja elfoglalni a számára kijelölt helyet az utolsó szektorig. Például egy 16 kilobájt méretű FAT64 fájlrendszer nyilvánvalóan nem tud teljesen elfoglalni egy olyan partíciót, amelynek mérete nem többszöröse a 64 kilobájtnak. Egy ilyen szakasz végén több szektorból álló „faroknak” kell lennie, amelyek nem érhetők el a felhasználói adatok tárolására. Ezt a feltételezést azonban kísérletileg nem sikerült megerősíteni.

Tehát a steganogram számára rendelkezésre álló hely maximalizálása érdekében nagyobb fürtmérettel rendelkező fájlrendszert kell használnia. Partíciót is létrehozhat, még akkor is, ha ez nem szükséges (például flash meghajtón). Nem kell üres szakaszokat létrehozni vagy kiosztatlan területeket hagyni - ez felkelti az érdeklődő polgárok figyelmét.

Segédprogram kísérletekhez

Megérintheti a segédprogram forráskódját itt

Az építéshez Qt 5.0-s vagy újabb verzióra és OpenSSL-re lesz szüksége. Ha valami nem működik, lehet, hogy szerkesztenie kell a steganodisk.pro fájlt.

Módosíthatja a fürt méretét 4 KB-ról mondjuk 512 bájtra (a secretfile.h fájlban). Ezzel párhuzamosan a szolgáltatási információk költsége is megnő: a fejléc és az ellenőrző összeg fix 68 bájtot foglal el.

A segédprogramot természetesen root felhasználói jogokkal kell futtatni, és óvatosan. A megadott fájl vagy eszköz felülírása előtt nem lesz kérdés!

Élvezd.

Forrás: will.com

Hozzászólás