Ярлыки

четверг, 30 октября 2014 г.

SHC. Обфускация, шифрование и дешифрование Bash скриптов


1. Установка shc на CentOS

Ставим gcc, скачиваем и устанавливаем shc

[root@centos ~]# yum install gcc
[root@centos ~]# wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.7.tgz
[root@centos ~]# tar xvfz shc-3.8.7.tgz
[root@centos ~]# cd shc-3.8.7
[root@centos shc-3.8.7]# make

2. Шифрование

Создаём скрипт

[root@centos shc-3.8.7]# nano script.sh
#!/bin/bash
echo "Preved Medved !!!"

Преобразуем его при помощи shc

[root@localhost shc-3.8.7]# ./shc -r -v -T -f ./script.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc  ./script.sh.x.c -o ./script.sh.x
shc: strip ./script.sh.x
shc: chmod go-r ./script.sh.x

-r — возможность запускать на других машинах;
-v — подробный вывод при компиляции;
-T — разрешить трассировку скрипта. Без этой опции можно получить ошибку "(command): Operation not permitted" при запуске не из под рута;
-f — путь к файлу скрипта.

В результате имеем

[root@localhost shc-3.8.7]# ls -lh script*
-rw-r--r--. 1 root root   37 Окт 28 21:21 script.sh
-rwx--x--x. 1 root root 9,2K Окт 28 21:25 script.sh.x
-rw-r--r--. 1 root root 9,5K Окт 28 21:25 script.sh.x.c

  • script.sh.x.c — нечитабельный код на C, вместе с текстом скрипта, шифрованным при помощи RC4
  • script.sh.x — скомпилированный бинарник
3. Запуск

Запустим полученный бинарник

[root@localhost shc-3.8.7]# ./script.sh.x
Preved Medved !!!
[root@localhost shc-3.8.7]#


Перенесём бинарник на другую машину и попробуем запустить

Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux
root@debian:~# ls
script.sh.x
root@debian:~# ./script.sh.x
Preved Medved !!!
root@debian:~#

Видим, что скрипт отработал.

4. Дешифрование

Процесс дешифрования для shc версии 3.7 описан ещё в 2005 году, однако есть более простой путь получения исходного текста скрипта. Т.к. при выполнении бинарника происходит его расшифровка в оперативную память, достаточно сдампить и проанализировать данный участок памяти.

Убираем лимит на размер дампа

root@debian:~# ulimit -c unlimited

Выполняем команду

root@debian:~# ./script.sh.x&  ( sleep 0.001 &&  kill -SIGSEGV $! )
[1] 13315
root@debian:~#
[1]+  Segmentation fault      (core dumped) ./script.sh.x

Здесь важно подобрать такой интервал времени (sleep 0.001), чтобы скрипт успел выгрузиться в память, но не успел завершиться.
$! — будет содержать PID запущенного процесса
kill -SIGSEGV — вызовет ошибку "Segmentation fault" выгрузку памяти в дамп.

В результате в каталоге со скриптом имеем файл "core"


root@debian:~# ls -lh
total 96K
-rw------- 1 root root 212K Oct 30 16:20 core
-rwxr--r-- 1 root root 9.2K Oct 28 13:25 script.sh.x

В котором несложно найти текст исходного скрипта







1 комментарий: