Een korte inleiding
Steganografie, als iemand het niet meer weet, is het verbergen van informatie in bepaalde containers. Bijvoorbeeld, in afbeeldingen (dit is besproken en ). Je kunt ook gegevens verbergen in de metadata van bestandssystemen (hier is eerder over geschreven ), en zelfs . Helaas hebben al deze methoden ƩƩn nadeel: om onopvallend informatie in een container āin te voegenā, zijn slimme algoritmes nodig die rekening houden met de interne structuur van de container. En ook zijn er problemen met de weerstand van de container tegen manipulaties: bijvoorbeeld, als je een afbeelding een klein beetje bewerkt, gaat de verborgen informatie verloren.
Is het mogelijk om zonder slimme algoritmes en delicate manipulaties met gegevens toe te komen, terwijl we toch de functionaliteit van de container en een acceptabel niveau van de veiligheid van verborgen gegevens kunnen waarborgen? Om vooruit te lopen op de zaak: ja, dat kan! En ik zal zelfs een tool aanbieden.
Bloederige details van de methode
Het basisidee is eenvoudig, als een klap met een knuppel op het voorhoofd: op de schijf zijn er gebieden waar het besturingssysteem nooit naar schrijft (of in zeldzame gevallen). Om deze gebieden niet met slimme algoritmes te hoeven zoeken, maken we gebruik van redundanties ā dat wil zeggen, we dupliceren onze verborgen informatie talloze keren over alle schijven. Vervolgens kunnen we bovenop deze pracht de benodigde partities aanmaken, bestandssystemen formatteren, bestanden schrijven en besturingssystemen installeren ā een deel van de geheime gegevens blijft bewaard en kan worden hersteld, en de meervoudige duplicatie helpt ons de delen samen te voegen tot een geheel.
Het voordeel van deze methode is duidelijk: we zijn niet afhankelijk van het bestandsformaat of zelfs van het type bestandssysteem dat wordt gebruikt.
De nadelen zijn ook, denk ik, duidelijk:
- Geheime gegevens kunnen alleen worden gewijzigd door de volledige schijf opnieuw te schrijven, met daarna het opnieuw creƫren van de voor de gebruiker zichtbare inhoud. Daarbij mag er geen software worden gebruikt die de schijf uit een schijfbeeld herstelt: deze zal ook de vorige geheime gegevens herstellen.
- Hoe groter de hoeveelheid geheime gegevens, hoe groter de kans op verlies van een deel van de informatie.
- Het extraheren van gegevens van de schijf kan veel tijd kosten. Van enkele minuten tot enkele dagen (moderne schijven zijn groter).
Laten we nu over de details verder praten.
Het is duidelijk dat als je gewoon geheime gegevens over de schijf verspreidt, ze alleen voor het blote oog verborgen zijn. Wanneer je echter een disk editor gebruikt, zullen de gegevens in al hun glorie verschijnen. Daarom is het beter om de gegevens te versleutelen, zodat ze niet opvallen. We versleutelen eenvoudig maar stijlvol: met het aes256-cbc algoritme. We vragen de versleutelingssleutel aan de gebruiker, zodat hij een goed wachtwoord bedenkt.
De volgende vraag is hoe we 'goede' gegevens van beschadigde kunnen onderscheiden. Hiervoor helpt een controlegetal, maar niet zomaar een, het moet SHA1 zijn. Waarom niet? Voor git is het goed genoeg, dus het zal ook voor ons werken. Besloten: we voorzien elk opgeslagen gegevensfragment van een controlegetal, en als deze overeenkomt na het ontsleutelen, is de ontsleuteling geslaagd.
We hebben ook een fragmentnummer en de totale lengte van de geheime gegevens nodig. Het fragmentnummer is om bij te houden welke stukjes we al hebben ontsleuteld en welke nog over zijn. De totale lengte is nuttig bij het verwerken van het laatste fragment, zodat we geen overbodige gegevens schrijven (oftewel padding). En aangezien we toch een koptekst gaan maken, voegen we daar de naam van het geheime bestand aan toe. Dit is handig na het ontsleutelen, zodat we niet hoeven te gissen hoe we het moeten openen.
We testen de methode in de praktijk.
Voor de test gebruiken we het meest voorkomende opslagmedium: een USB-stick. Ik heb een oude van 1 GB die prima geschikt is voor experimenten. Als jij, net als ik, dacht dat het handig zou zijn om niet met fysieke opslagmedia te worstelen maar het met een bestand - een schijfimage - te testen, moet ik je meteen teleurstellen: dat gaat niet werken. Bij het formatteren van zo'n 'schijf' creƫert Linux het bestand opnieuw en worden alle ongebruikte sectoren met nullen gevuld.
Als Linux-machine moest ik helaas gebruikmaken van een weerstation met een Raspberry Pi 3 dat op het balkon lag. De opslagcapaciteit is daar niet groot, dus we zullen geen grote bestanden verbergen. We beperken ons tot een maximale grootte van 10 megabyte. Te kleine bestanden verbergen ook weinig zin: de tool schrijft gegevens in clusters van 4 KB naar de schijf. Daarom beperken we ons aan een bestand van 3 KB - dat past in zo'n cluster.
We zullen de USB-stick stapsgewijs mishandelen en na elke stap controleren of de verborgen informatie leesbaar is:
- Snelle formattering in FAT16-formaat met een cluster grootte van 16 kB. Dit is wat Windows 7 aanbiedt voor een USB-stick zonder bestandssysteem.
- De USB-stick vullen met onzin tot 50%.
- De USB-stick vullen met onzin tot 100%.
- āLangdurigeā formattering in FAT16-formaat (met overschrijving van alles).
De eerste twee tests eindigden zoals verwacht in een volledige overwinning: het hulpprogramma kon met succes 10 megabyte geheime gegevens van de USB-stick extraheren. Maar nadat de stick volgepompt was met bestanden, trad er een fout op:
Totaal gelezen clusters: 250752, ontsleuteld: 158
FOUT: kan onvolledige secretFile niet schrijven
Zoals we zien, konden we slechts 158 clusters (632 kilobyte ruwe gegevens, wat 636424 byte nuttige belasting oplevert) succesvol ontcijferen. Het is duidelijk dat we hier niet aan 10 megabyte komen, en er zijn ongetwijfeld duplicaten tussen deze clusters. Zelfs 1 megabyte kun je op deze manier al niet meer herstellen. Maar we kunnen garanderen dat we 3 kilobyte geheime gegevens van de USB-stick kunnen herstellen, zelfs nadat deze is geformatteerd en volgepropt. Onderzoeken tonen echter aan dat het mogelijk is om een bestand van 120 kilobyte van zoān USB-stick te extraheren.
De laatste test toonde helaas aan dat de USB-stick volledig overschreven is:
$ sudo . /steganodisk -p wachtwoord /dev/sda
Apparaatgrootte: 250752 clusters
250700 99%
Totaal gelezen clusters: 250752, het aantal ontsleuteld: 0
FOUT: kan onvolledige secretFile niet schrijven
Geen enkel cluster is overgebleven⦠Treurig, maar niet tragisch! Laten we proberen een partitie op de USB-stick te creëren vóór het formatteren, en daarin een bestandssysteem te maken. Overigens kwam hij uit de fabriek met precies zo'n formattering, dus we doen niets verdachts.
Het was te verwachten dat de beschikbare ruimte op de USB-stick iets was verminderd.
Het is ook te verwachten dat we 10 megabyte niet verborgen hebben kunnen houden op een volledig volgeschreven schijf. Maar nu is het aantal succesvol ontcijferde clusters meer dan verdubbeld!
Totaal clusters gelezen: 250752, ontcijferd: 405
Megabyte kunnen helaas niet uit stukjes worden verzameld, maar 200 kilobyte is geen probleem.
En dan het nieuws over de laatste, 4e test, dit keer een blije: een volledige formattering van zoān USB-stick heeft niet geleid tot de vernietiging van alle informatie! 120 kilobyte geheime gegevens pasten prachtig in de onbenutte ruimte.
Samenvattende tabel van de tests:

Een beetje theoretiseren: over vrije ruimte en ongebruikte sectoren
Als je ooit een harde schijf in partities hebt verdeeld, heb je misschien opgemerkt dat het niet altijd lukt om alle vrije ruimte op de schijf toe te wijzen. De eerste partitie begint altijd met een bepaalde offset (meestal 1 megabyte, of 2048 sectoren). Soms blijft er ook een kleine "staart" van ongebruikte sectoren achter na de laatste partitie. Ook tussen de partities blijven er soms ruimtes over, hoewel dit zeldzaam is.
Met andere woorden, op de schijf zijn er sectoren waartoe geen toegang is bij normaal gebruik van de schijf, maar gegevens kunnen wel in deze sectoren worden geschreven! En dat betekent dat ze ook gelezen kunnen worden. Dit is met uitzondering van de partitietabel en de opstartcode, die zich juist in het lege gebied aan het begin van de schijf bevinden.
Laten we even afleiden van de partities en de schijf van een afstand bekijken, als het ware vanuit de lucht. Stel je voor dat we een lege partitie op de schijf hebben. Laten we er een bestandssysteem in creƫren. Kunnen we zeggen dat bepaalde sectoren op de schijf ongebruikt zijn gebleven?
En-e-en ā tromgeroffel! Het antwoord is bijna altijd ā ja! In de meeste gevallen komt het aanmaken van een bestandssysteem erop neer dat er slechts enkele blokken met systeeminformatie op de schijf worden geschreven, en in de rest van de inhoud van de partitie verandert niets.
Bovendien kan men ā puur empirisch ā aannemen dat een bestandssysteem niet altijd al het toegewezen ruimte zal vullen tot de laatste sector. Bijvoorbeeld, een FAT16 bestandssysteem met een cluster-grootte van 64 kilobyte kan duidelijk niet volledig een partitie vullen waarvan de grootte geen veelvoud van 64 kilobyte is. Aan het einde van zo'n partitie moet er een "staart" van enkele sectoren overblijven die niet beschikbaar zijn voor het opslaan van gebruikersdata. Dit vermoeden kon echter niet experimenteel worden bevestigd.
Dus, om de beschikbare ruimte voor de steganogram maximaliseren, moet je een bestandssysteem gebruiken met een grotere cluster-grootte. Je kunt ook een partitie aanmaken, zelfs als dat niet nodig is (bijvoorbeeld op een USB-stick). Het is niet nodig om lege partities te creĆ«ren of niet-toegewezen gebieden achter te laten ā dit zal de aandacht van geĆÆnteresseerden trekken.
Hulpprogramma voor experimenten
De bron van het hulpprogramma kan worden bekeken
Voor de bouw is Qt versie 5.0 of hoger en OpenSSL vereist. Als iets niet compliceert ā moet je mogelijk het bestand steganodisk.pro aanpassen.
Je kunt de clustergrootte veranderen van 4 KB naar bijvoorbeeld 512 bytes (in secretfile.h). Hierdoor zullen de kosten voor metadata toenemen: de header en checksum nemen een vaste 68 bytes in beslag.
Je moet de tool natuurlijk met root-gebruikersrechten uitvoeren, en wel met voorzichtigheid. Er zullen geen vragen worden gesteld voordat het opgegeven bestand of apparaat wordt overschreven!
Geniet ervan.
Bron: habr.com
