
Amplifica la visibilità di rete da molteplici punti di vista di altri host.
In guerra, CornerShot è un'arma che permette a un soldato di guardare oltre un angolo (e possibilmente sparare) senza esporsi al rischio. Allo stesso modo, il pacchetto CornerShot permette di osservare l'accesso di rete di un host remoto senza bisogno di avere privilegi speciali su quell'host.
Usando CornerShot, una sorgente, con accesso di rete a un carrier, può determinare se esiste accesso di rete tra il carrier e il target per una specifica porta p.
Ad esempio, supponiamo che un red team stia cercando di propagarsi da un host sorgente "compromesso" A, a un host target X, a cui l'host A non ha accesso. Se si propagano attraverso l'host B, solo allora scopriranno che non c'è accesso di rete tra l'host B e X.
Usando CornerShot, il team può scoprire che l'host C ha effettivamente accesso al target X, quindi la propagazione verso il target X dovrebbe passare prima attraverso l'host C.
+-----+ +-----+ +-----+
| | | | filtered | |
| A +--------> B +----X--->(p) X |
| | | | | |
+-----+ +-----+ +-(p)-+
source carrier target
+ ^
| |
| +-----+ |
| | | open |
+---------->+ C +-------------+
| |
+-----+
Similmente a nmap, CornerShot distingue tra i seguenti stati delle porte: open (aperta), closed (chiusa), filtered (filtrata) e unknown (sconosciuta) (se non può essere determinata).
La seguente demo mostra l'esecuzione di CornerShot contro due host carrier 172.0.1.12 e 172.0.1.13, per determinare se hanno accesso di rete a 192.168.200.1:

Leggi di più qui.
Il compito apparentemente semplice di identificare se un host B nella rete ha accesso all'host C può richiedere una grande distribuzione di sensori di rete, agenti sui dispositivi o la raccolta di una moltitudine di regole firewall, configurazioni di router e policy degli host.
CornerShot può semplificare questo processo utilizzando uno (o pochissimi) agenti che possono interrogare altri host nella rete per determinare il loro accesso a host remoti.
I team di sicurezza che utilizzano BloodHound per trovare e mitigare i percorsi di escalation dei privilegi all'interno della loro rete spesso lottano con milioni di percorsi logici scoperti da BloodHound.
ShotHound è uno strumento che integra CornerShot con BloodHound, al fine di scoprire percorsi pratici supportati dall'accesso di rete.
CornerShot può essere utilizzato come pacchetto o come modulo standalone. Gli unici requisiti sono Python 3 e il pacchetto impacket.
pip install cornershot
L'uso base richiede le credenziali di un utente di dominio valido, un nome di dominio FQDN, un IP carrier e un IP target.
python -m cornershot <user> <password> <domain> <carrier> <target>
Per scansionare un intervallo di carrier contro un intervallo di target, possono essere utilizzati subnet o intervalli IP in una lista delimitata da virgole:
python -m cornershot <user> <password> <domain> 192.168.1.10-192.168.1.20 192.168.5.0/24,192.168.6.0/24
Per impostazione predefinita, CornerShot tenterà di scansionare le seguenti porte: 135, 445, 3389, 5985, 5986. L'utente può fornire una lista delimitata da virgole di porte e intervalli di porte:
python -m cornershot -tp 22,8080,45000-45005 <user> <password> <domain> <carrier> <target>
Nel codice, è necessario istanziare un oggetto CornerShot con nome utente, password e nome di dominio di un utente di dominio valido. L'aggiunta di carrier, target e porte si ottiene tramite il metodo add_shots. Una volta pronto, è possibile chiamare il metodo open_fire, che esegue solo le chiamate RPC pertinenti in base alle porte richieste.
from cornershot import CornerShot
cs = CornerShot("username", "password", "fqdn")
cs.add_shots(carriers=["192.168.1.1"],targets=["192.168.1.2","192.168.1.3"])
results = cs.open_fire()
Il risultato di open_fire è un dizionario con chiavi dei carrier, ogni carrier ha un altro insieme di chiavi per i target, e infine ogni target contiene un dizionario di porte e i rispettivi stati. Questo è un formato di esempio del risultato:
{'carrier_1':
{'target_1':
{135: 'unknown', 445: 'filtered', 3389: 'filtered', 5986: 'filtered', 5985: 'filtered'},
'target_2':
{135: 'unknown', 445: 'open', 5985: 'unknown', 5986: 'filtered', 3389: 'open'}
},
'carrier_2':
{'target_1':
{3389: 'filtered', 135: 'filtered', 5985: 'filtered', 445: 'filtered', 5986: 'unknown'},
'target_2':
{5985: 'filtered', 5986: 'filtered', 445: 'filtered', 135: 'filtered', 3389: 'open'}
}
}
CornerShot si basa su vari metodi di Remote Procedure Call (RPC) standard e ben documentati, utilizzati da vari servizi Microsoft. Utilizzando metodi che richiedono solo un account autenticato nel dominio, CornerShot è in grado di innescare traffico di rete da un host carrier verso un target.
CornerShot è in grado di determinare lo stato della porta remota misurando il tempo impiegato da una chiamata RPC e utilizzando diversi codici di errore per ciascun metodo RPC.
Il lettore potrebbe conoscere il "printer bug", scoperto da Lee Christensen. Sebbene sia chiamato bug, è un comportamento ben documentato del servizio di stampa, che consente a qualsiasi utente autenticato di costringere un server remoto ad autenticarsi verso qualsiasi macchina, utilizzando il metodo RpcRemoteFindFirstPrinterChangeNotificationEx.
CornerShot utilizza i seguenti metodi RPC da diversi protocolli Microsoft (ci sono molti altri metodi, che saranno implementati nelle versioni future):
L'implementazione dei protocolli stessi è ottenuta tramite il meraviglioso pacchetto impacket.
Questo metodo riceve come parametro un printerName. Il nome printerName può essere un percorso a un file locale, un file remoto o anche a una stampante web. Fornendo un nome che sia conforme al formato WEB_PRINT_SERVER, è possibile interrogare qualsiasi porta remota. Un esempio di nome di server di stampa web che innescherà traffico HTTP verso un host e una porta remoti è: "http://<target_ip>:<target_port>/printers/ppp/.printer".
Per utilizzare questo metodo, abbiamo bisogno di un approccio in due fasi: prima, aprire una chiave di registro sull'host remoto - che restituisce un handle valido, e poi, tentare di salvare un backup di questo handle su un file remoto. Il metodo BaseRegSaveKey riceve un percorso di file in cui può salvare un backup di un registro, innescando traffico SMB sulla porta 445 (e 135 come backup) verso un target. La chiave di registro che CornerShot apre è HKEY_CURRENT_USER, che è aperta in lettura per impostazione predefinita sulla maggior parte degli host client.
Questa funzione tenta di eseguire il backup degli eventi di Windows in un percorso file, che può essere remoto - in tal caso il servizio tenterà di accedere all'host e al percorso remoto.
Simile al metodo EVEN, solo che questo metodo utilizza una versione diversa del protocollo Eventi di Windows, che viene eseguita direttamente su TCP - non è necessario che la porta SMB sia aperta.
CornerShot stima lo stato delle porte remote basandosi su fattori temporali e messaggi di errore ricevuti dal metodo RPC o dal trasporto sottostante. Sperimentando con diversi host Windows e vari protocolli RPC, abbiamo determinato 3 diverse soglie temporali che si sono dimostrate efficaci nella maggior parte degli ambienti di rete. Queste soglie sono meglio illustrate con la seguente figura:
+ + +
| | |
unknown | open / closed | filtered | open
/ | | |
open | | |
| | |
+-------------+------------------+-----------------+--------------+
0 0.5 20 40 Secondi
MIN FILTERED UPPER
La soglia MIN è di 0,5 secondi, le risposte al di sotto di questa soglia indicano un errore nel metodo RPC sottostante o nel trasporto, oppure potrebbe essere stata ricevuta una risposta dall'host target.
Le risposte al di sotto della soglia FILTERED di 20 secondi potrebbero indicare una porta aperta o chiusa, a seconda del tipo di messaggio di errore ricevuto per il metodo.
Le risposte tra la soglia FILTERED e la soglia UPPER di 40 secondi indicano una porta filtrata per tutti i metodi testati (finora...). E le richieste che superano il limite UPPER indicano una connessione TCP aperta prolungata.
Eseguire CornerShot verso diverse versioni e configurazioni di sistemi operativi produrrà risultati diversi. Non tutte le versioni di Windows hanno le stesse named pipe o si comportano allo stesso modo quando interrogate con lo stesso metodo RPC. La maggior parte dei Windows OOTB non espone SMB e altri servizi RPC sulla rete, tuttavia, l'esperienza ha dimostrato che in ambienti di grandi dimensioni queste porte tendono ad essere aperte e accessibili per la maggior parte delle risorse.
La seguente tabella mostra il supporto predefinito per vari protocolli RPC, dato che le porte appropriate siano accessibili all'host carrier e non siano state apportate modifiche alla configurazione dell'host:
* Se il servizio Webclient è in esecuzione su un computer client, è possibile scansionare porte aggiuntive. Attualmente CornerShot non supporta questa opzione.
** Il protocollo RPRN è supportato sugli host server, tuttavia l'apertura di una stampante web remota non funziona (motivo per cui non possiamo scansionare QUALSIASI porta target) - fino a quando non troveremo una soluzione alternativa 😉
Sono benvenuti ulteriori shot RPC o qualsiasi altro contributo!
Tutti i metodi RPC sono implementati in /shots e ereditano da una classe astratta chiamata BaseRPCShot. La cartella /example mostra come creare uno shot RPC personalizzato e utilizzarlo nel codice.
CornerShot è rilasciato sotto la licenza Apache 2.0. Per maggiori dettagli, vedere LICENSE.
Siamo felici di sentirti! Per bug, patch, suggerimenti su questo pacchetto, contattaci a [email protected]
| Sistema operativo | Protocolli RPC supportati | Porte carrier aperte richieste | Porte target scansionabili possibili |
|---|
| Windows 7 | EVEN,EVEN6 | 445 / 135 & porta tcp even6 | 445* |
| Windows 8 | EVEN,EVEN6 | 445 / 135 & porta tcp even6 | 445* |
| Windows 10 | EVEN,EVEN6,RPRN | 445 / 135 & porta tcp even6 | QUALSIASI |
| Server 2008 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & porta tcp even6 | 445 |
| Server 2012 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & porta tcp even6 | 445 |
| Server 2016 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & porta tcp even6 | 445 |
| Server 2019 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & porta tcp even6 | 445 |