czwartek, 24 lipca 2008

Python, biblioteka urllib(2) i dodatkowe aspekty bezpieczeństwa aplikacji webowych

urllib (2) jest biblioteką Pythona do pobierania plików poprzez adres url,
dodatkowo umożliwia manipulację całego zapytania, pozwala na tworzenie własnego nagłówka zapytania cz manipulację ciasteczek, a nawet wysyłanie POST content'u.

Przyjrzyjmy sie prostej funkcji:

zobacz

zmienne user_agent i user_agent2 zawierają zmienną naszego agenta czyli tak jak zazwyczaj przedstawia się przeglądarka internetowa.

Za zmienną user_agent możemy podstawić dowolnego stringa w tym taki xml'owe (html'owe) a nawet kod dowolnego języka najlepiej skryptowego.

Jeżeli nieuważny webmaster posiada na swoim serwerze system do przeglądania statystyk, który wyświetla wszystkie informacje o użytkownikach, którzy przeglądali strony może nieświadomie uruchomić JavaScript, który podrzucimy mu w zmiennej user_agent. Oczywiście ten alert() w przykładzie jest bardzo subtelny, równie dobrze można by tam dorzucić jakiś XSS.



kolejna zmienna zawiera ciasteczka w naszym przypadku PHPSESSID.
Różna może być reakcja skryptu na serwerze w przypadku, gdy zmienna sesji posiada niedozwolone znaki. Polecam to sprawdzić.

funkcja save_it(url, filename, proxy, port) zapisuje zawartość strony zawartej pod adresem url do pliku filename, a jeśli zmienna proxy jest różna od None to połączenie odbywa się przez serwer proxy na podanym porcie.

Na koniec dorzucam jeszcze skrypt do wysyłania POST contentu:

zobacz

piątek, 27 czerwca 2008

Instalacja sterownika do karty WiFi Realtek RTL8187B pod (K) Ubuntu

Cała instalacja jest znacznie prostrza niż mogłoby się wydawać na pierwszy rzut oka i zajmuje mniej niż 2 minuty.
Początkowo mój błąd polegał na tym, że próbowałem instalować oryginalne sterowniki pod Windows XP przy użyciu ndiswrapper'a. Niestety bezskutecznie.

Gdy w ręce wpadł mi zmodyfikowany sterownik,problem praktycznie rozwiązał się sam. Właściwie cały sposób instalacji opisany jest w pliku ReadMe.txt

Żeby się do niego dostać: rozpakowujemy paczkę tar.gz np. Ark'em lub z konsoli:

$ mkdir /tmp/wifidriver/
$ chmod 755
/tmp/wifidriver/
$ tar xzvf rtl8187b-modified-jadams-2-1-2008.tar.gz /tmp/wifidriver/

przechodzimy do kalalogu:
$cd /tmp/wifidriver/

i odpalamy skrypt makedrv i uprawnieniami root'a, czyli:
$ sudo ./makedrv

a nastęnie:
$ sudo ./wlan0up

gdyby nie działało to najpierw:
$ sudo ./wlan0down
$ sudo ./wlan0up

Autor tego opracownia proponuje wykorzystanie narzędzia iwlist

Ja ułatwiłem sobie nieco zadanie dzięki (K)WiFiManager:
$ sudo apt-get install (k)wifimanager

literkę k dodajemy aby ściągnąć wersje dla KDE.

oraz (K)NetworkManager do konfiguracji IP w przypadku gdy Access Point nie przydziela go z DHCP'a.

I jeszcze dowód na to, że wszystko działa :)

Miłego korzystanie z sieci bezprzewodowej...

sobota, 23 lutego 2008

Bezpieczeństwo skryptów z punktu widzenia programisty

