Demostración de búsqueda inversa masiva de DNS pasivos con PowerShell para seguridad informática | Reverse IP/DNS API | WhoisXML API

Demostración de la búsqueda pasiva inversa masiva de DNS con PowerShell para investigaciones de seguridad informática: el caso de la red de bots Phorphiex

Las direcciones IP son datos de entrada sencillos para las investigaciones de seguridad informática: son técnicamente necesarias para que los nodos de Internet se comuniquen. Por lo tanto, si no se borran de alguna manera engañosa después de que se haya cometido el ciberdelito, o si se encuentran en alguno de los registros antes de que se cometiera, ayudan mucho a desentrañar lo que realmente ha sucedido. 

IBM Xforce exchange es un foro que informa de muchos incidentes de seguridad que son relevantes para aquellos que se encargan de mantener la seguridad informática. En el presente blog escogeremos uno de sus informes y comprobaremos cómo podemos ampliar la información dada con WhoisXML API utilizando PowerShell, que viene instalado en Windows y puede utilizarse también en Linux y Mac OS X. Asumimos conocimientos intermedios/principiantes de programación PowerShell para seguir la siguiente descripción. 

Utilizaremos datos de DNS pasivos, como los proporcionados por la Reverse DNS API de WhoisXML API: podemos obtener una lista de eventos de comunicación de red observados por sensores DNS pasivos en los que una IP dada se resuelve con un nombre de dominio real. Esto significa que la IP dada en el momento dado se comunicaba en Internet bajo el nombre de dominio dado; una información que no se puede obtener del propio Sistema de Nombres de Dominio. Mientras tanto, ayuda mucho a revelar el carácter del adversario malicioso, como quedará claro en la siguiente investigación demostrativa. 

1. Obtención de datos de una colección IBM XForce 

