
IPSpinner funziona come un proxy locale che reindirizza le richieste attraverso servizi esterni.
IPSpinner è un proxy locale che può essere utilizzato per reindirizzare tutte le richieste in entrata attraverso diversi provider scelti. Lo scopo è creare un proxy di passaggio che ruoti l'indirizzo IP sorgente di ogni richiesta. Ad esempio, eseguire un'operazione di brute force tramite IPSpinner aiuta a evitare di essere scoperti, poiché il server riceverà le richieste da centinaia di indirizzi IP diversi.
IPSpinner supporta attualmente AWS (API Gateway), Azure (Cloud Shell) e GitHub (GitHub Actions).
Figura 1: IPSpinner - Diagramma generale
IPSpinner funziona come un proxy locale che reindirizza le richieste attraverso servizi esterni. A tale scopo, IPSpinner sfrutta provider e launcher.
Un provider corrisponde a un cloud provider o a un fornitore di servizi online (AWS, Azure, GitHub, ecc.), che offre diversi servizi, chiamati launcher, utilizzabili per inoltrare le richieste dell'utente (AWS API Gateway, GitHub Actions, Azure Cloud Shells, ecc.).
Pertanto, per avviare IPSpinner, l'utente dovrà fornire le credenziali per i provider che vuole utilizzare e configurazioni aggiuntive per i launcher. È possibile utilizzare più tipi di launcher contemporaneamente: IPSpinner sceglierà casualmente uno di quelli disponibili per ogni richiesta.
Inoltre, IPSpinner implementa una funzionalità di preload. Alcuni launcher possono essere precaricati per evitare il ritardo di riconfigurazione nel caso in cui il proxy veda un nuovo host. Per questi launcher, la procedura di preload è consigliata ma non obbligatoria. Per gli altri, non è necessario alcun preload.
IPSpinner può sfruttare AWS API Gateway per inviare richieste. Questa implementazione è basata su FireProx, che crea un REST API Gateway per reindirizzare le richieste in entrata. FireProx è stato quindi adattato per gestire più host per API Gateway e per implementare nuove funzionalità. In sintesi, quando IPSpinner riceve una richiesta, seleziona o crea l'istanza API Gateway corretta e invia la richiesta verso la destinazione. Poi raccoglie la risposta e la restituisce all'utente. In questo modo, il server di destinazione riceve la richiesta dall'API Gateway e non direttamente dall'utente. Poiché API Gateway ruota il suo IP in uscita per ogni richiesta, IPSpinner sfrutta questa funzionalità per rendere rotante l'indirizzo IP.
Figura 2: AWS API Gateway - Diagramma generale
Il grafico seguente, realizzato nell'ottobre 2024, mostra il numero di indirizzi IP univoci disponibili per regione AWS in base al numero di richieste inviate. La maggior parte delle regioni offre più di 100 indirizzi IP e più regioni possono essere utilizzate contemporaneamente, consentendo all'utente di instradare le proprie richieste attraverso migliaia di indirizzi in tutto il mondo.
Figura 3: AWS API Gateway - Indirizzi IP disponibili per regione
Infine, la Figura 4 mostra, con un livello di colore verde logaritmico, quanti indirizzi sono disponibili per paese. Dimostra che l'utente ha la possibilità di falsificare il proprio indirizzo IP sorgente con indirizzi di qualsiasi continente.
Figura 4: AWS API Gateway - Indirizzi IP per paese
IPSpinner implementa una funzionalità di rotazione che elimina e rinnova regolarmente le istanze FireProx create. Come mostra il grafico seguente, la rotazione di un'istanza FireProx può fornire un nuovo sottoinsieme di IP. Tuttavia, ogni regione AWS ha un set limitato di IP e quindi, a un certo punto, le rotazioni non forniranno nuovi IP.
Figura 5: AWS API Gateway - Processo di rotazione
Questo launcher implementa una procedura di preload. Come già detto, non è obbligatoria, ma può prevenire alcuni ritardi di riconfigurazione o errori di sincronizzazione durante i primi secondi dopo la riconfigurazione.
Inoltre, gli API Gateway impostano di default un header X-Forwarded-For, che non può essere eliminato ma può essere sovrascritto. L'utente può quindi specificare nella configurazione di IPSpinner un intervallo di indirizzi IP da cui verrà scelto un IP casuale per ogni richiesta (intervallo IPv4 o IPv6).
IPSpinner sfrutta Azure Cloud Shell per inviare richieste. Azure Cloud Shell è un terminale interattivo, autenticato e accessibile dal browser per la gestione delle risorse Azure. Cloud Shell viene eseguito su un host temporaneo fornito su base per-sessione e per-utente.
IPSpinner utilizza quindi diversi utenti Azure per i quali viene preparata una sessione Cloud Shell. Ogni richiesta verrà poi reindirizzata a una Cloud Shell inizializzata, prima di essere rinnovata per reimpostare il proprio indirizzo IP.
Figura 6: Azure Cloud Shell - Diagramma generale
Come mostra il grafico seguente, le diverse regioni disponibili per la distribuzione delle sessioni Cloud Shell offrono ciascuna decine di indirizzi IP. L'utente può configurare più regioni contemporaneamente per aumentare il proprio pool di IP.
Figura 7: Azure Cloud Shell - Indirizzi IP disponibili per regione
Tuttavia, gli indirizzi IP sono più concentrati rispetto ad AWS API Gateway. Come illustra la mappa seguente, la maggior parte di essi si trova negli Stati Uniti, in Europa e in India.
Figura 8: Azure Cloud Shell - Indirizzi IP per paese
A causa del ritardo del processo di rinnovo di Cloud Shell, consigliamo di limitare la velocità di flusso delle richieste. Ulteriori informazioni nella sottosezione confronto tra launcher.
IPSpinner può anche sfruttare GitHub Actions per inviare richieste. Questa implementazione si ispira a git-rotate ma è stata completamente modificata e adattata per eliminare il server catcher.
Crea un repository con un modello di workflow predefinito. Poi, per ogni richiesta, esegue il workflow fornendo le informazioni sulla richiesta tramite le variabili d'ambiente. Tutti i dati vengono crittografati per evitare che siano leggibili da un utente esterno. IPSpinner infine raccoglie i dati di risposta dai log del workflow.
Figura 9: GitHub Actions - Diagramma generale
La figura seguente mostra che GitHub Actions offre migliaia di indirizzi IP diversi.
Figura 10: GitHub Actions - Indirizzi IP disponibili per regione
Tuttavia, la mappa seguente illustra che GitHub Actions offre solo indirizzi IP americani. Dopo l'analisi, i loro worker sembrano essere distribuiti su un'infrastruttura Azure.
Figura 11: GitHub Actions - Indirizzi IP per paese
⚠️ Inoltre, "GitHub prende seriamente gli abusi e lo spam delle Actions e dispone di un team dedicato al monitoraggio degli 'utenti spam'." Pertanto, l'utente NON DEVE utilizzare questo provider con il proprio account o con l'account aziendale per evitare qualsiasi problema di chiusura dell'account.
A causa del limite orario dell'API REST di GitHub, la velocità massima di flusso delle richieste deve essere limitata per evitare interruzioni. Ulteriori informazioni nella sottosezione confronto tra launcher.
Questo progetto è stato testato con una versione di Go >= 1.21, ma potrebbe funzionare anche con versioni inferiori.
Vedi documentazione sull'installazione di Go
Dopo l'installazione, assicurati che il binario go predefinito sia quello corretto:
$ go version
go version go1.21.1 linux/amd64
$ git clone https://github.com/synacktiv/IPSpinner.git
$ cd IPSpinner
$ go mod tidy
$ make build-linux # For Linux AMD64 arch
$ make build-windows # For Windows AMD64 arch
L'eseguibile sarà chiamato per impostazione predefinita "ipspinner" su Linux o "ipspinner.exe" su Windows.
Al termine dell'utilizzo, puoi pulire le build eseguendo
$ make clean
Per ottenere aiuto sull'utilizzo di IPSpinner, puoi eseguire il comando senza alcun argomento:
$ ./ipspinner -h
Help will be displayed
Tutte le informazioni (escluse le richieste di reindirizzamento) vengono registrate nel file ipspinner.log.
Alcune opzioni comuni sono disponibili come argomenti, mentre le altre informazioni di configurazione devono essere fornite in un file di configurazione INI.
L'utente può specificare alcuni argomenti della riga di comando:
Alcuni parametri globali e dei provider devono essere specificati in un file di configurazione INI. Il file di configurazione deve essere preparato prima di eseguire IPSpinner. Il suo contenuto verrà spiegato nelle prossime sottosezioni. Per impostazione predefinita, IPSpinner cerca un file di configurazione denominato config.ini.
Per gestire le richieste https, IPSpinner necessita di un certificato di Certificate Authority (CA) e di una chiave. Se l'utente non fornisce un certificato, IPSpinner genererà il proprio certificato e la propria chiave autofirmati. L'utente può richiedere il recupero del certificato generato con --export-ca-cert (ad es. per importarlo nel browser). In alternativa, l'utente può fornire il proprio certificato CA e la propria chiave nel file di configurazione (vedere le parti successive).
L'utente può specificare l'host e la porta di ascolto con --host e --port.
Infine, sono disponibili tre modalità verbose:
Un modello per il file di configurazione INI è disponibile nel repository del progetto.
Nella sezione proxy, l'utente può specificare alcuni parametri:
Tutte le altre sezioni saranno descritte nel capitolo relativo al provider corrispondente.
È importante notare che un utente può abilitare più provider e launcher contemporaneamente. IPSpinner sceglierà quindi un launcher casuale tra tutti quelli disponibili per ogni richiesta.
Parametri di configurazione per AWS, nella sezione aws:
Parametri di configurazione per gli API Gateway, nella sezione aws:
Parametri di configurazione per Azure, nella sezione azure:
Parametri di configurazione per Azure Cloud Shell, nella sezione azure:
Parametri di configurazione per GitHub, nella sezione github:
| Parametro | Obbligatorio | Valore predefinito | Descrizione |
|---|---|---|---|
| username | ✅ | Nome utente GitHub | |
| token | ✅ | Token GitHub associato al nome utente fornito |
Parametri di configurazione per GitHub Actions, nella sezione github:
| Parametro | Obbligatorio (se ga_enabled=true) | Valore predefinito | Descrizione |
|---|---|---|---|
| ga_enabled | / | Abilita il launcher GitHub Actions |
IPSpinner non supporta il protocollo HTTP/2. Poiché il proxy termina la prima connessione TLS, i vantaggi del protocollo vengono persi e la connessione appare come una normale connessione HTTP/1.1.
Pertanto, per evitare problemi con HTTP/2 quando si utilizza IPSpinner con Burp Suite, rimuovere il supporto client HTTP/2: Settings > Network > HTTP > HTTP/2 > Deselezionare la casella HTTP/2.
| AWS API Gateway | Azure Cloud Shell | GitHub Actions |
|---|
| Indirizzi IP disponibili | ≈ 12,418 | ≈ 276 | > 6,000 |
| Tempo di risposta medio | 0.46s | 13.04s | 21.42s |
| Tempo medio di riconfigurazione | Nessuno | 20s | Nessuno |
| Velocità di flusso teorica massima | da 4.000 a 16.000 req/h | 107 req/h/istanza cloud shell | 1.000 req/h |
| Può/Deve essere precaricato? | ✅ | ❌ | ❌ |
| Utilizzo: navigazione | ✅ | ❌ | ❌ |
| Utilizzo: password spraying | ✅ | ✅ | ✅ |
| Parametro | Obbligatorio | Valore predefinito |
|---|
| --config | ❌ | config.ini |
| --export-ca-cert | ❌ | |
| --host | ❌ | |
| --port | ❌ | 8080 |
| --v, --vv, --vvv | ❌ |
| Parametro | Obbligatorio | Valore predefinito | Descrizione |
|---|
| preload_hosts_file | ❌ | un elenco di URL/host da precaricare, per i provider che possono precaricare host | |
| whitelist_hosts_file | ❌ | un elenco di URL/host in whitelist (tutti gli altri saranno in blacklist per impostazione predefinita) | |
| blacklist_hosts_file | ❌ | un elenco di URL/host in blacklist (ignorato se è impostata la whitelist) | |
| ca_cert_file & ca_cert_key_file | ❌ | un certificato CA fornito dall'utente (se si vuole sostituire quello generato predefinito) | |
| user_agents_file | ❌ | un elenco di user agent che verranno scelti casualmente per le richieste | |
| debug_response_headers | ❌ | false | aggiunge due header di debug nelle risposte del proxy: X-IPSpinner-Provider e X-IPSpinner-Provider-NbTotalReqSent |
| wait_for_launcher_available_timeout | ❌ | 60 | numero di secondi prima del timeout di una richiesta se nessun launcher diventa disponibile |
| Parametro | Obbligatorio | Valore predefinito | Descrizione |
|---|
| regions | ✅ | Elenco di regioni, separate da virgola, in cui possono essere distribuite le risorse | |
| profile | ❌ | Profilo AWS CLI da utilizzare | |
| access_key | ✅ (o profile) | Chiave di accesso utente AWS | |
| secret_key | ✅ (o profile) | Chiave segreta utente AWS | |
| session_token | ❌ | Token di sessione utente AWS |
| Parametro | Obbligatorio (se ag_enabled=true) | Valore predefinito | Descrizione |
|---|
| ag_enabled | / | Abilita il launcher API Gateway | |
| ag_max_instances | ❌ | 5 | Numero massimo di istanze API Gateway distribuibili (massimo complessivo, non per regione) |
| ag_rotate_nb_requests | ❌ | 5,000 | Numero di richieste prima di ruotare un API Gateway |
| ag_forwarded_for_range | ❌ | 35.180.0.0/16 | Intervallo di indirizzi IP per l'header X-Forwarded-For (intervallo IPv4 o IPv6) |
| ag_instance_title_prefix | ❌ | fpr | Personalizzazione delle informazioni dell'API Gateway |
| ag_instance_deployment_description | ❌ | IPSpinner FireProx Prod | Personalizzazione delle informazioni dell'API Gateway |
| ag_instance_deployment_stage_description | ❌ | IPSpinner FireProx Prod Stage | Personalizzazione delle informazioni dell'API Gateway |
| ag_instance_deployment_stage_name | ❌ | 3 random english words | Personalizzazione delle informazioni dell'API Gateway |
| Parametro | Obbligatorio | Valore predefinito | Descrizione |
|---|
| admin_email | ✅ (o accounts_file) | Email dell'amministratore Azure | |
| admin_password | ✅ (o accounts_file) | Password dell'amministratore Azure | |
| tenant_id | ✅ | ID tenant | |
| subscription_id | ✅ | ID sottoscrizione | |
| accounts_file | ❌ | Un elenco di account pre-creati (email e password, un'informazione per riga) che sovrascrive admin_email e admin_password |
| Parametro | Obbligatorio (se cs_enabled=true) | Valore predefinito | Descrizione |
|---|
| cs_enabled | / | Abilita il launcher Cloud Shell | |
| cs_preferred_locations | ✅ | Posizioni per la distribuzione delle istanze Cloud Shell | |
| cs_nb_instances | ❌ | 5 | Numero di istanze Cloud Shell da distribuire |