miércoles, 2 de septiembre de 2009

Los Modulos y el Kernel

Hace mucho que no posteo nada, les cuento que recientemente he estado haciendo algunos experimentos con los driver de mi tarjeta de red wireless... una abg3945 de intel.

El tema es que con los drivers libres (iwl3945) no se pueden inyectar paquetes por lo que se hacia necesario instalar drivers privativos (ipw3945). En fin, eh encontrado muchos tutoriales en la red sobre como hacerlo, sin embargo, los tutoriales dan recetas paso a paso sin explicar mucho para que sirve cada cosa. Es por eso que eh estado investigando un poquito, y eso es de lo que se trata este post.

En primer lugar el comando lsmod sirve para desplegar la información referente a los módulos que están habilitados por el kernel del sistema. Recordemos que un sistema operativo es el encargado de organizar el uso de los dispositivos por las aplicaciones, por lo cual, esta interaccion se realiza a través de los controladores o del kernel.


Si el kernel soporta cierto dispositivo, es necesario configurar un controlador (normalmente esto se realiza durante la instalación del sistema, y es habitual que sea necesario actualizar algún modulo o el kernel completo cuando hay una actualización en el hardware).

El codigo fuente del kernel cuenta con controladores para diferentes dispositivos, por eso cuando se compila una version, algunos de estos controladores se unen con el kernel (estáticos) otros quedan como "módulos" (esos de los que estabamos hablando antes) que se pueden cargar o descargar mientras el kernel está operando (dinamicos).

Lo ante dicho es muy importante, en mi ejemplo, los drivers de la tarjeta wifi estan cargados como módulos, por eso es posible cargar uno u otro, de otra forma habría que compilar un kernel
para cada caso (o tener varios kernel disponibles a los cuales acceder mediante el grub... opcion interesante no?).

Para configurar un dispositivo controlado por un modulo, se puede emplear modutils o modconf.
Estos comandos sirven para controlar conflictos, encontrar un módulo o pasar opciones.

Pueden encontrar más información al respecto en:

http://structio.sourceforge.net/guias/AA_Linux_colegio/kernel-y-modulos.html

martes, 11 de agosto de 2009

Script "Hola Mundo" en Bash

OK, estoy tratando de aprender a progamar en bash... aunque no es un lenguaje de programación, o lo es pero a un altísimo nivel; algunos lo consideran adecuado para aprender algunos conceptos básicos de la programación. Veamos el ejemplo:
#!/bin/bash
CAD="Hola Mundo"
echo $CAD

Vemos en este pequeño codigo tres elementos. La primer linea de codigo contiene la información del interprete (lo mismo sucede cuando programamos scripts en algún otro lenguaje interpretado, simplemente necesitamos indicarle al SO que interprete debe usar)

En segundo lugar, observamos la declaración de la variable CAD. Esto es algo que aprendi hace poco: un programa encesita variables que van cambiando de estado, antes que nada, uno declara las variables que el programa va a usar (como las dim en Basic?).

En tercer lugar hacemos algo con las variables declaradas, es el programa en si. Lo que hacemos en este caso es imprimir (con echo) la variable CAD declarada anteriormente.

El mismo resultado se ubiese obtenido con:
#!/bin/bash#!/bin/bash
echo"Hola Mundo"

Pero se perdería el concepto de programación antes descripto.

Recordad que para ejecutar el script se utiliza "./script.sh" (ojo, antes darle permiso de ejecución.


Nota:
Aunque en linux las extensiones de archivo no son necesarias para el SO, quizas sea una buena idea para el usuario.

El siguiente ejemplo es un script para realizar una copia de seguridad:
#!/bin/bash
OF=/var/mi-backup-$(date +%Y%m%d).tgz
tar -cZf $OF /home/yo/

Ya nos vamos familiarizandonos con la estructura verdad?. La variable OF es un nombre de archivo, que varía según la fecha actual. Luego se utiliza el comando tar para comprimir el home del usuario (no es TAN bueno backupear todo el home... pero...) con el nombre de la variable, es decir, la fecha en que se realiza el Back Up.

lunes, 27 de julio de 2009

Enlaces simbólicos

Un buen punto de partida para los novatos: son faciles de entender y no hace falta preocuparse por las particiones (los enlaces duros o hard links solo funcionan si cuando enlazan dentro de la particion).

El comando para crear un enlace es ln. para crear un enlace simbolico usamos la opcion-s:

$ ln -s archivoobjetivo nombredelenlace

En el ejemplo debajo, el usuario freddy crea un enlace en un subdirectorio de su directorio home hacia un directorio en otra parte del sistema:

freddy:~/music> ln -s /opt/mp3/Queen/ Queen
freddy:~/music> ls -l
lrwxrwxrwx 1 freddy freddy 17 Jan 22 11:07 Queen -> /opt/mp3/Queen

Los enlaces simbolicos son siempre archivos muy chicos, mientras que un enlace duro tendra el mismo tamaño que el archivo original.

La aplicacion de los enales simbolicos es muy amplia. Usualmente se usan para guardar espacio en el disco cuando se hace una copia de un archivo cuando se quiere satisfacer la necesidades de algun requerimiento de un nuevo programa, el cual necesita que un archivo este ubicado en otro lugar, o tambien para arreglar scripts que seran usados en otro ambiente en el que funcionaba. Si un administrador de sistema decide mover un directorio home a una nueva ubicacion, pero manteniendo todo funcionando como antes.

viernes, 24 de julio de 2009

Colores Hexadecimales para edición en HTML

Bueno, al fin me puse a jugar un poco con HTML, modifique el fondo del blog por este colorcito naranjita que tanto me gusta.
Para hacerlo basta ir a "modificar plantilla HTML" y cambiar el valor de algunas variables. Los colores se definen mediante notacion hexadecimal, abajo les dejo un link muy util.

http://html-color-codes.info/codigos-de-colores-hexadecimales/

jueves, 16 de julio de 2009

miércoles, 15 de julio de 2009

"less is more"



  • Al principio fue cat, donde los caracteres saltaban por la pantalla de una manera descontrolada.
  • Entonces fue pg, el cual ponia el texto de una pagina por vez.
  • El programa more es una version revisada de pg.
  • less es la version GNU de more, con algunas funcionalidades adicionales.

Nota: ver mas informacion con $ man less

El Comando Grep

grep es un comando que sirve para filtrar lineas de texto. Hay literalmente miles de usos para el uso del comando grep. En el ejemplo debajo, jerry usa grep para obtener información sobre el uso del comando find:

jerry:~> grep -a find .bash_history
find . -name userinfo
man find
find ../ -name common.cfg

La mayoría de los UNIXes tienen un diccionario online, como Linux. El diccionario es una lista de palabras conocidas en un archivo llamado words en /usr/share/dict. De modo que podemos usar el comando grep para chequear que una palabra este escrita correctamente:

william:~> grep penguin /usr/share/dict/words
penguin
penguins

Algunas distribuciones también ofrecen el comando dict.

También se puede usar para buscar información sobre un usuario:

lisa:~> grep gdbruyne /etc/passwd
gdbruyne:x:981:981:Guy Debruyne, tel 203234:/home/gdbruyne:/bin/bash

martes, 7 de julio de 2009

Nikto

Nikto es un escaneador para servidores web realizado en lenguaje Perl, obviamente tiene licencia Open Source GPL y realiza todo tipo de pruebas de ataques y vulnerabilidades por medio de un extensible sistema de plugins.

Nikto es un excelente punto de partida para comprobar la seguridad del servidor web a nuestro cargo, que funciona tanto en Linux como en Windows y tiene una gran base de datos de ataques (CGI y otros) en 230 tipos de servidores distintos.

Este programa busca fallos en diferentes categorías, algunas de estas son:

1.Problemas de configuración.

2.Archivos por defecto y ejemplos

3.Archivos y scripts inseguros

4.Versiones desactualizadas de productos.

Es utilizado tanto para seguridad como para buscar vulnerabilidades en servidores. Nikto utilizado como herramienta de seguridad tiene la capacidad de no sólo probar vulnerabilidades de CGI sino también que lo hace de forma evasiva, evitando los sistemas de detección de intrusos.

USO

$ nikto –h <URL de la Web a examinar>

Esta sería la opción por defecto, en la que se analizaría la dirección de la Web a examinar indicada. Con el parámetro "–h" le indicamos la web que queremos analizar.

Se podrían por ejemplo especificar más parámetros, como los puertos a escanear, mediante el parámetro "–p".Cuando no se especifica un puerto en concreto se analiza en 80. Se puede indicar más de un puerto separándolos por comas, la sentencia sería de la siguiente forma:

$ nikto.pl –h <URL de la Web a examinar> –p <Número
Puerto>,<Número Puerto>

Mediante la opción "–o" (output) se indica el directorio donde se guardará la salida del testeo y mediante la opción "–f" el formato, por defecto se nos guardará con formato "txt", aunque también se pueden seleccionar otros como "xml" o "hmtl".

Con el comando "–help", nos muestra las distintas opciones de Nikto.

Se puede actualizar Nikto mediante lel parámetro "-update". Se introduciría el comando –evasion seguido del número de la técnica deseada.

1.- Codificación arbitraria de la URI(no-UTF8)

2.- Autoreferencia de directorio (/./)

3.- Final de URL prematuro

4.– Anteponer cadena larga aleatoria.

5.- Parámetro falso

6.- ETIQUETA como espaciador de petición

7.- Cambiar el caso del URL

8.- Separador de directorio de Ventanas (\)

jueves, 2 de julio de 2009

Mplayer

Mplayer es una aplicacion muy pontente que permite, entre otras cosas, reproducir medios en una consola. Basta ver la cantidad de paginas de manual que tiene (+ de 6000) para tener una idea de la potencia de esta aplicacion.
Como hace mucho que no posteo nada, e decidido postear unos pequeños truquitos para jugar un poco.

Para reproducir un video:

$ mplayer -vo fbdev -fs "mivideo.avi"

Donde -vo es el modo de reproducción y -fs significa fullscreen

Con este comando podremos reproducir el video a traves del framebuffer... en caso de que no funcione (porque el framebuffer no esta compilado en el kernel) podemos con con

$ mplayer -vo help

para ver que opciones de reproducción tenemos. Una muy interesante es:

$ mplayer -vo caca -fs "mivideo.avi"

o

$ mplayer -vo aa -fs "mivideo.avi"

Con estos comandos, el tamaño de video dependera de la resolución. Para hacer un zoom y adaptarlo al tamaño de pantalla podemos utilizar la opcion "-zoom -x 640 -y 480"

Es pero que se diviertan!

miércoles, 24 de junio de 2009

viernes, 19 de junio de 2009

La revolución de los SO

Los subtítulos no son de los mejores peeeeeroo.... igual hay versiones mejores que pueden buscar en youtube, o tambien para descargar. El documental es muy recomendable.

Parte 1



Parte 2



Parte 3



Parte 4



Parte 5



Parte 6



Parte 7



Parte 8



Parte 9

jueves, 18 de junio de 2009

Sniffers

Un sniffer (o husmeador de paquetes) es un software o hardware que captura trafico de red. Este tráfico puede ser analyzado para determinar problemas en una red, como cuellos de botella o degradación en su performance. Tambien puede confirmar un ataque por parte de un hacker. Si uno sospecha que un sistema esta bajo ataque, puede capturar paquetes dentro de un dispositivo para identificar que tipo de paquetes estan "golpeando" al sistema, como también su origen. Una vez que el problema esté determinado, el administrador podrá crear los cambios necesarios para asegurar la red.

Los sniffers capturan paquetes de un dispositivo especifico, o de todos, dependiendo de como esté configurado. Por default, visualizan todo el trafico capturado de una red. Como sea, usualmente resulta en demasiado trafico para poder ser analizado. Por eso, los sniffers permiten aplicar filtros para capturar solo ciertos paquetes que cumplan con algún criterio. Por ejemplo, uno puede estar interesado en capturar paquetes de un cliente y un servidor determinado, para evaluar el tiempo de respuesta, o determinar por que un cliente en particular no puede acceder al servidor. Los sniffers permiten hacer a través de la introducción de los IP correspondientes.

En Linux, los sniffers mas populares son:

TCPdump: Es una herramienta de monitoreo de trafico de red por linea de comandos. Ha sido utilizado desde hace tiempo y muchos sniffers gráficos lo utilizan por debajo. (ver www.tcpdump.org)

Ethereal: Herramienta de monitoreso gráfica, un poco mas amigable que tcpdump. Permite ver paquetes en tiempo real y utiliza muchos comandos y opciones de tcpdump para el filtrado. Una vez que los datos son capturados, Ethereal permite ver cada paquete y sus encabezados. Las descripciones de los encabezados estan resumidas. Tambien permite reconstruir una cadena TCP. Visualiza trafico en tiempo real al mismo tiempo que guarda la información en un archivo. (ver www.ethereal.com).

EtherApe: Herramienta de monitoreo gráfica. A diferencia de Ethereal, EtherApe muestra la actividad de red en forma grafica identificando los Host y sus enlaces entre host. Los enlaces son codificados por colores y cambian cuando el tipo de conexión cambia. Muestra trafico en tiempo real mientras guarda en un archivo. (ver http://etherape.sourceforge.net).

viernes, 12 de junio de 2009

Creando un Niño

Bueno ya suficiente por hoy... otro videito que vi hace un tiempo y me gusto.

Sistemas Operativos

Interesante y Graciosa analogía

El Código Linux

Aqui les dejo un documental que vi hace tiempo, me parecio muy didactico.

miércoles, 10 de junio de 2009

find y locate

Estas son herramientas reales, usadas cuando buscamos en otros PATH. El comando find, conosido de UNIX, es muy util aunque pude causar algunos problemas por la dificultad de la sintaxis. Este comando no solo permite buscar un archivo por el nombre, sino tambien por tamaño, fecha de ultimos cambios y otras propiedades del archivo. La Forma mas comun es:

find path -name cadena

Que puede ser interpretado como "busca en todos los directorios y subdirectorioscontenidos en path, y muestra aquellos que contengan cadena en su nombre".


Otra aplicacion de find es buscar archivos de un tamaño determinado.
En el ejemplo debajo, peter quiere buscar archivos contenidos en el directorio
actual (y subdirectorios) que superen los 5 mb:

peter:~> find . -size +5000k
psychotic_chaos.mp3


Si buscan en las paginas de manual, encontrarán que find puede ejecutar
operaciones sobre los archivos encontrados. Por ejemplo, borrarlas. Lo primero sera
testear, sin la opcion -exec, que los archivos son los correctos.


peter:~> find . -name "*.tmp" -exec rm {} \;
peter:~>

Años mas tarde fue desarrollado locate. Este comando es mas facil de usar, pero tiene menos funcionalidades que find ya que su salida esta basada en una base de datos de archivos que es actualizada una vez al dia. Por el otro lado, locateutiliza menos recursos que find y muestra los resultados casi instantaneamente.


La mayoria de las distribuciones Linux usan slocate en estos dias, que es la version moderna de locate y no permite que los usuarios lean ciertos directorios a los que no tengan accesso (a menos que sean root). En la mayoria de los sistemas, locate es un enlace al programe slocate:


billy:~> ls -l /usr/bin/locate
lrwxrwxrwx 1 root slocate 7 Oct 28 14:18 /usr/bin/locate -> slocate*

lunes, 8 de junio de 2009

Algunos Comandos Interesantes

El comando sort

Este comando se utiliza para ordenar líneas de texto a partir de varios criterios, su sintaxis es similar a la de todos los comandos:

$ sort [opción...] [archivo...]


Si no se le provee al menos un argumento archivo, este comando tomará su entrada de la entrada estándar. El criterio de orden que utiliza sort por defecto es alfabético, esto se debe tener en cuenta siempre que se necesite ordenar listas de números, si no se le especifica a sort que debe ordenar numéricamente, tomará a los números como una lista de palabras y el resultado no será el deseado. Por ejemplo, alfabéticamente el número 10 está antes que el número 2.

La lista de opciones de sort es la siguiente:

-c Chequear si el/los archivos están ordenados, pero no ordenar.
-d Considerar únicamente los caracteres alfanuméricos.
-n Utilizar criterio numérico de ordenamiento.
-o ARCHIVO Escribir el resultado en ARCHIVO en lugar de enviarlo a la salida estándar.
-r Devolver el resultado inverso del ordenamiento.
-t SEP Utilizar SEP como separador en lugar de un espacio en blanco.
-T DIR Usar DIR como directorio temporal en lugar de /tmp.

El comando less

Este comando es de mucha utilidad, su función es paginar texto en pantalla. Muchas veces ocurre que cuando se ejecuta algún comando, la salida del mismo es demasiada información como para que se pueda leer en la pantalla del monitor, entonces se puede redireccionar esta salida al less para que permita al usuario leer sin mayores problemas, pudiendo avanzar o retroceder en el texto con las flechas de cursor del teclado. También se utiliza para visualizar archivos de texto almacenados en disco.

La idea de less proviene de un paginador llamado more, un clásico en los UNIX. El more no era lo suficientemente amigable, es por eso que hicieron less. Su sintaxis es la siguiente:

$ less [archivo...]

Este comando es un programa interactivo, es por eso que no se hablará de argumentos sino de comandos:

[ESPACIO] Si se oprime la barra espaciadora, el less avanzará un número de líneas igual al número de líneas por pantalla que posea la terminal que se esté usando.
[ENTER] Pulsando la tecla ENTER se va avanzando de a una línea.
[G] Ir al final del texto.
[g] Ir al inicio del texto.
[/] Ingresar una palabra a ser buscada avanzando dentro del texto.
[?] Ingresar una palabra a ser buscada retrocediendo dentro del texto.
[n] Buscar la siguiente ocurrencia de la búsqueda.
[AvPág] Avanzar una pantalla de texto.
[RePág] Retroceder una pantalla de texto.
[v] Cargar el editor de texto en el lugar donde se encuentre el usuario dentro del archivo. El editor que normalmente se utiliza es el vi.
[q] Salir del programa.
[R] Repintar la pantalla. Útil cuando se está visualizando un archivo que ha sido modificado por otro programa.

El comando head

Escribe por salida estándar la primer parte de un archivo. Su sintaxis es como sigue:

$ head [opción...] [archivo...]

Si no se especifica el argumento archivo, este comando tomará su entrada de la entrada estándar. La lista de opciones mas importantes sigue a continuación:

-c N Escribe los primeros N bytes.
-n N Escribe las primeras N líneas en vez de las primeras 10 (que es el valor predeterminado).

El comando tail

Este comando es al head como el less es al more. El comando tail escribe a la salida estándar la última parte de un archivo. Su sintaxis es:

$ tail [opción...] [archivo...]


Al igual que head, si no se le proporciona un argumento archivo, este comando tomará su entrada desde la entrada estándar. Alguna de sus opciones son las siguientes:


-c N Escribe los últimos N bytes.
-n N Escribe las últimas N líneas.
-f Escribir la última parte del archivo a medida que va creciendo. Esta opción es muy útil para monitorear archivos de registro que van creciendo con el tiempo.

El comando grep

Escribir en salida estándar aquellas líneas que concuerden con un patrón. Su sintaxis es como sigue:

$ grep [opciones] PATRÓN [ARCHIVO...]
$ grep [opciones] [-e PATRÓN | -f ARCHIVO] [ARCHIVO...]

Este comando realiza una búsqueda en los ARCHIVOs (o en la entrada estándar, si no se especifica ninguno) para encontrar líneas que concuerden con PATRÓN. Por defecto grep imprime en pantalla dichas líneas. Sus opciones mas interesantes son:

-c Modifica la salida normal del programa, en lugar de imprimir por salida estándar las líneas coincidentes, imprime la cantidad de líneas que coincidieron en cada archivo.
-e PATRÓN Usar PATRÓN como el patrón de búsqueda, muy útil para proteger aquellos patrones de búsqueda que comienzan con el signo «-».
-f ARCHIVO Obtiene los patrones del archivo ARCHIVO.
-H Imprimir el nombre del archivo con cada coincidencia.
-r Buscar recursivamente dentro de todos los subdirectorios del directorio actual.


El patrón de búsqueda normalmente es una palabra o una parte de una palabra.
También se pueden utilizar expresiones regulares, para realizar búsquedas mas flexibles, por ejemplo, si se quisiera buscar la ocurrencia de todas las palabras que comiencen con «a» minúscula, la ejecución del comando sería algo así:

usuario@maquina:~/$ grep a* archivo


El tema de manejo de expresiones regulares es bastante largo y complejo, mas adelante se dará con mas detalle.

El comando find

Se utiliza este comando para buscar archivos dentro de una jerarquía de directorios. La búsqueda, como veremos mas adelante, se puede realizar mediante varios criterios. La sintaxis de este comando es:

$ find [camino...] [expresión]


La expresión se conforma de opciones, pruebas y acciones. En este manual no enumeraremos todas las opciones, pruebas y acciones de este comando, sino las expresiones que son mas cotidianas, dejamos al alumno para que investigue todo el potencial de este comando mediante la lectura de la página de manual por medio de la ejecución del siguiente comando:


$ man find

Algunos de los criterios de búsqueda que se pueden utilizar son:

$ find CAMINO -name ARCHIVO
$ find CAMINO -name ARCHIVO -perm MODO

ARCHIVO corresponde al nombre entero o en parte del archivo que se está buscando, MODO son los permisos del archivo a buscar representados en octal.

El comando whereis

Este comando se utiliza para localizar el archivo binario, el código fuente y la página de manual de un determinado comando. Su sintaxis es como sigue:

$ whereis [opciones] archivo...


La lista de opciones mas utilizadas es:


-b Buscar solamente el archivo binario.
-m Buscar solamente la página manual.
-s Buscar solamente el código fuente.
Como ejemplos, se ve lo siguiente:


usuario@maquina:~/$ whereis -m whereis
whereis: /usr/share/man/man1/whereis.1.gz
usuario@maquina:~/$ whereis man
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man5/passwd.5.gz


En el primer ejemplo se ha pedido la página de manual del mismo comando whereis, mientras que en el segundo se han pedido todos los archivos que tengan que ver con el comando passwd.

El comando locate

locate es un comando de búsqueda de archivos, bastante parecido al comando anteriormente visto, el find. La diferencia de locate es que la búsqueda la hace en una base de datos indexada para aumentar significativamente la velocidad de respuesta. Esto quiere decir, que locate realmente no busca en el disco del sistema, sino que en un archivo con la lista de todos los archivos que existen en el GNU/Linux. Generalmente todas las distribuciones de GNU/Linux ejecutan a una hora determinada (generalmente cerca de las 4:00am, ya que tarda algún tiempo realizar esta tarea) un comando para actualizar la base de datos que utiliza locate, dicho comando se llama updatedb. Su sintaxis es:

$ locate PATRÓN

Donde PATRÓN corresponde al mismo tipo de patrón que en el comando find. Ejemplo de ejecución:

usuario@maquina:~/$ locate locate
/usr/bin/locate
/usr/lib/locate
/usr/lib/locate/bigram
/usr/lib/locate/code
/usr/lib/locate/frcode
/usr/share/doc/kde/HTML/en/kcontrol/kcmlocate.docbook.gz
/usr/share/doc/xlibs-dev/XdbeAllocateBackBufferName.3.html
/usr/share/doc/xlibs-dev/XdbeDeallocateBackBufferName.3.html
/usr/share/doc/xlibs-dev/XtAllocateGC.3.html
/usr/share/emacs/20.7/lisp/locate.elc
/usr/share/gnome/help/gsearchtool/C/locate.png
/usr/share/man/man1/locate.1.gz
/usr/share/man/man5/locatedb.5.gz
/usr/X11R6/man/man3/XdbeAllocateBackBufferName.3x.gz
/usr/X11R6/man/man3/XdbeDeallocateBackBufferName.3x.gz
/usr/X11R6/man/man3/XtAllocateGC.3x.gz
/var/lib/locate
/var/lib/locate/locatedb
/var/lib/locate/locatedb.n

Como se puede observar en el ejemplo, locate ha listado todos aquellos archivos que posean la palabra «locate» en su nombre (los directorios están incluidos).

miércoles, 3 de junio de 2009

Buscar Archivos (1)

Utilizando algunas caracteristicas del shell

Primero veremos como podemos manipular varios archivos de una sola vez, de modo que la consola interprete los requerimientos entre corchetes "[ ]" y substitya la expresión contenida por los archivos correspondientes. Por ejemplo, al indicar un rango de numeros, o al sustituir los caracteres por un asterisco.


Todas las sustituciónes pueden realizarse simultaneamente; la consola Bash, por ejemplo, no tiene problemas con expresiones como ls dirname/*/*/*[2-3].

El asterisco es usado comunmente para minimizar el esfuerzo de tipeo: por ejemplo, se puedeutilizar $ cd dir* en lugar de $ cd directory. En bash, no es necesario porque las consolas GNU tienen una caracteristica llamada completar nombre de archivo. Esto quiere decir, que uno puede tipear los primeros caracteres de un comando o un archivo y el shell encontrara y sugerira que significa. Por ejemplo, en un directorio conteniendo varios archivos, uno puede tipear $ ls A y presionando la tecla [TAB] dos veces en lugar de [ENTER]. Si solo hay un archivo que comience con la letra "A", este sera mostrado como argumento del comando lsinmediatamente.


El comando Which

Una manera simple de buscar archivos es utilizar el comando which para buscar en los directorios listados en el PATH del usuario. Se recuerda que el PATH contiene
los directorios de busqueda que contienen programas ejecutables, por lo que which no funcionara con archivos ordinarios. El comando which es util a la hora de solucional problemas del tipo "command not found". En el ejemplo debajo, el usuario tina no puede usar el programa acroread, mientras que su colega si puede. El colega de tina le dice que puede ver el programa en el directorio /opt/acroread/bin, pero este no esta en su PATH.

tina:~> which acroread
/usr/bin/which: no acroread in (/bin:/usr/bin:/usr/bin/X11)

El problema puede ser resuelto dandole el path completo al ejecutar el programa o agregar el directorio al PATH de tina exportandoesta variable:

tina:~> export PATH=$PATH:/opt/acroread/bin
tina:~> echo $PATH
/bin:/usr/bin:/usr/bin/X11:/opt/acroread/bin

Usando el comando which podemos comprobar si un comando es un alias de otro comando:



gerrit:~> which -a ls
ls is aliased to `ls -F --color=auto'
ls is /bin/ls

martes, 2 de junio de 2009

Archivos de configuración

La mayoría de los archivos de configuración estan almacenados en eldirectorio /etc. El contenido de cada archivo puede ser visto con el comando$ cat, que enviará el contenido del archivo al dispositivoestandar de saluda (el monitor).

Haremos un repaso de los archivos de configuracion mas comunes, aunque esta no es una lista esahustiva, los archivos de configuracion suelen estan bien comentados, por lo que la lectura de los mismos bastará. Algunos archivos tienen paginas de manual con información extra, como $ man group.










ArchivoInformación / Servicio
apacheArchivo de configuración del servidor de web Apache
bashrcArchivo de Configuracion para el Bourne Again SHell. Define funciones y alias para todos los usuarios. Otras Shells pueden tener sus propios archivos de configuración, como cshrc.
crontab y los directorios cron.*Configuración de tareas que necesitan ser ejecutadas periodicamente (como Backups, actualizaciones del sistema, limpieza, logs, etc.).
defaultOpciones por deault de algunos comandos especificos, como useradd
filesystemsSistemas de archivos
fstabLista particiones y sus puntos de montaje
ftp*Configuracion del servidor ftp: quien puede conectarse, a que partes del sistemase puede acceder, etc.
groupArchivo de configuracion de grupos de usuario. Usar las utilidades shadowgroupadd,groupmod y groupdel para editar este archivo. La edición manual solo debe realizarse solo si se sabe lo que se hace.
hostsContiene una lista de maquinas que pueden conectar usando la red, pero sin la necesidad de especificar un nombre de servicio de dominio. No tiene nada que ver con la configuración de red del sistema, la cual se encuentra en /etc/sysconfig.
inittabInformación de booteo: modo, cantidad de consolas, etc.
issueInformación sobre la distribución (version y kernel).
ld.so.confUbicación de librerias
lilo.conf silo.conf aboot.conf etc.Información de booteo del LInux LOader, el sistema de booteo fue cambiando gradualmente hasta ser reemplazado por el GRUB.
logrotate.*Rotación de Logs, es un sistema que previene la acumulación de grandes cantidades de archivos de log.
mailDirectorio que contiene instrucciones sobre el comportamiento del servidor de mail.
modules.confConfiguración de modulos que activan dispositivos especiales (drivers).
motdMensaje del dia: muestra un mensaje a quien se conecte al sistema (en modo texto), puede ser usado por el administrador del sistema para anunciar mantenimientos del sistema, cortes, etc.
mtab Sistemas de archivos montados. Es recomendable NO editar este archivo
nsswitch.confOrdena con que solucionador de nombres contactar, cuando un proceso necesita resolver un nombre de host.
pam.dConfiguración de modulos de utenticación
passwdLista de usuarios locales. Usar las utilidades shadow groupadd,groupmod y groupdel para editar este archivo. La edición manual solo debe realizarse solo si se sabe lo que se hace.
printcapDesactualizado pero frecuentemente utilizado archivo de configuración de impresión.No editar manualmente
profileConfiguración del entorno: varialbes, propiedades por defecto de archivos nuevos, limitación de recursos, etc.
rc*Directorios definiendo los servicios activos según el run level
resolv.confOrden de conexión a los DNS.
sendmail.cfArchivo de configuración principal del servidor de mail I>Sendmail.
servicesPuertos Abiertos
sndconfigoSoundConfiguración de la tarjeta de sonido y sonidos del sistema
sshDirectorio que contiene los archivos de configuración de SSH (Secure SHell).
sysconfigDirectorio que contiene los archivos de configuración del sistema: Mouse, teclado, red, escritorio, reloj, energia, etc.
X11Configuracion del servidor de ventanas X. RedHat usa XFree (que utiliza el archivo Xfree86Config).
xinetd.* or inetd.confArchivos de configuración de servicios de internet que corren desde demonios del sistema (no corren demonios independientes)

lunes, 1 de junio de 2009

el "PATH"

Cuando queremos que el sistema ejecute un comando, casi nunca tenemos que darle la ruta de acceso al comando (o path). Por ejemplo, sabemos que el comando $ ls esta en el directorio /bin (lo pueden comprobar con $ wich -a ls ), tampoco tenemos que ingresar el comando como $ /bin/ls para que la computadora liste el directorio en el que estamos.

La variable de entorno PATH se ocupa de esto. Esta variable lista aquellos directorios en el systema donde los archivos ejecutables pueden ser encontrados, y esto le ahorra al usuario el trabajo de memorizar y tipear la ubicación de los comandos. Naturalmente, el path contiene algunos directorio con el nombre bin en sus nombres. El comando $ echo es usado para mostrar el contenido ("$") de la variable PATH:

rogier:> echo $PATH
/opt/local/bin:/usr/X11R6/bin:/usr/bin:/usr/sbin/:/bin

En este ejemplo, los directorios /opt/local/bin, /usr/X11R6/bin, /usr/bin, /usr/sbin y /bin son los los directorios donde el sistema busca, secuencialmente, cuando se le pide que
ejecute un comando. Al instante en que encuentra el comando, el sistema deja de buscar, aún si no ha buscado en todos los directorios. Esto, pude llevar a alguna situacion extraña. En el primer ejemplo arriba, el usuario sabe que hay un programa llamado sndsms para enviar mensajes SMS. Otro usuario pude utilizar este programa pero éste no. La diferencia se encuentra en la configuración del PATH:

[jenny@blob jenny]$ sendsms
bash: sendsms: command not found
[jenny@blob jenny]$ echo $PATH
/bin:/usr/bin:/usr/bin/X11:/usr/X11R6/bin:/home/jenny/bin
[jenny@blob jenny]$ su - tony
Password:
tony:~>which sendsms
sendsms is /usr/local/bin/sendsms
tony:~>echo $PATH
/home/tony/bin.Linux:/home/tony/bin:/usr/local/bin:/usr/local/sbin:\
/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin

Notar el uso de su (por switch user), que permite correr una consola en el entorno de otro usuario, siempre y cuando se conozca la clave de dicho usuario.

La barra invertida indica la continuación de una linea en el siguiente renglon.


En el siguiente ejemplo, un usuario quiere usar el comando wc (word count) para chequear el numero de lineas en un archivo, pero nada sucede y el usuario debe cancelar el proceso con [Ctrl]+[c]:

jumper:~> wc -l test
(Ctrl-C)
jumper:~> which wc
wc is hashed (/home/jumper/bin/wc)
jumper:~> echo $PATH
/home/jumper/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:\
/usr/bin:/usr/sbin:/bin:/sbin

El uso del comando $ wich nos muestra que el usuario tiene un directorio bin en su home, conteniendo un programa tambien llamado wc. Como este programa esta en su directorio home es encontrado primero cuando el sistema busca a través del path, entonces este "home-made" programa es ejecutado en lugar del comando wc original. Existen varias maneras de solucionar este
problema (acorde a la filosofia UNIX): Una opcion sera renombral el programa
wc del usuario, o el usuario podria darle el path complete al solicitar la ejecución del programa wc, que puede ser encontrado utilizando $ which -a wc.

viernes, 29 de mayo de 2009

La realidad del sistema de archivos

Para la mayoría de las tareas realizadas por usuarios y administradores de sistemas, es suficiente con aceptar que los archivos y directorios estan estructurados en forma de arbol. Sin embargo, la computadora no entiende que es un arbol.

Cada particion tiene su propio sistema de archivos. Imaginando todos esos sistemas de archivos juntos, podemos formarnos una idea de estructura ramificada del sistema entero, pero no es tan simple como eso. En un sistema de archivos, un archivo esta representado por un inodo, una especie de numero de serie conteniendo información acerca de los datos reales que forman un archivo: a quien pertenece y donde esta localizado fisicamente en el disco duro.

Cada particion tiene su propio set de inodos; a traves de un sistema de multiples particiones, pueden existir archivos con el mismo número de inodo.

Cada inodo describe una estructura de datos en el disco duro, almacenando las propiedades de un archivo, incluyendo la ubicación fisica de los datos. Cuando un disco rigido es formateado, un número fijo de inodos por partición es creado. Este número es el máximo de archivos, no importa el tipo (incluyendo directorios, archivos especiales, enlaces, etc.) que pueden existir en la misma partición al mismo tiempo. Tipicamente se utiliza 1 inodo cada 2 a 8 kilobytes.

Cuando un archivo es creado, este toma un inodo libre. Ese inodo contiene la siguiente información:


  • Usuario y Grupo a quien pertenece el archivo.

  • Tipo de archivo (regular, directorio, etc.)

  • Permisos del archivo.

  • Fecha y hora de creación, última lectura y último cambio.

  • Cantidad de enlaces apuntando al archivo.

  • Tamaño del archivo.

  • Ubicación fisica del archivo.

La única información que no es ncluida en un inodo, es el nombre del archivo y del directorio. Este, es almacenado en el archivo especial de directorio. Comnparando nombres de archivo y números de inodos, el sistema puede crear una estructura ramificada (o tipo arbol) que el usuario pueda entender. los usuarios pueden visualizar el número de inodo usando

$ ls -i

El inodo tiene su propio espacio separado en el disco.

jueves, 28 de mayo de 2009

Puntos de Montaje

Todas las particiones estan "enganchadas" al sistema por medio de un punto de montaje.
Los puntos de montaje definen el lugar que ocupa un set de datos en particular dentro del sistema de archivos. Usualmente, todas las particiones estan conectadas a travez del la particion raiz (o root en ingles). Sobre esta partición, la cual es indicada por una barra "/", los directorios son creados. Durante el inicio del sistema, todas las particiones descritas en /etc/fstab son montadas automaticamente.
La infomacion acerca de las particiones del sistema pueden ser visualizadas usando:

$ df

(por "disk full" o "disk free"). Para que la formacion sea mas "legible" se utiliza la opcion:

$ df -h

(h por "human readable") El comando, solo muestra información acerca de particiones no SWAP activas. Lo cual incluye particiones de otros sistemas de la red, como por ejemplo los directorios "home" que son montados de un servidor. La salida del comando sera algo similar a:


Filesystem Size Used Avail Use% Mounted on
/dev/hda8 496M 183M 288M 39% /
/dev/hda1 124M 8.4M 109M 8% /boot
/dev/hda5 19G 15G 2.7G 85% /opt
/dev/hda6 7.0G 5.4G 1.2G 81% /usr
/dev/hda7 3.7G 2.7G 867M 77% /var
fs1:/home 8.9G 3.7G 4.7G 44% /.automount/fs1/root/home


Que muestra el dispositivo, tamaño, utilizado, disponible, porcentaje usado y punto de montaje respectivamente.

miércoles, 27 de mayo de 2009

Nmap (2)

Opciones Generales

No se requiere ninguna pero algunas de ellas pueden resultar de gran utilidad.


-p0 No intenta hacer ping a un servidor antes de escanearlo. Esto permite el escaneo de redes que no permiten que pasen peticiones (o respuestas)de ecos ICMP a traves de su firewall. microsoft.com es un ejemplo de una red de este tipo, y, por lo tanto, deberia usarse siempre -p0 o -PT80 al escanear microsoft.com.

-PT Usa el ping TCP para determinar que servidores estan activos. En vez de enviar paquetes de peticion de ecos ICMP y esperar una respuesta, se lanzan paquetes TCP ACK a traves de la red de destino (o a una sola maquina) y luego se espera a que lleguen las respuestas. Los servidores activos responden con un RST. Esta opcion mantiene la eficiencia de escanear unicamente aquellos servidores que se encuentran activos y la combina con la posibilidad de escanear redes/servidores que bloquean los paquetes ping. Para los usuarios no root se usa connect(). Para establecer el puerto de destino de los paquetes de prueba use -PT <numero de puerto). El puerto por defecto es el 80, dado que normalmente este puerto no es un puerto filtrado.

-PS Esta opcion usa paquetes SYN (peticion de conexion) en vez de los paquetes ACK para usuarios root. Los servidores activos deberian responder con un RST (o, en raras ocasiones, un SYN|ACK).

-PI Esta opcion usa un paquete ping (peticion de eco ICMP) verdadero. Encuentra servidores que estan activos y tambien busca direcciones de broadcast dirigidas a subredes en una red. Se trata de direcciones IP alcanzables desde el exterior que envian los paquetes IP entrantes a una subred de servidores. Estas direcciones deberian eliminarse, si se encontrase alguna, dado que suponen un riesgo elevado ante numerosos ataques de denegacion de servicio (el mas corriente es Smurf).

-PB Este es el tipo de ping por defecto. Usa los barridos ACK ( -PT ) e ICMP ( -PI ) en paralelo. De este modo se pueden alcanzar firewalls que filtren uno de los dos (pero no ambos).

-O Esta opcion activa la deteccion remota del sistema operativo por medio de la huella TCP/IP. En otras alabras, usa un punado de tecnicas para detectar sutilezas en la pila de red subyacente del sistema operativo de los servidores que se escanean. Usa esta informacion para crear una 'huella' que luego compara con una base de datos de huellas de sistemas operativos conocidas (el archivo nmap-os-fingerprints) para decidir que tipo de sistema se esta escaneando.

-I Esta opcion activa el escaneo TCP de identificacion contraria. Tal y como comenta Dave Goldsmith en un correo Bugtrat de 1996, el protocolo ident (rfc 1413) permite la revelacion del nombre del usuario propietario de cualquier proceso conectado via TCP, incluso aunque ese proceso no haya iniciado la conexion. De este modo se puede, por ejemplo, conectar con el puerto http y luego usar identd para descubrir si el servidor esta ejecutandose como root. Esto solo se puede hacer con una conexion TCP completa con el puerto de destino (o sea, la opcion de escaneo -sT). Cuando se usa -I, se consulta al identd del servidor remoto sobre cada uno de los puertos abiertos encontrados en el sistema. Por supuesto, esto no funcionara si el servidor en cuestion no esta ejecutando identd.

-f Esta opcion hace que el escaneo solicitado de tipo SYN, FIN, XMAS, o NULL use pequenos paquetes IP fragmentados. La idea consiste en dividir la cabecera TCP en varios paquetes para ponerselo mas dificil a los filtros de paquetes, sistemas de deteccion de intrusion y otras inconveniencias por el estilo que tratan de saber lo uno esta haciendo. iTenga cuidado con esto! Algunos programas tienen problemas a la hora de manejar estos paquetes tan pequenos. Mi sniffer favorito produjo un error de segmentacion inmediatamente despues de recibir el primer fragmento de 36 bytes. ¡Despues de este viene uno de 24 bytes! Mientras que este metodo no podra con filtros de paquetes y firewalls que ponen en cola todos los fragmentos IP (como en el caso de la opcion CONFIG_IP_ALWAYS_DEFRAG en la configuracion del kernel de Linux), tambien es verdad que algunas redes no pueden permitirse el efecto negativo que esta opcion causa sobre su rendimiento y por lo tanto la dejan desactivada.
Notese que no he coseguido que esta opcion funcione con todos los sistemas. Funciona bien con mis sistemas Linux, FreeBSD y OpenBSD y algunas personas han informado de exitos con otras variantes *NIX.

-v Modo de informacion ampliada. Esta opcion resulta muy recomendable y proporciona gran cantidad de informacion sobre lo que esta sucediendo. Puede usarla dos veces para un efecto mayor. iUse -d un par veces si lo que quiere es volverse loco haciendo scroll en su pantalla!

-h Esta opcion tan practica muestra una pantalla de referencia rapida sobre las opciones de uso de nmap. Quizas haya notado que esta pagina de manual no es precisamente una "referencia rapida" :)

-o <nombre_de_archivo_de_registro>
Esta opcion guarda los resultados de sus escaneos en forma humanamente inteligible en el archivo especificado como argumento.

-m <nombre_de_archivo_de_registro>
Esta opcion guarda los resultados de sus escaneos en un formato comprensible para una maquina en el archivo especificado como argumento.

-i <nombre_de_archivo_de_entrada>
Lee especificaciones de servidores o redes de destino a partir del archivo especificado en vez de hacerlo de la linea de comandos. El archivo debe contener una lista de expresiones de servidores o redes separadas por espacios, tabuladores o nuevas lineas. Use un guion (-) como nombre_ de_archivo_de_entrada si desea que nmap tome las expresiones de servidores de stdin. Vease la seccion Especificacion de Objetivo para mas informacion sobre expresiones con las que poder completar este archivo.

-p <rango de puertos>
Esta opcion determina los puertos que se quieren especificar. Por ejemplo, '-p 23' probara solo el puerto 23 del servidor(es) objetivo. '-p 20-30,139,60000-' escanea los puertos del 20 al 30, el puerto 139 y todos los puertos por encima de 60000. Por defecto se escanean todos los puertos entre el 1 y el 1024 asi como los que figuran en el archivo /etc/services.

-F Modo de escaneo rapido.
Implica que solo se desean escanear aquellos puertos que figuran en /etc/services. Obviamente esto resulta mucho mas rapido que escanear cada uno de los 65535 puertos de un servidor.

-D <senuelo1 [,senuelo2][,ME],...>
Especifica que se desea efectuar un escaneo con senuelos, el cual hace que el servidor escaneado piense que la red destino del escaneo esta siendo escaneada tambien por el servidor(es) especificados como senuelos. Asi, sus IDs pueden informar de entre 5 y 10 escaneos procedentes de direcciones IP unicas, pero no sabran que direccion IP les estaba escaneando realmente y cuales eran senuelos inocentes.
Separe cada servidor senuelo con comas, y puede usar opcionalmente 'ME' como senuelo que representa la posicion que quiere que ocupe su direccion IP. Si coloca 'ME' en la sexta posicion o superior, es muy poco probable que algunos escaneres de puertos comunes (como el excelente scanlogd de Solar Designer) lleguen incluso a mostrar su direccion IP. Si no se usa 'ME', nmap le colocara a usted en una posicion aleatoria. Notese que aquellos servidores usados como senuelos
deben escontrarse activos, o, de lo contrar o podria provocar un desbordamiento (flood) SYN en su objetivo. Por otra parte, resultara bastante facil saber que servidor esta escaneando si unicamente hay uno activo en la red.
Notese tambien que algunos (estupidos) "detectores de escaneres de puertos" opondran una firewall o bien denegaran el rutaje a aquellos servidores que intenten escanear sus puertos. De este modo se podria provocar inadvertidamente que la maquina que se esta intentando escanear perdiese contacto con los servidores usados como senuelos. Esto podria causarles a los servidores escaneados verdaderos problemas si los servidores senuelo fuesen, por ejemplo, su gateway a internet o incluso "localhost".
Deberia usarse esta opcion con extremo cuidado. La verdadera moraleja de este asunto es que un detector de escaneos de puertos que aparenten tener intenciones poco amistosas no deberia llevar a cabo accion alguna contra la maquina que aparentemente le esta escaneando. iPodria no ser mas que un senuelo! Los senuelos se usan tanto en el escaneo ping inicial (usando ICMP, SYN, ACK, o lo que sea) como en la fase de escaneo de puertos propiamente dicha. Tambien se usan los senuelos en la fase de deteccion remota del sistema operativo ( -O ).
Vale la pena destacar que el uso de demasiados senuelos puede ralentizar el proceso de escaneo y, potencialmente, hacer que sea menos exacto. Por otra parte, algunos ISPs filtraran los paquetes manipulados y los desecharan, aunque muchos (actualmente la mayoria) no ponen restricciones a este tipo de paquetes.

-S <Direccion_IP>
En determinadas circunstancias, es posible que nmap no sea capaz de determinar su (de usted) direccion IP de origen ( nmap se lo hara saber si este es el caso). En este caso, use -S con su direccion IP (del interfaz a traves del cual desea enviar los paquetes).
Otro posible uso de esta opcion es el de manipular el escaneo para hacer creer a los servidores de
destino que alguien mas les esta escaneando.
¡Imaginese a una compania escaneada repetidamente por una compania rival! Esta no es la funcion para la que se ha disenado esta opcion (ni su proposito principal). Simplemente pienso que revela una posibilidad que la gente deberia tener en cuenta antes de acusar a los demas de escanear sus puertos. La opcion -e sera necesaria en general para este tipo de uso.

-e <interfaz>
Le dice a nmap que interfaz ha de usar para enviar y recibir paquetes. El programa deberia detectar esto por si mismo, pero le informara si no es asi.

-g <numero_de_puerto>
Establece el numero de puerto de origen a usar en los escaneos. Muchas instalaciones de firewalls y filtros de paquetes inocentes hacen una excepcion en sus reglas para permitir que las atraviesen y establezcan una conexion paquetes DNS (53) o FTPDATA (20). Evidentemente esto contraviene completamente las ventajas en materia de seguridad que comporta una firewall dado que los intrusos pueden enmascararse como DNS o FTP con una simple modificacion de su puerto de origen. Por supuesto, deberia probarse primero con el puerto 53 para un escaneo UDP y los escaneos TCP deberian probar el 20 antes del 53.
Notese que el uso de esta opcion penaliza levemente el rendimiento del escaneo, porque a veces se almacena informacion util en el numero de puerto de origen.

-M <max sockets>
Establece el numero maximo de sockets que se usaran en paralelo para un escaneo TCP connect() (escaneo por defecto). Resulta util a la hora de ralentizar ligeramente el proceso de escaneo con el fin de evitar que la maquina de destino se cuelgue. Otra manera de hacerlo es usar -sS, que normalmente les resulta mas facil de asumir a las maquinas de destino. Especificacion de Objetivo Cualquier cosa que no es una opcion (o el argumento de una opcion) en namp se trata como una especificacion de servidor de destino. El caso mas simple consiste en especificar servidores aislados o direcciones IP en la linea de comandos. Si pretende escanear una subred de direcciones IP, entonces se puede anadir '/mask' a la direccion IP o al nombre del servidor. mask debe estar entre 0 (escanea toda Internet) y 32 (escanea unicamente el servidor especificado). Use /24 para escanear una direccion de clase 'C' y /16 para la clase 'B'. Nmap dispone tambien de una notacion mucho mas potente que permite la especificacion de direcciones IP usando listas/rangos para cada elemento.
De este modo, se puede escanear la red de clase 'B' completa 128.210.*.* especificando '128.210.*.*' o '128.210.0-255.0-255' o incluso notacion de mascara: '128.210.0.0/16'. Todas ellas son equivalentes. Si se usan asteriscos ('*'), ha de tenerse en cuenta que la mayoria de los shells requieren que se salga de ellos con caracteres / o que se les proteja con comillas.
Otra posibilidad interesante consiste en dividir Internet en el otro sentido. En vez de escanear todos los servidores en una clase 'B', se puede escanear '*.*.5.6-7' para escanear todas las direcciones IP terminadas en .5.6 o .5.7 Escoja sus propios numeros.

martes, 26 de mayo de 2009

Nmap (1)

Nmap es una herramienta de exploracion de red y escaner de seguridad.

$ nmap [Tipos(s)de escaneo] [Opciones] <servidor o red>

DESCRIPCION

Nmap ha sido disenado para permitir a administradores de sistemas y gente curiosa en general el escaneo de grandes redes para determinar que servidores se encuentran activos y que servicios ofrecen. nmap es compatible con un gran numero de tecnicas de escaneo como: UDP, TCP connect(), TCP SYN (half open), ftp proxy (bounce attack), Reverseident, ICMP (ping sweep), FIN, ACK sweep, Xmas Tree, SYN sweep, and Null scan. nmap proporciona tambien caracteristicas avanzadas como la deteccion remota del sistema operativo por medio de huellas TCP/IP , escaneo tipo stealth (oculto), retraso dinamico y calculos de retransmision, escaneo paralelo, deteccion de servidores inactivos por medio de pings paralelos, escaneo con senuelos, deteccion de filtrado de puertos, escaneo por fragmentacion y especificacion flexible de destino y puerto.

Se han hecho grandes esfuerzos encaminados a proporcionar un rendimiento decente para usuarios normales (no root). Por desgracia, muchos de los interfaces criticos del kernel (tales como los raw sockets) requieren privilegios de root. Deberia ejecutarse nmap como root siempre que sea posible.

OPCIONES

En general, pueden combinarse aquellas opciones que tengan sentido en conjunto. Algunas de ellas son especificas para ciertos modos de escaneo. nmap trata de detectar y advertir al usuario sobre el uso de combinaciones de opciones sicoticas o no permitidas.

Tambien puede ejecutar el comando $ nmap -h para una pagina de referencia rapida con un listado de todas las opciones.


Tipos de Escaneo

-sT Escaneo TCP connect(): Es la forma mas basica de escaneo TCP. La llamada de sistema connect() proporcionada por nuestro sistema operativo se usa para establecer una conexion con todos los puertos interesantes de la maquina. Si el puerto esta a la escucha, connect() tendra exito, de otro modo, el puerto resulta inalcanzable. Una ventaja importante de esta tecnica es que no resulta necesario tener privilegios especiales. Cualquier usuario en la mayoria de los sistemas UNIX tiene permiso para usar esta llamada.
Este tipo de escaneo resulta facilmente detectable dado que los registros del servidor de destino
muestran un monton de conexiones y mensajes de error para aquellos servicios que accept() (aceptan) la conexion para luego cerrarla inmediatamente.

-sS Escaneo TCP SYN: A menudo se denomina a esta tecnica escaneo "half open" (medio abierto), porque no se abre una conexion TCP completa. Se envia un paquete SYN, como si se fuese a abrir una conexion real y se espera que llegue una respuesta. Un SYN|ACK indica que el puerto esta a la escucha. Un RST es indicativo de que el puerto no esta a la escucha. Si se recibe un SYN|ACK, se envia un RST inmediatamente para cortar la conexion (en realidad es el kernel de nuestro sistema operativo el que hace esto por nosotros). La ventaja principal de esta tecnica de escaneo es que sera registrada por muchos menos servidores que la anterior. Por desgracia se necesitan privilegios de root para construir estos paquetes SYN modificados.

-sF -sX -sN Modos Stealth FIN, Xmas Tree o Nul scan: A veces ni siquiera el escaneo SYN resulta lo suficientemente clandestino. Algunas firewalls y filtros de paquetes vigilan el envio de paquetes SYN a puertos restringidos, y programas disponibles como Synlogger y Courtney detectan este tipo de escaneo. Estos tipos de escaneo avanzado, sin embargo, pueden cruzar estas barreras sin ser detectados.
La idea es que se requiere que los puertos cerrados respondan a nuestro paquete de prueba con un RST, mientras que los puertos abiertos deben ignorar los paquetes en cuestion (vease RFC 794 pp 64). El escaneo FIN utiliza un paquete FIN vacio (sorpresa) como prueba, mientras que el escaneo Xmas tree activa las flags FIN, URG y PUSH. El escaneo NULL desactiva todas las flags. Por desgracia Microsoft (como de costumbre) decidio ignorar el estandar completamente y hacer las cosas a su manera. Debido a esto, este tipo de escaneo no funcionara con sistemas basados en Windows95/NT. En el lado positivo, esta es una buena manera de distinguir entre las dos plataformas. Si el escaneo encuentra puertos cerrados, probablemente se trate de una maquina UNIX, mientras que todos los puertos abiertos es indicativo de Windows. Excepcionalmente, Cisco, BSDI, HP/UX, MVS, y IRIX tambien envian RSTs en vez de desechar el paquete.

-sP Escaneo ping: A veces unicamente se necesita saber que servidores en una red se encuentran activos. Nmap puede hacer esto enviando peticiones de respuesta ICMP a cada direccion IP de la red que se especifica. Aquellos servidores que responden se encuentran activos. Desafortunadamente, algunos sitios web como microsoft.com bloquean este tipo de paquetes. Nmap puede enviar tambien un paquete TCP ack al puerto 80 (por defecto). Si se obtiene por respuesta un RST, esa maquina esta activa. Una tercera tecnica implica el envio de un paquete SYN y la espera de de un RST o un SYN/ACK. Para usuarios no root se usa un metodo connect().
Por defecto (para usuarios no root), nmap usa las tecnicas ICMP y ACK en paralelo. Se puede cambiar la opcion -p descrita mas adelante.
Notese que el envio de pings se realiza por defecto de todas maneras y que solamente se escanean aquellos servidores de los que se obtiene respuesta. Use esta opcion solamente en el caso de que desee un ping sweep (barrido ping) sin hacer ningun tipo de escaneo de puertos.

-sU Escaneo Udp: Este metodo se usa para saber que puertos UDP (Protocolo de Datagrama de Usuario, RFC 768) estan abiertos en un servidor. La tecnica consiste en enviar paquetes UCP de 0 bytes a cada puerto de la maquina objetivo. Si se recibe un mensaje ICMP de puerto no alcanzable, entonces el puerto esta cerrado. De lo contrario, asumimos que esta abierto.
Alguna gente piensa que el escaneo UDP no tiene sentido. Normalmente les recuerdo el reciente agujero Solaris rcpbind. Puede encontrarse a rcpbind escondido en un puerto UDP no documentado en algun lugar por encima del 32770. Por lo tanto, no importa que el 111 este bloqueado por la firewall. Pero, cquien puede decir en cual de los mas de 30000 puertos altos se encuentra a la escucha el programa? iCon un escaner UDP se puede! Tenemos tambien el programa de puerta trasera cDc Back Orifice que se oculta en un puerto UDP configurable en las maquinas Windows, por no mencionar los muchos servicios frecuentemente vulnerables que usan UDP como snmp, tftp, NFS, etc.
Por desgracia, el escaneo UDP resulta a veces tremendamente lento debido a que la mayoria de los servidores implementan una sugerencia recogida en el RFC 1812 (seccion 4.3.2.8) acerca de la limitacion de la frecuencia de mensajes de error ICMP. Por ejemplo, el kernel de Linux (en /ipv4/icmp.h) limita la generacion de mensajes de destino inalcanzable a 80 cada cuatro segundos, con una penalizacion de 1/4 de segundo si se rebasa dicha cantidad.
Solaris tiene unos limites mucho mas estrictos (mas o menos 2 mensajes por segundo) y por lo tanto lleva mas tiempo hacerle un escaneo. nmap detecta este limite de frecuencia y se ralentiza en consecuencia, en vez de desbordar la red con paquetes inutiles que la maquina destino ignorara. Como de costumbre, Microsoft ignoro esta sugerencia del RFC y no parece que haya previsto ningun tipo de limite de frecuencia para las maquinas Windows. Debido a esto resulta posible escanear los 65K puertos de una maquina Windows muy rapidamente.

iWoop! -b <ftp relay host> Ataque de rebote FTP: Una caracteristica "interesante" del protocolo FTP (FRC 959) es la posibilidad de realizar conexiones ftp tipo "proxy". En otras palabras, me resultaria posible conectarme desde malvado.com al servidor ftp de destino.com y pedirle a ese servidor que enviase un archivo a CUALQUIER PARTE de Internet! Aun asi, esto podria haber funcionado bien en 1985 cuando se escribio el RFC, pero en la Internet actual, no podemos permitir que la gente vaya por ahi asaltando servidores ftp y pidiendoles que escupan sus datos a puntos arbitrarios de Internet. Tal y como escribio *Hobbit* en 1985, este defecto del protocolo "puede usarse para enviar mensajes de correo y noticias cuyo rastro sera virtualmente imposible de seguir, machacar servidores en varios sitios web, llenar discos, tratar de saltarse firewalls y , en general, resultar molesto y dificil de detectar al mismo tiempo." Nosotros explotaremos este defecto para (sorpresa, sorpresa) escanear puertos TCP desde un servidor ftp "proxy". De este modo nos podriamos conectar a un servidor ftp tras una firewall, y luego escanear aquellos puertos que con mas probabilidad se encuentren bloqueados (el 139 es uno bueno). Si el servidor ftp permite la lectura y escritura en algun directorio (como por ejemplo /incoming), se pueden enviar datos arbitrarios a puertos que se encuentren abiertos (aunque nmap no realiza esta funcion por si mismo).
El argumento que se pasa a la opcion 'b' es el host que se pretende usar como proxy, en notacion URL estandar. El formato es: nombre_de_usuario:password@servidor:puerto. Todo excepto servidor es opcional. Para determinar que servidores son vulnerables a este ataque, vease mi articulo en Phrack 51. Se encuentra disponible una version actualizada en la URL de nmap (http://www.insecure.org/nmap).

viernes, 22 de mayo de 2009

Sistema de Archivos

"en sistemas UNIX todo es un archivo; si algo no es un archivo, entonces es un proceso"

En lo sistemas tipo UNIX (como linux) no existe diferencia entre un archivo y un directorio, ya que un directorio es un archivo que contiene una lista de los archivos que contiene. Tanto programas, servicios, texto, imagenes, etc. son todos archivos.
Los dispositivos de entrada y salida, y en general, cualquier dispositivo, es considerado como un archivo dentro del sistema.

Tipos de archivos

La mayoria de los archivos son solo archivos (llamados "archivos regulares") que contienen datos normales: como texto o programas ejectutables. entre los demas archivos podemos encontrar:

  • Directorios: Archivos que listan otros archivos.
  • Archivos especiales: La mayoria los encontramos en el irectorio /dev (por "device" en inglés)
  • Enlaces (links): es el mecanizmo que permite visualizar el mismo archivo en diferentes lugares del sistema.
  • Sockets (dominios): Provee a los procesos interactivos de red cierta proteccion soportado por el control de acceso del sistema de archivos.
  • Named Pipes: similar a Sockets, pero para procesos interactivos dentro del sistema.

Cuando utilizamos el comando $ ls -l , el primer caracter de la lista nos muestra el tipo de archivo:

(-) Archivo regular
(d) Directorio
(l) Enlace
(c) Archivo especial
(s) Socket
(p) Named Pipe
(b) Dispositivo

jueves, 21 de mayo de 2009

Servicios y Seguridad

El archivo /etc/inetd.conf contiene los puertos con servicios activos. Cuantos menos servicios TCP habilitados tengamos, mejor.
La forma de deshabilitar un servicio es comentar la linea (agregando un #). Algunos servicios a deshabilitar seran: fingerd y talkd. Tambien sera oportuno deshabilitar servicios de acceso remoto como telnet (en su lugar es preferible usar SSH).

miércoles, 20 de mayo de 2009

Programas para la red en modo texto

La mayoría de estos programas puedes encontrarlos en tu propio CD de linux o a través del servidor ftp de tu distribución.
El uso de estos programas en lugar de sus equivalentes gráficos tiene como resultado un aprovechamiento mucho mas eficiente de nuestros recursos locales (al no necesitar entorno gráfico) y de los recursos de la red (pues en general están mucho mas optimizados).
Sin embargo las desventajas son claras, nada de multimedia (al menos no tan fácil como en programas gráficos) y la dificultad inicial para los usuarios provenientes de sistemas operativos
gráficos.
Personalmente creo que vale la pena usarlos, y si tenemos necesidad de un entorno gráfico siempre estamos a tiempo de lanzarlos desde una xterm o cualquier otro terminal X.

pppd

Este es el demonio que gestiona las conexiones point-to-point, o sea, las normales a infovia. Recomiendo tenerlo siempre actualizado a la ultima versión, creo que ahora va por la 2.3.5, al menos esa es la que yo uso. Para una configuración optimizada/personalizada os recomiendo que leáis detenidamente el

$ man pppd

y el pppd-como que podéis encontrar en LuCAS

Para iniciar una conexión (configurada correctamente) basta con escribir

$ pppd

y para desconectar poner

$ pppd

de nuevo, así de simple.

lynx

Es el mejor navegador en modo texto. Mucha gente prefiere no usarlo o ni siquiera cree que exista. Pues bien, existe, es rapidísimo y muy fácil de usar. Sencillamente hay que teclear

$ lynx URL

para acceder a esa URL, se navega usando los cursores:

flecha arriba/abajo para cambiar el link activo.
flecha izquierda para acceder al link activo.
flecha derecha para volver a la pagina anterior.

Así de simple. Sirve tanto para http como ftp, ficheros locales como remotos, soporta frames, cookies, formularios, bookmarks, etc. ademas es ideal para pasar archivos html a txt, con la orden

$ lynx -crawl -dump archivo.htm > archivo.txt

Limitaciones: no muestra imágenes, no es compatible Java ni JavaScript, no ve mapas. Aunque todas estas limitaciones serian fácilmente solucionables si los programadores hiciesen mejores
webs. No cuesta nada detectar que el navegador no es gráfico y mostrar una pagina especial solo texto.

ncftp

Un cliente de ftp basado en ncurses, muy sencillo y eficaz, soporta reget (retomar downloads abortados), bookmarks, accesos anónimos y no anónimos, programación de scripts y alias .Todos los comandos tienen una ayuda que se puede leer tecleando (desde dentro del programa) /help/ o /help comando/ La forma de arrancarlo es con

$ ncftp

o

$ ncftp FTP-SERVER

wget

Este sencillo programa sirve para bajar archivos de la red, ya sean de ftp o http. Tiene muchas posibilidades y es lo mas eficiente que he visto bajando archivos. Permite reget, bajar webs enteras, comodines, conexión automática. Se ejecuta con el comando

$ wget URL

Limitaciones: no sirve para navegar (no esta hecho para eso).

BitchX

Posiblemente el mejor cliente de IRC, es una evolución del clásico ircii con soporte de color, gráficos ansi. Al ser uno de los mas extendidos abundan scripts para el BitchX (aunque para mi gusto no los necesita).
Es fácilmente programable y configurable, soporta todos los comandos básicos del irc, la mayoría de comandos y teclas del mirc mas muchos propios, múltiples canales, múltiples ventanas, múltiples servidores. La forma básica de ejecutarlo es

$ bitchx NICK IRC-SERVER

mutt

Es un sencillo lector de correo basado en ncurses, puede leer el correo de la mayoría de buzones estándar. Permite leer tanto correo normal como news, listas, gestiona varios buzones.
Para ejecutarlo basta con la orden

$ mutt

después podemos seleccionar el menú de ayuda para ver un listado de sus posibilidades.
NOTA: requiere agentes de correo tipo sendmail (enviar) y fetchmail (recoger).

Herramientas

Existe un gran numero de sencillas herramientas de red que mucha gente no usa pero son tremendamente útiles:

Ping: detecta si existe una determinada URL o IP.

$ ping IP

Traceroute: sigue la pista de la ruta que siguen los paquetes TCP dentro de la red.

$ traceroute -OPCIONES IP

Nslookup: transforma URLs en IPs y viceversa.

$ nslookup

ifconfig/route: configuran interfaces de red, su sintaxis es mas compleja debido al gran numero de parámetros que pueden gestionar tcp_wrappers/tcpdump y otros analizadores del trafico a través de una red.

Telnet: la herramienta básica para conexiones TCP.

$ telnet IP PUERTO

martes, 19 de mayo de 2009

Montando unidades

Las unidades en linux son tratadas como ficheros, concretamente como ficheros de dispositivo y se encuentran dentro del directorio

/dev.

Los nombres son:


/dev/fd0 -> Primera disketera
/dev/fd1 -> Segunda disketera ( ... y así con todas las que haya)
/dev/hda -> Primer disco del primer canal IDE
/dev/hdb -> Segundo disco del primer canal IDE
/dev/hdc -> Primer disco del segundo canal IDE
/dev/hdd -> Segundo disco del segundo canal IDE
/dev/sda -> Primer disco SCSI
/dev/sdb -> Segundo disco SCSI ( ... y así con todos los que haya)

Ademas, los discos duros (tanto IDE como SCSI) tienen particiones, a las que llamamos:


/dev/hda1 -> Primera partición del primer disco del primer canal IDE
/dev/hda2 -> Segunda ...
/dev/hdb1 -> Primera partición del segundo disco ...

Para saber que unidades i particiones reconoce el sistema haremos

$ dmesg

Fijandonos especialmente en las lineas que definen las unidades, como por ejemplo:


hda: ST33210A, ATA DISK drive
hdb: ACER CD-910E/JAS, ATAPI CDROM drive
hda: ST33210A, 3098MB w/256kB Cache, CHS=787/128/63, (U)DMA
Partición check:
hda: hda1 hda2 hda3

Podemos ver como el sistema reconoce un disco duro (hda) con tres particiones (hda1, hda2 y hda3) y un CD-ROM (hdb) Vamos a ver como acceder a las unidades de almacenamiento, ya sean floppys, CDs, otros HDDs o unidades de red.
Los comandos son mount y umount para montar y desmontar unidades. La sintaxis general es:

$ mount -t tipo -o opciones /dev/dispositivo /directorio_de_montaje

y

$ umount /directorio_de_montaje

Tipo

Es el sistema de ficheros que contiene la unidad: MS-DOS, ext2, iso9660, etc.

Opciones

Son parámetros como lectura/escritura, montar automáticamente, etc

Dispositivo

Es el nombre que da linux a la unidad (hda1, hdb, fd0,etc)

Directorio de montaje

Es el directorio desde donde será accesible el sistema de archivos montado, debe existir antes de intentar montarlo y debe estar vacío, ademas ningún usuario debe estar en el momento de montaje en ese directorio.
El comando mount sin parámetros nos da una lista de las unidades montadas.
Las unidades montadas no pueden extraerse (ojo con los diskette!), antes hay que desmontarlas. Y para montar un sistema de archivos antes hay que tener un disco dentro (recordad que se montan los discos, no las unidades lectoras). Mas información en

$ man mount
$ man umount
$ man fstab

En todos los casos (menos ext2) es requisito indispensable haber recompilado el kernel con soporte para el sistema de ficheros que queremos montar.

Montar un diskette

$ mount -t tipo /dev/fd0 /mnt/floppy

El tipo generalmente es ext2 (disco linux) o vfat (disco DOS/WIN). No requiere mas parámetros.

Montar un CD-ROM

$ mount -t iso9660 /dev/XXX /mnt/cdrom

El dispositivo depende de donde tengamos instalado el CD-ROM, puede ser hda, hdb. El comando

$ dmesg | grep CD

nos informa de eso:


hdb: ACER CD-910E/JAS, ATAPI CDROM drive

En este caso el CD esta en /dev/hdb.

Montar otras unidades de disco

$ mount -t tipo /dev/XXX/mnt/directorio

De nuevo el tipo y la unidad dependen de nuestro sistema y para el directorio de montaje se suele usar un nombre que identifique el sistema montado, por ejemplo, para montar una unidad Windows que se encuentra en la primera partición del primer disco:

$ mount -t vfat /dev/hda1 /mnt/win

Y para montar un segundo disco con linux instalado en la primera partición:

$ mount -t ext2 /dev/hdb1 /mnt/linux

Montar unidades de red

$ mount -t nfs host:/directorio /mnt/host

Este caso es un poco diferente, host es el nombre de la máquina remota y directorio es el nombre del directorio de la máquina remota que queremos (y se nos permite) montar. De manera que para montar el directorio /usr de la máquina Storm en nuestro sistema haremos:

$ mount -t nfs Storm:/usr /mnt/Storm

En este caso puede ser necesario especificar algunas opciones. Ahora vamos a ver como automatizar la mayoría de estos comandos para no tener que teclearlos cada vez.

El archivo /etc/fstab

Este archivo contiene una lista de unidades y todos los parámetros necesarios para su montaje, la sintaxis es sencilla:

"# Unidad Punto de montaje Tipo Opciones"

Un ejemplo:

/dev/hda1 /mnt/dos vfat defaults 0 0

Para montar una unidad definida en el fstab basta con la orden:

$ mount /directorio_de_montaje

Para montar a la vez todas las unidades:

$ mount -a

Las unidades definidas en el fstab intentan montarse durante el arranque a menos que pongamos como opción noauto (muy aconsejable en CDs y floppys). Si queremos poner mas de una opción estas se separan por comas sin espacios entre ellas.

Funciones Avanzadas con el Teclado

Podemos usar el teclado para mucho mas que para escribir, hay funciones complejas que podemos hacer fácilmente pulsando un par de teclas.

Cambiando de consola

Una consola es un terminal en el que pueden escribirse ordenes, por defecto la mayoría de distribuciones incluyen 6 consolas (tty) mas todas las sesiones telnet (ttyp) mas todos los emuladores de terminal para las X (xterm, rxvt, eterm,etc). Para cambiar de consola en modo local basta con pulsar la combinación [Alt]+[FX] donde X es el numero de la consola a la que queremos movernos (FX son las teclas de función!) Algunos programas "atrapan" esta combinación de teclas asignandoles otra función, es el caso de las X, el DOSEmu, el DOOM

La combinación de teclas para cambiar de consola en estos casos es [Ctrl]+[Alt]+[FX].
Nota: la consola en la que se proyectan las X es la primera libre, en la mayoría de los casos la 7 (tty7).

Reiniciar/cerrar

La combinación [Ctrl]+[Alt]+[Supr] provoca un reinicio del ordenador, aunque este comportamiento se puede modificar llegando a realizar cualquier acción tras esta combinación simplemente editando el archivo /etc/inittab, buscaremos unas lineas como estas:

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

El ultimo campo es la acción a realizar. Podemos substituir -r por -h para que cualquier usuario pueda cerrar la máquina.

Completado

Podemos usar la tecla [TAB] (tabulador, la tecla sobre el Bloq Mayus) para completar comandos y nombres de archivos, tan solo hay que teclear las primeras letras de la orden y pulsar [TAB] para que el sistema intente completarla. Por ejemplo, podemos pulsar:

$ da [TAB]

Para que en la linea aparezca:

$ date

Lo mismo pasa con los nombres de archivos, por ejemplo, desde / podemos hacer:

$ cd r[TAB]

El resultado es:

$ cd /root

Si existen coincidencias de nombres, de manera que el sistema no sabe cual queremos completar, nos avisa parándose en el punto en el que las dos o mas ordenes empiezan a diferenciarse y emite un pitido. En este caso si volvemos a pulsar TAB se nos muestra una lista de todas las ordenes que coinciden con el patrón dado.
Por ejemplo, si pulsamos:

$ mak[TAB]

Veremos en el terminal:

$ make

Si volvemos a pulsar [TAB]:

make
makedepend
makewhatis
make-ssh-known-hosts
makeg
makedb
makeinfo

Editar la linea de comandos

Puede editarse la linea de comandos como si de un editor normal se tratase, a diferencia de MS-DOS que borra los caracteres por los que pasa el cursor.

Historial

Con las teclas de cursor de Arriba y Abajo podemos movernos por el historial de los últimos comandos tecleados. Muy útil para tareas repetitivas de sintaxis compleja.

Compilar

En pocas palabras compilar es pasar de las fuentes del programa a un fichero ejecutable. Este proceso no es ni sencillo ni fácil, por lo que es frecuente que aparezcan fallos. Por suerte existen algunas herramientas (Makefiles, configures) que nos van a facilitar la vida.

Requisitos

La verdad es que los requisitos para compilar son bastante altos, hay que tener instalados el gcc, el make, las libc-devel, libg++-devel, libstdc++-devel, todas las versiones de desarrollo de las librerías que usa el programa que vayamos a compilar, las X-devel si el programa va ejecutarse bajo el entorno gráfico, opcionalmente otros paquetes de control, revisión de versiones, comandos especiales y todo lo que nos pida la documentación del programa que vayamos a compilar.

Como se hace?

Después de descomprimir el paquete lo primero que hay que hacer es leer la documentación (casi siempre hay algún README o INSTALL) y asegurarnos de que tenemos todo lo que necesitamos para compilar y que nuestro sistema esta soportado por las fuentes, es decir de nada nos sirve tener las fuentes de un programa que usa unas librerías que no tenemos o que no compila en Linux. Un proceso semi-estandar entre el software mas reciente es tener que poner solo esto para conseguir compilar e instalar el programa:

$ ./configure
$ make
$ make install

Todo esto dentro del directorio donde se encuentran las fuentes. Aunque en muchos casos no existe el "configure" y deberemos editar a mano el archivo Makefile para adecuarlo a nuestro sistema (Definir PATHs, comandos, opciones especificas de plataforma,etc.)

Compilar un solo archivo (*.c)

Si lo que queremos compilar es un solo archivo el proceso es mucho mas sencillo, basta con la orden:

$ gcc -O2 -Wall -o nombre_del_ejecutable archivo.c