Nuestro tema será la actividad recientemente observada de la botnet Phorphiex. Citando la descripción de IBM (en https://exchange.xforce.ibmcloud.com/collection/Phorpiex-Botnet-Extortion-Activity-Monitoring-76265914d081e79d158260bf5385a9da, visitado el 19 de agosto de 2021), 

«La colección en curso de IBM X-Force se creó para proporcionarle los últimos IoC e información sobre la actividad de extorsión de la botnet Phorpiex encontrada en nuestro entorno. La colección se actualizará automáticamente cada vez que se determinen nuevos hallazgos. Tenga en cuenta que los IoC de esta colección son procesables y, por lo tanto, se pueden utilizar para bloquear y proteger su entorno. Debido a esto, puede ocurrir que determinados IoC se eliminen de la colección en un intervalo de tiempo dinámico cuando no se disponga de más pruebas que respalden la malicia del indicador». 

«La botnet Phorpiex era conocida inicialmente como una botnet que utilizaba el protocolo IRC para sus operaciones antes de cambiar a una arquitectura modular. La distribución se realiza mediante kits de exploits y a través del apoyo de otras familias de malware. Con este éxito sus operadores aprovechan ahora las operaciones como Malware-as-a-Service (MaaS). Esta oferta permite a otras bandas cibernéticas utilizar la infraestructura de la botnet para sus intenciones maliciosas. Sin embargo, una gran parte de sus amenazas diarias son las llamadas campañas de spam de "sextorsión". La sextorsión en las campañas de spam se refiere a la coacción a las víctimas para que paguen una cierta cantidad de dinero en un plazo determinado bajo la amenaza de publicar fotos o vídeos íntimos de la víctima. Se sabe que se trata de una amenaza falsa, ya que hasta ahora no se conoce ningún caso en el que los autores de la amenaza hayan demostrado poseer dicho material». 

IBM X-Force Exchange proporciona una colección de informes que contienen direcciones IP desde las que se ha observado recientemente la actividad de esta botnet. En el momento de escribir el presente blog, la lista de las direcciones IP puede deducirse de la información descargada de IBM X-Force exchange. Concretamente, se puede descargar un archivo desde el enlace mencionado eligiendo la opción «Exportar» del menú situado junto al botón «I'm affected». Si se elige el formato STIX 2.0, se descargará un archivo en formato JSON estándar a partir del cual se podrán deducir las direcciones IP y seguir procesándolas. 

2. Destilar direcciones IP de un informe en formato STIX 2.0 

Nuestro fichero STIX 2.0 descargado se ha guardado con el nombre xfe-collection_76265914d081e79d158260bf5385a9da.json . A continuación obtenemos la lista de IP con PowerShell de esta forma, en el directorio donde reside el fichero descargado, hacemos la siguiente conversión: 

$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 

El primer comando convierte las entradas de la colección en un objeto PowerShell. La segunda línea obtiene el campo pattern del JSON que contiene también la dirección IP en una cadena. A continuación, obtenemos la dirección IPv4 con la coincidencia de expresiones regulares. El archivo ips.csv resultante tiene una dirección IP en cada línea. En el siguiente paso desarrollaremos un script que complemente este fichero con información DNS pasiva utilizando Reverse IP API. 

3. Un script para ampliar la lista de IP con datos DNS pasivos inversos 

Nuestro objetivo de ampliar una lista de direcciones IP con datos DNS pasivos inversos puede lograrse utilizando el cmdlet de PowerShell con el siguiente código (se recomienda guardarlo, por ejemplo, con el nombre 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
}

El script contiene instrucciones de uso en las primeras líneas de comentario para ser autoconsistente; más adelante describiremos la forma de invocarlo. En cuanto a su funcionamiento, definimos dos argumentos posicionales: el fichero de entrada, que es una lista de IP, una por línea; y el fichero de salida al que se anexará el resultado. Almacenamos la URL base de la API en $BaseUrl. La función Convert-FromUnicDate sirve para convertir los tiempos devueltos como Epoch por la API a datetimes. 

El bucle principal obtiene las IP a través de un pipeline. Para cada IP almacenaremos el registro en $IPData. La llamada a la API y su procesamiento está en un try-catch para actuar en caso de que algo vaya mal. Invocamos a la API con Invoke-WebRequest y parseamos el JSON resultante con ConvertFrom-Json. Queremos que cada IP sea una fila en el archivo csv de salida, así que recorremos el campo resultante del resultado de la API, que es una lista de resultados, y asignamos el nombre, first_seen y last_visit de cada registro a un campo siguiente con un número ordinal. Como Export-Csv no puede tratar por el momento con un número variable de entradas por fila, rellenamos los campos restantes con un valor de un solo espacio como marcador de posición. Hacemos lo mismo en la rama catch para tener una línea vacía si algo ha ido mal, después de imprimir un mensaje de error en la consola. (Tenga en cuenta que la API devuelve hasta 300 registros en una sola llamada; si la IP dada tiene más, nos proporcionará 300 registros arbitrarios cuando se llame como se ha indicado anteriormente, de ahí que generemos líneas con 300 tripletas de resultados aquí. Remitimos a la documentación de la API para una descripción de cómo obtener todos los registros). Finalmente, el objeto IPData resultante se añade al archivo csv de salida. 

Para utilizar el script, la variable de entorno $APIKey debe establecerse con su clave API real, es decir. 

$APIKey="YOUR_API_KEY"

(El string YOUR_API_KEY anterior debe sustituirse por su clave API, que está disponible tras registrarse en https://reverse-ip.whoisxmlapi.com/api/signup, o en la página de su cuenta tras el registro). A continuación, podemos ejecutar el script tal y como se describe en el comentario del principio. Usándolo para el archivo ips.csv que preparamos anteriormente, 

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

da como resultado el archivo ips_result.csv, que puede importarse a una hoja de cálculo de Office o visualizarse como texto. Contiene una línea de cabecera y una línea 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"," "," ","

Hemos omitido las líneas porque son muy largas. 

4. Resultados y conclusiones 

No publicamos aquí el archivo de datos porque contiene IP maliciosas y es bastante grande. En su lugar, resumimos nuestros resultados. Mirando los resultados en detalle es evidente que muchas de estas IP no estaban presentes en la base de datos de DNS pasivos. Una búsqueda directa de DNS ha confirmado que la mayoría de ellas no tienen un registro DNS inverso. Incluso las IP que tienen registros inversos suelen resolver nombres generados automáticamente por proveedores de redes de cable o móviles a IP dinámicas. 

A partir de esto, se puede concluir que la actividad de los bots se basa, según el análisis de DNS pasivos inverso presentado de la recopilación de direcciones IP, en máquinas de suscriptores individuales de varios proveedores. 

Como los datos DNS pasivos contienen fechas y horas, y el archivo STIX 2.0 inicial también contiene fechas, correlacionando las fechas se podrían encontrar los nombres de dominio que realmente se vieron afectados. Basándose en los resultados, se podría enviar una advertencia a los proveedores afectados, que podrían analizar sus registros e informar a los clientes que pasaron a formar parte de esta botnet como consecuencia de la actividad de algún exploit kit del que eran objetivo. 

A modo de resumen, hemos descrito también con detalles técnicos cómo se puede ampliar una lista de IP con información suplementaria utilizando la API Reverse IP/DNS. Nuestra demostración ha utilizado datos reales y ha dado lugar a consecuencias que pueden ser útiles directamente. Visite https://www.whoisxmlapi.com/ para obtener una clave API y reproducir usted mismo los resultados anteriores o realizar análisis similares. También merece la pena echar un vistazo a otras potentes herramientas de ciberseguridad de WhoisXML API.