[bugs] najczestsze bledy i troche o nich

Wszystko związane z bezpieczeństwem naszego komputera: zagrożenia, metody i sposoby zabezpieczania się, ostrzeżenia, bugi, bezpieczeństwo sieciowe i systemów komputerowych
[jesli adminowie uznaja za stosowne to mozna to przykleic]
[color=red]Uznalem to za stosowne - Unknow ;)[/color]

[czemu w security a nie w programowanie ? wkoncu security sie w znacznym stopniu opiera na szukaniu bledow/bugow w programach]

Topic ten sluzyl bedzie glownie do dyskusji oraz zrobienia "bazy" najczestszych bledow ktore popelniaja programisci, oraz metod ich wykozystania. Proponuje wrzucac w ten topic blad wraz z nazwa, przykladem, oraz krotkim opisem (np czym grozi popelnienie tego bledu). Bede sie staral te ktore nie wystapily jeszcze przeklejac do tego posta. Stworzy sie w ten sposob baza bugow, z ktorej poczatkujacy i nie tylko beda mogli pozniej kozystac (ofc w celu nauczenia sie jak ich nie robic i poprawienia stylu programowania ;ppppp)

oczywiscie nie chodzi tutaj tylko o bledy popelniane w C, ale o wszystkie ;>

[size=150]Bug base[/size]

1. buffer overflow (przepelnienie bufora)
[size=75]podal Gynvael Coldwind[/size]
kod z bledem:
[code]
int main(void)
{
char buffer[256];
gets(buffer); /* blad! */
return 0;
}
[/code]
Blad polega na zapisaniu do buffora "buffer" wiecej niz 256 bajtow danych, co spowoduje nadpisanie (w tym wypadku) stosu i umozliwi wykonanie nieporzadanego kodu pochodzacego z zewnatrz. Zamiast gets powinno sie uzywac [color=red]fgets(buffer, 256, stdin);[/color]. Bled rowniez moze wystapic przy niepoprawnym uzyciu funkcji sprintf, strcpy, strcat (powinno sie uzywac snprintf, strncpy, strncat).
[color=#0080FF]gynvael.coldwind[/color]//[color=#00FF00]vx[/color]
http://gynvael.coldwind.pl
Gynvael Coldwind
Przyjaciel
Avatar użytkownika
Posty: 1633
Dołączył(a): N lip 25, 2004 17:08
Podziękował: 53 razy
Podziękowano: 184 razy
Reputacja: 23041

Spokojnie - to tylko reklama - zniknie po zalogowaniu :)

Kliknij 👇


serwery VPS
Pani Reklama
Automat
Posty:
Dołączył(a): ab aeterno
Lokalizacja: UW-Zaloga

PostPn gru 20, 2004 19:31

Na wstępie chcę napisać, że to bardzo fajny pomysł, wydaje mi się że powinno takich topiców być o wiele, wiele więcej żeby można było coś więcej się dowiedzieć o hackingu i security, a nie tylko o configu do gadu gadu :lol: No dobra, sam też postanowiłem dorzuć swoje 3 grosze, a oto one:

2. Ciągi formatujące (format string)
[size=75]podał Kerth[/size]

Ciągi formatujące są dosyć częstym błędem popełnianym przez programistów. Szczególnie polega on na lenistwie i jak najszybszym napisaniu programu, czego potem skutkami są bugi, jednym z nich są właśnie ciągi formatujące. Błąd który tu opiszę polega na złym zastosowaniu funkcji "printf" w języku C. Jak wiele z was pewnie wie (albo i nie wie :P ), funkcję printf stosujemy do wyświetleniu jakiegoś ciągu (string) z podanym parametrem np. znaków, dziesiętny, szestnastkowy itd. Każdemu takiemu ciągu odpowiada parametr i są to np.

%s - dla ciągu znaków
%d - dla ciągu dziesiętnego
%x - dla szesnastkowych

