В пос­леднее вре­мя ко мне все чаще обра­щают­ся друзья с прось­бами помочь получить дос­туп к Facebook, Instagram, Telegram, YouTube и про­чим недос­тупным сай­там, где мог­ла остать­ся важ­ная информа­ция. Что­бы помочь им, я всег­да исполь­зовал OpenVPN Access Server. Его бес­плат­ная вер­сия име­ет ряд лицен­зион­ных огра­ниче­ний. В этой статье я покажу, как с ними мож­но спра­вить­ся.

Access Server — прек­расное ПО, которое уста­нав­лива­ется на сер­вере в пару команд и поз­воля­ет удоб­но работать с кли­ента­ми: редак­тировать под­сети, про­фили и пароли и так далее. Делать все это вруч­ную было бы нам­ного тяжелее.

Но вот незада­ча — в бес­плат­ной вер­сии есть огра­ниче­ние на чис­ло под­клю­чений: работать одновре­мен­но могут лишь два кли­ента. Плат­ная лицен­зия сто­ит дорого, к тому же ее сей­час никак не опла­тишь с рос­сий­ской кре­дит­ки. Увы, та же участь пос­тигла мно­гие прог­раммы и полез­ные хакер­ские ресур­сы. Вче­ра, нап­ример, я не смог опла­тить Hack The Box, что меня очень расс­тро­ило. Что ж, будем вмес­то про­хож­дения тачек с HTB упражнять­ся в ста­рин­ном рус­ском ремес­ле — кря­кин­ге!

warning

На момент написа­ния это­го матери­ала за­коны, зап­реща­ющие исполь­зование нелицен­зион­ного ПО, по‑преж­нему име­ют силу. Воз­можность раз­решить исполь­зовать софт ухо­дящих из Рос­сии ком­паний без лицен­зии толь­ко об­сужда­ется. Мы в этой статье лишь демонс­три­руем уяз­вимость, бла­года­ря которой воз­можен обход про­вер­ки. При­меняя получен­ные зна­ния, пом­ни, что ты дей­ству­ешь на свой страх и риск. Не забывай сле­дить за акту­аль­ным законо­датель­ством, осо­бен­но если дей­ству­ешь в ком­мерчес­ких целях.

Что­бы не изоб­ретать велоси­пед, давай гля­нем, что отве­тят поис­ковики на зап­рос «OpenVPN Access Server license unlimited». Любопыт­но, но есть один репози­торий, уда­лен­ный с GitHub за несоб­людение автор­ских прав. Находим зер­кало и смот­рим опи­сание: тре­бует­ся вер­сия CentOS 7. В уста­новоч­ном скрип­те пос­ле инстал­ляции самого пакета openvpn-as идет еще и замена фай­ла pyovpn-2.0-py2.7.egg по пути /usr/local/openvpn/python/sites-enabled.

Та­кой важ­ный эле­мент сис­темы, отве­чающий в том чис­ле за веб‑фрон­тенд, я бы не стал менять всле­пую и тебе тоже не советую. Тем более в соф­те, свя­зан­ном с кон­фиден­циаль­ностью. Поэто­му перед исполь­зовани­ем изу­чим, что там внут­ри. Срав­ним хак­нутые вари­анты с исходны­ми фай­лами.

Рас­паку­ем ори­гиналь­ный RPM в поис­ках pyovpn-2.0-py2.7.egg. Рас­паковать .rpm мож­но обыч­ным tar:

$ tar xf openvs.rpm

А .egg — это, в свою оче­редь, обыч­ный ZIP. Находим его по адре­су pyovpn-2.0-py2.7/usr/local/openvpn_as/lib/python/.

Да­лее рас­паковы­ваем хак­нутый pyovpn-2.0-py2.7.egg из ком­плек­та:

$ unzip pyovpn-2.0-py2.7.egg

По­ищем фай­лы, в которых что‑то менялось.

$ diff -rq ./pyovpn-2.0-py2.7_hacked ./pyovpn-2.0-py2.7_original
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 uprop2
old_figure = None
def new_figure(self, licdict):
ret = old_figure(self, licdict)
ret['concurrent_connections'] = 1024
return ret
for 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, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    6 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии