En liten inledning
Steganografi, om nÄgon har glömt, handlar om att dölja information i olika behÄllare. Till exempel i bilder (diskuterades och ). Man kan ocksÄ dölja data i filsystemets metadata (det skrevs om detta ), och till och med . TyvÀrr har alla dessa metoder en nackdel: för att osynligt "infoga" information i en behÄllare krÀvs smarta algoritmer som tar hÀnsyn till behÄllarens interna struktur. Dessutom uppstÄr problem med behÄllarens motstÄndskraft mot manipuleringar: till exempel, om man redigerar en bild lite, förloras den dolda informationen.
Finns det nÄgot sÀtt att klara sig utan smarta algoritmer och subtila manipulationer av data, och ÀndÄ sÀkerstÀlla att behÄllaren fungerar och att den dolda informationen bevaras pÄ ett acceptabelt sÀtt? För att avslöja i förvÀg, ja, det gÄr! Och jag kommer till och med att föreslÄ ett verktyg.
De blodiga detaljerna om metoden
HuvudidĂ©n Ă€r enkel som en klubba i pannan: det finns omrĂ„den pĂ„ disken dĂ€r operativsystemet aldrig skriver (eller skriver mycket sĂ€llan). För att inte behöva leta efter dessa omrĂ„den med smarta algoritmer, utnyttjar vi redundansen â det vill sĂ€ga vi duplicaerar vĂ„r dolda information mĂ„nga gĂ„nger över alla disksektorer. Sedan kan vi direkt ovanpĂ„ detta skapa nödvĂ€ndiga partitioner, formatera filsystem, skriva filer och installera operativsystem â en del av den hemliga informationen kommer Ă€ndĂ„ att bevaras och kan extraheras, och den upprepade duplikationen hjĂ€lper oss att rekonstruera den ursprungliga helheten frĂ„n bitarna.
Fördelarna med denna metod Àr uppenbara: vi Àr inte beroende av filformat eller ens av typen av filsystem som anvÀnds.
Nackdelarna Àr ocksÄ, tror jag, uppenbara:
- Den hemliga informationen kan endast Àndras genom att helt skriva över hela disken, följt av Äterskapande av det synliga innehÄllet för anvÀndaren. Under detta kan inget program anvÀndas för att Äterskapa disken frÄn en bild: det Äterskapar ocksÄ de tidigare hemliga uppgifterna.
- Ju större volym av hemlig data, desto större Àr risken för förlust av en del av informationen.
- Extraktion av data frÄn disken kan ta mycket tid. FrÄn nÄgra minuter till flera dagar (moderna diskar Àr större).
Nu gÄr vi vidare till detaljerna.
Det Àr uppenbart att om man bara sprider ut hemlig information över hela disken, kommer den bara att döljas frÄn blotta ögat. Om man dÀremot fÄr fram en diskredigerare, kommer datan att framtrÀda i sin fulla prakt. DÀrför vore det bra att kryptera datan, sÄ att den inte syns. Vi kommer att kryptera pÄ ett enkelt men elegant sÀtt: med algoritmen aes256-cbc. Vi frÄgar anvÀndaren om krypteringsnyckeln sÄ att de kan komma pÄ ett bra lösenord.
NÀsta frÄga Àr hur vi ska sÀrskilja de "rÀtta" uppgifterna frÄn de korrupta. HÀr hjÀlper en kontrollsumma, och inte vilken som helst, utan SHA1. Varför inte? För git Àr den tillrÀckligt bra, sÄ den passar oss ocksÄ. Beslutet Àr fattat: vi förser varje sparad informationsfragment med en kontrollsumma, och om den stÀmmer överens efter dekryptering, sÄ har dekrypteringen lyckats.
Vi behöver ocksÄ ett fragmentnummer och den totala lÀngden pÄ den hemliga datan. Fragmentnumret behövs för att hÄlla koll pÄ vilka bitar vi redan har dekrypterat och vilka som ÄterstÄr. Den totala lÀngden kommer vara anvÀndbar nÀr vi behandlar det sista fragmentet, för att inte skriva överflödig data (dvs padding). Och eftersom vi ÀndÄ fÄr en header, lÀgger vi dit namnet pÄ den hemliga filen. Det behövs efter dekrypteringen för att veta vad vi ska öppna den med.
Vi testar metoden i praktiken
För testet tar vi den vanligaste lagringsenheten â ett USB-minne. Jag har en gammal pĂ„ 1 GB, vilket Ă€r helt okej för experiment. Om du, precis som jag, har tĂ€nkt att slippa fysiska lagringsenheter och istĂ€llet testa pĂ„ en fil â en diskavbild, sĂ„ sĂ€ger jag direkt: det kommer inte att fungera. NĂ€r linux formaterar en sĂ„dan "disk" skapas filen pĂ„ nytt och alla oanvĂ€nda sektorer kommer att fyllas med nollor.
TyvĂ€rr fick jag anvĂ€nda en gammal vĂ€derstation pĂ„ en Raspberry Pi 3 som har linux. Minne Ă€r inte sĂ€rskilt gott om, sĂ„ vi kommer inte att gömma stora filer. Vi begrĂ€nsar oss till en maximal storlek pĂ„ 10 megabyte. Alltför smĂ„ filer har ingen mening att gömma heller: verktyget skriver data till disken i kluster om 4 KB. SĂ„ vi begrĂ€nsar oss till en fil pĂ„ 3 KB â den fĂ„r plats i ett sĂ„dant kluster.
Vi kommer att plÄga USB-minnet steg för steg, och kontrollerar efter varje steg om den dolda informationen kan lÀsas:
- Snabb formatering i FAT16-format med en klusterstorlek pÄ 16 kb. Detta Àr vad Windows 7 erbjuder att göra med ett USB-minne utan filsystem.
- Fyllning av USB-minnet med skrÀpuppgifter till 50%.
- Fyllning av USB-minnet med skrÀpuppgifter till 100%.
- âLĂ„ngsamâ formatering i FAT16-format (med överskrivning av allt).
De första tvÄ testerna slutade förvÀntat med fullstÀndig framgÄng: verktyget lyckades framgÄngsrikt ÄterstÀlla 10 megabyte hemliga data frÄn USB-minnet. Men nÀr USB-minnet fylldes med filer till brÀdden, intrÀffade ett fel:
Totala kluster lÀsta: 250752, avkodade: 158
FEL: kan inte skriva ofullstÀndig secretFile
Som vi ser lyckades vi bara Ă„terstĂ€lla 158 kluster (632 kilobyte rĂ„data, vilket ger 636424 byte nyttolast). Det Ă€r uppenbart att 10 megabyte hĂ€r inte kommer att samlas, och bland dessa kluster finns det tydligt dubbletter. Ăven 1 megabyte kan pĂ„ detta sĂ€tt redan inte Ă„terstĂ€llas. Men vi kan garantera att 3 kilobyte hemlig data kommer att Ă„terstĂ€llas frĂ„n USB-minnet Ă€ven efter att det har formaterats och skrivits full. Experiement visar dock att det Ă€r möjligt att extrahera en fil pĂ„ 120 kilobyte frĂ„n ett sĂ„dant USB-minne.
TyvÀrr visade det sista testet att USB-minnet hade skrivits över helt:
$ sudo .\/steganodisk -p password \/dev\/sda
Enhetens storlek: 250752 kluster
250700 99%
Totala kluster lÀsta: 250752, dekrypterade: 0
FEL: kan inte skriva ofullstÀndig secretFile
Inga kluster har sparats⊠TrÄkigt, men inte tragiskt! LÄt oss försöka skapa en partition pÄ USB-minnet innan formateringen, och sedan skapa ett filsystem i den. För övrigt kom den frÄn fabriken med just en sÄdan formatering, sÄ vi gör inget misstÀnkt.
Det Àr ganska förvÀntat att det tillgÀngliga utrymmet pÄ USB-minnet har minskat nÄgot.
Det Àr ocksÄ ganska förvÀntat att 10 megabyte inte kunde döljas pÄ en helt fylld disk. Men nu har antalet framgÄngsrikt dekrypterade kluster ökat mer Àn dubbelt!
Totalt lÀsta kluster: 250752, dekrypterade: 405
TyvÀrr kan vi inte samla megabyte frÄn bitar, men 200 kilobyte fungerar utan problem.
Och sÄ nyheten om den senaste, fjÀrde kontrollen, denna gÄng Àr glad: fullstÀndig formatering av ett sÄdant USB-minne ledde inte till att all information förstördes! 120 kilobyte hemlig data fick plats i det oanvÀnda utrymmet.
Sammanfattande tabell för testningen:

Lite teoretiserande: om ledigt utrymme och oanvÀnda sektorer
Om du nĂ„gonsin har partitionerat en hĂ„rddisk, har du kanske mĂ€rkt att det inte alltid Ă€r möjligt att utnyttja allt ledigt utrymme pĂ„ disken. Den första partitionen börjar alltid med en viss fördröjning (vanligen 1 megabyte eller 2048 sektorer). Ăven bakom den sista partitionen kan det ibland finnas en liten "svans" av oanvĂ€nda sektorer. Dessutom kan det sĂ€llan finnas mellanrum mellan partitionerna.
Med andra ord, pÄ disken finns det sektorer som inte Àr tillgÀngliga vid normalt arbete med disken, men data kan faktiskt skrivas till dessa sektorer! Och det betyder att man ocksÄ kan lÀsa dem. Med hÀnsyn till att det ocksÄ finns en partitionstabell och en bootkod, som just ligger i det tomma omrÄdet i början av disken.
LÄt oss avbryta partitionerna ett tag och titta pÄ disken frÄn ett fÄgelperspektiv. HÀr har vi en tom partition pÄ disken. LÄt oss skapa ett filsystem i den. Kan vi sÀga att nÄgra sektorer pÄ disken har förblivit oskrivna?
Och â trumvirvel! Svaret kommer nĂ€stan alltid att vara â ja! I de flesta fall handlar skapandet av ett filsystem om att endast nĂ„gra block med metadata skrivs till disken, medan resten av innehĂ„llet i partitionen förblir oförĂ€ndrat.
Och dessutom â rent empiriskt â kan man anta att filsystemet inte alltid kan fylla hela det avsedda utrymmet fram till den sista sektorn. Till exempel kan ett FAT16-filsystem med en klusterstorlek pĂ„ 64 kilobyte uppenbarligen inte helt fylla en partition vars storlek inte Ă€r ett multipel av 64 kilobyte. I slutet av en sĂ„dan partition mĂ„ste det finnas en "svans" av flera sektorer som inte Ă€r tillgĂ€ngliga för att lagra anvĂ€ndardata. Ăven om detta antagande inte kunde bekrĂ€ftas experimentellt.
SĂ„ för att maximera det utrymme som Ă€r tillgĂ€ngligt för steganografi, behöver man anvĂ€nda ett filsystem med en större klusterstorlek. Man kan ocksĂ„ skapa en partition, Ă€ven om det inte Ă€r nödvĂ€ndigt (till exempel pĂ„ ett USB-minne). Det Ă€r inte nödvĂ€ndigt att skapa tomma partitioner eller lĂ€mna oanvĂ€nda omrĂ„den â det kan vĂ€cka intresse hos nyfikna personer.
Verktyget för experiment
KĂ€llkoden till verktyget kan inspekteras
För att bygga krĂ€vs Qt version 5.0 eller högre och OpenSSL. Om nĂ„got inte kan byggas â kan det hĂ€nda att du behöver justera filen steganodisk.pro.
Det gÄr att Àndra storleken pÄ klustret frÄn 4 Kb till, sÀg, 512 byte (i secretfile.h). Kostnaderna för administrationsinformation kommer att öka: headern och kontrollsumman tar upp en fast mÀngd pÄ 68 byte.
Verktyget mÄste sjÀlvklart köras med root-anvÀndarrÀttigheter, och med försiktighet. Det kommer inte att stÀllas nÄgra frÄgor innan den angivna filen eller enheten skrivs över!
Njut.
KĂ€lla: habr.com
