Messaggi di scambio di versione della classificazione del protocollo SSH

2

Sto cercando di classificare i protocolli di rete sul traffico di rete. Ora il mio compito è il protocollo SSH. Ho letto l'RFC e so che SSH inizia con il messaggio di scambio del protocollo da client e server.

Il formato è: SSH-protoversion-softwareversion SP commenti CR LF

Inoltre ho trovato un progetto open source chiamato "ndpi" che già implementava questo

if (flow->l4.tcp.ssh_stage == 0) {
    if (packet->payload_packet_len > 7 && packet->payload_packet_len < 100
        && memcmp(packet->payload, "SSH-", 4) == 0) {
        flow->l4.tcp.ssh_stage = 1 + packet->packet_direction;
        return;
    }
} else if (flow->l4.tcp.ssh_stage == (2 - packet->packet_direction)) {
    if (packet->payload_packet_len > 7 && packet->payload_packet_len < 100
        && memcmp(packet->payload, "SSH-", 4) == 0) {
        ndpi_int_ssh_add_connection(ndpi_struct, flow);
        return;
    }
}

Controlla se il carico utile contiene "ssh-" stringa. Ma non riesco a capire la connessione con "packet_direction". Penso semplicemente a verificare se 2 payload in un flusso contengano "ssh-" stringa sarebbe sufficiente. Voglio chiedere se devo prendere in considerazione packet_direction e se sì perché?

    
posta Kadir Erdem Demir 19.04.2013 - 09:08
fonte

1 risposta

1

Il pezzo di codice che mostri sta facendo esattamente questo: sta verificando che ci sia un pacchetto (di dimensioni tra 8 e 99 byte, che inizia con "SSH-") in entrambe le direzioni . Poiché client e server dovrebbero parlare un po 'simultaneamente, il motore di rilevamento non può presumere che vedrà prima il pacchetto dal client o dal pacchetto dal server; e sapere quale lato della connessione è il "client" potrebbe essere comunque difficile nel contesto dell'elaborazione pacchetto per pacchetto.

Quindi il codice che mostri usa un flag chiamato packet_direction che ha valore 0 o 1, per le due direzioni possibili. In seguito chiamerò la direzione 0 "AtoB" e la direzione 1 "BtoA" (non importa se A o B è il client a livello TCP). Il codice usa anche un flag interno ssh_stage , inizialmente a 0. Quando viene rilevato un primo pacchetto che soddisfa le condizioni (dimensione da 8 a 99 byte, inizia con "SSH-"), viene utilizzata la prima metà del codice (dal ssh_stage è 0 in quel punto), e ssh_stage è impostato a 1 se questo primo pacchetto si trova nella direzione "AtoB", 2 se è nella direzione "BtoA".

Quando arriva un secondo pacchetto corrispondente, packet_direction è ora impostato sulla direzione di quel secondo pacchetto. Se quel secondo pacchetto è nella stessa direzione del primo pacchetto, allora il valore corrente di ssh_stage sarà non corrispondente all'espressione 2 - packet->packet_direction ; tuttavia, corrisponderà se il secondo pacchetto proviene dall'altra direzione (ad esempio il secondo pacchetto è in "BtoA" mentre il primo pacchetto era in "AtoB").

Per riassumere , il codice controlla che ci siano effettivamente due pacchetti "in cerca di SSH" in direzioni opposte , a differenza di due pacchetti successivi nella stessa direzione del flusso .

Ciò che dovresti fare dipende da quanto affidabile vuoi che sia il tuo motore. Se si richiedono solo due pacchetti SSH senza considerare la direzione, si potrebbero ottenere dei falsi positivi, nel caso in cui un client SSH non riesca a inviare due pacchetti di questo tipo a un server non SSH. Richiedere che i due pacchetti fluisca in direzioni opposte causerà meno falsi positivi. Tieni presente che il codice ndpi non è già affidabile al 100%.

In effetti, se guardi RFC 4253 :

  • Le stringhe iniziali inviate da client e server possono avere una lunghezza massima di 255 caratteri, non 99.
  • Dopo lo scambio delle stringhe della versione, la finestra di dialogo di configurazione della connessione continua con alcuni dati aggiuntivi del client, che il client può inviare immediatamente , possibilmente nello stesso pacchetto della sua stringa di versione, quindi la lunghezza del payload del client potrebbe essere molto superiore a 255 byte.
  • Il server può inviare alcune righe extra di caratteri prima della sua stringa di versione, quindi la lunghezza del payload del pacchetto server può anche superare 255, e non inizia necessariamente con "SSH -".

Quindi il codice ndpi potrebbe perdere alcune connessioni SSH perfettamente standard. Spetta a te decidere se vuoi perdere più o meno tali connessioni. Certo, più affidabile è il tuo codice, più lavoro dovrai fare ...

    
risposta data 19.04.2013 - 13:28
fonte

Leggi altre domande sui tag