Análisis de logs de IIS utilizando Log Parser
Log Parser es una herramienta que permite analizar gran cantidad de datos de forma muy eficiente utilizando una sintaxis similar a SQL. Log Parser soporta una serie de formatos de entrada y de salida, estos son algunos:
FORMATOS DE ENTRADA |
(W3C) - Logs de IIS |
(HTTPERR) - Logs de HTTP.sys |
(EVT) - Logs de eventos NT |
(ETW) - Logs de ETW |
(URLSCAN) - Logs de URLSCAN |
(NETMON) - Trazas de Network Monitor |
(XML) - Ficheros XML genéricos |
(TEXTWORD) – Ficheros TXT genéricos |
Etc. |
FORMATOS DE SALIDA |
(NAT) - Columnas Tabuladas |
(CSV) - Comma Separated Value |
(TSV) - Tab Separated Value |
(XML) - XML |
Etc. |
Para el análisis de logs de IIS, una de las grandes cualidades de Log Parser es que se pueden realizar consultas sobre múltiples ficheros de log simultáneamente (por ejemplo, la carpeta entera de logs de IIS) de forma que podemos filtrar y agregar varios GB de datos y obtener sólo la información que nos interesa.
A mí personalmente me resulta más cómodo guardar las queries de Log Parser en ficheros *.bat dado que habitualmente hay que hacer pequeñas modificaciones y es fácil que se nos cuele algún error de sintaxis, y localizarlo y corregirlo en una consola de comandos CMD.EXE puede ser un poco tedioso.
A continuación os muestro algunos ejemplos de consultas de Log Parser que me han resultado útiles en alguna ocasión analizando logs de IIS. Dado que Log Parser no permite incluir retornos de carro en la cadena que contiene la query, las consultas se hacen menos legibles. Espero que aún así, los ejemplos sean los suficientemente claros.
¿Qué paginas tardan más tiempo en ejecutarse?
CONSULTA:
C:\program files\log parser 2.2> logparser.exe "SELECT COUNT(*) As Hits, AVG(time-taken) As AverageTimeTaken, MAX(time-taken) As MaxTimeTaken, TO_LOWERCASE(cs-uri-stem), sc-status, sc-substatus INTO [nombre_fichero_salida].txt FROM [ruta_completa_logs_IIS]\ex*.log GROUP BY TO_LOWERCASE(cs-uri-stem), sc-status, sc-substatus HAVING Hits > 10 ORDER BY AverageTimeTaken DESC" -i:IISW3C -o:NAT -rtp:-1
RESULTADO:
Hits AverageTimeTaken MaxTimeTaken TO_LOWERCASE(cs-uri-stem) sc-status sc-substatus
---- ---------------- ------------ ----------------------------------- --------- ------------
13 58496 388546 /index.html 401 5
60 2860 35577 /delegconfig/default.aspx 200 0
28 1481 10874 /delegconfig/default.aspx 401 5
13 1328 1328 / 401 2
13 299 734 /delegconfig 401 2
26 35 578 /delegconfig/default.aspx 401 2
12 33 78 /index.html 200 0
13 29 93 /delegconfig/wrkstainfo.dll 200 0
14 26 62 /delegconfig/images/information.gif 200 0
13 22 109 /delegconfig/scripts/images.js 200 0
…
Extraer todos los errores HTTP registrados
CONSULTA:
C:\program files\log parser 2.2> logparser.exe "SELECT cs-uri-stem, cs-method As meth, sc-status As stat, sc-substatus As substat, WIN32_ERROR_DESCRIPTION(sc-win32-status) as sc-win32-desc INTO [nombre_fichero_salida].txt FROM [ruta_completa_logs_IIS]\ex*.log WHERE sc-status BETWEEN 400 AND 599" -i:IISW3C -o:NAT -rtp:-1
RESULTADO:
cs-uri-stem meth stat substat sc-win32-desc
------------------------- ---- ---- ------- ---------------------------------------------------
/DelegConfig/Default.aspx GET 401 2 No credentials are available in the security pack…
/DelegConfig/Default.aspx GET 401 1 The operation completed successfully.
/DelegConfig/SetSPN.aspx POST 401 1 The operation completed successfully.
/prueba/ GET 403 14 Access is denied.
/DelegConfig GET 401 2 No credentials are available in the security pack…
/DelegConfig GET 401 1 The operation completed successfully.
/iisadmpwd/anot3.asp GET 404 0 The operation completed successfully.
/DelegConfig GET 401 2 No credentials are available in the security pack…
/DelegConfig GET 401 1 The operation completed successfully.
/DelegConfig/Default.aspx GET 404 2 The operation completed successfully.
…
Extraer todas las peticiones que se han realizado desde una IP específica
CONSULTA:
C:\program files\log parser 2.2> logparser.exe "SELECT date, time, time-taken, c-ip, cs-uri-stem, sc-status INTO [nombre_fichero_salida].txt FROM [ruta_completa_logs_IIS]\ex*.log WHERE c-ip = '157.58.114.46'" -i:IISW3C -o:NAT -rtp:-1
RESULTADO:
date time time-taken c-ip cs-uri-stem sc-status
---------- -------- ---------- ------------- -------------------------------------- ---------
2007-08-21 13:19:20 15 157.58.114.46 /DelegConfig/Images/Information.gif 200
2007-08-21 13:19:21 15 157.58.114.46 /DelegConfig/Images/Warning.gif 200
2007-12-14 12:06:35 593 157.58.114.46 / 401
2007-12-14 12:06:42 390 157.58.114.46 /iisadmpwd/anot3.asp 404
2007-12-14 12:08:07 31 157.58.114.46 /index.html 200
2007-12-14 12:08:15 62 157.58.114.46 /index.html 200
2007-12-14 13:07:31 11858 157.58.114.46 /DelegConfig/Default.aspx 200
2007-12-14 13:07:31 15 157.58.114.46 /DelegConfig/Scripts/StyleSheet.css 200
2007-12-14 13:07:38 0 157.58.114.46 /iexplore.exe.config 404
2007-12-14 13:07:41 2390 157.58.114.46 /DelegConfig/Default.aspx 200
…
Extraer todos los intentos de ataque de inyección de SQL a mi sitio web
CONSULTA:
C:\program files\log parser 2.2> logparser.exe "SELECT * INTO [nombre_fichero_salida].txt FROM [ruta_completa_logs_IIS]\ex*.log WHERE cs-uri-query LIKE '%CAST(%' OR cs-uri-query LIKE '%DECLARE%'" -i:IISW3C -o:NAT -rtp:-1
Espero que estos ejemplos os den una idea del tipo de información que podemos sacar de los logs de IIS. En cuanto a los temas de seguridad, como el ejemplo de inyección de SQL, aclarar que la query es meramente un ejemplo. El hecho de que dicha query no de resultados, no significa que el sitio web no haya sido atacado o sea susceptible a un ataque.
Para ampliar la información sobre los ataques de inyección de SQL, como detectarlos y prevenirlos, consultad los siguientes enlaces:
Filtering SQL injection from Classic ASP
https://blogs.iis.net/nazim/archive/2008/04/28/filtering-sql-injection-from-classic-asp.aspx
Anatomy of a SQL Injection Incident
https://blogs.technet.com/neilcar/archive/2008/03/14/anatomy-of-a-sql-injection-incident.aspx
SQLInjectionFinder.exe: herramienta para detección automática de ataques de inyección de SQL
https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=WSUS&ReleaseId=13436
En el momento de escribir este post la versión actual es Log Parser 2.2 y se puede descargar desde aquí.
Espero que os haya sido de utilidad. Hasta la próxima.
- Daniel Mossberg