Uso de PowerShell con datos de geolocalización de IP
Basado en un artículo original de 2015 de Paul Cunningham
Uso de servicios de geolocalización para resolver direcciones IP en registros de auditoría y direcciones IP
Muchos registros de Microsoft 365 y Exchange Server incluyen direcciones IP. Microsoft 365 es un excelente ejemplo, ya que cada evento de auditoría incluye una dirección IP para la fuente. En el contexto de Exchange Server, los registros de IIS contienen información sobre las direcciones IP utilizadas para conexiones como OWA, ActiveSync y EWS.
A medida que los administradores revisan los eventos en los registros, es natural que quieran verificar las direcciones IP, especialmente si las direcciones provienen de un rango desconocido que no se utiliza para la ubicación de una empresa. Las políticas de acceso condicional permiten a las organizaciones restringir las conexiones a ubicaciones conocidas. Si utiliza PowerShell para extraer y analizar datos de registro, hay disponibles una variedad de servicios de geolocalización de IP para resolver direcciones IP.
Servicios de geolocalización basados en web
IP-API es uno de los principales servicios de geolocalización IP. Admite el acceso gratuito para uso no comercial. Actualmente, para proteger la integridad de su servicio, IP-API limita el acceso a 45 solicitudes HTTP por minuto para el punto final que probablemente utilizará con PowerShell. Otras API, como FreeGeoIP.net, tienen límites más bajos para el acceso gratuito y al mismo tiempo ofrecen suscripciones pagas con límites mucho más altos. Como de costumbre, busque a su alrededor para encontrar un servicio que satisfaga sus necesidades. Algunos servicios web bloquearán el acceso a una dirección IP si continuamente realiza demasiadas solicitudes.
La cadena de eliminación de Microsoft 365 y la gestión de rutas de ataque
Una estrategia de ciberseguridad eficaz requiere una comprensión clara y completa de cómo se desarrollan los ataques. Lea este documento técnico para obtener la información experta que necesita para defender su organización.
Uso de PowerShell para resolver una dirección IP
En todos los casos, es probable que utilice el cmdlet Invoke-RestMethod para enviar una consulta al servicio web y recibir una respuesta estructurada. En el caso de IP-API, la respuesta viene en formato JSON. He aquí un ejemplo:
IPInfo = Invoke-RestMethod -Method Get -Uri "http://ip-api.com/json/20.81.111.85"
$IPInfo
status : success
country : United States
countryCode : US
region : VA
regionName : Virginia
city : Boydton
zip : 23917
lat : 36.677696
lon : -78.37471
timezone : America/New_York
isp : Microsoft Corporation
org : Microsoft Azure Cloud (eastus)
as : AS8075 Microsoft Corporation
query : 20.81.111.85
Otro ejemplo del uso del cmdlet Invoke-RestMethod para recuperar información de un servicio web es el uso del servicio Microsoft Translator para traducir texto a un idioma de destino.
Un script de ejemplo que utiliza Invoke-RestMethod para interactuar con el servicio IP-API está disponible en GitHub.
Evitar la aceleración
Como se señaló anteriormente, los servicios web a menudo aceleran las solicitudes HTTP entrantes para evitar la posibilidad de que un actor no autorizado o un código deficiente abrumen su servicio con una avalancha de solicitudes. Con este punto en mente, cualquier script que desee analizar información de IP debe incorporar una verificación para evitar la limitación.
Una forma de evitar problemas es crear una pausa en el script utilizando el cmdlet Start-Sleep. Por ejemplo, debido a que IP-API limita las solicitudes a 45 por minuto, un script podría pausarse durante 1,4 segundos después de cada solicitud.
Otro método consiste en almacenar la información IP de las direcciones resueltas en una tabla hash y verificar la tabla para ver si hay una dirección presente antes de realizar una nueva solicitud. Esta técnica funciona bien porque muchas de las direcciones IP que se encuentran en los registros son las mismas.
Aquí hay un código para buscar una dirección IP en una tabla hash para decidir si es necesario emitir una solicitud al servicio web. Si la información ya existe, se obtiene de la tabla hash. De lo contrario, el script ejecuta la solicitud y almacena la información en la tabla hash.
$IPInfo = $Null
If (!($IPAddressHash[$AuditData.ClientIP])) {
$IPInfo = Get-IPGeoLocation -IPAddress $AuditData.ClientIP
$IPAddressHash.Add([string]$IPInfo.IP,$IPInfo)
# Sleep to avoid any throttling issues with the web service
Start-Sleep -Seconds 1
} Else {
# Get the IP information from the hash table
$IPInfo = $IpAddressHash[$AuditData.ClientIP]
}
Obviamente, es posible escribir código más seguro con un buen manejo de errores, pero esto es suficiente para demostrar el principio.
Uso de ubicaciones de acceso condicional
Si desea centrarse en las direcciones IP que no utiliza la organización, puede extraer el conjunto de rangos de direcciones IP definidos para las ubicaciones de Azure AD. Normalmente, las políticas de acceso condicional utilizan estas ubicaciones para probar si una conexión entrante es interna o externa. El cmdlet Get-MgIdentityConditionalAccessNamedLocation (del SDK de Microsoft Graph PowerShell) recupera detalles de las ubicaciones. Por ejemplo, este código encuentra el conjunto actual de ubicaciones y extrae los rangos de IP definidos en las ubicaciones:
[array]$CAKnownLocations = Get-MgIdentityConditionalAccessNamedLocation
[array]$IPAddressRanges = $Null
ForEach ($Location in $CAKnownLocations) {
$IPRanges = $Null
$IPRanges = $Location.AdditionalProperties['ipRanges']
If ($IPRanges) {
ForEach ($Address in $IPRanges) {
$IPAddressRanges += $Address['cidrAddress']
}
}
}
El resultado es un conjunto de direcciones IPv4 e IPv6 en formato CIDR:
51.171.212.129/24
2001:db8::/56
2001:db8::/53
Verificar una dirección IPv4 con una dirección CIDR requiere la expansión del CIDR a direcciones individuales en el rango. Este script hace el trabajo. Por ejemplo, aquí se explica cómo usar la función en el script para completar una matriz usando los dos CIDR IPv4 descubiertos en el último paso:
[array]$IPAddresses = Get-IPRange -Subnets "51.171.212.200/24", "51.171.212.129/24"Ahora es fácil comparar las direcciones IPv4 encontradas en los registros con la matriz para determinar si pertenecen a una ubicación interna. Por ejemplo:
If ($AuditData.ClientIP -in $IPAddresses) {
$InternalFlag = $True
} Else {
$ InternalFlag = $False }
Si no utiliza ubicaciones de IP para políticas de acceso condicional, puede crear y completar la matriz de una manera diferente. Por ejemplo, es posible que tenga todas las direcciones IP disponibles dentro de la empresa definidas en una hoja de cálculo de Excel que PowerShell puede leer para crear la matriz.
Uso de servicios de geolocalización
No es difícil utilizar servicios de geolocalización para resolver direcciones IP con PowerShell. El truco consiste en hacerlo de forma inteligente para que el servicio web no limite ni bloquee el acceso. Esto es posible al incluir código para detectar direcciones IP internas y solicitar resolución a un servicio de geolocalización solo para direcciones externas desconocidas. No dude en mejorar el código de PowerShell presentado aquí.