Está en la página 1de 104

\\\\\\\\\\\\ CURSO orientación HACKER //////////////

//////////// By DarKh|s.exe ³ (n+1) \\\\\\\\\\\\\\


Lección nº28 – Good Afternoon Mr. Anderson

http://www.cursohacker.com
mailto:darkhis@alumnoz.com

índice:

1 Introducción
2 Comandos y conceptos Básicos
3 Permisos en Unix
4 Sentándose a Gusto
5 Administración Básica
6 Guarda con Skynet
7 Compilando el Kernel
8 Logs en Unix
9 Sonido
10 Grabado
11 Backups
12 Entorno chroot Básico
13 Monitorización en Tiempo Real
14 Prácticos

Disclamer: NO se asume ninguna responsabilidad debida al mal


empleo de la información aquí contenida, puesto que este texto
solamente tiene fines educativos y en ningún caso pretende incitar a
nadie a cometer ningún delito ya sea informático o de otra índole.

1º Introducción

Que tal transeúntes del universo en el cual pueden encontrarse con


las lecturas semanales?¿, espero que todos bien, disfrutando del aire
que respiran tanto como de las hormonas que segregan y encuentran
por sus dimensiones transitables.

En esta oportunidad no vengo para sacarles el chupete ni el biberón,


tampoco para contarles mis aventuras con el perro de Don Juan,
menos para recomendarles una receta afrodisíaca para conquistar a
su prima y menos que menos para demostrar que el mundo se está
por acabar.

Lo que vine a hacer es exactamente lo siguiente (y por favor no me


hagan calentar)…

Lo primero que vine a hacer: Comunicarles cuales son los comandos


súper básicos para manejarse libremente y conocer mejor el sistema.
Lo segundo que vine a hacer: Contarles de que se tratan los permisos
y grupos de usuarios para definir políticas de seguridad simples.

Lo tercero que vine a hacer: Explicarles como personalizar y tocar las


terminales y mensajes de bienvenida para estar cómodos en casa.

Lo cuarto que vine a hacer: Mostrarles como administrar los servicios


simples (como telnet), sugerirles una metodología de mantenimiento
y detallar otras configuraciones del sistema.

Lo quinto que vine a hacer: Enseñarles como configurar el sistema de


login y controlar los accesos, agregando nuestro toque de seguridad
en el sistema de archivos.

Lo sexto que vine a hacer: Describirles las posibles razones por las
cuales requerimos de una recompilación del kernel, darles un detalle
sobre las opciones que tenemos para ello y finalmente como hacerlo,
pudiendo implementarlo como una opción más a la hora del booteo.

Lo séptimo que vine a hacer: Identificarles varios logs del sistema y


analizar las posibles configuraciones a las que podemos someterlos
con el fin de conseguir reportes a medida y en donde prefiramos.

Lo octavo que vine a hacer: Detallarles como instalar y configurar su


sonido mediante herramientas que permiten manejarlo desde el shell.

Lo noveno que vine a hacer: Decirles como instalar la grabadora de


CDs/DVDs para crear discos de datos, música, mixtos y multisesión.

Lo décimo que vine a hacer: Comunicarles como y de que realizar los


respaldos del sistema en forma rápida y efectiva.

Lo undécimo que vine a hacer: Presentarles una técnica para crear un


sistema enjaulado a medida dentro del sistema real, a través del cual
podremos brindar servicios de logueos sin comprometer directamente
nuestro sistema.

Lo duodécimo que vine a hacer: Implementarles una herramienta de


espionaje para terminales a través de la cual podrán ver e intervenir
en todo lo que hagan los usuarios que se conecten al sistema, ya sea
en el real o una jaula.

Lo decimotercero que vine a hacer: Suplicarles que estudien y hagan


las prácticas que se proponen al final de la lección para que puedan
comprender y capacitarse de la forma que tengo preparada con el fin
de convertirlos en los expertos en Seguridad Informática y Hacking
que desean ser :)… vamo arribaaa, comenzó la calseeeeeee!!!.
2º Comandos y Conceptos Básicos

Como ya saben un comando es una simple palabra o incluso una letra


que se le pasa a nuestro interprete de comandos, pudiendo tener o
no argumentos, los cuales por lo general se pasan con un “-” seguido
de alguna letra/imagínense.

Los comandos son leídos cuando un caracter nueva línea es ingresado


por parte del usuario (alias “ENTER”), veamos :P…

bash-2.05b$ ls
algo.txt cursoC dpkg_1.10.20.tar.gz texto.txt

Este es un simple comando “ls” que muestra lista la los archivos que
tenemos en un directorio, en este caso el directorio home del usuario
actual. Para obtener mayor información utilizamos sus argumentos,
por ejemplo…

bash-2.05b$ ls -l
total 1545
-rw-r--r-- 1 darkhis users 54 Feb 3 2003 algo.txt
drwxr-xr-x 2 darkhis users 80 Jul 16 09:21 cursoC
-rw------- 1 darkhis users 1568803 May 6 18:21 dpk………tar.gz
-rw-r--r-- 1 darkhis users 143 May 12 10:52 texto.txt

Como ya habíamos visto en la lección anterior, obtenemos más


información con el argumento “-l” del comando ls.

El archivo “dpkg_1.10.20.tar.gz” es un archivo empaquetado, como


veremos mas adelante es algo muy común en Unix.

Los archivos o directorios que empiezan con un “.” están ocultos y no


se pueden ver con un siempre “ls”, para verlos necesitamos usar el
argumento “-a”, veámoslo…

bash-2.05b$ ls -la
total 1576
drwx--x--x 14 darkhis users 696 Jul 5 14:25 .
drwx--x--x 17 root root 424 Jul 8 15:44 ..
drwx------ 3 darkhis users 104 Apr 12 10:11 .BitchX
-rw------- 1 darkhis users 161 May 6 18:18 .ICEauthority
-rw------- 1 darkhis users 101 May 6 18:18 .Xauthority
-rw------- 1 darkhis users 1096 Jul 27 19:58 .bash_history
-rw------- 1 darkhis users 16 May 6 18:19 .esd_auth
drwx------ 4 darkhis users 128 May 6 18:46 .gconf
drwx------ 2 darkhis users 80 May 6 18:46 .gconfd
drwx------ 5 darkhis users 144 May 6 18:18 .gnome
drwxr-xr-x 2 darkhis users 176 May 6 18:18 .gnom…desktop
drwx------ 5 darkhis users 160 May 6 18:18 .gnome2
drwx------ 2 darkhis users 48 May 6 18:18 .gnome2_p…ate
-rw-r--r-- 1 darkhis users 92 May 6 18:18 .gtkrc-…nome2
drwx------ 3 darkhis users 72 May 6 18:18 .metacity
drwx------ 3 darkhis users 128 May 6 18:18 .mozilla
drwxr-xr-x 3 darkhis users 112 May 6 18:18 .nautilus
-rw------- 1 darkhis users 0 May 6 18:18 .rec…tly-used
-rw-r--r-- 1 darkhis users 3394 Apr 12 08:51 .screenrc
drwx------ 2 darkhis users 80 Jul 5 14:26 .ssh
-rw-r--r-- 1 darkhis users 54 Feb 3 2003 algo.txt
drwxr-xr-x 2 darkhis users 80 Jul 16 09:21 cursoC
-rw------- 1 darkhis users 1568803 May 6 18:21 dpkg_….tar.gz
-rw-r--r-- 1 darkhis users 143 May 12 10:52 texto.txt

Repasemos como movernos por nuestro sistema de archivos, para lo


cual debemos saber en donde estamos parados, como ya vimos antes
lo hacemos con el comando “pwd”, por ejemplo…

bash-2.05b$ pwd
/home/darkhis

Ahora para movernos usamos el comando “cd”…

cd directorio # Entramos a un directorio.


cd .. # Bajamos un directorio.
cd # Vamos al home del usuario actual.
cd ../../directorio # Bajamos 2 directorios y entramos a un
directorio que este 2 niveles mas "abajo" que el actual.
cd - # Volvemos al directorio en el que
estábamos previo a ejecutar el comando anterior.

Perfecto, cosas que ya sabían, procedamos con las instrucciones


adecuadas para crear, modificar, copiar, borrar y mover archivos.

Como estudiaron en los prácticos de la semana anterior, podemos


crear un archivo ejecutando “vi archivo”, escribiendo algo dentro de
él y grabándolo, pero hay una manera mas simple de crear un
archivo vacío para luego poder rellenar con el vi, con otro editor o
para nada. Esto lo hacemos con el comando “touch” y la sintaxis es
muy simple…

bash-2.05b$ touch archivo.txt


bash-2.05b$ ls
algo.txt archivo.txt cursoC dpkg_1.10.20.tar.gz texto.txt
bash-2.05b$ cat archivo.txt

El comando “cat” (como ya vieron), nos permite ver el contenido de


un archivo, como este se encuentra vacío no aparece nada :).

Ahora, para copiar un archivo utilizaremos el comando “cp”, pudiendo


copiar un archivo a otro archivo o un archivo a un directorio…

cp archivo1 archivo2 # Copia archivo1 a archivo2.


cp archivo /directorio # Copia un archivo a un directorio,
el cual se encuentra en la raíz del sistema (atención a la /).
cp archivo directorio # Copia el archivo al directorio que
está dentro del directorio actual.
cp archivo ../directorio # Copia el archivo a un directorio
dentro de uno mas abajo del actual.

Para crear un directorio utilizamos el comando “mkdir” de la siguiente


forma…

bash-2.05b$ mkdir directorio


bash-2.05b$ cp cursoC/ directorio/
cp: omitting directory 'cursoC/'
bash-2.05b$ cp -R cursoC/ directorio/
bash-2.05b$ cd directorio/
bash-2.05b$ ls
cursoC

Como ven creamos un directorio e intentamos copiarle el contenido


de otro pero sin suerte en el primer intento, ya que al tratarse de un
directorio debemos agregar un argumento que le avise que debe
copiar todo lo que se encuentre dentro en forma recursiva, este
argumento es “-R”… (para mayor detalle ejecuten “man cp”).

Al igual que con “copy” lo que hacemos es copiar archivos, por lo que
no desaparecen los archivos ni los directorios originales, simplemente
se copian.

Para mover archivos se utiliza el comando “mv”, el cual se maneja de


forma muy similar al comando anterior, con la diferencia de que este
si mueve en lugar de solo copiar los archivos. Para trabajar con
directorios deberán utilizar la opción “-R”.

Ahora, para borrar archivos usaremos “rm”, su sintaxis es…

bash-2.05b$ rm archivo

Esto borra el archivo sin preguntarnos nada al respecto, sin papelera


de reciclaje ni guazadas, si no están seguros y no quieren trabajar
para recuperar los datos mejor no usen este comando %).

Si lo que queremos hacer es borrar un directorio entero con todo su


contenido podemos usar el comando seguido de la ya conocida opción
“-R” de la siguiente forma…

bash-2.05b$ rm -R directorio

Para borrar directorios también podemos usar el comando “rmdir”,


aunque solo sirve para borrar directorios vacíos, ayudándonos a no
comentar errores tontos :~).
Pasemos a conocer un poco mejor el prompt. El prompt es nuestro
intérprete de comandos, en mi caso y por ahora…

bash-2.05b$

Esto (como ya les dije varias veces) es un prompt listo para recibir
comandos, podemos cambiar este prompt por algo que nosotros
queramos configurando la variable “PS1”…

bash-2.05b$ PS1=hola#
hola#
hola# PS1=bash-2.05b$
bash-2.05b$

Al cambiar nuestro prompt a hola# parece un shell de root ya que por


lo general un shell del superusuario root tiene “#” como señal de que
está listo para recibir comandos, emocionante no?¿ :P.

Como imaginarán, al igual que en Güindos y la mayoría de los SO, los


programas para GNU/Linux tienen una salida y una entrada estándar,
por lo general la salida es la pantalla/parlantes y la entrada es el
teclado/roedor pero bien podrían ser otros como una entrada de
audio y salida impresa, similar la archiconocida baticomputadora >).

También existe el error estándar que es a donde van los mensajes de


error de los distintos programas, lo cual por ahora no es importante
para nosotros.

Como ya vimos dije, pueden ver en pantalla el contenido de un


archivo con el comando “cat” y como del mismo modo que en el OS
de la mala palabra, nuestro intérprete de comandos tiene algunos
metacaracteres especiales que nos sirven para jugar con la entrada y
la salida estándar, podemos hacer algo como…

bash-2.05b$ cat archivo1 > archivo2

De este modo, en lugar de mostrar el contenido de “archivo1” en


pantalla lo redireccionará a “archivo2”. Si el archivo no existe se crea
uno nuevo, si existe y tiene contenido se borrará y se suplantará por
el contenido de “archivo1”, finalmente, si queremos que se copie el
archivo al final lo que debemos hacer es concatenar utilizando “>>”
en lugar de “>” (si, idéntico al VVirusdous).

Otros ejemplos…

bash-2.05b$ ls -l > archivo

Envía la salida de “ls –l” a “archivo”.


bash-2.05b$ cat archivo1 >> archivo2

Copiará “archivo1” al final de “archivo2”.

En cuanto a la entrada estándar sucederá lo mismo, les daré un


ejemplo con el comando “sort” que ordena alfabéticamente (este
programa es un filtro y lo veremos en la clase práctica).

bash-2.05b$ sort < archivo

Este comando ordenará las palabras (oraciones) alfabéticamente y los


mostrará en pantalla, la diferencia está en que en lugar de leer desde
el teclado, el comando sort leerá los datos desde “archivo”.

Ya veremos que por medio de tuberías podremos combinar dos o más


comandos, antes de esto conozcamos al comando “more”, el cual nos
ordena cualquier archivo/salida en páginas (si se requiere).

bash-2.05b$ more /etc/X11/xorg.conf

En este caso lo vemos por páginas, para avanzar de a una página lo


hacemos con la tecla “espacio” y para volver una página hacia atrás
oprimimos la letra “b”.

Supongamos ahora que queremos listar un directorio cuyo contenido


es demasiado largo… para ello podemos apoyarnos del comando
“more”, enganchándolo mediante una tubería “|” con el comando
“ls”… lo que?¿ :P… veamos…

bash-2.05b$ cd /var/www/htdocs/manual/
bash-2.05b$ ls -l | more

Nos muestra la salida del comando “ls” por páginas ;).

También podríamos aplicar esto al comando “sort ”…

bash-2.05b$ cd /home/darkhis
bash-2.05b$ ls | sort
algo.txt
archivo.txt
cursoC
dpkg_1.10.20.tar.gz
texto.txt

También podemos ejecutar varios comandos separándolos con “;” y


estos se realizarán en orden uno detrás del otro, por ejemplo…

bash-2.05b$ more algo.txt; ls; cd /usr/local


hola
esto es una prueba
váyanse a chingar a otro ladoooooo
<:{P
algo.txt archivo.txt cursoC dpkg_1.10.20.tar.gz texto.txt

Verificamos…

bash-2.05b$ pwd
/usr/local

Como correspondía primero se leyó el contenido de “algo.txt”, luego


listamos los archivos y finalmente nos movimos a “/usr/local”,
comprobándolo con el comando “pwd”.

En lugar de “;” el shell también nos permite usar otros operadores


para correr de a varios comandos en una línea, por ejemplo con los
operadores lógicos AND (&&) y OR (||) ejecutaremos comandos bajo
ciertas condiciones.

bash-2.05b$ comando1 && comando2

En este caso el “comando2” solo se ejecutara si el primero terminó


sin errores, es decir si devolvió un código de error == 0, en bash (al
igual que en batch) un valor de 0 significa que el comando se ejecut ó
sin errores, un valor distinto de 0 significa que hubo algún error o que
se debe contemplar algún caso particular.

Un ejemplo con OR sería…

bash-2.05b$ comando1 || comando2

En este caso “comando2” se ejecutará si falla el primero, o sea que


se ejecuta “comando1” o se ejecuta “comando2” pero nunca los 2, la
prioridad es obviamente la que establecemos nosotros al escribirlo de
izquierda a derecha.

Continuando nuestro rumbo, como ya habrán notado (o seguramente


no :P), si presionan la tecla “<Tab>” antes de finalizar de escribir una
ruta o comando podemos autocompletarla, vean…

bash-2.05b$ cd usr/lo<Tab>

Y automáticamente se convertirá en el directorio “/usr/local”, en caso


de que haya más de una concordancia se autocompletará hasta llegar
al máximo común, si le damos dos veces al <Tab> se mostrarán las
posibilidades, veamos…

bash-2.05b$ cd usr
bash-2.05b$ cd l<Tab><Tab>
lib libexec local
Y ahí podrán poner cualquiera de los directorios o agregar una tecla y
seguir autocompletando :P.

Otro ejemplo sería…

bash-2.05b$ da<Tab>
Thu Aug 5 14:05:04 UYT 2004

Como ven, el comando “date” nos dice la fecha y hora actual de


nuestro sistema. Otra utilidad gregoriana es el comando “cal”, el cual
ejecutado sin parámetros nos tira el calendario del mes y año actual…

bash-2.05b$ cal
August 2004
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

También podemos pasarle argumentos, por ejemplo el mes y año


para que nos muestre el calendario correspondiente…

bash-2.05b$ cal 4 2020


April 2020
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

bash-2.05b$ cal 10 1942


October 1492
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

El comando cal nos va a servir como comando para personalizar


cuando estemos dentro de la programación %).

Pasando a comandos relacionados con los usuarios y su entorno,


“who” nos informa cuales son los usuarios que se encuentran
actualmente logueados en el sistema, mientras que “whoami” nos
dice que usuario estamos utilizando nosotros…

bash-2.05b$ who
root tty1 Aug 5 14:01
darkhis tty2 Aug 5 14:01
bash-2.05b$ whoami
darkhis

Para detener un programa en ejecución podemos oprimir “^C” y se


retornara a la shell del usuario con el que ejecutamos el trabajo, esto
es útil cuando algún programa no responde luego de determinado
lapso de tiempo.

Para finalizar la sesión podemos usar el comando “exit” de forma tal


que si deseamos retornar tendremos que volver a introducir login y
password, el comando “logout” produce el mismo resultado.

Como alguno se estará preguntando con la cabecita ya puesta en el


sistema multiusuario y sus capacidades… si es posible comunicarnos
con otros usuarios en el sistema :), para lo cual disponemos de varios
comandos.

Es probable que cuando se inicia la sesión (sobre todo como root), un


cartel como el siguiente aparezca…

You have mail.

Esto indica de que tenemos mensajes pendientes de ser leídos en


nuestra casilla de correo, para hacerlo tecleamos “mail” y veremos de
a uno por vez empezando por el mas reciente. Pueden usar “d” para
borrar un mensaje o “ENTER” para dejarlo, viéndolo nuevamente la
próxima vez que ejecuten “mail”.

Para redactar un correo para otro usuario del sistema pueden utilizar
el comando de la siguiente forma…

bash-2.05b$ mail ramway


Subject: recatate
RAMwAY, deja de hacerte el gil con mi gata que se quema todo >).

Byez,
DarKh|s
.
EOT

Al igual que cuando utilizamos SMTP por telnet, para finalizar el


mensaje colocamos un “.” (punto) en una línea vacía.

También existe la posibilidad de enviar mensajes instantáneos a otros


usuarios que se encuentren logueados en el sistema, para ello nos
amparamos del comando “write”, el cual también ejecutará el otro
usuario para respondernos.
La sintaxis es el comando seguido del nombre de usuario con el que
deseamos comunicarnos, veamos un ejemplo…

En terminal 1…

bash-2.05b$ write jessica # El shell queda esperando a que le


escribamos el mensaje a jessica
hola! jugamos al teto hoy a las 10:00pm

Mientras tanto, en terminal 2 (donde esta conectada Jessi)…

Message from darkhis@localhost on tty1 at 15:01


hola! jugamos al teto hoy a las 10:00pm # El shell queda
esperando a que le demos un enter

Jessica contesta mi mensaje usando el mismo comando…

En terminal 2…

bash-2.05b$ write darkhis


ok, mira que jugamos con cancha embarrada!

Inmediatamente, en terminal 1…

Messagge from jessica@localhost on tty2 at 15:02


ok, mira que jugamos con cancha embarrada!

Más que inmediatamente, en terminal 1 también :P…

bash-2.05b$ write jessica


0 stress, los capeletis se comen con tuco ;)

En fin, una buena manera de comunicarnos con usuarios del sistema


utilizando Unix/GNU/Linux ;).

Terminado el tema del chusmerío entre usuarios del mismo equipo o


sistema veamos otro comando/programa interesante en lo que a
control de archivos se refiere, con nosotros el comando cuenta líneas,
palabras y caracteres de un archivo: “wc”, algo así como el Fenton
Crackshell de Unix :P.

bash-2.05b$ wc cualkiera.txt
1 5 29 cualkiera.txt

Del comando resulta que…


1 es el número de líneas del archivo
5 es el número de palabras
29 el numero de caracteres.
A “wc” le podemos pasar varios archivos como argumentos y hará el
mismo trabajo con todos, haciendo además una cuenta del total…

bash-2.05b$ wc cualkiera.txt kamasutra.txt


1 5 29 cualkiera.txt
1 1 69 kamasutra.txt
2 2 98 total

Hablando del kamasutra… por otro lado el comando “tail” nos permite
ver la última parte de un archivo (tail == cola) :P.

Por defecto el comando “tail” nos mostrara las últimas 10 líneas del
archivo pero con el argumento “-n” podremos cambiar la cantidad.
Otra opción interesante de este programa es el argumento “-f”, con el
cual hacemos que el archivo quede en el final y a medida que se
agregue nuevo contenido nos lo muestre en tiempo real, muy útil
para leer archivos de logs en los cuales se quiere saber que pasa
(errores/accesos/etc) en tiempo real.

El comando “echo” (al igual que hasta en la TK90), repite todos los
argumentos en la salida que tengamos configurada, ya sea la pantalla
(por defecto en una PC) o en un archivo si es redireccionado con los
caracteres especiales que ya vimos. Por ahora y mientras no nos
metamos en la programación Bash es de poca utilidad.

bash-2.05b$ echo Veamos otros comandos!


Veamos otros comandos!

Ok, continuando tenemos otros comandos como “df”, el cual nos tira
información del disco y sus particiones, el argumento más importante
es “-h”, que hace la salida más legible, por ejemplo…

bash-2.05b$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda5 384M 384M 748k 100% /
/dev/hda1 47M 36M 11M 75% /boot
/dev/hda2 13G 4.1G 9.3G 31% /usr
/dev/hda6 259M 161M 97M 63% /var
/dev/hda3 4.9G 2.0G 2.9G 40% /home

En algunos servidores este comando no es accesible para los usuarios


comunes ya que puede llegar a ser riesgoso según las políticas de
seguridad que se manejen, para poder hacer eso se acomodan los
permisos de ejecución (x) del binario, no lloren :).

El comando “du” indica cuanto espacio usa el directorio actual y todos


los subdirectorios que contenga este directorio. Para hacer la salida
mas legible también podremos agregar el argumento “-h”.
Si por alguna razón necesitamos información sobre nuestro equipo,
será “uname –a” (“a” de “all”) el indicado para que nos pase la data…

bash-2.05b$ uname -a
Linux darkhis 2.4.26 #3 SMP Thu May 22 23:27:50 UYT 2003 i686
unknown GNU/Linux

Vale comentar que el arranque de nuestro sistema es una gran fuente


de información, ya que entre otras cosas el kernel detecta todo el
hardware, dándonos información sobre unidades detectadas, pue rtos,
periféricos, protocolos de red, etc.

Continuando, el comando “free” nos informa de nuestra memoria


RAM y SWAP, con la opción “-m” podemos ver los valores en Mb.

Como alguno supone, otro sabe y el resto no tiene idea, el kernel es


lo más importante en un sistema operativo, por lo que en forma de
avance, le dedicaré el siguiente párrafo casado del “Kernel-Como”…

El núcleo de Unix (kernel) es quien actúa como intermediario entre


sus programas y el ordenador. En primer lugar, gestiona la memoria
de todos los programas o procesos y se asegura de que se repart an
los ciclos del procesador. Además, proporciona una interfaz portable
para que los programas hablen fácilmente con su hardware.

En verdad el núcleo hace más cosas, pero las anteriores son las más
importantes.

Aprenderemos más sobre el kernel en “Los sueños de Jessica LXIX”


así como a medida que avancemos en el curso :B.

y… Qué son los procesos?¿

Aunque ya deberían saberlo desde las semanas en las que vimos los
mismos temas en el SO casinuncamasnombrable, les repito que los
procesos son programas en ejecución, los cuales son asociados a un
número indicador de proceso. Sobre estos podremos usar varios
comandos con el fin de interactuar con el programa en ejecución, por
ejemplo para matarlo, reiniciarlo, etc.

No hay que confundirse entre lo que es un programa y un proceso,


por ejemplo “locate” es un programa, cada vez que se ejecuta se crea
un nuevo proceso, de modo que si lo ejecutamos 70 veces, se
crearán 70 procesos con identificadores diferentes.

