Come passare un controllo localhost per una richiesta in arrivo?

1

Sto tentando di inviare una richiesta a un server http ospitato su una macchina. Il server http è in C # e rilascia tutti i pacchetti che non provengono da localhost:

public void Request(HttpListenerContext context) {
    if(!IPAddress.IsLoopback(context.Request.LocalEndPoint.Address))
        this.ConnectionRefused()
    ...
}

Mi è venuta l'idea di usare scapy e spoofing TCP src IP per 127.0.0.1, e la macchina riceve il pacchetto (confermato in wireshark), ma la richiesta sembra non essere attivata. Mi chiedo se qualcuno sa come posso fare una richiesta http a questa porta bypassando il controllo Loopback.

    
posta Rob Gates 02.10.2018 - 00:22
fonte

1 risposta

3

Si "passa" un controllo localhost inviando la richiesta a localhost (o 127. * o :: 1). Ad esempio, puoi fare in modo che un browser esegua il collegamento a link o link . Lo snippet di codice C # che hai postato per il server sta controllando l'indirizzo IP locale, quindi per un server che è l'indirizzo IP al quale il server ha ricevuto la richiesta di connessione, e dal punto di vista del client è l'indirizzo IP a cui il client sta tentando di connettersi ( la destinazione).

Se provi a inviare tale richiesta da qualsiasi macchina diversa da quella a cui stai tentando di connettersi, instraderai la richiesta sul tuo computer, che non è quello che desideri (ma è il punto del loopback indirizzo). Se provi a creare pacchetti Ethernet grezzi che contengono solo traffico TCP / IP e imposta la destinazione IP su 127.0.0.1 ma provi a trasmettere il pacchetto su un'altra macchina (tramite indirizzo MAC), una di queste cose succederà:

  • Riceverai un errore dallo stack di rete, perché il pacchetto è stato riconosciuto come traffico IP e viene trasmesso erroneamente. La maggior parte dei driver di rete probabilmente non lo farà, però, e se lo fanno puoi (in teoria) modificare questo comportamento.
  • Il tuo pacchetto uscirà sulla rete, ma sarà respinto dal primo nodo a cui arriva (probabilmente un interruttore o un router, a meno che tu non abbia una connessione diretta con l'altra macchina) perché, ancora, non è valido; è destinato alla rete di loopback ma proviene da una rete esterna. Questo potrebbe essere quello che stai vedendo in Wireshark.
  • Il tuo pacchetto sarà accettato da un router o switch, ma passato alla rete loopback di quel router / switch (dopotutto, questo è l'indirizzo IP di destinazione) piuttosto che passarlo su qualsiasi altro host (non sa dove sarà il prossimo per inviare il pacchetto). Questo sarebbe un bug di sicurezza nel dispositivo e vale la pena riportare al produttore se trovato.
  • Il pacchetto verrà inviato al computer di destinazione (se connesso direttamente o eventualmente trasmesso attraverso un hub di rete) e inizialmente accettato dallo stack di rete come pacchetto SYN TCP. Tuttavia, quando il server tenta di rispondere con SYN/ACK , fallirà perché sta tentando di inviare un pacchetto non valido (originato con localhost ma associato a un host esterno). Questo è ancora probabilmente un bug di sicurezza nel driver di rete / stack IP , perché i pacchetti UDP non richiedono un handshake del genere. Molto valore da segnalare.
  • Il pacchetto raggiunge l'host di destinazione ed è accettato (come sopra), e si ottiene un SYN/ACK TCP dal server, invitando a completare l'handshake con un ACK finale e iniziare a trasmettere i dati. Probabilmente avrai bisogno di un listener di socket raw per questo, perché lo stack di rete del sistema operativo non riconoscerà il pacchetto in entrata come parte di un handshake TCP su cui stava lavorando (anche se, teoricamente, potresti applicarlo alle patch per farlo). Questo indica un bug di sicurezza grave nello stack di rete del server .

Si noti che in nessuno di questi casi, eccetto l'ultimo, c'è qualche possibilità che il server web C # veda la richiesta entrare. HTTP viene trasmesso su TCP, e i server TCP non sono nemmeno avvisati che qualcuno si sta connettendo a loro fino al completamento della stretta di mano. Quindi, a meno che tu non abbia un bug grave veramente nello stack di rete e sia collegato abbastanza direttamente, questo non accadrà mai.

Ora, se vuoi sapere come raggiungere un server in ascolto solo su loopback dall'esterno della macchina, la soluzione è trovare un programma sullo stesso host del server di destinazione che fa ascolta il traffico esterno e invierà richieste a destinazioni specificate (un proxy), oppure potrà essere utilizzato per creare nuove richieste web (questo è un Attacco di contraffazione richiesta lato server (SSRF) e un modo comune per crearli è tramite un XML eXternal Entità (XXE) attacco).

    
risposta data 02.10.2018 - 03:51
fonte

Leggi altre domande sui tag