No dobra, ale to chyba wie każdy kto choć trochę zna język C (a mało jest takich co nie zna :P ), więc teraz czas na to jak taki ciąg nadużyć. Wielu programistów może z przemęczenia, albo z lenistwa popełnia katastrofalny błąd i zamiast pisać:

[code]printf("%s", kerth)[/code]

pisze:

[code]printf(kerth)[/code]

Na pierwszy rzut oka nie widać żadnych większych strat z takiego zapisy, bo gdy np. char kerth="hello world", wtedy po kompilacji program bez żadnych problemów wyświetly "hello world", ale co się stanie gdy pod zmienną kerth podstawimy, jakiś parametr np. %x, czyli teraz kerth wygląda np. tak: char kerth="world%x" i efekty są takie:

[code]worldbffff2a1[/code]

natomiast przy poprawnym sposobie wygląda tak:

[code]world%x[/code]

Analizując pierwszy przykład program nie ma określonej zmiennej na której ma wykonać parametr "%x", dlatego bierze pierwsze co leży na stosie i pokazuje nam to w postaci szesnastkowej (bo do tego służy ten parametr). Tym samym sposobem teraz możemy podejrzeć cały stos, ale to nie o to nam chodzi. Głównym daniem dla intruza jest jednak parametr %n, który odwrotnie do parametru %s dzięki któremu możemy odczytawać z pamięci, to ten posłuży nam do zapisywania. No i właśnie dzięki temu możemy dowolny adres, nadpisać swoim, który w czasie wykonywania programu wykona wszystko czego zapragniemy :D . Oczywiście wymaga to wiele pracy i trudu z nadpisaniem odpowiedniego adresu (np. zmiennej środowiskowej z shellcodem :P ), no ale to ma być tylko bug base, a nie FAQ jak pisać exploity. Chyba jasne jest, że aby uniknąć tego bugu wystarczy dokładnie określać parametry, a nie iśc na łatwiznę.

Pozdrawiam Kerth
" Wszyscy wiedzą, że czegoś nie da się zrobić. I wtedy zjawia się ten, który nie wie, że nie da się tego zrobic i robi to."
Alber Einstein
Kerth
user
Avatar użytkownika
Posty: 245
Dołączył(a): So sie 21, 2004 20:23
Podziękował: 0 razy
Podziękowano: 0 razy
Reputacja: 1605

PostPn gru 20, 2004 22:40

3. integer overflow i boundary check error
Pierwszy rodzaj bledow wystepuje przede wszystkim kiedy alokujemy pamiec przy pomocy fukncji malloc i podobnych w nastepujacy sposob
malloc (ilosc*sizeof(int))
lub podobny
Jezelio teraz podamy zbyt wielka wartyosc zmiennej ilosc to liczbnik przekreci sie. przy nastepujacych dalej operacjach kopiowania moze zdazyc sie, ze skopiujemy zbyt duza ilosc danych nadpisujac jakies wazne miejsca w pamieci.
Drugii rodzaj bledow ma zwiazek z podaniem liczby ujemnej w miejscu oczekiwania dodatniej. popatrzmy na ten kawalek kodu:
char dane[256];
if (ilosc<256){
memcpy(bufor, dane, ilosc);
}
jezeli jako dane podamy liczbe ujemna to pierwszy warunak zostanie spelniony ale poniewaz funkcja memcpy przyjmuje ilosc danych do skopiowania jako lizcbe bez znaku (unsigned) podana przez nas liczba ujemna zostanie potraktowana jako duza liczba dodatnia powodujac przepelnienie bufora i byc moze nadpisanie waznych danych.
tego rodzaju bledy sa mozliwe do exploitacji tylko w konkretnych przypadkach poniewaz mamy ograniczony wplyw na ilosc kopiowanych danych. w wiekszosci przypadkow prowadza tylko do DoS.

btw. nie wiem czy opisywanie tego ma sens skoro wszystko co tu napiszemy i tak lepiej i dokladniej jest opisane np. w phracku
eax
Zasłużony
 
Posty: 193
Dołączył(a): N lip 11, 2004 19:59
Podziękował: 0 razy
Podziękowano: 0 razy
Reputacja: 1511

PostWt gru 21, 2004 17:32

[size=150]PASCALowa pamięć[/size]

Mam tu pewną rzecz co do alokacji i zwalniania pamięci w PASCALu za pomocą procedure getmem() i freemem. Otóż bardzo często zdarza się że zmiast czegoś takiego:
[code]
var
jeden_bajt : ^byTe;

BEGIN
getmem(jeden_bajt, sizeof(byTe));
freemem(jeden_bajt, sizeof(byTe));
END.
[/code]

Ludzie piszą coś takiego:
[code]
var
jeden_bajt : ^byTe;

BEGIN
getmem(jeden_bajt, sizeof(byTe));

{ tu jest BUG! }
freemem(jeden_bajt, 2);
END.
[/code]

Wtedy następuje zwolnienie dwóch bajtów pamięci, a typ BYTE (jak nazwa wskazuje) zajmuje jeden bajt. Wtedy robi się buuum.
Ostatnio edytowano Śr gru 22, 2004 21:47 przez Vitro, łącznie edytowano 1 raz
Vitro
Przyjaciel
Avatar użytkownika
Posty: 238
Dołączył(a): Cz wrz 02, 2004 15:29
Podziękował: 0 razy
Podziękowano: 1 razy
Reputacja: 1688

PostCz gru 23, 2004 0:54

Co do overflowów: http://www.buterux.info/tmp/txts/przepelnienia.txt Jak coś to więcej txt na prv.
[size=75]| www.webovers.org |"| www.strefaphp.net |"| www.kompy.net |
| But3ruX @ grono.net |"|[/size][size=92] www.buterux.info [/size][size=75]|"| b3x @ IRCnet |
| gg: 3468308 |"| Registered Linux User #359544 |"| b3x @ POLnet |[/size]
But3ruX
Przyjaciel
Avatar użytkownika
Posty: 176
Dołączył(a): N lip 18, 2004 0:40
Lokalizacja: stąd
Podziękował: 0 razy
Podziękowano: 0 razy
Reputacja: 1475

PostWt kwi 19, 2005 19:31

no to do But3ruX'a dodam jeszcze to (odnośnie stack overflowów) :

void funkcja(char* wskaznik) {
char bufor[10];
strcpy(bufor, wskaznik);
}

int main(int argc, char* argv[]) {
funkcja( argv[1] )
}
cały zonk polega na tym, że nie jest sprawdzany rozmiar ( ilość ) danych przekazywanych z wskaźnika do tablicy bufor. Progs się kompiluje a podczas wykonania drukuje ( znany wszystkim :lol: ) segmentation fault, ale wbrew pozorom kod się nie przerywa i tablica bufor (czyli stos) zostaje zapełniona nadmiarową ilością danych. Można to wykorzystać do wykonania własnego kodu przez program.

po więcej odsyłam do hakin9 magazine - tam jest świetny art o tym !!
Zostawcie dresów-też ludzie, tyle że OEM
[color=LimeGreen]URPL28[/color] : [[color=LimeGreen]IIIII[/color][color=Red]IIIII[/color]] ~50% | [color=LimeGreen]CNB team[/color] http://urpl28.cenobium.org/
To forum się ZESZMACIŁO, i nic na to nie poradzicie - jakieś wąty ?
liga_ochrony_roslin
user
Avatar użytkownika
Posty: 925
Dołączył(a): Cz paź 21, 2004 14:11
Lokalizacja: CNB Team
Podziękował: 0 razy
Podziękowano: 1 razy
Reputacja: 3050

PostCz cze 16, 2005 14:03

bugi w sql to znaczy w administracji oraz błąd include obydwa były w hackme 3.0 unknowa.
foster
user
 
Posty: 18
Dołączył(a): Wt cze 14, 2005 15:11
Podziękował: 0 razy
Podziękowano: 0 razy
Reputacja: 1077

PostPn lip 03, 2006 12:08

