字典檔的規則
--------------
定義給字典檔及 "single crack" 模式的節段是放在一個叫做 [List.Rules:Wordlist]
跟 [List.Rules:Single] 之中. 作者使用一種叫作擴充破解 (by Alec Muffett) 的語
法, 或許有許多人對於這種破解模式已經很熟悉了. 作者加入了更多重要的的規則來使
它更為優秀, 讓它能夠使用同一個原始來源產生更多更複雜的方式.
當在定義規則的時候, 在每一行中只需要安排一種規則 (之前可能需要下達一些指令).
每一種規則是由一個或多個指令組成. 下面這些指令是 John 所支援的 (大部分的說明
是由 Crack 程式的 dicts.rules 所轉錄下來的, 但是程式碼是作者自己重寫的, 而且
比 Crack 還要快):
一般常用指令:
: no-op - 不要在輸入的字之後作任何動作
>n 拒絕輸入的字長度是 > n 的字元, n = 0-9
^x 將 'x' 由每個輸入的字移出
$y 在每個輸入的字後加上 'y' 這個字元
l 強制小寫字
u 強制大寫字
c 強制第一個字大寫(其餘小寫)
r 把字元排列次序巔倒: "Fred" -> "derF"
d 重覆每個字: "Fred" -> "FredFred"
f 鏡射形態字: "Fred" -> "FredderF"
p 嘗試每個字元的大小寫變化 (abc, Abc, aBc, abC....)
onx 如果字元不滿幾個字, 就把它加到幾個字, n (由 0 開始) 每個未足字元都以 'x' 字取代.
inx 在指定字元數插入 'x' 的字元, 字元數 n (由 0 開始) 後面的字將會依插入的字元多寡
而向右邊作位移
nb: 如果指定的 > 字串總長度(input), 字元 'x' 將會用增加的方式加上
xnm 由字串中抽離某些字, 字元數 n (由 0 開始) 而且會抽離 m 個字元.
會使用在字元層級的指令:
sxy 取代 (交換), 將字串中所有的字元 'x' 取代為 'y'
s?cy 用 'y' 來取代所有字元為 'c' 者
@x 由字串中清除所有字元為 'x' 者
@?c 由字串中清除所有字元為 'c' 者
!y 拒絕執行字串中包含有 'y' 者
!?c 拒絕執行字串中包含在 class 'c' 中有定義的
/x 拒絕所有字串中未包含字元 'x' 者
/?c 拒絕除了字中包含 class 'c' 以外的所有字
=nx 拒絕除了 class 等於 'x' 以外的所有
=n?c 拒絕除了 class 'c' 以外的所有字
nb: 所有的字串都由位置(Position) 0 開始計算
用在上面所敘述的字元 class 的指令:
?? 相同於 '?'
?v 相同於 母音: "aeiouAEIOU"
?c 相同於 子音: "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ"
?w 相同於 空白符號: " \t"
?p 相同於 標點符號: ".,:;'\"?!`"
?s 相同於 一般符號: "$%^&*()-_+=|\\<>[]{}#@/~"
?l 相同於 小寫字母 ('a' to 'z')
?u 相同於 大寫字母 ('A' to 'Z')
?d 相同於 數字 ('0' to '9')
?a 相同於 字母 ('a' to 'z' and 'A' to 'Z')
?x 相同於 字母及符號 ('a' to 'z', 'A' to 'Z' and '0' to '9')
用來表示相反 class 的字元就用大寫的字母來表示,
例如: 用 ?d 來表示 '數字(DIGITS)', ?D 就表示 '非數字(NON-DIGITS)' 依此類推.
上面所敘述的只令是跟 Crack v4.1 相同的, 下面的則是 John 中所新增的 (作者說明
這些指令也許不是很有用處, 且大部分的東西在 Crack v4.1 也可以作得出來):
{ 字串左移: "jsmith" -> "smithj", etc
} 字串右移: "smithj" -> "jsmith", etc
Dn 刪除位置 n 的字元 (由 0 開始) 及把該字元後的字左移
P "crack" -> "cracked", etc (過去式, 只針對小寫)
G "crack" -> "cracking", etc (現在進行式, 只針對小寫)
~i 由鍵盤方式轉換大小寫(加 Shift 鍵): "Crack96" -> "cRACK(^", etc
~I 轉換大小寫: "Crack96" -> "cRACK96", etc
~v 將母音轉小寫: "Crack96" -> "CRaCK96", etc
~> 由鍵盤方式將所有字元右移: "Crack96" -> "Vtsvl07", etc
~< 由鍵盤方式將所有字元左移: "Crack96" -> "Xeaxj85", etc
特別針對 "single crack" 模式的指令有雙字串支援, 控制這些指令要套用指令時需要
用到下列的命令:
1 只有第一個字
2 只有第二個字
+ 包含兩個字 (必需只用在 '1' 或 '2' 之後, 也就是 1+2 或 2+1)
如果你在規則設定中使用了上述的指令, 將只會執行雙字串(全名, 由GECOS資料得來),
而放棄只有單一字串的字.
'+' 會假定在規則結尾使用這些命令的時候, 除非你用手動指定. 例如, '1l2u'會轉換
第一個字為小寫, 第二個字為大寫, 而且會把兩個字相連. 在使用 '+'時可能要應用一
些其它的指令: 在你分別應用一些指令來執行的時候 '1l2u+r' 會用相反順序來相連這
兩個字, .
[Crack v5.0 在作者更新 John 的時候還沒有發行, 所以作者使用一些自己的方法來擴
充規則語法. 事實上, 新版 Crack v5.0 的規則看起來像是多餘的, 或是跟作者已加在
John 裡的功能是相同的([ == D0, ] == rD0r, C == c~I, t == ~I, (x == =0x, )x
== r=0xr, 'n == x0n). 不一樣的規則為 %nx, or %n?c (拒絕執行,除非該字串最少包
含了有 n 個 'x' 字元, 或是 n 個 class 'c' 裡定義的字元).無論如何, 作者已經把
所有的功能都加在 John 裡面了, 基於相容性的理由. 請確定字首 '[' 及 ']' 加上了
'\'如果你有使用到的話, 因為他們已經用來控制其它的功能了. ]
如果一個規則 (命令列的一行) 沒有改變字, 那一個字將會被排除而不執行, 除非整個
規則包含了冒號 ':', 假設你加入了冒號 ':' 在你的規則定義中.
前置處理是用在組合類似的規則進入同一個來源. 如同範例, 如果你希望讓 John 嘗試
小寫密碼並加上數字, 你可以為每個數字定義一個規則, 總共有十個. 現在想像一下加
入兩位數字(號碼)--這樣設定檔會便得很大且會很難看.
用前置處理, 你可以很簡單的就作到這些事情: 很簡單的寫一個來源行, 包含這些規則
的共用部分, 在括號中寫出你要放進不同規則中的字元 (你必需要使用正規的表示法).
然後前置處理器就會在 John 啟始的時候產生你所要的規則, 像上面的範例一樣,
來源行會是 'l$[0-9]' (小寫字串, 並且加上數字) 及 'l$[0-9]$[0-9]' (小寫字串並
加上兩位數字). 這些來源行會分別的加到 10 及 100 規則. 總之, 前置處理的命令處
理順序是由又至左, 字元的處理順序則是由左至右, 在加入兩位數字這樣的例子中, 會
得到正常的順序. 注意我在這些範例中只用到字元範圍的形態 (由 A到Z 等的為範圍形
態), 但是你可以用字元列表來組合他們, 像'[aeiou]'會使用母音, 還有'[aeiou0-9]'
會使用母音跟數字.
有一些控制字元在規則裡 ('[' 括號用來啟始一個字元列表, '-' 表示一個包含在內的
範圍, 這一類的). 如果你希望把某一行放在設定檔裡面, 但是又不想使用他們的話,你
可以在前面加上 '\' 符號, 那會使 John忽略這一行不去執行. 還有, 如果你需要開始
一個前置處理表列在開始的一行中, 你將會用到 ':' 符號, 不然的話 John會認為它是
一個新節段的開始.
定義擴充模式
---------------
要定義一種擴充模式, 你需要建立一個節段叫作 [List.External:],
是你自己對這個模式定義的名稱. 這一個節段中必需要包含一些使用 C語言子集所寫的
函數, 當你在命令列使用這個模式的時候, John會編譯及使用這些程式, 編譯程式會產
生虛擬機械碼, 比任何直譯器或轉換程機器可執行碼來得好用 (現在只完成了 x86硬體
可使用的部分).
下面這些功能是一般會在 John 中使用到的:
init() 在啟始時呼叫, 會初始全域變數
filter() 在試每一個字串時呼叫, 可以將一些字串過濾掉
generate() 產生字串時呼叫, 當沒有使用其它的破解模式時
restore() 回復一個中斷的工作時呼叫
這些函數的型別都是 'void', 不需要引數(參數), 使用到了全域變數 'word' (已定義
為 'int word[16]'), 除了 init() 之外, 它在 'word'初始之前已經被呼叫了.'word'
變數包含了要試的字串(ASCII),filter()可以改變它, 或是0以外的, 可以用'word[0]'
來保留它. generate() 不能假設任何特殊值的 'word'當它被呼叫的時候, 但是可以將
它放在下一個將要試的字串, 或是0以外 'word[0]' 當破解工作結束的時候 (這將會引
起 John 結束執行). restore() 必需設定全域變數來繼續執行由支援的 'word' 字串.
你可以單獨使用任意一個擴充模式, 或跟其它某些模式一起使用, 在這個情況之下只有
init() 以及 filter() 會被使用到 (而且只有 filter() 是必需要的). 使用擴充模式
的過濾器跟其它的破解模式及 '-makechars'這個命令是相容的.
我們建議你不要使用filter(), 最少在使用擴充模式於你自己的 generate() 時不要過
濾太多的字, 最好的方法是改一下 generate() 使它不要產生會被過濾掉的字串.
就像作者在上面所提到過的, 編譯器支援了 C 語言的子集. John 是一個 cracker, 不
是一個編譯器, 所以我不認為它需要其它的東西. 這裡有一個列表, 列舉出 John 跟 C
編譯器功能上的差別:
- 只支援標準的功能, 你不能自行定義一個自己的;
- 只支援 'while' 的迴圈;
- 只支援 'int' 與 'void' 資料型別;
- 只支援單一十進位的陣列;
- 不支援結構化
- 不支援指標 (沒錯, 你有更多的陣列了呀);
- 大概還有些別的吧...
一些支援的功能與 C 語言不同的地方:
- 陣列名稱單獨參考到它的第一個基本元件而非這個陣列的位址(以 0 作啟始);
- '++' 跟 '--'運算元在表示式計算的時候執行, 而不是 pre/post-calculated; 這會
在 C 的很多例子中傳回相同的結果 (像在 C 語言跟 John 的編譯器中 'i = j++;'
都等於 'i = j; j = j + 1;'但是假如這些變數被應用不只一次的話, 傳回的結果會
跟 C不同 (如 'i = j++ - j++;' 在John中就等於 'i = j - (j + 1); j = j + 2;'
但是在 C 語言裡卻變成是 'i = j - j; j = j + 2;');
- 我希望沒有別的地方是不同的了...
無論如何, 強力的 C 語言語法結構 (所有整數運算元),'if'/'else' 跟 'while' 仍然
可以使用. 這對所有的小程式來講應該是足夠的了. 你可以看看在設定檔支援的範例檔
中的擴充模式範例.
==========
使用範例
==========
這些範例可以讓你瞭解使用 John 可以幫你作哪些事, 也許不夠明白的來表示該如何來
使用, 我只能試著來回答一些問題:
命令列
--------
1. 假設你剛得到一個密碼檔,'passwd.1', 且你想要試著破解它, 你可以使用 Singel
Crack" 模式:
john -single passwd.1
或者,你也可以使用簡寫(John在很多選項都有提供簡寫的方式,讓你很快的能夠完成輸入)
john -si passwd.1
如果你有很多的檔案要破解, 最好的方式就是一次讀進來:
john -single passwd.1 passwd.2
或者你也可以這樣:
john -single passwd.*
2. 現在, 當你已經破解了一些密碼, 這些已破的密碼將會存在~/john.pot 這個檔案裡
你可以瀏覽一下你所破解的密碼:
john -show passwd.1
如果這個列表超出了螢幕(解出了很多密碼??), 你可以使用下面這個輸出方式:
john -show passwd.1 | more
現在, 你可能會得到一些錯誤訊息告訴你有許多的帳號的 shell已經被取消掉了, 你可
以讓 John 修改這些字串 (假設 shell 名稱為 '/etc/expired'):
john -show -shells:!/etc/expired passwd.1
或是簡寫, 但是會跟 '/any/path/expired'有相同的效果:
john -show -shells:!expired passwd.1
或者, 你也想要修改其它的 shell 字串, 如 '/etc/newuser':
john -show -shells:!expired,!newuser passwd.1
檢查看看有沒有 root (uid 0) 帳號已經破解成功了:
john -show -users:0 passwd.1
或者, 檢查所有密碼檔中, 已破解的 root (uid 0) 帳號:
john -show -users:0 passwd.*
只顯示 root (login 'root') 帳號:
john -show -users:root passwd.1
3. 當你使用 "Single Crack"模式, 破解出來的帳號數目不是很多的時候, 你可以使用
較具威力的破解模式, 例如字典檔模式. 假設你的字典檔名為 'words.lst':
john -w:words.lst passwd.1
或者, 把規則破解模式也打開 (會更慢, 但是更具威力):
john -w:words.lst -rules passwd.1
要只破解擁有完整 shell 使用權的帳號 (一般來說, '-shells' 跟 '-users' 這兩個
過濾就可以完成你想要作的工作了, 在其它的破解模式也是一樣.
john -w:words.lst -rules -shells:sh,csh,tcsh,bash passwd.1
就跟其它的破解模式一樣, 你可以更快的破解一些檔案, 一次下達指令:
john -w:words.lst -rules passwd.*
可以只破解某些帳號. 像下面這個命令會試著破解具有 root (uid 0) 權限的帳號:
john -w:words.lst -rules -users:0 passwd.*
然而, 我不建議你只破解 root 的密碼, 因為那通常會比用系統安全漏洞來獲取 root
的權限花費更長的時間(通常不是在合理的時間內可以作到的), 如果你是用來試著破解
你自己主機上的密碼, 想要確定這些密碼不會被破解的話, 最好是選一個好一點的root
密碼, 然後只破解其它的.
有時把你的密碼檔分開兩部分並且分別進行破解是有用的, 就像:
john -w:words.lst -rules -salts:2 passwd.*
john -w:words.lst -rules -salts:!2 passwd.*
這會使 John 在試兩個或更多的帳號時動作快一點, 然後再試其它的總共需要的破解時
間將會差不多, 但是你會更容易的得到一些破解的帳號, 而且可能也不需要其它的. 還
有, 你可能想要用一個小一點的字典檔來試所有的帳號, 只有用這個方法你可以試得快
一點 (用 '-salts:2') 在一個大型的密碼檔上. 通常這是在使用 '-salts'大於 2 (有
時甚至高於 1000 都還可以執行), 為你的個別狀況進行調整吧.
注意你定義的字典檔規則第一行中包含了 ':' (表示 '試所有包含在列表中的字'), 如
果你已經執行了一個字典檔破解模式而沒有使用規則的話, 也確定你用相同的字典檔加
上規則來跑, 這一點要特別注意!!
4. John 裡最強的破解模式是增強模式, 你可以試著用這個指令跑跑看:
john -i passwd.1
這個指令會使用內定的增強模式的參數, 定義在 ~/john.ini's [Incremental:All] 這
一個節段中. 在設定檔中支援了這些參數使用所有 95 個字元集, 而且試所有長度的密
碼, 從 1 到 8 個字元. 不要預期這個模式的破解會在合理的時間內結束 (除非所有的
密碼都設得很容易破, 而且很快的被破解掉了).
在很多的情況之下, 當你破解一些簡單的密碼時, 使用其它定義好的增強模式會比較快
一些, 由限制字元集來著手. 下面的指令只會試 26 個字元組合排列方式, 由 1 到 8
個字元來算, 它將會嘗試由 'a' 到 'zzzzzzzz'的所有字:
john -i:alpha passwd.1
相同的, 你可以配合著增強模式只破解 root 帳號 及使用一些其它 John的功能, 這個
指令會試著破解所有的 root (uid 0) 帳號在所有的密碼檔中, 而且只有在這些產生的
相同 salts, 所以你得到最少兩倍的效率 -- 如果你有很多個密碼檔的話 (像 1000 個
密碼檔, 命名為 '*.pwd'), 否則就是沒有 root 在相同的 salts:
john -i -users:0 -salts:2 *.pwd
5. 如果你得到了一個密碼檔, 而且已經有很多個帳號已經破解了 (但你需要更多), 而
且這個密碼檔的密碼設定是相當罕見的,你可能會想要產生一個新的字元集檔案, 以
該密碼檔為基礎的字元集:
john -makechars:custom.chr passwd.1
然後把這個新的檔案用在增強模式中.
如果你由同一個國家得到很多個密碼檔的話, 也許可以把他們一起用來產生字元集檔案
這樣你可以用它來幫你破解出更多的密碼, 當然這個自元集日後也可以用在同一個國家
所得到的密碼檔上:
john -makechars:custom.chr passwd.1 passwd.2
<把你的 custom 增強模式定義在 ~/john.ini 中>
john -i:custom passwd.3
上面這個範例中, 我門假設 'passwd.1' 跟 'passwd.2' 這兩個密碼檔是來自同一個國
家, 而且你已經擁有很多破解過的密碼了, 而 'passwd.3' 也是從相同的國家來的, 你
現在正打算要破解它.
當你在產生一個新的字元集檔案的時候, 你可以使用一些已經定義好的, 或自行定義的
過濾器, 來產生一些簡單的字串:
john -makechars:my_alpha.chr -external:filter_alpha passwd.1
如果你的~/john.pot 設定檔已經很肥大的話 (或是你沒有的字元集檔案), 也許你會想
要使用它來產生新的字元集檔案:
john -makechars:all.chr
john -makechars:alpha.chr -external:filter_alpha
john -makechars:digits.chr -external:filter_digits
在上面的範例中, John 會覆寫已經存在的字元集檔(如果它們原先已經在你的目錄中的
話), 寫入的內容就是你在~/john.pot (John 使用整個檔案, 如果你沒有指定任何密碼
檔的話), 為了你的方便使用, 注意字串過濾的使用也定義在 ~/john.ini 之中.

    全站熱搜

    Neo Chao 發表在 痞客邦 留言(0) 人氣()