2018年11月17日 星期六

因為無知,所以出糗--淺談彩虹表原理

鄭重聲明:本篇只是淺談彩虹表的基礎原理,同時也釐清筆者多年的錯誤觀念,不涉及彩虹實作細節。
彩虹表就是一個龐大的、針對各種可能的字母組合預先計算好的哈希值的集合,不一定是針對MD5演算法的,各種演算法的都有,有了它可以快速的破解各類密碼。越是複雜的密碼,需要的彩虹表就越大,現在主流的彩虹表都是100G以上。
(摘自TWWORD的「彩虹表」詞條)
上面這段話一直是我所認為的彩虹表。幾年前,老師上課也是這樣教的,在當初對一名初踏入滲透測試領域的新人,雖然很懷疑這種的說法(註),但因基礎不扎實,也將就延用到現在。只因最近讀了一本外文書,才驚覺書中敘述和我的印象有出入。
註:若按照上面的說法,一套8字元長的大小寫英數字混合密碼,做出一套彩虹表至少要5000TB的儲存空間,以每顆3TB的硬碟估算,大約是1400顆,這是我當初心中的疑惑!?
原來彩虹表不是赤裸裸的將明文密碼與雜湊值照單全收,而是以time-memory trade off(以時間換空間)的策略,只儲存計算結果的串鏈(姑且稱它為彩虹鏈)的頭尾,至於中間的值則在破解時再重新計算。
彩虹鏈只存頭尾,那要如何維持完整的彩虹鏈的關係?這涉及兩個函式:雜湊值的計算函式(雜湊函式)及雜函值反轉函式(歸約函式 [reduction function])
  • 雜湊函式將明文密碼轉換成雜湊值,用 H( ) 代替。
  • 歸約函式將雜湊值對應到某個明文密碼,用 R( ) 代替。
歸約函式並不是解出雜湊值的原始明文密碼,只是儘量不重複地從可能的明文密碼中,找出一筆資料來和雜湊值對應。舉個例子,假設明文密碼只有1字元長,可能值為大寫字母 A到Z (即26種組合),這些密碼的雜湊值就有:
Ha = H(A) , Hb = H(B), ... ..., Hz = H(Z)   # Ha 即明文密碼A經過雜湊後的結果。
歸約函式就是從給定的雜湊值,找出一個對應的明文密碼,若R(Ha) 可以得 M,就將它記成  Rm = R(Ha),依此,假設上述所有雜湊值運算後得到如下結果:
Rm = R(Ha)=MRl = R(Hb)=LRg = R(Hc)=GRo = R(Hd)=O
Rp = R(He)=QRc = R(Hf)=CRr = R(Hg)=RRd = R(Hh)=D
Rn = R(Hi)=NRx = R(Hj)=XRe = R(Hk)=ERs = R(Hl)=S
Rf = R(Hm)=FRj = R(Hn)=JRk = R(Ho)=KRu = R(Hp)=U
Rv = R(Hq)=VRi = R(Hr)=IRq = R(Hs)=QRb = R(Ht)=B
Rh = R(Hu)=HRw = R(Hv)=WRt = R(Hw)=TRa = R(Hx)=A
Rp = R(Hy)=PRd = R(Hz)=D  
雜湊函式有碰撞(collision)問題,歸約函式依然有撞問題,由上面的對照表可見 HhHz在通過歸約時都會對應到D;同樣的,HeHs則對應到Q,因為碰撞問題,也看到雜湊值歸約的結果並沒有YZ,以這個範例來說,當拿到Y或Z的雜湊值,而利用此例的彩虹表將會解不出來。
好了,解釋了雜湊函式歸約函式之後,來看如何產生彩虹鏈表。
  1. 從明文密碼中隨機選擇一項(假設為 M),由雜湊函式計算其雜湊值得到Hm
  2. Hm送給歸約函式計算,反轉得到 F
  3. 再將F交給雜湊函式,又得一組雜湊值Hf
  4. 再將Hf送給歸約函式計算,反轉得到 C
一直循環下去就可以得到一條彩虹鏈,但這一條鏈到底要多長呢? 鏈的長短會影響彩虹表的大小及破解時所耗的時間:鏈愈長,愈節省空間,但破解時會增加重算的次數,所以破解速度較慢,下面用短鏈(三階)和長鏈(七階)來解釋。
若以三階製作彩虹鏈,可能得到的結果:
M H()
Hm R()
F H()
Hf R()
C H()
Hc R()
G
I H()
Hi R()
N H()
Hn R()
J H()
Hj R()
X
Q H()
Hq R()
V H()
Hv R()
W H()
Hw R()
T
D H()
Hd R()
O H()
Ho R()
K H()
Hk R()
E
~~底下還有,省略~~
若以七階製作彩虹鏈,可能得到的結果:
M H()
Hm R()
F H()
Hf R()
C H()
Hc R()
G H()
Hg R()
R H()
Hr R()
I H()
Hi R()
N H()
Hn R()
J
K H()
Hk R()
E H()
He R()
Q H()
Hq R()
V H()
Hv R()
W H()
Hw R()
T H()
Ht R()
B H()
Hb R()
L
P H()
Hp R()
U H()
Hu R()
H H()
Hh R()
D H()
Hd R()
O H()
Ho R()
K H()
Hk R()
E H()
He R()
Q
~~底下還有,省略~~
彩虹表最後只會儲存每條鏈的頭尾,即上面兩張表紅字部分,這樣就可以不必儲存所有對照表,而達到節省空間 的目的。那麼在破解時,要如何應用彩虹表呢?假設我們拿到一組雜湊值Hw,利用三階的彩虹表破解:
  1. Hw歸約函式得到T
  2. 比對每條彩虹鍵的尾端,在第三條鏈找到T,因而得知該鏈的頭是Q
  3. Q計算得雜湊HqHq≠Hw
  4. Hq歸約函式計算得V,用V計算得雜湊HvHv≠Hw
  5. Hv歸約函式計算得W,用W計算得雜湊HwHw=Hw,所以求得答案為W
同樣的,若用七階彩虹表破解:
  1. Hw歸約函式得到T
  2. T比對每條彩虹鍵的尾端,都沒有找到T
  3. T雜湊Ht,再將Ht歸約B
  4. B 比對每條彩虹鍵的尾端,都沒有找到B
  5. B雜湊Hb,再將Hb歸約L
  6. L比對每條彩虹鍵的尾端,在第二條鏈找到L,因而得知該鏈的頭是K
  7. K計算得雜湊HkHk≠Hw
  8. Hk歸約函式計算得E,用E計算得雜湊HeHe≠Hw
  9. He歸約函式計算得Q,用Q計算得雜湊HqHq≠Hw
  10. Hq歸約函式計算得V,用V計算得雜湊HvHv≠Hw
  11. Hv歸約函式計算得W,用W計算得雜湊HwHw=Hw ,所以求得答案為W
如果不巧拿到Hy的雜湊值呢?會重複上述步驟1 到2,如果七階鏈就重複七回三階鏈重複三回,如果都沒有找到相符的尾值,就表示該雜湊值在目前的彩虹表是解不出來的。
上述是彩虹表大略的工作原理,終於知道它並不是完全的明文-雜湊對照表。

2018年11月3日 星期六

「2018台灣賽門鐵克資安論壇」會後感想

聲明:這些都是我個人的主觀見解,或有失偏頗,請讀者在閱讀時也要有自己的判斷!
在此之前我都沒有參加過賽門鐵克的任何資安研討會,這是第一次參與,雖然不免推銷自家產品,但其中也有值得參考的觀念建議,個人感覺還蠻值得的。
首先由Symantec台灣區總經理Dylan Wen開場,他提出資安321的檢視方法:三個問題二項觀念一個架構
三個問題
1.資訊環境防護安全嗎?
我相信沒有人回答的出來,安全無絕對,只要你夠大咖,駭客一定盯上你,所以我個人覺得這根本不是問題,而是行銷手法。但他以某家金融CIO的看法來闡釋此題,個人倒覺得很貼切:和四周的同業比較,只要比他們安全就值得了。因為駭客也是挑軟柿子吃
2.如何規劃資安架構?
這一題其實沒什麼好回答的,現今已有成堆的「標準」或「準則」,反正照做就對了,要不然怎會有一堆機關、廠商號稱通過XYZ認證,這此認證制度都會提供多如牛毛的事前盤點、分類、規劃、風險評鑑,事中稽查、確認及事後的成熟度評估。但我個人覺他們都忽略「人性」,只要有人在的地方,就不可能實行「zero trust」,人是起點,也是終點,所謂「徒法不能以自行」,任何制度或方法論,若忽視人性,註定不會成功,偏偏所有的制度或方法論都無法加入「人性管理」,因為人性最重要在於「信任」。
3.資安人力資源足夠嗎?
這一題也沒什麼好回答的,在台灣,資安人力一直都不夠,不是沒有人才,而是老闆向來不重視,在台灣無形資產向來不值錢,老闆可以花大錢買設備、買硬體,但一遇到軟體、智能技術,就會死命壓低價錢,老闆覺得「軟體再複製就可以多一套,就可以分攤成本」,同樣也認為「智能技術」只要形之文字,就可以再創造一位高手(如果那麼簡單,還要老師幹嘛?)。在老闆眼中,資安人才「養成」是這麼容易,因此,他所認為的5名資安人員,其實抵不上一位真正的資安人才,更何況資安威脅千變萬化,必須集結各種專才而成的防護網才足夠應付,所以資安人力資源怎麼會足夠?
二項觀念1.慎選廠商2.可擴充平臺。這兩個觀念很容易理解,沒什麼好解釋的,但我覺得很難實踐,如果沒有比廠商更厲害,怎麼判斷廠商夠不夠格?如果對公司的資安環境及需求沒有通盤了解,又如何評斷平臺擴充到哪一種程度才是合乎需要?所以這二項觀念歸結起來還是「人才」因素。
一個架構:就是不要讓公司的資安設備孤軍作戰,不要彼此成為不相干的孤島,簡單說,就是各式資安設備(如防火牆、IPS/IDS、防毒閘道...)要達到聯防目標。理念很不錯,要實現還是得靠人。
聽完Dylan的演講,我很想再加一項中心,不重視「人才」,投注再多預算依然得不到效果,車子再會跑,沒有好駕駛,它也只能待在車庫裡
第二場是Victor Law介紹2019資訊安全趨勢、挑戰及機會,敝人資質愚鈍,聽不出什麼重點,好像是說我們可以靠AI協助提高安全防禦,而駭客也會利用AI強化攻擊。一直以來不都是這樣嗎?矛 &盾都是藉用相同的技術在競爭,也一直相伴在進步,任何攻防皆是如此,要不然,另一方早消聲匿跡。
第三場是Dylan Wei、MahaAlber Tsao介紹次世代上網最佳防護-網頁隔離管理,這是產品介紹,也就是Symantec的隔離上網技術,使用者上瀏覽網頁、收信或下載檔案時,這些資料並不是直接落地在使用者的PC上,而是暫存在隔離伺服器(看作Proxy吧),隔離伺服器會對內容進行檢查,「內容」包括從Internet進來的,和從使用者PC出去的,如此不僅能防止外部攻擊,也能防止使用者有意無意洩露資料。他們號稱可以100%保護上網安全,但我認為沒有經過時間焠煉,一切都只是假設,畢竟系統是人設計的,不可能絕對完美。我就想到一種情境,既然隔離伺服器會檢查內容,如果駭客透過惡意內容利用隔離伺服器的漏洞,就能單點達成攻擊多位使用者。
第四場由Dragon Chang主持的專題探討專題探討(面對明日多重威脅與挑戰,企業該如何從智能情報及資安架構著手),邀請友達光電(林經理)、臺灣大哥大(陳處長)、TWCERT(陳永佳博士)、Victor Law,以一問一答方式介紹不同產業面對資安威脅的因應方式,這些建議確實值得在規劃、施作資安防禦的參考,我聽到的兩個重點(來自友達及台哥大):有多少預算做多少事從內部培養資安人才。可想而知,安不安全,高層的支持很重要,這兩項因素都不是資安人可以決定的。
後半段分兩軌進行:Track A 駕馭資安Track B 融合未來。我選擇Track A,共有兩個主題。
● 加強資安應變能力以抵禦未來攻擊(Andy Chow)
● 資安人力的不足?專業顧問服務團隊協助您(Ben Li)
這個兩場的論述內容不難理解,而重點在於「Symtantec能夠幫助你」,簡單說「有資安需要,找Symtantec就對了」。至於Symtantec能不能解決問題,反正廣告嘛!哪有人說自己不行的。
倒是Ben Li提到資安面對的是人、響應的也是人,與我的觀念相近。買再多設備、制定再多規則,沒有「人」,這些都是死的,只要「人」不用心,這些都無法發揮功效。很多專案在建置時,因為要驗收,廠商很用心調校,例如防火牆,第一年可以發揮很好功效,但之後,鮮有「人」仔細檢視日誌及比對規則,慢慢地,規則就過時了,只要沒有顯明的徵兆,也不會有人去看日誌,最後成了「求心安」的平安符。
可惜,老闆們都能體認「工欲善其事,必先利其器」(因為機器不會抱怨),卻不願意多給資安人員一些信任、資源及授權。我的老闆也是這般,他的中心思想就是立下「制度」,所以訂了一堆規則,以為有「規定」大家就會照著執行。然而,上有政策、下有對策,陽奉陰違者,有之;便宜行事者,有之;阿諛奉承者,有之;暗渡陳倉者,有之,規則依舊在,裁量各不同,何況多如牛毛的規定,誰記得(誰願意花時間去記?)
個人心得
制度很重要,它是路標,指引我們走對的方向。但「人」更重要(制度不也是人訂的),這裡的「人」不是隨意指派,必須要「願意做有能力做有時間做」,雖說三個臭皮匠勝過一個諸葛亮,我情願有兩位諸葛亮,也不想要六個臭皮匠。
踏入資安後,參加許多場研討會,大家拼命介紹產品有多神、如何防禦未知的攻擊(到現在我都還納悶,「未知」如何防?),鮮少有廠商真心告訴老闆們:你們公司需要哪些資安人才。不知道哪一天老闆才會覺醒:「人」真的很重要!

2018年8月12日 星期日

當 thc-hydra 遇到中文字( hydra 真的不認識中文字嗎?)

我在2014年寫了一篇「實例說明:利用 Hydra 暴力破解網站登入密碼」,得到許多網友青睞,給了諸多互動,也讓我有機會探索之前不曾注意的細節,在此向各位說聲謝謝
hydra是利用網頁回應的訊息來判斷是否成功登入,該篇博文只處理「純英文」情境,就算遇到中文訊息,也可以利用網頁的其他元素內容(如class="warn")應付,因此,從來沒有仔細思索hydra與中文訊息的關係。
但最近踢到鐵板了,某個產品的後台登入頁,在登入失敗時只回應中文訊息(見圖1),原本以為使用下列的句法可以進行暴力測試:
hydra -s 260 -l root -p root@password 待測的URL http-post-form "/cgi-bin/admin/sessmgr.cgi:user=^USER^&pwd=^PASS^&act=login&savepwd=1:登入失敗"
圖1
結果~~每一組 ID/Password 都成功(其實是誤判)!原來hydra不認識「登入失敗」這幾個字。上網找了很久,得到的答案是「hydra不支援多位元組字集(MBCS)」,但真的不支援嗎?我就是不死心。直接查看hydra的源碼,發現它是儲存在 char* 型別,心想「如果將中文拆成單一byte是不是就可以了呢?」果不其然,就是這樣
有關hydra的語法(用法)在此就不多說了,有需要的朋友請參考「實例說明:利用 Hydra 暴力破解網站登入密碼」。
直接介紹如何將中文拆成單一byte。
  1. 利用hydra -v -V -d 參數輸出詳細訊息,以便取得中文字的內碼:
    hydra -vVd -s 260 -l root -p root@password 待測的URL http-post-form "/cgi-bin/admin/sessmgr.cgi:user=^USER^&pwd=^PASS^&act=login&savepwd=1:登入失敗" > D:\tmp\nta_hydra1.txt
    這裡單純使用 -l -p 只測試一組帳密。 上面使用輸出重導向 > D:\tmp\nta_hydra1.txt 將訊息寫入文字檔,方便搜尋比較。
  2. 利用notepad++從輸出的文字檔中找到未登入前(使用GET取得登入頁),及hydra用POST送出登入請求後所回應的登入失敗,登入失敗時,頁面多出了「e799 bbe5 85a5 e5a4 b1e6 9597 efbc 8ce8 ab8b e987 8de6 96b0 e8bc b8e5 85a5 e5b8 b3e8 999f e5af 86e7 a2bc」(參考圖2),這一段恰好是「登入失敗,請重新輸入帳號密碼」的UTF-8編碼,其中前12Byte就是「登入失敗」
    圖2

  3. 因此,將上面句法改成下面的樣子就可以正常測試了:
    hydra -vVd -s 260 -L 帳號字典檔 -P 密碼字典檔 待測的URL http-post-form "/cgi-bin/admin/sessmgr.cgi:user=^USER^&pwd=^PASS^&act=login&savepwd=1:\xe7\x99\xbb\xe5\x85\xa5\xe5\xa4\xb1\xe6\x95\x97"
    hydra要以內碼方式輸入資料,只需在內碼前頭加上 \x 即可,例如 \xe7,所以將「登入失敗」以內碼表示就成了「\xe7\x99\xbb\xe5\x85\xa5\xe5\xa4\xb1」。
  • hydra可以利用Byte內碼方式指定MBCS文字,以後遇到中文網頁,不必再費心尋找獨特的網頁元素來代替中文字,直接用中文內碼就好了!
  • 由於直接使用內碼,所以面對英文、UTF-8或Big5的中文都可以處理,不必擔心內碼轉換問題。
PS1:這裡講「內碼」雖然不夠精準,但請您別挑剔了!
PS2:新版的thc-hydra-win可以從Github下載: https://github.com/maaaaz/thc-hydra-windows/releases