Skip to content

Instantly share code, notes, and snippets.

@DinisCruz
Last active October 1, 2021 05:11
Show Gist options
  • Select an option

  • Save DinisCruz/6212171 to your computer and use it in GitHub Desktop.

Select an option

Save DinisCruz/6212171 to your computer and use it in GitHub Desktop.
H2 script - Generate Small MD5 Rainbow Table
var topPanel = "{name}".popupWindow(700,200);
//var topPanel = panel.clear().add_Panel();
"Loading data".info();
var baseFolder = @"C:\Users\o2\AppData\Roaming\OWASP_O2_Platform_5.3\8_12_2013\MD5_Hashes";
var md5HashesFile = baseFolder.pathCombine("(10x numbers - 2x length) M5_for_10_chars_with_2_depth.txt");
var md5Hashes = md5HashesFile.fileContents();
var mappings = new Dictionary<string,string>();
foreach(var line in md5Hashes.lines())
{
var splittedline = line.split("\t");
mappings.Add(splittedline[0], splittedline[1]);
}
"There were {0} hashes loaded".info(md5Hashes.size());
var result = topPanel.add_Label("(click Go)").fill().font_bold().font("Arial",40).text_Center();
Action<string> resolveHash =
(md5Hash)=> {
var value = mappings.value(md5Hash);
if(value.isNull())
result.set_Text("(no match)").pink();
else
result.set_Text(value).green();
};
topPanel.insert_Above(5);
topPanel.insert_Above(25)
.add_LabelAndTextAndButton("Hash to solve", // label text
"FBD7939D674997CDB4692D34DE8633C4", // initial value
"Go", // button text
resolveHash); // onButtonClick callback
return "done";
//var topPanel = "{name}".popupWindow(700,400);
var topPanel = panel.clear().add_Panel();
//var rainbowTable = new Dictionary<string,string>();
var values = new List<string>();
var md5RainbowTable = new StringBuilder();
Func<string,int, string> appendPayload = null; // only this is needed here, since it is the only Lambda that is recursive
Func<string> generatePayloads = null;
Func<string> generateMd5s = null;
Func<string> saveMD5s = null;
var targetFolder = "MD5_Hashes".tempDir(false);
var targetChars = "01234567890"; // max depth in 32bit process of 6
//var targetChars = "01234567890qwertyuiopasdfghjklzxcvbnm"; // max depth in 32bit process of 4
var maxDepth = 6;
appendPayload =
(seed, depth)=>{
if (depth <1)
return seed;
foreach(var @char in targetChars)
{
var newValue = "{0}{1}".format(seed, @char);
values.Add(appendPayload(newValue, depth -1));
}
//GC.Collect();
return seed;
};
generatePayloads =
()=>{
var start = DateTime.Now;
appendPayload("",maxDepth);
return (DateTime.Now - start).TotalSeconds.str();
};
generateMd5s =
()=>{
var start = DateTime.Now;
foreach(var value in values)
md5RainbowTable.Append("{0}\t{1}\r\n".format(value.md5Hash(), value));
return (DateTime.Now - start).TotalSeconds.str();
};
saveMD5s =
()=>{
var start = DateTime.Now;
var fileName = targetFolder.pathCombine("M5_for_{0}_chars_with_{1}_depth.txt".format(targetChars.size(), maxDepth));
md5RainbowTable.str().saveAs(fileName);
"{0} payloads saved to: {1}".info(values.size(), fileName);
return (DateTime.Now - start).TotalSeconds.str();
};
var duration_GeneratePayloads = generatePayloads().info();
var duration_generateMd5s = generateMd5s().info();
var duration_saveMD5s = saveMD5s().info();
targetFolder.startProcess();
return "Completed: for {0} values, the Generation took {1}s the MD5s took {2}s, the save took {3}s".info(
values.size(),
duration_GeneratePayloads,
duration_generateMd5s,
duration_saveMD5s);
return values;
//rainbowTable.Append("{0}\t{1}\n".format(value.md5Hash(), value));
//return rainbowTable.str();
//using System.Text;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment