From b11e2cd6b4725de263c12203ac07a19a83e32e2e Mon Sep 17 00:00:00 2001 From: SoberBluee <49061190+SoberBluee@users.noreply.github.com> Date: Fri, 25 Feb 2022 14:08:13 +0000 Subject: [PATCH] rainbowtable and multiple hash rainbow table using rainbowcrack implemented Multiple hash crack implemented --- 1693a7fa5b5993d87647a2d92c709c5c.png | Bin 0 -> 33024 bytes AppData/result10.txt | 2 + AppData/result11.txt | 2 + AppData/result12.txt | 2 + AppData/result4.txt | 2 + AppData/result5.txt | 2 + AppData/result6.txt | 2 + AppData/result7.txt | 2 + AppData/result8.txt | 2 + AppData/result9.txt | 2 + AttackAlgorithms/BruteForceAttackAlgorithm.py | 6 +- .../BruteForceAttackAlgorithm.cpython-38.pyc | Bin 3278 -> 3154 bytes .../DictionaryAttackAlgorithm.cpython-38.pyc | Bin 2537 -> 2539 bytes .../HybridAttackAlgorithm.cpython-38.pyc | Bin 3251 -> 3241 bytes .../RulebasedAttackAlgorithm.cpython-38.pyc | Bin 3308 -> 3230 bytes GUIDesign.py | 197 ++++++++++++++---- Rainbowcrack/start.bat | 2 + test_data.txt | 2 + 18 files changed, 176 insertions(+), 49 deletions(-) create mode 100644 1693a7fa5b5993d87647a2d92c709c5c.png create mode 100644 AppData/result10.txt create mode 100644 AppData/result11.txt create mode 100644 AppData/result12.txt create mode 100644 AppData/result4.txt create mode 100644 AppData/result5.txt create mode 100644 AppData/result6.txt create mode 100644 AppData/result7.txt create mode 100644 AppData/result8.txt create mode 100644 AppData/result9.txt create mode 100644 Rainbowcrack/start.bat create mode 100644 test_data.txt diff --git a/1693a7fa5b5993d87647a2d92c709c5c.png b/1693a7fa5b5993d87647a2d92c709c5c.png new file mode 100644 index 0000000000000000000000000000000000000000..946ccd5779dda40c4b786bb277c8faadf4eb409d GIT binary patch literal 33024 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≪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 Uk9Hpq19dVzUHx3vIVCg!017<?h5!Hn literal 0 HcmV?d00001 diff --git a/AppData/result10.txt b/AppData/result10.txt new file mode 100644 index 0000000..fb99623 --- /dev/null +++ b/AppData/result10.txt @@ -0,0 +1,2 @@ +1111 +0.0100 \ No newline at end of file diff --git a/AppData/result11.txt b/AppData/result11.txt new file mode 100644 index 0000000..3b2f75a --- /dev/null +++ b/AppData/result11.txt @@ -0,0 +1,2 @@ +123 +0.0020 \ No newline at end of file diff --git a/AppData/result12.txt b/AppData/result12.txt new file mode 100644 index 0000000..fb99623 --- /dev/null +++ b/AppData/result12.txt @@ -0,0 +1,2 @@ +1111 +0.0100 \ No newline at end of file diff --git a/AppData/result4.txt b/AppData/result4.txt new file mode 100644 index 0000000..e08b91e --- /dev/null +++ b/AppData/result4.txt @@ -0,0 +1,2 @@ +123 +0.5355 \ No newline at end of file diff --git a/AppData/result5.txt b/AppData/result5.txt new file mode 100644 index 0000000..58fec93 --- /dev/null +++ b/AppData/result5.txt @@ -0,0 +1,2 @@ +123 +0.5455 \ No newline at end of file diff --git a/AppData/result6.txt b/AppData/result6.txt new file mode 100644 index 0000000..6911ace --- /dev/null +++ b/AppData/result6.txt @@ -0,0 +1,2 @@ +123 +0.5365 \ No newline at end of file diff --git a/AppData/result7.txt b/AppData/result7.txt new file mode 100644 index 0000000..3b2f75a --- /dev/null +++ b/AppData/result7.txt @@ -0,0 +1,2 @@ +123 +0.0020 \ No newline at end of file diff --git a/AppData/result8.txt b/AppData/result8.txt new file mode 100644 index 0000000..fb99623 --- /dev/null +++ b/AppData/result8.txt @@ -0,0 +1,2 @@ +1111 +0.0100 \ No newline at end of file diff --git a/AppData/result9.txt b/AppData/result9.txt new file mode 100644 index 0000000..3b2f75a --- /dev/null +++ b/AppData/result9.txt @@ -0,0 +1,2 @@ +123 +0.0020 \ No newline at end of file diff --git a/AttackAlgorithms/BruteForceAttackAlgorithm.py b/AttackAlgorithms/BruteForceAttackAlgorithm.py index 944e95e..1eb738b 100644 --- a/AttackAlgorithms/BruteForceAttackAlgorithm.py +++ b/AttackAlgorithms/BruteForceAttackAlgorithm.py @@ -97,13 +97,10 @@ class BruteForceAttackAlgorithm(): #Compare passwords to check if it has cracked if(hash == self.hash_to_crack): - print(f"Found Password: {password}") - #stops and prints timer self.end = time.time() self.time = self.end - self.start - print('{:.4f} seconds'.format(self.time)) - + #saves result to file self.save_output(password) self.found.set() @@ -147,7 +144,6 @@ class BruteForceAttackAlgorithm(): returns: none """ def main(self): - print(" -= Starting brute force =- ") self.brute_force() diff --git a/AttackAlgorithms/__pycache__/BruteForceAttackAlgorithm.cpython-38.pyc b/AttackAlgorithms/__pycache__/BruteForceAttackAlgorithm.cpython-38.pyc index e9813cf3c3f96bc86fb442f95588584f6285ca23..dcdd3951d7376c0a28ad7156ebb0d5f21cedfd55 100644 GIT binary patch delta 353 zcmX>nc}apVl$V!_fq{WRa-w+BFX4@R0?eH8&P9pI*{MbGo7I^=v+!(VU|^_WOkvDs zDoUHI#-UrERKmJ|bs<9yLp)mzLly|LOMrN+H4F<lYM2%>GBVUKWN|LwTFAi2kirnm zP{Liqki}EOki`q4#TlBJTo_`_YFTSoL1NjgMUx;b35HtM8m1bCEWR36Nd|F-TDBU7 z1^hLPDa;ZKHEau+7#RwyQWzwH88lh^iWnIf7^+x9L)>&NiWC_b7&HYYYjLXb7x6PN zFck5D2wnyThRL~{xpJlq3=EMB3=G8zAfGaEFmiz~BL_1V6Bi@j<UgFZ8BHhO;L>BP zoy^W1Daix!Fv9`{nDdK7LB=x{Sx;WTEz3IzWDpa`AjT@W$&JiXlb><>af7TVvIf~| PGufWUgi&R32~QLNSw=}9 delta 501 zcmca4aZZvil$V!_fq{YHS08UutH?$^0cK7G=c2^q?9?KK&FajbS$M86Ffi0GrZ8qR z6}3!O<It^dC}B-uu3?(ZFqf&Bk&&T<Z2{Xth8l)=_8NvP5ay5o@z_dOQ&<*o)-YtT zEo20#t6^BcRl~H9k&&T>A&Ywf&q4-9h7^Wih7#TyhAh4shAe&%EzZ!)<iZeZR?Aw$ z3KGj^E!qHKNifv1)-csDL}Urnuu3wBGt{!xFf0(PVN79_V5nhR$i&D{I0Iy$CYxUo zBLf3N6>DgSo32HbfLnfPUW!6MVsUYKeo=~*LKR=Nm7YmjtwM2Xa(-S)agibe1B0f} z<X0T3a<^CuiZb&`iuf5A7>f8n1TO;v!!5S7{G!~%lF4$Mxk}~?3=EMB3=G98pnzlI zVB`W}Mh<2!Mm`W`6qvk{^ERXT<W?>{#)ipTxFT~z7#J8z7*b&2zzFlZCX-*4l!C58 za7kiONoHQULQ+v_Nvc9xeo=C&g06xlQ;{*q3AP|Y5=02W31N`4SaK6H^QMB_!UA#& jBL`!Z+~h`PsmWQ~e%v5;7J;?eO+L(R!l*v^2X_<zNTqWX diff --git a/AttackAlgorithms/__pycache__/DictionaryAttackAlgorithm.cpython-38.pyc b/AttackAlgorithms/__pycache__/DictionaryAttackAlgorithm.cpython-38.pyc index 536f3abf7bd80fe79e64fabbcb2253894f9dab36..017b382c559c03ef386c268f988aaea0db6a1980 100644 GIT binary patch delta 68 zcmaDU{92eVl$V!_fq{YH?lY0365fe?M;Vt-ywb;{p}9GU(TI^V-nl3-IXkr|e)C+W Zy{wGPlcPBnGiFTw&#{70Zt@CFM*!=37FhrQ delta 65 zcmaDY{8E@Nl$V!_fq{V`Gng;w56?utql`-@Ug_JM!f3?Eso-3cn4Fzjq_BBD(_U6a Wrpd7!iy6}=GjgtAl%2ea(-8oVzZ3`n diff --git a/AttackAlgorithms/__pycache__/HybridAttackAlgorithm.cpython-38.pyc b/AttackAlgorithms/__pycache__/HybridAttackAlgorithm.cpython-38.pyc index 4d7b257640ad0ef285e8c36ef0b3c1c0e958acbe..d840adcb44ed8f9669528620fd80b7d397485cb1 100644 GIT binary patch delta 183 zcmdlixl)oZl$V!_fq{Wxf`@1lztBd$A55I_&P9pI*{MbGoB5gJS$Q@vFfi0GWHGof z#4ed!#i3+T!?J*BAww-o4a)-N6vl;&wX8J^3s@F1)UwsEEnux-UC7ADP{X!>Z6QM~ zYYl4+Ll%2BQxRJU$K*R4s*D_ynK%<BXL4$>-(oE&%FHX7JejjcKndgoMlL2UCKg66 kCJv^_hFq^1nI_9}*D{(;p3SYq*fMz^_hv@E$wfSl0N6n;SpWb4 delta 201 zcmZ1}xml7gl$V!_fq{WRHHj~&R&XQV4<=3p=c2^q?9?KK&HT*qtUNmy7#M08vKU+# zV%JQr;!tuZVX9$iW@KcjVOhYukfD~PhGhXu3gbe?TGkqd1*{7hYT0Vo7O>T@E(EDz zTfn}Mp_a9VwT2;!Bb%v+t%Pav6%JKKrpdoJ64-CC78GUXl}wJ})SBGQ*(0O^atb3C zBNr13BNr0~69?mDb*|T}j6950%9Hb1#U|@=Co>vNp2)4l*gSa)_hv@k$r(J30NiOY A^Z)<= diff --git a/AttackAlgorithms/__pycache__/RulebasedAttackAlgorithm.cpython-38.pyc b/AttackAlgorithms/__pycache__/RulebasedAttackAlgorithm.cpython-38.pyc index 4dec736bcba875dcd3b2539c77d4c7ffdfcffa7c..f706e5178d0bb5aa5c8f4369b6f792bb727c52a4 100644 GIT binary patch delta 194 zcmaDOIZu)=l$V!_fq{YHT(ww|pwLFXZ;YJr&P9pI*{MbGn|YZESos_n85n99vKU+# zCNRbtP3~sjVN}DsfIWqCA!99T4Z{MCg$%W9HEatwYgiXDGBVV#E#O+nP|I4wTEmdV zoy}ClR>G6QHF+Y3GBZyK_vGyy>Wn;-?{mmb*5C}D+{CHEev7rBC^N5Q@-og2MyJX8 wT!xd=xNh^-GcYg|^MG8&$i+C>kGq%AX7U|wCB}})|G8H(n{aSWUd`hO0JI%6Y5)KL delta 293 zcmbOy`9_j2l$V!_fq{WxbqsIPX5o!|-xxU+oQo2Zvr~%{HuEwSu=2$)GBDIIWHGof zOkj-lo7~O5!>@$BhB<{(oS~VKk)eh;g)5t>=w1nX3O9tmfFp%xA!99T4Z{M?g$%W9 zHEavGYFHP7)Uqw$UdT|(TEkkykj0bDRK!-op29o1ltY=BJ%w-bYz}oVe!n6{1_p*( zj5)U$OK&lz++s}r#i&vw%D}+zi!rW9o`HcOO3K{S%pfr-IWZ|YB{45EH3vc(8(5e| zaTe$2rj}%6=A}=5z!A*GT2PdkS2Ed%Q+0A2X9uIl<ma4*%sfmSlSR4i@wPB9FckBE he9y?mG>N;H(Q<Mhw-V#D$s4&>GFx&8O^)Sp1OS4@PPza9 diff --git a/GUIDesign.py b/GUIDesign.py index 928a03f..6928c0b 100644 --- a/GUIDesign.py +++ b/GUIDesign.py @@ -12,7 +12,6 @@ import os import multiprocessing from multiprocessing import Process, Event import random -import psutil import subprocess #PyQt6 imports @@ -102,9 +101,9 @@ class BruteForceWorker(QRunnable): with open(filename, "r") as result: for idx, data in enumerate(result): if(idx == 1): - self.output.append(f" {data} sec") + self.output.append(f"\t -= {data} sec =-") else: - self.output.append(f" Password: {data}") + self.output.append(f"\t -= Password found: {data} =-") """ Name: brute_force_cpu @@ -115,6 +114,7 @@ class BruteForceWorker(QRunnable): def brute_force_cpu(self): #data with starting points data = self.split_data() + #found event triggered when password found self.found = Event() #creates processes passing in needed data @@ -124,7 +124,7 @@ class BruteForceWorker(QRunnable): #Creating process using the dictionary main function p = multiprocessing.Process(target=dictionary.main) - self.output.append(f" -= Starting process {i} =-") + self.output.append(f"\t-= Starting process {i} =-") self.process_list.append(p) #Starts processes @@ -136,7 +136,7 @@ class BruteForceWorker(QRunnable): #Terminates processes for process in self.process_list: - print("Terminating") + print("\t-= Terminating =-") process.terminate() #Waits for processes to finish terminating @@ -145,7 +145,8 @@ class BruteForceWorker(QRunnable): #Finishing up self.process_result() - self.output.append(" Attack Finished ") + self.output.append("\t-= Attack Finished =- ") + self.process_list.clear() print("Done") """ @@ -163,15 +164,30 @@ class BruteForceWorker(QRunnable): """ Name: run - Description: Starts brute force attack using process amount with process terminatation(syncronisation) + Description: Starts brute force attack selecting the CPU and check for a hash_file Parameters: self returns: none """ def run(self): - self.output.append("-= Starting Brute Force Attack =-") - if(self.attack_options.cpu): - self.output.append(" Using CPU") - self.brute_force_cpu() + hash_file = list() + #if there is no has file then run single hash crack + if(self.attack_options.hash_file_location == ""): + self.output.append("-= Starting Brute Force Attack =-") + if(self.attack_options.cpu): + self.output.append(" Using CPU") + self.brute_force_cpu() + else: + with open(self.attack_options.hash_file_location) as file: + hash_file = [line.strip() for line in file] + + for hash in hash_file: + self.attack_options.hash_value = hash + self.output.append("-= Starting Brute Force Attack =-") + if(self.attack_options.cpu): + self.output.append("\tUsing CPU") + self.brute_force_cpu() + + """ Class Name: DictionaryWorker @@ -307,11 +323,11 @@ class DictionaryWorker(QRunnable): Parameters: self returns: none """ - def pause_process(self): - print("Pauseing Application") - for id in self.pid: - p = psutil.Process(id) - p.suspend() + # def pause_process(self): + # print("Pauseing Application") + # for id in self.pid: + # p = psutil.Process(id) + # p.suspend() """ Name: resume_process @@ -319,23 +335,36 @@ class DictionaryWorker(QRunnable): Parameters: self returns: none """ - def resume_process(self): - print("Resuming Application") - for id in self.pid: - p = psutil.Process(id) - p.resume() + # def resume_process(self): + # print("Resuming Application") + # for id in self.pid: + # p = psutil.Process(id) + # p.resume() """ Name: run - Description: Starts dictionary attack selecting the CPU + Description: Starts dictionary attack selecting the CPU and check for a hash_file Parameters: self returns: none """ def run(self): - self.output.append("-= Starting Dictionary Attack =-") - if(self.attack_options.cpu): - self.output.append(" Using CPU") - self.dictionary_cpu() + hash_file = list() + #if there is no has file then run single hash crack + if(self.attack_options.hash_file_location == ""): + self.output.append("-= Starting Dictionary Attack =-") + if(self.attack_options.cpu): + self.output.append(" Using CPU") + self.dictionary_cpu() + else: + with open(self.attack_options.hash_file_location) as file: + hash_file = [line.strip() for line in file] + + for hash in hash_file: + self.attack_options.hash_value = hash + self.output.append("-= Starting Dictionary Attack =-") + if(self.attack_options.cpu): + self.output.append("\tUsing CPU") + self.dictionary_cpu() """ Class Name: HybridWorker @@ -487,15 +516,29 @@ class HybridWorker(QRunnable): """ Name: run - Description: Starts hybrid attack selecting the CPU + Description: Starts hybrid attack selecting the CPU and check for a hash_file Parameters: self returns: none """ def run(self): - self.output.append("-= Starting Hybrid Attack =-") - if(self.attack_options.cpu): - self.output.append(" Using CPU") - self.hybrid_cpu() + hash_file = list() + #if there is no has file then run single hash crack + if(self.attack_options.hash_file_location == ""): + self.output.append("-= Starting Hybrid Attack =-") + if(self.attack_options.cpu): + self.output.append(" Using CPU") + self.hybrid_cpu() + else: + with open(self.attack_options.hash_file_location) as file: + hash_file = [line.strip() for line in file] + + for hash in hash_file: + + self.attack_options.hash_value = hash + self.output.append("-= Starting Hybrid Attack =-") + if(self.attack_options.cpu): + self.output.append("\tUsing CPU") + self.hybrid_cpu() """ Class Name: RuleBasedWorker @@ -651,14 +694,28 @@ class RuleBasedWorker(QRunnable): """ Name: run - Description: Starts rule based attack selecting the CPU + Description: Starts rule based attack selecting the CPU and check for a hash_file Parameters: self returns: none """ def run(self): - if(self.attack_options.cpu): - self.output.append(" Using CPU") - self.rulebase_cpu() + hash_file = list() + if(self.attack_options.hash_file_location == ""): + self.output.append("-= Starting Rule-Based Attack =-") + if(self.attack_options.cpu): + self.output.append(" Using CPU") + self.rulebase_cpu() + else: + with open(self.attack_options.hash_file_location) as file: + hash_file = [line.strip() for line in file] + + for hash in hash_file: + + self.attack_options.hash_value = hash + self.output.append("-= Starting Hybrid Attack =-") + if(self.attack_options.cpu): + self.output.append("\tUsing CPU") + self.rulebase_cpu() """ Class Name: RainbowTableWorker @@ -669,13 +726,61 @@ class RainbowTableAttack(QRunnable): def __init__(self, attack_options, output): self.attack_options = attack_options self.output = output; + self.filename = "C:\\Users\\ethan\\OneDrive\\Desktop\\Year3\\DSP\\Password_Cracker_App\\Rainbowcrack\\start.bat" + self.bat = None + + """ + Name: add_hash_to_bat + Description: Will add the input hash value to the bat file + Parameters: self + returns: none + """ + def add_hash_to_bat(self): + with open(self.filename, "r") as file: + self.bat = file.read() + + self.bat= self.bat.replace("HASH", self.attack_options.hash_value) + + with open(self.filename, "w") as file: + file.write(self.bat) + + """ + Name: remove_hash_from_bat + Description: Will add the HASH keyword back to the bat file for future attacks + Parameters: self + returns: none + """ + def remove_hash_from_bat(self): + with open(self.filename, "r") as file: + self.bat = file.read() + + self.bat = self.bat.replace(self.attack_options.hash_value, "HASH") + + with open(self.filename, "w") as file: + file.write(self.bat) + """ + Name: rainbowtable_cpu + Description: Will start the rainbow table attack using RainbowCrack through a bat file + Parameters: self + returns: none + """ def rainbowtable_cpu(self): - command = f"Rainbowcrack/rtgen -h {self.attack_options.hash}" - attack = subprocess.Popen() + #Add hash value to bat file + self.add_hash_to_bat() + #Start attack from a bat file + p = subprocess.Popen(self.filename, stdout=subprocess.PIPE, shell=True) + p.wait() + result = p.stdout.read() + #remove hash value from bat file + self.remove_hash_from_bat() + #process output of command prompt + self.output.append(result.decode()) + self.output.append("-= Rainbow Crack output =-") + + def run(self): - # if(self.attack_options.cpu): self.output.append(" Using CPU") self.rainbowtable_cpu() @@ -733,7 +838,9 @@ class Ui_App(object): """ def setupUi(self, App): App.setObjectName("App") - App.resize(1012, 696) + App.setFixedSize(1012, 696) + + palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(0, 120, 215)) brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) @@ -1148,6 +1255,7 @@ class Ui_App(object): elif(attack_selection == "Rainbow Table"): self.wordlistFrame.setEnabled(True) self.charsetFrame.setEnabled(False) + self.attackOptionsBtn.setEnabled(False) self.wordlistLbl.setText("Rainbow table") elif(attack_selection == "Markov Chain"): @@ -1206,7 +1314,9 @@ class Ui_App(object): #Open file dialog box hash_file = QtWidgets.QFileDialog.getOpenFileName(None, 'Open password file', 'C:\\', '*.txt') #set text edit to wordlist location - self.hash_file_location = self.hashInputTxt.insertPlainText(hash_file[0]) + self.hashInputTxt.insertPlainText(hash_file[0]) + self.hash_file_location = hash_file[0] + print(self.hash_file_location) """ Name: _browseWordlist @@ -1336,11 +1446,10 @@ class Ui_App(object): self.output.append(f" - Rainbowtable: {self.attack_options.wordlist_location}") self.output.append(f" - Processes: {self.attack_options.core_count}") - pool = QThreadPool.globalInstance() - self.worker = RainbowTableAttack(self.attack_options, self.output) + rainbowtable=RainbowTableAttack(self.attack_options, self.output) + rainbowtable.run() - pool.start(self.worker) - + if(self.attack_options.attack_type == "Markov Chain"): self.output.append(" Starting Attack ") self.output.append(f" - Hash: {self.attack_options.hash_value}") diff --git a/Rainbowcrack/start.bat b/Rainbowcrack/start.bat new file mode 100644 index 0000000..31af342 --- /dev/null +++ b/Rainbowcrack/start.bat @@ -0,0 +1,2 @@ +cd C:\\Users\\ethan\\OneDrive\\Desktop\\Year3\\DSP\\Password_Cracker_App\\Rainbowcrack +rcrack.exe . -h HASH \ No newline at end of file diff --git a/test_data.txt b/test_data.txt new file mode 100644 index 0000000..381793e --- /dev/null +++ b/test_data.txt @@ -0,0 +1,2 @@ +40BD001563085FC35165329EA1FF5C5ECBDBBEEF +011C945F30CE2CBAFC452F39840F025693339C42 \ No newline at end of file -- GitLab