что это?

Здесь, со временем, будут появляться некоторые способы обфускации/затруднение “обратной разработки” кода на 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. Полезная нагрузка в комменте

Пример - CNCrypto

Оригинал без 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
?>