Angriffsignaturen 2 - tcp-syn-portscan

  • Themenstarter Themenstarter friday0D
  • Beginndatum Beginndatum
F

friday0D

Guest
Hallo liebe Freunde,

mal angenommen Ihr seid ein Securitytool welches schon ewig denn Datenverkehr in einem LAN mitbekommt.Ihr arbeitet rein passiv. Ihr könnte euch alles merken, was den Datenverkehr betrifft, was Ihr wollt. Z.B. seid Ihr angeschlossen an einen mirrorport des LAN-Switches, der den gesamten Datenverkehr des Netzwerksegmentes auf euch spiegelt.

Wie stellt Ihr einen synbasierten tcp portscan eines ungebetenen Gastes fest ?
Bitte keine Tools nennen sondern Merkmale an Paketen, Beziehungen.

Vorbedingung:
Der Switch bietet keine Sicherheitsmerkmale im Bereich Layer 2 und 3 an. Es gibt keine firewall, d.h. jeder von ausßen kann Pakete in euer LAN schicken, der router benutzt nicht nat, sondern läßt alle Anfragen in das LAN unmittelbar an den Empfänger adressiert hinein.
 
Pro src/dst eine Tabelle mit den Ports die in den letzten x sekunden angesprochen wurden wenn ports ueber einer gewissen threshold dann moeglicherweise portscan.

Andere Moeglichkeit du sagt dem Prog welche ports offen sind und jeder connect versuch auf einen port der nicht offen sein soll ist suspicious.
 
Original von Ancient
Pro src/dst eine Tabelle mit den Ports die in den letzten x sekunden angesprochen wurden wenn ports ueber einer gewissen threshold dann moeglicherweise portscan.

hast Dich ja sehr knapp gehalten ;) Um den Hintergrund Deines Ansatzes etwas zu beleuchten hole ich dann wohl mal ein bischen aus, wenn ich Dich fehlinterpretiere, sag bescheid.




Original von Ancient
Andere Moeglichkeit du sagt dem Prog welche ports offen sind und jeder connect versuch auf einen port der nicht offen sein soll ist suspicious.

Leider gibt es Anwendungen, die dynamisch ports anbieten, siehe remoting. Hier hätten wir mit einer vordefinierten Portangabe Probleme.

Weitere Ideen, Verfeinerungen ?
 
Ja die basis des TCP habe ich mal vorausgesetzt.

ad genauer wenn das alle machen ist es ja egal wenns der selbe port ist es geht darum die connection (atempts) / source <-> dst pair zu loggen und wenn eine source weis nicht sagen wir mal 50 verschiedene ports hat dann ist da ml sehr verdaechtig.
 
Original von Ancient
Ja die basis des TCP habe ich mal vorausgesetzt.

ad genauer wenn das alle machen ist es ja egal wenns der selbe port ist es geht darum die connection (atempts) / source <-> dst pair zu loggen und wenn eine source weis nicht sagen wir mal 50 verschiedene ports hat dann ist da ml sehr verdaechtig.

Hallo nochmal Ancient,

also ich denke Du gehst mit mir konform, wenn ich sage, dass ein tcp portscan grundsätzlich daran zu erkennen ist, dass ein hoher Prozentsatz der Anfragen mit keinen syn,ack beantwortet werden, d.h. die wenigen Treffer eines scans können wir nicht als Maßstab nehmen.

Wenn ein Synpaket kommt erstellen wir einen attempt record. Wenn ein synack zu diesem kommt löschen wir den record. Wenn die Anzahl records pro sourceip einen Anzahl/Zeit Schwellwert überschreitet haben wir definitiv einen portscan festgestellt.

Auf der anderen Seite können wir hier noch mehr feststellen, wenn wir die Anzahl empfangener synpakete/Zeit auf der zielip-seite erheben, und die Datensätze ausradieren wenn das Ziel mit einem synack antwortet und darauf ein ack, als Ende des 3way-handshake kommt. Wenn wir das tun haben wir an dieser Stelle die Signatur tcp-syn based Denial of Service festgestellt, distributed oder von einer Quelle ausgehend!
Oder ..? soweit i.o.

Anregungen Meinungen Kritik ?
 
Hallo,

dank der netten Anzeigen habe ich die Chance auf meinen eigenen Beitrag zu antworten ;)

Code:
class pvampTCPInspector
    {
        pvampDB DB;
        Hashtable Connections_SynSent = new Hashtable();
        Hashtable Connections_All = new Hashtable();
        Hashtable SynFromSource = new Hashtable();
        int min_time_for_syncheck = 5;
        int max_syn_for_source = 5;
        DateTime LastSynCheck = DateTime.Parse("01.01.1900");

        public pvampTCPInspector(pvampDB pDB)
        {
            DB = pDB;
        }
        public void putPacket(TCPPacket  P)
        {
            TimeSpan TimeBetweenLastSynCheck = DateTime.Now - LastSynCheck;
            if (TimeBetweenLastSynCheck.TotalSeconds > min_time_for_syncheck)
            {
                // it's time for a check for half open connections
                // for each recognized syn sender do so
                foreach (DictionaryEntry DE in SynFromSource)
                {
                    int syncount = 0;
                    // for each target connection of the syn sender do
                    foreach (DictionaryEntry SubDE in (Hashtable)DE.Value)
                    {
                        // get the associated connection and count new entries since last check
                        TCPConnection ThisConnection = (TCPConnection)SubDE.Value;
                        TimeSpan connection_alive_since_sec = 
                            DateTime.Now - ThisConnection.Created;
                        if (connection_alive_since_sec <= TimeBetweenLastSynCheck)
                        {
                            syncount++;
                        }
                    }  
                    if (syncount > max_syn_for_source)
                    {
                        Console.WriteLine("handle: tcp: tcp-syn-portscan possible");
                    }
                }
            }

            TCPConnection Connection = GetTCPConnection(P);
            if (Connection == null)
            {
                // this TCP Connection isn't present
                if (P.Syn && !P.Ack)
                {
                    // this may be a normal connection attempt
                    // Create the Connection object and link it from connections_all
                    // and connection_SynSent, synfromsource association
                    
                    string PK = Helper.TCP_ConnectionPK(P);
                    Connections_All[PK] = new TCPConnection(
                        P.SourceAddress.ToString(), P.DestinationAddress.ToString(),
                        P.SourcePort, P.DestinationPort,P.SequenceNumber );
                    Connections_SynSent[PK] = (TCPConnection)Connections_All[PK];
                    Console.WriteLine("handle: tcp: syn for connection " + PK);

                    // Create a syn table, 
                    // if acual source protoadress has not accured yet in this context
                    if (SynFromSource[P.SourceAddress.ToString()] == null)
                        SynFromSource[P.SourceAddress.ToString()] = new Hashtable();
                    // Subdevide structure to SourceIP in toplevel and the target parameters in sublevel
                    Hashtable SubEntries = (Hashtable)SynFromSource[P.SourceAddress.ToString()];
                    string SubPK = string.Format("{0}|{1}",
                        P.DestinationAddress.ToString(),
                        P.DestinationPort .ToString());
                    SubEntries[SubPK] = (TCPConnection)Connections_All[PK];
                }
                else
                {
                    // this connection may be alive since a time before pvamp started
                }
            }
            else
            {
                TCPConnectionState ChangeEvent= Connection.putPacket(P);
                // When receiving a synack or rst, the syn entries should be erased
                if (ChangeEvent == TCPConnectionState.SynAckReceived
                    | ChangeEvent == TCPConnectionState.RstReceived  )
                {
                    SynFromSource.Remove(Connection.SourceIP );
                    Console.WriteLine("handle: tcp: removed " + 
                        Connection.SourceIP  + " from syncheck table");
                }
            }
            
        }

        TCPConnection GetTCPConnection(TCPPacket P)
        {
            if (Connections_All[P.SourceAddress.ToString() + "|"
                + P.SourcePort.ToString() + "|"
                + P.DestinationAddress.ToString() + "|"
                + P.DestinationPort.ToString()] != null)
            {
                return (TCPConnection)Connections_All[
                    P.SourceAddress.ToString() + "|" + P.SourcePort.ToString() + "|" + 

P.DestinationAddress.ToString() + "|" + P.DestinationPort.ToString()];
            }
            else if (Connections_All[P.DestinationAddress.ToString() + "|"
                + P.DestinationPort.ToString() + "|"
                + P.SourceAddress.ToString() + "|"
                + P.SourcePort.ToString()] != null)
            {
                return (TCPConnection)Connections_All[
                    P.DestinationAddress.ToString() + "|" + P.DestinationPort.ToString() + "|" + 

P.SourceAddress.ToString() + "|" + P.SourcePort.ToString()];
            }
            else
                return null;
        }
    }
 
Zurück
Oben