OpenVPN Access Server 破解在线人数限制
由于 2.9.x 以上版本由于使用了 Python3 编写, 现已支持 2.13.x 版本~!
已经更新支持到最新版本:2.13.1
官方最新版离线安装包:
wget https://openvpn.net/downloads/openvpn-as-latest-CentOS7.x86_64.rpm
wget https://openvpn.net/downloads/openvpn-as-bundled-clients-latest.rpm
yum -y install openvpn-as-latest-CentOS7.x86_64.rpm
yum -y install openvpn-as-bundled-clients-latest.rpm
最新版的python支持需要3.8,我这里低版本没有进行测试。大家自己可以试试。
截止到我写这篇文字的时候最新的版本已经是 2.12.1, 我这也是采用的最新版 2.12.1.
实操阶段
主要操作的文件是一个名叫 pyovpn-2.0-pyx.x.egg 的文件,以我了解的情况来看,从 2.5.0 到 2.12.x 文件名一直都是这个,只是不同版本里面的内容不一样.
目录:/usr/local/openvpn_as/lib/python/
这个文件有点类似 Java 当中的 jar 库文件,也是一个 zip 压缩文件,里面包含了一些 Python 的字节码文件.
破解的原理大概是在 Python 中采用类似 Java 动态代理的技术,将原本读取用户属性的调用返回值拦截,修改用户限制数量再返回.
2.9.4 及以上是 /pyovpn/lic/uprop.pyc; 按照网上流行的破解方法,把这个文件解压出来并改名为uprop2.pyc, 然后新建一个 uprop.py 文件,内容如下:
2.9.4 及以上版本内容:
from pyovpn.lic import uprop2
old_figure = None
def new_figure(self, licdict):
ret = old_figure(self, licdict)
ret['concurrent_connections'] = 2048
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))
再将上面的 uprop.py 编译为库文件uprop.pyc:
python3 -O -m compileall uprop.py && mv __pycache__/uprop.*.pyc uprop.pyc
注意 uprop.cpython-37.opt-1.pyc 文件名会随着 python 版本变化而变化.
上面这一步有很多小伙伴可能不太会,百度一下,py文件注册库文件,其中引用的compileall,有很多教程。
现在我们得到了一个改文件名的文件uprop2.pyc, 和一个编译出来
的uprop.pyc; 把这两个文件压缩到 pyovpn-2.0-pyx.x.egg 的 /pyovpn/lic/ 目录下,然后去服务器替换目标文件,重启服务就 OK 了.
最新版本,简单破解方法。
我发现好多小伙伴上面这步一不会,我现在已经更新了脚本,最新版的2.12.2里面的加密文件已经变成了pyovpn-2.0-py3.8.egg
现在直接在终端输下面的命令完成破解,文件内的代码还是上面的代码不变。已经测试过了。
安装完openvpn_as后。继续下面的步骤完成破解:
cd #(这个只是切换目录到root,哪个目录都行,最好一个干净一点的。)
cp /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.8.egg{,.bak}
cp /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.8.egg .
unzip -q pyovpn-2.0-py3.8.egg
cd ./pyovpn/lic/
mv uprop.pyc uprop2.pyc
vim uprop.py
(上面这一步结束,会打开一个新的文件,粘贴上面代码块的代码,保存文件。)
python3 -O -m compileall uprop.py && mv __pycache__/uprop.*.pyc uprop.pyc
cd ../../
zip -rq pyovpn-2.0-py3.8.egg ./pyovpn ./EGG-INFO ./common
mv ./pyovpn-2.0-py3.8.egg /usr/local/openvpn_as/lib/python/pyovpn-2.0-py3.8.egg
systemctl restart openvpnas
到这里已经完成了,进去快乐的玩耍吧!我就不再放最新版的破解文件了,大家自己去破,如果有不懂的,可以留言给我。
对原理感兴趣的可以使用 python-uncompyle6 反编译原本的 uprop 字节码文件。举个例子:
# 安装 uncompyle6
pip install uncompyle6
# 反编译 uprop.pyc, 成功之后就会在当前目录得到一个文件 uprop.py
uncompyle6 -o ./ uprop.pyc
我这也贴一个我反编译的源文件:
# uncompyle6 version 3.7.4
# Python bytecode 3.7 (3394)
# Decompiled from: Python 3.7.11 (default, Aug 17 2021, 16:15:07)
# [GCC 10.2.1 20210110]
# Embedded file name: build/bdist.linux-x86_64/egg/pyovpn/lic/uprop.py
# Compiled at: 2021-08-17 12:27:35
# Size of source mod 2**32: 3315 bytes
from pyovpn.util.date import YYYYMMDD
from pyovpn.util.error import Passthru
from pyovpn.lic.prop import LicenseProperties
from pyovpn.util.env import get_env_debug
from pyovpn.pki.sign import rsa_verify_complex
from pyovpn.aws.info import AWSInfo
DEBUG = get_env_debug('DEBUG_UPROP')
class UsageProperties(object):
def figure(self, licdict):
proplist = set(('concurrent_connections', ))
good = set()
ret = None
if licdict:
for key, props in list(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 list(licdict.items()):
if key in good and 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
def _apc(self):
try:
pcs = AWSInfo.get_product_code()
if pcs:
return pcs['snoitcennoCtnerrucnoc'[::-1]]
except:
if DEBUG:
print(Passthru('UsageProperties._apc'))
return 0
@staticmethod
def _expired(today, props):
if 'expiry_date' in props:
exp = YYYYMMDD.validate(props['expiry_date'])
return today > exp
return False
class UsagePropertiesValidate(object):
proplist = ('concurrent_connections', 'client_certificates')
def validate(self, usage_properties):
lp = LicenseProperties(usage_properties)
lp.aggregated_post()
lp['quota_properties'] = ','.join([p for p in self.proplist if p in lp])
return lp
结果
本文是基于2.9.4版本,但是我测试2.11.3同样适用。
-----------------------------------------------------<<
最新版2.12.2开始不再使用下面的方便包。我直接删除了。
下面附2.10.3及以上版本密码重置教程,这个和以前不一样,有默认密码了。
重置默认 openvpn 帐户管理权限
注意:如果您当前没有使用最新版本的 Access Server 2.10.3,我们建议您阅读旧版本的说明。
管理帐户,默认称为openvpn,可以是操作系统中的引导帐户,也可以是 Access Server 本身的内部本地身份验证系统中的管理帐户。我们建议使用本地帐户,这是自 Access Server 2.10 版以来的默认帐户。
这些是常见的管理用户登录问题:
您丢失了用户名和/或密码。
该帐户与已失效的外部身份验证系统相关联。
该帐户上设置了拒绝登录标志。
有 MFA 要求,您丢失了密钥。
该帐户在多次登录失败后(暂时)被锁定。
您可以在 Access Server 的命令行上以 root 用户身份执行以下命令,以创建或重置用户名为openvpn的本地管理员帐户。它考虑了上述所有情况,并应为您提供一个本地openvpn管理帐户,您可以使用该帐户登录到 Admin Web UI。
使用指定密码创建/重置openvpn管理本地帐户:
cd /usr/local/openvpn_as/scripts
./sacli --user "openvpn" --key "prop_superuser" --value "true" UserPropPut
./sacli --user "openvpn" --key "user_auth_type" --value " local" UserPropPut
./sacli --user "openvpn" --new_pass=<PASSWORD> SetLocalPassword
./sacli start
如果帐户需要,请禁用拒绝登录标志并重置 MFA:
./sacli --user "openvpn" --key "prop_deny" --value "false" UserPropPut
./sacli --user "openvpn" --key "prop_google_auth" UserPropDel
./sacli --user "openvpn" --lock 0 GoogleAuthRegen
./sacli start
重置密码锁定策略以防万一它被触发:
./sacli --key "vpn.server.lockout_policy.reset_time" --value "1" ConfigPut
./sacli start
sleep 2
./sacli --key "vpn.server.lockout_policy.reset_time" ConfigDel
./sacli start
尝试使用openvpn和您指定的密码再次登录到 Admin Web UI 。
关于单用户多并发登陆的问题,我在WEB页面打开了多会话,但是没有用,我在官方看到的方案,但是没有成功,以下是官方回复:
配置数据库中每个用户多个会话设置的实际配置参数是“vpn.server.duplicate_cn”。您可以在命令行上以 root 用户身份手动设置它;
/usr/local/openvpn_as/scripts/sacli --key "vpn.server.duplicate_cn" --value "true" ConfigPut
/usr/local/openvpn_as/scripts/sacli start
可以用false关闭,true开启它在。如果你删除它,它会变成默认值,我相信这是真的;
/usr/local/openvpn_as/scripts/sacli --key "vpn.server.duplicate_cn" ConfigDel
/usr/local/openvpn_as/scripts/sacli start
引用
https://www.starduster.me/2019/12/19/talk-about-egg-file-and-hacking-ovpnas/
https://www.daehub.com/archives/5894.html
https://owlhowto.com/how-to-install-openvpn-access-server-on-linux/
本文章提到的内容只允许做个人学习研究之用,不得用于商业用途!否则后果自负! 若资金允许,请购买正版,谢谢!
贴个ubuntu22.03的最新服务端,上面的方法可行。
https://oskr.cn/upload/2024/02/openvpn-as-bundled-clients-29.deb
https://oskr.cn/upload/2024/02/openvpn-as_2.13.1-d8cdeb9c-Ubuntu22_amd64.deb
安装包下载:
openvpn-as-2.10.3_c47a813c-CentOS7.x86_64.rpm
openvpn-as-bundled-clients-25.rpm
评论区