Demonstração da pesquisa de DNS passivo reverso em massa com o PowerShell para segurança de TI | API IP/DNS reverso | API WhoisXML

Demonstração da pesquisa de DNS passivo reverso em massa com o PowerShell para investigações de segurança de TI: o caso do botnet Phorphiex

Os endereços IP são dados de entrada simples para investigações de segurança de TI: eles são tecnicamente necessários para que os nós da Internet se comuniquem. Portanto, se eles não forem excluídos de alguma forma complicada após o crime cibernético ter sido cometido, ou se forem encontrados em qualquer um dos registros antes do crime, eles ajudarão muito a desvendar o que realmente aconteceu. 

O IBM Xforce Exchange é um fórum que relata muitos incidentes de segurança que são relevantes para aqueles que estão encarregados de manter a segurança de TI. Neste blog, escolheremos um de seus relatórios e verificaremos como podemos ampliar as informações fornecidas com as APIs WhoisXML usando o PowerShell, que vem instalado no Windows e também pode ser usado no Linux e no Mac OS X. Presumimos que o conhecimento de programação do PowerShell seja intermediário para seguir a descrição abaixo. 

Usaremos dados de DNS passivo, conforme fornecidos pela API de DNS reverso da API WhoisXML: podemos obter uma lista de eventos de comunicação de rede observados por sensores de DNS passivo nos quais um determinado IP é resolvido para um nome de domínio real. Isso significa que o IP em questão, em um determinado momento, estava se comunicando na Internet com o nome de domínio em questão, uma informação que não pode ser obtida no próprio Sistema de Nomes de Domínio. Enquanto isso, ela ajuda muito a revelar o caráter do oponente mal-intencionado, como ficará claro na pesquisa demonstrativa a seguir. 

1. Obtenção de dados de uma coleção do IBM XForce 

Nosso assunto será a atividade recentemente observada do botnet Phorphiex. Citando a descrição da IBM (em https://exchange.xforce.ibmcloud.com/collection/Phorpiex-Botnet-Extortion-Activity-Monitoring-76265914d081e79d158260bf5385a9da, visitado em 19 de agosto de 2021), 

"A coleção contínua do IBM X-Force foi criada para fornecer a você os mais recentes IoCs e informações sobre a atividade de extorsão do Botnet Phorpiex encontrada em nosso ambiente. A coleção será atualizada automaticamente sempre que novas descobertas forem determinadas. Observe que os IoCs dessa coleção são acionáveis e, portanto, podem ser usados para bloqueios a fim de proteger seu ambiente. Devido a isso, pode acontecer de IoCs específicos serem removidos da coleção em um intervalo de tempo dinâmico quando não houver mais evidências disponíveis para apoiar a malícia do indicador." 

"O botnet Phorpiex era inicialmente conhecido como um botnet que usava o protocolo IRC para suas operações antes de mudar para uma arquitetura modular. A distribuição é feita por kits de exploração e por meio do suporte de outras famílias de malware. Com esse sucesso, seus operadores aproveitam agora as operações como Malware-as-a-Service (MaaS). Essa oferta permite que outras gangues cibernéticas usem a infraestrutura da botnet para suas intenções maliciosas. No entanto, uma grande parte de suas ameaças diárias são as chamadas campanhas de spam de "sextortion". Sextortion em campanhas de spam refere-se à coerção das vítimas para que paguem uma determinada quantia de dinheiro em um determinado período de tempo sob a ameaça de publicação de fotos ou vídeos íntimos da vítima. Sabe-se que essa é uma ameaça falsa, pois não há nenhum caso conhecido até o momento em que os agentes da ameaça provaram possuir esse material." 

O IBM X-Force Exchange fornece uma coleção de relatórios contendo endereços IP dos quais a atividade dessa botnet foi observada recentemente. No momento da redação deste blog, a lista de endereços IP pode ser deduzida das informações baixadas do IBM X-Force Exchange. Ou seja, um arquivo pode ser baixado do link mencionado acima, escolhendo a opção "Export" no menu ao lado do botão "I'm affected". A escolha do formato STIX 2.0 resultará em um arquivo baixado em um formato JSON padrão do qual os endereços IP podem ser deduzidos e processados posteriormente. 

2. Destilação de endereços IP de um relatório no formato STIX 2.0 

Nosso arquivo STIX 2.0 baixado foi salvo com o nome xfe-collection_76265914d081e79d158260bf5385a9da.json . Em seguida, obtenha a lista de IPs com o PowerShell. Dessa forma, no diretório em que o arquivo baixado reside, fazemos a seguinte conversão: 

$data=Get-Content ".\xfe-collection_76265914d081e79d158260bf5385a9da.json" |
ConvertFrom-Json
$data.objects.pattern |
foreach {$_ | Select-String -Pattern '(\d{1,3}\.){3}\d{1,3}'} |
foreach {$_.Matches.Value} > ips.csv 

O primeiro comando converte as entradas da coleção em um objeto do PowerShell. A segunda linha obtém o campo de padrão do JSON, que também contém o endereço IP em uma cadeia de caracteres. Em seguida, obtemos o endereço IPv4 com correspondência de expressão regular. O arquivo ips.csv resultante tem um endereço IP em cada linha. Na próxima etapa, desenvolveremos um script que complementa esse arquivo com informações de DNS passivo usando a API Reverse IP. 

3. Um script para estender a lista de IPs com dados de DNS passivo reverso 

Nosso objetivo de estender uma lista de endereços IP com dados de DNS passivo reverso pode ser alcançado usando o cmdlet do PowerShell com o seguinte código (recomenda-se salvar, por exemplo, com o nome ExtendIPCsvWithReversePDNS.ps1): 

#Extends a list of IPs with Reverse IP/DNS lookup results
# The input list does not contain a header and contains valid IPs
#Usage:
# 1. set the environment variable APIKEY to your API key:
#    PS C:\Users\User\WorkingDirectory> $APIKey="YOUR_API_KEY"
# 2. Once done, you can run it like this:
#   PS C:\Users\User\WorkingDirectory> .\ExtendIPCsvWithReversePDNS.ps1
'.\inputfile.csv' '.\outputfile.csv'
# Note: if the output file exists and is not empty, the results will be appended.

[CmdletBinding()]
param(
    [string] $InputFile,
    [string] $OutputFile
)

$BaseUrl = "https://reverse-ip.whoisxmlapi.com/api/v1?apiKey=" + $ENV:APIKEY +"&ip="

Function Convert-FromUnixDate ($UnixDate) {

[timezone]::CurrentTimeZone.ToUniversalTime(([datetime]'1/1/1970').AddSeconds($UnixDate))
}

Import-Csv -Header "IP" -Path $InputFile | ForEach-Object {
Write-Host $_.IP
$URI = $BaseUrl + $_.IP
#Need this to be visible in the catch branch
$IP = $_.IP
$IPData = [PSCustomObject]@{
IP = $IP
}
try{
$APIResponse = Invoke-WebRequest -Uri $URI -UseBasicParsing
$k=0
$Result = ConvertFrom-Json $APIResponse.Content
foreach($row in $Result.result) {
$first_seen = Convert-FromUnixDate $row.first_seen
$last_visit = Convert-FromUnixDate $row.last_visit
Write-Host $k $row.name $first_seen $last_visit
$field1 = "name_" + [string]$k
$field2 = "first_seen_" + [string]$k
$field3 = "last_visit_" + [string]$k
$IPData | Add-Member -MemberType NoteProperty -Name $field1 -Value $row.name
$IPData | Add-Member -MemberType NoteProperty -Name $field2 -Value $first_seen
$IPData | Add-Member -MemberType NoteProperty -Name $field3 -Value $last_visit
$k += 1}
for($l=$k; $l -lt 300; $l++){
$field1 = "name_" + [string]$l
$field2 = "first_seen_" + [string]$l
$field3 = "last_visit_" + [string]$l
$IPData |
    Add-Member -MemberType NoteProperty -Name $field1 -Value " "
$IPData |
    Add-Member -MemberType NoteProperty -Name $field2 -Value " "
$IPData |
    Add-Member -MemberType NoteProperty -Name $field3 -Value " "
}
}
catch{
Write-Host "Ran into an issue: $($PSItem.ToString())"
for($l=0; $l -lt 300; $l++){
$field1 = "name_" + [string]$l
$field2 = "first_seen_" + [string]$l
$field3 = "last_visit_" + [string]$l
$IPData |
    Add-Member -MemberType NoteProperty -Name $field1 -Value " "
$IPData |
    Add-Member -MemberType NoteProperty -Name $field2 -Value " "
$IPData |
    Add-Member -MemberType NoteProperty -Name $field3 -Value " "
}
}
$IPData |
    Export-Csv -Append -NoTypeInformation -Encoding UTF8 $OutputFile
}

O script contém instruções de uso nas primeiras linhas de comentário para ser autoconsistente; descreveremos a maneira de invocá-lo posteriormente. A partir de sua operação, definimos dois argumentos posicionais: o arquivo de entrada, que é uma lista de IPs, um por linha, e o arquivo de saída no qual o resultado será anexado. Armazenamos o URL base da API em $BaseUrl. A função Convert-FromUnicDate tem o objetivo de converter os horários retornados como Epoch pela API em datetimes. 

O loop principal obtém os IPs por meio de um pipeline. Para cada IP, armazenaremos o registro em $IPData. A chamada à API e seu processamento estão em um try-catch para lidar com o caso de algo dar errado. Invocamos a API com Invoke-WebRequest e analisamos o JSON resultante com ConvertFrom-Json. Queremos que cada IP seja uma linha no arquivo csv de saída, portanto, fazemos um loop pelo campo de resultado do resultado da API, que é uma lista de resultados, e mapeamos o nome de cada registro, first_seen e last_visit para um próximo campo com um número ordinal. Como o Export-Csv não pode lidar com um número variável de feeds por linha no momento, preenchemos os campos restantes com um valor de um único espaço como espaço reservado. Fazemos o mesmo no ramo catch para ter uma linha vazia se algo der errado, depois de imprimir uma mensagem de erro no console. (Observe que a API retorna até 300 registros em uma única chamada; se o IP fornecido tiver mais, ele nos fornecerá 300 registros arbitrários quando chamado como acima, por isso geramos linhas com 300 tripletos de resultados aqui. Consulte a documentação da API para obter uma descrição de como obter todos os registros). Por fim, o objeto IPData resultante é anexado ao arquivo csv de saída. 

Para usar o script, a variável de ambiente $APIKey deve ser definida como sua chave de API real, ou seja 

$APIKey="YOUR_API_KEY"

(A string YOUR_API_KEY acima deve ser substituída pela sua chave de API, que está disponível após o registro em https://reverse-ip.whoisxmlapi.com/api/signup ou na página da sua conta após o registro). Em seguida, podemos executar o script conforme descrito no comentário no início. Usando-o para o arquivo ips.csv que preparamos anteriormente, 

PS C:\Users\User\WorkingDirectory> .\ExtendIPCsvWithReversePDNS.ps1 '.\ips.csv' '.\ips_result.csv'

resulta no arquivo ips_result.csv, que pode ser importado para uma planilha do Office ou visualizado como texto. Ele contém uma linha de cabeçalho e uma linha para cada IP, como esta: 

"91.232.140.99", "91.232.140.99.ip.rudna-net.pl", "1/4/2019 8:32:10 PM", "7/16/2021 8:09:19 AM"," "," ","

Omitimos as linhas, pois elas são muito longas. 

4. Resultados e conclusão 

Não publicamos o arquivo de dados aqui, pois ele contém IPs mal-intencionados e é bastante grande. Em vez disso, resumimos nossas descobertas. Observando os resultados em detalhes, fica evidente que muitos desses IPs não estavam presentes no banco de dados do DNS passivo. Uma pesquisa direta no DNS confirmou que a maioria deles realmente não tem um registro de DNS reverso. Mesmo os IPs que têm registros reversos geralmente são resolvidos com nomes gerados automaticamente por provedores de rede móvel ou a cabo para IPs dinâmicos. 

A partir disso, pode-se concluir que a atividade do bot é, de acordo com a análise de DNS passivo reverso apresentada da coleção de endereços IP, baseada em máquinas de assinantes individuais em vários provedores. 

Como os dados do DNS passivo contêm datas e o arquivo STIX 2.0 inicial também contém datas, correlacionando as datas, os nomes de domínio que foram realmente afetados podem ser encontrados. Com base nos resultados, um aviso poderia ser enviado aos provedores afetados, que poderiam então analisar seus registros e informar seus clientes que se tornaram parte dessa botnet, geralmente como consequência da atividade de algum kit de exploração do qual foram alvo. 

Como resumo, descrevemos também em detalhes técnicos como é possível ampliar uma lista de IPs com informações suplementares usando a API Reverse IP/DNS. Nossa demonstração usou dados da vida real e resultou em consequências que podem ser úteis diretamente. Visite https://www.whoisxmlapi.com/ para obter uma chave de API e reproduzir você mesmo os resultados acima ou fazer análises semelhantes. Também vale a pena dar uma olhada nas outras ferramentas avançadas de segurança cibernética da API WhoisXML.