Exemplo n.º 1
0
        public static bool Request(string extension)
        {
            IDnsQueryResponse result;
            var endpoint = new IPEndPoint(IPAddress.Parse("8.8.8.8"), 53);
            var client   = new LookupClient(endpoint);

            client.EnableAuditTrail = false;
            try
            {
                result = client.Query(extension, QueryType.NS);
            }
            catch (Exception e)
            {
                Console.WriteLine("ERROR\tException: " + endpoint.Address.ToString() + "\t" + e);
                return(false);
            }
            foreach (var NsRecord in result.Answers.NsRecords())
            {
                var result2 = client.Query(NsRecord.NSDName, QueryType.A);
                if (result2.Answers.ARecords().Count() < 1)
                {
                    return(false);
                }
                var ns = NsRecord.NSDName.ToString();
                var ip = result2.Answers.ARecords()?.First()?.Address.ToString();
                if (CheckSoaServer(extension, ip))
                {
                    //Console.WriteLine("Ajout de {0} , {1}", ns, ip);
                    RootZone.Serveur serveur = new RootZone.Serveur {
                        Queries = 0, Fails = 0, Ip = ip, Ns = ns
                    };
                    RootZone.AddServer(extension, serveur);
                }
                //else Console.WriteLine("[DEBUG] Pas de SOA pour {0} sur {1}", extension, ip);
            }
            return(RootZone.ServerExists(extension));
        }
Exemplo n.º 2
0
        /*
         * public static async Task<Data> IsNsRecordedAsync(string domain, int timeout, string dnsserver = null)
         * {
         *  Data output = new Data();
         *
         *  byte[] bufferReceive = new byte[512];
         *  byte[] finalMessage = new byte[512];
         *  int currentId = 0;
         *  int port = 0;
         *  int rCode = 0;
         *  ushort answerCount = 0;
         *  ushort nsCount = 0;
         *  bool? aaFlag = null;
         *  int questionBytes = 0;
         *
         *  DomainParser.Domain extension = DomainParser.DomainParser.Parse(domain);
         *
         *  var items = domain.Split('.');
         *  if (extension.Extension == "") extension.Extension = items.Last();
         *
         *  currentId = Interlocked.Increment(ref _queryNumber);
         *  if (RootZone.ServerExists(extension.Extension) && dnsserver != null)
         *  {
         *      RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Queries++;
         *  }
         *  if (dnsserver == null)
         *  {
         *      output.log = "dnsserver is null";
         *      return output;
         *  }
         *
         *  var header = new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 };
         *  var tail = new byte[] { 0, 0, 2, 0, 1 };
         *  unchecked
         *  {
         *      header[0] = (byte)(currentId >> 8);
         *      header[1] = (byte)currentId;
         *  }
         *
         *  var tempMessage = header.AsEnumerable();
         *
         *  foreach (var item in items)
         *  {
         *      var itemBytes = Encoding.ASCII.GetBytes(item);
         *      var itemLen = new[] { (byte)item.Length };
         *      tempMessage = tempMessage.Concat(itemLen).Concat(itemBytes);
         *  }
         *
         *  finalMessage = tempMessage.Concat(tail).ToArray();
         *  port = 15000 + (currentId % 50535);
         *
         *
         *  using (var socket = new UdpClient())
         *  {
         *      socket.Client.ReceiveTimeout = 500;
         *      socket.ExclusiveAddressUse = true;
         *      socket.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, false);
         *      var selectedBind = _sortie[currentId % _sortie.Length];
         *      //var ipendpt = new IPEndPoint(selectedBind, port);
         *      var ipendpt = new IPEndPoint(selectedBind, 0);
         *
         *      var selectedServer = _dnsEndPoints[currentId % _dnsEndPoints.Length];
         *      if (dnsserver != null)
         *      {
         *          DnsServer.DnsServers = new string[] { dnsserver };
         *          selectedServer = new IPEndPoint(IPAddress.Parse(dnsserver), 53);
         *      }
         *      socket.Send(finalMessage, finalMessage.Length, selectedServer);
         *      try
         *      {
         *          bufferReceive = socket.Receive(ref ipendpt);
         *          //var tmp = await socket.ReceiveAsync().ConfigureAwait(false);
         *          /*
         *          var result = await Task.Run(() =>
         *          {
         *              var task = socket.ReceiveAsync();
         *              task.Wait(timeout);
         *              if (task.IsCompleted)
         *              { return task.Result; }
         *              throw new TimeoutException();
         *          }).ConfigureAwait(false);
         *
         *          bufferReceive = result.Buffer;
         *
         *      }
         *      catch (Exception e)
         *      {
         *          output.log = "[ERREUR socket receive]\t" + dnsserver + "\t" + port + "\t" + e;
         *          if (dnsserver != null) RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Fails++;
         *          return output;
         *      }
         *      finally
         *      {
         *          socket.Close();
         *      }
         *  }
         *
         *  bool areEqual = finalMessage.Take(2).ToArray().SequenceEqual(bufferReceive.Take(2).ToArray()); // true
         *  rCode = bufferReceive[3] & 0xF;
         *  aaFlag = (bufferReceive[2] & (1 << 6 - 1)) != 0;
         *  answerCount = BitConverter.ToUInt16(bufferReceive.Skip(6).Take(2).Reverse().ToArray(), 0);
         *  nsCount = BitConverter.ToUInt16(bufferReceive.Skip(8).Take(2).Reverse().ToArray(), 0);
         *  questionBytes = (items.Count() + domain.Length) + 4;
         *
         *  //  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0
         *  bool authorityPointer = bufferReceive.Skip(12 + questionBytes).Take(2).SequenceEqual(new byte[2] { (byte)192, (byte)12 });
         *
         *  if (dnsserver != null)
         *      output.log = domain + "\tServer: " + dnsserver + "\taaFlag: " + aaFlag.ToString() + "\trCode: " + rCode + "\tanswerCount: " + Convert.ToString((int)answerCount) + "\tNSCOUNT: " + Convert.ToString((int)nsCount) + "\tPointer: " + authorityPointer.ToString() + "\t" + BitConverter.ToString(new byte[2] { (byte)192, (byte)12 }) + "\tDNS: " + BitConverter.ToString(bufferReceive.Skip(12 + questionBytes).Take(2).ToArray());
         *  else
         *      output.log = domain + "\tServer: Google\taaFlag: " + aaFlag.ToString() + "\trCode: " + rCode + "\tanswerCount: " + Convert.ToString((int)answerCount) + "\tNSCOUNT: " + Convert.ToString((int)nsCount) + "\tDNS: " + BitConverter.ToString(bufferReceive.Skip(12 + questionBytes).Take(2).ToArray());
         *
         *
         *  // Je comprend pas, ça n'arrive jamais sous windoows, je n'ai ce comportement que sous linux avec mono... ca vient du core, du serveur , de sa config réseau?
         *  if (areEqual == false)
         *  {
         *      output.success = false;
         *      return output;
         *  }
         *  else output.success = true;
         *
         *
         *  output.result = ((rCode == 0 && (answerCount > 1 || (nsCount > 1 && dnsserver != null && authorityPointer))) == true);
         *
         *  return output;
         * }
         */

        public static bool IsNsRecorded(string domain, string extension, int timeout, out bool result, out string log, string dnsserver = null)
        {
            result = false;
            log    = "";

            byte[] bufferReceive = new byte[512];
            byte[] finalMessage  = new byte[512];
            int    currentId     = 0;
            int    port          = 0;
            int    rCode         = 0;
            ushort answerCount   = 0;
            ushort nsCount       = 0;
            bool?  aaFlag        = null;
            int    questionBytes = 0;


            var items = domain.Split('.');

            currentId = Interlocked.Increment(ref _queryNumber);
            if (RootZone.ServerExists(extension) && dnsserver != null)
            {
                RootZone.ServeursDns[extension].First(item => item.Ip == dnsserver).Queries++;
            }
            if (dnsserver == null)
            {
                return(false);
            }

            var header = new byte[] { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 };
            var tail   = new byte[] { 0, 0, 2, 0, 1 };

            unchecked
            {
                header[0] = (byte)(currentId >> 8);
                header[1] = (byte)currentId;
            }

            var tempMessage = header.AsEnumerable();

            foreach (var item in items)
            {
                var itemBytes = Encoding.ASCII.GetBytes(item);
                var itemLen   = new[] { (byte)item.Length };
                tempMessage = tempMessage.Concat(itemLen).Concat(itemBytes);
            }

            finalMessage = tempMessage.Concat(tail).ToArray();
            port         = 15000 + (currentId % 50535);


            using (var socket = new UdpClient())
            //using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
            {
                socket.Client.ReceiveTimeout = timeout;
                //socket.DontFragment = true;
                socket.ExclusiveAddressUse = true;
                socket.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, false);
                //socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, timeout);

                var selectedBind = _sortie[currentId % _sortie.Length];

                //var ipendpt = new IPEndPoint(selectedBind, 45152 + (currentId % 16380));
                var ipendpt = new IPEndPoint(selectedBind, port);
                //var ipendpt = new IPEndPoint(selectedBind, 0);
                var selectedServer = _dnsEndPoints[currentId % _dnsEndPoints.Length];
                //var ipendpt = new IPEndPoint(selectedBind, port);
                //socket.Bind(ipendpt);
                //Console.WriteLine(domain + "\t / ip : " + ipendpt.Address + " port : " + ipendpt.Port);
                if (dnsserver != null)
                {
                    DnsServer.DnsServers = new string[] { dnsserver };
                    selectedServer       = new IPEndPoint(IPAddress.Parse(dnsserver), 53);
                }

                try
                {
                    socket.Send(finalMessage, finalMessage.Length, selectedServer);
                    //socket.SendTo(finalMessage, finalMessage.Length, SocketFlags.None, selectedServer);
                }
                catch (SocketException e)
                {
                    Console.WriteLine(port + "\t" + e);
                    socket.Close();
                    return(false);
                }

                try
                {
                    bufferReceive = socket.Receive(ref ipendpt);
                    //bufferReceive = await socket.ReceiveFromAsync(recvargs);
                    //socket.Receive(bufferReceive);
                }
                catch (SocketException e)
                {
                    socket.Close();
                    log = "[ERROR] Exception\t" + dnsserver + "\t" + e;
                    var server = RootZone.ServeursDns[extension].FirstOrDefault(item => item.Ip == dnsserver);
                    if (dnsserver != null && server != null)
                    {
                        server.Fails++;
                    }
                    return(false);
                }
                finally
                {
                    socket.Close();
                }
            }

            //Console.WriteLine("[DEBUG] Query {0}\t\t\tusing\t{1} {2} {3}", domain, dnsserver, RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Ip, RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Ns);

            bool areEqual = finalMessage.Take(2).ToArray().SequenceEqual(bufferReceive.Take(2).ToArray()); // true

            rCode         = bufferReceive[3] & 0xF;
            aaFlag        = (bufferReceive[2] & (1 << 6 - 1)) != 0;
            answerCount   = BitConverter.ToUInt16(bufferReceive.Skip(6).Take(2).Reverse().ToArray(), 0);
            nsCount       = BitConverter.ToUInt16(bufferReceive.Skip(8).Take(2).Reverse().ToArray(), 0);
            questionBytes = (items.Count() + domain.Length) + 4;

            //  1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0
            bool authorityPointer = bufferReceive.Skip(12 + questionBytes).Take(2).SequenceEqual(new byte[2] {
                (byte)192, (byte)12
            });

            if (dnsserver != null)
            {
                log = domain + "\tServer: " + dnsserver + "\taaFlag: " + aaFlag.ToString() + "\trCode: " + rCode + "\tanswerCount: " + Convert.ToString((int)answerCount) + "\tNSCOUNT: " + Convert.ToString((int)nsCount) + "\tPointer: " + authorityPointer.ToString() + "\t" + BitConverter.ToString(new byte[2] {
                    (byte)192, (byte)12
                }) + "\tDNS: " + BitConverter.ToString(bufferReceive.Skip(12 + questionBytes).Take(2).ToArray());
            }
            else
            {
                log = domain + "\tServer: Google\taaFlag: " + aaFlag.ToString() + "\trCode: " + rCode + "\tanswerCount: " + Convert.ToString((int)answerCount) + "\tNSCOUNT: " + Convert.ToString((int)nsCount) + "\tDNS: " + BitConverter.ToString(bufferReceive.Skip(12 + questionBytes).Take(2).ToArray());
            }


            /* Je comprend pas, ça n'arrive jamais sous windoows, je n'ai ce comportement que sous linux avec mono... ca vient du core, du serveur , de sa config réseau? */
            if (areEqual == false)
            {
                WriteLog("[ERROR] Not Equal !", ConsoleColor.Red);
                //Console.WriteLine(domain + "\tQ:\t" + BitConverter.ToString(finalMessage.ToArray()));
                //Console.WriteLine(port + "\t" + currentId + "\t" + domain + "\tR:\t" + BitConverter.ToString(bufferReceive.ToArray()));
                //if (dnsserver != null) RootZone.ServeursDns[extension.Extension].First(item => item.Ip == dnsserver).Fails++;
                return(false);
            }

            result = false;
            if (rCode == 0 && (answerCount > 1 || (nsCount > 1 && dnsserver != null && authorityPointer)))
            {
                result = true;
            }

            return(true);
        }