Simple Smb Scanner written in Bash for linux for newer systems with zmap support
smbscan-1.2.tar.gz
(Download all) for new systems (2015) with zmap and so on
– added zmap support
– replaced smbmount with mount
– removed dialog an whiptail
#!/bin/bash
# This script scans smb servers a given network
# and mounts anonymous shared directories
# example: ./smbscan.sh or ./smbscan iprange
# http://www.bastardo.de/
# clean old temp files
rm -f *.out
if [ `id -u` -ne 0 ]; then
echo "You must be root to use this script."
exit 1
fi
FILESYSTEM=cifs
MNT=/bin/mount
SMBC=/usr/bin/smbclient
NMBL=/usr/bin/nmblookup
NMAP=/usr/bin/nmap
GREP=/bin/grep
SED=/bin/sed
ZMAP=/usr/sbin/zmap
CHARSET="iso8859-1"
TIMEOUT=2
usage() { echo "Usage: $0 [-z number of hosts (zmap)] [-n ip/range (nmap)]" 1>&2; exit 1; }
while getopts "n:z:" opt; do
case "$opt" in
n)
echo "using nmap with ${OPTARG}" >&2
NMAPSCAN=1
test -x $NMAP || { echo -e 'nmap not found !';exit 1; }
IP=${OPTARG}
;;
z)
echo "using zmap with ${OPTARG} hosts" >&2
ZMAPSCAN=1
test -x $ZMAP || { echo -e 'zmap not found !';exit 1; }
z=${OPTARG}
;;
h)
echo "Invalid option: -$OPTARG" >&2
usage
;;
*)
echo "Option -$OPTARG requires an argument. " >&2
usage
exit 1
;;
esac
done
if [ -z $ZMAPSCAN ] && [ -z $NMAPSCAN ]; then
usage
fi
shift $((OPTIND-1))
test -x $MNT || { echo -e 'mount not found !';exit 1; }
test -x $SMBC || { echo -e 'smbclient not found !';exit 1; }
test -x $NMBL || { echo -e 'nmblookup not found !';exit 1; }
test -x $GREP || { echo -e 'grep not found !';exit 1; }
test -x $SED || { echo -e 'sed not found !';exit 1; }
function check_it(){
SUM=0
X=`cat ./out | wc -c`
SUM=`expr $SUM + $X`
}
echo "Written by cd ;)"
echo "Scan started against to $1 on port 139"
echo "This can take a while"
if [ "$NMAPSCAN" = 1 ]
then
echo "search via nmap at ip/range ${n} for hosts who has opened port 139"
$NMAP -p 139 -PN -T 5 -sT -v -v $IP -oG ./$IP.out | $GREP Host
cat ./$IP.out | $GREP "139/open" | cut '-d ' -f 2 > ./out
else
echo "search via zmap for ${z} hosts who has opened port 139"
$ZMAP -N ${z} -p 139 -B 1M -q -o ./out
sed -i '1d' ./out #delete first line "saddr" for csv
fi
shift $((OPTIND-1))
rm -f ./$IP.out
check_it
if [ $SUM = 0 ]
then
echo "Sorry
No SMB Server found !
Thanks for use ... "
rm -f ./out
exit 1
fi
echo "Please wait...
Searching 4 Shared Directories"
while read host ;
do
# Get Computer name
echo "Try $host..."
echo "Searching Name via nmblookup (B)"
name=`$NMBL -A $host | $GREP "<00> - B <ACTIVE>" | awk '{print $1}'`
# Get Workgroup name
workgroup=`$NMBL -A $host | $GREP "<00> - <GROUP>" | awk '{print $1}'`
# if name not set so use this one
workgroup=${workgroup:=WORKGROUP}
name=${name:=IG_IT_IG_IT}
if [ $name = "IG_IT_IG_IT" ]
then
echo "Searching name via nmblookup (M)"
name=`$NMBL -A $host | $GREP "<00> - M <ACTIVE>" | awk '{print $1}'`
fi
name=${name:=NONAME}
if [ $name = "NONAME" ]
then
echo "Searching Name via nmblookup (H)"
name=`$NMBL -A $host | $GREP "<00> - H <ACTIVE>" | awk '{print $1}'`
fi
name=${name:=NO_NAME}
if [ $name = "NO_NAME" ]
then
echo "Searching Name via Smbclient ... using Servername"
name=`$SMBC -N -L $host -g | grep Server | awk {'print $1'} | cut -d '|' -f 2`
fi
name=${name:=NAME_NOT_FOUND}
# search for shared folders
echo "looking for shared directorys on $host"
# kill old sleep process
kill -9 `pidof sleep` 2&>1
$SMBC -W "$workgroup" -n "fuckup" -N -L $host -g -p 139 | grep Disk | cut -f 2 -d '|' > ./$host.shares
# set Timeout to kill connections that take to long 10 sec is ok i think
sleep $TIMEOUT || kill -9 `pidof $SMBC` 2&>1
exist=0
while read LIST ;
do
exist=1
#make directory for the shares
mkdir -p ./"$name-$host/$LIST"
#add a logfile
#touch ./"$name-$host/ip-is-$host"
$MNT -t cifs -o guest,iocharset=utf8,_netdev //$host/$LIST ./$name-$host/$LIST
$MNT -t cifs -o user=nobody,iocharset=utf8,_netdev //$host/$LIST ./$name-$host/$LIST
$MNT -t nfs $host:/$LIST ./$name-$host/$LIST
echo "trying to mount //$host/$LIST into ./$name-$host/$LIST"
if [ $exist = 1 ]
then
#write some useful or not very useful informations into a log
echo "
$name - $host
Last found: `date`
Mapped : `df -h | grep $host`" >> ./"$name-$host/ip-is-$host"
fi
done < ./$host.shares
rm -f ./$host.shares
done < ./out
mount | $GREP $FILESYSTEM > ./mounts
echo "
SMBScan v 1.2 -> listing mounted smb file systems
`cat ./mounts | more`
"
rm -f ./mounts
rm -f ./out
umountall.sh
#!/bin/sh #get forced echo "unmounting smb file systems (force)" umount -f */*