Con el comando “ps”, seamos el usuario que seamos, podremos ver


los procesos que está ejecutando el usuario actual, mientras que tan
solo agregando el parámetro “–A” veremos todos los procesos que se
están ejecutando en el sistema.

Efectivamente esto puede ser inseguro y se debe a que “ps” lee de un


archivo en el sistema de ficheros virtual llamado “/proc” al cual todo
el mundo tiene acceso.

Veremos este sistema de ficheros con detalle en temas avanzados ya


que será importante a la hora del hacking… por ahora investiguen ;).

Mientras tanto, si algún proceso no es de su agrado pueden ayudarse


con el comando “kill” para matarlo XD. Es importante mencionar que
para matar un proceso debemos ser dueño del mismo o bien tener los
permisos necesarios para matarlo (por ejemplo siendo “root”, quien
todo lo puede), veamos un ejemplo…

bash-2.05b# ps 1054
PID TTY STAT TIME COMMAND
1054 ? Ss 0:00 sendmail: Queue runner@00:25:00
bash-2.05b# kill 1054
bash-2.05b# ps 1054
PID TTY STAT TIME COMMAND

Tenemos un proceso, luego lo mato y ya no aparece :P.

Además del comando “ps” podemos utilizar “top”, el cual como plus
nos informa de los procesos actuales, los recursos que consumen, la
memoria libre y otros datos mas en tiempo real, si le agregamos el
parámetro “-c” mostrará además la línea que compone el comando
que lanzó el proceso.

Este comando es especialmente útil cuando pensamos que algo nos


esta consumiendo toda la memoria y no sabemos que es… luego lo
matamos con la orden “kill” >).

Si por otro lado queremos realizar alguna tarea que lleva tiempo pero
no tenemos ganas de esperar a que esta termine para continuar
utilizando el shell podemos ejecutarlo en modo escondido (por atrás).

Por ejemplo, el comando “updatedb” actualiza una base de datos que


es consultada por el comando “locate”, el cual sirve justamente para
buscar archivos en el sistema.

Esta tarea debe hacerse cada cierto tiempo ya que de otra forma no
serían indexados los archivos nuevos ni desindexados los borrados.
Como imaginarán, correr el comando “updatedb” lleva tiempo, siendo
una tarea que debe programarse como root (locate podrá ejecutarse
por cualquier usuario). Veamos como hacerlo a escondidas…

bash-2.05b# updatedb &


[1] 679

Colocando un “&” al final de una línea se comienza a ejecutar el


comando y nos deja libre la terminal (el shell) para ejecutar otros, sin
la necesidad de esperar a que termine el que acabamos de lanzar.

Ahh… cada vez les gusta más ehhh?¿… bueno sigan tragando!

Qué es un archivo?¿

Ya que comúnmente se dice que en Unix todo son archivos, veamos


que es un archivo…

Un archivo e algo así como muchos bytes (8 bits) viteh… 8·).

Y como el sistema no coloca tipos de estructura ni le da significado a


lo que contengan nuestros archivos, son los programas quienes se
encargan de interpretarlos.

Qué hay en un archivo?¿

Como dije, el sistema no impone estructuras para los archivos y el


kernel no puede decirnos de que se trata ya que no lo sabe (aunque
podría decir por descarte estadístico que es pornografía, sería muy
injusto para el 1% de la población).

Entonces, para averiguar esto contamos con el programa “file” que de


acuerdo a determinados patrones nos dice ante que tipo de archivo
podríamos estar tratando.

Para los más astutos, esos que piensan que se las saben todas y no
se quedan ni con su hermanito de 5 años, aclaro que “file” no se
fijará en la extensión del archivo (ya que nada le impediría al usuario
crear un archivo “.txt” y poner una foto adentro), sino que se fija en
características que lo componen. Por ejemplo, para determinar si es
código C se buscarán palabras como “#include”, que son típicas en
un código escrito en ese lenguaje.

Otro caso sería el de un binario ejecutable, fácilmente reconocible por


su estructura interna, que a la vista de un editor aparecen caracteres
“raros”, “no pudiendo” haber sido creado con el teclado… finalmente y
entre varios casos, para los archivos encriptados dirá que estamos
ante un “archivo de datos”.
bash-2.05b$ file /etc holainmundo.c coca.txt
/etc: directory
holainmundo.c: ASCII C program text
coca.txt: JPEG image data

Y me descubrieron… ya saben que guardo las fotos en archivos “.txt”


pero por favor no se lo digan a mi chinita ;9.

Que es el inodo (nodo-i, i-node, etc…)?¿


Como saben, cada archivo tiene información como nombre, permisos,
fechas de creación, modificación, tamaño, ubicación en el disco, etc.,
la cual es almacenada en el “inodo” de cada uno, referenciado desde
el “inúmero” que contiene, que indica donde se encuentra su inodo.

Sin este número sería imposible encontrar el archivo en el disco, ya


que el nombre del mismo no proporciona información útil para el
sistema, sino que es el inodo quien la proporciona por lo cual a veces
se dice que los archivos son el inodo… yo no estoy de acuerdo <:B.

Cómo creo un link?¿

Un link se crea con el comando “ln” y tiene la siguiente sintaxis…

bash-2.05b$ ln /ruta/archivo /nueva/ruta

Lo que hacemos con esto es dar dos nombres a un mismo archivo, de


esta forma puede aparecer el mismo archivo en directorios diferentes
sin realmente estarlo… útil verdad?¿.

Sigue el cuestionario postparto… cómo empaqueto y desempaqueto?¿

En GNU/Linux disponemos de de varios formatos de compresión, los


más comunes son rar, tar, bzip2 y zip.

Para desempaquetar estos tipos de archivos más comunes usamos…

bash-2.05b$ tar xvzf archivo.tar.gz


bash-2.05b$ tar xvf archivo.tar
bash-2.05b$ unzip archivo.zip
bash-2.05b$ rar e archivo.rar
bash-2.05b$ bzip2 -d archivo.bz2

Ahora, para comprimir en los formatos más comunes usamos…

bash-2.05b$ tar cvf archivo.tar archivos_para_comprimir


bash-2.05b$ gzip -c archivo.tar # Obtenemos archivo.tar.gz
bash-2.05b$ bzip2 -c archivo
Supongo que una vez que comenzaron descubrir más comandos se
sienten cómodos utilizando el shell, conociendo el poder real que este
no esconde ;).

Para darle un poco más de profundidad y previo a cambiar el rumbo,


veamos como utilizar distintas combinaciones de teclas para agilizar
nuestra tarea diaria, pareciendo interesantes y veloces ante nuestros
amigos :P.

Para empezar ya saben que disponemos de un historial de comandos


al cual accedemos con las teclas arriba o abajo pero eso no es todo,
podemos hacer aun más…

Supongamos que en lugar de escribir “man ls” hemos escrito por


error “ls man”…

bash-2.05b$ ls man

Apretando la tecla “ESC” y luego la tecla “t” cambiamos el orden de


las palabras, quedando…

bash-2.05b$ man ls

Ya son unos genios… ahora para convert ir palabras o caracteres de


MAYÚSCULAS a minúsculas pulsamos la tecla “ESC” y luego la “l”, si
en cambio pulsamos la “u” producimos el efecto contrario, veamos…

bash-2.05b$ hola amigos

Como queremos que la palabra amigos sea en mayúsculas vamos con


el cursor hasta quedar en el primer caracter de la palabra amigos (o
sea la “a”), presionamos “ESC” (luego la soltamos :P) y presionamos
la “u”, obteniendo este resultado…

bash-2.05b$ hola AMIGOS

Por otro lado, con “ESC”+“c” cambiamos de mayúsculas a minúsculas


(o viceversa) el carácter en el que estamos posicionados y el resto de
la palabra queda automáticamente en el estado contrario.

Pasemos a otro caso…

bash-2.05b$ Hola gente como etsan

Auqi temenos un error auqne se peude leer iugal ya que la piremra y


la útlmia ltera etsan dnode dbeen etsar :P.
Para solucionar esto lo que hacemos es movernos con el cursor (por
ahora) hasta la segunda letra que queremos intercambiar y
presionamos “Ctrl” y apretamos la “t”, el resultado es…

bash-2.05b$ Hola gente como estan

Suponemos ahora que tenemos escrito algo largo…

bash-2.05b$ Hola esto es algo supuestamente largo

Con las teclas inicio y fin vamos a donde comienza a escribirse o al


final, si queremos pasar de palabra a palabra las teclas “ESC”+“f” y
“ESC”+“b” avanzan o retroceden respectivamente.

Otro comando útil para limpiar la pantalla es el comando “clear”, su


alternativa es la combinación “^l”.

…volvamos a nuestra línea supuestamente larga…

bash-2.05b$ Hola esto es algo supuestamente largo

Con la combinación de teclas “^u” borramos texto desde la posición


del cursor hasta el principio de la línea, mientras que con “^k” lo
hacemos desde la posición actual hasta el final.

Pero… el texto no ha desaparecido (no señor! XD), está justo ahí,


esperando a que lo volvamos a ver… tan solo con la combinación
“^y” que lo pega en la línea. La “y” es de yank (como en el Vi), acaso
están teniendo pesadillas?¿... >) hahwawhawahwh!!! :P.

Otro caso es cuando ejecutamos comandos complicados y deseamos


buscarlos en el historial pero no tenemos toda la tarde para estar
jugando parra arriba con el cursor, por eso y para este tipo de casos
tenemos la combinación de teclas “^r”, con lo que el shell nos queda
de transformado a la extraña forma…

(reverse-i-search)`':

De esa forma vamos escribiendo y se encuentran las coincidencias en


el historial, siént anse libres de borrar o cambiar las letras para que
aparezcan otras posibilidades más acertadas. Si no les gusta este
mecanismo disponen además del comando “history”, que despliega
en pantalla los últimos comandos introducidos en el shell.

Finalmente, les presento el comando “bind”, que amablemente nos


muestra las combinaciones de teclas especiales disponibles, ideal
para el caso en el que lo que expliqué en este punt o no les haya
servido para nada, pudiendo imprimir toooooodo lo que aparece ahí y
usarlo en el baño, reciclándolo claro esta :).

Entonces… ejecuten “bind –l”, elijan de lista de funciones la que más


les despierte curiosidad y para conocer como se realiza esa función
ejecuten “bind -q funcion”, por ejemplo…

bash-2.05b$ bind -q kill-line


kill-line can be invoked via "\C-k".

3º Permisos en Unix

Bueno alumnoz, hemos llegado al tema de los permisos, uno de los


temas de lo cuales hay que saber si o si.

En mi cuenta guardo los mails totalmente obsenos que le envío a mi


novia, al igual que los que ella me manda mí. Sin duda sería un poco
morboso pensar en que otro usuario (Unix == multiusuario, a veces
cientos o miles en un servidor muy grande o distribuido) pueda estar
leyendo esas cartas que darían lugar a una infinidad de comentarios…
y la verdá que no me interesa que sepan lo bien que ando B·).

En definitiva, exclusivamente para esto se inventaron los permisos,


pero en consecuencia cada archivo y directorio también tiene dueño y
permisos :P.

De todos modos vayan asumiendo que aun cambiando los permisos


de nuestros archivos para que nadie los pueda leer siempre existe el
superusuario “root” que puede hacer lo que se le de la gana en el
sistema, por ejemplo cambiar los permisos de tus cartas y leerlas.
Por esto, para que ni el propio Judini las pueda leer tendrán que
investigar un poco el tema de la encriptación de archivos, por suerte
Unix posee funciones criptográficas avanzadas :).

Como ya saben de infinitas lecciones anteriores, en Unix podemos


encontrarnos con tres tipos de permisos básicos para archivos, siendo
los de lectura (r), de escritura (w) y de ejecución (x).

Los conceptos de lectura y escritura los tienen más que asimilados,


no en cambio el de ejecución, que aparece como un concepto nuevo
sobre su sistema. En Unix, un programa o script no puede ejecutarse
si no tiene este permiso configurado para el usuario que corresponde
(o ninguno), de este modo nos aseguramos de ejecutar solamente
algo que realmente está diseñado o preparado para ello. Sin duda
que puede verse como una medida de seguridad aunque también
tiene su lado funcional, el cual estudiaremos cuando incursionemos
en la programación Bash.
Para ver los permisos de nuestros archivos usaremos del comando “ls
–l” que los mostrará (entre otras cosas), al principio del listado…

bash-2.05b$ ls -l
total 12
-rw-r--r-- 1 darkhis phynix 163 May 11 22:05 archivo1.txt
drwxr-xr-x 2 darkhis phynix 512 May 11 22:09 cursoC
drwx------ 2 darkhis phynix 512 Apr 16 17:47 secret

El hecho de que “archivo1.txt” tenga un “-” al inicio de sus permisos


nos indica que se trata de un archivo ordinario, la “d” nos indica que
estamos ante un directorio, por lo que como los genios pudieron
intuir a partir de su capacidad divina, el primer caracter de los 10 que
hacen referencia a los permisos nos dirá el tipo de archivo ante el
cual estamos presente.

El resto de los tipos de archivos pueden ser…

“b”, si se trata de un dispositivo de bloque, por ejemplo /dev/hda.

“c”, para un dispositivo de caracteres, como una terminal /dev/tty1.

“l”, haciendo referencia a links simbólicos, o sea los archivos que se


encuentran en otra ubicación pero que pueden ser accedidos desde la
ubicación actual.

“s”, cuando estamos ante un archivo de sockets, referenciando por lo


general a conexiones de red.

“p” cuando tenemos una tubería.

…y seguramente se deben preguntar que carajo significan los otros 9


caracteres (lo cual ya deberían saber :P), pero igual lo voy a explicar.

Los primeros tres (de los 9 que especifican permisos y no el tipo de


archivo), serán los permisos de el dueño del archivo, como ya dije los
permisos pueden ser lectura (r), escritura (w) y ejecución (x).

En el caso de archivo1.txt vemos que el dueño del archivo puede leer


y escribir en el archivo por lo que lo podrá modificar a su gusto.

Los siguientes tres caracteres especifican los mismos permisos pero


en lugar de ser para el dueño del archivo son para los usuarios que
están en el mismo grupo que el dueño. Sin restricciones, le podemos
dar distintos permisos para los usuarios del mismo grupo.
Como se podrían estar imaginando, los últimos son los permisos para
el resto de los usuarios que puedan acceder al sistema y no tienen
que ver con el dueño del archivo ni con el grupo al que pertenece.

En el tema de los directorios la cosa es un algo diferente aunque la


idea es siempre la misma, la “r” aplicada a un directorio significa que
los usuarios que tengan establecido este permiso podrán observar lo
que contiene, pero los que no lo tienen verán algo como lo siguiente…

bash-2.05b$ ls
ls: .: Permission denied

Si un directorio contiene la “w” como permiso para ustedes podrán


crear o eliminar archivos en él, mientras que con la “x” el podrán
ejecutar programas dentro de él, siempre y cuando los programas
también tengan la “x” como permiso de ejecución para Uds. :).

Por otro lado, para borrar algun archivo contenido en un directorio no


importarán los permisos que tenga, ya que si contamos con permisos
de escritura dentro para el directorio donde está, lo podremos borrar
incluso si es de otro usuario o el propio root… interesante verdad?¿.

Continuando con el tejido de nuestro destino, vamos a conocer el


comando que usaremos para cambiarle los permisos a los archivos y
directorios, el ya mencionado (aunque sin demasiadas explicaciones)
“chmod”.

Existen dos formas de especificar los permisos, una es con números


octales, la cual es muy sencilla, poco intuitiva y requiere de constante
práctica para recordar, la otra es mediante letras y símbolos, siendo
más fácil de visualizar pero que puede requerir de varias operaciones
para llegar a un permiso deseado, siendo esta la principal diferencia
con la forma octal, con la cual llegamos a un permiso de una vez.

Veamos las dos formas para que cada uno elija la que más convenga
según el caso particular en el que se vean inmersos :B.

Forma octal (en base 8) contiene solo números del 1 al 7…

Al permiso de lectura se le asigna el valor 4, al de escritura el valor 2


y al de ejecución se le asigna el valor 1…

r = 4
w = 2
x = 1

Para dar permisos de manera octal el comando chmod se utiliza de la


forma “chmod ABC fichero”.
A, B y C son números octales donde A representa el dueño, B los
usuarios del mismo grupo y C los demás usuarios.

Supongamos que queremos ponerle permiso de lectura, escritura y


ejecución a un archivo para los usuarios que pertenezcan al grupo,
para eso debemos sumar los números octales del siguiente modo…

(r)4 + (w)2 + (x)1 = 7

Y poner este 7 en lugar de la B. Si queremos dejar igual lo demás


debemos hacer el cálculo correspondiente, viendo previamente los
permisos que tenia para esos campos y colocar el número adecuado,
veamos un ejemplo práctico para dejarlo claro…

bash-2.05b$ ls -l
total 16
-rw-r--r-- 1 darkhis phynix 29 May 27 20:45 cualkiera.txt
drwxr-xr-x 2 darkhis phynix 512 May 11 22:09 cursoC
d-wxr-xr-x 2 darkhis phynix 512 May 27 20:07 prueba
drwx------ 2 darkhis phynix 512 Apr 16 17:47 secret

Deseo darle permisos de lectura, escritura y ejecución a todo el grupo


al archivo “cualkiera.txt ”, pero lo demás lo quiero dejar igual…

Ya vimos que ponerle los tres permisos se hace con el número 7


(lectura + escritura + ejecución). Ahora en el campo del dueño del
archivo ya tiene permisos de lectura y escritura por lo que para
dejarlo igual sumamos…

r(4) + w(2) = 6

Y finalmente en la parte de los demás usuarios solo hay permiso de


lectura (4), así que se deja así, por lo que nos quedarían los permisos
como queremos de la siguiente forma…

bash-2.05b$ chmod 764 cualkiera.txt


bash-2.05b$ ls -l
total 16
-rwxrw-r-- 1 darkhis phynix 29 May 27 20:45 cualkiera.txt
drwxr-xr-x 2 darkhis phynix 512 May 11 22:09 cursoC
d-wxr-xr-x 2 darkhis phynix 512 May 27 20:07 prueba
drwx------ 2 darkhis phynix 512 Apr 16 17:47 secret

kan konkenkos?¿, bueno, pasamos a la otra posibilidad que tenemos


para cambiar permisos en un sistema Unix, es decir al método de las
letritas, veamos cuales son las que utilizaremos…

u = usuario (user)
g = grupo (group)
o = otros (others)
Cambiaremos permisos de esta forma utilizando los símbolos de “+” y
“-” para agregar/quitar permisos al usuario, grupo u otros, veamos…

bash-2.05b$ chmod u+x relatos.txt


bash-2.05b$ chmod o-r hackfbi.c

Capicce?¿, espero que si porque con esto queda terminado el tema de


los permisos, como ven no es tan difícil aunque si interesante (salvo
que se convierta en su tarea diaria), e importante para trabajar con
sistemas Unix como es el caso de nuestro GNU/Linux Slackware-ch.

Pasemos a conocer más sobre los grupos y usuarios.

Los usuarios y grupos son valores numéricos que se guardan en el


archivo “/etc/passwd”, veamos una línea del mismo…

bash-2.05b$ cat /etc/passwd |grep darkhis


darkhis:x:1011:100:,,,:/home/darkhis:/bin/bash

Los campos que definen las propiedades para cada usuario están
separados por “:”, el primer campo contiene el nombre de usuario y
el segundo una “x” que esta en el lugar de donde debería ir el
password del usuario encriptado, lo cual no ocurre porque estamos
usando shadow password ;).

En versiones anteriores de Unix esto fue un gran problema de


seguridad e incluso administradores distraídos continúan cometiendo
el viejo error, expliquemos esta vieja vulnerabilidad un poco más…

El tema está en que por la arquitectura del sistema, el archivo


“/etc/passwd” debe ser accesible para todos los usuarios y si en este
archivo se encontrara la contraseña encriptada, programas que ya
conocen como el “John the Ripper” o cualquier otro crackeador de
passwords de Unix podría hacer un bruteforcing contra el archivo, así
que ya saben, si encuentran en algún sistema en lugar de una línea
como anterior algo como esto, pónganse konkenkos :)…

jessica:$1$8i.1hKwQ$pAWZTmlOyXh9C/MZtcKhG1:12636:0:99999:7:::

Usen John the Ripper contra el archivo y es probable que consigan


develar el misterio oculto ;).

Hasta hace un tiempo (ahora casi imposible), se podía entrar a los


servidores mediante ftp anónimo y llegar hasta este archivo, por lo
que el hacking era en tarea para kiddies... hay que admitir que las
velocidades de procesamiento eran otras pero que hermosos viejos
tiempos %)….
Siguiendo con la línea que puse al principio, el primer número que
vemos es el 10011, el cual identifica al usuario (a partir de ahora
UID), el segundo número es el numero de grupo (GID), los grupos
están especificados en el archivo “/etc/group”, en este caso el grupo
100 es el grupo “users”.

Con el comando “id” podemos ver estos datos del usuario actual…

bash-2.05b$ id
uid=1011(darkhis) gid=100(users) groups=100(users)

Un usuario puede estar en más de un grupo, los cuales pueden ser


especificados al momento en el que creamos su cuenta, de todos
modos tenemos acceso a cambiarlo. Veremos la forma de hacerlo en
la parte de la administración de usuarios, por ahora ya tienen
suficientes conocimientos sobre permisos, usuarios y grupos…
sigamos viaje ;).

4º Sentándose a Gusto

La verdad es que a mi no me gusta la idea de sentarme, es más, yo


no me siento en ningún lado pero eso ya es decisión de cada uno y
como se que a varios les gusta, en esta parte tocaremos distintos
puntos para que se puedan sentar mejor y en un lugar más agradable
según sus preferencias… ejem :P.

En definitiva y fuera de sus malas interpretaciones les daré un par de


pautas para que hagan de su shell algo ameno, cambiando las
configuraciones predefinidas y dejándola como la PC de Neo.

Agregando terminales

Como ya saben, en GNU/Linux disponemos por defecto de 6 consolas


virtuales, las cuales van desde “tty1” hasta “tty6”, siendo “tty7” un
espacio reservado para el entorno gráfico de escritorio X-Windows .

En nuestra labor como “ethical-hackers” (como le dice la juventú) o


administradores de sistemas (se hacen llamar los cara duras :P), nos
podemos encontrar usando las 6 terminales, obviamente por estar
realizando diferentes tareas que necesiten monitoreo simultáneo,
como sniffiear el trafico de red hasta editar archivos sin olvidarnos de
que estamos utilizando el BitchX para conseguir la carne del Viernes
traspasadas las 5 AM (nuestro Happy Hour real XD).

Cualquiera sea el caso puede pasar que no nos alcancen las que hay
y necesitemos más, precisamente si miran su teclado disponemos
también de más teclas de función que están sin utilizar, para los que
no se dieron cuenta estas serían desde F8 hasta F12 :B.
Y adivinen que chicos?¿, si!!!, vamos a agregar infinitas terminales
para acceder a ellas mediante Alt+Fx como lo hacemos con las que
ya tenemos por defecto… bueno infinitas no… solo 5 más :P.

Y entonces… cómo lo hago?¿, fácil, existe un archivo llamado “inittab”


en “/etc” que nos permite entre otras cosas hacer esto.

Este archivo describe procesos que son iniciados en el momento del


booteo del sistema, por ejemplo entradas como…

si:S:sysinit:/etc/rc.d/rc.S

…hacen que se corra el ejecutable “rc.S”, el cual es un archivo de


inicio utilizado por Slackware, pudiendo colocar ahí los ejecutables
que deseamos que se carguen al comienzo en cualquier otro lado,
simplemente agregando una entrada como la anterior.

No sean dañinos, ya pensando en sus primeras maldades?¿ :P… pues


si bien lo que piensan puede resultar interesante no es recomendable
cambiar de lugar los scripts de inicio sino toquetear por otros lares ;),
aunque si insisten pueden hacerlo creando una entrada como esa.

Continuando, la sección del archivo que nos interesa puede ser algo
parecido a esto…

# These are the standard console login ... multiuser mode:


c1:1235:respawn:/sbin/agetty 38400 tty1 linux
c2:1235:respawn:/sbin/agetty 38400 tty2 linux
c3:1235:respawn:/sbin/agetty 38400 tty3 linux
c4:1235:respawn:/sbin/agetty 38400 tty4 linux
c5:1235:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux

Creo que intuitivamente ya se deben de estar imaginando como


agregar nuevas terminales virtuales, sino tendrán problemas porque
no voy a explicarlo >)… agreguen 5 consolas editando el “initab” por
debajo de la consola numero 6.

Efectivamente no voy a explicarlo, así que no me molesten B·).

Ahora, si con las nuevas 5 terminales fresquitas no les alcanza para


divertirse por ser super-ueber-Hackers (etílicos claro está :P) y
necesitan aún más, o bien sea para los script kiddies que hacen 287
nmaps al mismo tiempo, sepan que pueden agregar más terminales
agregando más líneas como estas…

c13:12345:respawn:/sbin/agetty 38400 tty13 linux


c14:12345:respawn:/sbin/agetty 38400 tty14 linux
Las cuales se acceden mediante la combinación de teclas “AltGr+Fx”,
con F1 accedemos a la tty13, con F2 accedemos a la tty14, etc…

Interesante no?¿… los que estaban llorando por que no expliqué lo


anterior pueden ir a limpiarse y hacerse los distraídos. Otro tema…

Como cambiar mensaje que aparece antes del login

En mi caso veo el siguiente mensaje en cada terminal…

Welcome to Slackware 2.4.26 (usando el kernel bare.i).

Si bien no es un mensaje feo y durante las primeras semanas será un


objeto de orgullo, es probable que luego quieran cambiarlo por varias
razones como que son unas caprichosas :P.

Una razón mas seria sería que porque son jodidos y otra que no hay
necesidad de decirle a los usuarios que se trata de un Slackware con
determinado kernel, ya que simplifica al posible atacante la búsqueda
en la red de exploits locales para destrozar tu hermoso sistema ;).

Recuerden, como administrador es bueno dar la menor cantidad de


información a los usuarios, ya que alguno de estos VA A QUERER
romper la seguridad de tu servidor.

Estos métodos son llamados “Security Truogth Obscurity”, (Seguridad


a través de oscuridad) dado a que ocultamos o mentimos acerca de la
información para confundir al atacante, el cual si es bastante listo
podrá dar en instancias posteriores con estos datos de todos modos.

A raíz de esto es que hay administradores que piensan que este no es


un buen método de seguridad y no lo usan, personalmente estoy de
acuerdo en que no es el mejor contra verdaderos hackers pero bajará
mucho el índice de molestias por script kiddies que ejecutan exploits
que nunca funcionarán en tu sistema, pero que pueden enlentecerlo.

En los puntos siguientes veremos distintas implementaciones de esta


técnica, por ahora comenzaremos con la más básica, o sea de la que
estamos hablando.

Existe un archivo en “/etc” que contiene este mensaje, el mismo se


llama issue.net.

Antes de modificarlo puede que quieran conservar el anterior, para


ello hagan una copia del mismo… como un estándar pueden utilizar la
técnica de renombrar a “.bak” cada vez que hagan esto de modo tal
que no necesitarán recordar donde lo copiaron cuando lo busquen…
bash-2.05b$ cp /etc/issue /etc/issue.bak

Editen el archivo y colóquenle el mensaje de su preferencia, el cual


aparecerá cuando se enfrenten a una nueva pantalla de logueo.

Además (y como no podía faltar), contamos con otro archivo llamado


“issue.net”, el cual nos permite editar el mensaje de bienvenida que
le aparecerá a los clientes que establecen las conexiones por red,
como es el caso de un login remoto vía telnet.

Prueben agregar algo a este archivo y después hagan un telnet a su


propia maquina, verán los resultados ;). Seguimos con otro tema…

Cambiando el color de la terminal

Podremos cambiar el color del fondo y el color del frente de nuestras


consolas con el comando “setterm”… (como se nota que son adictos a
la vaselina :P).

Con el fondo me refiero a lo que en este momento es negro y no hay


letras, mientras que con el frente a lo que es blanco y hay caracteres.

Supongamos que queremos cambiar el frente a verde para simular


que nuestra computadora usa un antiguo monitor monocromático.

bash-2.05b$ setterm -foreground green

Y nos cambia a verde… lo cual no significa que todo lo que veamos


ahora sea verde ya que algunas aplicaciones como por ejemplo “ls”,
modifican los colores de la salida en la terminal para que tengamos
referencia de que es que, perdiendo para ese caso nuestra coloración.

Para solucionar esto podríamos ejecutar el siguiente comando…

bash-2.05b$ setterm -foreground green -store

Con lo cual evitamos que las aplicaciones cambien el color al texto


por defecto, manteniendo nuestra configuración salvo en los casos
que se utilicen colores especiales, prueben hacer nuevamente un “ls”.

Como habíamos visto en el otro SO, a cada color le corresponde un


valor numérico, el cual también podremos usar en los comandos
(además del nombre), veamos cuales son…

0 negro black
1 zul blue
2 verde green
3 marron cocorete cyan
4 rojo red
5 violeta magenta
6 amarillo yellow
7 blanco white

Antes de volver de nuevo al tiempo de War Games veamos como


cambiar el color del fondo…

bash-2.05b$ setterm -background 6

Ahora si, back to de 70s !!! … :·Y

Como habrán notado los que ya reiniciaron, los cambios que acaban
de configurar son visibles únicamente mientras utilicemos la terminal.

Para que esta sea verde de por vida tendremos que tocar algunos
archivitos y recompilar el kernel. Como por suerte para Uds.
recompilaremos el kernel en esta misma lección, podrán realizar los
cambios y pasar directamente a la compilación si así lo desean, cosa
que dudo XD, así que mejor sigan el ritmo y vuelvan cuando estén
preparados ;).

Las fuentes del kernel se encuentran en “/usr/src/linux-X-X-X”, en


donde X-X-X son los números de la versión de su kernel, en el caso
de que estén usando el bare.i deberían encontrarlas en el directorio
“/usr/src/linux-2.4.26”, mientras que los que usan huge.s lo tendrán
en “/usr/src/linux-2.6.21.5”.

Dependiendo de la versión del disco de Slackware-ch que hayan


recibido tendrán ambas o solamente las del 2.6, por lo que si están
usando el 2.4 y no lo tienen deben bajar las fuentes y practicar
desempaquetaje en donde mencione anteriormente ;).

Desde Descargas… kernel-source-2.4.26-noarch-4.tgz ~ 37 MB

Para desempaquetarlo colóquenlo en la raíz y lancen el comando que


les enseñé, no hagan ni más ni menos a no ser que tengan idea.

Una vez con las fuentes que le corresponden a cada uno veamos cual
es el archivo que debemos modificar…

En la 2.4 deben ir a “/usr/src/linux-2.4.26/drivers/char/console.c”.


Una vez editando ubiquen la función “vc_init” y dentro de esta la
variable que da el color a su frente, la cual se llama “def_color”.

Como el valor está en hexadecimal debemos sustituir la línea por


defecto de blanco a verde de la siguiente forma…

def_color = 0x07 /* white */


… por…

def_color = 0x02 /* green */

Para quienes tienen la 2.6 podrán encontrar el archivo en la ruta


“/usr/src/linux-2.6.21.5/drivers/char/vt.c” y los cambios serían en la
variable llamada “vc_def_color”, dentro de la misma función…

vc_def_color = 0x07 /* white */

… por …

vc_def_color = 0x02 /* green */

Ahora deben esperar para saber recompilar o desacatarse e ir hasta


donde explico lo del kernel, lo dejo su merced… nota: no atomicen a
los profesores con temas relacionados a su enfermedad mental por
no querer leer las cosas completas antes de saber hacerlas %).

Calculadora en la línea de comandos

A veces, además de contar chispitas invisibles, pueden encontrarse


en la terminal con la necesidad de hacer alguna cuenta. Para esto el
sistema GNU/Linux nos presta una hermosa calculadora de línea de
comandos, con la cual nos ahorraremos horas de razonamiento.

Debo aclarar que existe más de una calculadora para el shell pero la
más interesante y fácil de usar es la que vengo a presentarles: “bc”.

Con esta calculadora podremos hacer cuentas comunes y complejas,


usar paréntesis, trigonometría y logaritmos, debiendo llamarla con el
argumento “-l” para estos últimos casos.

También podremos trabajar con diferentes bases numéricas como por


ejemplo hexadecimal, octal, etc., para eso ya dentro de la calculadora
ejecutamos…

obase=16 /* hexa */
obase=8 /* octal */

Como usarla?¿, simple…

bash-2.05b$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation,
Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
9*(2+7) <Enter>
81
10^2 <Enter>
100

Para salir le dan simplement e “quit” y continuamos camino…

5º Administración Básica

El tema de la administración es muy amplio. Imaginen que manejan


un sistema de muchos usuarios con privilegios normales, de Uds.
dependerá que todo en el sistema funcione correctamente, tanto
desde el punto de vista de la instalación de programas y servicios
como de la seguridad sin dejar de lado el correcto funcionamiento de
los usuarios y los grupos.

Por ahora, el tema seguridad lo veremos de forma básica ya que en


otras lecciones será un punto exclusivo y avanzado, partiendo desde
un firewall hasta dominar las mejores herramientas de seguridad.

Antes que nada y como ya lo había comentado, recuerden que las


tareas de administración necesitan permisos del superusuario root (a
menos de que hayan realizado las configuraciones necesarias para
delegarlas). Recuerden que siendo root son el usuario con más poder
en el equipo, por esta razón el status de root en un servidor el lo más
buscado entre los hackers de Unix.

Dicho esto por enésima vez y como sabemos que el usuario root
puede romper todo :P, es recomendable no entrar como root en la
maquina sino entrar como un usuario común y subir hasta root con el
comando “su” cuando lo necesitamos.

El comando “su” sirve para transformarnos en cualquier usuario del


cual tengamos su password. Por defecto, escribiendo “su” nos pedirá
el password del “root”, pero bien se puede utilizar para tener la
identidad de otros usuarios sin ser el root, esto lo hacemos de la
forma “su usuario”, para que luego (a menos que seamos root), nos
pida el password.

Queda más que claro… les recomiendo trabajar siempre como usuario
normal y obtener los privilegios de root cuando sea absolutamente
necesario, volviendo a ser los pusilánimes de siempre con el comando
“exit” luego de terminar la tarea.

Teclado en espa~ol en el X … XD

Es probable que en el entorno grafico las teclas no estén configuradas


en espa~ol, por lo que estarán podridos de usar ese simbolito… en
caso de que su teclado funcione correctamente por favor diríjase a la
siguiente sección sin cobrar los $200 de la salida :P.
Para los que deben configurarlo editen el archivo /etc/X11/xorg.conf.

En la parte del teclado cambien (buscando estos strings) las opciones


por defecto a las siguientes…

# These are the default XKB settings for X.org


#
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "es"
Option "XkbVariant" ""
Option "XkbOptions" ""

Y listo, la próxima vez que arranque el entorno gráfico tendrá teclado


en español… Si por alguna razón del universo no es así (usando
gnome), vayan a una terminal del X y usen el centro de control para
configurarlo, pueden acceder a el mediante el siguiente comando…

bash-2.05b$ gnome-control-center

Keyboard > Layouts > Spanish (remuevan el que estaba)

Los Procesos

Como anticipaba páginas atrás, se le llama proceso a la tarea que


genera cualquier programa que esté en ejecución. Por ser GNU/Linux
un sistema multitarea contamos con muchos procesos corriendo a la
vez.

Como ya saben, para ver todos los procesos en la maquina actual


podemos usar el comando “ps –A”.

bash-2.05b$ ps -A
PID TTY TIME CMD
1 ? 00:00:04 init
2 ? 00:00:00 keventd
3 ? 00:00:00 ksoftirqd_CPU0
4 ? 00:00:00 kswapd
5 ? 00:00:00 bdflush
6 ? 00:00:01 kupdated
8 ? 00:00:00 khubd
9 ? 00:00:00 kreiserfsd
344 ? 00:00:01 syslogd
347 ? 00:00:00 klogd
349 ? 00:00:00 inetd
376 ? 00:00:00 crond
378 ? 00:00:00 atd
384 tty1 00:00:00 bash
385 tty2 00:00:00 bash
386 tty3 00:00:00 bash
387 tty4 00:00:00 bash
388 tty5 00:00:00 bash
389 tty6 00:00:00 agetty
390 tty10 00:00:00 agetty
408 tty1 00:00:00 adsl-connect
426 ? 00:00:00 pppd
427 ? 00:00:03 pppoe
496 tty2 00:00:00 startx
507 tty2 00:00:00 xinit
508 ? 00:05:58 X
520 tty2 00:00:02 gnome-session
523 tty2 00:00:00 gconfd-2
525 ? 00:00:00 esd
527 ? 00:00:00 bonobo-activati
529 ? 00:00:01 gnome-smproxy
531 ? 00:00:02 gnome-settings-
537 ? 00:00:02 xscreensaver
540 ? 00:00:15 metacity
544 ? 00:00:24 gnome-panel
546 ? 00:00:12 nautilus
547 ? 00:00:00 nautilus
548 ? 00:00:00 nautilus
549 ? 00:00:00 nautilus
550 ? 00:00:00 nautilus
551 ? 00:00:00 nautilus
552 ? 00:00:00 nautilus
554 ? 00:00:01 mixer_applet2
556 ? 00:06:31 mozilla-bin
562 ? 00:00:00 mozilla-bin
563 ? 00:00:03 mozilla-bin
564 ? 00:00:00 mozilla-bin
566 ? 00:00:03 mozilla-bin
571 ? 00:00:23 gnome-terminal
572 ? 00:00:00 gnome-pty-helpe
573 pts/1 00:00:00 bash
584 ? 00:01:19 gedit
631 tty4 00:00:01 BitchX
632 ? 00:00:00 in.identd
633 ? 00:00:00 in.identd
634 ? 00:00:00 in.identd
635 ? 00:00:00 in.identd
636 ? 00:00:00 in.identd
637 ? 00:00:00 in.identd
638 ? 00:00:00 in.identd
666 ? 00:00:00 belsebu
888 ? 00:00:00 jackpot
1418 ? 00:00:00 zheng-map
1492 ? 00:00:00 cristobalito-picaron-te-dimos-captura
1503 ? 00:00:00 nostradamus
1950 ? 00:00:00 maracanazo
15274 pts/2 00:00:00 bash
15284 pts/2 00:00:00 ps

Como también saben los números de la columna PID identifican cada


proceso y para no variar, también saben que las acciones básicas que
se toman con los procesos son de detenerlos o reiniciarlos con la
orden “kill”.
Por defecto “kill PID” termina un proceso, siempre se debe de hacer
referencia a los procesos por su número y no por su nombre, cosa
que también se podría hacer con el comando “killall”. Esto sucede
porque aunque sea un poco incomodo, prevenimos el lío que puede
generar terminar procesos que no queríamos terminar pero tenian el
mismo nombre.

Veamos un ejemplo…

bash-2.05b$ updatedb &


[1] 15289
bash-2.05b$ ps
PID TTY TIME CMD
15274 pts/2 00:00:00 bash
15289 pts/2 00:00:00 updatedb
15290 pts/2 00:00:00 ps
bash-2.05b$ killall updatedb
bash-2.05b$ ps
PID TTY TIME CMD
15274 pts/2 00:00:00 bash
15292 pts/2 00:00:00 ps
[1]+ Terminated updatedb

De esto pasemos a otro tema muy importante en la administración


del sistema, hablo de abrir o cerrar (encender y apagar) los puertos y
en consecuencia los servicios que trae incorporado el sistema.

En Slackware estos servicios se configuran desde “/etc/inetd.conf”,


veamos una parte de este archivo…

# See "man 8 inetd" for more information.


#
# If you make changes to this file, either reboot your machine
# or send the inetd a HUP signal:
# Do a "ps x" as root and look up the pid of inetd. Then do a
# "kill -HUP <pid of inetd>".
# The inetd will re-read this file whenever it gets that signal.
#
# <service_name> <sock_type> <proto> <flags> <user>
# <server_path> <args>
#
# The first 4 services are really only used for debugging
# purposes, so we comment them out since they can otherwise be
# used for some nasty denial-of-service attacks. If you need
# them, uncomment them.
# echo stream tcp nowait root internal
# echo 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
# chargen stream tcp nowait root internal
# chargen dgram udp wait root internal
# time stream tcp nowait root internal
# time dgram udp wait root internal
#
# These are standard services:
#
# File Transfer Protocol (FTP) server:
# ftp stream tcp nowait root /usr/sbin/tcpd
proftpd
#...

Como sobra la aclaración de que las líneas que empiezan con “#” son
comentarios, procedo a explicar que si queremos abrir uno de estos
servicios debemos descomentar la línea que lo contiene y reiniciar el
proceso que lo controla. Por ejemplo hagamos un telnet a nuestro
equipo…

bash-2.05b# telnet localhost


Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused

Como pueden ver haciendo un “netstat –an” el puerto está cerrado y


obviamente que el servicio inactivo. Ahora vayan al “inetd.conf” con
su editor favorito y dejen la línea del servicio telnet sin comentario al
principio…

telnet stream tcp6 nowait root /usr/sbin/telnetd telnetd -a

Como dije, para que los cambios tengan efecto debemos de reiniciar
el proceso que lo controla, en este caso es el “inetd”.

Hagan un “ps –A”, busquen el PID del proceso (en mi caso es el 349)
y reinícienlo ejecutando…

bash-2.05b# kill -HUP <PID>

Prueben nuevamente hacer un telnet a su máquina local…

bash-2.05b# telnet localhost


Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Conectado a 69.69.69.69
Windows 76 (c) - Power Calc v0.34 beta
CursoHacker Telnet Server v69.7 ready.
login:

Charán!!! ;), están cada vez más cerca de mandarse cualquiera :P…
personalmente les recomiendo no usar telnet fuera de su red local,
incluso ni siquiera en ella si llega a ser wireless u objetivo de sniffers.
Aquí tenemos dos puntos claramente importantes, el primero es que
debemos tener mucho cuidado con tener habilitados los servicios que
no estamos utilizando ya que cada uno es un agujero de seguridad
potencial y como en la vida, no es bueno tener agujeros abiertos y
accesibles sin necesidad. El segundo es que es mejor que cuando
quieran abrir algún servicio común, antes de buscar en binarios o
servicios instalados, comiencen por buscar en el “inetd.conf”.

Continuando el repaso de temas relacionados con la administración


básica en forma puntual, muchas veces nos pasará de que se tranque
algún servicio o bien deje de responder (sobre todo a nivel de usuario
en el entorno gráfico), lo cual se produce principalmente por algún
“error” que lance demasiados procesos simultáneos o bien porque los
usuarios están saturando al servidor con sus pedidos, dejándolo sin
memoria y volviéndolo casi inutilizable.

Para estos casos, si la memoria nos permite usar alguna terminal,


podremos evitar tener que esperar a que finalicen los procesos y
ejecutar un “ps –A” o “top –c” para ver cuales son los que están
repetidos y consumiendo recursos para que en caso de que se pueda,
matarlos para liberar memoria y volver todo a la normalidad :).

En linux es muy poco probable que deban reiniciar el sistema por


estos problemas o luego de configurar un nuevo servicio, incluso
podemos cambiar el hardware manteniendo el sistema activo.

Un argumento de “ps” que también podremos tener a la orden del día


para realizar la tarea investigativa previo a matar todo es “-aux”, el
cual da información más detallada de los procesos (similar a “top”),
como que usuario los ejecuta, uso de CPU, uso de memoria, etc…

Montando unidades

Como ya vimos durante la instalación, en Unix las distintas unidades


son tratadas como archivos que se encuentran en el directorio “/dev”
de nuestro sistema, lo que no vimos con precisión fue el mecanismo
que debemos utilizar para montar diferentes dispositivos, veámoslo…

El directorio “/mnt” de Slackware dispone de algunos subdirectorios


para montar unidades, como son “/mnt/cdrom”, “/mnt/floppy”, etc…

Esto no es nada especial ya que los dispositivos se pueden montar en


cualquier otro lado pero si la idea es seguir un orden, será más prolijo
montarlos ahí , ya que para eso esta hecho el directorio “/mnt” ;).

Comencemos montando una partición, por ejemplo una partición del


disco que tiene alojado su “Windows XP” o una con la colección de
“Los viajes de Emmanuele” que quieren ver desde su sistema actual.
La forma de montar una partición es la misma que si vamos a montar
otro disco duro, cambiando únicamente el nombre del dispositivo. El
comando que usaremos para montar dispositivos se llama “mount” y
se usa así…

bash-2.05b# mount /dev/hda2 /mnt/hd

Con esto montan la segunda partición del primer disco en el directorio


“/mnt/hd”, de forma tal que entrando a este directorio podrán ver
toda la información que esa partición contiene respetando el árbol de
archivos a partir de la raíz, que será ubicada en “/mnt/hd/”.

Si en cambio tenían la colección en CDROM no será un problema ya


que la única diferencia que existe será que agregaremos una
especificación con el tipo de unidad, lo cual se hace así…

bash-2.05b# mount -t iso9660 /dev/hdb /mnt/cdrom

Siguiendo la lógica, accederemos a todo el árbol de archivos del CD a


partir del directorio “/mnt/cdrom/”. Nota: Cambien el comando según
la unidad correspondiente a su CD.

Otro caso interesante se presenta cuando nos ponemos nostálgicos y


queremos bajar aquella colección de Jenny Mccarthy que tenemos en
Floppy Discs (disquets).

Para montar el disquet también habrá que valerse de los tipos, si el


mismo fue creado en GNU/Linux lo mas probable es que el sistema de
archivos sea “ext2”, en caso de ser un disco Win el tipo será “vfat”…

bash-2.05b# mount -t ext2 /dev/fd0 /mnt/floppy

… o bien …

bash-2.05b# mount -t vfat /dev/fd0 /mnt/floppy

En el caso de que estén haciendo esto porque la patrona se entero de


que tenían estas obras en el disquet, luego de copiados los datos
pueden proceder a desmontar la partición con el comando “umount
/mnt/donde_sea” y proceder a formatearlo de la siguiente forma…

bash-2.05b# umount /dev/floppy


bash-2.05b# mkfs -t ext2 /dev/fd0

Como mencioné el tipo de archivos podría ser otro, en este caso se


formatea un disquet con un sistema de archivos nativo de GNU/Linux.

Podemos saber cuales son las particiones y unidades reconocidas por


el sistema con el comando “dmesg” prestando atención a las líneas
de salida que especifica unidades. Además, pueden usar el comando
“mount” sin argumentos para obtener una lista de las unidades
montadas y mirando el archivo “/etc/fstab” verán más información de
las particiones y unidades configuradas para ser montadas al iniciar.

Finalmente veamos el caso en el que necesitamos agregar otro disco


duro al equipo, tarea muy común en entornos de trabajo grandes,
donde la información crece constantemente.

Un ejemplo es el de un servidor de páginas web para los usuarios de


nuestra escuela, en donde por el crecimiento de alumnos se necesita
tener mayor capacidad o bien por la fusión entre dos empresas,
donde el sistema puede llegar a duplicar o triplicar sus usuarios y por
ende el espacio disponible debe ser mayor.

Supongamos que tenemos un solo disco como maestro (que es el


caso inicial más común) y que queremos agregar otro disco. Primero
recuerden que…

Primario Maestro: /dev/hda


Primario Esclavo: /dev/hdb
Secundario Maestro: /dev/hdc
Secundario Esclavo: /dev/hdd

Hemos escaneado con “fdisk –l” y vimos que el nuevo disco a instalar
está en “/dev/hdb”. Para comenzar crearemos las particiones con el
ya conocido “cfdisk”, para ello escribimos…

bash-2.05b# cfdisk /dev/hdb

Terminada la creación de particiones les incorporaremos un sistema


de archivos utilizando el comando “mkfs -t ext2 /dev/hdb1”, lo cual
crea un sistema de archivos del tipo “ext2” en la primera partición del
nuevo disco.

Para verificar que todo esté bien con el sistema de archivos creado
ejecutamos el siguiente comando…

bash-2.05b# fsck /dev/hdb1

Suponiendo que todo salió como corresponde (extraño pero cada vez
más común en Uds. gurisitos perversos :P) pasamos a trabajar en el
nuevo disco, montándolo y agregándole contenido, por ejemplo…

bash-2.05b# mount /dev/hdb1 /mnt/hd


bash-2.05b# cd /mnt/hd
bash-2.05b# mkdir mp3
bash-2.05b# cp -rf /usr/local/mp3 /mnt/hd/mp3
Con esto seguro que ya nos ganamos al jefe nuevo, pero del mismo
modo seguramente quiera que el disco este montado desde el inicio
del sistema y no cada día a las 12:00, que es cuando terminamos de
tomarnos el tercer café después de llegar tarde al trabajo :P.

Para esto primero les recuerdo que cuando el sistema comienza nada
esta montado, es decir que todo se monta en el comienzo por lo que
para que sea posible habrá que tocar algún botoncito en el lugar que
el sistema tenga asignado para buscar los dispositivos a montar.

Dicho esto nada nos impedirá agregar el nuevo disco para que sea
montado al inicio del sistema… El archivo a modificar es “/etc/fstab”.

Para agregar la partición (siguiendo mi caso puntual), agregamos lo


siguiente debajo de las líneas que existan…

/dev/hdb1 /mp3 ext2 defaults 1 1

De este modo, nuestra partición se montará en cada arranque en el


directorio “mp3” que se ubica en la raíz (el cual deberá estar creado).

En este archivo podrán montar incluso particiones que estén en otro


equipo con facilidad, por ejemplo una partici ón remota mediante nfs…

quino:/home/mafalda /home/mafalda nfs defaults 0 0

Y estaríamos montando desde la computadora “quino” la partición


“/home/mafalda” en el espacio del mismo nombre en el sistema local.

Practiquen un poco y seguimos vi aje…

6º Guarda con Skynet

Qué les parece si seguimos acercándonos al tema de la seguridad y


privacidad de datos?¿… quieren hablar de los archivos críticos que
podremos utilizar para resolver misterios en nuestro sistema?¿, claro
que si ;), pues entonces vamos…

Para empezar miremos el ya conocido y codiciado en servidores


potencialmente vulnerables “/etc/passwd” :P. Como saben el mismo
contiene el mapa de todos los nombres de usuario, contraseñas, IDs
y otras madres de todos los usuarios configurados en el sistema.

Como pueden apreciar es un archivo crítico pero que igual debe tener
permisos de lectura para todo el mundo ya que el mismo es leído por
una infinidad de programas básicos.
Pero entonces, si el archivo debe ser leído por todo el mundo, cómo
nos aseguramos de que un usuario cualquiera no lo lea y se haga con
las contraseñas de todos los usuarios del sistema, incluso la del
administrador (root)?¿

Una primera aproximación obvia es utilizar criptografía con estos


preciados passwords, guardándolos utilizando una función hash, más
específicamente con la herramienta crypt (para más info: man crypt).

Como saben de las lecciones de criptografía, este método nos permite


que las contraseñas no puedan ser obtenidas a partir de su imagen
encriptada aumentando significativamente la seguridad del sistema.

Desafortunadamente para los administradores, como mencioné en mi


primera referencia al archivo, los passwords pueden ser obtenidos a
partir de un ataque por fuerza bruta (exactamente igual al que
realizaron en la semana 25 contra los de MierDoWs), el cual se lleva
a cabo comparando el hash con el de posibles passwords, llegando
tarde o temprano a uno que funcione, primera razón por la cual los
usuarios no deben elegir passwords simples (palabras cortas, de
diccionario o solo números).

Aunque es más difícil de recordar, lo conveniente es elegir passwords


sin sentido y combinaciones de letras, números y caracteres raros.

De todos modos, en sistemas actuales (como el nuestro), el archivo


de contraseñas no es “/etc/passwd” sino que “/etc/shadow”, por lo
que es ahí donde podrán encontrar las contraseñas encriptadas con la
diferencia de que solo el root puede leerlo, quedando en el archivo
“passwd” únicamente la información que los programas necesitan, a
excepción de la contraseña que es sustituida por un asterisco (*).

En conclusión, la información crítica ahora esta en “/etc/shadow” y es


accesible únicamente por el usuario root (o quien monte el disco).

Por otro lado, otro archivo crítico puede ser el “/etc/groups”, el cual
contiene información acerca de los grupos existentes en el sistema y
opcionalmente una contraseña de grupo.

Del mismo modo vovleríamos a enfrentar el mismo problema ya que


para el correcto funcionamiento del sistema este archivo debe ser
leído por todo el mundo, razón por la cual y siguiendo una línea de
sentido común (algo más difícil de lo que parece en GNU/Linux), los
sistemas actuales tienen los passwords en “/etc/gshadow”, que solo
el root podrá leer.

La forma de este archivo con información del grupo es la siguiente…


nombredelgrupo:password:gid:usuario1,usuario2,usuarioN

El password esta encriptado, gid es el numero que identifica al grupo


(en Unix tanto usuarios, archivos y etc son vistos por el sistema como
números y no como nombres), finalmente y como no necesitaría
aclaración, usuario1,… son los usuarios que pertenecen al grupo.

Continuando con el tema de control de usuarios y configuraciones


relativas a los accesos pasemos a conocer la configuración de login.

Para referirnos a este tema debemos dirigirnos directamente al


archivo “/etc/login.defs”, el cual contiene las opciones que se aplican
cuando un usuario se enfrenta al sistema. Nota: Todo esto es posible
gracias al paquete shadow incluido actualmente en todas las distros.

Recorramos entonces algunas las opciones más interesantes de este


archivo. Último aviso: Las líneas que inician con “#” son comentarios
y no son tenidas en cuenta.

Por lo general, las opciones de este archivo de configuración son


booleanas (de yes o no), no obstante tenemos otras posibilidades en
donde usaremos la forma “OPCION /ruta/a/archivo” con la finalidad
de especificar, por ejemplo, un archivo de log. Comencemos…

FAIL_DELAY
Si prestan atención, cada vez que ustedes ponen mal el nombre de
usuario o password el sistema espera algunos segundos antes de
volver a solicitar el login (por defecto 3), con esta directiva podremos
cambiar dicho tiempo a nuestro gusto (en segundos).

DIALUPS_CHECK_ENAB
Si bien no es muy conocido esto puede resultar útil, se trata del uso
de contraseñas de marcación para el acceso remoto al sistema. Para
hacerlo más sencillo digamos que agregamos un password aparte del
que ya tienen el usuario. Para el correcto funcionamiento de esto
debemos crear (o editar si ya existe) el archivo “/etc/dialups”, el cual
contiene un tty por línea. Si existe un tty en este archivo significa que
cuando un usuario se conecte se harán comprobaciones de este tipo.
El siguiente archivo que se utiliza para esto es “/etc/d_passwd”, que
contiene la ruta completa a un shell al que irá el usuario seguido de
un password. Tanto el shell como el password estarán encriptados
con “crypt”, este archivo se obtiene con el comando dpasswd, para
dejarlo claro veamos un ejemplo…

Primero haremos un telnet normal desde otro equipo ubicado en


cualquier parte del mundo como por ejemplo Vladivostok…

Freenet> telnet 200.125.36.152


Trying 200.125.36.152...
Connected to 200.125.36.152.
Escape character is '^]'.
Hola chiche!

darkstar login: darkhis


Password:
Linux 2.4.26.
Last login: Mon Mar 5 12:11:07 -0300 2007 on pts/2 from 6.9.6.9.
No mail.

Kinkler's First Law:


Responsibility always exceeds authority.

Kinkler's Second Law:


All the easy problems have been solved.

darkhis@darkstar:~$ w
12:48:55 up 1:28, 6 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 11:21 2:02 0.07s 0.06s -bash
darkhis pts/1 gampr...et.am 12:48 0.00s 0.02s 0.01s w
darkhis@darkstar:~$ exit
Connection to 200.125.36.152 closed by foreign host.
Freenet>

Como pueden apreciar mi conexión cae en “pts/1” por lo que siendo


root creamos/agregamos en el archivo “/etc/dialups ” la línea “pts/1”.

Hecho esto procedemos a configurar un shell y un password a todos


los usuarios que provengan de este tty…

bash-2.05b# dpasswd
Usage: dpasswd [-(a|d)] shell # Nos tira la ayuda.
bash-2.05b# dpasswd -a /bin/bash
Shell password: # hola_don_pepito
re-enter Shell password: # hola_don_jose_:P

Y hacemos nuevamente el telne t desde la maquina remota…

Freenet> telnet 200.125.36.152


Trying 200.125.36.152...
Connected to 200.125.36.152.
Escape character is '^]'.
Hola chiche!

darkstar login: darkhis


Password:
Dialup Password: # Escribimos el password que seteamos.
Linux 2.4.26.
Last login: Mon Mar 5 12:58:12 -0300 2007 on pts/4 from ga...am.
No mail.

Wasn't there something about a PASCAL programmer


knowing the value of everything and the Wirth of nothing?

darkhis@darkstar:~$

Excelente… no les funciona?¿, por favor agreguen el salto de línea al


final de “pts/1” en el archivo “/etc/dialups ”… gracias B·).

FAILLOG_ENAB
Hace que las entradas de login fallidos se loguen en “/var/log/faillog”,
intenten leerlo… les diré como leerlo más adelante :P.

LOG_UNKFAIL_ENAB
Guardamos los intentos de login con usuarios inexistentes, los cuales
provienen generalmente de ataques de brute forcing.

LOG_OK_LOGINS
Guardamos un log con los login que se completan correctamente.

LASTLOG_ENAB
Le muestra al usuario cuando fue la última vez que entró al sistema.

MAIL_CHECK_ENAB
Configura el chequeo de correos del usuario en modo automático.

OBSCURE_CHECKS_ENAB
Activa chequeos adicionales en cambios de passwords.

PORTTIME_CHECKS_ENAB
Activa los filtros de login según el momentoen el que el usuario
ingresa al sistema, con esto podremos controlar el acceso por días y
horas, usando el archivo “/etc/porttime”.

Veamos que el archivo “/etc/porttime” esta separado por el carácter


“:” en tres campos.

En el primero indicamos separando con “,” los ttys en los que tendrá
efecto esta regla de tiempo, el caracter “*” indicaría que todos los tty
serán afectados.

En el segundo campo indicamos separados por “,” una lista con todos
los usuarios para los que queremos hacer válida esta regla, también
pueden usar un asterisco para extenderla a todos.

En el tercer campo se encuentran los tiempos en los cuales el acceso


es válido.

Primero va uno o más días de la semana los cuales son…

Su Domingo
Mo Lunes
Tu Martes
We Miercoles
Th Jueves
Fr Viernes
Sa Sábado
Wk De lunes a viernes
Al Todos los días

Si no se especifica el día se asume que será todos los días.

Veamos entonces una entrada de ejemplo en “/etc/porttime” que le


permite a jessica y a jossline entrar desde cualquier tty de Lunes a
Viernes de 00:30 a 06:30 horas (su jornal :P)…

*:jessica,josseline:Wk0030-0630

Simple y lineal verdad?¿, sigamos…

QUOTAS_ENAB
Permite configurar un límite al campo GECOS de cada usuario, dicho
campo contiene información como el nombre de usuario, el directorio
en donde iniciara sesión, etc…

SYSLOG_SU_ENAB
Esta directiva nos pemite guardar un registro de la actividad que se
lleve a cabo cuando un usuario utiliza el comando “su”.

SYSLOG_SG_ENAB
Análogo al “su”, este comando permite cambiarnos a otro grupo, las
dos configuraciones permiten que los eventos de este comando se
guarden en el syslog además de en su propio archivo “sulog”. El
“syslog” lo desmenúzaremos en otro momento (Y).

CONSOLE
Definimos desde que terminales puede acceder el root, como la
mayoría de las directivas esta puede ser configurada directamente en
este archivo o bien en uno aparte, por defecto viene en uno aparte y
la mejor opción (que viene por defecto) es será la siguiente…

CONSOLE /etc/securetty

En donde el archivo “/etc/securetty” contiene una lista con las ttys


seguras para el acceso como root, por defecto solo las primeras 6
terminales (tty1-tty6) están habilitadas para el acceso como root,
noten que estas consolas están en la propia máquina… ahora ven por
qué no podían acceder como root por telnet?¿ ;).
SULOG_FILE
Si activamos esta directiva, toda la actividad llevada a cabo mediante
el uso del comando “su” será guarda en el archivo especificado, por
defecto es “/var/log/sulog”.

MOTD_FILE
Esta opción está, por lo general, seguida de un archivo en donde se
muestra el mensaje del día, el mismo está escrito en “/etc/motd”,
edítenlo y sorprendan a sus admiradores :P.

ISSUE_FILE
Despliega el mensaje que configuremos previo a solicitarle al usuario
sus credenciales, el mensaje se sitúa en el archivo especificado por
esta opción, por defecto es “/etc/issue ”.

TTYTYPE_FILE
Con esta opción podremos configurar el tipo de terminal a la que
accederemos una vez nos encontremos logueados en el sistema. Las
opciones se especifican en el archivo “/etc/ttytype”, por ejemplo…

vt100 tty1

FTMP_FILE
Si están activos, guardará los intentos fallidos de login en el formato
UTMP, el cual conoceremos cuando veamos los logs de sistema.

NOLOGINS_FILE
Esta opción va seguida del valor “/etc/nologin” de modo tal que si el
archivo existe el sistema solo dejará entrar al usuario root dado a que
por ejemplo el servidor está en reparación, mostrándole a los demás
usuarios el mensaje que se encuentre en dicho archivo. Muy útil para
cuando queremos poner en penitencia a todos :P.

SU_NAME
Esta opción permite colocar “su” como argumento de forma tal que
cuando usemos el comando “ps” para ver los procesos veremos “su”
si alguien está trabajando bajo este comando. Si en cambio la opción
no esta activada el comando “ps” mostrará que un usuario está
utilizando un shell pero no hará referencia a que se convirtió a otro
usuario.

MAIL_DIR
Esta opción tiene que estar obligatoriamente activada y determina el
directorio en donde se encuentran los correos que son chequeados en
el inicio de sesión de cada usuario, usualmente en “/var/spool/mail”.

ENV_SUPATH
Path por defecto cuando un usuario está usando “su” (el path es lo
mismo que en el SO Wringous). Esta configuración es obligatoria.
ENV_PATH
Lo mismo que lo anterior pero sin estar dentro del su, o sea para
todos los usuarios. Esta configuración también es obligatoria.

ERASECHAR
Especifica caracter de borrado en las terminales, como saben los
teclados disponen de la tecla “Del” o “Supr” y esta es a la que
hacemos referencia, ya que a diferencia de backspace que borra lo
que esta a la izquierda del cursor, esta borra el caracter que esta
encima del cursor. El valor octal de la tecla delete es 177 por lo tanto
el argumento correcto para esta opción es 0177. Recuerden que el 0
indica octal y 0x indica hexadecimal.

KILLCHAR
Caracter para terminar la ejecución de un programa inmediatamente,
“^C” es 025 en octal.

PASS_MAX_DAYS
Establece un número de días para que los passwords de los usuarios
deban ser actualizados, pasado el día los passwords serán inválidos.

PASS_MIN_DAYS
Controla el número mínimo de días que deben transcurrir entre
cambios en contraseñas, si está en 0 las contraseñas pueden ser
cambiadas hasta un millón de veces por día =:-}.

PASS_MIN_LEN
Número mínimo de caracteres que deberán contener los passwords.

PASS_WARN_AGE
Cantidad de días en los que se le avisará al usuario previo a que su
contraseña expire, enviándole un mensaje de advertencia.

SU_WHEEL_ONLY
Si esta en “yes” solo los usuarios en el grupo root (gid = 0) podrán
utilizar el comando su a usuarios de este grupo (incluyendo el root).

UID_MIN
Cuando se agrega un usuario con useradd el userid tendrá este valor
mínimo, muy útil para administrar nuestros usuarios correlativamente
según a que sector pertenezcan.

UID_MAX
Valor máximo para los userid de los usuarios que creemos mientras la
configuración se encuentre activa.

GID_MIN
Lo mismo pero para los grupos (gid).
GID_MAX
Adivinen :B.

LOGIN_RETRIES
Número máximo de intentos para colocar bien sus credenciales al
inicio de sesión previo a ser sacado a patadas del sistema.

LOGIN_TIMEOUT
Tiempo de espera máximo en segundos para que el usuario coloque
su información de inicio de sesión, pasado el tiempo el intento de
login se cancela.

PASS_CHANGE_TRIES
Número máximo de int entos que tiene el usuario para cambiar su
password cuando el sistema se lo rechaza por ser muy fácil.

PASS_ALWAYS_WARN
Activado esta opción haremos que cuando el password es muy fácil
aparezca una advertencia pero que lo admita de igual modo.

CHFN_AUTH
Con esta opción activada el sistema nos pedirá nuestro password al
querer cambiar nuestra información personal (campo gecos).

CHFN_RESTRICT
Datos del campo geocs que el usuario normal podrá cambiar, usando
las siguientes combinaciones de letras…

f Nombre completo.
r Número de la oficina.
w Número del trabajo.
h Número de su casa.

Por ejemplo…

CHFN_RESTRICT frwh

MD5_CRYPT_ENAB
Hace que las contraseñas sean encriptados con md5 en lugar de crypt
(si es que está soportado).

CONSOLE_GROUPS
Grupos a los que pertenecerán automáticamente todos los usuarios
creados que se puedan loguear, veamos un ejemplo…

CONSOLE_GROUPS floppy:audio:video:cdrom

Entonces, siendo un usuario logueado, en el shell consulto…

bash-2.05b$ id
uid=1000(darkhis)gid=100(users)
groups=100(users),11(floppy),17(audio),18(video),19(cdrom)

Como ven. aparte del grupo “users” que fue especificado al momento
de crear mi usuario, también pertenezco a los anotados en el archivo.

DEFAULT_HOME
Esta opción permite el login para los usuarios que no tiene n un home
directory definido en “/etc/passwd”, lo cual puede ser o no un agujero
de seguridad, sobre todo si no sabemos porque lo vamos a activar :).

NO_PASSWORD_CONSOLE
Define las consolas en las cuales no será necesario usar un password
para entrar como usuarios diferentes al root, las consolas se definirán
de la forma “tty1:tty2…”. También mucho cuidado!.

GETPASS_ASTERISKS
Si extrañan su estúpido login de Mierdows en el que los caracteres de
su password se ven como asteriscos mientras realizan la mariconeada
de loguearse, prueben colocarle un 1 como argumento a esta opción
y dejen de llorar :P.

Terminada esta etapa muy entretenida pese a la densidad de datos,


pasemos a ver como tener mayor control sobre los accesos.

Para ello comenzaremos con el archivo “logins.access” que permite


controlar quien entra y quien no entra en nuestro sistema basándose
en nombres de usuario, hosts para conexiones remotas y ttys para
conexiones locales.

Siempre que alguien intenta loguearse, este archivo es leído en busca


de posibles entradas que concuerden con el caso en función de tomar
las medidas que correspondan según las opciones configuradas.

La forma de cada entrada es la siguiente…

permiso : usuarios : origen

En el campo permiso simplemente ira un símbolo de sumar(+) o uno


de restar(-) dependiendo si se tiene o no acceso.

En el segundo campo especificamos usuarios y grupos (separados por


espacio), pudiendo incluir la clave “ALL” para permitirlos a todos.

En el tercer campo escribimos el origen de la sesión, si se trata de un


usuario local podemos especificar una lista de ttys desde las cuales el
usuario tendrá o no permitido el acceso. Si se trata de un usuario
proveniente desde el exterior podremos incluir una lista de dominios,
host, subdominios, direcciones IP, etc. La clave “ALL” también se
puede utilizar en este campo, mientras que “LOCAL” permitirá a
cualquier origen que no contenga el caracter “.” en su resolución. La
palabra clave “EXCEPT” permite excluir algo dentro de lo que se ha
contemplado, por ejemplo…

-:ALL EXCEPT jessica:tty1

Acá le denegamos el acceso a todos los usuarios provenientes de tty1


EXCEPTo a jessica, que por ser irresistible siempre le damos paso ;).

Continuando con el control de accesos veamos dos archivos que son


leídos cuando un usuario intenta entrar a algunos de los servicios
especificados en el inetd (recuerdan hojas atrás el inetd.conf?¿).

Hablo de “hosts.allow” y “hosts.deny” ubicados en el directorio “/etc”.

En “hosts.allow” están especificadas las reglas para los hosts que


tendrán acceso a determinados servicios mientras que “hosts.deny”
contiene a los hosts que NO tienen acceso a ellos.

Un ejemplo de regla en hosts.allow sería…

ALL: 64.246.22.103

La cual permite acceso desde esa IP para TODOS los servicios que
brindamos, ahora si queremos desde esa IP solo entren a telnet…

telnetd: 64.246.22.103

…y si queremos que todo el mundo entre al ftp?¿

ftpd: ALL

Creo que quedo bastante claro, ahora en el archivo hosts.deny se


hace lo mismo con hosts que no queremos que tengan acceso a
determinados servicios o a todos, por ejemplo…

ALL: 64.215.171.78 # Disculpen muchachos, nada personal.

Otro archivo de uso común, mayormente relacionado a ganar acceso


a hosts que no estarían bien publicados o distribuidos es “/etc/hosts”,
el cual tiene la misma funcion que el que tienen en VVindovz… y si
bien no está estricamente relacionado con la seguridad del sistema
en algún lado había que ponerlo :).

Como saben este archivo asocia direcciones IP con nombres de hosts,


para refrescarnos veamos una línea válida…
1.1.1.1 host.eluno

bash-2.05b$ ping -c 1 host.eluno


PING host.eluno (1.1.1.1) 56(84) bytes of data.
64 bytes from host.eluno (1.1.1.1): icmp_seq=1 ttl=64 time=1 ms

--- host.jessica ping statistics ---


1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1/1/1/0.000 ms

Como pueden ver el nombre es aceptado gracias a la tabla de hosts,


si lo hacen previo a realizar este cambio tendrán un error como este…

bash-2.05b$ ping host.eluno


ping: unknown host host.eluno

Sin pausa pero sin prisa, continuamos nuestro avance comprendiendo


el funcionamiento de la seguridad tanto en los archivos como en el
sistema de archivos.

Como vieron durante en la instalación, GNU/Linux puede correr bajo


varios sistemas de archivos como por ejemplo ext2, etx3 y ReiserFS.

Actualmente y en general se utiliza ext 2 aunque ext3 es mejor en


temas relacionados con la estabilidad y opciones, siendo ext2 un viejo
estándar muy probado y funcional de Unix.

Entrando en detalles, ext2 (al igual que ext3), nos permite activar
permisos de lectura, escritura, ejecución, suid, gid, dueño y grupo de
los archivos entre otras cositas más.

Para cambiar estos valores hemos conocido la herramienta “chmod”,


“chgrp”, “chown” y “chgrp”, que nos premitieron cambiar permisos de
usuario, de grupo, due ño y grupo respectivamente.

Pues para continuar saciadno sus ansias de conocmiento (lease “el


mono”, “estoy que me estudio”, “la fizura”, etc…), traigo el comando
“stat”, el cual nos da información muy intersante sobre determinado
archivo, veamos un ejemplo…

bash-2.05b$ stat relatos.txt


File: `relatos.txt'
Size: 36495 Blocks: 72 IO Block: 4096 regular file
Device: 301h/769d Inode: 6437228 Links: 1
Access: (0644/-rw-r--r--) Uid: (1000/ dark) Gid: (100/ users)
Access: 2005-03-28 16:38:52.000000000 -0300
Modify: 2005-03-18 15:51:29.000000000 -0300
Change: 2005-03-18 15:51:29.000000000 -0300

