From e873d6e27214c9ae97e6a686fc877dd82d488754 Mon Sep 17 00:00:00 2001 From: Matt Grandy Date: Wed, 8 Apr 2020 22:10:40 -0600 Subject: [PATCH] Added flag options, help menu, and compression --- CS/EyeWitness/EyeWitness.csproj | 21 +++++ CS/EyeWitness/FodyWeavers.xml | 3 + CS/EyeWitness/FodyWeavers.xsd | 111 ++++++++++++++++++++++++ CS/EyeWitness/Program.cs | 149 +++++++++++++++++++++----------- CS/EyeWitness/packages.config | 6 ++ 5 files changed, 238 insertions(+), 52 deletions(-) create mode 100755 CS/EyeWitness/FodyWeavers.xml create mode 100755 CS/EyeWitness/FodyWeavers.xsd create mode 100755 CS/EyeWitness/packages.config diff --git a/CS/EyeWitness/EyeWitness.csproj b/CS/EyeWitness/EyeWitness.csproj index b274504b..dd604a59 100755 --- a/CS/EyeWitness/EyeWitness.csproj +++ b/CS/EyeWitness/EyeWitness.csproj @@ -1,5 +1,6 @@  + Debug @@ -12,6 +13,8 @@ 512 true + + AnyCPU @@ -38,10 +41,19 @@ EyeWitness.Program + + ..\packages\CommandLineParser.2.7.82\lib\net45\CommandLine.dll + True + + + ..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll + + + @@ -57,6 +69,15 @@ + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file diff --git a/CS/EyeWitness/FodyWeavers.xml b/CS/EyeWitness/FodyWeavers.xml new file mode 100755 index 00000000..f1dea8fc --- /dev/null +++ b/CS/EyeWitness/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/CS/EyeWitness/FodyWeavers.xsd b/CS/EyeWitness/FodyWeavers.xsd new file mode 100755 index 00000000..8ac6e927 --- /dev/null +++ b/CS/EyeWitness/FodyWeavers.xsd @@ -0,0 +1,111 @@ + + + + + + + + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. + + + + + A list of unmanaged 32 bit assembly names to include, delimited with line breaks. + + + + + A list of unmanaged 64 bit assembly names to include, delimited with line breaks. + + + + + The order of preloaded assemblies, delimited with line breaks. + + + + + + This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file. + + + + + Controls if .pdbs for reference assemblies are also embedded. + + + + + Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option. + + + + + As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off. + + + + + Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code. + + + + + Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior. + + + + + A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with | + + + + + A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |. + + + + + A list of unmanaged 32 bit assembly names to include, delimited with |. + + + + + A list of unmanaged 64 bit assembly names to include, delimited with |. + + + + + The order of preloaded assemblies, delimited with |. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/CS/EyeWitness/Program.cs b/CS/EyeWitness/Program.cs index 8e664380..a3c721f0 100755 --- a/CS/EyeWitness/Program.cs +++ b/CS/EyeWitness/Program.cs @@ -5,6 +5,9 @@ using System.Collections.Generic; using System.Threading.Tasks; using System.Linq; +using CommandLine; +using CommandLine.Text; +using System.IO.Compression; namespace EyeWitness { @@ -23,6 +26,37 @@ class Program //private static SemaphoreSlim _pool = new SemaphoreSlim(2); private static SemaphoreSlim _Sourcepool = new SemaphoreSlim(10); + public class Options + { + public static Options Instance { get; set; } + + // Command line options + [Option('v', "verbose", Required = false, HelpText = "Set output to verbose")] + public bool Verbose { get; set; } + + [Option('f', "file", Required = true, HelpText = "Specify a new-line separated file of URLs", Default = null)] + public string File { get; set; } + + [Option('d', "delay", Required = false, HelpText = "Specify a delay to use before cancelling a single URL request", Default = 30)] + public int Delay { get; set; } + + [Option('c', "compress", Required = false, HelpText = "Compress output directory", Default = false)] + public bool Compress { get; set; } + } + + static void DisplayHelp(ParserResult result, IEnumerable errs) + { + var helpText = HelpText.AutoBuild(result, h => + { + h.AdditionalNewLineAfterOption = false; + h.Heading = "EyeWitness C# Version 1.0"; //change header + h.Copyright = ""; //change copyright text + return HelpText.DefaultParsingErrorsHandler(result, h); + }, e => e); + Console.WriteLine(helpText); + System.Environment.Exit(1); + } + // The main program will handle determining where the output is saved to, it's not the requirement of the object // the object will look up the location where everything should be saved and write to there accordingly @@ -111,19 +145,17 @@ static void DictMaker() private static async Task ScreenshotSender(WitnessedServer obj, int timeDelay) { //Cancel after 30s - var cts = new CancellationTokenSource(30000); - cts.CancelAfter(30000); + var cts = new CancellationTokenSource(timeDelay); + cts.CancelAfter(timeDelay); try { //Keep it syncronous for this slow version + //Allow the thread to exit somewhat cleanly before exiting the semaphore _pool.WaitOne(40000); Console.WriteLine("Grabbing screenshot for: " + obj.remoteSystem); - //obj.RunWithTimeout(TimeSpan.FromMilliseconds(timeDelay)); var task = await obj.RunWithTimeoutCancellation(cts.Token); - - _pool.Release(); } catch (OperationCanceledException) @@ -139,6 +171,7 @@ private static async Task ScreenshotSender(WitnessedServer obj, int timeDelay) private static async Task SourceSender(WitnessedServer obj) { //Cancel after 10s + //This cancellation time isn't as important as the screenshot one so we can hard code it var cts = new CancellationTokenSource(10000); cts.CancelAfter(10000); @@ -234,67 +267,63 @@ public static void Writer(WitnessedServer[] urlArray, string[] allUrlArray) reportHtml += ""; //close out the category table Cronkite.FinalReporter(reportHtml, pages, allUrlArray.GetLength(0), witnessDir); } - } static void Main(string[] args) { - Console.WriteLine("[+] Firing up EyeWitness..."); - DirMaker(); - DictMaker(); + Console.WriteLine("[+] Firing up EyeWitness...\n"); string[] allUrls = null; int delay = 30000; var watch = new System.Diagnostics.Stopwatch(); watch.Start(); - - // Read in URLs - //Account for 2 arguments - the first is the file of URLs the second is the timeout - if (args.Length == 2) + //Parse arguments passed + var parser = new Parser(with => { - try - { - allUrls = System.IO.File.ReadAllLines(args[0]); - delay = Int32.Parse(args[1]); - } - catch (FileNotFoundException) - { - Console.WriteLine("\n[*] ERROR: The file containing the URLS to scan does not exist!"); - Console.WriteLine("[*] ERROR: Please make sure you've provided the correct filepath and try again."); - return; - } - catch - { - Console.WriteLine("Invalid int for timeout, using the default of 30 seconds"); - delay = 30000; //Set the delay to default to 10s - } - } - else if (args.Length == 1) - { - try - { - allUrls = System.IO.File.ReadAllLines(args[0]); - Console.WriteLine("Using the default timeout of 10 seconds"); - } - catch (Exception e) + with.CaseInsensitiveEnumValues = true; + with.CaseSensitive = false; + with.HelpWriter = null; + }); + + var parserResult = parser.ParseArguments(args); + parserResult.WithParsed(o => { - Console.WriteLine("Error when running. Error thrown: \n" + e); - } - } - else - { - Console.WriteLine("\n[*] ERROR: Please specify a URL file to use\n"); - Console.WriteLine("\n\n[++] Usage: EyeWitness.exe c:\\Path\\To\\URLs.txt [Timeout] (ex. 10000 = 10 seconds)"); - Console.WriteLine("[++] EyeWitness.exe c:\\users\\test\\urls.txt"); - Console.WriteLine("[++] EyeWitness.exe c:\\users\\test\\urls.txt 20000"); - System.Environment.Exit(1); - } + if (o.Delay != 30) + { + Console.WriteLine("[+] Using a custom timeout of " + o.Delay + " seconds per URL thread"); + delay = o.Delay * 1000; + } + else + { + Console.WriteLine("[+] Using the default timeout of 30 seconds per URL thread"); + } + + if (o.Compress) + { + Console.WriteLine("[+] Compressing files afterwards\n"); + } + + try + { + allUrls = System.IO.File.ReadAllLines(o.File); + } + catch (FileNotFoundException) + { + Console.WriteLine("[-] ERROR: The file containing the URLS to scan does not exist!"); + Console.WriteLine("[-] ERROR: Please make sure you've provided the correct filepath and try again."); + System.Environment.Exit(1); + } + Options.Instance = o; + }) + .WithNotParsed(errs => DisplayHelp(parserResult, errs)); + + DirMaker(); + DictMaker(); + var options = Options.Instance; // build an array containing all the web server objects WitnessedServer[] serverArray = new WitnessedServer[allUrls.Length]; - - // Build an array containing the objects so we can easily loop over them - Console.WriteLine("[+] Using a delay of: " + delay + " (in milliseconds)"); + //WitnessedServer.SetFeatureBrowserEmulation(); // enable HTML5 List SourceTaskList = new List(); @@ -343,6 +372,22 @@ static void Main(string[] args) Thread.Sleep(1000); watch.Stop(); Console.WriteLine("Execution time: " + watch.ElapsedMilliseconds/1000 + " Seconds"); + if (options.Compress) + { + Console.WriteLine("Compressing output directory..."); + try + { + string ZipFileName = witnessDir + ".zip"; + ZipFile.CreateFromDirectory(witnessDir, ZipFileName, CompressionLevel.Optimal, false); + Directory.Delete(witnessDir, true); + } + catch (Exception ex) + { + Console.WriteLine("[-] Error zipping file"); + Console.WriteLine(ex); + } + + } Console.WriteLine("Finished! Exiting shortly..."); Thread.Sleep(5000); return; diff --git a/CS/EyeWitness/packages.config b/CS/EyeWitness/packages.config new file mode 100755 index 00000000..21840c70 --- /dev/null +++ b/CS/EyeWitness/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file