iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 8
2
Security

CTF 的三十道陰影系列 第 8

Day8: [Forensic] Steganography

前言

其實我個人不是很喜歡解隱寫術相關的題目,因為基本上能藏的方式可以說無限種,如果題目設計時沒有足夠的線索,很難在 CTF 比賽有限的時間內解出來,常常到最後都要等主辦方放額外的 hint 才有辦法做,但不可否認的,隱寫術在 security 的確佔了一席之地,至今在某些情境中仍然會被使用

Steganography

中文是 隱寫術,因為名稱太長會被用 stego 稱呼,是屬於資訊隱藏的技術之一

  • 資訊隱藏指的是不讓除預期的接收者之外的任何人知曉資訊的傳遞事件或者資訊的內容

stego 的原理是將資料根據某種規律拆散成很多個片段,再需要用大量的無效資料來隱藏被拆成片段有效資料,只有知道無效資料和有效資料配置規則的人,才有辦法把篩選出有效資料,再拼湊為原始資料

  • 無效資料被稱呼為 噪聲 (noise),噪聲的數量級越大,越不容易被分析出有效資料,但傳輸的成本也越高
  • stego 嚴格說來也算是加密技術的一種,但效率極差,cipher 會遠大於 plaintext

在電影或小說常出現的 <聖經密碼> 就是隱寫術的一種體現,需要根據某幾頁的某些文字組出其他有意義的文字,還有現在 PTT 或網路論壇很流行的藏頭詩也是隱寫術的一種,現在只要是排列整齊的文章大家都會想找看看有沒有藏頭....XDD

由於現代密碼學的盛行,其實真正重要且需要被傳遞的技術都會透過正式的加密技術給保護,光明正大地把密文給你攔截你也解不出來的意思,因此 stego 主要的用途是用來做一些偷偷摸摸的事情,像是:

  • botnet 需要隱藏自己被感染,又需要向 C&C server 回傳資料
  • DNS tunnel,將網路的正常封包拆散變成很多個 DNS query 之後,接收 DNS query 的人再將數據組回原始的傳輸內容

0x07: Olympics CTF Freestyle 200 Find da key

Olympics CTF 是 2014 年趕上奧運熱潮的一場 CTF,之後就再也沒辦過了...XDD 但這場的題目趣味性和難度兼具,唯一一次在 ctftime 上辦還有 60 weight 的評分可見一班

題目給了一個檔案 stego.txt,裡面是好幾行字串,內容大致長這樣:

U3RlZ2Fub2dyYXBoeSBpcyB0aGUgYXJ0IGFuZCBzY2llbmNlIG9m
IHdyaXRpbmcgaGlkZGVuIG1lc3NhZ2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBubyBvbmV=
LCBhcGFydCBmcm9tIHRoZSBzZW5kZXIgYW5kIGludGVuZGVkIHJlY2lwaWVudCwgc3VzcGU=

看起來就是 base64,嘗試 decode 可以成功得到可閱讀的字串,像是第一行的內容會是:Steganography is the art and science of,把文字拿去 google 會發現內容是源自於網路上某篇介紹 stego 的文章 http://stegstudio.sourceforge.net/steganography.html

文章本身沒什麼問題,但如果把文章重新 encode 回 base64,會發現跟 stego.txt 的內容不太相同,不同的都是發生在最後有 padding 的句子:

stego.txt:
IHdyaXRpbmcgaGlkZGVuIG1lc3NhZ2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBubyBvbmV=
orignal:
IHdyaXRpbmcgaGlkZGVuIG1lc3NhZ2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBubyBvbmU=

base64 的原理是把原本每個 char 代表的 8 bit 改成以 6 bit 表示,如果最後是由 === 結尾,表示在 encode 之前的 data 不能以 6 bit 整除,因此會需要視情況補上一個或兩個 null byte 讓資料變成可以整除 6 bit

  • = 代表補上 1 個 null byte (8 bit),轉換為 base64 之後會有 2 bit 需要和原始資料一起 encode,剩餘 6 bit 就會以 = 表示
  • == 代表補上了 2 個 null byte (16 bit),轉換為 base64 之後會有 4 bit 需要和原始資料一起 encode,剩餘 12 bit 就會以 == 表示

現在再回來看原本 stego.txt 的字串,就可以發現他並不是標準的 base64,最後 padding 的 bit 並非都是用 0 填充,原本單純用來 padding 的 2 bit 或 4 bit,就是這題隱寫術隱藏有效資料的地方

這題的具體作法是:

  1. 過濾掉所有沒有 padding 的字串
  2. 把剩下的字串取出 = 或 == 前的最後一個 byte,轉化為 bit 表示
  3. 如果結尾是 =,取倒數 2 bit 作為有效資料
  4. 如果結尾是 ==,取倒數 4 bit 作為有效資料
  5. 把所有的 bit 串起來再轉換成字串,就可以得到隱藏的 flag
  • flag: Base_sixty_four_point_five

上一篇
Day7: [Crypto] Encode? Encrypt? Hash?
下一篇
Day9: [Misc] Misc Challenge Overview
系列文
CTF 的三十道陰影31

尚未有邦友留言

立即登入留言