jueves, 4 de junio de 2009

ServerInfo 0.1

Es un poco molesto estar conectando con netcat y mandando heads y options cada vez que queres ver los headers de un servidor web, asi que hice este script muy sencillo que te muestra esa información.
Pueden bajarlo de acá y acá.

una demostracion de lo que hace y como se usa:
seth@debian:~$ chmod +x sinfo.sh
seth@debian:~$ ./sinfo.sh microsoft.com OPTIONS
********************************
* ServerInfo 0.1 *
* http://0verl0ad.blogspot.com *
* seth /A\ el-hacker.org *
********************************
Uso: ./sinfo.sh host [GET|HEAD|OPTIONS]


Allow: OPTIONS, TRACE, GET, HEAD
Server: Microsoft-IIS/6.0
Public: OPTIONS, TRACE, GET, HEAD, POST
X-Powered-By: ASP.NET
X-UA-Compatible: IE=EmulateIE7
Date: Wed, 03 Jun 2009 23:18:58 GMT
seth@debian:~$ ./sinfo.sh www.google.com.ar HEAD
********************************
* ServerInfo 0.1 *
* http://0verl0ad.blogspot.com *
* seth /A\ el-hacker.org *
********************************
Uso: ./sinfo.sh host [GET|HEAD|OPTIONS]


Date: Wed, 03 Jun 2009 23:19:05 GMT
Server: gws
seth@debian:~$ ./sinfo.sh foro.undersecurity.net GET
********************************
* ServerInfo 0.1 *
* http://0verl0ad.blogspot.com *
* seth /A\ el-hacker.org *
********************************
Uso: ./sinfo.sh host [GET|HEAD|OPTIONS]


Date: Wed, 03 Jun 2009 23:19:17 GMT
Server: Apache/1.3.37 (Unix) mod_throttle/3.1.2 FrontPage/5.0.2.2635 mod_psoft_traffic/0.2 mod_ssl/2.8.28 OpenSSL/0.9.8b
X-Powered-By: PHP/5.2.6
seth@debian:~$ ./sinfo.sh foro.undersecurity.net OPTIONS
********************************
* ServerInfo 0.1 *
* http://0verl0ad.blogspot.com *
* seth /A\ el-hacker.org *
********************************
Uso: ./sinfo.sh host [GET|HEAD|OPTIONS]


Date: Wed, 03 Jun 2009 23:19:27 GMT
Server: Apache/1.3.37 (Unix) mod_throttle/3.1.2 FrontPage/5.0.2.2635 mod_psoft_traffic/0.2 mod_ssl/2.8.28 OpenSSL/0.9.8b
Location: http://www.google.com/search?q=Como%20puedo%20ser%201337%20h4x0r?!?!!1
seth@debian:~$ ./sinfo.sh foro.portalhacker.net OPTIONS
********************************
* ServerInfo 0.1 *
* http://0verl0ad.blogspot.com *
* seth /A\ el-hacker.org *
********************************
Uso: ./sinfo.sh host [GET|HEAD|OPTIONS]


Date: Wed, 03 Jun 2009 23:19:47 GMT
Server: Apache/1.3.41 (Unix) mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.8b
Allow: GET, HEAD, OPTIONS, TRACE
seth@debian:~$

Lo que hace es mandar una petición http (con pocas cabeceras, se puede agregar mas para que parezca de un usuario normal) usándo los métodos GET, OPTIONS o HEAD y muestra lo mas interesante de la respuesta.

C1c4Tr1Z (Blog) me respondió con una version mucho mas corta usando curl (tiene cosas a favor y en contra):

Te recomendaría usar curl:
Language: Bash
c1c4tr1z(bash) % ~ $ data=( localhost OPTIONS );curl -X "${data[1]}" -H "Host: ${data[0]}" -I -A "one-user-agent/1.1.1.1" ${data[0]}
HTTP/1.1 200 OK
Date: Thu, 04 Jun 2009 00:40:53 GMT
Server: Apache
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Length: 0
Content-Type: httpd/unix-directory

Pero despues se podría hacer mas especifico con awk , por ejemplo, para checkear si nos responde con un código 200 (OK):
Language: Bash
c1c4tr1z(bash) % ~ $ data=( localhost OPTIONS );curl -X "${data[1]}" -H "Host: ${data[0]}" -I -A "one-user-agent/1.1.1.1" ${data[0]} | awk '
BEGIN{a=0}
$1~/^HTTP\/1\.[0-1]$/{if($2=="200"){a=1}}
{if(a==1){print$0}}'

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
HTTP/1.1 200 OK
Date: Thu, 04 Jun 2009 00:51:38 GMT
Server: Apache
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Length: 0
Content-Type: httpd/unix-directory

c1c4tr1z(bash) % ~ $ data=( localhost/no-existe/ OPTIONS );curl -X "${data[1]}" -H "Host: ${data[0]}" -I -A "one-user-agent/1.1.1.1" ${data[0]} | awk '
BEGIN{a=0}
$1~/^HTTP\/1\.[0-1]$/{if($2=="200"){a=1}}
{if(a==1){print$0}}'

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 296 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
c1c4tr1z(bash) % ~ $
Entonces, si el código HTTP devuelto es 200 (OK) el valor de a, que comienza siendo 0, va a ser 1 lo que haría que awk de como output todo el resultado de la cabecera.
Si querés mas información del tema:
HTTP/1.1: Header Field Definitions
Posts sobre http en el blog

No necesito que me digan que no soy bueno en bash, pero acepto sugerencias, mejoras, opiniones, etc.
5 0verl0ad Labs: ServerInfo 0.1 Es un poco molesto estar conectando con netcat y mandando heads y options cada vez que queres ver los headers de un servidor web, asi que hi...

2 comentarios:

Julio Jaime dijo...

simplemente excelente. Me imagino que la necesidad surgio por el problemita del webdav.

Yo que habia intentado hacer algo asi con Python y lo que pude hacer desde mi ignorancia fue muy basico.

#!/usr/bin/python
import urllib, urllister,sys
arg = ''+sys.argv[1]+''
usock = urllib.urlopen(arg)
usock.close()
print usock.info()

>> s E t H << dijo...

en realidad surgió de unos bugs en smf, con iis no pruebo casi nada.

< >