Ejemplo n.º 1
0
        public static TCPPacket MakePortClosedPacket(byte[] fromMac, byte[] toMac, byte[] fromIP, byte[] toIP, ushort fromPort, ushort toPort, uint ackNumber)
        {
            EthPacket e = new EthPacket(60);

            e.FromMac = fromMac;
            e.ToMac   = toMac;
            e.Proto   = new byte[2] {
                0x08, 0x00
            };
            IPPacket ip = new IPPacket(e);

            ip.DestIP         = new IPAddress(fromIP);
            ip.SourceIP       = new IPAddress(toIP);
            ip.NextProtocol   = 0x06;
            ip.TotalLength    = 40;
            ip.HeaderChecksum = ip.GenerateIPChecksum;
            TCPPacket tcp = new TCPPacket(ip);

            tcp.SourcePort     = fromPort;
            tcp.DestPort       = toPort;
            tcp.SequenceNumber = (uint)0;
            tcp.AckNumber      = ackNumber;
            tcp.WindowSize     = 8192;
            tcp.ACK            = true;
            tcp.RST            = true;
            tcp.Checksum       = tcp.GenerateChecksum;
            tcp.Outbound       = true;
            return(tcp);
        }
Ejemplo n.º 2
0
 public IPPacket(EthPacket eth)
     : base(eth.data)
 {
     if (!isIP() && !isIPv6())
         throw new Exception("Not an IP packet!");
     start = base.LayerStart() + base.LayerLength();
     if (eth.CodeGenerated)
     {
         this.CodeGenerated = true;
         if (isIPv6())
         {
             data->m_IBuffer[start] = 0x60;
             data->m_IBuffer[start + 1] = 0x00;
             this.TTL = 0xff;
         }
         else
         {
             data->m_IBuffer[start] = 0x45;
             this.DiffServicesField = 0x00;
             this.Identification = 23950;
             this.FragmentOffset = 0;
             this.Flags = 0x40;
             this.TTL = 128;
         }
     }
     if (isIPv6())
         length = 40;
     else
         length = (uint)((data->m_IBuffer[start] & 0xf) * 4);
 }
Ejemplo n.º 3
0
 public unsafe override PacketMainReturn interiorMain(ref Packet in_packet)
 {
     lock (padlock)
     {
         if (theirMac == null)
             return null;
         EthPacket e = (EthPacket)in_packet;
         if ((e.Proto[0] & 0x01) == 0x01 && (CompareMac(theirMac, e.FromMac) && CompareMac(myMac, e.ToMac) || (CompareMac(theirMac, e.ToMac) && CompareMac(myMac, e.FromMac))))
         {
             INTERMEDIATE_BUFFER* IB = e.IB;
             rc4.SetKeyState(key);
             INTERMEDIATE_BUFFER* iba = (INTERMEDIATE_BUFFER*)Marshal.AllocHGlobal(Marshal.SizeOf(new INTERMEDIATE_BUFFER()));
             iba->m_dwDeviceFlags = IB->m_dwDeviceFlags;
             iba->m_Flags = IB->m_Flags;
             iba->m_Length = IB->m_Length;
             iba->m_qLink = IB->m_qLink;
             for (int x = 12; x < IB->m_Length; x++)
             {
                 iba->m_IBuffer[x] = (byte)(IB->m_IBuffer[x] ^ rc4.Next());
             }
             EthPacket nPacket = new EthPacket(iba);
             nPacket.FromMac = e.FromMac;
             nPacket.ToMac = e.ToMac;
             nPacket.Proto = new byte[2];
             nPacket.Proto[0] = (byte)(0xFE & e.Proto[0]);
             nPacket.Proto[1] = e.Proto[1];
             adapter.ProcessPacket(nPacket);
             return new PacketMainReturn("SimpleMacEncryption") { returnType = PacketMainReturnType.Drop };
         }
     }
     return null;
 }
Ejemplo n.º 4
0
 public ARPPacket(EthPacket eth)
     : base(eth.data)
 {
     if (!isARP())
         throw new Exception("Not an ARP packet!");
     start = base.LayerStart() + base.LayerLength();
     length = this.Length() - base.LayerLength();
     if (eth.CodeGenerated)
     {
         HardwareType = 1;
         ProtocolType = 0x0800;
         HardwareSize = 0x06;
         ProtocolSize = 4;
         ARPOpcode = 0x0002;
     }
 }
Ejemplo n.º 5
0
 public ARPPacket(EthPacket eth)
     : base(eth.data)
 {
     if (!isARP())
     {
         throw new Exception("Not an ARP packet!");
     }
     start  = base.LayerStart() + base.LayerLength();
     length = this.Length() - base.LayerLength();
     if (eth.CodeGenerated)
     {
         HardwareType = 1;
         ProtocolType = 0x0800;
         HardwareSize = 0x06;
         ProtocolSize = 4;
         ARPOpcode    = 0x0002;
     }
 }
Ejemplo n.º 6
0
 public void threadMain()
 {
     while (true)
     {
         if (Enabled)
         {
             EthPacket ep = new EthPacket(42);
             ep.FromMac = PhysicalAddress.Parse("F07BCB8F7AC5").GetAddressBytes();
             ep.ToMac = PhysicalAddress.Parse("FFFFFFFFFFFF").GetAddressBytes();
             ep.Proto = new byte[2] { 0x08, 0x06 };
             ARPPacket arpp = new ARPPacket(ep);
             arpp.ASenderMac = ep.FromMac;
             arpp.ASenderIP = IPAddress.Parse("192.168.0.1");
             arpp.ATargetMac = ep.ToMac;
             arpp.ATargetIP = IPAddress.Parse("192.168.0.255");
             adapter.SendPacket(arpp);
         }
         Thread.Sleep(1000);
     }
 }
Ejemplo n.º 7
0
 public static TCPPacket MakeSynPacket(byte[] fromMac, byte[] toMac, byte[] fromIP, byte[] toIP, ushort fromPort, ushort toPort)
 {
     EthPacket e = new EthPacket(60);
     e.FromMac = fromMac;
     e.ToMac = toMac;
     e.Proto = new byte[2] { 0x08, 0x00 };
     IPPacket ip = new IPPacket(e);
     ip.DestIP = new IPAddress(fromIP);
     ip.SourceIP = new IPAddress(toIP);
     ip.NextProtocol = 0x06;
     ip.TotalLength = 40;
     ip.HeaderChecksum = ip.GenerateIPChecksum;
     TCPPacket tcp = new TCPPacket(ip);
     tcp.SourcePort = fromPort;
     tcp.DestPort = toPort;
     tcp.SequenceNumber = (uint)new Random().Next();
     tcp.AckNumber = 0;
     tcp.WindowSize = 8192;
     tcp.SYN = true;
     tcp.Checksum = tcp.GenerateChecksum;
     tcp.Outbound = true;
     return tcp;
 }
Ejemplo n.º 8
0
 public IPPacket(EthPacket eth)
     : base(eth.data)
 {
     if (!isIP() && !isIPv6())
     {
         throw new Exception("Not an IP packet!");
     }
     start = base.LayerStart() + base.LayerLength();
     if (eth.CodeGenerated)
     {
         this.CodeGenerated = true;
         if (isIPv6())
         {
             data->m_IBuffer[start]     = 0x60;
             data->m_IBuffer[start + 1] = 0x00;
             this.TTL = 0xff;
         }
         else
         {
             data->m_IBuffer[start] = 0x45;
             this.DiffServicesField = 0x00;
             this.Identification    = 23950;
             this.FragmentOffset    = 0;
             this.Flags             = 0x40;
             this.TTL = 128;
         }
     }
     if (isIPv6())
     {
         length = 40;
     }
     else
     {
         length = (uint)((data->m_IBuffer[start] & 0xf) * 4);
     }
 }
Ejemplo n.º 9
0
        unsafe void ProcessLoop()
        {
            // Allocate and initialize packet structures
            ETH_REQUEST Request = new ETH_REQUEST();
            INTERMEDIATE_BUFFER PacketBuffer = new INTERMEDIATE_BUFFER();

            IntPtr PacketBufferIntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(PacketBuffer));
            try
            {
                win32api.ZeroMemory(PacketBufferIntPtr, Marshal.SizeOf(PacketBuffer));

                Request.hAdapterHandle = adapterHandle;
                Request.EthPacket.Buffer = PacketBufferIntPtr;

                modules = new ModuleList(this);

                modules.LoadExternalModules();

                modules.UpdateModuleOrder();

                string folder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
                folder = folder + System.IO.Path.DirectorySeparatorChar + "firebwall";
                if (!System.IO.Directory.Exists(folder))
                    System.IO.Directory.CreateDirectory(folder);
                folder = folder + System.IO.Path.DirectorySeparatorChar + "pcapLogs";
                if (!System.IO.Directory.Exists(folder))
                    System.IO.Directory.CreateDirectory(folder);
                string f = folder + System.IO.Path.DirectorySeparatorChar + "blocked-" + this.InterfaceInformation.Name + "-" + PcapCreator.Instance.GetNewDate() + ".pcap";
                pcaplog = new PcapFileWriter(f);

                INTERMEDIATE_BUFFER* PacketPointer;

                while (true)
                {
                    hEvent.WaitOne();
                    while (Ndisapi.ReadPacket(hNdisapi, ref Request))
                    {
                        PacketPointer = (INTERMEDIATE_BUFFER*)PacketBufferIntPtr;
                        //PacketBuffer = (INTERMEDIATE_BUFFER)Marshal.PtrToStructure(PacketBufferIntPtr, typeof(INTERMEDIATE_BUFFER));

                        Packet pkt = new EthPacket(PacketPointer).MakeNextLayerPacket();

                        if (pkt.Outbound)
                        {
                            OutBandwidth.AddBits(pkt.Length());
                        }
                        else
                        {
                            InBandwidth.AddBits(pkt.Length());
                        }

                        bool drop = false;
                        bool edit = false;

                        if (enabled)
                        {
                            for (int x = 0; x < modules.Count; x++)
                            {
                                FirewallModule fm = modules.GetModule(x);
                                PacketMainReturn pmr = fm.PacketMain(ref pkt);
                                if (pmr == null)
                                    continue;
                                if ((pmr.returnType & PacketMainReturnType.Log) == PacketMainReturnType.Log && pmr.logMessage != null)
                                {
                                    LogCenter.Instance.Push(pmr);
                                }
                                if ((pmr.returnType & PacketMainReturnType.Drop) == PacketMainReturnType.Drop)
                                {
                                    drop = true;
                                    break;
                                }
                                if ((pmr.returnType & PacketMainReturnType.Edited) == PacketMainReturnType.Edited)
                                {
                                    edit = true;
                                }
                            }
                        }

                        if (!drop)
                        {
                            if (pkt.Outbound)
                                Ndisapi.SendPacketToAdapter(hNdisapi, ref Request);
                            else
                                Ndisapi.SendPacketToMstcp(hNdisapi, ref Request);
                        }
                        else
                            pcaplog.AddPacket(pkt.Data(), (int)pkt.Length());
                    }

                    //OM NOM NOM PASTA!
                    while (processQueue.Count != 0)
                    {
                        Packet pkt = processQueue.Dequeue().MakeNextLayerPacket();

                        if (pkt.Outbound)
                        {
                            OutBandwidth.AddBits(pkt.Length());
                        }
                        else
                        {
                            InBandwidth.AddBits(pkt.Length());
                        }

                        bool drop = false;
                        bool edit = false;

                        if (enabled)
                        {
                            for (int x = 0; x < modules.Count; x++)
                            {
                                FirewallModule fm = modules.GetModule(x);
                                PacketMainReturn pmr = fm.PacketMain(ref pkt);
                                if (pmr == null)
                                    continue;
                                if ((pmr.returnType & PacketMainReturnType.Log) == PacketMainReturnType.Log && pmr.logMessage != null)
                                {
                                    LogCenter.Instance.Push(pmr.Module, pmr.logMessage);
                                }
                                if ((pmr.returnType & PacketMainReturnType.Drop) == PacketMainReturnType.Drop)
                                {
                                    drop = true;
                                    break;
                                }
                                if ((pmr.returnType & PacketMainReturnType.Edited) == PacketMainReturnType.Edited)
                                {
                                    edit = true;
                                }
                            }
                        }

                        if (!drop)
                        {
                            if (pkt.Outbound)
                                Ndisapi.SendPacketToAdapter(hNdisapi, ref Request);
                            else
                                Ndisapi.SendPacketToMstcp(hNdisapi, ref Request);
                        }
                        else
                            pcaplog.AddPacket(pkt.Data(), (int)pkt.Length());
                    }
                    hEvent.Reset();
                }
            }
            catch (Exception tae)
            {
                Marshal.FreeHGlobal(PacketBufferIntPtr);
            }
        }