Pueden cambiar el formato de la salida con estos argumentos…


bash-2.05b$ stat --format=%LETRA archivo

En donde lo que importa es cada letra, conozcamos las disponibles…

%A Permisos del archivo especificados igualito que en “ls”.

%a Permisos del archivo en octal.

%B Cantidad de bytes en cada bloque que usa el archivo.

%b Número de bloques.

%D Número de dispositivo en hexadecimal.

%d Número de dispositivo en decimal.

%F Tipo de archivo, regular file, simbolic link, etc.

%f Modo raw en hexa.

%G Nombre del grupo al cual pertenece el archivo.

%g Número del grupo GID.

%h Número de enlaces.

%i Número de nodo-i.

%N Nombre del archivo entre comillas simples, si el archivo


es un link simbólico muestra a donde apunta.

%n Nombre del archivo.

%o Bloque de entrada/salida.

%s Tamaño en bytes.

%T Tipo de dispositivo menor en hexa.

%t Tipo de dispositivo mayor en hexa.

%U Nombre de usuario del dueño.

%u ID del dueño (UID).

%X Tiempo en segundos del último acceso al archivo desde


“Época”, la “Época” cuenta desde las 00:00 Hs. del 1º de
Enero de 1970 y refiera a la creación del primer Unix.
%x Tiempo desde el último acceso.

%Y Marca la última modificación del nombre desde la “Época”


en segundos.

%y Tiempo en segundos de la última modificación.

%Z Tiempo en segundos desde el último cambio interno


desde la “Época”.

%z Tiempo en segundos desde el último cambio.

Practiquen un rato y seguimos…

Listo?¿, ahora veamos que el mismo comando también nos sirve para
analizar sistemas de archivos, usándolo de la siguiente forma…

bash-2.05b$ stat --filesystem --format=%LETRA /rut/a/sist/d/arch

Por ejemplo…

bash-2.05b# stat --filesystem --format=%T /dev/hda1


ext2/ext3

Veamos las opciones que tenemos para el sistema de archivos…

%a Número de bloques disponibles que no son para el root.

%b Total de bloques en el sistema de archivos.

%c Total de nodos en el sistema de archivos.

%d Nodos libres en el sistema de archivos.

%f Bloques libres en el sistema de archivos.

%i ID del sistema de archivos en hexa.

%l Número máximo de caracteres que pude tener un archivo


en este sistema de archivos.

%n Nombre del archivo que contiene el sistema de archivos.

%s Tamaño optimo de bloques de transferencia.

%T Tipo de sistema de archivo.

%t Tipo de sistema de archivo en hexadecimal.


Recuerden que para la creación y correcto funcionamiento del sistema
de archivos siempre utilizaremos herramientas como “cfdisk” (vista
en el momento de la instalación de GNU/Linux Slackware-ch).

Por otro lado, para formatear recurriremos a “mkfs”, ya sea para una
partición de disco o un disquet.

Finalmente, utilizaremos el comando “fsck” para chequear y arreglar


problemas en el sistema de archivos.

Dicho esto, cuando estemos instalando un servidor es recomendable


tener una buena política en la organización del sistema de archivos,
lo cual en un PC puede carecer de importancia debido a que solo
nosotros y tal vez alguna otra persona de nuestra casa lo utilice , cosa
que en servidores o estaciones de trabajo cambia y mucho, why?¿…

Primero por que los directorios en donde los usuarios almacenan su


pornografía pueden crecer indefinidamente hasta dejar inoperativo el
sistema. Una partición raíz (/) llena dejaría durmiendo afuera hasta al
propio root.

Por esta razón es que el directorio del usuario root se encuentra en


“/root” y el directorio personal de cada usuario esta en el directorio
“/home/usuario”.

Una buena política de seguridad será colocar el directorio “/home”


fuera de la raíz del sistema, de este modo el único usuario que tendrá
sus archivos en la raíz es el del administrador, o sea moi ;*.

Para los que no les cae la ficha, hablamos de que se debe colocar el
directorio “/home” en una partición separada de la raíz o incluso en
otro disco duro si esto es posible, cuanto más lejos… mejor!!!! >).

De este modo, cuando la partición en donde se encuentra “/home” se


llene (cosa que pasará), los usuarios no podrán acceder al sistema ni
cargar mas datos, mientras que el administrador si podrá entrar y ver
que paso para solucionar (borrar) el problema :P.

Otro directorio en el que los usuarios vuelcan su contenido es “/tmp”,


el cual contiene los archivos temporales tanto de programas como de
usuarios de todo el maldito sistema.

Por esto, como segunda medida al armar su jerarquía de directorios


deberán poner a “/tmp” en otra partición aparte, la cual puede ser la
misma en la que se encuentra el directorio “/home”, aunque lo mejor
será colocarlo en otra así podemos diferenciar sin averiguaciones la
causa de las cuotas de espacio excedidas.
Otro lugar de continuo crecimiento en nuestro sistema es el directorio
“/var”, el cual contiene la cola en donde se encuentran los correos
electrónicos de todos los usuarios, todos los trabajos que están
esperando en la cola de impresión y como si fuera poco los logs del
sistema incluyendo los eventos, servicios y pavadas que crecen y
crecen mucho.

Estos mails, logs, etc., son otro factor de riesgo para la cuota libre en
el disco por lo que también es recomendable tener “/var” en una
partición separada.

Podríamos seguir separando cosas pero la verdad es que con esto


estaremos bastante cubiertos para empezar con el pie derecho. La
jerarquía del sistema de archivos es algo que varía en cada uno y la
experiencia (como siempre), será su mejor profesora. Vale aclarar
que si no manejan servidores no es necesario que realicen todo esto.

Volviendo a los permisos, además de los permisos “normales” que


cada usuario puede dar a sus archivos hay otros permisos especiales,
los cuales se suministran mediante los bits “suid”, “sgid” y “sticky”.

El bit suid se puede activar añadiéndole un 4000 a la representación


octal de un archivo, es decir que en lugar de tener 3 cifras el permiso
tendrá 4.

Para que este bit quede activado además del 4000 el propietario de
archivo debe de tener permisos de ejecución, de esta forma la “x”
perteneciente a los permisos de usuario será cambiada por una “s”.

La propiedad del bit suid es de que cuando otro usua rio ejecute el
archivo este será ejecutado con los permisos del usuario quien lo
creo, el caso mas común son los ficheros suid creados por el root que
cuando un usuario normal lo ejecuta, tendrá los privilegios de root
(en el programa) mientras este se encuentre activo.

El ejemplo más clásico de esto es el del comando passwd…

bash-2.05b# whereis passwd


passwd: /usr/bin/passwd /etc/passwd /usr/man/man1/passwd.1.gz
/usr/man/man5/passwd.5.gz /usr/share/man/man1/passwd.1.gz
/usr/share/man/man5/passwd.5.gz
bash-2.05b# ls -l /usr/bin | grep passwd
-rwxr-xr-x 1 root bin 9124 2004-03-30 02:42 afppasswd
-rwxr-xr-x 1 root bin 284 2004-05-11 03:58 autopasswd
-rws--x--x 1 root bin 34616 2004-06-21 16:20 gpasswd
-rwxr-xr-x 1 root bin 34972 2004-06-01 17:54 htpasswd
-rwsr-xr-x 1 lp sys 8532 2003-12-15 18:23 lppasswd
-rwxr-xr-x 1 root bin 5281 2004-05-11 03:58 mkpasswd
-rws--x--x 1 root bin 37880 2004-06-21 16:20 passwd
-rwxr-xr-x 1 root bin 1253460 2004-05-11 02:32 smbpasswd
-rwxr-xr-x 1 root bin 16584 2004-05-11 03:58 tkpasswd
lrwxrwxrwx 1 root root 8 2004-11-22 08:14 ypchfn -> yppasswd
lrwxrwxrwx 1 root root 8 2004-11-22 08:14 ypchsh -> yppasswd
-rwxr-xr-x 1 root bin 16496 2004-06-05 21:47 yppasswd

El programa “passwd” es el que se utilizan para cambiar una clave de


acceso al sistema, el cual por motivos obvios va a necesitar estos
permisos, de otra forma los usuarios normales no podrían realizar el
cambio.

Lo que el programa hace en si es darnos una interfase en la línea de


comandos para cambiar nuestro password mientras que internamente
no hace más que modificar el archivo “/etc/shadow”, al cual nosotros
no tenemos acceso.

Este archivo no puede ser modificado por usuarios sin privilegios por
lo que el bit suid activado eleva los privilegios de un usuario hasta los
del administrador permitiéndole cambiar su clave correctamente.

Existen muchos programas más como este en el sistema (ya vamos a


ver como encontrarlos), lo cual bajo determinadas condiciones puede
generar a un escenario de mucha inseguridad, por ejemplo cuando no
estén actualizados. Imaginen a un usuario malintencionado que logra
cambiar el flujo del programa y ejecutar código en ensamblador con
las instrucciones para que se ejecute un shell en el sistema… podría
obtener acceso total de root!!, lo cual se previene (en una parte),
actualizando cuando un error (bug) como este se detecta/publica.

Veremos todo esto y mucho más cuando estudiemos las diferentes


maneras de explotar el código a nuestro beneficio, por ahora somos
unas simples sardinas.

Concluyendo, para que un archivo tenga el suid activado debemos


ejecutar, por ejemplo, el siguiente comando…

bash-2.05b$ chmod 4000 cualkiera


bash-2.05b$ ls -l | grep cualkiera
---S------ 1 darkhis users 0 2005-03-29 18:24 cualkiera

Si el dueño no tiene permisos de ejecución aparecerá una “S” en


lugar de una “s”, demostrando que el bit suid está activado pero no
tiene efecto, para que tenga efecto debemos agregar, por ejemplo…

bash-2.05b$ chmod 4777 cualkiera


bash-2.05b$ ls -l | grep cualkiera
-rwsrwxrwx 1 darkhis users 0 2005-03-29 18:24 cualkiera
Siguiendo, el bit “sgid” tiene las mismas propiedades que las del bit
suid pero se aplica a nivel de grupo, es decir que el usuario estará
ejecutando determinado programa con los permisos del grupo.

Para activar el bi t sgid agregamos 2000 a los permisos del archivo.

Terminando, el bit “sticky” (también llamado bit de permanencia),


hace referencia a un archivo que es muy utilizado en el sistema, por
lo tanto el archivo estará la mayor cantidad de tiempo posible en la
memoria principal con el fin de que su acceso sea más rápido :).

Antiguamente era muy común encontrar este bit en determinados


archivos (debido a la poca RAM), hoy su uso es más bien extraño.

Para activar el bit de permanencia agregan el número 1000 al archivo


en cuestión y aparecerá una “t” si se activa correctamente y tiene
permisos de ejecución para el dueño o una “T” en caso de que no los
tenga.

Ahora, como había prometido, para ubicar archivos con el bit “suid” o
“sgid” activado utilicen el siguiente comando…

bash-2.05b$ find / \( -perm -4000 -o -perm -2000 \) –type f -print

Además de todo lo visto podemos seguir agregando seguridad a nivel


de archivos y es por eso que lo seguiremos haciendo un rato más ;).

En los sistemas ext2 y ext3 existe lo que se llama atributos archivos,


no todos los atributos nos ayudan a incrementar la seguridad pero
algunos si son realmente útiles.

Ahora utilizaremos dos comandos para ver y modificar los atributos


de un archivo y veremos tres atributos del sistema de archivos que
nos serán de utilidad. Primero comentaré para que sirven y después
veremos como dárselos a los archivos.

Primero, el atributo “a”. Este atributo solo lo puede implementarse


por el administrador y permite que un archivo sea abierto solo para
escritura, no pudiendo borrarse nada.

Esto es interesante debido a que muchos atacantes, una vez que se


hagan root (si pueden), tratarán de borrar sus huellas de los distintos
archivos de logs… y la verdad es que de los atacantes que andan por
la vuelta, muy pocos conocen estas propiedades de los archivos, que
como podrán ver no aparecen con un simple ls ;).

Segundo, el atributo “i”. Este atributo hace que un archivo no pueda


ser modificado, borrado ni enlazado (con un enlace simbólico).
El mismo no es aplicable a los logs del sistema debido a que ni los
programas podrían escribir los eventos en dichos archivos, siendo de
utilidad para los archivos de configuración ubicados en “/etc” y los
httpdocs que no son cambiados con regularidad… alguien dijo regla
anti MeGaLaMmErS DeFaCeRs!?!? XD.

Finalmente tenemos a los atributos “s” y “S”, que son para garantizar
el borrado seguro de archivos, un archivo con “s” activado será
borrado por el sistema colocando ceros en los bloques que ocupaba
en lugar de simplemente desligarlo del sistema de archivos.

Esto complicará mucho el trabajo de quien necesite recuperar los


archivos que desaparecimos, ya que pese a la contundencia que tiene
este borrado a nivel de usuario, la realidad es que con unos morlacos
y tecnología aparecen las formas de recuperarlos.

Por otro lado, “S” guardará los cambios realizados inmediatamente en


el disco en lugar de tenerlos un rato en memoria como es habitual. Lo
cual es útil en archivos críticos se escriben continuamente, evitando
problemas en caso de un corte de energía o reinicio inesperado.

Nota: No se confundan este atributo “s” y “S” con el anterior, gracias.

Descriptos los atributos y como prometí, veamos las herramientas


que tenemos a nuestra disposición para activar y ver estos atributos
de un archivo determinado, ejecuten…

bash-2.05b# lsattr cualkiera


------------- cualkiera

Como era de esperar el archivo “recién creado” no tiene atributos,


como agregarle alguno?¿, pues con nuestro amigo “chattr”…

bash-2.05b# chattr +a cualkiera


bash-2.05b# lsattr cualkiera
-----a------- cualkiera
bash-2.05b# chattr +S cualkiera
bash-2.05b# lsattr cualkiera
--S--a------- cualkiera

Interesante verdad?¿, pasemos entonces a ver como realizar un


borrado seguro.

Aunque parezca improbable, un atacante con objetivos determinados


puede intentar recuperar datos de tus archivos que supuestamente
han sido borrados. Tal vez hayan oído nombrar el termino “forensics”
en informática, el cual trata exclusivamente la recuperación de datos
que han sido borrados por catástrofes, con el fin de identificar las
causas que provocaron el incidente.
Esta tarea también se realiza mucho en servidores que han sido
atacados con el fin de conocer los pasos que realizó el atacante a la
vez de poder ver que archivos borró y que contenían.

Como es habitual en temas de seguridad algunas armas son de doble


filo, es decir que un hacker experimentado en el tema puede utilizar
técnicas y utilidades similares para recuperar archivos confidenciales
que supuestamente deberían de estar completamente eliminados y
crear, conociendo de la técnica, pistas falsas ;)…

Entonces, para efectuar un “borrado seguro” vamos a utilizar una


herramienta desarrollada por el conocido grupo de hackers “The
Hackers Choice” llamada “Secure Delete”, pueden obtenerla desde la
página del grupo…

http://www.thc.org

Una vez que tenemos el paquete en formato tar.gz (secure_delete-


3.1.tar.gz) pasamos a descomprimirlo e instalarlo en la forma que ya
conocen…

bash-2.05b# tar xvzf secure_delete-3.1.tar.gz


bash-2.05b# cd secure_delete-3.1
bash-2.05b# ./configure
bash-2.05b# su
bash-2.05b# make
bash-2.05b# make install

Este maravilloso programa realiza los siguientes pasos para borrar un


archivo, considerándose bastante seguro…

- El proceso de sobreescritura actúa sobre el archivo sobrescribiendo


38 veces, luego de cada pasada el caché del disco es limpiado.

- El archivo a borrar se trunca para que el atacante no pueda saber


que bloques en disco son los relacionados con el archivo.

- Se renombra el archivo de tal modo que el atacante no pueda


obtener nada de información con le nombre de archivo a ser borrado.

- Se borra el archivo con la funcion unlink.

Una vez instalado, los binarios que nos quedan serán los siguientes…

srm Borrado seguro de archivos.

sfill Sobrescritura segura del espacio en disco que no esta


siendo utilizado.
sswap Sobrescribe y limpia el sistema de archivos swap.
(Se debe desmontar la partición swap antes de hacerlo).

smem Sobrescribe la memoria RAM que no esta utilizándose.

Según el README que acompaña el programa (acostúmbrense a


leerlos), estos binarios se ejecutan de la siguiente forma y siguiendo
la siguiente sintaxis…

srm [-d] [-f] [-l] [-l] [-v] [-z] file [file] [another file]
sfill [-i] [-I] [-f] [-l] [-l] [-v] [-z] target-directory
sswap [-f] [-l] [-l] [-v] [-z] /dev/of_swap_filesystem
smem [-f] [-l] [-l] [-v]

Pasemos a detallar las opciones…

-d Si se esta borrando un directorio hace que no se borren


los archivos “.” (directorio actual) y “..” (directorio
anterior). Útil solo en srm.

-i Sobrescribe solo inodos vacíos no espacio libre en disco.


Útil solo en sfill.

-I Sobrescribe solo espacio libre. Solo funciona en sfill.

-f Borrado o sobrescritura más rápida pero menos segura.

-l Disminuye la seguridad, si agregamos otra “-l” como


cambia el programa para el borrado aún más inseguro.

-v Nos brinda información mientras borra.

-z Utiliza ceros (000000) en lugar de información aleatoria.

Programas como esto son llamados comúnmente “hipes” y si bien hay


muchos programas con capacidades similares al expuesto “Secure
Delete” ha demostrado ser el más rápido y eficaz bajo estrictas
pruebas y es por esto que lo he incluido.

7º Compilando el Kernel

Compilar el kernel es una tarea que como administradores y hackers


debemos saber hacer si o si por varias razones, las cuales detallo a
continuación…
1) Agujeros de seguridad en el kernel.

Estos problemas frecuentes desembocan por lo general en un exploit


local para elevar los privilegios del atacante sin importar su distro,
tomando en cuenta solo la versión del kernel en el que corre.

Estos exploits no son nada simples de crear y solo grupos expertos en


seguridad se dedican a la no fácil tarea de programarlos, no obstante
los hay y debemos estar siempre atentos.

Si bien no es fácil explotar los errores del kernel, la mayoría de los


exploits publicados en Internet están listos para ser compilados y
ejecutados… recuerdan Metasploit?¿.

Un buen ejemplo de estos grupos es el Isec: http://www.isec.pl

2) Dispositivos de hardware sin tiene n soporte en el kernel actual.

Luego de averiguar si existe el soporte en una nueva versión, la


solución es actualizarnos al kernel correspondiente.

Otras veces el kernel que usamos soporta el dispositivo pero no está


activado, requiriendo de una recompilación para ello.

Además de dispositivos de hardware existen determinadas opciones


de las que nos gustaría disfrutar, las cuales necesitarán ser activadas
a nivel del núcleo, por ejemplo el color de las letritas :P.

3) Crear escenarios para practicar.

Como hackers/administradores nos interesará probar exploits, pero


como somos etí(li)cos lo haríamos en un equipo diseñado y preparado
para ello… ya que además puede que requiramos de un kernel más
viejo del que tenemos.

Otras veces encontramos documentos sobre la programación de


determinadas utilidades (como rootkits) a nivel de kernel pero para
versiones anteriores al que tenemos. Como las técnicas no dejan de
ser interesantes para el aprendizaje, además de que los cambios en
la programación a nivel de kernel no son tan distantes, luego de
entendi das las técnicas y diferencias existentes podríamos llegar a
implementarlas con facilidad en un kernel moderno.

4) Nuestro kernel puede “explotar”.

Bajo determinadas condiciones anormales, un kernel puede afectarse


al nivel de producir un “Kernel Panic”.
En ocasiones como esta el kernel queda inutilizable, afectando del
mismo modo al sistema dado a que como saben el kernel es la base
del mismo.

La posible solución para este caso será reinstalar nuevamente el


kernel, reiniciando el equipo con el CD de instalación y compilándolo.

En definitiva, estas y otras razones son suficientes para conducirnos a


tener que aprender a instalar un nuevo kernel.

Así mismo podremos tener más de un kernel en nuestro sistema,


booteando en uno u oto según se nos de la gana, pudiendo probar y
usar diferentes versiones sin necesidad de tocar la actual.

Para realizar esta prueba bajen la versión del kernel 2.6.11 desde
www.kernel.org, siendo el paquete a bajar el “linux-2.6.11.tar.gz”.

Una vez con el paquete del kernel y como usuario root lo movemos
hasta “/usr/src”, que como saben es en donde se guardan las fuentes
de los kernels que tendremos en nuestro sistema.

bash-2.05b# mv linux-2.6.11.tar.gz /usr/src


bash-2.05b# cd /usr/src

Y lo desempaquetemos…

bash-2.05b# tar xvzf linux-2.6.11.tar.gz


...
......
linux-2.6.11/Makefile
linux-2.6.11/CREDITS
linux-2.6.11/README

Listo, para continuar borramos el paquete comprimido y entramos al


nuevo directorio creado…

bash-2.05b# rm linux-2.6.11.tar.gz
bash-2.05b# cd linux-2.6.11/

A partir de ahora tenemos 3 opciones para configurar nuestro nuevo


kernel…

make config
Lanza un modo de configuración en texto que nos irá preguntando la
configuración que deseamos realizar (No recomendado).

make menuconfig
Aparece un menú con las opciones de configuración (Recomendado).

make xconfig
Lo mismo que el anterior pero para el modo gráfico.

En este caso utilizaremos la opción recomendada (make menuconfig).

bash-2.05b# make menuconfig

Este es el menú principal de la configuración del kernel, con el cursor


de arriba y abajo podrán moverse, con la tecla enter entramos en un
submenú de configuración, con la tecla Tab o con los cursores de
izquierda y derecha nos movemos por la parte de abajo, en donde
figuran las opciones “<Select>”, “<Exit>” y “<Help>” y una vez que
entramos en un submenú podemos volver para atrás con la tecla
“Esc” o seleccionando “<Exit>”.

Comenzando con nuestro trabajo, para incluir algo en la configuración


del kernel dentro de algún submenú utilizamos la letra “Y”, con lo
cual aparecerá un “[*]” en la opción marcada.

Para desmarcar una opción usamos la letra “N” con lo que quedará en
blanco “[ ]”.

También podemos incluir algunas opciones como módulos, de modo


que se utilizarán solo si son necesarias, esto lo hacemos con la letra
“M” y la opción se marcará con una “[M]”.
Finalmente, dentro de cada opción podemos apretar la tecla “?” para
obtener ayuda sobre el ítem seleccionado.

Pasemos a conocer que contiene cada menú, lo cual posiblemente no


vayan a comprender pero al menos les irá abriendo la capocha…

Code Maturity Level Options --->


Podemos dar soporte al kernel para que compile drivers que no han
sido del todo probados así como otros supuestamente obsoletos.

Dentro de este menú podremos elegir que nos pregunte en caso de


instalar drivers en fase de desarrollo.

Si desean tener un sistema muy estable no les recomiendo activar


está opción, de otra forma y si desean estar bajo condiciones
experimentales, por ejemplo para probar un nuevo dispositivo de
hardware, no existen problemas con habilitarla.

General Setup --->


Dentro de la configuración general encontraremos muchas opciones
que serán de nuestro interés…

() Local Version - append to kernel release


Nos permite darle una cadena extra despué s del nombre de nuestro
kernel, sirve entre otras cosas, para dejar constancia de que el kernel
ha sido configurado por nosotros. De este modo, cuando ejecutemos
“uname –a” aparecerá la cadena seguida de la versión del kernel.

[*] Support for paging of anonymous memory(swap)


Permite el soporte para la memoria virtual como complemento de la
memoria ram existente, recomendado instalarlo con [yes].

[*] System V IPC


Instala librerías que sincronizan e intercambian información entre
procesos. Algunos programas utilizan estas librerías por lo que es
recomendable instalarla en nuestro kernel con [yes].

[*] POSIX Message Queues


Si instalamos las librerías del paso interior debemos instalar también
esto para su correcto funcionamiento, denle [yes]

[*] BSD process Accounting


Con esta opción activada podremos crear programas que escriban
información del proceso en un archivo. Más adelante veremos varios
ejemplos para que aprecien como funciona… le colocamos [yes].

[*] Sysctl Support


Nos permite cambiar dinámicamente parámetros del kernel sin la
necesidad de recompilarlo o reiniciar el sistema en algunos casos.
Esto se logra gracias a una llamada al sistema en programas de
usuario, les recomiendo dejarlo en [yes].

[*] Auditting Support


Permite el soporte de auditorias del kernel. Por ejemplo si tenemos
pensado instalar SELinux (entorno de seguridad hecho por la NSA
para Linux con controles sobre los programas que se ejecutan y otras
madres) debemos activar esta opción. Hay otros programas que
hacen uso de esta ventaja por lo tanto recomiendo incluirla [yes].

[*] Enable system-call auditing support


Activa una llamada al sistema para las auditorias, recomendado si se
activo lo anterior [yes].

--- Support for hot-pluggable devices


Soporte para enchufar o desenchufar algunos dispositivos con el
equipo encendido (la opción se activa en otra parte).

[*] Kernel Userspace Events


Habilita el sistema de comunicación eficiente para notificar eventos a
los usuarios, a menos que requieran de un sistema con un consumo
de memoria mínimo esta opción debería estar activa [yes].

Las otras dos opciones no nos interesan, continuamos…

Loadable module support --->


Configuración de los LKMs en el sistema, antes de ver las opciones
veamos de qué tratan estos módulos cargables.

“Lodeable Kernel Modules” se refiere a algunas de las funciones que


se le pueden agregar al kernel de forma dinámica. Una infinidad de
cosas son posibles gracias a estas maravillas de la programación, ya
sea desde crear controladores para nuevos dispositivos, crear nuestro
propio sistema de archivos y la creación/modificación de llamadas al
sistema.

En el hacking los LKMs son altamente utilizados debido su capacidad


de programación a muy bajo nivel, razón por la cual herramientas
como rootkits y sniffers los utilizan.

Pasamos a lo que encontramos dentro del menú…

[*] Enable loadable module support


Brinda soporte para los módulos cargables mediante herramientas
para cargarlos como “addmod” y para verlos como “lsmod”. Instalen
esta opción [yes].
[*] Module unloading
Si bien algunos módulos no pueden ser descargados del kernel bajo
ningún concepto, sin esta opción ninguno podría serlo por lo que se
recomienda ponerlo a [yes].

Al ponerlo a “yes” aparecerá la opción “Forced module unloading”, la


cual sirve para darnos la posibilidad de descargar módulos incluso si
no es seguro hacerlo, por ahora no se los recomiendo [no].

[ ] Module versioning support


Con esta opción le damos soporte a módulos de otras versiones a la
del kernel que compilaremos, por ahora no se los recomiendo [no].

[ ] Source checksum for all modules


En la sección que contiene información sobre los módulos se agrega
un campo que contiene los archivos fuente con los que fue construido
el módulo. No recomendado [no].

[*] Automatic kernel module loading


Con esta opción permitimos que los módulos que fueron instalados en
la configuración del kernel con “[M]” puedan ser cargados de forma
automática cuando este los requiera en lugar de hacer nosotros
mismos un “addmod” o “modprobe” para ello. Tengan en cuenta que
no todos los módulos pueden ser cargados automáticamente, les
recomiendo colocar [yes] en esta opción.

Processor type and features --->


Esta parte es muy importante, este menú contiene todos los tipos de
procesadores y coprocesadores soportados por el kernel, el número
máximo de procesadores que puede haber en el sistema y muchas
cosas más.

Al estar el sistema en funcionamiento el nuevo kernel ya sabe cual es


nuestro procesador, información que es obtenida en parte del archivo
“/proc/cpuinfo”. Por esta razón les recomiendo dejar todo lo que ven
tal cual está, de paso me ahorro horas de explicaciones :P.

Power management options (ACPI, APM) --->


Menú para el soporte del apagado o encendido de energía en partes
del equipo según estén o no estén siendo utilizadas.

Algunas de las opciones que tenemos por defecto son para port átiles
por lo que sería interesante (si no estamos en una), desactivar las
siguientes opciones con [no]…

