Access Server — прекрасное ПО, которое устанавливается на сервере в пару команд и позволяет удобно работать с клиентами: редактировать подсети, профили и пароли и так далее. Делать все это вручную было бы намного тяжелее.
Но вот незадача — в бесплатной версии есть ограничение на число подключений: работать одновременно могут лишь два клиента. Платная лицензия стоит дорого, к тому же ее сейчас никак не оплатишь с российской кредитки. Увы, та же участь постигла многие программы и полезные хакерские ресурсы. Вчера, например, я не смог оплатить Hack The Box, что меня очень расстроило. Что ж, будем вместо прохождения тачек с HTB упражняться в старинном русском ремесле — крякинге!
warning
На момент написания этого материала законы, запрещающие использование нелицензионного ПО, по‑прежнему имеют силу. Возможность разрешить использовать софт уходящих из России компаний без лицензии только обсуждается. Мы в этой статье лишь демонстрируем уязвимость, благодаря которой возможен обход проверки. Применяя полученные знания, помни, что ты действуешь на свой страх и риск. Не забывай следить за актуальным законодательством, особенно если действуешь в коммерческих целях.
Чтобы не изобретать велосипед, давай глянем, что ответят поисковики на запрос «OpenVPN Access Server license unlimited». Любопытно, но есть один репозиторий, удаленный с GitHub за несоблюдение авторских прав. Находим зеркало и смотрим описание: требуется версия CentOS 7. В установочном скрипте после инсталляции самого пакета openvpn-as идет еще и замена файла pyovpn-2.
по пути /
.
Такой важный элемент системы, отвечающий в том числе за веб‑фронтенд, я бы не стал менять вслепую и тебе тоже не советую. Тем более в софте, связанном с конфиденциальностью. Поэтому перед использованием изучим, что там внутри. Сравним хакнутые варианты с исходными файлами.
Распакуем оригинальный RPM в поисках pyovpn-2.
. Распаковать .rpm можно обычным tar:
$ tar xf openvs.rpm
А .egg — это, в свою очередь, обычный ZIP. Находим его по адресу pyovpn-2.
.
Далее распаковываем хакнутый pyovpn-2.0-py2.7.egg из комплекта:
$ unzip pyovpn-2.0-py2.7.egg
Поищем файлы, в которых что‑то менялось.
$
Files ./pyovpn-2.0-py2.7_hacked/pyovpn/lic/uprop.pyo and ./pyovpn-2.0-py2.7_original/pyovpn/lic/uprop.pyo differ
Only in ./pyovpn-2.0-py2.7_hacked/pyovpn/lic: uprop2.pyo
Files ./pyovpn-2.0-py2.7_hacked/pyovpn/production.pyo and ./pyovpn-2.0-py2.7_original/pyovpn/production.pyo differ
Теперь сравним сами файлы, но сначала их нужно декомпилировать, поскольку .pyc — это байт‑код. Воспользуемся утилитой decompile6, которая отлично работает с версиями Python 2.7, 3.7, 3.8. Я буду делать все на macOS, но в Linux команды вряд ли отличаются.
$ pip install decompyle6
$ uncompyle6 /Users/n0a/Work/openvpn_decompile/test_diff/pyovpn-2.0-py2.7_hacked/pyovpn/lic/uprop.pyo > uprop.py
$ cat uprop.py
Смотрим содержимое декомпилированного файла:
$ cat uprop.py
import uprop2old_figure = Nonedef new_figure(self, licdict): ret = old_figure(self, licdict) ret['concurrent_connections'] = 1024 return retfor x in dir(uprop2): if x[:2] == '__': continue if x == 'UsageProperties': exec 'old_figure = uprop2.UsageProperties.figure' exec 'uprop2.UsageProperties.figure = new_figure' exec '%s = uprop2.%s' % (x, x)
Интересно! Цикл for
— это перебор всех атрибутов uprop2
. Те атрибуты, названия которых начинаются с двух подчеркиваний, пропускаются. Функция old_figure
становится ссылкой на метод figure
класса UsageProperties
, а функция в классе UsageFigure
ссылается на new_figure
. Сложно сказать, зачем это сделано. Могу предположить, что класс UsageProperties
используется где‑то еще, и, чтобы не менять везде, сделали такой неочевидный трюк.
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее