11/16/2007


Inetd y Xinetd

Muy buen articulo que habla del uso de inetd y xinetd y como podemos crear un troyano con esos demonios. Fuente e-zine datacode N.4


INETD Y XINETD
--------------
Estos Superdemonios sirven para controlar las conexiones de red en un ordenador.
En inetd cuando se detecta un intento de conexion al pc, este se redirije a un programa
conocido como tcpd.
*tcpd ---> Demonio que puede monitorizar y filtrar peticiones entrantes para diversos
*servicios tales como finger , ftp, ssh y muchos algunos más. Tcpd anota los intentos en un log.
Tcpd , dependiendo de las reglas contenidas en el host.allow y el host.deny, (ambos archivos se encuentran en /etc/ ),
** La estructura de una linea de estos ficheros es la siguiente:
ALL: LOCAL: ALLOW | 1ş ---> Demonio , en este caso se refiere a todos.
--- ---- ------- | 2ş ---> Host, aparte de la ip se pueden
1 2 3 | poner las siguientes opciones. | ALL ---> Todas las conexiones.
| LOCAL -> Conexiones que no contienen un punto.
| PARANOID > Máquinas que no coincide el nombre con la ip.
| KNOWN ---> Conexiones de las cuales se conoce el nombre y la ip.
| UNKNOWN -> Conexiones de las cuales se desconoce el nombre o la ip.

| 3ş ---> Posibles opciones . |ALLOW ---> Acepta.
|DENY ----> Deniega.
|TWIST ---> Ejecuta un comando, pero no establece
|la conexion.
|SPAWN ---> Una vez establecida la conexion,
|esta opcion ejecuta un comando en la shell
| ** Para TWIST y SPAWN , podemos poner unos parametros que nos ayuden
| a completar los comandos que pongamos para qu se ejecuten en la shell.Serian:
| %a ---> Nos pondria el nombre de la máquina que intenta acceder a nuestro pc
| %d ---> El demonio que esta utilizando.
| %p ---> El PID del proceso que esta usando.

acepta o deniega la conexion. Si la peticion se acepta se iniciara el servicio
correspondiente. Este mecanismo se denomina tcp_wrapper.

EJEMPLOS
--------
En el /etc/host.deny :

ALL: ALL |---> Deniega todas las conexiones a todos los servicios.

ALL: ALL except 195.125.24.1 |----> Este ejemplo realiza la misma funcion del anterior,
| unicamente que aceptara solamente las conexiones a todos
| los servicios de 194.125.24.1.

proftpd: ALL |---> Deniega todas las conexiones al servicio ftp.


ALL: ALL TWIST |---> No deja establecer la conexion a nadie , pero poniendo TWIST, podemos
| ejecutar un comando.

ALL: ALL TWIST (/bin/echo -e " Intento de conexion de %n a traves del demonio %a " >> /var/log/conexiones &)
------------------------------------------------------------------------------------------------------------
|-> Este Comando nos rechaza todas las conexiones, pero crea un log
| en /var/log/conexiones con todos los intentos de conexion, mostrandonos
| una linea en la que nos muestra la ip y el demonio que utiliza.

En el /etc/host.allow:

ALL: ALL |---> Acepta todas las conexiones.

ALL: ALL except 195.125.24.1 |-> Acepta todas las conexiones salvo la de 194.125.24.1.

telnetd: ALL SPAWN (/bin/echo -e " Ha entrado al telnet %a " >> /var/log/conexiones &)
--------------------------------------------------------------------------------------
|-> Este comando Acepta todas las conexiones a traves de telnet y las logea
| en /var/log/conexiones dandonos la ip.

sshd: 195.125.15.4 , 182.47.14.89 |----> Acepta las conexiones por ssh de 195.125.15.4 y
| 182.47.14.89 .


Buen ahora voy a tratar un poco la configuracion de inetd.
Para ello tendriamos que modificar el archivo inetd.conf que se encuentra en nuestro
directorio /etc.

Bueno , para cerrar un servicio en el inetd, unicamente tienes que comenlar la linea del servicio,
como en este caso:
# echo stream tcp nowait root internal
Una vez comentada la linea se debe de reiniciar el demonio , nada de reiniciar el pc ,
lo digo para aquellos que viven con la mentalidad anclada en windows :). Para reinciar el
demonio lo unico que teneis que hacer es /etc/init.d/inetd restart:
tecnet:/etc# /etc/init.d/inetd restart
Restarting internet superserver: inetd.
tecnet:/etc#
Ahora voy a comentar un poco la estructura de una frase del inetd.conf
time stream tcp nowait root internal
---- ------ --- ------ ---- --------
1 2 3 4 5 6

1ş ----> Nombre del servicio.Se buscará en /etc/services , para ver a que puerto corresponde.
Ex de una linea del /etc/services:
ftp 21/tcp | La primera parte nos indica el nombre del servicio, después
| nos dice el puerto que usará y el protocolo.
| En este ejemplo se habla del servicio ftp , que corresponden
| al puerto 21 de la maquina y va por el protocolo tcp.

2ş ----> Tipo de socket --> Pueden ser de estos tipos en este fichero de configuracion(con esto
quiero decir que hay más aparte de estos, pero no tienen que ver con el inet.conf).
Sockets Stream ---> Son los más usados , hacen uso del protocolo tcp.
Sockets Dgram (datagram) --> Hacen uso del protocolo UDP.
Sockets Raw --> Son los menos comunes, se suelen usar para desarrolar nuevos protocolos de comunicacion
Sockets rdm
Sockets seqpacket

3ş ---> El protocolo, puede ser uno de los que hay en /etc/protocols.
4ş wait/nowait ---> Esta parte será siempre nowait , salvo cuando el tipo de socket
es dgram, que puede tener wait si es mono hebra o nowait si es multi hebra.
5ş El usuario --> El nombre del usuario por el cual correra el proceso.
6ş Server path y argumentos ---> Aqui se indica la direccion del demonio (Internal quiere
decir que el servicio se encuentra dentro del mismo inetd).

El inetd , cuando linux está recien instalado deja algunos servicios abiertos , que no nos
sirven para nada , solo para aportar informacion a posibles atacantes por ello es conveniente
que los cerremos. Para ello nos vamos al /etc/inetd.conf y comentamos servicios como :

#:INTERNAL: Internal services
#echo stream tcp nowait root internal
#echo dgram udp wait root internal
#chargen stream tcp nowait root internal
#chargen dgram udp wait root internal
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
#daytime stream tcp nowait root internal
#daytime dgram udp wait root internal
#time stream tcp nowait root internal
#time dgram udp wait root internal
no nos sirve ninguno , por eso los tengo comentados y los de talk y ntalk , pues si lo vais a
usar lo dejais si no lo comentais tb.


Bueno , después de saber esto , la gente más "avispada" se habrá dado cuenta de que
se podría hacer una especie de "troyano" (digo la gente más avispada, ya que la gente
con más conocimientos no se habrá dado cuenta , lo sabrá ;) ) usando el /etc/services
y el /etc/inetd.conf .
Claro , si nosotros declararamos un servicio en /etc/services , y después, usamos en el
inetd.conf ese servicio y en el lugar de especificarle el demonio le espeficamos una
ruta a una shell , podremos acceder a esa shell , sin necesidad de ningún password.
Voy a explicar los pasos con ejemplos:
Nosotros tenemos una linea en el /etc/services :
ftp 21/tcp

Solo tendriamos que imitarla poniendo algún puerto que no se use , por ejemplo el 8 (Se
podría poner cualquiera que no estuviera en el services), y ademas le tenemos que dar
un nombre al servicio , no es recomendable que se le den nombres que tengan algo que ver
con el usu que le vamos a dar o puedan dar alguna pista , por ejmplo puerto_backdor o troyano xD,
tendriamos que darle un nombre, que algun novato se lo pueda tomar como un servicio mas y les
parezca algo serio como por ejmplo userd o algo como tsystem jeje , nos vamos a quedar con
tsystem, dejariamos una linea similar a esta:

tsystem 8/tcp

Después tendriamos que ir a por el inetd.conf y darle forma a una regla que nos pueda
servir para que nos cree una shell cada vez que hagamos telnet a ese puerto, sería algo
parecido a esto:

tsystem stream/tcp nowait root /bin/bash

Esto da el servicio y al hacer telnet ip 8 , nos daría acceso a una shell como root sin
necesidad de password. (Claro está que cuando hacemos una modificacion en el inetd.conf
debemos reinciar inetd para que podamos usar los cambios).
Claro que para poner estos cambios necesitas ser root y no conozco a nadie que pueda
ser tan &%$** como para hacer eso.

Ahora voy a hablar de xinetd.
------------------------------

Xinetd tiene unas funciones bastante parecidas a las de inetd y tcpd , pero se pueden
hacer muchas mas cosas, y tiene una estructura que puede resultar más "amgigable", por
lo menos para mi jeje.

El fichero de configuracion de xinetd se encuentra en /etc/xinetd.conf , y para cada
servicio existe una sección pudiendo definir en cada seccion bastantes opciones
sobre el servicio. La primera seccion de xinetd es defaults, las opciones que pongamos
en esta seccion se definen las opciones por defecto que tendran el resto de las secciones.
estructura:
defaults
{
atributos
}

Una seccion de xinetd dedicada a un servicio tiene la siguiente estrructura :

service nombre_del_servicio
{
atributos
}

Se ponen mas o menos los mismo datos , voy a seguir el mismo orden que seguiria una
linea del inetd.conf:

service ftp ## Nombre del servicio , que debe estar en /etc/services.
{
socket_type = stream ## Tipo de socket , de momento tiene una estructura muy parecida a la del inetd.conf
wait = no
server = /usr/sbin/proftpd ## El lugar donde está el daemon.
}
## Hasta aquí ha sido todo bastante parecido a la config del inetd, pero en el xinetd nosotros podemos definir opciones que para definirlas en el
## inetd , necesitariamos hacer uso del /etc/hosts.allow y /etc/host.deny. Vamos a ver algunas de ellas.
* only_from Pueden ser ips , nombre de hosts etc , es una lista con los clientes que pueden acceder al servicio.
* no_acces Los clientes que no pueden acceder al servicio.
* protocol El protocolo , que debe de estar en /etc/protocols , como en inetd.
* port El puerto que usa el servicio.
Tambien se puede especificar unas horas determinadas para ver cuando el servicio
esta activo con el comando access_times.
* instances Nos indica la cantidad de clientes del mismo tipo que pueden conectarse a la vez por ese servicio.
Y otras muchas funciones que se podrían añadir.
Vamos a poner un ejemplo :
Supongamos que queremos tener nuestro servidor ftp (usando protfpd) abierto solo por la tarde , concretamente
de 5 de la tarde a 9 de la noche(17:00-21:00) no queremos que entren a la vez mas de 5 usuarios,
y tegan solo acceso los clientes con un rango de ips entre 182.52.13.0/32 salvo el
cliente con la ip 182.52.13.9 que nos cae mal. Para representar el servicio nos quedaría una cosa así:
service ftp
{
socket_type = stream
port = 21
protocol = tcp
user = root
server = /usr/sbin/proftpd
access_times = 17:00-21:00
instances = 5
only_from = 182.52.13.0/32
no_acces = 182.52.13.9
}
Se empieza definiendo el tpo de socket, el puerto que usa el servicio y el protocolo , y despues
empiezo a poner los datos del demonio y como quiero que esté configurado.

Bueno , ya he explicado +/- el uso de inetd y xinetd.

0 comentarios: