#!/bin/bash #========================================================== # Random/Sequential carrier scanner implimenting pppd+chat # hybrid #========================================================== # rnd|std - Random(bash prng) or Seqential scanning. # -r - Randomization: # Implements SRegister 11 (DTMF Speed Control) with a random # pattern between 50 - 255 milliseconds + Generates random # pauses between dialing a different number. # For verbosity, tail -f your syslog. # Logs results to in pwd. # Generates Dial-List to # Note: when scanning low ranges, ie: 0800 123 000 010, # take out the suffixing 0 from the scanto range, ie: # ./scn.sh 0800 123 000 10 rnd -r, instead of 000 010. # Implimentation: # * Remote scanning from box inside internal LAN, internal # extensions. (todo: internal Meridian/Audix/Octel RA # dialup hunting mode. # * Daemonize the script, crond.. # (todo: mailto:u upon finding carrier) #========================================================== # prefix before dialed number, ie: CLID blocking, # 9 for outside line etc. ROUTE="141," # recomended 45 (sec) TIMEOUT="30" BAUD="9600" DEV="/dev/ttyS0" # pause between dialing limits (used in -r) # default 0-10 seconds. For greater stealth, increase the # upper limit p_upper=10 p_lower=0 # S Register's # Lost Carrier Hang Up Delay, length of time to wait before # hanging up after carrier loss has been detected (1-255 tenths of sec) declare -i LC=14 # DTMF Speed Control, length of DTMF tone/speed of dialing # (50-255 milliseconds) declare -i DTMFSPC=95 # Some/Most eXchanges will not allow rapid dialing (in the 50/ms mark), # adjust the lower limit to suit your line when scanning with random dtmf # speeds. Standard mode is preset to 95m/s, adjust this to suit. upper=255 lower=50 if [ $# -lt 4 ] ;then { echo "./`basename $0` <-r>" } >&2 exit 1 fi pre=$1 ran=$2 from=$3 declare -i to=$4 rdial=$6 code="${pre}${ran}${from}-${to}.log" stat="${pre}${ran}${from}-${to}.stat" data="${pre}${ran}${from}-${to}.dat" dial() { line=`cat ${stat}` declare -i length=`cat ${data} |wc -l` let "length -= ${line}" for (( i=0 ; i<=length ; i++ )) ;do noint=`ps x |grep pppd |grep -v grep |wc -l` if [ ${noint} -eq 0 ] ;then if [ "${rdial}" == "-r" ] ;then DTMFSPC=0 while [ ${DTMFSPC} -le ${lower} ] ;do DTMFSPC=${RANDOM} let "DTMFSPC %= ${upper}" done pause=0 while [ ${pause} -le ${p_lower} ] ;do pause=${RANDOM} let "pause %= ${p_upper}" done echo "done" echo "waiting ${pause} seconds before dialing..." sleep ${pause} fi num=`cat ${data} |sed ${line}q |tail -1 |awk '{ print $1$2$3 }'` killall -9 pppd chat 2>/dev/null echo ;echo -n "dialing ${ROUTE}${num}" pppd ${DEV} ${BAUD} debug kdebug 4 logfile ${code} \ connect \ 'chat -E -v -t '${TIMEOUT}' \ ABORT "BUSY" \ ABORT "VOICE" \ ABORT "NO ANSWER" \ ABORT "NO DIALTONE" \ ABORT "NO CARRIER" \ ABORT "ERROR" \ ECHO OFF \ SAY "'${num}':\n" \ "''" "AT S10='${LC}' S11='${DTMFSPC}'" \ OK ATDT'${ROUTE}${num}' \ CONNECT "''" \ SAY "CARRIER DETECTED ON: '${num}'\n"' let "line++" echo ${line} >${stat} else sleep 2 echo -n "." let "length++" fi done } std() { echo "${from}" >tmp.$$ bs="`cat tmp.$$ |wc -L`" for (( i=from ; i<=to ; i++ )) ;do if [ $i -lt 10 ] && [ ${bs} -le 3 ] ;then range[pos]=00${i} elif [ $i -lt 100 ] && [ ${bs} -le 3 ] ;then range[pos]=0${i} elif [ $i -lt 10 ] && [ ${bs} -ge 4 ] ;then range[pos]=000${i} elif [ $i -lt 100 ] && [ ${bs} -ge 4 ] ;then range[pos]=00${i} elif [ $i -lt 1000 ] && [ ${bs} -ge 4 ] ;then range[pos]=0${i} else range[pos]=${i} fi { echo "${pre} ${ran} ${range[pos]}" } >>${data} let "pos += 1" done rm -rf tmp.$$ } rnd() { echo "${from}" >tmp.$$ bs="`cat tmp.$$ |wc -L`" echo ;echo "generating array" ;echo for (( i=from ; i<=to ; i++ )) ;do echo -n "-" if [ $i -lt 10 ] && [ ${bs} -le 3 ] ;then range[pos]=00${i} elif [ $i -lt 100 ] && [ ${bs} -le 3 ] ;then range[pos]=0${i} elif [ $i -lt 10 ] && [ ${bs} -ge 4 ] ;then range[pos]=000${i} elif [ $i -lt 100 ] && [ ${bs} -ge 4 ] ;then range[pos]=00${i} elif [ $i -lt 1000 ] && [ ${bs} -ge 4 ] ;then range[pos]=0${i} else range[pos]=${i} fi let "pos += 1" done echo -n ">DONE" ;echo ;echo p=0 range_length=${#range[@]} echo "generating random suffix" ;echo for (( j=0 ; jDONE" ;echo echo "saving output to file.." ;echo { while [ $p -lt $range_length ] ;do echo "${pre} ${ran} ${range[$p]}" let "p = $p + 1" done } >${data} rm -rf tmp.$$ echo "DONE" } if [ "${5}" == "std" ] ;then if [ ! -e ${stat} ] || [ ! -e ${data} ] ;then echo "1" >${stat} #============== std ;dial ;echo #============== elif [ `cat ${stat}` -gt `cat ${data} |wc -l` ] ;then echo "seqential scan complete." exit 0 else #============== dial ;echo #============== fi elif [ "${5}" == "rnd" ] ;then if [ ! -e ${stat} ] || [ ! -e ${data} ] ;then echo "1" >${stat} #============== rnd ;dial ;echo #============== elif [ `cat ${stat}` -gt `cat ${data} |wc -l` ] ;then echo "random scan complete." exit 0 else #============== dial ;echo #============== fi else echo "choose random(rnd) or seqential scan(std)" fi exit 0