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