File masa lalu steganografi: menyembunyikan data secara langsung di sektor

Kata pengantar kecil

Steganografi, jika ada yang tidak ingat, menyembunyikan informasi di beberapa wadah. Misalnya dalam gambar (dibahas di sini и di sini). Anda juga dapat menyembunyikan data di tabel layanan sistem file (ini telah ditulis di sini), dan bahkan dalam paket layanan protokol TCP. Sayangnya, semua metode ini memiliki satu kelemahan: untuk “memasukkan” informasi ke dalam wadah secara diam-diam, Anda memerlukan algoritme licik yang mempertimbangkan kekhasan struktur internal wadah. Dan masalah muncul dengan resistensi wadah terhadap manipulasi: misalnya, jika Anda mengedit sedikit gambar, informasi tersembunyi akan hilang.

Apakah mungkin untuk melakukannya tanpa algoritma yang licik dan manipulasi data yang halus, dan tetap memastikan fungsionalitas wadah dan tingkat keamanan data tersembunyi yang dapat diterima? Ke depan, saya akan mengatakan - ya, Anda bisa! Saya bahkan akan menawarkan Anda sebuah utilitas.

Detail metodenya

Ide dasarnya sesederhana pukulan ke dahi: ada area pada disk yang tidak pernah ditulis oleh sistem operasi (atau jarang ditulis). Untuk menghindari kebutuhan untuk mencari area ini menggunakan algoritma yang licik, kami akan menggunakan redundansi - yaitu, kami akan menggandakan informasi tersembunyi kami berkali-kali di semua sektor disk. Kemudian, tepat di atas semua kemegahan ini, Anda dapat membuat partisi yang diperlukan, memformat sistem file, menulis file, dan menginstal OS - tetap saja, sebagian dari data rahasia akan disimpan dan dapat diambil, dan duplikasi berulang akan membantu kami satukan keseluruhan yang asli dari potongan-potongannya.

Keuntungan metode ini jelas: kita tidak bergantung pada format file, atau bahkan jenis sistem file yang digunakan.

Kerugiannya juga, menurut saya, jelas:

  • Data rahasia hanya dapat diubah dengan menulis ulang seluruh disk sepenuhnya, diikuti dengan membuat ulang konten yang terlihat oleh pengguna. Namun, Anda tidak dapat menggunakan perangkat lunak yang membuat ulang disk dari suatu image: perangkat lunak tersebut juga akan membuat ulang data rahasia sebelumnya.
  • Semakin besar volume data rahasia, semakin besar kemungkinan hilangnya beberapa informasi.
  • Mengambil data dari disk bisa memakan waktu lama. Dari beberapa menit hingga beberapa hari (disk modern berukuran besar).

Sekarang mari kita beralih ke spesifiknya.

Jelas bahwa jika Anda hanya menyebarkan data rahasia ke seluruh disk, itu hanya akan disembunyikan dari mata telanjang. Jika Anda melengkapi pandangan Anda dengan, katakanlah, editor disk, data akan muncul dengan segala kemegahannya. Oleh karena itu, sebaiknya data dienkripsi agar tidak muncul. Kami akan mengenkripsi secara sederhana, namun penuh selera: menggunakan algoritma aes256-cbc. Kami akan meminta kunci enkripsi kepada pengguna dan membiarkannya memberikan kata sandi yang baik.

Pertanyaan selanjutnya adalah bagaimana kita membedakan data yang “baik” dan data yang buruk. Di sini checksum akan membantu kita, tapi bukan yang sederhana, tapi SHA1. Dan apa? Ini cukup bagus untuk git, jadi cocok untuk kita juga. Memutuskan: kami memberikan checksum pada setiap informasi yang disimpan, dan jika cocok setelah dekripsi, berarti dekripsi berhasil.

Anda juga memerlukan nomor fragmen dan panjang total data rahasia. Nomor fragmen adalah untuk melacak bagian mana yang sudah kita pecahkan dan mana yang tersisa. Panjang total akan berguna bagi kita saat memproses fragmen terakhir, agar tidak menulis data yang tidak perlu (yaitu padding). Nah, karena kita masih memiliki header, kita akan menambahkan nama file rahasia di sana. Ini akan berguna setelah dekripsi agar tidak menebak-nebak cara membukanya.

Menguji metode dalam praktik

Untuk memeriksanya, mari kita ambil media yang paling umum - flash drive. Saya menemukan yang lama dengan kapasitas 1 GB, yang cukup cocok untuk eksperimen. Jika Anda, seperti saya, memiliki ide untuk tidak repot dengan media fisik, tetapi mengujinya pada file - image disk, maka saya akan langsung mengatakan: itu tidak akan berhasil. Saat memformat “disk” seperti itu, Linux membuat file tersebut lagi, dan semua sektor yang tidak digunakan akan diisi dengan angka nol.

Sayangnya, sebagai mesin dengan Linux, saya harus menggunakan stasiun cuaca di Raspberry Pi 3 yang tergeletak di balkon. Memori di sana tidak banyak, jadi kami tidak akan menyembunyikan file besar. Kami membatasi diri pada ukuran maksimum 10 megabita. Juga tidak ada gunanya menyembunyikan file yang terlalu kecil: utilitas menulis data ke disk dalam cluster 4 KB. Oleh karena itu, di bawah ini kami akan membatasi diri pada file 3 kb - file tersebut cocok dengan satu cluster tersebut.

Kami akan meniru flash drive secara bertahap, setelah setiap tahap memeriksa apakah informasi tersembunyi dapat dibaca:

  1. Pemformatan cepat dalam format FAT16 dengan ukuran cluster 16 KB. Inilah yang ditawarkan Windows 7 untuk dilakukan dengan flash drive yang tidak memiliki sistem file.
  2. Mengisi flashdisk dengan segala jenis sampah sebesar 50%.
  3. Mengisi flashdisk dengan segala jenis sampah sebesar 100%.
  4. Pemformatan "panjang" dalam format FAT16 (menimpa semuanya).

Dua tes pertama, seperti yang diharapkan, berakhir dengan kemenangan penuh: utilitas berhasil mengekstrak 10 megabita data rahasia dari flash drive. Namun setelah flash drive terisi penuh dengan file, terjadi kegagalan:

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

Seperti yang Anda lihat, hanya 158 cluster yang berhasil didekripsi (632 kilobyte data mentah, yang menghasilkan 636424 byte payload). Jelas bahwa tidak ada cara untuk mendapatkan 10 megabyte di sini, namun di antara cluster ini jelas terdapat duplikat. Anda bahkan tidak dapat memulihkan 1 megabyte dengan cara ini. Namun kami dapat menjamin bahwa kami akan memulihkan 3 kilobyte data rahasia dari flash drive bahkan setelah diformat dan ditulis sesuai kapasitasnya. Namun, percobaan menunjukkan bahwa sangat mungkin untuk mengekstrak file sepanjang 120 kilobyte dari flash drive tersebut.

Sayangnya, pengujian terakhir menunjukkan bahwa seluruh flash drive telah ditimpa:

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

Tidak ada satu pun cluster yang bertahan... Sedih, tapi tidak tragis! Sebelum memformat, mari kita coba membuat partisi pada flash drive, dan sudah ada sistem file di dalamnya. Omong-omong, ini berasal dari pabrik dengan format persis seperti ini, jadi kami tidak melakukan sesuatu yang mencurigakan.
Diperkirakan ruang yang tersedia pada flash drive sedikit berkurang.

Diperkirakan juga bahwa 10 megabita tidak dapat disembunyikan pada disk yang terisi penuh. Namun kini jumlah cluster yang berhasil didekripsi meningkat lebih dari dua kali lipat!

