VPN для всех! Снимаем ограничения с OpenVPN Access Server

VPN для всех! Снимаем ограничения с OpenVPN Access Server 3

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

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

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

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

Что­бы не изоб­ретать велоси­пед, давай гля­нем, что отве­тят поис­ковики на зап­рос «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

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

VPN для всех! Снимаем ограничения с OpenVPN Access Server 4

Те­перь срав­ним сами фай­лы, но сна­чала их нуж­но деком­пилиро­вать, пос­коль­ку .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 исполь­зует­ся где‑то еще, и, что­бы не менять вез­де, сде­лали такой неоче­вид­ный трюк.

Де­ком­пилиру­ем uprop2 и понима­ем, что это ори­гиналь­ный uprop, в котором и выпол­няет­ся про­вер­ка лицен­зии.

...

class UsageProperties(object):

def figure(self, licdict):

proplist = set(('concurrent_connections',))

good = set()

ret = None

if licdict:

for key, props in licdict.items():

if 'quota_properties' not in props:

print 'License Manager: key %s is missing usage properties' % key

continue

proplist.update(props['quota_properties'].split(','))

good.add(key)

for prop in proplist:

v_agg = 0

v_nonagg = 0

if licdict:

for key, props in licdict.items():

if key in good:

if prop in props:

try:

nonagg = int(props[prop])

except:

raise Passthru('license property %s (%s)' % (prop, props.get(prop).__repr__()))

v_nonagg = max(v_nonagg, nonagg)

prop_agg = '%s_aggregated' % prop

agg = 0

if prop_agg in props:

try:

agg = int(props[prop_agg])

except:

raise Passthru('aggregated license property %s (%s)' % (prop_agg, props.get(prop_agg).__repr__()))

v_agg += agg

if DEBUG:

print 'PROP=%s KEY=%s agg=%d(%d) nonagg=%d(%d)' % (prop,

key,

agg,

v_agg,

nonagg,

v_nonagg)

apc = self._apc()

v_agg += apc

if ret == None:

ret = {}

ret[prop] = max(v_agg + v_nonagg, bool('v_agg') + bool('v_nonagg'))

ret['apc'] = bool(apc)

if DEBUG:

print "ret['%s'] = v_agg(%d) + v_nonagg(%d)" % (prop, v_agg, v_nonagg)

return ret

Раз­работ­чик кря­ка исполь­зовал под­мену объ­екта, не тро­гая основной файл. Прин­цип понятен.

Читайте также:  Давно вы себе задавали вопрос: о чём я мечтаю?

Те­перь поп­робу­ем про­вер­нуть то же самое, толь­ко для акту­аль­ной вер­сии OpenVPN Aсcess Server. Экспе­римен­тировать буду на VPS с акту­аль­ной Debian 11 Bullseye.

Ска­чива­ем пос­леднюю вер­сию с сай­та раз­работ­чика. Уста­нав­лива­ем или рас­паковы­ваем архив .deb и смот­рим вер­сию Python, для которой написан pyovpn:

$ ls /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.9.egg

Ага, 3.9, что не очень под­ходит, так как деком­пиляция для этой вер­сии Python пока не реали­зова­на.

info

Ты можешь под­держать раз­работ­чика деком­пилято­ра и помочь в работе над про­ектом. Под­робнее — в его об­ращении.

Что‑то мне под­ска­зыва­ет, что вер­сия для Debian 10 будет под­ходящей, так как, изу­чив вики, уз­наем, что в 11-й вер­сии (Bullseye) уже Python 3.9, а в 10-й (Buster) — 3.7.

Установка в Debian 10

Пос­коль­ку VPS новая, прос­то поменяю ОС на десятую вер­сию и пос­мотрю дос­тупные вер­сии OpenVPS-AS:

$ apt update && apt -y install ca-certificates wget net-tools gnupg

wget -qO — https://as-repository.openvpn.net/as-repo-public.gpg | apt-key add —

echo «deb http://as-repository.openvpn.net/as/debian buster main»>/etc/apt/sources.list.d/openvpn-as-repo.list

$ apt update

$ apt policy openvpn-as

openvpn-as:

Installed: (none)

Candidate: 2.10.1-d5bffc76-Debian10

Version table:

2.10.1-d5bffc76-Debian10 500

500 http://as-repository.openvpn.net/as/debian buster/main amd64 Packages

2.10.0-ca1e86b5-Debian10 500

500 http://as-repository.openvpn.net/as/debian buster/main amd64 Packages

2.9.6-1090f6b3-Debian10 500

500 http://as-repository.openvpn.net/as/debian buster/main amd64 Packages

2.9.5-82d54e5b-Debian10 500

500 http://as-repository.openvpn.net/as/debian buster/main amd64 Packages

2.9.4-8b3ce898-Debian10 500

От­лично, вер­сия пос­ледняя, как в 11-й, а зна­чит, акту­аль­ная. Уста­нав­лива­ем и смот­рим вер­сию Python, которая исполь­зует­ся в pyovpn. Дол­жно быть 3.7.

$ apt -y install openvpn-as

$ ls /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.7.egg

/usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.7.egg

Так и есть: это пос­ледняя вер­сия (2.10.1) и она исполь­зует Python 3.7. Все скла­дыва­ется. Давай про­верим, мно­гое ли изме­нилось по срав­нению с вер­сией 2.0.5, которая была изна­чаль­но най­дена похекан­ной. Что­бы не тас­кать фай­лы туда‑сюда, став­лю на сер­вере python-decompile3:

$ git clone https://github.com/rocky/python-decompile3

$ cd python-decompile3

$ pip3 install -e .

И сно­ва рас­паковы­ваем .egg:

$ mkdir /opt/ovpn && cd ovpn

$ cp /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.7.egg ./

$ cp /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.7.egg pyovpn-2.0-py3.7.zip

$ unzip pyovpn-2.0-py3.7.zip && rm pyovpn-2.0-py3.7.zip

$ ls

EGG-INFO pyovpn

За­тем деком­пилиру­ем:

$ cd ./pyovpn/lic

$ decompyle3 uprop.pyc > uprop.py

$ cat uprop.py

Смот­рим отли­чия и видим, что все то же самое, кро­ме неболь­ших рас­хожде­ний в син­такси­се. Но что имел в виду автор хака, ког­да исполь­зовал два фай­ла? Почему прос­то не ука­зать явно в кон­це фун­кции figure количес­тво соеди­нений, минуя все про­вер­ки?

Да­вай поп­робу­ем более прос­той вари­ант. Добав­ляем ret['concurrent_connections'] = 1337 перед воз­вра­том (ret):

$ nano uprop.py

...

apc = self._apc()

v_agg += apc

if ret == None:

ret = {}

ret[prop] = max(v_agg + v_nonagg, bool('v_agg') + bool('v_nonagg'))

ret['apc'] = bool(apc)

if DEBUG:

print("ret['%s'] = v_agg(%d) + v_nonagg(%d)" % (prop, v_agg, v_nonagg))

ret['concurrent_connections'] = 1337

return ret

def _apc(self):

...

Сох­раня­ем файл, ком­пилиру­ем:

$ python3 -m compileall uprop.py

$ rm uprop.pyc uprop.py

$ cp __pycache__/uprop.cpython-37.pyc ./uprop.pyc

$ rm -Rf __pycache__

Ар­хивиру­ем и заменя­ем пакет .egg:

$ cd /opt/ovpn

$ zip -r *

$ sudo rm /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.7.egg

$ sudo cp common.zip /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.7.egg

И перезаг­ружа­ем openvpn-as. Я уда­лял логи, так как ловил ошиб­ки во вре­мя экспе­римен­тов. Это делать необя­затель­но.

$ sudo service openvpnas stop

$ sudo rm /var/log/openvpnas.log

$ sudo touch /var/log/openvpnas.log

За­пус­каем сер­вис openvpnas:

$ service openvpnas start

Убеж­даем­ся, что все в поряд­ке и оши­бок нет:

cat /var/log/openvpnas.log

Идем в админку на пор­те 943/admin и видим, что нам дос­тупно 1337 под­клю­чений.

VPN для всех! Снимаем ограничения с OpenVPN Access Server 5

info

Ес­ли ты вдруг потерял пароль и не можешь попасть в админку, напиши passwd openvpn.

Тес­тирова­ние показа­ло отличную работу с дву­мя и более устрой­ства­ми.

Выводы

Мно­гие VPN сей­час под бло­киров­ками или не могут при­нять опла­ту, поэто­му Access Server — неп­лохой спо­соб быс­тро раз­вернуть собс­твен­ный ана­лог с воз­можностью управлять про­филя­ми поль­зовате­лей. Поль­зовать­ся ли пират­ским методом его акти­вации — решать тебе, но это, как ока­залось, сов­сем не слож­но.


Автор

Источник

Автор публикации

не в сети 5 часов

Андрей Маргулис

542
С организацией DDoS атак завязал.
Выкладываю новости технологий и интересные статьи с темной стороны интернета.
31 год
День рождения: 14 Мая 1991
Комментарии: 548Публикации: 2683Регистрация: 12-12-2015
Понравилась статья? Поделиться с друзьями:
РЭНБИ - Россия
Авторизация
*
*
Регистрация
*
*
*
*
Ваш день рождения * :
Число, месяц и год:
Отображать дату:
Генерация пароля
/