#!/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