diff --git a/Program.cs b/Program.cs index 7f8b58e..11b9cbf 100644 --- a/Program.cs +++ b/Program.cs @@ -14,32 +14,33 @@ using System.Threading.Tasks; namespace SharpScan { - public class Options - { - [Option('h', "hosts", Required = true, Separator = ',', HelpText = "Hosts to scan, coma separated. CIDR accepted")] - public IEnumerable Hosts { get; set; } - [Option('p', "ports", Required = false, Separator = ',', HelpText = "TCP port to scan, coma separated")] - public IEnumerable Ports { get; set; } - - [Option('t', "timeout", Required = false, Default = 500, HelpText = "Timeout in milliseconds to check a port")] - public int Timeout { get; set; } - - [Option('d', "delay", Required = false, Default = 0, HelpText = "Delay in milliseconds between 2 scan request")] - public int Delay { get; set; } - - [Option('j', "jittler", Required = false, Default = 0, HelpText = "Jittler to apply to delay, in percent, new evalutation for each request")] - public int Jittler { get; set; } - - [Option('r', "randomize", Required = false, Default = false, HelpText = "Randomize hosts/ports scan order. Results will be printed in normal order")] - public bool Randomize { get; set; } - - [Option('f', "top-ports", Required = false, Default = 0, HelpText = "Equivalent of nmap --top-ports option")] - public int TopPorts { get; set; } - } class Program { + public class Options + { + [Option('h', "hosts", Required = true, Separator = ',', HelpText = "Hosts to scan, coma separated. CIDR accepted")] + public IEnumerable Hosts { get; set; } + + [Option('p', "ports", Required = false, Separator = ',', HelpText = "TCP port to scan, coma separated")] + public IEnumerable Ports { get; set; } + + [Option('t', "timeout", Required = false, Default = 500, HelpText = "Timeout in milliseconds to check a port")] + public int Timeout { get; set; } + + [Option('d', "delay", Required = false, Default = 0, HelpText = "Delay in milliseconds between 2 scan request")] + public int Delay { get; set; } + + [Option('j', "jittler", Required = false, Default = 0, HelpText = "Jittler to apply to delay, in percent, new evalutation for each request")] + public int Jittler { get; set; } + + [Option('r', "randomize", Required = false, Default = false, HelpText = "Randomize hosts/ports scan order. Results will be printed in normal order")] + public bool Randomize { get; set; } + + [Option('f', "top-ports", Required = false, Default = 0, HelpText = "Equivalent of nmap --top-ports option")] + public int TopPorts { get; set; } + } public static List GetIpsFromCidr(string cidr) @@ -134,9 +135,7 @@ namespace SharpScan } } - - - static void Main(string[] args) + static void RunOptions(Options o) { List<(string address, int port)> cibles = new List<(string address, int port)>(); List addresses = new List(); @@ -149,69 +148,63 @@ namespace SharpScan int jittler = 0; int top_port = 0; - - Parser.Default.ParseArguments(args).WithParsed(o => { - - // Gestion des hosts - foreach (string host in o.Hosts) + // Gestion des hosts + foreach (string host in o.Hosts) + { + if (host.Contains('/')) { - if (host.Contains('/')) - { - addresses.AddRange(GetIpsFromCidr(host)); - } - else - { - addresses.Add(host); - } + addresses.AddRange(GetIpsFromCidr(host)); } - - - // Gestion des ports - if (o.Ports.Count() > 0) + else { - if (o.Ports.Count() == 1 && o.Ports.First() == -1) + addresses.Add(host); + } + } + + + // Gestion des ports + if (o.Ports.Count() > 0) + { + if (o.Ports.Count() == 1 && o.Ports.First() == -1) + { + foreach (int port in Enumerable.Range(0, 65536)) { - foreach (int port in Enumerable.Range(0, 65536)) - { - ports.Add(port); - } - } - else - { - foreach (int port in o.Ports) - { - ports.Add(port); - } + ports.Add(port); } } else { - if (o.TopPorts > 0) + foreach (int port in o.Ports) { - if (o.TopPorts <= Utils.top_ports_list.Count()) - { - ports = Utils.top_ports_list.GetRange(0, o.TopPorts); - } - else - { - ports = Utils.top_ports_list; - } + ports.Add(port); + } + } + } + else + { + if (o.TopPorts > 0) + { + if (o.TopPorts <= Utils.top_ports_list.Count()) + { + ports = Utils.top_ports_list.GetRange(0, o.TopPorts); } else { - ports = Utils.top_ports_list.GetRange(0, 12); + ports = Utils.top_ports_list; } } + else + { + ports = Utils.top_ports_list.GetRange(0, 12); + } + } - timeout = o.Timeout; - randomize = o.Randomize; - delay = o.Delay; - jittler = o.Jittler; - top_port = o.TopPorts; - }); - - + timeout = o.Timeout; + randomize = o.Randomize; + delay = o.Delay; + jittler = o.Jittler; + top_port = o.TopPorts; // Construction des cibles foreach (string address in addresses) @@ -252,12 +245,12 @@ namespace SharpScan foreach ((string address, int port) in cibles) { - if( cpt % fraction == 0) + if (cpt % fraction == 0) { cpt_fraction += 10; Console.WriteLine($"Request {cpt}/{cibles.Count} ({cpt_fraction})%"); } - + if (IsPortOpen(address, port, timeout)) { results.Add((address, port)); @@ -293,6 +286,19 @@ namespace SharpScan } Console.WriteLine($" {port} opened ({Utils.GetDesc(port)})"); } + + } + static void HandleParseError(IEnumerable errs) + { + //handle errors + } + + + static void Main(string[] args) + { + CommandLine.Parser.Default.ParseArguments(args) + .WithParsed(RunOptions) + .WithNotParsed(HandleParseError); } } }