Pisanie własnego kodu daje dużo satysfakcji, jednakże wiąże sie z pewnym ryzykiem, że ktoś znajdzie lukę w naszym kodzie i umiejętnie ją wykorzysta do kradzieży lub manipulacji danych, przejęcia konta, itp. Bardzo ważnym elementem przy pisaniu aplikacji jest walidacja wpisywanych/pobieranych danych. W pierwszym przypadku (wpisywanie danych) zazwyczaj oczekujemy określonego typu danych np. wartości liczbowej czy tekstu pozbawionego tagów html ( warto przemyśleć zastosowanie funkcji: string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] ) ), również w prosty sposób możemy sprawdzić czy wprowadzona wartość jest liczbą, przydatna możne być funkcja: bool is_numeric ( mixed $var ) oraz podobne( is_float(), is_int() ). Stosowanie takich zabezpieczeń minimalizuje ryzyko ataków typu XSS czy CSRF. Warto jeszcze dodać, że walidację formularzy powinno wykonywać sie dwukrotnie - za pierwszym razem po stronie klienta oraz za drugim razem na serwerze na wypadek gdyby podstępny użytkownik "majstrował" przy formularzu.

Kolejnym bardzo ważnym aspektem zabezpieczania skryptów jest ścieżka dostępu do pliku( zasobu). Szczególnie jest to poważny problem w przypadku tworzenia skryptu do przeglądania zawartości katalogu, należy bardzo uważać na odwołania typu: ../, ../../ itd. Oto przykład nie w pełni zabezpieczonego skryptu: Thepeak File Upload v1.3 . Można w prosty sposób wydobyć dowolny plik na serwerze( trzeba tylko oczywiście znać pełną ścieżkę dostępu do tego pliku).
Dobrym rozwiązaniem jest tutaj funkcja: string basename ( string $path [, string $suffix ] ).

W przypadku skryptów uploadujących pliki na serwer należy pamiętać o sprawdzeniu typów wgrywanych plików, dla przykładu nie powinno sie zezwalać na pliki typu: "application/x-httpd-php", "application/octet-stream" lub podobnych, ze względu na to, że mogą zostać wykonane na serwerze.

Wstrzykiwanie( injection) zainfekowanego kodu to temat bardzo rozległy i szczególnie niebezpieczny w przypadku tzw. SqlInjection. Po ataku na stronę Szkoły Hakerów, mamy nawet możliwość zrobienia tego legalnie: hackme.pdf. Ponieważ każde odwołanie sie do bazy sql wymaga napisania osobnego kodu, czasami bardzo łatwo popełnić błąd w postaci luki w systemie bezpieczeństwa, dotyczy do przede wszystkim początkujących programistów, ale jak widać na przykładzie Szkoły Hakerów, nie tylko. Szczególnie, że na stronie szkoły znalazłem również miejsce podatne na ataki XSS.

Należy również unikać wykonywania kodu podawanego w postaci jawnego tekstu(sringa), mam tu na myśli funkcję: mixed eval ( string $code_str ).

Na koniec uwaga dotycząca składowania danych: ważne dane(loginy, hasła, itp.) na serwerze powinno być przechowywane w bezpieczny sposób, w miejscach do których przeciętny użytkownik nie ma dostępu, najlepiej w postaci shaszowanej(md5, itp.).


piątek, 8 lutego 2008

Łamanie haseł - algorytmy brute force

Techniki brute force są najskuteczniejsze nie ze względu na wymyślne algorytmy, ale ze względu na prostotę działania. Schemat sprowadza się zawsze do tej samej metody którą można opisać dokładnie jednym zdaniem: "znajdź rozwiązanie sprawdzając kolejne możliwości(kombinacje)". Oczywiście algorytm można przerwać w momencie znalezienia rozwiązania, no chyba, że oczekujemy więcej poprawnych rozwiązań.

Może warto odwołać sie do jakiegoś przykładu. Niech to będzie łamanie hasła zaszyfrowanego archiwum RAR. Załóżmy, że mamy do dyspozycji program unrar (unrar.exe w środowisku za którym nie przepadam :) ) dowolny kompilator języka C( cc, gcc), bash lub dowolny język skryptowy z którego można wywoływać polecenia zewnętrzne.

Schemat działania jest prosty:

1) Definiujemy tablice znaków char tablica_znaków[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

2) Piszemy podprogram do generowania wszystkich możliwych wariacji z powtórzeniami ze znaków tablicy zadeklarowanej w punkcie (1), oczywiście wariacje muszą mieć długość od 1 do length(tablica_znaków[])

3) W pętli odpalamy unrara tj. unrar nazwa_archiwum.rar i-ta_kombinacja

Cóż, wydawać by sie mogło nic trudnego; jedyna rzecz która psuje całą zabawę to czas jaki zajmie sprawdzenie wszyskich możliwości.
Jeśli hasło ma 3 znaki( ilość możliwości = length(tablica_znaków[]) + length(tablica_znaków[]) * length(tablica_znaków[]) + length(tablica_znaków[]) * length(tablica_znaków[]) * length(tablica_znaków[]) ) czas oczekiwania na odpowiedz jest w granicach naszych oczekiwań. W przypadku dłuższego hasła potrwa to o wiele, wiele dłużej (przyrost jest wykładniczy). Nawet wspomaganie sie dzieleniem zadań na wątki niewiele sie przyda w kontekście zysku czasowego.

Można oczywiści zawęzić alfabet, jeśli wiemy, że jakiś znaków na pewno nie zawiera hasło lub stosować dodatkowe algorytmy heurystyczne( np. zakładać że między spółgłoskami musi znajdować sie samogłoska) , ale wtedy istnieje prawdopodobieństwo, że nie znajdziemy hasła.

Mimo wszystko czasami warto próbować brute-for'ca, w końcu nie wszystkich chce sie wpisywać długie i wymyślnme hasła.... a nuż sie uda.

poniedziałek, 17 grudnia 2007

Krótka refleksja na temet skryptów

Czym jest skrypt? Według Wikipedii: "Język skryptowy to zazwyczaj interpretowany język programowania o różnym przeznaczeniu. Programy napisane w języku skryptowym nazywane są skryptami i przechowywane są zwykle w postaci kodu źródłowego.".

Skrypty są pomocne, ułatwiają życie programistom i webmasterom, przyspieszają automatyzacje pewnych procesów, ułatwiają generowanie szablonów ... trudno chyba wymienić korzyści płynące z ich stosowania.

Skrypty wykonywane przez serwer są zazwyczaj dla klientów niezauważalne, "przeźroczyste"

Warto jednak zwrócić uwagę na potencjalne zagrożenie jakie mogą stanowić skrypty wykonywane po stronie użytkownika(w rozumieniu klienta) - mam tu na myśli przede wszystkim takie języki jak JavaScript, VisualBasicScript czy inne. O ile wyskakujące flash - owe reklamy czy tzw. pop - upy stanowią najmniejsze zagrożenie, co nie zmienia faktu, że są denerwujące, o tyle warto zwrócić uwagę na fakt, że skrypt może wywołać inną aplikację.

Przyjrzyjmy sie skryptowi:

<script type="text/javascript" language="JScript">
var shell = new ActiveXObject("WScript.Shell");
var plik = "C:\\windows\\notepad.exe";
shell.run(plik);
</script>

Efekt jest łatwy do wydedukowania bez jego uruchamiania: skrypt uruchomi notatnik o ile plik notepad.exe znajduje się w katalogu C:\Windows\

A teraz załóżmy następujący scenariusz:
Skrypt zapisuje zawartość plik binarnego wirusa do pliku z wykonywalnym rozszerzeniem na naszym dysku, a następny wykonuje shell.run(plik) dla tego pliku wirusa.

Jak zapobiegać takim sytuacjom?

1) Korzystać z bezpiecznych przeglądarek internetowych, takich jak: Firefox czy Opera;
2) Doinstalować plug-in do blokowania skryptów(ja używam NoScript);
3) Zezwalać na wykonywanie skryptów tylko dla zaufanych witryn: np. banków, sklepów internetowych itp.

wtorek, 4 grudnia 2007

Windows XP jako serwer proxy?

Autor tego bloga jest zdania, że lepszy do zastosowań serwerowych jest bezapelacyjnie linux, niezależnie od tego czy jest to serwer http, ftp, proxy czy jakikolwiek i inny.

W celu "postawienia" serwera będziemy potrzebowali: dwóch kart sieciowych( najlepiej gdy jedna z nich to karta sieci bezprzewodowej), serwera proxy, na przykład:

privoxy

Ustawienia karty sieciowej z którą łączymy sie z internetem pozostawiamy bez zmian, natomiast tą która jako ma służyć do połączeń proxy konfigurujemy następująco:
tworzymy sieć najlepiej klasy C (np. 192.168.3.1, 255.255.255.0),
Podajemy tylko adres IP oraz maskę podsieci, bez bramy(!!!)


W katalogu instalacyjnym serwera szukamy pliku config.txt i edytujemy wpis:

listen-address IP:[port]

dla mojego przykładu :

listen-address 192.168.3.1:8765

inne ustawienia - wedle uznania.

Uruchamiamy drugą "sieciówkę", jeśli jest to "bezprzewodowa", to dodajemy nową sieć z parametrami wedle uznania, ostatecznie odpalamy aplikację serwera.

Jeśli wszystko pójdzie poprawnie powinniśmy otrzymać komunikat: info: Listening on port xxxx on IP address yyy.yyy.yyy.yyy

Dla ścisłości klienci naszego serwera, powinni przypisać sobie unikalne IP, a jako bramę podać IP naszej drugiej "sieciówki", czyli na przykład:

192.168.3.100
255.255.255.0
192.168.3.1

Miłej zabawy.

Instalacja systemu Windows XP na laptopie z dyskiem SATA(Serial ATA)

Niedawno miałem okazję instalować Win XP na laptopie Toshiba Satellite L40-14b zakupionym bez systemu operacyjnego. Okazuje się że nie jest to takie proste jak wydawać by się mogło na pierwszy rzut oka. Problem polega na tym, że XPek nie wspiera dysków SATA, a nie można załadować dodatkowych sterowników z dyskietki przy starcie programu instalacyjnego, ponieważ laptopy od pewnego czasu nie mają już stacji dyskietek. Nie ma jednak sytuacji bez wyjścia, wystarczy spreparować dysk instalacyjny z systemem operacyjnym przy użyciu narzędzia: nLite
Wcześniej należy pobrać sterowniki z odpowiedniej strony, w przypadku L40 jest to strona Intela:
Intel Chipset Drivers
a konkretnie należy pobrać tzw. F6 - drivers:

32-bit Floppy Configuration Utility for Intel® Matrix Storage Manager

EDIT(01.03.2008):
Uwaga: Instalator z f6flpy32.zip wypakowuje pliki na dyskietkę lub do pliku IMA,
Aby ułatwić zadanie tu: F6.rar znajdują sie te pliki w formacie rar.

Można skorzystać też z narzędzia: http://www.magiciso.com/ do wypakowania plików z IMA

koniec: EDIT

Teraz krok po kroku:
1) zrzucamy zawartość płytki z Windowsem na dysk do katalogu;
2) rozpakowujemy F6 - drivers do osobnego katalogu;
3) odpalamy program nLite i podajemy lokalizację zrzutu płyty z systemem
4) przy wyborze zadań: obowiązkowo zaznaczamy opcje: Sterowniki i Boot-owalny obraz ISO,
można też wybrać więcej zadań i od razu wpisać KEY, a nawet zintegrować service-pack 2.
5) ładujemy sterowniki i czekamy aż nLite utworzy plik ISO z spreparowanym systemem

Wypalamy obraz ISO na CD (najlepiej tymczasowo na CD-RW, jeśli nie możemy virtualnie sprawdzić jak działa spreparowany instalator, na przykład przy użuciu Virtual PC)
i instalujemy system.