
IPSpinner funciona como um proxy local que redireciona solicitações através de serviços externos.
O IPSpinner é um proxy local que pode ser usado para redirecionar todas as requisições recebidas por meio de diferentes provedores escolhidos. O objetivo é criar um proxy de passagem que rotacione o endereço IP de origem de cada requisição. Por exemplo, executar uma operação de força bruta por meio do IPSpinner ajuda a evitar ser detectado, pois o servidor receberá as requisições de centenas de endereços IP diferentes.
O IPSpinner atualmente suporta AWS (API Gateway), Azure (Cloud Shell) e GitHub (GitHub Actions).
Figura 1: IPSpinner - Diagrama geral
O IPSpinner funciona como um proxy local que redireciona requisições por meio de serviços externos. Para isso, o IPSpinner utiliza provedores e launchers.
Um provedor corresponde a um provedor de nuvem ou a um provedor de serviços online (AWS, Azure, GitHub, etc.), que oferece diferentes serviços, chamados launchers, que podem ser usados para retransmitir as requisições do usuário (AWS API Gateway, GitHub Actions, Azure Cloud Shells, etc.).
Assim, para iniciar o IPSpinner, o usuário precisará fornecer credenciais para os provedores que deseja usar e configurações adicionais para os launchers. Vários tipos de launchers podem ser usados ao mesmo tempo; o IPSpinner escolherá aleatoriamente um dos disponíveis para cada requisição.
Além disso, o IPSpinner implementa uma funcionalidade de pré-carregamento. Alguns launchers podem ser pré-carregados para evitar o atraso de reconfiguração caso um novo host seja visto pelo proxy. Para esses launchers, o procedimento de pré-carregamento é recomendado, mas não obrigatório. Para os demais, nenhum pré-carregamento é necessário.
O IPSpinner pode usar o AWS API Gateway para enviar requisições. Esta implementação é baseada no FireProx, que cria um REST API Gateway para redirecionar requisições recebidas. O FireProx foi, portanto, adaptado para lidar com múltiplos hosts por API Gateway e para implementar novas funcionalidades. Em resumo, quando o IPSpinner recebe uma requisição, ele seleciona ou cria a instância de API Gateway adequada e envia a requisição para ela. Em seguida, coleta a resposta e a devolve ao usuário. Assim, o servidor alvo recebeu a requisição do API Gateway e não diretamente do usuário. Como o API Gateway rotaciona o IP de saída a cada requisição, o IPSpinner usa essa funcionalidade para fazer a rotação do endereço IP.
Figura 2: AWS API Gateway - Diagrama geral
O gráfico a seguir, elaborado em outubro de 2024, mostra o número de endereços IP exclusivos disponíveis por região da AWS de acordo com o número de requisições enviadas. A maioria das regiões oferece mais de 100 endereços IP, e várias regiões podem ser usadas ao mesmo tempo, permitindo ao usuário fazer passar suas requisições por milhares de endereços em todo o mundo.
Figura 3: AWS API Gateway - Endereços IP disponíveis por região
Por fim, a Figura 4 mostra, com um nível de cor verde logarítmico, quantos endereços estão disponíveis por país. Isso demonstra que o usuário tem a possibilidade de falsificar seu endereço IP de origem com endereços em qualquer continente.
Figura 4: AWS API Gateway - Endereços IP por país
O IPSpinner implementa uma funcionalidade de rotação que exclui e renova regularmente as instâncias FireProx criadas. Como mostra o gráfico a seguir, rotacionar uma instância FireProx pode fornecer um novo subconjunto de IPs. No entanto, cada região da AWS possui um conjunto limitado de IPs e, portanto, em algum momento, as rotações não fornecerão novos IPs.
Figura 5: AWS API Gateway - Processo de rotação
Este launcher implementa um procedimento de pré-carregamento. Como dito anteriormente, não é obrigatório, mas pode evitar alguns atrasos de reconfiguração ou erros de sincronização durante os primeiros segundos após ser reconfigurado.
Além disso, os API Gateways definem por padrão um cabeçalho X-Forwarded-For, que não pode ser excluído, mas pode ser sobrescrito. Assim, o usuário pode especificar na configuração do IPSpinner um intervalo de endereços IP a partir do qual um IP aleatório será escolhido para cada requisição (intervalo IPv4 ou IPv6).
O IPSpinner usa o Azure Cloud Shell para enviar requisições. Um Azure Cloud Shell é um terminal interativo, autenticado e acessível pelo navegador para gerenciar recursos do Azure. O Cloud Shell é executado em um host temporário fornecido por sessão e por usuário.
Assim, o IPSpinner usa vários usuários do Azure para os quais uma sessão do Cloud Shell é preparada. Em seguida, cada requisição será redirecionada para um Cloud Shell inicializado, antes de ser renovada para redefinir seu endereço IP.
Figura 6: Azure Cloud Shell - Diagrama geral
Como mostra o gráfico a seguir, as diferentes regiões disponíveis para implantar sessões do Cloud Shell oferecem cada uma dezenas de endereços IP. O usuário pode configurar várias regiões ao mesmo tempo para aumentar seu pool de IPs.
Figura 7: Azure Cloud Shell - Endereços IP disponíveis por região
No entanto, os endereços IP estão mais concentrados do que no AWS API Gateway. Como ilustra o mapa a seguir, a maioria deles está localizada nos EUA, na Europa e na Índia.
Figura 8: Azure Cloud Shell - Endereços IP por país
Devido ao atraso do processo de renovação do Cloud Shell, aconselhamos limitar a taxa de fluxo de requisições. Mais informações na subseção comparação de launchers.
O IPSpinner também pode aproveitar o GitHub Actions para enviar requisições. Esta implementação é inspirada no git-rotate, mas foi completamente modificada e adaptada para eliminar o servidor de captura (catcher server).
Ele cria um repositório com um modelo de workflow predefinido. Em seguida, para cada requisição, executa o workflow fornecendo as informações da requisição por meio das variáveis de ambiente. Todos os dados são criptografados para evitar que possam ser lidos por um usuário externo. Por fim, o IPSpinner coleta os dados de resposta dos logs do workflow.
Figura 9: GitHub Actions - Diagrama geral
A figura a seguir mostra que o GitHub Actions oferece milhares de endereços IP diferentes.
Figura 10: GitHub Actions - Endereços IP disponíveis por região
No entanto, o mapa a seguir ilustra que o GitHub Actions só oferece endereços IP americanos. Após análise, seus workers parecem estar implantados em uma infraestrutura Azure.
Figura 11: GitHub Actions - Endereços IP por país
⚠️ Além disso, "o GitHub leva o abuso e o spam de Actions a sério e tem uma equipe dedicada a rastrear 'usuários spammy'." Portanto, o usuário NÃO DEVE usar este provedor com sua própria conta ou com a conta da empresa para evitar qualquer problema de encerramento de conta.
Devido ao limite por hora da API REST do GitHub, a taxa máxima de fluxo de requisições deve ser limitada para evitar interrupções. Mais informações na subseção comparação de launchers.
Este projeto foi testado para uma versão do Go >= 1.21, mas pode funcionar com versões anteriores do Go.
Consulte a documentação de instalação do Go
Após a instalação, certifique-se de que o binário Go padrão é o correto:
$ 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
O executável será nomeado por padrão "ipspinner" no Linux ou "ipspinner.exe" no Windows.
Para limpar as compilações ao final do uso, execute
$ make clean
Para obter ajuda sobre o uso do IPSpinner, você pode executar o comando sem nenhum argumento:
$ ./ipspinner -h
Help will be displayed
Todas as informações (exceto os redirecionamentos de requisições) são registradas no arquivo ipspinner.log.
Algumas opções comuns estão disponíveis como argumentos, e as demais informações de configuração devem ser fornecidas em um arquivo de configuração INI.
O usuário pode especificar alguns argumentos de linha de comando:
Alguns parâmetros globais e dos provedores devem ser especificados em um arquivo de configuração INI. O arquivo de configuração deve ser preparado antes de executar o IPSpinner. Seu conteúdo será explicado nas próximas subseções. Por padrão, o IPSpinner procura um arquivo de configuração chamado config.ini.
Para lidar com requisições https, o IPSpinner precisa de um certificado de Autoridade de Certificação (CA) e uma chave. Se o usuário não fornecer um certificado, o IPSpinner gerará seu próprio certificado autoassinado e chave. O usuário pode solicitar a recuperação do certificado gerado com --export-ca-cert (ex.: para importá-lo no navegador). Caso contrário, o usuário pode fornecer seu próprio certificado e chave CA no arquivo de configuração (consulte as próximas partes).
O usuário pode especificar o host e a porta de escuta com --host e --port.
Por fim, três modos de verbosidade estão disponíveis:
Em seguida, um modelo para o arquivo de configuração INI está disponível no repositório do projeto.
Na seção proxy, o usuário pode especificar alguns parâmetros:
Todas as outras seções serão descritas no capítulo do provedor correspondente.
É importante notar que um usuário pode habilitar vários provedores e launchers ao mesmo tempo. O IPSpinner escolherá então um launcher aleatório entre todos os disponíveis para cada requisição.
Parâmetros de configuração para AWS, na seção aws:
Parâmetros de configuração para os API Gateways, na seção aws:
Parâmetros de configuração para Azure, na seção azure:
Parâmetros de configuração para o Azure Cloud Shell, na seção azure:
Parâmetros de configuração para GitHub, na seção github:
| Parâmetro | Obrigatório | Valor padrão | Descrição |
|---|---|---|---|
| username | ✅ | Nome de usuário do GitHub | |
| token | ✅ | Token do GitHub associado ao nome de usuário fornecido |
Parâmetros de configuração para o GitHub Actions, na seção github:
| Parâmetro | Obrigatório (se ga_enabled=true) | Valor padrão | Descrição |
|---|---|---|---|
| ga_enabled | / | Ativa o launcher de GitHub Actions |
O IPSpinner não suporta o protocolo HTTP/2. Como o proxy encerra a primeira conexão TLS, as vantagens do protocolo são perdidas e ele aparece como uma conexão HTTP/1.1 básica.
Portanto, para evitar problemas de HTTP/2 ao usar o IPSpinner com o Burp Suite, remova o suporte do cliente HTTP/2: Settings > Network > HTTP > HTTP/2 > Desmarque a caixa de seleção HTTP/2.
| AWS API Gateway | Azure Cloud Shell | GitHub Actions |
|---|
| Endereços IP disponíveis | ≈ 12,418 | ≈ 276 | > 6,000 |
| Tempo médio de resposta | 0.46s | 13.04s | 21.42s |
| Tempo médio de reconfiguração | Nenhum | 20s | Nenhum |
| Taxa de fluxo teórica máxima | 4,000 a 16,000 req/h | 107 req/h/instância de Cloud Shell | 1,000 req/h |
| Pode/Precisa ser pré-carregado? | ✅ | ❌ | ❌ |
| Uso: navegação | ✅ | ❌ | ❌ |
| Uso: password spraying | ✅ | ✅ | ✅ |
| Parâmetro | Obrigatório | Valor padrão |
|---|
| --config | ❌ | config.ini |
| --export-ca-cert | ❌ | |
| --host | ❌ | |
| --port | ❌ | 8080 |
| --v, --vv, --vvv | ❌ |
| Parâmetro | Obrigatório | Valor padrão | Descrição |
|---|
| preload_hosts_file | ❌ | uma lista de URLs/hosts para pré-carregar, para os provedores que podem pré-carregar hosts | |
| whitelist_hosts_file | ❌ | uma lista de URLs/hosts que estão na lista de permissões (todos os outros serão bloqueados por padrão) | |
| blacklist_hosts_file | ❌ | uma lista de URLs/hosts que estão na lista de bloqueio (ignorada se a lista de permissões estiver definida) | |
| ca_cert_file & ca_cert_key_file | ❌ | um certificado CA fornecido pelo usuário (se o usuário quiser substituir o certificado padrão gerado) | |
| user_agents_file | ❌ | uma lista de user agents que serão escolhidos aleatoriamente para as requisições | |
| debug_response_headers | ❌ | false | adiciona dois cabeçalhos de depuração nas respostas do proxy: X-IPSpinner-Provider e X-IPSpinner-Provider-NbTotalReqSent |
| wait_for_launcher_available_timeout | ❌ | 60 | número de segundos antes de expirar uma requisição se nenhum launcher ficar disponível |
| Parâmetro | Obrigatório | Valor padrão | Descrição |
|---|
| regions | ✅ | Lista de regiões separadas por vírgula, onde os recursos podem ser implantados | |
| profile | ❌ | Perfil da CLI AWS a ser usado | |
| access_key | ✅ (ou profile) | Chave de acesso do usuário AWS | |
| secret_key | ✅ (ou profile) | Chave secreta do usuário AWS | |
| session_token | ❌ | Token de sessão do usuário AWS |
| Parâmetro | Obrigatório (se ag_enabled=true) | Valor padrão | Descrição |
|---|
| ag_enabled | / | Ativa o launcher de API Gateway | |
| ag_max_instances | ❌ | 5 | Máximo de instâncias de API Gateway que podem ser implantadas (máximo geral, não por região) |
| ag_rotate_nb_requests | ❌ | 5,000 | Número de requisições antes de rotacionar um API Gateway |
| ag_forwarded_for_range | ❌ | 35.180.0.0/16 | Intervalo de endereços IP para o cabeçalho X-Forwarded-For (intervalo IPv4 ou IPv6) |
| ag_instance_title_prefix | ❌ | fpr | Personalização das informações do API Gateway |
| ag_instance_deployment_description | ❌ | IPSpinner FireProx Prod | Personalização das informações do API Gateway |
| ag_instance_deployment_stage_description | ❌ | IPSpinner FireProx Prod Stage | Personalização das informações do API Gateway |
| ag_instance_deployment_stage_name | ❌ | 3 palavras aleatórias em inglês | Personalização das informações do API Gateway |
| Parâmetro | Obrigatório | Valor padrão | Descrição |
|---|
| admin_email | ✅ (ou accounts_file) | E-mail do administrador do Azure | |
| admin_password | ✅ (ou accounts_file) | Senha do administrador do Azure | |
| tenant_id | ✅ | ID do locatário | |
| subscription_id | ✅ | ID da assinatura | |
| accounts_file | ❌ | Uma lista de contas pré-criadas (e-mail e senha, uma informação por linha) que substituem admin_email e admin_password |
| Parâmetro | Obrigatório (se cs_enabled=true) | Valor padrão | Descrição |
|---|
| cs_enabled | / | Ativa o launcher de Cloud Shell | |
| cs_preferred_locations | ✅ | Locais para implantar instâncias do Cloud Shell | |
| cs_nb_instances | ❌ | 5 | Número de instâncias do Cloud Shell a implantar |