ACPI (Advanced Configuration and Power Interface) Support --->

< > AC ADapter


< > Battery
< > IBM ThinkPad Laptop Extras

Siguiendo nuestro camino, volvemos al menú principal y tenemos…

Bus options (PCI, PCMCIA, EISA, MCA, ISA) --->


Como se podrán imaginar se trata del soporte para slots en donde
enchufaremos tarjetas, dentro de la opción encontramos…

[*] PCI support


Soporte para tarjetas PCI, si no tienen slots PCI en su tarjeta madre
le ponen que [no], en caso afirmativo le ponemos [yes].

Si optamos afirmativamente se abre una nueva opción con el modo


de acceso a las interfaces PCI, les recomiendo dejar (Any).

[*] PCI Express support


Habilita la “nueva versión” de puertos PCI, el cual permite altas tazas
de transferencias. Si su mother tiene sócalos PCI express activen esta
opción.

[ ] Message Signaled Interrupts (MSI and MSI-X)


Permite a los drivers obtener mensajes de interrupciones… [no].

[*] Legacy /proc/pci interface


Permite saber que dispositivos PCI existen en el sistema a través de
dicho archivo, le damos [yes].

[*] PCI device name database


Activa una base de datos con los nombres de los dispositivos PCI en
“/proc/pci” y “/proc/ioports”, le damos [yes].

[ ] ISA support
Brinda soporte para sócalos ISA (equipos muy viejos), deberán ver su
mother para corroborar si dar o no soporte, posiblemente sea [no].

[ ] MCA support
Activa el soporte para MicroChannel Architecture, lo cual es similar a
ISA pero en equipos IBM PS/2 y laptops viejas, lo normal será [no].

[ ] NatSemi SCx200 support


Soporte para procesadores SCx200 con pins GPIO, comúnmente [no].

< > PCCARD (PCMCIA/CardBus) support


Soporte tarjetas PCMCIA, en caso de tener una laptop deberán
aceptar y se desplegarán varias opciones, todas intuitivas ;)… en mi
caso la dejo desactivada [no].
[*] PCI Hotplug Support
Soporte para en/desenchufar tarjetas PCI mientras el equipo está
encendido, no lo recomiendo, o sea [no].

Executable file formats --->


En esta parte tenemos los distintos formatos de los ejecutables que
serán reconocidos en nuestro sistema.

[*] Kernel support for ELF binaries


“Executable and Linkable Format” es el formato de binarios utilizado
actualmente en linux, o sea que le damos [yes]… opción interesante
verdad?¿ ;).

[*] Kernel support for a.out and ECOFF binaries


El formato “Assembler OUTput ” pertenece a los primeros Unixs, como
aun se utiliza le colocamos [yes].

[*] Kernel support for MISC binaries


Nos brinda la posibilidad de reconocer otro tipo de ejecutables, por
ejemplo los de Vvindous, le damos [yes].

Device Drivers --->


En esta opción encontraremos los submenús categorizados con los
distintos dispositivos soportados por el kernel, no voy a recomendar
que instalar y que no por que dependerá de su hardware, lo que si
haré será darles una descripción de las categorías.

Mientras recorren el listado vayan quitando las opciones marcadas


que no correspondan con el hardware de su PC, de esta forma se
aligera el peso del kernel y aunque parezca raro, también aumentan
su seguridad.

Generic Driver Options --->


Opciones generales, les recomiendo instalarlas todas (por defecto ya
están marcadas).

Memory Technology Devices --->


Dentro de esta opción configuramos el soporte para dispositivos de
memoria extendidos.

Parallel port support --->


Soporte para el puerto paralelo, el cual “antiguamente” era utilizado
para manejar impresoras, hoy puede ser útil para otros dispositivos.

Plug and Play support --->


Soporte para dispositivos Plug & Play, como por ejemplo el monitor,
mouse, teclado, etc.
Block devices --->
Configura el soporte para dispositivos de bloque, como la disquetera
y tipos especiales de discos duros.

ATA/ATAPI/MFM/RLL support --->


Interface de discos duros, cdroms y otros dispositivos para leer y
transferir los datos a la placa madre.

SCSI device support --->


Soporte para dispositivos SCSI.

Multi-device support (RAID and LVM) --->


Soporte para utilizar tecnologías RAID, lo cual permite utilizar dos o
mas discos siendo espejo del otro o bien que ambos funcionen como
uno solo, aumentando la perfomance o la estabilidad del sistema.

Fusion MPT device support --->


Tecnología que utiliza un solo driver para el canal de fibra y los
dispositivos SCSI simplificando el diseño y desarrollo de aplicaciones.

IEEE 1394 (FireWire) support --->


Soporte para el puerto FireWare, la competencia del USB >).

I2O device support --->


Tecnología propietaria de Intel para dispositivos de almacenamiento.

Networking support --->


Aquí encontrarán todo lo que tiene que ver con el soporte para redes,
desde nuestra tarjeta de red hasta la configuración de Netfilter y sus
módulos, pasando por el soporte para tarjetas del tipo inalámbrico.

Deben prestar particular atención en esta parte ya que las opciones


son muchas, traten de no quitar el soporte para las opciones que ya
están marcadas por defecto a menos que sea para una tarjeta de red
que no tienen.

Algunas cosas son genéricas y vale la pena que queden como están
para el correcto funcionamiento del sistema.

ISDN subsystem --->


Se trata de un dispositivo especial para conectar su teléfono con el
ISP, es más rápido que un módem normal.

Telephony Support --->


Soporte para telefonía de de voz sobre ip (VoIP).

Input device support --->


Soporte para dispositivos de entrada como son el teclado, el mouse,
un joystick, etc… Acá también configuramos el soporte para algunos
puertos de dispositivos de entrada como es un teclado que utilice el
puerto paralelo.

Character devices --->


Son dispositivos del tipo caracter, los drivers que aquí se muestran
son los que transfieren información directamente desde los procesos
de usuario.

El puerto serial, los sócales AGP, los chips nvidia y las tarjetas de
video comunes son dispositivos de esta categoría, por lo que si su
equipo los tiene deberán cargar los correspondientes en el kernel.

I2C support --->


Soporte para un protocolo de comunicación serial que utilizan varios
dispositivos desarrollados por la empresa Philips.

Dallas's 1-wire bus --->


Soporte para dispositivos lentos de 1-pin, como por ejemplo censores
termales.

Misc devices --->


Dentro de esto encontramos el soporte para IBM RSA.

Multimedia devices --->


Aquí tenemos como opción importante la posibilidad de obtener el
soporte para una Webcam, necesitando conocer que chip tiene la
suya. Como siempre aunque no recomendable, podemos seleccionar
todo para no estar buscando la info.

Graphics support --->


Dentro de este submenú encontramos con “Support for frame buffer
device”, lo cual se trata de la memoria que contiene los píxeles con la
cual la pantalla es refrescada.

Algunas tarjetas de video permiten que los programas accedan al


hardware gráfico mediante una interface bien definida, de esta forma
el programa no tiene que saber nada acerca del hardware.

Si esta opción es instalada se crearán nuevos dispositivos del tipo


“/dev/fb*” donde “*” es un número.

Por otro lado tenemos la opción “Console display driver support ”, la


cual permite elegir “Video Mode Selection Support ” para cambiar las
resoluciones al iniciar el kernel, agregando un parámetro a nuestro
“lilo.conf” en el arranque de la computadora.

Sound --->
En esta parte configuramos la tarjeta de sonido, dependiendo del
sócalo en el que está seleccionamos el chip correspondiente.
USB support --->
Seleccionamos los dispositivos USB que soportará nuestro kernel.

MMC/SD Card support --->


Damos soporte para el bus “multi media card”.

InfiniBand support --->


Soportamos esta tecnologí a para la instalación sencilla de clusters.

Volvemos al menú principal y continuamos el viaje categorizado…

File systems --->


En esta parte de la configuración podremos optar por dar soporte a
todo tipo de sistemas de archivos, incluyendo NTFS para particiones
de Micro$oft Windoüs en la opción “DOS/FAT/NT FileSystems”.

Como saben “ext2” es el sistema de archivos estándar y “ext3” su


versión renovada, hoy en día con más opciones y estabilidad.

Otro sistema de archivos que se utiliza comúnmente en GNU/Linux es


“RaiserFS”, el cual es igual de rápido que “ext2” pero mas eficiente
para trabajar con directorios largos y archivos pequeños.

Otro submenú interesante es “Network File Systems ”, conteniendo


sistemas de archivos de red, como por ejemplo soporte para Novell
Netware, SMB y NFS entre otros.

Finalmente, en “Partition types” disponemos de soporte para tablas


de particiones utilizados por otros sistemas operativos poco comunes
como Amiga, Atari, Mac, etc… así como soporte para sistemas de
archivos utilizados por otros Unixs como Solaris, Unixware, etc.

Volviendo al menú principal tenemos…

Profiling support --->


Soporte para personalización del sistema, desde los módulos del
kernel hasta las librerías del sistema.

Kernel Hacking --->


En esta parte disponemos de opciones principalmente utilizadas por
los programadores de drivers a nivel de kernel ya que nos dará
información detallada de lo que sucede en él.

Si la meta de esta instalación es (entre otras cosas), investigar el


funcionamiento del núcleo, les recomiendo habilitar todas las
opciones que allí figuran. Si en cambio será para un servidor (pese a
que Uds. lo controlarán y “jugarán en él”), no es recomendable
debido a que el kernel será innecesariamente mucho más pesado.
Security options --->
Dentro de la seguridad a nivel de kernel nos encontramos primero
con el soporte para tener llaves de acceso a determinadas zonas del
mismo.

Por otra parte “Enable different security model” nos permite elegir
diferentes niveles de seguridad en nuestro kernel.

Cryptographic options --->


Podremos elegir entre los distintos métodos de encriptación que
queremos tener disponibles en el kernel. Aprovechen para investigar
sobre los que desconocen e instalen los que finalmente les parezcan
mas seguros, conocidos, o se les de la gana :).

Library routines --->


Configuramos que las librerías CRC-CCITT y CRC32 estén disponibles
para módulos construidos afuera del árbol del kernel.

Finalizada esta explicación general de todo lo que podemos soportar


en nuestro sistema supongo que cada uno ya tiene listo su kernel
personalizado por lo que procedemos a guardar los cambios. Para
esto simplemente vamos a <Exit> y nos aparece lo siguiente…

Guardados los cambios estamos listos para ejecutar los comandos


para compilar el nuevo kernel, tengan paciencia que varios pueden
demorar un poquito…

bash-2.05b# make
Compila pero no instala el nuevo kernel.

bash-2.05b# make clean


Realiza una limpieza de compilaciones previas.

bash-2.05b# make bzImage


Compila el kernel en una imagen comprimida.

bash-2.05b# make modules


Compila los módulos.

bash-2.05b# make modules_install


Instala los módulos.
bash-2.05b# make install
Instala el kernel, quedando la nueva imagen en la raíz bajo el nombre
“/vmlinuz”, la imagen del kernel viejo será nombrada “vmlinuz.old”.

Ahora, para el correcto funcionamiento de nuestro nuevo kernel así


como del viejo kernel (si lo deseamos), debemos configurar lilo.conf.

El siguiente ejemplo se lleva a cabo en un sistema con 3 kernels de


diferentes, sumándole una instalación de Windows…

# LILO configuration file


# generated by 'liloconfig'
#
# Start LILO global section
boot = /dev/hda
message = /boot/boot_message.txt
prompt
timeout = 1200
# Override dangerous defaults that rewrite the partition table:
change-rules
reset
# Normal VGA console
vga = normal
# End LILO global section
# Linux bootable partition config begins
image = /boot/vmlinuz-ide-2.4.26
root = /dev/hda1
label = Linux
read-only
# Linux bootable partition config ends
# Windows
other = /dev/hda3
label = Windows
# Kernel prueba viejo
image = /boot/vmlinuz-2.4.20
label = viejofiel
# Nuevito
image = /vmlinuz
root = /dev/hda1
label = nuevecito

Lo que vemos aquí es la configuración de un lilo en la cual el kernel


viejo (2.4.26) tiene su imagen en el directorio “/boot”, de esta forma
si entramos en “Linux” utilizaremos el kernel anterior.

Si elegimos “Windows” explotará la computadora.

“viejofiel” es un kernel aún mas viejo que el que tení a actualmente


instalado, el cual he utilizado para realizar pruebas, principalmente de
exploits para el kernel 2.4.20.
Por último, “nuevecito” es la opción que levantará el sistema con el
kernel recientemente creado, entonces ahora le damos…

bash-2.05b# make install

…nos chupamos un rato el dedo, ponemos “Dancing with myself” de


de Billy Idol, nos comemos un churro con dulce de leche, creamos el
nuevo lilo y a disfrutar de una PC cada vez mas interesante ;).

No se olviden probar lo del monitor monocromático!!! :~).

Pasamos hoja y seguimos trabajando con nuestro kernel tradicional…

8º Logs en Unix

Como administradores del sistema, revisar los archivos de log que se


generan es una tarea que debemos realizar en forma periódica, ya
que es la manera de conocer si hemos recibido ataques así como de
tomar conocimiento de posibles fallos, contando además la ayuda que
nos brindan cuando trabajamos sobre alguno de estos mismos
acontecimientos en tiempo real.

Existen programas, principalmente servicios, que manejan un sistema


de logs independiente, por ejemplo el ya conocido Apache.

En esta parte nos centraremos en los logs que genera el sistema,


dejando de lado los que son creados por servicios tercerizados.

Como alguno que conoce algo de logs o lee atentamente todas las
lecciones sabe :P, estos usualmente se almacenan en el directorio
“/var/log”, lo cual puede variar según la configuración que nosotros
realicemos, siendo capaces de enviarlos a una terminal, a un usuario
o hasta a otro host.

La mayor parte de los logs del sistema se logran gracias al programa


“syslogd” y las diferentes configuraciones las realizaremos mediante
el archivo “/etc/syslog.conf”, al cual le prestaremos mucha atención
por unas páginas…

# /etc/syslog.conf
# For info about the format of this file, see "man syslog.conf"
# and /usr/doc/sysklogd/README.linux. Note the '-' prefixing
# some of these entries; this omits syncing the file after
# every logging. In the event of a crash, some log information
# might be lost, so if this is a concern to you then you might
# want to remove the '-'. Be advised this will cause a
# performation loss if you're using programs that do heavy
# logging.
# Uncomment this to see kernel messages on the console.
#kern.* /dev/console

# Log anything 'info' or higher, but lower than 'warn'.


# Exclude authpriv, cron, mail, and news. These are logged
# elsewhere.
*.info;*.!warn;\
authpriv.none;cron.none;mail.none;news.none -/var/log/messages

# Log anything 'warn' or higher.


# Exclude authpriv, cron, mail, and news. These are logged
elsewhere.
*.warn;\
authpriv.none;cron.none;mail.none;news.none -/var/log/syslog

# Debugging information is logged here.


*.=debug -/var/log/debug

# Private authentication message logging:


authpriv.* -/var/log/secure

# Cron related logs:


cron.* -/var/log/cron

# Mail related logs:


mail.* -/var/log/maillog

# Emergency level messages go to all users:


*.emerg *

# This log is for news and uucp errors:


uucp,news.crit -/var/log/spooler

# Uncomment these if you'd like INN to keep logs on everything.


# You won't need this if you don't run INN (the InterNetNews
# daemon).
#news.=crit -/var/log/news/news.crit
#news.=err -/var/log/news/news.err
#news.notice -/var/log/news/news.notice

Lo que ven es el archivo “syslog.conf” que acompaña por defecto a


nuestro Slackware 10.0-ch, en otras distros trae otra configuración
por lo que es probable que se encuentren con un archivo diferente.

Comenzando el análisis les cuento que una línea de configuración


podrá ser partida en más de un renglón si (tal como aprecian), se usa
el caracter retrobarra (“\”) para especificarlo.

Todas las reglas se componen de 2 campos, uno que especifica que


es lo que vamos a loguear y el otro que determina donde va a quedar
el log. Estos campos están separados por espacios o tabulaciones y
quedan distribuidos básicamente así…
QueLoguear DondeLoguear

Empecemos analizando el primer campo, el cual se compone a su vez


por 2 partes llamadas “facilidad” y “prioridad”, las cuales son
diferenciadas por un punto intermedio (“.”).

La “facilidad” indica el servicio que envía el mensaje, especificándose


mediante las siguientes claves: auth, authpriv, cron, daemon, kern,
lpr, mail, mark, news, security (lo mismo que auth), syslog, user,
uucp y local0 hasta local7.

Como dije, la facilidad se refiere al sistema (generalmente programa


o grupo de programas) que genera el mensaje a ser logueado. Por
ejemplo, todos los programas que utilizan la impresora loguean con la
facilidad “lpr” (LOG_LPR), todos los mensajes de los programas de
mail se loguean con la facilidad “mail” (LOG_MAIL), etc… claro que
esto se cumple siempre y cuando dichos programas utilicen el syslog
para el logueo de sus mensajes.

Nota: La clave “security” debe ser sustituida por “auth” y no debe ser
usada y la palabra clave “mark” es de uso interno por lo que tampoco
debe ser incluida en nuestras reglas.

Luego del punto después de la facilidad (continuando en el primer


campo “QueLoguear”) está la “prioridad” del mensaje a ser logueado.

Esta “prioridad” es una de las siguientes claves en orden ascendente:


debug, info, notice, warning, warn (igual que warning), err, error
(igual que err), crit, alert, emerg, panic (igual que emerg).

Nota: Las claves “error”, “warn” y “panic” están obsoletas y no deben


usarse, de todos modos las coloco por si las encuentran en algún
sistema “antiguo” que estén “administrando” ;).

La “prioridad” define la severidad del mensaje a ser logueado. Por


esto un mensaje de prioridad debug (la más alta) logueará también
todos los mensajes de menor prioridad, de este modo los mensajes
que concuerden con las prioridades que siguen en orden descendente
serán grabados, para este caso serían: info, notice, warning, err, crit,
alert y emerg.

Además, para tener un control completo sobre lo que grabaremos


existen caracteres especiales, veámoslos con ejemplos para hacerlo
claro de entrada (continuando en el campo “QueLoguear”)…

* (caracter asterisco)
Abarca todas las posibilidades del campo que ocupa, por ejemplo…
kern.*

En este caso se encuentra en el campo “prioridad”, por lo tanto todos


los mensajes producidos por el servicio “kern” serán enviados al
archivo o dispositivo que se especifique en “DondeLoguear”.

Otro ejemplo sería tener el “*” en el campo “facilidad”, por ejemplo…

*.crit

En donde todos los servicios que tengan mensajes de prioridad “crit”,


“alert ” y “emerg” serán logueados a donde hayamos especificado.

, (caracter coma)
Se utiliza para indicarle a varios servicios una misma “prioridad” y log
sin la necesidad de crear varias directivas para ello, veamos…

cron,daemon.alert

Esto produce que se envíen todos los mensajes producidos por “cron”
y “daemon” de prioridad “alert ” y “emerg” a donde especifiquemos.

= (caracter igual)
Se utiliza para darle una prioridad específica a una o más facilidades
de modo tal que solo se loguen los mensajes con esa prioridad, por
ejemplo…

kern.=warning

Logueará solo los mensajes de prioridad “warning” producidos por el


servicio “kern”, dejando de lado todos los que le seguirían en orden
descendente.

! (caracter exclamación)
Sirve para determinar un límite de logueo en las prioridades de modo
tal que no se guarde nada a partir de ella y sus inferiores, veamos…

mail.notice;mail.!crit

Produce un log de los mensajes con prioridad “notice”, “warning” y


“err”, ya que son las que le siguen a “notice” hasta “crit” sin incluirla.

Sencillo y sin vueltas, no hay mucho más para aclarar por lo que
pasamos al campo en el que configuramos a donde enviar los
mensajes producidos de acuerdo a lo establecido en “QueLoguear”.

Por lo general los mensajes se escribirán en archivos de texto, los


cuales son especificados mediante su ruta completa.
Las rutas para especificar los archivos a los que caen los logs están
precedidas por un caracter menos (“-”), lo cual nos quita la carga de
estar escribiendo inmediatamente en el disco las notificaciones que se
envían. Les recomiendo incluirlo siempre que no se requiera de una
escritura inmediata, tomando en cuenta que un error en el sistema
puede traernos como resultado la perdida de datos que estaban
esperando a ser escritos en el buffer (poco común pero posible).

Otra posibilidad sería enviar los logs a una terminal, veamos…

mail.emerg /dev/tty1

En este caso, los mensajes de emergencia producidos por programas


de mail (que usen syslog) serán enviados a la terminal “tty1” de
nuestro sistema.

Del mismo modo, podemos enviar los mensajes a un archivo especial


(del tipo tubería “fifo”, First In First Out). La característica de estos
archivos es que los objetos que ingresan llegan al otro extremo en
orden, primero el 1, segundo el 2, etc. Para crear un fifo hacemos…

bash-2.05b$ mkfifo 2600


bash-2.05b$ ls -l | grep 2600
prw-r--r-- 1 darkhis users 0 2005-04-06 15:44 2600

Como inteligentemente pueden deducir, la “p” en los permisos del


archivo indica que estamos ante un archivo del tipo “pipe” (tubería).

Para comprender en parte su funcionamiento escriban lo siguiente…

bash-2.05b$ cat 2600

Como ven la terminal está esperando (justamente por ser un archivo


tubería), para continuar el ejemplo, en otra terminal escriban…

bash-2.05b$ echo Bien hecho Mario! > 2600

Y cuando “cat” reciba los datos terminará su ejecución, demostrando


que la tubería funciona !! -sin agujeros- :B.

Se pueden lograr muchas cosas con este tipo de archivos, para los
que no se lo imaginan supongan que le decimos a nuestra grabadora
de CD que escriba el archivo “2600” (en unas páginas veremos como
usar la grabadora), mientras que en otra terminal hacemos…

bash-2.05b$ wget http://descargas.alumnoz.com/128esp.zip –O 2600

Con lo cual vamos grabando el disco mientras bajamos el archivo ;).


Para el caso de nuestros logs (el que realmente nos interesa), vamos
a ver un ejemplo concreto en unas líneas, por ahora les comento que
para enviar los datos a una tubería usaremos el caracter “|” adelante
de la ruta y que el archivo “pipe” debe estar creado desde antes de
arrancar el “syslogd” que la utilizará.

Continuando, otra opción muy importante es la capacidad de enviar


los logs a un host remoto, lo cual por motivos de seguridad es una
alternativa muy interesante aunque también delicada.

Interesante porque si el sistema es comprometido los logs estarán a


salvo en una maquina supuestamente segura y aislada. Delicado por
razones más que obvias ;), las cuales trataremos en instantes.

Por ejemplo, en un sistema corporativo que brinda servicios Web en


forma completa (Web, Correo, FTP, etc…) la posibilidad de recibir
ataque s desde el exterior es muy alta, por lo tanto enviar los logs a
otra máquina será una opción interesante, siempre con el fin de tener
mayor certeza sobre la veracidad de la información que contengan.

Para llevar a cabo esta configuración escribimos en el “syslog.conf”…

*.* @host.seguro

Regla que enviará todos los logs (*) sobre todos los eventos (*) a un
host seguro. Como pueden imaginar, para que esto funcione hay que
agregar otras configuraciones, las cuales les explicaré paso a paso…

En la maquina local…

1- Agregamos el host seguro a la tabla de hosts (si es que no existe).

2- Agregamos la regla para que los logs se envíen al host seguro.

En la máquina remota (host.seguro)…

3- Como “syslogd” no acepta conexiones remotas por defecto hay


que parar el servicio e iniciarlo nuevamente pero con soporte para
recibir conexiones remotas, lo cual se realiza del siguiente modo…

bash-2.05b# ps -A | grep syslog # Identificamos el proceso.


58 ? 00:00:00 syslogd
bash-2.05b# kill 58 # Matamos el proceso.
bash-2.05b# syslogd –r # Lo iniciamos con soporte.

4- Syslogd queda escuchando en el puerto UDP 514 del host seguro.


5- Los mensajes de nuestro sistema serán enviados al host seguro
mediante la regla que tenemos en el “syslog.conf”. Para comprobarlo
hagan la prueba :).

Si bien esta es una excelente opción de seguridad, los archivos de log


viajarán mediante texto plano y algunos de ellos incluso contienen
passwords!… delicado ;). Entonces, para incorporarle seguridad real y
evitar que estos datos sean interceptados o modificados en el camino
les presento dos opciones…

Creamos un canal privado con el host remoto, aislándolo del resto de


la red y otros equipos. De esta forma un atacante no podrá espiar el
tráfico entre nuestro sistema y el host seguro.

Esto se logra con una tarjeta de red con un único cable entre los dos
hosts o bien con una VLAN a nivel del hardware mediático de la red.

La otra opción será (haciendo uso de las tuberías) encriptar el tráfico


de los logs con ssh de forma tal que un atacante con un sniffer no
podrá interpretar los datos, sin importar que logre capturarlos.

Si bien esto es seguro, hay que tomar en cuenta que el host al que se
envían los logs no debe estar comprometido de ninguna forma sino
sería lo mismo que no hacer nada.

Para llevar a cabo esta tarea realizaremos los siguientes pasos…

1- Abrir SSH en el host seguro, si todo esta en orden lo hacemos


simplemente ejecutando “sshd”.

2- Creamos la tubería “/root/lr” en nuestro sistema…

bash-2.05b# mkfifo /root/lr

3- Agregamos en el syslog.conf la siguiente línea de configuración…

*.* |/root/lr

4- Buscamos el “syslog” con “ps” y lo reiniciamos.

5- Ejecutamos el siguiente comando para enviar el log por ssh…

bash-2.05b# cat /root/lr | ssh host.seguro 'cat >> /var/log/lr'

Nos pedirá el password de root del host seguro y comenzará a pasar


el log encritpado mediante el túnel SSH recientemente creado. El log
quedará dentro del archivo remoto “/var/log/lr”.
Como ejercicio capturen el tráfico entre una conexión sin ssh (logs en
texto plano) y luego con esta configuración.

Un destino alternativo y no tan común para nuestros logs puede ser


un usuario particular del sistema, lo cual configuramos así…

*.* root, chiche

Esto enviará la salida de todos los logs a la terminal en donde están


logueados estos 2 usuarios. Como ven simplemente se especificó su
nombre en la parte “DondeLoguear” de las reglas del “syslogd.conf”.

Otra regla común para guardar todos los mensajes con la prioridad
“emerg” es notificar a todos los usuarios se encuentran conectados al
sistema, lo cual hacemos con ayuda del carácter asterisco, veamos…

*.=emerg *

Vistas las características generales de la configuración del “syslogd”


pueden apreciar que el archivo incluido por defecto está muy bien
armado, especificando los tipos de log que reportarán los problemas
más comunes.

Pese al alto grado de personalización (lo cual a más de uno le ha


recordado los logs de Apache), la mayoría de los “admini stradores”
dejan todo como viene de fábrica, habiéndose creado de cierta forma
un “estándar”. Por esto es que analizaremos los casos más comunes
de este fenómeno, comprendiendo en consecuencia la mayoría de los
sistemas a los que podemos llegar a enfrentarnos…

Archivo: /var/log/messages
Definido en el syslog.conf por la regla…

*.info;*.!warn;\
authpriv.none;cron.none;mail.none;news.none -/var/log/messages

Esta regla guardará los mensajes de prioridad “info” y “notice” para


todas las facilidades, tratándose de mensajes de prioridad baja y
media, los cuales por lo general no registran sucesos importantes.

En este log se guardarán también los sucesos del firewall del sistema
(netfilter) e información relativa al arranque y apagado del equipo.

Archivo: /var/log/syslog
Definido en el syslog.conf por la regla…

*.warn;\
authpriv.none;cron.none;mail.none;news.none -/var/log/syslog
Aquí grabamos lo relacionado a intentos de acceso al sistema por lo
que es importante revisarlo periódicamente en busca de anomalías.

Este archivo también es escrito por otros servicios además de que


podremos encontrar información relativa a los módulos del kernel.

Archivo: /var/log/debug
Definido en el syslog.conf por la regla…

*.=debug -/var/log/debug

En este archivo se grabarán los mensajes de prioridad “debug” para


todas las facilidades, los cuales se refieren generalmente a sucesos
producidos por el núcleo.

Archivo: /var/log/secure
Definido en el syslog.conf por la regla…

authpriv.* -/var/log/secure

En este archivo encontraremos información sobre logins al sistema.

Archivo: /var/log/cron
Definido en el syslog.conf por la regla…

cron.* -/var/log/cron

Guarda un registro de las actividades vinculadas al cron del sistema.

Archivo: /var/log/maillog
Definido en el syslog.conf por la regla…

mail.* -/var/log/maillog

Almacena todos los sucesos relacionados al correo del sistema.

Aparte de estos archivos existen otros interesantes pero que no son


manejados por el “syslog.conf”, que a diferencia de los anteriores,
por ser archivos binarios requieren del uso de herramientas del
sistema para leer su contenido, veámoslos…

Archivo: /var/log/wtmp
Guarda información acerca de conexiones y desconexiones al
sistema, el mismo se lee con el comando “last”.

Archivo: /var/log/utmp
Contiene información acerca de los usuarios conectados al sistema,
se trata de otro archivo binario y se lee con el comando “who”,
aunque en algunos sistemas está información es obtenida de otra
parte. Para ver la información de este archivo también usaremos el
comando “last”.

Archivo: /var/log/lastlog
Tiene la información correspondiente a fechas y horas de las últimas
conexiones realizadas por los usuarios, el archivo se lee con “finger
usuario”. El comando “who” también extrae info de este archivo.

Archivo: /var/log/faillog
Lo mismo que el “lastlog” pero con los intent os de conexión fallidos, o
sea que cuando un usuario teclea mal su contraseña la información
de este archivo es leída, para luego ser mostrada cuando el usuario si
pueda acceder al sistema… es sin duda un alcahuete <:B. Para leerlo
podemos utilizar el comando “faillog” de la siguiente forma…

bash-2.05b# faillog -u usuario

Suficientes logs por hoy… enjoy the information source |-).

9º El Sonido

Si queremos que nuestra computadora realice algo más que un par


de pitidos cuando le damos muchas veces a la tecla de retroceso o
cuando estamos editando en el vi, sigan esta parte para tener su
tarjeta funcionando.

En este caso, para instalar el sonido utilizaremos los drivers ALSA, lo


cual no significa que no existan otras posibilidades :).

Sin rodeos, voy directamente a darle sonido al sempeteder de Walter,


su tarjeta de sonido es una Intel 82801BA, información que obtuve
ejecutando el siguiente comando…

bash-2.05b# lspci | grep audio


00:1f.5 Multimedia audio controller: Intel Corp. 82801BA/BAM
AC'97 Audio (rev 12)

Con este dato vamos a http://www.alsa-project.org y en la parte de


“Documentation” entramos al enlace “Sound Card Matrix & INSTALL
documentation” y finalmente encontramos las marcas. Una vez en la
página de nuestra marca chequeamos si nuestra tarjeta está
soportada y anotamos el nombre del módulo, el cual vemos al hacer
click en “Details”, para mi caso es el “snd-intel8x0”.

Ahora, para obtener los drivers vamos a http://www.alsa-project.org


y bajamos el archivo más nuevo del “alsa-driver”, para el caso de
Walter fue el “alsa-driver-1.0.15”.
Luego de bajado, Walter lo ha descomprimido y entró al directorio…

bash-2.05b# cd alsa-driver-1.0.15

Para instalarlo, Walter ha ejecutado lo siguiente…

bash-2.05b# ./configure --with-cards=MODULO --with-sequencer=yes


&& make && make install

En donde Uds. deben sustituir “MODULO” por el módulo de su tarjeta,


para Walter es el “snd-intel8x0” y por lo tanto ejecutó…

bash-2.05b# ./configure --with-cards=intel8x0 --with-


sequencer=yes && make && make install

Y posteriormente, Walter ejecutó el siguiente comando…

bash-2.05b# ./snddevices

…continuando nos toca bajar las librerías. Para ello diríjanse otra vez
al sitio de ALSA y bajen el archivo con las librerías más nuevas, para
Walter fueron las “alsa-lib-1.0.15”, lo descomprimió y…

bash-2.05b# cd alsa-lib-1.0.15
bash-2.05b# ./configure && make && make install

… siguió con la descarga y descompresión de las utilidades :)…

bash-2.05b# cd alsa-utils-1.0.15
bash-2.05b# ./configure && make && make install

Finalmente (en la instalación :P), Walter bajó la compatibilidad para


“oss”, la descomprimió y ejecutó…

bash-2.05b# cd alsa-oss-1.0.15
bash-2.05b# ./configure && make && make install

Ahora, para configurar el sonido y antes que nada tuvo que agregar
lo siguiente a su archivo “/etc/modules.conf” (en el caso de que no
estuviera), modificándolo según su tarjeta de sonido…

# ALSA
alias char-major-116 snd
alias snd-card-0 snd-intel8x0

# OSS/Free
alias char-major-14 soundcore
alias sound-slot-0 snd-card-0

# card
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss

Es muy probable que Uds. (como Walter) dispongan de sonido pero


que no escuchen nada porque está en mute. Para cambiar esto y
muchas otras cosas más tenemos la utilidad “alsamixer”, a la cual se
accede ejecutando…

bash-2.05b# alsamixer

El mute se saca/pone con la “M”. Para probar busquen algún archivo


de sonido y reprodúzcanlo con el comando “aplay”, por ejemplo…

bash-2.05b# wget http://www.alumnoz.com/owkf.wav /root/owkf.wav


bash-2.05b# aplay /root/owkf.wav

( ( ( ( d[-.-]b ) ) ) )

10º La grabadora

Comencemos este punto repasando algunas definiciones del “CD


Writing Howto”…

CD-ROM significa “Compact Disk Read Only Memory”, siendo un


medio de almacenaje que utiliza un láser óptico para leer los billones
de agujeros pequeños que tiene un disco, los cuales representan bits
de información.
“CD-R” es un abreviado de “CD-ROM Recordable” y se trata de un
disco sin agujeros (vacío), el cual contiene una película química que
permite el quemado de su superficie, formándose así los agujeros.

El láser encargado de esta tarea tiene más poder que el de lectura,


de tal manera que en lugar de solo verlos también puede hacerlos.

Algunas áreas del disco pueden dejarse sin quemar para ser usadas
mas adelante, esto se llama disco multisesión y también veremos
como crearlos.

Un disco “CD-RW” es un abreviado de “CD-ROM ReWritable”. Con


estos discos su grabadora podrá escribir datos en el así como volver
el disco a su estado original, lo cual es posible porque el láser no
quemará realmente el medio.

Para ent ender mejor la tecnología de los CD-RW el autor del “CD
Writing Howto” hace una analogía con una cancha de hockey sobre
hielo.

Cuando los jugadores se mueven en el hielo dejan marcas (láser) y


cuando termina un periodo la cancha queda marcada (medio).

Entre los periodos de juego un auto limpiador llamado “Juan Carlos


Zamboni” derrite la capa más superficial de hielo y por tanto la
cancha queda nuevamente lisa.

Eso mismo es lo que pasa con los CD-RW por lo que pueden imaginar
que las veces que podemos grabar, borrar y volver a grabar no será
ilimitada.

En definitiva, para irnos acostumbrando cada vez más a usar el Linux


procederemos a dar soporte para la grabadora, que aunque parezca
complicado… no lo es %).

Primero que nada nuestro kernel debe tener soporte SCSI (aunque su
grabadora sea IDE), ya que en tiempos prehistóricos las grabadoras
de CD eran SCSI pero con la aparición de IDE se tuvo que idear una
manera para soportarlo y el problema principal estaba en el programa
de grabación de línea de comandos por excelencia: “cdrecord”.

La solución a esto fue emular el IDE para que parezca SCSI y aunque
también parezca rebuscado, es fácil de hacer %).

Primero que nada deben tener los siguientes módulos cargados en el


kernel…

scsi support
scsi generic support
scsi cdrom support

En el caso de estar utilizando los kernels que les dimos nosotros no


tendrán ningún problema.

El siguiente paso es hacer la emulación, lo cual haremos en lilo.conf


agregando el soporte SCSI en la parte donde bootea el kernel a raíz
de la siguiente línea…

append="hdd=ide-scsi"

En mi caso quedaría…

image = /boot/vmlinuz-ide-2.4.26
root = /dev/hda1
label = Linux
read-only
append="hdb=ide-scsi"

Si es que “hdb” era el dispositivo en el que estaba su lectora. Luego


ejecutan el comando “lilo” para actualizar el loader de modo tal que
la próxima vez que enciendan la ordenata tendrán el emulador ;).

Noten que si la grabadora estaba (por ejemplo) en “/dev/hdb” ahora


estará en “/dev/scd0”, siempre y cuando no tuvieran otro dispositivo
SCSI en el sistema. En caso de que lo tuvieran la grabadora estará en
“/dev/scd1” y así…, progresivamente hasta encontrar lugar.

Continuando las configuraciones, deberían actualizar la configuración


del software que usaban para leer del CD para escuchar música, ver
películas, copiar software libre, etc…

A partir de ahora la configuración quedó pronta y me dedicaré solo a


explicarles como grabar ;).

Para grabar en un disco (para sorpresa de los distraídos), este deberá


de tener un sistema de archivos. Varios son los sistemas de archivos
disponibles para la creación de CDs, los más comunes son…

ISO9660
Sistema de archivos estándar internacional para CDs. Una imagen iso
será una copia fiel bit a bit de lo que se grabará en el CD.

ElTorito
Se utiliza para hacer CDs booteables, insertando un Floppy virtual a
la imagen del disco.
Joliet
Sistema que entre otras cosas admite los nombres de archivos largos
comúnmente encontrados en Windows , mejorando la compatibilidad
Windows /Unix.

HFS
Sistema de archivos utilizado en los equipos con sistema operativo
Macintosh.

RockRidge
También utilizado para soportar nombres de archivos largos así como
para permitir muchos subdirectorios, más adelante incluiremos como
extensión este sistema de archivos para grabar CDs multisesión.

Antes de comenzar con la grabación veamos como crear una imagen


para grabar, lo cual hacemos con la herramienta “mkisofs”.

Supongamos que vamos a hacer un CD para el viaje de 25 cuadras


con nuestros compañeros de trabajo rumbo a los quilombos. Para ello
y primero que nada movemos todos los datos que queremos grabar
hasta el directorio “/root/micd/”…

bash-2.05b# mv Autenticos_Decadentes_Los_Piratas.mp3 /root/micd/

…luego todo lo demás :P, y para crear la imagen ejecutamos…

bash-2.05b# mkisofs -v -r -J -l -L -T -o piratas.iso /root/micd/


Warning: creating filesystem that does not conform to ISO-9660.
mkisofs 2.0.3 (i686-pc-linux-gnu)
Scanning micd/
Scanning micd/Eek a Mouse
Scanning micd/Nigthwish
Scanning micd/Nigthwish/Nightwish - Wishmaster
Scanning micd/Nigthwish/Nightwish - Over the hills and far away
Scanning micd/Nigthwish/Nightwish - Ocean born
Scanning micd/Nigthwish/Nightwish - Century Child
Using EEK_A_MOUSE___GANJA_SMUG000.MP3;1 for micd/Eek a
Mouse/eek-a-mouse - ganja smuggling.mp3 (Eek-A-Mouse - Ganja
Smugglin'.mp3)
Writing: Initial Padbock Start Bl
..
.... y nos vuelve al shell :~).

Veamos que significa cada uno de los parámetros que ejecutamos…

-v Salida verbosa, es decir que nos dará detalles.


-r Acceso público a los archivos en sistemas no Unix.
-J Extensiones joliet para archivos de más de 8 caracteres.
-l Reconoce nombres de más de 32 caracteres.
-T Crea en los directorios un archivo de texto con su contenido.
-o Le damos un nombre a la salida del .iso (piratas.iso).

Para verificar el contenido de la imagen generada podemos montarla


con el comando “mount” de la siguiente forma…

bash-2.05b# mount -o loop imagen.iso /mnt/hd

Elegí “hd” porque es un directorio en el que no tengo nada montado,


si Uds. lo tenían lleno pueden hacerlo en donde les pinte.

Vayan hasta el directorio y naveguen por la imagen generada, traten


de borrar algo y comprueben que la imagen está montada en modo
de solo lectura (cosa que pueden verificar además con un “ls –l”),
abran el/los archivos TRANS.TBL y aprecien como se ha generado la
lista tal como lo especificamos con el argumento “-T”.

Suficiente?¿, desmontamos la imagen d:·9…

bash-2.05b# umount /mnt/hd/

Ya saben como crear una imagen a partir de un directorio pero ahora


imaginen que quieren copiar un CD a otro. Para eso, al igual que en
este caso, vamos a generar la imagen para luego grabara. Esto lo
haremos con el comando “dd” de la siguiente forma…

bash-2.05b# dd if=/dev/scd0 of=/home/root/ BrianaLovesJenna.iso

Recuerden sustituir el nombre de dispositivo SCSI en el caso de que


tengan otros dispositivos conectados además de la lectora :).

Ahora si, pasemos a lo que es propiamente la grabación del disco,


para ello utilizaremos el siguiente comando…

bash-2.05b# cdrecord -scanbus


Cdrecord 2.00.3 (i686-pc-linux-gnu) Copyright (C) 1995-2002 Jörg
Schilling
Linux sg driver version: 3.1.25
Using libscg version 'schily-0.7'
scsibus0:
0,0,0 0) 'CyberDrv' 'CW088D CD-R/RW' '100F' Removable CD-ROM
0,1,0 1) *
0,2,0 2) *
0,3,0 3) *
0,4,0 4) *
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
Anoten el parámetro que les corresponda en la columna donde yo
tengo “0,0,0”, el cual será utilizado para notificarle a “cdrecord” cual
es el dispositivo en el que está nuestra quematuti ;).

Continuando, con la imagen pronta en /root/piratas.iso, coloquen un


CD virgen en su grabadora y ejecuten…

bash-2.05b# cdrecord -v speed=8 dev=0,0,0 /root/piratas.iso


Cdrecord 2.00.3 (i686-pc-linux-gnu) Copyright (C) 1995-2002 Jörg
Schilling
TOC Type: 1 = CD-ROM
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
..
... y vean como sin problemas, comenzará el proceso de grabación :).

El parámetro “-v” (como en muchos otros programas) es agregado


para tener una salida con toda la información que el programa pueda
darnos, “speed” indica la velocidad y “dev” el dispositivo de grabado,
el cual se obtiene con el comando que ejecutamos más arriba.

Si disponemos de un CD regrabable y queremos vaciarlo tenemos que


ejecutar el siguiente comando antes de comenzar la grabación…

bash-2.05b# cdrecord -v speed=8 dev=0,0,0 blank=fast

Si en cambio vamos a grabar un CD de audio deberemos tener los


archivos en formato .wav y agregar la opción “-audio”, por ejemplo…

bash-2.05b# cdrecord -v speed=8 dev=0,0,0 -audio /UB40/Tema*.wav

Con lo cual grabamos todos los archivos que comienzan con “Tema”
de la carpeta “UB40” ubicada en la raíz.

Si su problema es que no tienen la música en .wav sino que en CDs


podrán utilizar la herramienta “cdparanoia” para ripearlos y luego
hacer con ellos lo que les plazca.

Por ejemplo, para extraer la pista 1 de un CD de audio ejecutan…

bash-2.05b# cdparanoia -v -d /dev/scd0 1 hola.wav

También podemos grabar discos mixtos (como para playstation), lo


cual se hace de la siguiente forma…

bash-2.05b# cdrecord -v dev=0,0,0 -data /root/img.iso -audio


Tema.cdr
Otra posibilidad sería crear CDs multisesión, lo cual significa que los
usaremos para grabar algo y despué s, otro día, los completaremos
con más datos usando el espacio que quedó libre.

Para ello, generada la imagen iso para la primera sesión procedemos


a grabarla en el CD mediante el siguiente comando…

bash-2.05b# cdrecord -v -R speed=8 dev=0,0,0 -eject -multi


/root/img.iso
Cdrecord 2.00.3 (i686-pc-linux-gnu) Copyright (C) 1995-2002 Jörg
Schilling
TOC Type: 3 = CD-ROM XA mode 2
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Linux sg driver version: 3.1.25
Using libscg version 'schily-0.7'
atapi: 1
Device type : Removable CD-ROM
Version : 0
Response Format: 1
Vendor_info : 'CyberDrv'
Identifikation : 'CW088D CD-R/RW '
Revision : '100F'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Driver flags : MMC-2 SWABAUDIO BURNFREE
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16
RAW/R96P RAW/R96R
Drive buf size : 1806336 = 1764 KB
FIFO size : 4194304 = 4096 KB
Track 01: data 98 MB
Total size: 113 MB (11:15.44) = 50658 sectors
Lout start: 113 MB (11:17/33) = 50658 sectors
Current Secsize: 2048
ATIP info from disk:
Indicated writing power: 6
Is not unrestricted
Is not erasable
Disk sub type: Medium Type B, low Beta category (B-) (4)
ATIP start of lead in: -11524 (97:28/26)
ATIP start of lead out: 359849 (79:59/74)
Disk type: Short strategy type (Phthalocyanine or similar)
Manuf. index: 13
Manufacturer: Multi Media Masters & Machinary SA
Blocks total: 359849 Blocks current: 359849 Blocks remaining:
309191
Starting to write CD/DVD at speed 8 in real TAO mode for multi
session.
Last chance to quit, starting real write 0 seconds. Operation
starts.
Waiting for reader process to fill input buffer ... input buffer
ready.
BURN-Free is ON.
Turning BURN-Free off
Performing OPC...
Starting new track at sector: 0
Track 01: 98 of 98 MB written (fifo 100%) [buf 99%] 8.7x.
Track 01: Total bytes read/written: 103743488/103743488 (50656
sectors).
Writing time: 88.902s
Average write speed 7.9x.
Min drive buffer fill was 99%
Fixating...
Fixating time: 36.878s
cdrecord: fifo had 1635 puts and 1635 gets.
cdrecord: fifo was 0 times empty and 1549 times full, min fill
was 82%.

Analicemos las nuevas opciones que han aparecido…

-eject La grabadora se abrirá cuando termine el grabado.


-multi Le indica al programa que el disco será multisesión.
-R Incluye las extensiones RockRidge (antes mencionadas).

Si en realidad esta fuera la segunda sesión necesitaríamos un par de


datos sobre la sesión anterior para saber a partir de donde debemos
comenzar a grabar, para ello ejecutamos…

bash-2.05b# cdrecord -msinfo dev=0,0,0


0,62058

Continuando, para armar la segunda sesión colocaremos los archivos


en un directorio que a su vez esté dentro de otro, veamos…

directorio1/
directorio2/
archivo1
archivo2
etc…

Para hacer esto simplemente creamos los directorios ejecutando…

bash-2.05b# mkdir directorio1


bash-2.05b# cd directorio1/
bash-2.05b# mkdir directorio2

Luego copiamos los archivos de la segunda sesión al “directorio2”…

bash-2.05b# cd directorio2/
bash-2.05b# cp -rf /home/darkhis/mp3/ZapMama .

Y procedemos a crear la imagen…

bash-2.05b# mkisofs -o img2.iso -R -C 0,62058 -M /dev/scd0


/root/directorio1
Rock Ridge signatures found...
..
... y listo =:-}.

Recuerden cambiar los números que identifican los espacios de las


sesiones a los suyos según el resultado de la consulta en “cdrecord -
msinfo dev=0,0,0” realizada pasos atrás :).

Finalmente, para grabar esta segunda sesión…

bash-2.05b# cdrecord -v speed=8 dev=0,0,0 -multi /root/img2.iso


Cdrecord 2.00.3 (i686-pc-linux-gnu) Copyright (C) 1995-2002 Jörg
Schilling
TOC Type: 3 = CD-ROM XA mode 2
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Linux sg driver version: 3.1.25
Using libscg version 'schily-0.7'
atapi: 1
Device type : Removable CD-ROM
Version : 0
Response Format: 1
Vendor_info : 'CyberDrv'
Identifikation : 'CW088D CD-R/RW '
Revision : '100F'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Driver flags : MMC-2 SWABAUDIO BURNFREE
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16
RAW/R96P RAW/R96R
Drive buf size : 1806336 = 1764 KB
FIFO size : 4194304 = 4096 KB
Track 01: data 24 MB
Total size: 28 MB (02:49.28) = 12696 sectors
Lout start: 28 MB (02:51/21) = 12696 sectors
Current Secsize: 2048
ATIP info from disk:
Indicated writing power: 6
Is not unrestricted
Is not erasable
Disk sub type: Medium Type B, low Beta category (B-) (4)
ATIP start of lead in: -11524 (97:28/26)
ATIP start of lead out: 359849 (79:59/74)
Disk type: Short strategy type (Phthalocyanine or similar)
Manuf. index: 13
Manufacturer: Multi Media Masters & Machinary SA
Blocks total: 359849 Blocks current: 297791 Blocks remaining:
285095
Starting to write CD/DVD at speed 8 in real TAO mode for multi
session.
Last chance to quit, starting real write 0 seconds. Operation
starts.
Waiting for reader process to fill input buffer ... input buffer
ready.
BURN-Free is OFF.
Performing OPC...
Starting new track at sector: 62058
Track 02: 24 of 24 MB written (fifo 100%) [buf 99%] 8.2x.
Track 02: Total bytes read/written: 25997312/25997312 (12694
sectors).
Writing time: 28.830s
Average write speed 7.1x.
Min drive buffer fill was 68%
Fixating...
Fixating time: 18.480s
cdrecord: fifo had 410 puts and 410 gets.
cdrecord: fifo was 0 times empty and 324 times full, min fill
was 84%.
bash-2.05b# mount -t iso9660 /dev/scd0 /mnt/cdrom/
mount: block device /dev/scd0 is write-protected, mounting read-
only

Procedemos a verificar…

bash-2.05b# cd /mnt
bash-2.05b# cd cdrom/
bash-2.05b# ls
Chopper directorio2
bash-2.05b# cd directorio2/
bash-2.05b# ls
ZapMama
..
...y listo el pollo!, para grabar otra sesión repitan el procedimiento.

Me despido re quemado :P, será hasta el próximo punto B·).

11º Backups

Finalizando la parte simple de la nueva etapa GNU/Linux (tempranito)


y previo a empezar con los mazazos duros a su cerebro, les explicaré
brevemente como realizar correctamente las copias de seguridad
periódicas que deberán llevar a cabo como rutina en su sistema.

Como quienes desde hace años usan PCs saben, no solo un hacker
puede arruinarnos los datos del disco. Desastres naturales como una
madre furiosa o un incendio en su cuarto andan al asecho y es por
esto que debemos estar atentos, realizando religiosamente las copias
de seguridad a su formato de disco preferido.

Para realizar backups existen infinitas herramientas optimizadas pero


como estándar personal, opto por un simple .tar y después si se
requiere, lo comprimo con gz, bz2 o el formato que se ajuste mejor y
eso es lo que utilizaremos en esta ocasión :).
Como no imaginarán, no tiene sentido respaldar lo que se encuentra
en “/bin”, “/sbin”, etc… debido a que estos son los mismos archivos
que estarán cuando instalemos nuevamente el sistema (en el caso de
que mamá catástrofe se haya enojado mucho :P). Por la misma razón
tampoco haremos backups de “/dev” ni de la documentación.

Entonces, para que cree este punto?¿, para estimular su neurona del
sentido común y recomendarles respaldar solo las siguientes partes
del sistema…

- Directorios de usuario en “/home”.


- Archivos de configuración en “/etc”.
- Todos los logs del sistema.
- Directorio “/root”.
- Programas y documentos de usuario, generalmente almacenados en
“/usr/local” (si les parecen importantes).

Recuerden además que es buena idea tener las copias de seguridad


en un lugar diferente a donde está equipo, ya que si las conservamos
en el mismo sitio y la tragedia viene a por nosotros, encontraremos
cenizas de todo por igual.

Entonces, para crear las copias de seguridad simplemente usaremos


el siguiente comando…

bash-2.05b# tar cvf etc.tar /etc


bash-2.05b# tar cvf home.tar /home

… y del mismo modo con cada directorio a respaldar 8·).

Luego y si desean los comprimen para posteriormente quemarlos en


un disco o hacer como yo, que los subo a un servidor especialmente
preparado para ello, lo cual me resulta muy útil y eficiente por que
administro varios equipos y almaceno todos mis respaldos ahí .

12º Entorno chroot Básico

Recuerdan la práctica del ataque DoS de la semana número 6 en


nuestros servidores?¿, esa en donde se les proporciona el password
del root, de modo tal que si estuvieran enojados por que no les llegan
los discos podrían hacer un “rm –rf /” y borrar todo nuestro sistema
dejándonos sin servidor hasta una nueva instalación?¿ :P.

Bueno, como imaginarán no podríamos permitir que esto suceda y es


por eso que el servicio telnet al cual ustedes entraron está dentro de
un sistema aislado llamado “jaula chroot”.
La llamada al sistema “chroot” permite ejecutar un shell cambiando la
raíz del sistema. “A lo bruto” significa que caemos en una jaula que
contiene un sistema falso dentro del real, de este modo si se les
ocurre lanzar el malvado comando borrarán el contenido de la jaula y
no tocarán el sistema exterior que permanecerá estable e intacto.

… escuchemos un poco de música… La del pirata cojo con pata de


palo, con parche en el ojo, con cara de malo, el viajo truhán capitán,
de un barco que tuviera por bandera, un par de tibias y una
calavera… gracias Juako ;9…

Siguiendo, muchas cosas debemos tener en cuenta para hacer una


“jaula chroot” que funcione bien. Primero que nada, una vez que el
usuario esté dentro deberá contar con todo lo necesario para realizar
la tarea para la cual se ha conectado, desde comandos y librerías a
dispositivos y otros.

En el caso de esta lección haremos una jaula para el servicio telnet,


en la que una vez dentro solo se podrán ejecutar los pocos comandos
seleccionados por quien les escribe >).

Una vez que sepan como crear la base podrán ir agregando cositas y
mandarse cagaditas hasta dejarla a su medida, comencemos…

Primero crearemos el directorio llamado “jaula” en “/usr/local”, en el


cual estará la jaula con lo que le proporcionaremos a los usuarios…

bash-2.05b# mkdir /usr/local/jaula


bash-2.05b# cd /usr/local/jaula

Con el comando “mkdir” se crea un directorio y con “cd” entramos :B.

El siguiente paso será crear los dispositivos, para ello tenemos una
utilidad que se encarga de hacerlo, la misma se llama “MAKEDEV” y
está en el directorio “/dev”.

Creamos un directorio llamado “dev” dentro de la jaula (los usuarios


dentro de ella lo verán como “/dev”) y le copiamos el programa…

bash-2.05b# mkdir dev


bash-2.05b# cp /dev/MAKEDEV dev/

Como lo que nos interesan serán las conexiones remotas ejecutamos


dentro de la jaula el comando de esta forma…

bash-2.05b# ./MAKEDEV ptyp


bash-2.05b# ls
MAKEDEV ptyp1 ptyp3 ptyp5 ptyp7 ptyp9 ptypb ptypd ptypf
ttyp1 ttyp3 ttyp5 ttyp7 ttyp9 ttypb ttypd ttypf ptyp0
ptyp2 ptyp4 ptyp6 ptyp8 ptypa ptypc ptype ttyp0 ttyp2
ttyp4 ttyp6 ttyp8 ttypa ttypc ttype

Lo cual creó las terminales virtuales a las cuales se conectarán los


usuarios que ingresen al sistema mediante telnet.

De todos modos y por si se les da por usar la jaula de forma completa


también crearemos los dispositivos estándar…

bash-2.05b# ./MAKEDEV std


bash-2.05b# ls
MAKEDEV loop1 loop6 ptyp0 ptyp5 ptypa ptypf ram11 ram16
ram6 tty ttyp4 ttyp9 ttype core loop2 loop7 ptyp1
ptyp6 ptypb ram ram12 ram2 ram7 ttyp0 ttyp5 ttypa
ttypf full loop3 mem ptyp2 ptyp7 ptypc ram0 ram13
ram3 ram8 ttyp1 ttyp6 ttypb urandom kmem loop4 null
ptyp3 ptyp8 ptypd ram1 ram14 ram4 ram9 ttyp2 ttyp7
ttypc zero loop0 loop5 port ptyp4 ptyp9 ptype ram10
ram15 ram5 random ttyp3 ttyp8 ttypd

Ahora, para que los usuarios puedan conectarse y usar correctamente


la jaula deberá tener como mínimo los comandos “bash”, “login” y las
librerías que utilizan. Para conocer cuales son las librerías de las que
depende un comando usamos el comando “ldd” así…

bash-2.05b# ldd /bin/bash


libtermcap.so.2 => /lib/libtermcap.so.2 (0xb7f4b000)
libdl.so.2 => /lib/libdl.so.2 (0xb7f48000)
libc.so.6 => /lib/libc.so.6 (0xb7e19000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7f66000)

Lógicamente lo que sigue será copiar el binario y las librerías a los


lugares correspondientes, creando el directorio “bin” para los binarios
y “lib” para librerías, veamos…

bash-2.05b# mkdir bin


bash-2.05b# mkdir lib
bash-2.05b# cp /bin/bash bin/
bash-2.05b# cp /lib/libtermcap.so.2 lib/
bash-2.05b# cp /lib/libdl.so.2 lib/
bash-2.05b# cp /lib/libc.so.6 lib/
bash-2.05b# cp /lib/ld-linux.so.2 lib/

Con el intérprete de comandos funcionando estamos listos para una


primera prueba en nuestra jaula a nivel local ;)…

bash-2.05b# pwd
/usr/local/jaula
bash-2.05b# cd ..
bash-2.05b# chroot jaula/
chroot: cannot run command `/bin/sh': No such file or directory
Mierda!, chroot se queja de la ausencia del archivo “/bin/sh” por lo
que procedo a copiarlo como lo hice con “/bin/bash”…

bash-2.05b# cp /bin/sh bin/

Las librerías que usa son las mismas que acabo de copiar así que ya
están adentro, veamos ahora…

bash-2.05b# chroot jaula/


sh-2.05b# pwd
/
sh-2.05b# cd ..
sh-2.05b# pwd
/
sh-2.05b# ls
sh: ls: command not found

Como ven en esta pequeña prueba la jaula comienza a funcionar y no


tenemos problemas para ejecutar los comandos “pwd” o “cd” ya que
son propios del binario del shell, mientras que comandos externos
como “ls” aun no están disponibles.

También podemos ver que a pesar de que nos movemos hacia abajo
no pudimos salir del directorio virtual “/” generado por “chroot”. Para
desconectarnos del telnet escriban “exit”. Proseguimos con el binario
“login”…

bash-2.05b# ldd /bin/login


libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7ed7000)
libc.so.6 => /lib/libc.so.6 (0xb7da8000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7f1b000)

Prestando atención notamos que solo hay una librería nueva para
añadir, tic tac tic tac…

bash-2.05b# cp /lib/libcrypt.so.1 jaula/lib/


bash-2.05b# cp /bin/login jaula/bin/

También necesitaremos el comando in.telnetd (servidor telnet) el cual


se encuentra en “/usr/sbin/”, por lo tanto…

bash-2.05b# mkdir jaula/usr


bash-2.05b# mkdir jaula/usr/sbin
bash-2.05b# cp /usr/sbin/in.telnetd jaula/usr/sbin/

Que librerías necesita in.telnetd?¿…

bash-2.05b# ldd /usr/sbin/in.telnetd


libutil.so.1 => /lib/libutil.so.1 (0xb7f4d000)
libc.so.6 => /lib/libc.so.6 (0xb7e1e000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7f67000)
Agrego la que falta…

bash-2.05b# cp /lib/libutil.so.1 jaula/lib/

En definitiva y para ahorrar tiempo (siempre y cuando no vayamos a


crear un sistema de seguridad crítica), les recomiendo copiar todas
las librerías que están en “/lib” (y “/usr/lib” si quieren estar cubiertos
por completo), dado a que hay otras utilizadas internamente por el
sistema, las cuales se nos irían pidiendo a lo largo de las pruebas…

bash-2.05b# cp –r /lib/* jaula/lib/

Continuando el armado agregaremos los comandos que deseamos


encontrar disponibles en la jaula, por ejemplo “ls”, “more”, “id”. Para
ello simplemente copiamos los ejecutables al directorio “bin”…

bash-2.05b# cp /bin/ls jaula/bin


bash-2.05b# cp /bin/more jaula/bin
bash-2.05b# cp /usr/bin/id jaula/bin

Y antes de declararla 100% funcional tenemos que ver a que usuarios


dejaremos entrar, una primera aproximación bastante obvia nos lleva
a copiar los archivos “/etc/passwd”, “/etc/shadow”, “/etc/group” y
“/etc/gshadow” al directorio “/etc” dentro de la jaula, con lo cual los
mismos usuarios que son válidos en el sistema podrán entrar a la
jaula, agregándonos el trabajo de crear el directorio “/home” con los
subdirectorios para cada uno (o cambiar el directorio al que caerán
dentro de “/etc/passwd”), colocándole los permisos necesarios para
que los usuarios puedan trabjar en él, cosa que por defecto no pasa.

Pese a esto, lo normal es que no queramos que los usuarios que usan
la jaula sean los mismos que hay en el sistema por lo que la solución
poco elegante pero efectiva será la siguiente…

Agregamos los usuarios al sistema real con el comando “adduser”,


copiamos las líneas correspondientes a los nuevos usuarios desde los
archivos nombrados a los archivos internos de nuestra jaula y
finalmente borramos los usuarios del sistema principal (“userdel”).

Perfecto, tomado el camino que hayan preferido estamos casi listos


para disfrutar la jaula, pero antes… no se preguntaron cómo se dará
cuenta telnet de que debe enviar las conexiones a esa jaula?¿.

Acá entra en juego el “inetd.conf” en donde deberán sustituir la línea


referente al servidor telnet por la siguiente…

# Telnet server:
telnet stream tcp nowait root /usr/sbin/chroot chroot
/usr/local/jaula/ in.telnetd
Y luego de reiniciar el proceso “inetd” hagan la siguiente prueba…

bash-2.05b# telnet localhost


Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Linux 2.4.26 (darkstar) (ttyp0)

darkstar login: enjaulado


Password:

-bash-2.05b$ ls -la
total 8
drwxr-xr-x 2 enjaulado root 4096 Nov 15 03:37 .
drwxr-xr-x 3 enjaulado root 4096 Nov 15 03:37 ..

Perfecto!, tenemos una jaula funcionando y todas las librerías adentro


por lo que agregar comandos es cuestión de copiar y pegar :).

Si quieren agasajar a sus invitados pueden colocar un “issue.net” en


el directorio “etc” (de la jaula) con un mensaje de bienvenida, el cual
se mostrará previo a solicitar las credenciales de logueo %).

En el caso de que algún comando les solicite librerías de alguna otra


parte del sistema (como por ejemplo “/usr/lib”), las copian!!! :B… y si
sigue dando problemas recuerden apoyarse del comando “ldd” para
conocer con exactitud cuales son las dependencias ;).

Para finalizar una pequeña aclaración: Los entornos chroot no son


100% seguros y existen muchas técnicas que nos permiten saber que
estamos dentro de una jaula así como otras para salir de ella.

Aprenderán todo esto más adelante, por ahora dedíquense a burlarse


hasta ser burlados <:o)…

13º Monitorización en Tiempo Real

Ya que estamos hablando de las prácticas en nuestros servidores, en


las cuales ustedes insulsos alumnoz accedían mediante telnet, les voy
a contar todos los secretos :9.

Tal como les comenté, por mas que se les ocurriera hacer un borrado
total del disco no tendrían el suceso deseado en nuestro sistema, no
obstante y debido a que no confiamos ni un poquitito en Uds., en la
jaula tenemos otro sistema de control que nos permite ver en tiempo
real lo que están haciendo, tal como si estuviéramos con Uds ;).

Leidis and Yéntelman, uis iuuuuuu: “ttysnoop”.


Si bien el programa no continúa en desarrollo y ha perdido el soporte
es mi gusto un excelente sniffer de ttys, lo cual es suficiente para que
lo ponga aquí >).

Antes de comenzar y como me gusta, una pequeña aclaración acerca


de ttysnoop (que me rompió el cráneo a la hora de implementarlo)…

Esta maravillosa creación no soporta passwords shadows y la verdad


no investigué el porqué, me di cuenta que no podía con ellos y nunca
aceptará passwords si el sistema está en shadow :B… como ahora ya
son peces gordos, si lo hacen funcionar, me mandan un correo y se
ganan una mención en este lugar.

>>> LUGAR PARA EL ALUMNO QUE LO HAGA <<<

Noten que esta en Courier New 12 y en negrita, un honor!!! XD.

Entonces, lo que deben hacer es sustituir el “*” del segundo campo


en “/etc/passwd” por el hash del password que se encuentra en el
archivo “/etc/shadow”.

Una posible línea nos quedaría así…

enjaulado:$1$wXEy6MY5$p59yHDFb86EZwhFi5wFlj1:1001:100:,,,:/home/
enjaulado:/bin/bash

Aclarado esto les informo que la versión del programa que tengo en
mi poder y usaremos es la…

ttysnoop-0.12d.tar.gz (bájenlo desde descargas)

Lo ponemos en el directorio /root del sistema, lo desempaquetemos y


lo instalamos…

bash-2.05b# tar xvzf ttysnoop-0.12d.tar.gz


ttysnoop-0.12d/
ttysnoop-0.12d/ttysnoops.c
ttysnoop-0.12d/README
ttysnoop-0.12d/ttysnoop.c
ttysnoop-0.12d/common.c
ttysnoop-0.12d/common.h
ttysnoop-0.12d/Makefile
ttysnoop-0.12d/config.h
ttysnoop-0.12d/ttysnoop.8
ttysnoop-0.12d/snooptab.dist
bash-2.05b# cd ttysnoop-0.12d
bash-2.05b# make
gcc -O2 -c -o ttysnoops.o ttysnoops.c
gcc -O2 -c -o common.o common.c
gcc ttysnoops.o common.o -o ttysnoops -lcrypt
gcc -O2 -c -o ttysnoop.o ttysnoop.c
gcc ttysnoop.o common.o -o ttysnoop -lcrypt

Ahora lo que nos interesa son los ejecutables “ttysnoops”, “ttysnoop”


y el archivo de configuración “snooptab.dist”.

Para que todo el espionaje funcione “ttysnoop” debe estar entre el


protocolo que conecta al usuario y el programa login, para ello hay
que agregar al “inetd.conf” una línea que especifique que el programa
de login sea “ttysnoops ” para que luego este llame a “login”.

Veamos como nos quedaría la nueva línea referente al servidor telnet


en “/etc/inetd.conf”…

# Telnet server:
telnet stream tcp nowait root /usr/sbin/chroot chroot
/usr/local/jaula/ in.telnetd -L /root/ttysnoop-0.12d/ttysnoops

El siguiente paso será colocar el archivo “snooptab.dist” dentro del


“/etc” de la jaula bajo el nombre “snooptab”…

bash-2.05b# cp snooptab.dist ../../etc/


bash-2.05b# cd ../../etc/
bash-2.05b# mv snooptab.dist snooptab

Tratemos de entrar al sistema a ver que pasa…

bash-2.05b# telnet localhost


Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Linux 2.4.26 (darkstar) (ttyp1)

can't bind server socket (/var/spool/ttysnoop/ttyp2)


Connection
closed by foreign host.

Chan!!! tenemos un error B-)… a rescatarse :P…, bueno está bien… lo


que pasa es que faltan los archivos de sockets en ese directorio, nos
movemos hasta la raíz de la jaula y…

bash-2.05b# mkdir var


bash-2.05b# cd var
bash-2.05b# mkdir spool
bash-2.05b# cd spool/
bash-2.05b# mkdir ttysnoop
bash-2.05b# cd ttysnoop/
Como para realizar este tipo de archivos es necesario un programa y
no conozco ningún comando que lo pueda hacer, escriban el siguiente
código C en su editor VI…

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

int main(int argc,char *argv[]){


int sockfd, len;
struct sockaddr_un localaddr;

if(argc<2){
printf("usage: mksocket file_path\n");
return EXIT_FAILURE;
}

if((sockfd=socket(PF_UNIX, SOCK_STREAM, 0))<0){


printf("socket");
return EXIT_FAILURE;
}

localaddr.sun_family=AF_UNIX;
unlink(argv[1]);
strcpy(localaddr.sun_path, argv[1]);

len = sizeof(localaddr.sun_family)+sizeof(localaddr.sun_path);

if(bind(sockfd, (struct sockaddr*)&localaddr, len)<0){


printf("bind");
return EXIT_FAILURE;
}

return EXIT_SUCCESS;
}

O bajen de descargas “llorar.c”, y luego desde el shell ejecutan…

bash-2.05b# cc -o mksocket llorar.c

Con lo que conseguimos un ejecutable llamado “mksocket”…

bash-2.05b# ./mksocket
usage: mksocket file_path

Donde el argumento del programa es el nombre y la ruta al archivo


de socket que crearemos. ya sabemos en donde deben estar ubicados
para que nuestro ttysnoop funcione por lo que procedemos a crear
algunos del siguiente modo…

bash-2.05b# ./mksocket /usr/local/jaula/var/spool/ttysnoop/ttyp0


bash-2.05b# ./mksocket /usr/local/jaula/var/spool/ttysnoop/ttyp1
bash-2.05b# ./mksocket /usr/local/jaula/var/spool/ttysnoop/ttyp2
bash-2.05b# ./mksocket /usr/local/jaula/var/spool/ttysnoop/ttyp3
bash-2.05b# ./mksocket /usr/local/jaula/var/spool/ttysnoop/ttyp4
bash-2.05b# ls -l
total 0
srwxr-xr-x 1 root root 0 2005-04-13 14:40 ttyp0
srwxr-xr-x 1 root root 0 2005-04-13 14:40 ttyp1
srwxr-xr-x 1 root root 0 2005-04-13 14:40 ttyp2
srwxr-xr-x 1 root root 0 2005-04-13 14:40 ttyp3
srwxr-xr-x 1 root root 0 2005-04-13 14:41 ttyp4

Excelente, es fácil cuando nos dan la papita en la boca no?¿ ;), a ver
si probemos conectarnos ahora…

bash-2.05b# telnet localhost


Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Linux 2.4.26 (darkstar) (ttyp0)

darkstar login: enjaulado


Password:
-bash-2.05b$

Otra vez perfecto! B·), nos conectamos… pero lo que supuestamente


no sabemos es que estamos siendo observados en cada uno de los
movimientos que hacemos, sino me creen escriban en otra terminal…

bash-2.05b# chroot /usr/local/jaula


sh-2.05b# cd root/ttysnoop-0.12d
sh-2.05b# ./ttysnoop ttyp1
Connected to ttyp1 snoop server...
Ctrl+'\' (ASCII 28) to suspend, Ctrl+'-' (ASCII 31) to
terminate.
Snoop password: Acá colocamos el password del root de la jaula!!
Verified OK... Snoop started.

El argumento de ttysnoop (ttyp1 en mi caso) es la terminal virtual a


la cual está conectado el usuario, se puede averiguar o simplemente
probar hasta encontrarla, empezando desde la ttyp0 hasta la ttypn.

Ahora escriban en la terminal de telnet y deléitense interviniendo en


todo lo que se les de la gana, asusten a sus amigos y vivan la Matrix.

Sin desamores, repasen la clase, practiquen, descansen, vuelvan a


tragarla y pasen al temerario último punto >).
13º Prácticos

1) Abrir el puerto del telnet y configurar el sistema para que solicite


además una clave de dialup. Una vez completado deben conectarse
con algún profesor en línea y facilitarle los datos de un usuario con
permisos normales y el password de dialup para que ingrese a su
sistema (sin jaula ni ttysnoop) para realizar los siguientes ejercicios…

a) El profesor intentará loguearse con 3 usuarios inexistentes


los cuales Uds. deberán averiguar y comunicarle.

b) Antes de ingresar las credenciales el profesor tiene que ser


notificado de estar ingresando a una licuadora último modelo.

c) Una vez dentro deben preguntarle si quiere tomar un licuado


de kiwi con vodka mediante el comando “write”, él profesor les
contestará por el mismo medio.

d) El profesor creará un archivo escondido en algún lugar de su


sistema el cual Uds. deberán localizar inmediatamente y cambiarle los
permisos del dueño para el usuario “root”. Noten que deben tener
pensado el mecanismo por el cual realizarán esta técnica desde antes
de comenzar la práctica, no esperen recibir iluminación divina :B.

e) Tomando nota de la IP que ha utilizado el profesor para


conectarse deben colocar una regla para aceptar el ingreso vía telnet
de solo del usuario creado y únicamente desde esa IP (mediante los
archivos de configuración de accesos). Una vez realizado procedemos
a chequearlo y preguntarles cuales han sido los mecanismos que
utilizaron para hacerlo.

f) Finalizado el ejercicio cierren el servicio de telnet hasta nuevo


aviso :).

2) Crear una jaula chroot con un password de root de 6 caracteres


alfanuméricos y un usuario normal con el cual accederemos y dejar
funcionando el comando “ls”, el editor “vi” y el compilador “gcc”. Para
este último necesitarán leer el texto “Atrapando GCC”, creado por
Loki y ubicado en la parte de Linux de la Biblioteca… pidan acceso ;).

Posteriormente cierren todos los procesos personales y laborales que


estén coriendo, terminen las tareas que realizan y prepárense para
perder varias horas ;).

Chequeado y corroborado que tanto la jaula como el ttysnoop andan


correctamente, facilítenle las credenciales de un usuario normal a un
profesor en línea para realizar el siguiente ejercicio…
a) El profesor se conectará y comenzará a escribir en el shell a
lo cual Uds. reaccionarán diciéndole quien es el capullo ahora XD.

b) Aclarados los tantos, el profesor llevará a cabo una tarea a la


cual Uds. deberán estar MUY ATENTOS con el fin de aprender y una
vez se encuentren en condiciones, conectarse y contarle lo que les ha
pasao ;)…

Espero que hayan disfrutado de la lesión cerebral causada por una


nueva lectura cultural sin fines del mundo, hasta la próxima =|-}.

Parararara paraph, parara rara para rara… parara rara paraph… [-^-]…

FIN DE LA LECCIÓN Good Afternoon Mr. Anderson


Autor: DarKh|s.exe ³ (n+1)
Mail: darkhis@alumnoz.com
Elaborada con material de autores Anónimos y elaboración propia.
El presente material se promueve con fines completamente
educativos, por lo que el Autor no se responsabiliza de malos usos o
de usos de terceros.

También podría gustarte