Jump to content
SlicK

HTTP scanner

Recommended Posts

Posted

Acest program primeste ca parametru o lista de ipuri apoi testeaza fiecare ip pentru existenta anumitor fisiere.

Nu este un scanner complet(si nu pretind ca este foarte corect).

Disclaimer: Acest cod este doar demonstrativ, puteti face orice cu el(copiati-l,modificati-l) nu-mi pasa insa eu nu sunt raspunzator pentru eventualele actiuni daunatoare/ilegale pe care le alegeti sa le faceti.

Am postat aceasta sursa pentru un singur motiv, acela ca atunci cand armatele de copii care cauta disperati scannere de tot felul numai pentru a avea mai multi botii pe irc decat "toarasii" vor renunta la a face acest lucru si vor incepe sa-si codeze(macar compileze) singuri programele poate vor realiza ca internetul este cu mult mai mare decat "./scan" si irc.

Here it goes:


//se compileaza astfel: gcc -o scan scan.c

#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>

#define RMT_PORT 80 // portul http
#define LOOK "200 OK" //raspunsul pe care il cautam
#define LOG_FILE "scan.log" // fisierul log

Chk(char *host)
{
struct sockaddr_in rmt_host;
struct hostent *rh;

FILE *LOG;
char buffer[15]; // buffer pentru stocarea raspunsului serverului
char *requ[255]; // array pentru stocarea requesturilor
char *name[255]; // array pentru stocarea numelor fisierelor(pentru scrierea in log)
int sock,i;

memset(requ,0,255); //initializare cu 0
memset(name,0,255);
memset(buffer,0,15);
//setam fiecare request
requ[1] ="GET /nodirectory/nofile.php HTTP/1.0nn"; //unele servere au raspunsuri custom pentru erorile gen 404
requ[2] ="GET /director1/fisier1.php HTTP/1.0nn";
requ[3] ="GET /director2/fisier2.php HTTP/1.0nn";
requ[4] ="GET /director3/fisier3.php HTTP/1.0nn";
requ[5] ="GET /director4/fisier4.php HTTP/1.0nn";

//setam fiecare nume
name[1]=" /nodirectory/nofile.php";
name[2]=" /director1/fisier1.php";
name[3]=" /director2/fisier2.php";
name[4]=" /director3/fisier3.php";
name[5]=" /director4/fisier4.php";

if((LOG=fopen (LOG_FILE,"a"))==NULL) // deschidem logul pentru scriere
{
perror("[-] Cannot open log for writing!n");
exit(1);
}

if((rh=gethostbyname(host))==NULL) // numele hostului in functie de ip
{
printf("-");
exit(1);
}
printf(".");
for(i=1 ; i<=5 ; i++) // tratam fiecare request in parte(5 in acest exemplu)
{
if((sock=socket(AF_INET,SOCK_STREAM,0))==-1) // deschidem socketul
{
printf("-");
exit(1);
}
bzero(&(rmt_host.sin_zero),8);
rmt_host.sin_family = AF_INET;
rmt_host.sin_addr=*((struct in_addr *)rh->h_addr);
rmt_host.sin_port=htons(RMT_PORT);

if(connect(sock,(struct sockaddr *)&rmt_host ,sizeof(rmt_host)) != 0) // ne conectam la server
{
printf("-");
exit(1);
}
send(sock,requ[i],sizeof(requ),0); // trimitem requestul
recv(sock,buffer,sizeof(buffer),0); //citim raspunsul
if((strstr(buffer,LOOK))!=0) // daca raspunsul contine stringul pe care il dorim("200 OK")
{
if (i!=1) //daca nu este gasit fisierul "nofile"
{
printf("X");
fputs(host,LOG); //scriem in log
fputs(name[i],LOG);
fputs("n",LOG);
}
else
{
exit(1);
}
}
close(sock); // incidem socketul
}
fclose(LOG); //inchidem fisierul log
}

int main(int argc, char **argv)
{
FILE *In; // fisierul de intrare
char LineBuffer[20]; // buffer pentru citirea din fisier
int NumF=0; // numarul de procese, variaza in timpul rularii
int MaxF; // numarul maxim de procese in acelasi timp

if(argc!=2) // daca programul nu primeste nici un parametru
{
printf("[+] By YOUn");
printf("[+] Usage: %s [ip file]n",argv[0]);
exit(0);
}
In=fopen (argv[1],"r"); // deschidem fisierul reprezentat de primul parametru
if(In==NULL) // daca fisierul nu poate fi deschis
{
printf("[-] Cannot open %s for reading!n",argv[1]);
exit(0);
}

printf("'x'=Found, '.'=not found, '-'=errorn");

MaxF=20; // setam numarul maxim de procese
while(!feof(In)) // cat timp nu am ajuns la sfarsitul fisierului
{
fscanf(In,"%s",LineBuffer); // citim cate un rand
if (!(fork())) // deschidem un proces nou
{
alarm(20); // timeout la 20 de secunde
Chk(LineBuffer); // testam ipul
alarm(0);
exit(0);
}
else
{
NumF++; //crestem numarul de procese deschise
if(NumF>MaxF) for(NumF; NumF>MaxF; NumF--) wait(NULL); //daca numarul de procese a depasit numarul maxim asteptam pana unul din ele se inchide
}
}
}

Daca am gresit ceva in acest cod pls anuntati-ma!

Posted

[+] By YOU

[+] Usage: ./s [ip file]

.................................................

./s 66

[-] Cannot open 66 for reading!

touch s

cat 217.26.150.5>s.txt

./s s.txt

'x'=Found, '.'=not found, '-'=error

deci in s.txt ce tre sa contina ?

Posted

uite frate ce ami da mie aici ~:((

[root@andromeda .,]# gcc -o scan cgiscan.c

cgiscan.c: In function `Chk':

cgiscan.c:23: parse error before "memset"

cgiscan.c:42: parse error before "exit"

cgiscan.c:48: parse error before "exit"

cgiscan.c:51: parse error before "for"

cgiscan.c:51: parse error before ')' token

cgiscan.c:61: parse error before "rmt_host"

cgiscan.c:96: `argc' undeclared (first use in this function)

cgiscan.c:96: (Each undeclared identifier is reported only once

cgiscan.c:96: for each function it appears in.)

cgiscan.c:99: parse error before "printf"

cgiscan.c:102: `In' undeclared (first use in this function)

cgiscan.c:102: `argv' undeclared (first use in this function)

cgiscan.c:103: parse error before "if"

cgiscan.c:115: parse error before "if"

cgiscan.c:126: parse error before '}' token

Posted

PunjabHaker: Imi cer scuze daca "[+] Usage: ./s [ip file]" nu te-a lamurit... s.txt trebuie sa contina ip-urile pe care vrei sa le testezi cu vulnerabilitatea specificata.

x0xboy: din nu stiu ce motiv au disparut foarte multe ';' incearca versiunea asta http://rootb0x.com/scan.c

sysgh0st: Felicitari pentru pozitia de "Super Administrator"! Din cate se pare te descurci destul de bine.

Sunt sigur ca exemplul meu poate fi facut poate mult mai bine si in alte limbaje de programare dar unde ar mai fi diversitatea? C-ul este un limbaj mult mai "low level" si mai vechi decat multe altele si de altfel sta la baza sistemelor de operare UNIX(sunt sigur ca stiai asta deja :)). Parea mea e ca daca stii C poti invata cu usurinta orice alt limbaj "high level" si-ti poti exporta ideile in acel limbaj.

Oricum scopul meu cred ca a fost destul de clar: vreau sa micsorez comunitatea de skiddie si sa o maresc pe cea de coderi.

Posted

asa..bon..e ok scanerul cum e zis el ...dar /directorx/etc.. nu trebuia parametrizat in functie de (etc) ?..sau poate gresesc..nu cred sa fie vreun soft standardizat in *.ro paths :) asa general

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...