Jump to content
6CMNWW

Ideea de port scanner - C

Recommended Posts

Ok... sa incep cu inceputul... Intotdeauna hackingul si securizarea incep cu scanarea de porturi... De ce ? Ca sa poti hackerii/securiza ceva trebuie sa stii ce servicii asteapta conexiuni, pentru a stii ce se poate exploata pe serverul respectiv.

Scanere sunt multe... cel mai bun (parerea mea si nu numai) este nmap care se poate scoate de la adresa http://www.insecure.org/nmap/ (pentru fostii useri hackers.com - cel care a conceput scanerul este Fyodor). Pe windows sunt multe alte scanere... nu stiu sa dau exemple decat "7th Sphere" care il foloseam inainte sa dau de UNIX dar sunt convins ca mai exista multe altele...

Intrebarea e: De unde stie programul ce porturi sunt deschise si, mai important, ce servicii ruleaza pe server ? Unele scanere va dau chiar si versiunea serverului care asculta conexiunile... interesant, nu ?

Pentru inceput va spun ca exista 2 tipuri de scanere si difera in functie de modul de testare a porturilor. Nu intru in detalii si elemente de jargon, asa ca o spun pe fata:

1. Scanere care deschid o sesiune de lucru

2. Scanere care testeaza posibilitatea deschiderii unei sesiuni de lucru.

Primul tip de scaner, deschide o sesiune de lucru. E cel mai simplu mod de a testa un port... Cum se face asta ? E relativ simplu... pun mai jos un mini-scaner facut de mine care il puteti folosi sa intelegeti mecanismul. Il puteti folosi si in real-life, cu conditia sa aveti o doza de masochism in voi



#include <stdio.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#define PORT 20



int main(){

       int sc;

       struct sockaddr_in server;



       sc = socket(AF_INET, SOCK_STREAM,0);



       if(sc < 0)

               exit(1);



       server.sin_family = AF_INET;

       server.sin_port   = htons(PORT);

       server.sin_addr.s_addr = inet_addr("192.168.0.128");



       if( connect(sc, &server, sizeof(server)) < 0 ){

               printf("Portul %d nu este deschisn",PORT);

       }else{

               printf("Portul %d este deschisn",PORT);

       }



       close(sc);



       return 0;

}

Simplu, nu ? Ok... concret... ce face programelul asta ? Mai jos vine explicatia:

1. Ca sa fie mai usor de urmarit, verifica un singur port definit sus ( #define PORT 20 ). Ca sa verificati un alt port, inlocuiti 20 cu numarul portului care va intereseaza.

2. Creaza un socket cu ajutorul functiei socket() si variabilei de tip struct sockaddr_in ii da datele necesare pentru conectarea la server. In variabila server se pastreaza protocolul de comunicare folosit (in cazul nostru AF_INET - adica comunicare in retea), portul pe care se face conexiunea ( htons(PORT) ) si, bineinteles, adresa la care se conecteaza.

3. Cu ajutorul functiei connect() programul se conecteaza la server pe portul specificat. Daca conectarea reuseste, functia returneaza 0. In caz contrar, returneaza -1. Daca a returnat 0, inseamna ca exista un serviciu care asculta conexiuni pe portul specificat. In caz contrar, nu exista nici un serviciu pe portul respectiv (sau exista dar este filtrat).

De aici va puteti face o mica idee despre cum functioneaza un scaner mai complex care scaneaza mai multe porturi.

Al doilea tip de scaner functioneaza fara a deschide o conexiune. Pentru a intra putin in amanunte, o conexiune se face in felul urmator:

1. Se pregatesc datele (port, adresa, protocol)

2. Se trimite catre adresa specificata un pachet SYN care cere o conexiune serviciului care ruleaza pe portul X.

3. Daca exista un server care asculta conexiuni pe portul X, trimite inapoi un pachet de tip ACK care confirma faptul ca "e cineva acolo" si asteapta.

4. Daca programul client (in cazul nostru scanerul) a primit un ACK ca raspuns, trimite si el un pachet ACK pentru a se finaliza partea de pregatire a conexiunii, dupa care se incepe comunicarea.

Scanerele care ruleaza la un nivel scazut (cele care nu creaza o conexiune) executa primii 3 pasi. Adica, creaza o conexiune, trimit un pachet SYN si asteapta pachetul ACK. Daca pachetul ACK a venit, inseamna ca portul e deschis. Daca nu a venit intr-un interval de tip determinat, inseamna ca nu exista nici un server care asteapta conexiuni pe portul respectiv. Pasul 4 nu este executat, deci nu se incheie protocolul de creare a conexiunii. Serverul daca nu primeste ACK-ul care il asteapta considera ca a fost o cerere gresita iar dupa cateva secunde (in functie de cum e setat) inchide conexiunea nefinalizata.

Ok... acum va puneti intrebarea: Care-i ideea ? De ce exista 2 tipuri de scanere ? Lucreaza in moduri diferite, dar cu ce e mai bun primul decat al doilea ? Sau e mai bun al doilea ?

Ca sa raspund la intrebarile care (banuiesc) ca sunt normale pun mai jos o mica explicatie...

Primul tip de scaner are marele avanta ca odata ce s-a creat conexiunea, poate citi mai multe date... de exemplu, poate citi mesajul trimis de server, poate citi "fingerprints" dupa care isi da seama ce sistem de oerare ruleaza, ce versiune de server asculta conexiunile pe portul respectiv etc.

Al doilea tip de scaner nu poate scoate informatii de genul asta pentru ca nu e finalizata conexiunea, deci nu poate "interoga" serverul.

Pana aici primul tip de scaner e in avantaj.

Ok... principalul motiv pentru care s-a conceput al doilea tip de scaner este urmatorul: cand se creaza o conexiune noua sunt foarte mari sansele (cam 90%) ca serverul sa logheze conexiunea facuta (data, ora, IP etc). Cu al doilea tip de scaner, din moment ce nu finalizeaza conexiunea, nu exista acest risc. Adica, daca serverul a "observat" ca nu s-a finalizat protocolul de creare a conexiunii, considera ca nu e nici o conexiune deci nu se trece nimic in fisierele log.

In concluzie, cand scanati un host e bine ca prima data sa folositi al doilea tip de scan pentru a vedea ce porturi sunt deschise fara ca administratorul serverului sa vada ca cineva "il scaneaza". Odata ce aveti lista cu porturile deschise, puteti face o mica aplicatie care ia versiunea serverului care asculta conexiuni pe portul care va intereseaza.

Ca sa ofer o un caz cat de cat concret, imaginati-va urmatoarea situatie: un admin vede ca cineva il scaneaza... primul lucru care il face (logic) e sa vada pe ce servicii s-a mai conectat persoana respectiva, eventual sa ia si alte informatii. Daca va uitati in logurile sshd sau logurile de acces va puteti da seama ca ce user s-a intrat de la IP-ul respectiv in calculator. In ideea ca se urmaresc logurile tuturor serverelor care ruleaza pe host-ul respectiv, administratorul are destule informatii pentru a va gasi.

In schimb, daca folositi al doilea tip de scan (stealth scan) administratorul nu va fi alarmat de sistemele de securitate ca cineva "il scaneaza" deci nu va stii concret dupa ce sa se uite in log-uri... nu va sti ce IP sa caute, ce user, in ce loguri sa caute etc.

Cam atat... astept intrebari si nelamuriri

Link to comment
Share on other sites

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...