Ejemplo n.º 1
0
    static async Task FqdnScanAsync(ConsoleService c, string cmdName, string str)
    {
        ConsoleParam[] args =
        {
            new ConsoleParam("[subnets]",  ConsoleService.Prompt, "Subnets: ", ConsoleService.EvalNotEmpty, null),
            new ConsoleParam("servers"),
            new ConsoleParam("threads"),
            new ConsoleParam("interval"),
            new ConsoleParam("try"),
            new ConsoleParam("shuffle"),
            new ConsoleParam("fqdnorder"),
            new ConsoleParam("dest"),
            new ConsoleParam("ports"),
        };

        ConsoleParamValueList vl = c.ParseCommandList(cmdName, str, args);

        string subnets   = vl.DefaultParam.StrValue;
        string servers   = vl["servers"].StrValue;
        int    threads   = vl["threads"].IntValue;
        int    interval  = vl["interval"].IntValue;
        int    numtry    = vl["try"].IntValue;
        bool   shuffle   = vl["shuffle"].StrValue._ToBool(true);
        bool   fqdnorder = vl["fqdnorder"].StrValue._ToBool(true);
        string csv       = vl["dest"].StrValue;
        string portsStr  = vl["ports"].StrValue;

        PortRange portRange = new PortRange(portsStr);

        var serversList = servers._Split(StringSplitOptions.RemoveEmptyEntries, " ", " ", ",", "|");

        if (serversList._IsEmpty())
        {
            serversList = new string[] { "8.8.8.8", "8.8.4.4", "1.1.1.1", "3.3.3.3" };
        }

        List <IPEndPoint> endPointsList = new List <IPEndPoint>();

        serversList._DoForEach(x => endPointsList.Add(new IPEndPoint(x._ToIPAddress() !, 53)));

        using DnsHostNameScanner scan = new DnsHostNameScanner(
                  settings: new DnsHostNameScannerSettings { Interval = interval, NumThreads = threads, NumTry = numtry, PrintStat = true, RandomInterval = true, Shuffle = shuffle, PrintOrderByFqdn = fqdnorder, TcpPorts = portRange.ToArray(), },
                  dnsSettings: new DnsResolverSettings(dnsServersList: endPointsList, flags: DnsResolverFlags.UdpOnly | DnsResolverFlags.RoundRobinServers));

        var list = await scan.PerformAsync(subnets);

        if (csv._IsFilled())
        {
            using var csvWriter = Lfs.WriteCsv <FqdnScanResult>(csv, false, true, writeBom: false, flags: FileFlags.AutoCreateDirectory);

            foreach (var item in list)
            {
                if (item.HostnameList._IsFilled())
                {
                    FqdnScanResult r = new FqdnScanResult();

                    r.IpSortKey   = IPAddr.FromAddress(item.Ip).GetZeroPaddingFullString();
                    r.Ip          = item.Ip.ToString();
                    r.FqdnSortKey = Str.ReverseFqdnStr(item.HostnameList.First()).ToLowerInvariant();
                    r.FqdnList    = item.HostnameList._Combine(" / ");
                    r.TcpPortList = item.TcpPorts.Select(x => x.ToString())._Combine(" / ");

                    csvWriter.WriteData(r);
                }
            }
        }
    }