[size=150][php] Null byte poison[/size]
[size=75]podał MeMeK[/size]

kod z błędem:
[code]
$plik=$_GET['plik'] // lub $_POST['plik']
$plik=$plik.'.x'; // jakieś rozszerzenie.. tutaj '.x'
if (file_exists($plik))
{
include ($plik);

/* lub co gorsza
$f=fopen($plik,'r');
while (!feof($f))
{
$linia=fgets($f,500); //to tylko przykład
echo $linia;
}
fclose($f);
*/
}
else
{
echo"Blad! Pliku nie znaleziono!";
}
[/code]

Błąd często popełniany przez programistów php. Do wartosci zmiennej wysłanej do strony GET'em lub POST'em "doczepiana jest" końcówka (najczęściej rozszerzenie or sth). I teraz jesli przez atakującego zostanie wysłany ciąg znaków (np index.php), gdzie na końcu znajduje się bajt zerowy (%00) to po doczepieniu do tak przygotowanego ciągu rozszerzenia otrzymujemy coś w stylu:

[code]$plik=index.php%00.x //.x to doczepiane rozrzerzenie[/code]

I jeśli dojdzie do wywołainia fukcji include bądź co gorsza fopen() to tak naprawdę zostanie otwarty plik index.php, ponieważ zostanie zignorowane wszystko po %00. Jeśli było to include() to można wywołać nieskończoną pętle, a jeśli fopen() możemy podejrzec źródła wszystkich plików na serwerze (a nawet samego index.php).


Jak temu zaradzić?

Nie działajmy bezpośrednio na zmiennych pochodzących z GET i/lub POST. Możemy wykorzystać jakieś instrukcje warunkowe np:

[code]if ($plik = 'linki') include('linki.php");[/code]

Okazuje się, że na niektórych serwerach...
Możemy też wszystkie pliki, które nie powinny być podatne na podejrzenie / wykonanie umieścić w katalogu nadrzędnym (bądź równorzędnym) względem tego podanego w wywołaniu funkcji np:

[code]include ("folder/".$plik);[/code]

Teraz nie można podejrzeć / wykonać za pomocą bajtu zerowego plików z katalogów nadrzednych/równorzędnych względem katalogu "folder"
[color=gray][url=http://www.vexillium.org/]memek//vx[/url]
To see a world in a grain of sand, And a heaven in a wild flower,
Hold infinity in the palm of your hand, And eternity in an hour.
William Blake[/color]
MeMeK
Moderator
Avatar użytkownika
Posty: 647
Dołączył(a): Śr sie 17, 2005 10:23
Podziękował: 2 razy
Podziękowano: 19 razy
Reputacja: 4421

Sorry ale nie moglem sie powstrzymac :P

Najczestszy blad u programisty to "glupota" ;]
lenistwo i niedbalstwo :P

w firmach "czas" ;]

[color=#FF0000]Dopisek admina: A czasem niewiedza lub nieświadomość ;>[/color]
You make me, You break me,
You build me up, to tear me down.
Fable
user
Avatar użytkownika
Posty: 34
Dołączył(a): Wt cze 19, 2007 9:44
Podziękował: 0 razy
Podziękowano: 0 razy
Reputacja: 925

A skoro temat odświeżony, to ja nieśmiało zwrócę uwagę na błąd MeMeK :) Jeśli jedynym zabezpieczeniem będzie umieszczenie plików w podkatalogu i użycie czegoś w stylu "include ("folder/".$plik)", to nic nie daje, bo przecież można użyć ../ aby dostać się do katalogu nadrzędnego :)
[color=grey][size=85]
W czasie kiedy to pisalem, testy robilem na serwerze, na ktorym nie dzialalo '../' wiec tak napisalem nie sprawdziwszy innych. Teraz sprawdzilem na innych i fakt w wiekszosci '../' dziala, wiec poprawka musi byc ;-) //MeMeK[/size][/color]

I otworzyła studnię Czeluści,
a dym się uniósł ze studni jak dym z wielkiego pieca,
i od dymu zaćmiło się słońce i powietrze.
A z dymu wyszła szarańcza na ziemię,
i dano jej moc jaką mają ziemskie skorpiony.
Ormi
user
Avatar użytkownika
Posty: 38
Dołączył(a): Wt lip 15, 2008 17:07
Podziękował: 0 razy
Podziękowano: 0 razy
Reputacja: 835

[quote="Kerth"]Analizując pierwszy przykład program nie ma określonej zmiennej na której ma wykonać parametr "%x", dlatego bierze pierwsze co leży na stosie i pokazuje nam to w postaci szesnastkowej (bo do tego służy ten parametr). Tym samym sposobem teraz możemy podejrzeć cały stos, ale to nie o to nam chodzi. Głównym daniem dla intruza jest jednak parametr %n, który odwrotnie do parametru %s dzięki któremu możemy odczytawać z pamięci, to ten posłuży nam do zapisywania. No i właśnie dzięki temu możemy dowolny adres, nadpisać swoim, który w czasie wykonywania programu wykona wszystko czego zapragniemy :D . Oczywiście wymaga to wiele pracy i trudu z nadpisaniem odpowiedniego adresu (np. zmiennej środowiskowej z shellcodem :P ), no ale to ma być tylko bug base, a nie FAQ jak pisać exploity. Chyba jasne jest, że aby uniknąć tego bugu wystarczy dokładnie określać parametry, a nie iśc na łatwiznę.


A ja w tym momencie trochę zareklamuję Gyna i siebie i odeślę do arta...
[http://gynvael.coldwind.pl/?id=86]
Mowa w nim o tym błędzie na Viscie...
oshogbo
user
Avatar użytkownika
Posty: 6
Dołączył(a): So kwi 15, 2006 10:45
Lokalizacja: Skierniewice
Podziękował: 0 razy
Podziękowano: 0 razy
Reputacja: 1

[quote="Ormi"]A skoro temat odświeżony, to ja nieśmiało zwrócę uwagę na błąd MeMeK :) Jeśli jedynym zabezpieczeniem będzie umieszczenie plików w podkatalogu i użycie czegoś w stylu "include ("folder/".$plik)", to nic nie daje, bo przecież można użyć ../ aby dostać się do katalogu nadrzędnego :)
[color=grey][size=85]
W czasie kiedy to pisalem, testy robilem na serwerze, na ktorym nie dzialalo '../' wiec tak napisalem nie sprawdziwszy innych. Teraz sprawdzilem na innych i fakt w wiekszosci '../' dziala, wiec poprawka musi byc ;-) //MeMeK[/size][/color]


Rozumiem że przykład z PHP'a
Tak chyba że programista pomyśli i przed funkcją include przefiltruje zmienną plik :) Do tego można jeszcze dodać bajt zerowy %00 gdyby programista :)
LeVuS
user
Avatar użytkownika
Posty: 184
Dołączył(a): Wt lut 24, 2009 11:35
Lokalizacja: Gorlice
Podziękował: 0 razy
Podziękowano: 0 razy
Reputacja: 1071

[quote="LeVuS"]Rozumiem że przykład z PHP'a


Ad. PHP, polecam taka strone ze stackoverflow'a:
http://stackoverflow.com/questions/3115 ... -functions

Na tej podstawie (i na podstawie kilku swoich znalezisk/mini-artow) pisalem kiedys zgrabny tutorial
z ktorego mozna bylo troche poczytac o tym jak bugi (zwiazane z tymi funkcjami) wykorzystywac.
Jakby ktos byl chetny, moge podrzucic kilka malych opisow (chociaz nie wiem czy to ma sens po 3 latach ;))
human abstraction layer
hello_world
user
Avatar użytkownika
Posty: 103
Dołączył(a): Wt kwi 10, 2012 6:55
Podziękował: 7 razy
Podziękowano: 8 razy
Reputacja: 1431
Góra

Powrót do Security

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość