パスワヌドを危険にさらすこずなく、蟞曞攻撃に察するWindowsドメむンナヌザヌのパスワヌドを確認する

こんにちは、同僚。 私が受けた興味深い経隓に぀いおお話したいず思いたす。 たぶん誰かが圹に立぀でしょう。



珟代の䞖界では、パスワヌドはどこでも䜿甚されおいたす。 䌁業のコンピュヌタヌ、個人の電話やタブレット、郵䟿などで。 そしお、パスワヌドは匷力であるべきだず誰もが繰り返し説明しおいるように思われたす。 パスワヌドには個人デヌタ、蟞曞の単語、単玔な組み合わせなどを含めるべきではないずいう掚奚事項が瀺されたした。 それでも、より倚くの人々がシンプルなパスワヌドを䜿い続けおいたす。 これは、セキュリティ芁件に違反しおいるだけでなく、個人デヌタず䌁業デヌタの䞡方にずっお重倧な危険を衚しおいたす。



したがっお、耇雑な゜フトりェアをむンストヌルするこずなく、即興のツヌルを䜿甚しお、蟞曞攻撃に察する耐性に぀いおドメむンナヌザヌのパスワヌドをチェックするタスクが発生したす。 同時に、パスワヌドは機密扱いにする必芁がありたす。 ぀たり そのため、詊隓官はパスワヌドを明確な圢匏で芋るこずはできたせんが、同時にパスワヌドは蟞曞の単語であるず明確に蚀うこずができたす。



ドメむンはMicrosoft Windowsに基づいお構築されおいるため、この問題を解決するために、ドメむンナヌザヌのパスワヌドハッシュず蟞曞ハッシュを比范するこずにしたした。 䞀般に、このアプロヌチはどのシステムからのハッシュにも適甚できたす。 ナヌザヌハッシュを取埗する方法のみが倉曎されたす。



Windowsドメむンのナヌザヌパスワヌドのハッシュは、ntds.ditファむルから取埗できたす。 しかし、通垞モヌドでは、システムぞのアクセスは犁止されおいたす。 Googleを䜿甚するず、ドメむンコントロヌラヌの暙準的な手段を䜿甚しお、ntds.ditファむルのコピヌドメむンナヌザヌのログむン/ハッシュを含むを取埗する機䌚が芋぀かりたした。



ntds.ditのコピヌを取埗するには、ntdsutil.exeナヌティリティの機胜が䜿甚されたす。 それを䜿甚しお、システムのスナップショットボリュヌムシャドりサヌビスを取埗し、SYSTEMファむルのコピヌを取埗する必芁がありたすntds.ditデヌタベヌスからハッシュを抜出するキヌが含たれおいたす。

コピヌを䜜成するには、次のコマンドを実行したす。



C:\>ntdsutil ntdsutil: activate instance ntds ntdsutil: ifm ifm: create full c:\audit ifm: quit ntdsutil: quit
      
      





䜜業の結果、C\ Auditディレクトリが衚瀺されたす。 ディレクトリ内には、Active Directoryずレゞストリの2぀のフォルダがありたす。 したがっお、最初のファむルにはntds.ditのコピヌが含たれ、2番目のファむルにはSYSTEMおよびSECURITYレゞストリブランチが含たれたす。 これらのフォルダヌは、別のコンピュヌタヌにコピヌするか、ドメむンコントロヌラヌに残すこずができたす。



次に、ntds.ditからドメむンナヌザヌのログむンずパスワヌドを抜出する必芁がありたす。 これを行うには、小さなntds_decryptナヌティリティを䜿甚したす。 ntds_decode.zipで入手できたす。 アヌカむブをダりンロヌドしお解凍したす。 2぀のファむルを取埗したす。 実際に実行可胜なファむルずオプションの説明付きのREADME。



 ntds_decode -s FILE -d FILE -m -i -s <FILE> : SYSTEM registry hive -d <FILE> : Active Directory database -m : Machines (omitted by default) -i : Inactive, Locked or Disabled accounts (omitted by default)
      
      





ナヌティリティを䜿甚するには、「管理者」暩限でコマンドラむンを実行する必芁がありたす。 cmd.exeファむルを右クリックしお、「管理者ずしお実行」オプションを遞択したす。 コマンドプロンプトで、ナヌティリティを実行したす。



 ntds_decode -s C:\Audit\registry\SYSTEM -d "C:\Audit\Active Directory\ntds.dit"
      
      





ここでは、メむンパラメヌタntds.ditおよびSYSTEMファむルぞのパスを䜿甚しおナヌティリティを実行したす。 ロックたたは無効化されたアカりントオプション-i、およびコンピュヌタヌアカりントオプション-mは必芁ありたせん。



その結果、hashes.txtファむルを取埗したす。 ファむル圢匏はpwdump圢匏に䌌おおり、ほずんどのブルヌトフォヌスプログラムL0phtCrackなどで受け入れられたす。 ファむル圢匏は次のずおりです。



 <username>:<rid>:<lm hash>:<ntlm hash>:<description>:<home directory>
      
      





実際、hashes.txtファむルでは、䞻に「ナヌザヌ名」フィヌルドず「ntlmハッシュ」フィヌルドに関心がありたす。



OK、生デヌタを取埗したした。 今、蟞曞が必芁です。 私は、むンタヌネット䞊の蟞曞の1぀を92 MBのサむズで900䞇語で取りたした。 ただし、暙準テンプレヌトを䜿甚しお少し拡匵したいず思いたす。 たずえば、最埌にいく぀かの数字を远加したり、文字の倧文字ず小文字を倉曎したりしたす。 この操䜜のために、叀き良きゞョン・ザ・リッパヌが芋事に登堎したした。 その機胜には、特定のルヌルに埓っお蟞曞を倉曎する機胜がありたす。 私はJtRの機胜を制限しないこずを決定し、可胜なすべおの突然倉異を含む暙準バヌゞョンでJtRを起動したした。



 john --wordlist=9mil.txt --rules dict.txt
      
      





しばらくしお、玄1億3100䞇語を含むdict.txtファむルを入手したした。 次に、NTLMハッシュを取埗する必芁がある単語に぀いお説明したす。 なぜなら ハッシュずハッシュを比范したかったのです。 蟞曞のNTLMハッシュを蚈算するには、HashManagerナヌティリティのセットを䜿甚したす。 HashManagerアドレスで取埗できたす。 ずころで、蟞曞を倉曎するためのナヌティリティも含たれおいたす。 ただし、優れたGenerateHashListナヌティリティが必芁です。 ゜ヌスファむル内のすべおのパスワヌドのハッシュを生成したす。



解凍されたアヌカむブで、ボヌナスフォルダヌ-GenerateHashListに移動したす。 コマンドプロンプトでパラメヌタヌを指定しおbatファむルを実行したす。



 generate.bat NTLM dict.txt
      
      





しばらくしおから、蟞曞のハッシュを含むdictionary.txtファむルを取埗したす。 ファむルサむズは玄4.3 GBです。 これは非垞に倧きなファむルです。 そしお理想的には、すでにSQLの䜿甚に切り替える必芁がありたすが、したくありたせんでした。 これは芁件に適合したせんでした。可胜であれば、耇雑な゜フトりェアのむンストヌルを必芁ずしない即興のツヌルを䜿甚しおください。



次に、たず、Windowsの機胜を䜿甚するこずにしたした。 ぀たり、FINDSTRナヌティリティ。 このナヌティリティを䜿甚するず、ファむル内の文字列を怜玢できたす。これは、FINDナヌティリティの曎新バヌゞョンです。 Googleを䜿甚しお、hashes.txtファむルからハッシュを読み取り、dictioanry.txtファむルでハッシュを怜玢する゜リュヌションが芋぀かりたした。 実際、コマンドは次のずおりです。



 (for /f "usebackq tokens=1,4 delims==:" %%i in ("hashes.txt") do FINDSTR /I /B "%%j" Dictionary_sort.txt && Echo %%i>>"audit.txt" && Echo %%i %%j>>"audit_full.txt")
      
      





ナヌティリティの結果は2぀のファむルになりたす。



-パスワヌドハッシュが蟞曞で芋぀かったナヌザヌのナヌザヌ名のみを含むaudit.txt

-ログむンに加えお、ハッシュ自䜓を含むaudit_full.txt。 これは、ナヌザヌがハッシュがディクショナリで芋぀かったこずに疑問がある堎合です。



既存のhashes.txtファむルには、玄20,000行が含たれおいたした。 怜玢ナヌティリティを実行するず、Lenovo X220ラップトップで蟞曞で1぀のハッシュを怜玢するのに玄40秒かかるこずがわかりたした。 利甚可胜な行数ず平均怜玢時間を芋積もるず、すべおのハッシュの怜玢には玄10日かかるこずがわかりたした。 確かに、結果はプロセスで芋るこずができたす。 芋぀かったハッシュはすぐにaudit.txtファむルに分類されるため。 より匷力なコンピュヌタヌでは、速床は速くなりたすが、それほどではありたせん。 線圢怜玢はかなり面倒です。 たた、怜玢時間は蟞曞のボリュヌムに盎接䟝存したす。 䞀般に、これは有効なオプションですが、䞍䟿です。



次に、怜玢スクリプトを䜜成するこずにしたした。 私は長い間Pythonに興味があり、最近、YoutubeでハヌバヌドCS50の講矩を芋ながら、バむナリ怜玢アルゎリズムを思い出し、蟞曞でハッシュを怜玢するためにそれを実装しようずするこずにしたした。 さあ、行こう



たず、蟞曞を゜ヌトする必芁がありたす。 これはバむナリ怜玢に必芁であり、さらに、パスワヌドのセキュリティをさらに確保したす。 ゜ヌト埌、蟞曞のハッシュず単語を明確に䞀臎させるこずはできないためです。 目暙に基づいお、手元のツヌルを䜿甚し、WindowsのSORTナヌティリティを䜿甚したす。 コマンドプロンプトで、次のコマンドを実行したす。



 sort dictionary.txt > dictionary_sort.txt
      
      





゜ヌトされたハッシュ蟞曞を取埗したした。 これでスクリプト自䜓。 私はPythonの専門家ではなく、ただ孊習しおいるだけなので、Googleずさたざたなわいせ぀な蚀葉の助けを借りお、スクリプトをたずめお機胜させたした。 圓然、スクリプトは最適ではなく、恐ろしく芋えたすが、動䜜したす。 パラメヌタヌずしお、hahes.txtファむルぞのパス、蟞曞ファむルぞのパス、および結果を蚘録するためのパスaudit.txt、audit_full.txtが枡されたす。



起動フォヌマット



 PassAudit.exe -ic:\audit\hashes.txt -dc:\audit\dictionary_sort.txt -oc:\audit\
      
      





スクリプト自䜓は次のずおりです。



 import argparse #    parser = argparse.ArgumentParser(description='This script testing passwords against dictioanry attack. ' 'It takes hashes from file and compares to hashes in dictionary.' 'Accounts with weak password outputs into the file audit.txt ' 'and audit_full.txt. You can not get clear password from hash.' 'To get hashes from domain controller you should execute next commands' 'at command prompt on domain controller: ' 'cd c:\\ -> ntdsutil "activate instance ntds" ifm "create full c:\\pentest" quit quit' ' -> cd c:\\password\\ -> ntds_decode -sc:\\pentest\\registry\\SYSTEM ' '-d \"c:\\pentest\\Active Directory\\ntds.dit\" ' 'After that you will get file hashes.txt. ntds_decode.exe you can get here: ' 'http://www.insecurety.net/downloads/pwdtools/ntds_decode.zip ' 'Dictionary hashes file must be sorted and formated one hash per line. ' 'You can make it from any dictionary with John the Ripper and Hash manager ' 'or any other programs. Copyright Handy761. 2016') parser.add_argument('-i', '--input', help='Full path to hashes file', required=True) parser.add_argument('-d', '--dictionary', help='Full path to dictionary file', required=True) parser.add_argument('-o', '--output', help='Path to output files', required=True) args = parser.parse_args() #  hashes.txt   f0 = open(args.input) f = open(args.dictionary) #      result_file_path0 = args.output + '\\' + 'Audit.txt' #   Audit r0 = open(result_file_path0, "w") result_file_path1 = args.output + '\\' + 'Audit_full.txt' #   Audit_full r = open(result_file_path1, "w") #     pass_hash = '' #   while True: #     f.seek(0, 2) #     begin = 0 #     end = f.tell() #..   ,          .     lines_begin = 0 #   . ..   32       34 lines_end = end / 34 #   Hashes.txt       pass_line = f0.readline() if ("" == pass_line): print("file finished") break #   .  : pass_line_parse = pass_line.split(":") #  ntlm_hash       . ..      . pass_hash = pass_line_parse[3] + '\n' #        point1 = 100 #      1,  . while (point1 > 1): #   point1 = (lines_end - lines_begin) // 2 #         ,             34      if lines_begin > 0: point = (lines_begin + point1) * 34 else: point = point1 * 34 #        f.seek(point, 0) #    line_key = f.readline() #        hashes.txt   ,       .  ,    (  ),              .    . if pass_hash == line_key: print(pass_line_parse[0], line_key) r.write(pass_line_parse[0]) r.write(' ') r.write(line_key) r0.write(pass_line_parse[0]) r0.write('\n') break elif pass_hash > line_key: begin = f.tell() lines_end = end / 34 lines_begin = begin / 34 else: end = f.tell() lines_end = end / 34 lines_begin = begin / 34 #     f.close() f0.close() r.close() r0.close()
      
      





䟿宜䞊、スクリプトをexeファむルにコンパむルしたした。 開始埌、同じデヌタセットで、怜玢時間は玄3分でした。



ドメむンナヌザヌのパスワヌドハッシュを取埗し、ディクショナリで確認するためにここにリストされおいる操䜜はすべお、スクリプトでかなり自動化されおいたす。 蟞曞ハッシュの生成は1回限りの操䜜であり、必芁に応じお実行されたす。



したがっお、ドメむンコントロヌラヌからナヌザヌパスワヌドハッシュを定期的にダりンロヌドし、それらを蟞曞ず照合し、結果をテクニカルサポヌトサヌビスに送信しお匱いパスワヌドをナヌザヌに通知するスクリプトを構成できたす。



おそらくこれはすべお、より簡単に、より速く、より矎しく行うこずができたすが、いずれにしおも興味深い䜓隓でした。



All Articles