.
13 января 2016

Пример анализа взлома сайта Joomla и устранение причины проникновения com_contenthistory

Собственно, может кому интересно будет — небольшой пример из текущего (буду краток).
Гемор: джумла, за безопасностью которой особо никто не следит, потому что джумла!
По знакомству данный гемор лежит на моём серваке, где у меня ночью отрабатывает самописный скриптик по отлову изменений в скриптах, и информирует меня в случае оных.
Вот и проинформировал меня вчера о появлении нового скрипта " /images/stat.php < 92427 "
Излюбленное место хранения бэкдоров и наиболее популярное для бэкдора название :)
Смотрим файло глазами:
<?php
function lbbe5bd6b5b1b371330fc197e85d8faeeda8d31(){}
function lbbb64972a71893038184348194439206f2b86b7b6(){$i0ccdb47=406; return $i0ccdb47/7168;}
function lbbd6f597bdddd3586a4fcf767667458690fc6a4edfdbcd7f5922(){for($e7f7=210;$e7f7<29801;$e7f7++){if($e7f7!=21981) break;}}
function lbbb604ba3d1e8341acd8c462567168f3a53278a589b598dc78(){for($e7f7=153;$e7f7<28845;$e7f7-=34){if($e7f7!=16257) break;}}
function lbbdfea35e7773f3bffdaedb7c52efbb6eef61(){}
function lbbb3f9b0d7ab3f7(){$i0ccdb47=4554; return $i0ccdb47%11316;}
......

видим обфусицированный код (если есть желание посмотреть исходный код — пробуем) исходник бэкдора
запускаем — форма пост запроса (вероятно пароль к бэкдору)
search
<form method=post>search <input type=text name="query"><input type="submit"></form>
Зараза 100% — убиваем её!
Осталось одно НО! — если зараза проникла единожды, проникнет и вторично!
Первое, что делаем — меняем все пароли доступа (т.к. скорее всего они уже у хакера в базе).
Второе, нужно анализировать логи веб-сервера и искать непосредственно дыру: как именно был внедрён бэкдор?
Дату создания и модификацию файла бэкдора подменили (бывает и не меняют — искать в логах гораздо проще).
Далее недолгий анализ, насторожил меня GET запросами вида
"/?option=com_contenthistory&view=history&list[ordering]=&item_id=&type_id=&list[select]=polygon%28%28/*!00000select*/*/*!00000from*/%28/*!00000select*/*/*!00000from*/%28/*!00000select*/concat_ws%280x7e3a,%28/*!00000select*/concat_ws%280x7e3a,0x534b4f54494e4b494e,username,password,0x505343%29/*!00000from*/fot6h_users%20where%20id%20=%20710%29%29as%20mk%29%60%60%29%60%60%29%29"
С какого это перепугу, в запросе иньекции SQL кода ?! явно используя дыру хотят чего то из базы поиметь — админские пароли, куки и т.д. и т.п.
Далее гуглим про дыры в «com_contenthistory» и сразу всё становится на свои места :)
Искать заплатки по данной дыре — дело хозяина джумлы, я же на скорую руку просто затыкаю любые запросы с вхождением com_contenthistory в параметры через .htaccess
RewriteCond %{QUERY_STRING} com_contenthistory
RewriteRule .* - [F]

рубрики: Joomla, security | Комментарии (1)

12 января 2016

Скрытое выполнение в PHP скриптах

Статья настолько мне понравилась, что с указанием источника сделал полный репост!
Знания необходимы для возможности определить «заразу» визуально для дальнейшего его уничтожения.
Далее от автора:

Цель данной статьи — познакомить веб-мастеров с различными подходами, которыми пользуются хакеры, чтобы затруднить обнаружение и анализ исходного кода бэкдора или хакерского шелла.

В процессе лечения сайтов мы обнаруживаем множество разновидностей хакерских шеллов и бэкдоров. Скрипты отличаются функционалом и способом обфускации исходного кода, но у всех есть общая черта — это неявное объявление переменных и функций, а также косвенный вызов функций.

Данный подход с одной стороны значительно усложняет анализ исходного кода, а с другой — позволяет хранить код в текстовых данных. Например, часть вредоносного кода может загружаться со стороннего сайта, из базы данных и мета-данных jpeg/png/gif или передаваться в запросе к скрипту. Кроме того, часть кода, представленная в виде обычной текстовой строки, может быть очень надежно зашифрована.

Эти же приемы используются веб-разработчиками и в мирных целях в скриптах проверки лицензионных ключей и регистрации веб-приложений, чтобы затруднить взлом программных продуктов.

Несмотря на все многообразие вредоносного кода, существует не так много вариантов объявления и косвенного вызова функций.
Ниже представлены примеры различных техник скрытого вызова кода. Для простоты и наглядности пусть «вредоносный код» представлен обычной функцией

echo «Test»

которая выводит слово «Test» на странице. Естественно, имена переменных и функций, а также исполняемый код не хранятся в открытом виде и в большинстве случаев обфусцированы.

Вариант 1: косвенный вызов функции

<?php <br>
    $a = "var_dump";<br>
    $b = "Test";<br>
    $a($b);<br>
?>

Вариант 2: выполнение кода через eval

<?php<br>
  eval('$a = "Test"; echo $a;');<br>
?>

Вариант 3: выполнение кода через assert

<?php<br>
  assert('print("Test")');<br>
?>

Вариант 4: выполнение кода через array_map

<?php<br>
  function evil($a) {<br>
    echo $a;<br>
  }<br>
  array_map('evil', array("Test"));<br>
?>

Вариант 5: выполнение кода через preg_replace ('/.*/e')

<?php<br>
  preg_replace('/.*/e', 'print("Test")', '');<br>
?>

Вариант 6: выполнение кода через preg_replace_callback

<?php<br>
  $a = function () { echo "Test"; };<br>
  preg_replace_callback('/.*/', $a, ''); <br>
?>

Вариант 7: выполнение кода через usort, uasort, uksort

<?php<br>
  $a = function ($x, $y) { echo "Test"; };<br>
  $b = array(1 => '1', 2 => '2');<br>
  usort( $b, $a);<br>
?>

Вариант 8: скрытое объявление функций и передача параметров через extract

<?php<br>
   extract($_REQUEST);<br>
   $a($b);<br>
?>

При запуске http://site.ru/script.php?a=system&b=ls выполнит системную функцию system («ls»)

 

Вариант 9: через регистрацию функции завершения (можно сделать exit () или die () для немедленного выполнения)

<?php<br>
   register_shutdown_function(create_function('', "echo 'Test';")); <br>
?>

Такой же подход можно использовать со всеми вызовами, принимающими в качестве аргумента callable функцию: call_user_func_array (), call_user_func (), forward_static_call_array, forward_static_call (), register_tick_function (). Хотя в реальных шеллах и бэкдорах вызовы через данные функции мы не встречали, обычно используются варианты с 1 по 8.

 

В реальных бэкдорах перечисленные варианты используют в комплексе, причем сами объявления переменных и функций часто выносят за пределы скрипта (например, загружают из базы данных, с удаленного сервера или из мета-данных изображений).

 

Кстати, бОльшая часть данных вызовов успешно детектируется сканером вредоносного кода AI-BOLIT. Это отличает его от обычных сканеров, выполняющих поиск вредоносного кода по хэшу.

Источник

рубрики: security, Полезности | Комментарии (0)

4 сентября 2015

NGINX — запрещаем доступ к служебным файлам .git .bak .old .htaccess и других по расширению

Нередко, в движках используют в скриптах подключаемые файлы с расширением отличным от php, что имхо очень неправильно и опасно.
Например в одном из движков (не буду тыкать пальцем каком именно) в темлейте подключают файлы с расширением .tpl которые не являясь активкой по умолчанию (интерпретатор настроен по умолчанию как правило на htm html php php5 и подобные), которые спокойно открываются в браузере в исходных кодах! а там уже есть чего поанализировать «плохим парням» :)
Другой пример — служебные файлы .git, старые резервные копии .bak .old ... всё это часто забывают запретить в настройках аппача или nginx-а.

Соответственно, добавляем в nginx следующие строки, и спим спокойно

404

рубрики: security, Администрирование | Комментарии (0)

25 августа 2015

Хакеры добрались до РУ фармы!

Всем привет! Давненько не писал — лето, дача, шашлык ... :)
Решил чиркануть имхо интересное:

Сижу вот, анализирую выдачу Яндекса! да, да именно Яши, где «доров нет» и выдача чиста!
на счёт фарма запросов — и охреневаю от количества лома (взломанных сайтов) с залитыми на них дорами в виде рабочих фарма-аптек
пример лома

http://gromart.ru/info.php?topic=/dapoksetin-kupit-v-novosibirske.php

смотрим «морду сайта» http://gromart.ru/ к аптеке ну никакого отношения не имеет!

причём залито на движки от джумлы (самый уязвимый для лома), самописных и заканчивая якобы непробиваемым Битриксом
похоже ломают через воровство ftp паролей у людей имеющих доступ к сайтам уже непосредственно на стороне этих людей какими нибудь вирусятинами, троями и т.д.

пока сижу и думаю чего же с этим делать ... пока не придумал...
то-ли шеллы уже начинать покупать, или самому хакерством увлечься...
сильно напрягает, что незаконно всё это, да и в выдаче не высоко (белые проекты заведомо выше)

то-ли стукачить начать, и желательно в автоматическом режиме, для чистки выдачи от этой херни :)

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

P.S. по запросу в Яше по номеру телефона аптеки — вообще «тушите свет» — лома ой ой ой сколько, надо наверное услуги по чистке предлагать :)

P.P.S. походу людям вообще на свои сайты похеру — написал около 30 писем на контакты с завирусёными сайтами — реакции нуль! ну и хер с вами ...

рубрики: Bitrix, security, SEO, Администрирование, Размышления | Комментарии (1)

15 июля 2015

Как перенести настройки iptables через файл

Сегодня с ужасом обнаружил, что на одном из моих серверов iptables пустая (был уверен, что настроено).
Соответственно, рецепт по переносу настроек с одного сервера на другой прост:
1. service iptables save на тот откуда тащим
2. перетаскиваем /etc/sysconfig/iptables
3. service iptables reload на том куда перетащили

P.S.
Отличная статейка по iptables

рубрики: security, Администрирование, Полезности | Комментарии (1)

10 июля 2015

Взлом сайта по FTP — разрешаем доступ по IP

Вчера ломанули группу сайтов тупо по FTP — законнектились и сделали инжекты во все скрипты php и в html тоже ...
Благо сработал скрипт сравнения версий файлов — вовремя отреагировал, всё восстановил.
Причём подозреваю в этом себя т.к. ломанули сайты разные и ко всем у меня был прописан доступ в FAR-е :( (хотя не факт)
Итак:
1. Не храним доступ в открытом виде, не ленимся вводить пароль (очень для меня трудно-исполнимый пункт)
2. Меняем стандартный порт доступа FTP на нестандартный (в конфиге сервера listen).
3. Ограничиваем доступ FTP по IP адресу (заливали файло в левых IP) — в моём случае VSFTPD не позволяет прописывать доступ по IP, поэтому сделаем боле правильно — запретим/разрешим доступ на уровне фаервола iptables

сначала посмотрим текущие
iptables -L INPUT --line-numbers
находим и убираем старое правило
iptables -D INPUT номер
добавляем новое iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT
(IP и маску пишем свои — откуда будем цепляться)
service iptables save
service iptables restart

у меня не сработало, т.к. правило добавилось в конец, после запрета всех
пришлось поправить порядок вручную
/etc/sysconfig/itrables.save
service iptables restart

рубрики: security, Администрирование, Полезности | Комментарии (0)

8 июля 2015

Меняем порт для webmin

Собственно, в логах увидел приличный перебор паролей по 10000 порту (webmin).
Решил поменять порт доступа для пущей секъюрности.

Лезем в настройки /etc/webmin/miniserv.conf
правим две строчки port=10000 и listen=10000
Перезагружаемся /etc/init.d/webmin restart

Разрешаем новый порт
su
iptables -I INPUT -p tcp --dport НОВЫЙ_ПОРТ -m state --state NEW -j ACCEPT
service iptables save
service iptables restart

рубрики: security, Администрирование, Полезности | Комментарии (0)

Яндекс.Метрика