資料安全:海洋頂端2006+密碼編碼分析(轉)

ba發表於2007-08-15
資料安全:海洋頂端2006+密碼編碼分析(轉)[@more@]海洋頂端是很出名的 ASP 木馬,我從紅粉佳人版本開始就一直用它,也算是它的fans了,今年海洋頂端出了最新版本也是最後一個版本 —— 2006Plus。
身為fans,自然要拿來用用才是,初次使用感覺有了幾個變化:介面變了,檔案瀏覽不再是圖示形式;所有動作改為POST方式提交;功能增加;……唉呀,趕緊打住,再寫就變成廣告了^_^

  海洋頂端以往的各個版本密碼都是明文存放的,這回 2006+ 專門有個 vbs 指令碼用於加密密碼。這幾天閒得無聊,就來嘗試分析一下它的加密方式。

  加密密碼的指令碼是在 down 回來的 vbs 目錄裡面名為Encode.vbs的檔案。先看程式碼,註釋是我加的:


Dim theStr
theStr = InputBox("請輸入要加密的字串")
If theStr <> "" Then
Call InputBox("請複製已經加密好的字串",,Encode(theStr))
End If
Function Encode(strPass)
Dim i, theStr, strTmp
’ for迴圈得到密碼各個字元的ascii值,每位值都在0~9
For i = 1 To Len(strPass)
strTmp = Asc(Mid(strPass, i, 1))
theStr = theStr & Abs(strTmp)
Next
strPass = theStr
theStr = ""
’ 如果前面得到的值位數大於16就進入JoinCutStr函式處理,使之小於16
Do While Len(strPass) > 16
strPass = JoinCutStr(strPass)
Loop
’ 這個for迴圈處理每個字元,把7、8、9轉為C、D、E,其餘不變
For i = 1 To Len(strPass)
strTmp = CInt(Mid(strPass, i, 1))
strTmp = IIf(strTmp > 6, Chr(strTmp + 60), strTmp)
theStr = theStr & strTmp
Next
Encode = theStr
End Function
’ JoinCutStr函式把奇數位和偶數位的ascii相加整除2得到新字元,取值在0~9
Function JoinCutStr(str)
Dim i, theStr
For i = 1 To Len(str)
If Len(str) - i = 0 Then Exit For
theStr = theStr & Chr(CInt((Asc(Mid(str, i, 1)) + Asc(Mid(str, i + 1, 1))) / 2))
i = i + 1
Next
JoinCutStr = theStr
End Function
’ VB的(a>b)?a:b
Function IIf(var, val1, val2)
If var = True Then
IIf = val1
Else
IIf = val2
End If
End Function

演算法不是很複雜,其主要思想是:先依次把每個字元取ascii值,得到的一串數字作為字元對待,如果位數大於16,則折半處理(把奇數位和偶數位的ascii相加整除2得到新字串,得到的字串位數為原來的一半),直至小等於16,然後把7、 8、9分別替換為C、D、E得到最後結果。
似乎可以逆向,那就試試吧。

  我們得到了密文,第一步,我們可以把密文中的C、 D、E替換回去,也就是分別替換為7、8、9,然後我們得到一串數字組成的字串。比如字元lake2編碼之後是10DEC10C10150,我們替換之,得到1089710710150,由於字元的ascii在32~127,所以可以很輕鬆的把字元區分開:108、97、107、101、50,正好是 lake2各個字元的ascii值。

  千萬不要以為這個演算法這麼簡單就破解了,因為上述情況只是若干種情況裡面最簡單的一種而已。

  字元lake2的ascii值位數是11,所以並沒有經過JoinCutStr函式處理,如果明文密碼是lake2lake2的話,問題就複雜得多了。

  JoinCutStr函式把奇數位和偶數位的ascii相加整除2得到新字串,但這裡造成了逆向的困難。因為1234經過處理,得到的是13; 1133、1134、1233、1234、1124等等經過處理,得到的仍然是13。即同一個結果對應不同的原因,多數情況下我們不知道到底哪一個才對,只好窮舉。但是即使是窮舉且排除那些包含不可顯示字元的密碼,也很難知道哪一個密碼才是對的。

  我們雖然不知道使用者真正的密碼是多少,但是卻可以利用得到的任意一個密碼登陸,因為它和真正密碼加密之後的值是一樣的。這個有點像MD5的碰撞,只是這個演算法可以根據hash比較容易的構造碰撞,而MD5則很困難。

  還有一種比較麻煩的情況:明文密碼包含中文。中文的ascii絕對值都很大,要逆向回去還是很麻煩的,所以我們還是構造碰撞吧。

  針對最簡單的那種情況我們也可以用一個vbs來反編碼明文密碼,以下程式碼即實現此功能,copy儲存為vbs檔案執行即可:



’海洋頂端2006+簡單密文反編碼 by lake2

theStr = InputBox("輸入加密後的字串")
If theStr <> "" Then
Call InputBox("請複製已經解密的字串",,UnEncode(theStr))
End If
Function UnEncode(str)
For i = 1 To Len(str)
theStr1 = Mid(str, i, 1)
If theStr1 = "C" Then
theStr1 = "7"
ElseIf theStr1 = "D" Then
theStr1 = "8"
ElseIf theStr1 = "E" Then
theStr1 = "9"
End If
StrPass2 = StrPass2 & theStr1
Next
StrPass3 = GetChr(StrPass2)
UnEncode = StrPass3
End Function
Function GetChr(str)
For i = 1 To Len(str)
ASCStr = Mid(str, i, 1)
MyStr = MyStr & ASCStr
If MyStr > 32 and MyStr < 127 Then
StrResult = StrResult & Chr(MyStr)
MyStr = ""
Else
If i = Len(str) Then
GetChr = "小蝦無能,不能破解"
exit function
End If
End If
Next
GetChr = StrResult
End Function



  試試效果先:

10DEC10C10150 -> lake2
120105EC111106 -> xiaoj (這個是某人的密碼哦^_^)



  後面兩種情況,如果要程式設計序破解的話感覺比較困難,就不寫了。要是閣下寫出了程式,可得讓我研究研究。

  下面讓我們透過構造碰撞來破解海洋頂端2006Plus的預設密碼。

  開啟檔案,得到它的編碼過的密碼是02200200251001,我的程式不能恢復,看來是經過JoinCutStr函式處理的。讓我們大膽的還原: 10 31 22 10 01 22 10 01 22 55 11 10 01 11,整合一下: 103 122 100 122 100 122 55 11 100 111,這裡有個ascii值11,這個字元也是可以顯示的,既然是碰撞,只好將就了。我們得到我們的明文密碼:gzdzdz7chr(11)do因為chr(11)是換行符,格式原因不能顯示,你可以把以下程式碼儲存為vbs執行之,得到密碼:

  Call InputBox("海洋的預設密碼碰撞",,"gzdzdz7"&chr(11)&"do")

  然後你用它登陸沒有改過密碼的海洋頂端木馬,呵呵,進去了吧。下面再提供一個可以登陸但不同的密碼用以證明這是碰撞:

  Call InputBox("海洋的預設密碼碰撞",,"gqdzdz7ne"&chr(11))

  最後,我們來下個結論:在得到海洋頂端2006+編碼後的密碼之後,就算不能恢復出明文密碼,也可以利用碰撞來登陸系統。至於如何得到編碼後的密碼,呵呵,那就超出本文的範圍了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958388/,如需轉載,請註明出處,否則將追究法律責任。

相關文章