
Amplie a visibilidade da rede a partir de múltiplos pontos de vista de outros hosts.
Na guerra, CornerShot é uma arma que permite a um soldado olhar além de uma esquina (e talvez atirar) sem se expor ao risco. Da mesma forma, o pacote CornerShot permite que se olhe para o acesso de rede de um host remoto sem a necessidade de ter privilégios especiais nesse host.
Usando CornerShot, uma origem, com acesso de rede ao portador, pode determinar se existe acesso de rede entre o portador e o alvo para uma porta específica p.
Por exemplo, vamos supor que uma equipe vermelha está tentando se propagar de um host de origem A "comprometido" para um host alvo X, para o qual o host A não tem acesso. Se eles se propagarem pelo host B, só então descobrirão que não há acesso de rede entre o host B e X.
Usando CornerShot, a equipe pode descobrir que o host C na verdade tem acesso ao alvo X, então a propagação em direção ao alvo X deve passar pelo host C primeiro.
+-----+ +-----+ +-----+
| | | | filtered | |
| A +--------> B +----X--->(p) X |
| | | | | |
+-----+ +-----+ +-(p)-+
source carrier target
+ ^
| |
| +-----+ |
| | | open |
+---------->+ C +-------------+
| |
+-----+
De forma semelhante ao nmap, CornerShot diferencia entre os seguintes estados de portas: aberto, fechado, filtrado e desconhecido (se não for possível determinar).
A demonstração a seguir mostra a execução do CornerShot contra dois hosts portadores 172.0.1.12 e 172.0.1.13, para determinar se eles têm acesso de rede a 192.168.200.1:

Leia mais aqui.
A tarefa aparentemente simples de identificar se algum host B na rede tem acesso ao host C pode exigir uma grande implantação de sensores de rede, agentes de dispositivos ou coleta de uma infinidade de regras de firewall, configurações de roteador e políticas de host.
CornerShot pode simplificar esse processo usando um (ou muito poucos) agentes que podem consultar outros hosts na rede, para determinar seu acesso a hosts remotos.
Equipes de segurança que utilizam BloodHound para encontrar e mitigar caminhos de escalada de privilégios dentro de sua rede, muitas vezes enfrentam milhões de caminhos lógicos descobertos pelo BloodHound.
ShotHound é uma ferramenta que integra CornerShot com BloodHound, a fim de descobrir caminhos práticos que são suportados pelo acesso de rede.
CornerShot pode ser usado como um pacote ou como um módulo independente. Os únicos requisitos são Python 3 e o pacote impacket.
pip install cornershot
O uso básico requer credenciais de um usuário de domínio válido, um domínio FQDN, um IP do portador e um IP do alvo.
python -m cornershot <user> <password> <domain> <carrier> <target>
Para escanear uma faixa de portadores contra uma faixa de alvos, sub-redes ou faixas de IP podem ser usadas em uma lista delimitada por vírgulas:
python -m cornershot <user> <password> <domain> 192.168.1.10-192.168.1.20 192.168.5.0/24,192.168.6.0/24
Por padrão, CornerShot tentará escanear as seguintes portas: 135, 445, 3389, 5985, 5986. O usuário pode fornecer uma lista delimitada por vírgulas de portas e faixas de portas:
python -m cornershot -tp 22,8080,45000-45005 <user> <password> <domain> <carrier> <target>
No código, é necessário instanciar um objeto CornerShot com o nome de usuário, senha e nome de domínio de um usuário de domínio válido. Adicionar portadores, alvo e portas é feito através do método add_shots. Uma vez pronto, o método open_fire pode ser chamado, que realiza apenas as chamadas RPC relevantes com base nas portas necessárias.
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()
O resultado de open_fire é um dicionário com chaves de portadores, cada portador tem outro conjunto de chaves para alvos, e finalmente, cada alvo contém um dicionário de portas e seus respectivos estados. Este é um formato de exemplo de resultado:
{'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 se baseia em vários métodos padrão de Chamada de Procedimento Remoto (RPC) bem documentados, que são usados por vários serviços Microsoft. Ao usar métodos que exigem apenas uma conta autenticada no domínio, CornerShot é capaz de gerar tráfego de rede de um host portador para um alvo.
CornerShot é capaz de determinar o estado da porta remota medindo o tempo que uma chamada RPC levou e usando diferentes códigos de erro para cada método RPC.
O leitor pode estar familiarizado com o "printer bug", que foi descoberto por Lee Christensen. Embora seja chamado de bug, é um comportamento bem documentado do serviço de impressão, que permite a qualquer usuário autenticado coagir um servidor remoto a se autenticar em qualquer máquina, usando o método RpcRemoteFindFirstPrinterChangeNotificationEx.
CornerShot utiliza os seguintes métodos RPC de vários protocolos Microsoft (há muitos métodos adicionais, que serão implementados em versões futuras):
A implementação dos protocolos em si é alcançada através do maravilhoso pacote impacket.
Este método recebe um printerName como parâmetro. O nome printerName pode ser um caminho para um arquivo local, um arquivo remoto ou até mesmo para uma impressora web. Ao fornecer um nome que esteja em conformidade com o formato WEB_PRINT_SERVER, é possível consultar qualquer porta remota. Um exemplo de nome de servidor de impressão web que irá gerar tráfego HTTP para um host e porta remotos é: "http://<target_ip>:<target_port>/printers/ppp/.printer".
Para utilizar este método, precisamos de uma abordagem em duas etapas: primeiro, abrir uma chave de registro no host remoto - o que resulta em um handle válido, e segundo, tentar salvar um backup deste handle em um arquivo remoto. O método BaseRegSaveKey recebe um caminho de arquivo para o qual pode salvar um backup de um registro, o que gera tráfego SMB na porta 445 (e 135 como backup) para um alvo. A chave de registro que CornerShot abre é a HKEY_CURRENT_USER, que está aberta para leitura por padrão na maioria dos hosts clientes.
Esta função tenta fazer backup de eventos do Windows em um caminho de arquivo, que pode ser remoto - nesse caso, o serviço tentará acessar o host e caminho remotos.
Semelhante ao método EVEN, apenas este método utiliza uma versão diferente do protocolo de Eventos do Windows, que é feito diretamente sobre TCP - não há necessidade da porta SMB estar aberta.
CornerShot estima o estado das portas remotas com base em fatores de tempo e mensagens de erro recebidas pelo método RPC ou transporte subjacente. Ao experimentar com diferentes hosts Windows e vários protocolos RPC, chegamos a 3 limites de tempo diferentes que provam funcionar na maioria dos ambientes de rede. Esses limites são melhor ilustrados com a seguinte figura:
+ + +
| | |
unknown | open / closed | filtered | open
/ | | |
open | | |
| | |
+-------------+------------------+-----------------+--------------+
0 0.5 20 40 Seconds
MIN FILTERED UPPER
O limite MIN é de 0,5 segundos, respostas abaixo deste limite significam um erro no método RPC subjacente ou no transporte subjacente, ou uma resposta pode ter sido recebida do host alvo.
Respostas abaixo do limite FILTERED de 20 segundos podem indicar uma porta aberta ou fechada, dependendo do tipo de mensagem de erro recebida para o método.
Respostas entre o limite FILTERED e UPPER de 40 segundos indicam uma porta filtrada para todos os métodos testados (até agora...). E solicitações que levam mais tempo que o limite UPPER indicam uma conexão TCP aberta prolongada.
Executar o CornerShot contra diferentes versões e configurações de SO produzirá resultados diferentes. Nem todas as versões do Windows têm os mesmos named pipes ou se comportam da mesma forma quando consultadas com o mesmo método RPC. A maioria dos Windows de fábrica não expõe SMB e outros serviços RPC pela rede, no entanto, a experiência mostrou que em grandes ambientes essas portas tendem a estar abertas e acessíveis para a maioria dos ativos.
A tabela a seguir mostra o suporte padrão para vários protocolos RPC, desde que as portas apropriadas estejam acessíveis ao host portador e nenhuma alteração de configuração tenha sido feita no host:
* Se o serviço Webclient estiver em execução em uma máquina cliente, portas adicionais podem ser escaneadas. Atualmente o CornerShot não suporta esta opção.
** O protocolo RPRN é suportado em servidores, no entanto, abrir uma impressora web remota não funciona (por isso não podemos escanear QUALQUER porta alvo) - até encontrarmos uma solução alternativa 😉
Shots RPC adicionais, ou qualquer outra contribuição são bem-vindos!
Todos os métodos RPC são implementados em /shots, e herdam de uma classe abstrata chamada BaseRPCShot. A pasta /example mostra como criar um shot RPC personalizado e usá-lo no código.
CornerShot é lançado sob a licença Apache 2.0. Para mais detalhes veja LICENSE.
Ficaremos felizes em ouvir de você! Para bugs, correções, sugestões sobre este pacote, entre em contato conosco em [email protected]
| SO | Protocolos RPC Suportados | Portas do Portador Abertas Necessárias | Possíveis Portas do Alvo para Escanear |
|---|
| Windows 7 | EVEN,EVEN6 | 445 / 135 & even6 tcp port | 445* |
| Windows 8 | EVEN,EVEN6 | 445 / 135 & even6 tcp port | 445* |
| Windows 10 | EVEN,EVEN6,RPRN | 445 / 135 & even6 tcp port | ANY |
| Server 2008 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & even6 tcp port | 445 |
| Server 2012 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & even6 tcp port | 445 |
| Server 2016 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & even6 tcp port | 445 |
| Server 2019 | EVEN,EVEN6,RRP,RPRN** | 445 / 135 & even6 tcp port | 445 |