Ejemplo n.º 10
0
 public EETHPacket(EthPacket eth)
     : base(eth.data)
 {
 }
Ejemplo n.º 11
0
        public override PacketMainReturn interiorMain(ref Packet in_packet)
        {
            PacketMainReturn pmr;
            float av = 0;

            if (in_packet.ContainsLayer(Protocol.TCP))
            {
                // if we're in cloaked mode, respond with the SYN ACK
                // More information about this in the GUI code and help string
                if (data.cloaked_mode && ((TCPPacket)in_packet).SYN)
                {
                    TCPPacket from = (TCPPacket)in_packet;

                    EthPacket eth = new EthPacket(60);
                    eth.FromMac = adapter.InterfaceInformation.GetPhysicalAddress().GetAddressBytes();
                    eth.ToMac = from.FromMac;
                    eth.Proto = new byte[2] { 0x08, 0x00 };

                    IPPacket ip = new IPPacket(eth);
                    ip.DestIP = from.SourceIP;
                    ip.SourceIP = from.DestIP;
                    ip.NextProtocol = 0x06;
                    ip.TotalLength = 40;
                    ip.HeaderChecksum = ip.GenerateIPChecksum;

                    TCPPacket tcp = new TCPPacket(ip);
                    tcp.SourcePort = from.DestPort;
                    tcp.DestPort = from.SourcePort;
                    tcp.SequenceNumber = (uint)new Random().Next();
                    tcp.AckNumber = 0;
                    tcp.WindowSize = 8192;
                    tcp.SYN = true;
                    tcp.ACK = true;
                    tcp.Checksum = tcp.GenerateChecksum;
                    tcp.Outbound = true;
                    adapter.SendPacket(tcp);
                }

                try
                {
                    TCPPacket packet = (TCPPacket)in_packet;

                    // if the IP is in the blockcache, then return
                    if (data.BlockCache.ContainsKey(packet.SourceIP))
                    {
                        pmr = new PacketMainReturn(this);
                        pmr.returnType = PacketMainReturnType.Drop;
                        return pmr;
                    }

                    // checking for TTL allows us to rule out the local network
                    // Don't check for TCP flags because we can make an educated guess that if 100+ of our ports are
                    // fingered with a short window, we're being scanned. this will detect syn, ack, null, xmas, etc. scans.
                    if ((!packet.Outbound) && (packet.TTL < 250))
                    {
                        IPObj tmp;
                        if (ip_table.ContainsKey(packet.SourceIP))
                            tmp = (IPObj)ip_table[packet.SourceIP];
                        else
                            tmp = new IPObj(packet.SourceIP);

                        // add the port to the ipobj, set the access time, and update the table
                        tmp.addPort(packet.DestPort);
                        tmp.time(packet.PacketTime);
                        ip_table[packet.SourceIP] = tmp;
                        av = tmp.getAverage();

                        // if they've touched more than 100 ports in less than 30 seconds and the average
                        // packet time was less than 2s, something's wrong
                        if (tmp.getTouchedPorts().Count >= 100 && (!tmp.Reported) &&
                             tmp.getAverage() < 2000 )
                        {
                            pmr = new PacketMainReturn(this);
                            pmr.returnType = PacketMainReturnType.Log | PacketMainReturnType.Allow;
                            pmr.logMessage = string.Format("{0} touched {1} ports with an average of {2}\n", packet.SourceIP,
                                            tmp.getTouchedPorts().Count, tmp.getAverage());

                            // set the reported status of the IP address
                            ip_table[packet.SourceIP].Reported = true;

                            // add the address to the potential list of IPs and to the local SESSION-BASED list
                            if (!data.blockImmediately)
                            {
                                potentials.Add(packet.SourceIP, ip_table[packet.SourceIP]);
                                detect.addPotential(packet.SourceIP);
                            }
                            // else we want to block it immediately
                            else
                                data.BlockCache.Add(packet.SourceIP, ip_table[packet.SourceIP]);

                            return pmr;
                        }
                    }
                }
                catch (Exception e)
                {
                    pmr = new PacketMainReturn(this);
                    pmr.returnType = PacketMainReturnType.Log;
                    pmr.logMessage = String.Format("{0}\n{1}\n", e.Message, e.StackTrace);

                    return pmr;
                }
            }
            // This will detect UDP knockers.  typically UDP scans are slower, but are combined with SYN scans
            // (-sSU in nmap) so we'll be sure to check for these guys too.
            else if (in_packet.ContainsLayer(Protocol.UDP))
            {
                try
                {
                    UDPPacket packet = (UDPPacket)in_packet;

                    // if the source addr is in the block cache, return
                    if (data.BlockCache.ContainsKey(packet.SourceIP))
                    {
                        pmr = new PacketMainReturn(this);
                        pmr.returnType = PacketMainReturnType.Drop;
                        return pmr;
                    }

                    if ((!packet.Outbound) && (packet.TTL < 250) &&
                        (!packet.isDNS()))
                    {
                        IPObj tmp;
                        if (ip_table.ContainsKey(packet.SourceIP))
                            tmp = (IPObj)ip_table[packet.SourceIP];
                        else
                            tmp = new IPObj(packet.SourceIP);

                        tmp.addPort(packet.DestPort);
                        tmp.time(packet.PacketTime);
                        ip_table[packet.SourceIP] = tmp;
                        av = tmp.getAverage();

                        if ((tmp.getTouchedPorts().Count >= 100) && (!tmp.Reported) &&
                                (tmp.getAverage() < 2000))
                        {
                            pmr = new PacketMainReturn(this);
                            pmr.returnType = PacketMainReturnType.Log | PacketMainReturnType.Allow;
                            pmr.logMessage = string.Format("{0} touched {1} ports with an average of {2}\n", packet.SourceIP,
                                        tmp.getTouchedPorts().Count, tmp.getAverage());

                            ip_table[packet.SourceIP].Reported = true;

                            if (!data.blockImmediately)
                            {
                                potentials.Add(packet.SourceIP, ip_table[packet.SourceIP]);
                                detect.addPotential(packet.SourceIP);
                            }
                            else
                                data.BlockCache.Add(packet.SourceIP, ip_table[packet.SourceIP]);
                            return pmr;
                        }
                    }
                }
                catch (Exception e)
                {
                    pmr = new PacketMainReturn(this);
                    pmr.returnType = PacketMainReturnType.Log;
                    pmr.logMessage = String.Format("{0}\n{1}\n", e.Message, e.StackTrace);
                    return pmr;
                }
            }
            return null;
        }
Ejemplo n.º 12
0
 public EETHPacket(EthPacket eth)
     : base(eth.data)
 {
 }