publikacja: 14 września 2011, autor: , komentarzy 41 https://wpninja.pl/artykuly/zakodowany-fragment-motywu-do-wordpressa/

Zakodowany fragment motywu do WordPressa

Zakodowany fragment motywu do WordPressa

Pobierając motyw do WordPressa z podejrzanych źródeł powinniśmy liczyć się z niemiłymi niespodziankami. Jedną z nich może być zakodowany fragment kodu, który bez naszej wiedzy przekazuje dalej poufne dane. Warto wiedzieć jak zidentyfikować taki fragment, jak go rozkodować i wyplewić ewentualne chwasty.

Feralny motyw

Zgłosił się do mnie ostatnio jeden z czytelników strony wraz z prośbą o pomoc w odszukaniu pewnej frazy w motywie, którą chciał przetłumaczyć. Okazało się, że sam nie mógł tego znaleźć, ponieważ fragment, w którym się znajdowała był zakodowany.

Motywem był GamersCosmos, który został pobrany ze strony Free WordPress Theme Album (niestety pierwotna lokalizacja nie jest już dostępna).

Identyfikacja zakodowanego fragmentu

Osoby, które próbują ukryć część kodu, wykorzystują do tego najczęściej dwie funkcje PHP – base_64_decode oraz eval. Trzeba więc sprawdzić czy przypadkiem nie znajdują się one w plikach motywu. Można do tego użyć specjalnego programu, który wyszukuje dany ciąg znaków. Osobiście używam do tego typu czynności starego, dobrego Agenta Ransacka.

Program znalazł wywołanie obu wspomnianych funkcji w pliku footer.php:

$_F=__FILE__;$_X='Pz48ZDR2IDRkPSJiMnR0Mm0tYyI+PC9kNHY+PC9kNHY+PCEtLSAjYzJudDE0bjVyIC0tPg0KDQo8ZDR2IDRkPSJmMjJ0NXIiPjxkNHYgY2wxc3M9IndyMXAgY2w1MXJmNHgiPg0KCTxkNHYgY2wxc3M9ImJsMmNrIGY0cnN0IiA0ZD0icjVjNW50LTVudHI0NXMiPg0KCQk8aGEgY2wxc3M9ImJsMmNrLXQ0dGw1Ij5SNWM1bnQgUDJzdHM8L2hhPg0KCQk8M2w+DQoJCQk8P3BocCBtZHZfcjVjNW50X3Ayc3RzKGkpID8+DQoJCTwvM2w+DQoJPC9kNHY+DQoNCgk8ZDR2IGNsMXNzPSJibDJjayBsMXN0IiA0ZD0icjVjNW50LWMybW01bnRzIj4NCgkJPGhhIGNsMXNzPSJibDJjay10NHRsNSI+UjVjNW50IEMybW01bnRzPC9oYT4NCgkJPDNsPg0KCQkJPD9waHAgc3JjX3M0bXBsNV9yNWM1bnRfYzJtbTVudHMoaSkgPz4NCgkJPC8zbD4NCgk8L2Q0dj4NCg0KCTxkNHYgNGQ9ImYyMnQ1ci1sNG5rIj4NCgkJPHA+QzJweXI0Z2h0ICZjMnB5OyA8P3BocCA1Y2gyIGQxdDUoJ1knKTs/PiA8MSBocjVmPSI8P3BocA0KYmwyZzRuZjIoJ3M0dDUzcmwnKTsgPz4iIHQ0dGw1PSI8P3BocCBibDJnNG5mMignbjFtNScpOyA/PiI+PD9waHANCmJsMmc0bmYyKCduMW01Jyk7ID8+PC8xPiAtIDw/cGhwIGJsMmc0bmYyKCdkNXNjcjRwdDQybicpOyA/Pi48YnIvPg0KVzViIHM0dDUgcDJ3NXI1ZCBieSA8MSBocjVmPSJodHRwOi8vdzJyZHByNXNzLjJyZyI+VzJyZFByNXNzIENNUzwvMT4NCjFuZCAxIGZyNTUgdzJyZHByNXNzIHRoNW01IGQ1czRnbjVkIGJ5IDwxDQpocjVmPSJodHRwOi8vbW0yaDN0LmMybS9zMmM0MWwtZzFtNXMiPkYxYzViMjJrIEcxbTVzPC8xPi4NClNwMm5zMnI1ZCBieSA8MSBocjVmPSJodHRwOi8vbW0yaDN0LmMybS8iPk1NT1JQR3M8LzE+LCA8MQ0KaHI1Zj0iaHR0cDovL3d3dy5oMnN0di5jMm0iPlZQUyBIMnN0NG5nPC8xPiAxbmQgPDEgDQoNCmhyNWY9Imh0dHA6Ly93d3cuYzRydDV4aDJzdDRuZy5jMm0vIj5XNWJzNHQ1IEgyc3Q0bmc8LzE+PC9wPg0KCTwvZDR2PjwhLS0gL2YyMnQ1ci1sNG5rIC0tPg0KPC9kNHY+PC9kNHY+PCEtLSAjZjIydDVyIC0tPg0KPD9waHAgd3BfZjIydDVyKCk7ID8+DQo8L2IyZHk+DQo8L2h0bWw+';eval(base64_decode('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));

Dekodowanie czyli co ktoś chciał przed nami ukryć

Po rozbiciu kodu na oddzielne wiersze otrzymamy:

$_F=__FILE__;
$_X='Pz48ZDR2IDRkPSJiMnR0Mm0tYyI+PC9kNHY+PC9kNHY+PCEtLSAjYzJudDE0bjVyIC0tPg0KDQo8ZDR2IDRkPSJmMjJ0NXIiPjxkNHYgY2wxc3M9IndyMXAgY2w1MXJmNHgiPg0KCTxkNHYgY2wxc3M9ImJsMmNrIGY0cnN0IiA0ZD0icjVjNW50LTVudHI0NXMiPg0KCQk8aGEgY2wxc3M9ImJsMmNrLXQ0dGw1Ij5SNWM1bnQgUDJzdHM8L2hhPg0KCQk8M2w+DQoJCQk8P3BocCBtZHZfcjVjNW50X3Ayc3RzKGkpID8+DQoJCTwvM2w+DQoJPC9kNHY+DQoNCgk8ZDR2IGNsMXNzPSJibDJjayBsMXN0IiA0ZD0icjVjNW50LWMybW01bnRzIj4NCgkJPGhhIGNsMXNzPSJibDJjay10NHRsNSI+UjVjNW50IEMybW01bnRzPC9oYT4NCgkJPDNsPg0KCQkJPD9waHAgc3JjX3M0bXBsNV9yNWM1bnRfYzJtbTVudHMoaSkgPz4NCgkJPC8zbD4NCgk8L2Q0dj4NCg0KCTxkNHYgNGQ9ImYyMnQ1ci1sNG5rIj4NCgkJPHA+QzJweXI0Z2h0ICZjMnB5OyA8P3BocCA1Y2gyIGQxdDUoJ1knKTs/PiA8MSBocjVmPSI8P3BocA0KYmwyZzRuZjIoJ3M0dDUzcmwnKTsgPz4iIHQ0dGw1PSI8P3BocCBibDJnNG5mMignbjFtNScpOyA/PiI+PD9waHANCmJsMmc0bmYyKCduMW01Jyk7ID8+PC8xPiAtIDw/cGhwIGJsMmc0bmYyKCdkNXNjcjRwdDQybicpOyA/Pi48YnIvPg0KVzViIHM0dDUgcDJ3NXI1ZCBieSA8MSBocjVmPSJodHRwOi8vdzJyZHByNXNzLjJyZyI+VzJyZFByNXNzIENNUzwvMT4NCjFuZCAxIGZyNTUgdzJyZHByNXNzIHRoNW01IGQ1czRnbjVkIGJ5IDwxDQpocjVmPSJodHRwOi8vbW0yaDN0LmMybS9zMmM0MWwtZzFtNXMiPkYxYzViMjJrIEcxbTVzPC8xPi4NClNwMm5zMnI1ZCBieSA8MSBocjVmPSJodHRwOi8vbW0yaDN0LmMybS8iPk1NT1JQR3M8LzE+LCA8MQ0KaHI1Zj0iaHR0cDovL3d3dy5oMnN0di5jMm0iPlZQUyBIMnN0NG5nPC8xPiAxbmQgPDEgDQoNCmhyNWY9Imh0dHA6Ly93d3cuYzRydDV4aDJzdDRuZy5jMm0vIj5XNWJzNHQ1IEgyc3Q0bmc8LzE+PC9wPg0KCTwvZDR2PjwhLS0gL2YyMnQ1ci1sNG5rIC0tPg0KPC9kNHY+PC9kNHY+PCEtLSAjZjIydDVyIC0tPg0KPD9waHAgd3BfZjIydDVyKCk7ID8+DQo8L2IyZHk+DQo8L2h0bWw+';
eval(base64_decode('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));

Uwagę skupimy na ostatnim wierszu. Ciąg znaków znajdujący się w cudzysłowie przerzucimy do narzędzia dekodującego. W rezultacie otrzymamy następujący kod:

$_X=base64_decode($_X);
$_X=strtr($_X,'123456aouie','aouie123456');
$_R=ereg_replace('__FILE__',"'".$_F."'",$_X);
eval($_R);
$_R=0;
$_X=0;

Jak widać pierwszy wiersz to znowu dekodowanie:

?><d4v 4d="b2tt2m-c"></d4v></d4v><!-- #c2nt14n5r -->
 
<d4v 4d="f22t5r"><d4v cl1ss="wr1p cl51rf4x">
	<d4v cl1ss="bl2ck f4rst" 4d="r5c5nt-5ntr45s">
		<ha cl1ss="bl2ck-t4tl5">R5c5nt P2sts</ha>
		<3l>
			<?php mdv_r5c5nt_p2sts(i) ?>
		</3l>
	</d4v>
 
	<d4v cl1ss="bl2ck l1st" 4d="r5c5nt-c2mm5nts">
		<ha cl1ss="bl2ck-t4tl5">R5c5nt C2mm5nts</ha>
		<3l>
			<?php src_s4mpl5_r5c5nt_c2mm5nts(i) ?>
		</3l>
	</d4v>
 
	<d4v 4d="f22t5r-l4nk">
		<p>C2pyr4ght &c2py; <?php 5ch2 d1t5('Y');?> <1 hr5f="<?php
bl2g4nf2('s4t53rl'); ?>" t4tl5="<?php bl2g4nf2('n1m5'); ?>"><?php
bl2g4nf2('n1m5'); ?></1> - <?php bl2g4nf2('d5scr4pt42n'); ?>.<br/>
W5b s4t5 p2w5r5d by <1 hr5f="http://w2rdpr5ss.2rg">W2rdPr5ss CMS</1>
1nd 1 fr55 w2rdpr5ss th5m5 d5s4gn5d by <1
hr5f="http://mm2h3t.c2m/s2c41l-g1m5s">F1c5b22k G1m5s</1>.
Sp2ns2r5d by <1 hr5f="http://mm2h3t.c2m/">MMORPGs</1>, <1
hr5f="http://www.h2stv.c2m">VPS H2st4ng</1> 1nd <1 
 
hr5f="http://www.c4rt5xh2st4ng.c2m/">W5bs4t5 H2st4ng</1></p>
	</d4v><!-- /f22t5r-l4nk -->
</d4v></d4v><!-- #f22t5r -->
<?php wp_f22t5r(); ?>
</b2dy>
</html>

Natomiast drugi wiersz to podmiana znaków (w komentarzach znajduje się także obszerniejszy opis tego kroku):

?><div id="bottom-c"></div></div><!-- #container -->
 
<div id="footer"><div class="wrap clearfix">
	<div class="block first" id="recent-entries">
		<h2 class="block-title">Recent Posts</h2>
		<ul>
			<?php mdv_recent_posts(5) ?>
		</ul>
	</div>
 
	<div class="block last" id="recent-comments">
		<h2 class="block-title">Recent Comments</h2>
		<ul>
			<?php src_simple_recent_comments(5) ?>
		</ul>
	</div>
 
	<div id="footer-link">
		<p>Copyright &copy; <?php echo date('Y');?> <a href="<?php
bloginfo('siteurl'); ?>" title="<?php bloginfo('name'); ?>"><?php
bloginfo('name'); ?></a> - <?php bloginfo('description'); ?>.<br/>
Web site powered by <a href="https://wordpress.org">WordPress CMS</a>
and a free wordpress theme designed by <a
href="http://mmohut.com/social-games">Facebook Games</a>.
Sponsored by <a href="http://mmohut.com/">MMORPGs</a>, <a
href="http://www.hostv.com">VPS Hosting</a> and <a 
 
href="http://www.cirtexhosting.com/">Website Hosting</a></p>
	</div><!-- /footer-link -->
</div></div><!-- #footer -->
<?php wp_footer(); ?>
</body>
</html>

Reszta kodu nie jest już istotna, ma na celu utrudnienie wyciągnięcia danych poza zakodowanym fragmentem.

Tym sposobem uzyskaliśmy czysty kod motywu. Widać jak na dłoni co ktoś chciał przed nami ukryć – kod HTML znajdujący się w bloku „footer-link” to po prostu spamerskie odnośniki do różnych stron internetowych. Wystarczy teraz usunąć zbędne odnośniki i zastąpić zakodowany fragment odkodowaną wersją.

Konkluzja czyli wnioski na przyszłość

Tym razem zagrożenie nie było duże, ale zakodowany fragment równie dobrze mógł wysyłać nasze hasło na ustalony adres e-mail. Dlatego też warto:

  • Unikać podejrzanych stron udostępniających motywy. Najlepiej w nowe motywy zaopatrywać się z oficjalnego katalogu WordPressa lub bezpośrednio ze strony autora lub sklepu.
  • Przed uruchomieniem motywu sprawdzić czy nie zawiera on podejrzanych rzeczy a w szczególności zakodowanych fragmentów. Warto też posłużyć się specjalnymi wtyczkami takimi jak Exploit Scanner.
  • Nie skreślać motywu tylko dlatego, że posiada zakodowany fragment. W prosty sposób można go odkodować i usunąć niepotrzebne rzeczy. Nie ma też co obwiniać autora, bo to najczęściej dzieło osób trzecich.
  • Standardowo – nie używać tego samego hasła do wielu kont tak aby w przypadku kradzieży ograniczyć ewentualne straty.

Czy Wam też zdarzyło się natrafić na motyw z zakodowanym fragmentem?

Dodaj własny komentarz