PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash - port scanner mit telnet



lobo
26-02-2003, 20:34
Hi,

ich versuche gerade zum Spass einen Portscanner mit der Bash und Telnet zu basteln.
Das eigentliche Problem ist nur hier:



# save target reply in SCAN
SCAN=`echo ${MSG} | telnet ${TARGET} ${SPORT} 1>/dev/null`


Von stderr(2), kommt bei einem offenen Port die Meldung "Connection closed by foreign host.". Leider werden aber nur Ausgaben von stdout in der Variablen $SCAN gespeichert. Wie kann ich die Ausgabe von stderr in der Variablen $SCAN speichern?




#!/bin/sh

# target host
TARGET=${1}
# start port
SPORT=${2}
# end port
EPORT=${3}

# send message to host
MSG="this is not a scan ;-)"
# target reply: port open message
TREP="Connection closed by foreign host."

while [ ! ${SPORT} -eq ${EPORT} ]; do
# save target reply in SCAN
SCAN=`echo ${MSG} | telnet ${TARGET} ${SPORT} 1>/dev/null`

# compare SCAN with TREP
if [ "${SCAN}" == "${TREP}" ]; then
echo "${SPORT} is open, on ${TARGET}!";
else
echo "${SPORT} is closed, on ${TARGET}!";
fi

# increment port
SPORT=`expr ${SPORT} + 1`
done;


gruss

Jochen

phate
27-02-2003, 14:51
Hi lobo,


Wie kann ich die Ausgabe von stderr in der Variablen $SCAN speichern?

indem Du stderr mit auf stdout umleitest.

SCAN=`echo ${MSG} | telnet ${TARGET} ${SPORT} 2>&1 1>/dev/null`

Somit landen nun auch die Ausgaben auf stderr in stdout und somit in $SCAN.

gruss,

phate

lobo
27-02-2003, 16:41
Vielen Dank!!!

Ich habe auch alles mögliche Ausprobiert, aber an das hatte ich nicht gedacht. Ich hatte schon so etwas probiert, nur hatte ich bei 2>&1, das & Zeichen vergessen.

Zwischenzeitlich hatte ich schon was funktionierendes, aber mit awk und das war recht langsam, aber jetzt funktionierts ja ;-)



#!/bin/sh

# host to scan
TARGET=${1}
# start port
SPORT=${2}
# end port
EPORT=`echo $[${3}+1]`
# send message to host
MSG="This is not a scan ;-)"
# port open message
POMSG="Connection closed by foreign host."

# help message
usage() {
echo
echo " usage: ${0} <TARGET> <START-PORT> <END-PORT>"
echo

exit 1
}

# check arguments
if [ "$#" -ne 3 ]; then
usage
fi

echo
echo "Scanning host: ${TARGET}"
echo

while [ ! ${SPORT} -eq ${EPORT} ]; do
# scan port. save result in $SCAN
SCAN=`echo "${MSG}" | telnet ${TARGET} ${SPORT} 2>&1 1>/dev/null`
if [ "${SCAN}" == "${POMSG}" ]; then
echo "${SPORT} is open!"
fi
# increment $SPORT
SPORT=`echo $[${SPORT}+1]`
done

echo


Gruss

Jochen

sticky bit
28-02-2003, 02:39
Hmm, gibt telnet keinen exit Status zurück?
Probier mal, was passiert wenn du telnet host; echo $? machst ob sich die Ausgabe der Shell (ne Zahl einfach) unterschieden wenn es den Host gibt und du telnet beendest und wenn es den Host nicht gibt. Nur so ne Idee, ist dann auch auf internationale Ausgaben kompatibel. Nur so ne Idee...