çŸä»£ã®äžçã§ã¯ããã¹ã¯ãŒãã¯ã©ãã§ã䜿çšãããŠããŸãã äŒæ¥ã®ã³ã³ãã¥ãŒã¿ãŒãå人ã®é»è©±ãã¿ãã¬ãããéµäŸ¿ãªã©ã§ã ãããŠããã¹ã¯ãŒãã¯åŒ·åã§ããã¹ãã ãšèª°ããç¹°ãè¿ã説æããŠããããã«æãããŸãã ãã¹ã¯ãŒãã«ã¯å人ããŒã¿ãèŸæžã®åèªãåçŽãªçµã¿åãããªã©ãå«ããã¹ãã§ã¯ãªããšããæšå¥šäºé ã瀺ãããŸããã ããã§ããããå€ãã®äººã ãã·ã³ãã«ãªãã¹ã¯ãŒãã䜿ãç¶ããŠããŸãã ããã¯ãã»ãã¥ãªãã£èŠä»¶ã«éåããŠããã ãã§ãªããå人ããŒã¿ãšäŒæ¥ããŒã¿ã®äž¡æ¹ã«ãšã£ãŠé倧ãªå±éºãè¡šããŠããŸãã
ãããã£ãŠãè€éãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããããšãªããå³èã®ããŒã«ã䜿çšããŠãèŸæžæ»æã«å¯Ÿããèæ§ã«ã€ããŠãã¡ã€ã³ãŠãŒã¶ãŒã®ãã¹ã¯ãŒãããã§ãã¯ããã¿ã¹ã¯ãçºçããŸãã åæã«ããã¹ã¯ãŒãã¯æ©å¯æ±ãã«ããå¿ èŠããããŸãã ã€ãŸã ãã®ãããè©Šéšå®ã¯ãã¹ã¯ãŒããæ確ãªåœ¢åŒã§èŠãããšã¯ã§ããŸããããåæã«ãã¹ã¯ãŒãã¯èŸæžã®åèªã§ãããšæ確ã«èšãããšãã§ããŸãã
ãã¡ã€ã³ã¯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åéãã®æäœã§ãããå¿ èŠã«å¿ããŠå®è¡ãããŸãã
ãããã£ãŠããã¡ã€ã³ã³ã³ãããŒã©ãŒãããŠãŒã¶ãŒãã¹ã¯ãŒãããã·ã¥ãå®æçã«ããŠã³ããŒãããããããèŸæžãšç §åããçµæããã¯ãã«ã«ãµããŒããµãŒãã¹ã«éä¿¡ããŠåŒ±ããã¹ã¯ãŒãããŠãŒã¶ãŒã«éç¥ããã¹ã¯ãªãããæ§æã§ããŸãã
ããããããã¯ãã¹ãŠãããç°¡åã«ãããéããããçŸããè¡ãããšãã§ããŸããããããã«ããŠãèå³æ·±ãäœéšã§ããã