En esta entrada se muestra el código fuente del script domain2nmap.sh que recibe un nombre de dominio y utiliza el comando wget, el buscador Bing y/o Shodan para conseguir un listado relacionado con el mismo. Posteriormente realiza un escaneo con Nmap de las IPs que resuelven dichos dominios.
Sintaxis: ./domain2nmap.sh [OPTIONS] URL
Entre las opciones que podemos utilizar se incluye la posibilidad de elegir el motor de búsqueda: wget, Bing, Shoda o All. También podemos elegir entre realizar un escaneo de tipo SYN, ACK, UDP o Ping y guardar el reporte en formato XML, grepeable o normal.
En caso de lanzar el script sin opciones, utilizará todos los métodos de búsqueda para realizar un escaneo ping y guardar el resultado en formato XML.
Código fuente:
#!/bin/bash
#
# Name: domain2nmap.sh
# Description: This script receive a web domain name and obtain a list
# of associated domains and their IPs to make differents
# scans with nmap.
# Author: BrixtonC
# Date: 15 Feb 2012
# Version: 0.4
# Example: ./domain2nmap.sh --help
# ./domain2nmap.sh www.cnn.com
# ./domain2nmap.sh -r shodan www.cnn.com
# ./domain2nmap.sh -s A -o normal www.sun.com
#
### FUNCTIONS
function Usage {
# This function show the sintax of script and some examples. This function
# is call by Arguments function or errors.
#
echo -e " Sintax:\t$0 [OPTIONS] URL\n"
echo -e " Options:\t* Search methods (-r)"
echo -e " \t\t all: Search with all methods (default**)"
echo -e " \t\t bing: Bing search with IP operator"
echo -e " \t\t shodan: Shodan search with hostname operator"
echo -e " \t\t wget: Search with wget command"
echo -e " \t\t* Scan types (-s)"
echo -e " \t\t A: ACK scan"
echo -e " \t\t P: Ping scan (default**)"
echo -e " \t\t S: SYN scan"
echo -e " \t\t U: UDP scan"
echo -e " \t\t* Out types (-o)"
echo -e " \t\t grep: Save scan in grepable format"
echo -e " \t\t normal: Save scan in normal format"
echo -e " \t\t xml: Save scan in xml format (default**)\n"
echo -e " \t\t** Without options the script it's call with default options\n"
echo -e " Examples:\t$0 www.cnn.com\n\t\t$0 -s A -o normal www.sun.com"
echo -e "\t\t$0 -r shodan www.microsoft.com\n\t\t$0 -r wget -s U www.cnn.com\n"
exit 0
}
function Arguments() {
# This function check the number of arguments, print error if don't pass
# any argument and define the domain name objetive for Resolv function.
#
if [ "$#" == "0" ]; then
echo -e "[*] ERROR: Valid domain name is required\n"
Usage
else
if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
Usage
else
local NAME="`echo $@ | awk '{print $NF;}' | sed 's/www\.//'`"
CheckDomain $NAME
fi
fi
}
function CheckDomain() {
# This function run ping test to evaluate if the last argument's of script
# is a valid domain name and declarate the variable $DOMAIN. In wrong case,
# show error and exit.
#
resolveip $1 > /dev/null
[ "$?" != "0" ] && echo -e "[*] ERROR: '$1' not is a valid" \
"domain name" && exit 1 || DOMAIN="`echo $1`"
echo -e "[+] Domain name: $DOMAIN"
}
function Options() {
# This function receive all arguments to obtain the scan and output options
# to run nmap command with respective options. In default case, without
# options, run the script with ping scan and xml output format.
#
while getopts "r:s:o:" OPTION; do
case $OPTION in
r)
if [ "$OPTARG" == "bing" ]; then
RESOLVTYPE="bing" && RESOLVNAME="Bing search"
elif [ "$OPTARG" == "wget" ]; then
RESOLVTYPE="wget" && RESOLVNAME="Wget search"
elif [ "$OPTARG" == "shodan" ]; then
RESOLVTYPE="shodan" && RESOLVNAME="Shodan search"
elif [ "$OPTARG" == "all" ]; then
RESOLVTYPE="all" && RESOLVNAME="All methods"
fi
;;
s)
if [ "$OPTARG" == "P" ]; then
SCANTYPE="-sn" && SCANNAME="Ping scan"
elif [ "$OPTARG" == "S" ]; then
SCANTYPE="-sS" && SCANNAME="SYN scan"
elif [ "$OPTARG" == "A" ]; then
SCANTYPE="-sA" && SCANNAME="ACK scan"
elif [ "$OPTARG" == "U" ]; then
SCANTYPE="-sU" && SCANNAME="UDP scan"
fi
;;
o)
if [ "$OPTARG" == "xml" ]; then
OUTTYPE="-oX" && OUTNAME="XML" && OUTEXT="xml"
elif [ "$OPTARG" == "normal" ]; then
OUTTYPE="-oN" && OUTNAME="Normal" && OUTEXT="txt"
elif [ "$OPTARG" == "grep" ]; then
OUTTYPE="-oG" && OUTNAME="Grep" && OUTEXT="log"
fi
;;
esac
done
[ -z "$SCANTYPE" ] && SCANTYPE="-sn" && SCANNAME="Ping scan (default)"
[ -z "$OUTTYPE" ] && OUTTYPE="-oX" && OUTNAME="XML (default)" && \
OUTEXT="xml"
[ -z "$RESOLVTYPE" ] && RESOLVTYPE="all" && RESOLVNAME="All methods (default)"
echo -e "[+] Search type: $RESOLVNAME"
echo -e "[+] Scan type: $SCANNAME"
echo -e "[+] Output type: $OUTNAME"
}
function Resolv {
# This function decide watch kind of search use: Wget, Bing, Shodan or All.
#
if [ "$RESOLVTYPE" == "wget" ]; then
WgetSearch
elif [ "$RESOLVTYPE" == "bing" ]; then
BingSearch
elif [ "$RESOLVTYPE" == "shodan" ]; then
ShodanSearch
else
WgetSearch
BingSearch
ShodanSearch
fi
grep -v "[0-9]f*" tmp | sort | uniq > domains.lst
rm -rf tmp
}
function WgetSearch {
# This function save index Web page of the domain and obtain a list
# of domains relationated with domain target.
#
echo -e "[+] Wget search domain: $DOMAIN"
wget -q $DOMAIN > /dev/null
grep -oE "http://[a-z0-9\-\.]*\.$DOMAIN" index.html | \
cut -d "/" -f 3 >> tmp
rm -rf index.html
}
function BingSearch {
# This function call Bing IP search to obtain a list of domains
# relationated with domain target.
#
# This functions is a modification of bing-ip2host script with
# GPLv3 license:
#
# http://www.morningstarsecurity.com/research/bing-ip2hosts
#
local IP="`resolveip -s $DOMAIN`"
local PAGE="0"
echo -e "[+] Bing search IP: $IP"
while (( "$PAGE" <= "10")); do
local URL="http://m.bing.com/search/search.aspx?A=webresults&Q=ip%3a$IP&D=Web&SI=$PAGE"
wget -q -O $IP-$PAGE.html $URL
grep -oE "[a-z0-9\-\.]*\.$DOMAIN" $IP-$PAGE.html >> tmp
rm -rf $IP-$PAGE.html
PAGE="$(($PAGE + 1))"
done
}
function ShodanSearch {
# This function run a Shodan hostname search to obtain a list of domains
# relationated with domain target.
#
local URL="http://www.shodanhq.com/search?q=hostname%3A$DOMAIN"
echo -e "[+] Shodan search domain: $DOMAIN"
wget -q -O index.html $URL > /dev/null
grep -E "class='hostname'" index.html | \
grep -oE "http://[0-9a-z\.\-]*\.$DOMAIN" | \
cut -d "/" -f 3 >> tmp
rm -rf index.html
}
function ResolvDomain {
# This function receive obtained domains names of domain target
# and translate it to their IP address.
#
echo -e "[+] Resolving domains"
for NAMES in $(cat domains.lst); do
dig $DOMAIN | grep -oE "[0-9]{1,3}(\.[0-9]{1,3}){3}$" >> tmp
done
sort tmp | uniq > ipaddress.lst
rm -rf tmp
}
function ScanIP {
# This function scan each host obtained with Resolv function throuth
# ipaddress.lst file and save the result in a file with IP and date
# as name.
echo -e "[+] Scaning address"
local NAME="${DOMAIN}_$(date +'%Y-%m-%d')"
nmap $SCANTYPE $OUTTYPE $NAME.$OUTEXT -iL ipaddress.lst > /dev/null
echo -e "[+] Filename: $NAME.$OUTEXT"
}
### SCRIPT
# Run Arguments function with all arguments separated to whitespaces to check
# the number of options and domain value.
#
Arguments $@
# Run Options function with all arguments to obtain the scan and output options
# to run the script
#
Options $@
# Run Resolv function with domain name as argument to obtain a list of
# related domains names.
#
Resolv
# Now check if exist domain.lst and ipaddress.lst file by use it in
# ResolvDomain and ScanIP functions. In wrong case show a error and run
# function Usage.
#
# FILE: domains.lst
[ ! -r domains.lst ] && echo "[*] ERROR: Can't read domains.lst file or" \
"don't exist" && exit 2 || ResolvDomain
#
# FILE: ipaddress.lst
[ ! -r ipaddress.lst ] && echo -e "[*] ERROR: Can't read ipaddress.lst" \
"file or don't exist" exit 3 || ScanIP
### NORMAL EXIT
# Show some exit messages.
#
echo -e "[+] Exit of script"
# Exit codes.
# 0 -> Succefull exit and function Usage()
# 1 -> No valid domain
# 2 -> Error file domains.lst
# 3 -> Error file ipaddress.lst
#
exit 0
#EOF
##FVE
En el siguiente enlace puedes ver una explicación del mismo así como las pruebas realizadas. Falla cuando Nmap recibe el archivo ipaddress.lst vacío y habría que retocarlo para controlar los fallos. Los comentarios están escritos en Inglés, o Spanglish mejor dicho. Puede haber errores idiomaticos, sintacticos y todos los que encuentres...
La función SearchBing es una modificación del script bing-ip2host de Andrew Horton que se licencia bajo GPLv3 al igual que los contenidos publicados en el blog. Sientete libre de reutilizar o modificar el mismo siempre tengas en cuenta el licenciamiento ; ).
Un saludo, Brixton Cat.
No hay comentarios:
Publicar un comentario
Bienvenid= si quieres dejar un comentario