Total clusters read: 250752, decrypted: 405

Sayangnya, tidak mungkin mengumpulkan satu megabyte dari potongan-potongan, tetapi dua ratus kilobyte itu mudah.

Nah, berita tentang pemeriksaan terakhir, ke-4, kali ini menggembirakan: memformat flash drive sepenuhnya tidak menyebabkan kehancuran semua informasi! 120 kilobyte data rahasia sangat cocok dengan ruang yang tidak terpakai.

Tabel ringkasan tes:

File masa lalu steganografi: menyembunyikan data secara langsung di sektor

Sedikit berteori: tentang ruang kosong dan sektor yang tidak terpakai

Jika Anda pernah membagi hard drive menjadi beberapa partisi, Anda mungkin memperhatikan bahwa tidak selalu mungkin untuk mengalokasikan semua ruang kosong pada disk. Bagian pertama selalu dimulai dengan beberapa lekukan (biasanya 1 megabyte, atau 2048 sektor). Di balik bagian terakhir, kebetulan masih ada “ekor” kecil dari sektor yang tidak terpakai. Dan terkadang ada kesenjangan antar bagian, meski jarang.

Dengan kata lain, ada sektor pada disk yang tidak dapat diakses selama pekerjaan normal dengan disk, tetapi data dapat ditulis ke sektor tersebut! Dan itu berarti membacanya juga. Disesuaikan dengan adanya juga tabel partisi dan kode bootloader yang terletak di area kosong di awal disk.

Mari kita istirahat sejenak dari bagian-bagian tersebut dan melihat disk dari pandangan sekilas. Di sini kita memiliki partisi kosong pada disk. Mari buat sistem file di dalamnya. Bisakah kita mengatakan bahwa beberapa sektor pada disk tetap tidak terhapus?

E-e-e - drum roll! Jawabannya hampir selalu ya! Memang, dalam banyak kasus, pembuatan sistem file berarti menulis hanya beberapa blok informasi layanan ke disk, jika tidak, isi partisi tidak akan berubah.

Dan juga - murni secara empiris - kita dapat berasumsi bahwa sistem file tidak selalu dapat menempati semua ruang yang diberikan hingga sektor terakhir. Misalnya, sistem file FAT16 dengan ukuran cluster 64 kilobyte jelas tidak dapat sepenuhnya menempati partisi dengan ukuran bukan kelipatan 64 kilobyte. Di akhir bagian seperti itu harus ada "ekor" dari beberapa sektor yang tidak dapat diakses untuk menyimpan data pengguna. Namun asumsi ini tidak dapat dikonfirmasi secara eksperimental.

Jadi, untuk memaksimalkan ruang yang tersedia untuk steganogram, Anda perlu menggunakan sistem file dengan ukuran cluster yang lebih besar. Anda juga dapat membuat partisi, meskipun hal ini tidak diperlukan (pada flash drive, misalnya). Tidak perlu membuat area kosong atau meninggalkan area yang tidak terisi - ini akan menarik perhatian warga yang berminat.

Utilitas untuk eksperimen

Anda dapat menyentuh kode sumber utilitas di sini

Untuk membangun, Anda memerlukan Qt versi 5.0 atau lebih tinggi dan OpenSSL. Jika ada yang tidak berhasil, Anda mungkin harus mengedit file steganodisk.pro.

Anda dapat mengubah ukuran cluster dari 4 KB menjadi, katakanlah, 512 byte (di secretfile.h). Pada saat yang sama, biaya informasi layanan akan meningkat: header dan checksum menempati 68 byte tetap.

Anda perlu menjalankan utilitas tersebut, tentu saja, dengan hak pengguna root, dan dengan hati-hati. Tidak akan ada pertanyaan yang diajukan sebelum menimpa file atau perangkat yang ditentukan!

Selamat menikmati.

Sumber: www.habr.com

Tambah komentar