/// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// zmiana portu zrodlowego w kliencie przy pomocy bind() / /// /// /// /// /// /// /// /// /// /// /// by gminick /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// Po prawie miesiacu przerwy zaczalem przegladac sobie kilka grupek Usenetowych i czytajac spotkalem sie z ciekawym problemem, ktory nie zostal tam rozwiazany, jak zawsze w takich momentach obudzilem pieska i wybralismy sie na spacer, piesek za potrzeba, ja za pomyslem ;) Pozna noc, na pewno bylo juz po 1:00, nad glowa niesamowite widowisko, zblizajaca sie z zachodu burza i niesamowity kontrast, z jednej strony ciemne, bardzo pochmurne niebo i ciagle dajace znac o sobie blyskawice, ogolnie scena cechujaca sie duzym dynamizmem, a z drugiej calkowicie bezchmurne niebo, jasno swiecace gwiazdy i niezachwiany spokoj... Ale to tak btw. ;) Teraz przejdzmy do rzeczy, ludzie bawiacy sie w hackerslab (www.hackerslab.org jesli sie nie myle) zostali postawieni przed problemem, musieli wyslac pakiet (tam udp, ja to zrobilem na tcp, ale idea jest ta sama), ktorego port zrodlowy byl ustalony i nie mogl byc inny. Wyklucza sie korzystanie z raw sockets i narzedzi typu hping, nie mozna tego zrobic z konta roota, w gre wchodzi tylko zwykly uzytkownik posiadajcy gcc i vima ;) Co trzeba zrobic ? Po za tym, ze napisac zwyklego klienta tcp, trzeba tez zmienic troche w gniazdowej strukturze adresowej klienta, a potem strukturke ta potraktowac bindem... Oto kod: ---- ---- ---- ---- #include #include #include #include #include #include #include #include #include int main(int argc, char **argv) { struct sockaddr_in serv, ja; int sockfd; if(argc < 2) { fprintf(stderr, "USAGE: %s IPEK\n", argv[0]); exit(1); } if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "%s\n", strerror(errno)); exit(errno); } /* tu rozpoczyna sie oszustwo */ ja.sin_family = AF_INET; ja.sin_port = htons(4514); /* to nasz port zrodlowy */ ja.sin_addr.s_addr = inet_addr("127.0.0.1"); /* a to glowny sprawca */ if(bind(sockfd, (struct sockaddr *)&ja, sizeof(ja))==-1) { fprintf(stderr, "%s\n", strerror(errno)); exit(errno); } serv.sin_family = AF_INET; serv.sin_port = htons(80); /* to nasz port docelowy */ serv.sin_addr.s_addr = inet_addr(argv[1]); if(connect(sockfd, (struct sockaddr *)&serv, sizeof(serv))==-1) { fprintf(stderr, "%s\n", strerror(errno)); exit(errno); } while(1); /* wiem, wiem... ale w koncu to tylko przyklad ;) */ return 0; } ---- ---- ---- ---- Hmmm... poniewaz jako port docelowy ustawilem 80, szybko odpalilem Apache, potem gcc i szybciutko './a.out 127.0.0.1' Dobra, nasz klient pieknie polaczyl sie z naszym serwerkiem HTTP, teraz tylko zobaczmy, czy port zrodlowy to 4514, tak jak chcielismy... [root@gminiek stuff]# netstat -tupan|grep 4514 tcp 0 0 127.0.0.1:4514 127.0.0.1:80 ESTABLISHED 3409/a.out tcp 0 0 127.0.0.1:80 127.0.0.1:4514 ESTABLISHED 3194/httpd [root@gminiek stuff]# heheheheheheeh :) wszystko tak jak chcielismy :) wydaje mi sie, ze nie ma tutaj co wyjasniac, bo jak sie czlowiek nie zna na tym wcale, to nie bede wprowadzal w temat, bo szkoda kilobajtow ;), a jak wie o co chodzi to sam to zrozumie :) _____________________ ______________________________________________| 02:23 ;; 8 VII 01 |_ (C) 2001 by gminick