用于连接Checkpoint SSL VPN的命令行实用程序
项目描述
由Ralf Schlatterbeck
这是一个项目,用于从Linux客户端连接到Checkpoint SSL-VPN。目前Linux版本的checkpoint SNX(SSL网络扩展器)不再支持命令行模式。支持版本涉及带有Java的浏览器,并且严重依赖于正确的Java版本和浏览器中的其他配置选项。此外,它似乎只与Mozilla浏览器(Firefox)兼容,而不与Chrome等其他浏览器兼容。最后,Java和浏览器经常崩溃。
当前的Checkpoint解决方案仍然依赖于一个名为snx的命令行实用程序,该实用程序需要root权限,并且可以通过Java的自动下载(和安装)或手动安装。
在新解决方案中,snx二进制文件使用未记录的-Z选项。在这种模式下,它不执行密码协商(通过浏览器执行),而只用于设置VPN连接。
该项目试图通过一个独立的程序(Python)复制基于浏览器的登录,以摆脱所有Java版本和浏览器集成的烦恼。我们仍然依赖于Checkpoint的snx二进制文件,该文件使用未记录的-Z选项。
到目前为止,它对我的Checkpoint SSL工作正常,该SSL使用用户名和密码进行身份验证,并且额外通过短信将一次性密码传输到尝试连接的人的手机。如果您使用基于证书的登录或其他方法,这可能不会立即适用于您,但您可能希望帮助我使其工作。
安装和运行
通过 pip 安装是首选方式(如果您想为 python3 安装,请将 pip 替换为 pip3)
pip install snxvpn
以下依赖项是必需的,但如果您通过 pip 安装,则应自动获取
Beautiful Soup 版本 4(《python-bs4》Debian 软件包)
pycrypto(《python-crypto》Debian 软件包)
安装后,您应该可以通过运行 snxconnect --help 来了解选项。至少需要提供主机和用户名,可以通过命令行选项或配置文件(见下文)提供。
当前工作目录中运行的程序将创建两个文件
snxanswer:Checkpoint snx 程序对调用者的未逆向工程的响应,仅在提供 --debug 选项时创建
$HOME/.snxcookies:来自远程端的cookie,格式与perl LWP库中已知格式相同(在python中作为LWPCookieJar提供),仅在提供 --save-cookies 选项时创建。默认cookie文件名可以通过 --cookiefile 选项更改。
如果找到cookie文件,snxconnect 将尝试重新连接而无需请求密码。如果在连接时间耗尽之前连接过早终止,则可以使用此功能。是的,将cookie保存到磁盘可能存在安全风险,因此您必须通过在配置文件中设置 save-cookies true 或提供 --save-cookies 选项来显式启用此功能。请注意,cookie当然只有有限的生命周期,如果您无法确保磁盘上的文件,则您的连接不会非常安全。此外,当前机器的所有用户都可以访问VPN连接。
当您第一次使用 snxconnect 运行 Checkpoint 的 snx 时,它将在启动程序的当前工作目录中创建一个X-Windows弹出窗口,允许您确认服务器指纹。我还没有看到Java框架中的此弹出窗口(但Java在我的第一次实验中多次崩溃,这是我编写 snxvpn 的原因之一,因此我可能之前没有看到弹出窗口)。您必须确认此弹出窗口。服务器指纹存储在 /etc/snx 中扩展名为 .db 的文件中。
对于配置,snxconnect 接受配置文件 $HOME/.snxvpnrc。那里的选项是命令行长选项(通过 –help 获取),其中将 '-' 替换为 '_'。为了与 .snxrc 兼容,关键字 server 是 host 的别名。您可以通过指定 --help 来查看从配置文件中获取了哪些选项,其中默认值显示,配置文件中的默认值显示。命令行选项优先于配置文件条目。
此外,还支持包含用户名和密码的 .netrc 文件,该文件可以按主机名包含信息。请注意,将长期登录凭据存储在磁盘上存在安全风险。有关详细信息,请参阅 netrc 的手册页面。
要从源码安装(从git checkout),您需要从Sourceforge下载我的sfreleasetools。这将添加创建从包含最新版本号的git标签中生成的snxvpnversion.py所需的Makefile包含项。您可以选择在snxvpn的兄弟目录releasetools中安装sfreleasetools,或者设置指向您克隆版本的RELEASETOOLS环境变量。您还需要由docutils提供的rst2html命令,在Debian Linux上,您可以通过安装python-docutils包来获取它。
安装完成后,无需参数调用make。这将创建用于由setup.py脚本使用的snxvpnversion.py。
创建snxvpnversion.py后,可以使用常规方法安装snxvpn包。
python setup.py install --prefix=/usr/local
snx安装注意事项
从多个邮件列表和论坛的许多帖子中可以看出,安装snx并不简单。您需要安装一些非标准库,这些库是snx运行所必需的。此外,snx是针对i386架构的二进制文件,而不是现代的64位AMD/Intel架构。在这里,我只能提供Debian安装的提示,但一般步骤也适用于其他发行版。
首先,通过Web浏览器通过SSL-VPN站点连接到SSL-VPN网站,登录后(至少在我的安装中)在设置(德语为Einstellungen)菜单中查找原生应用程序设置或类似条目(德语“Native Anwendungseinstellungen bearbeiten”)。在这个菜单中,我有一些用于Linux和Mac-OS手动下载snx的链接。
首先,如果您在64位架构上(至少Debian称其为amd-64),您需要通过以下命令启用多架构支持
dpkg --add-architecture i386 apt-get update
然后,您需要安装一些包含snx所需的库的包,特别是
libstdc++5:i386
libxcb1:i386
libaudit1:i386
libgcc1:i386
libxau6:i386
libxdmcp6:i386
要检查您是否拥有所有必要的库,可以在snx二进制文件上运行ldd(使用sudo以root身份运行)
sudo ldd /usr/bin/snx
这应该为每一行列出库文件,并且不应报告任何缺失的库。
关于机制的一些说明
本节讨论了Java框架和snxconnect如何调用snx程序的一些内部细节。
通过浏览器进行登录是一个带有大量JavaScript和重定向的标准登录页面。密码以加密形式发送到VPN网关。加密使用2048位RSA密钥,并在加密前用随机数据填充密码(这是好的)。在登录过程中,浏览器(或此程序)会收集大量cookie,并通过JavaScript访问必要的登录信息。这些信息包括
用于密码加密的RSA公钥
要传递给snx的用户名
要传递给snx的一次性密码(与通过电话收到的不同)
用于TLS连接的主机名
用于TLS连接的端口号
服务器指纹
所有这些(除了RSA密钥)都将传递给snx程序以建立连接。连接可能内部使用PPP,因为一些错误消息(作为JavaScript中i18n信息的一部分发送,并将snx的错误代码映射为人类可读的消息)暗示了这一点。
如果您通过手工使用未记录的-Z选项调用snx,它将立即终止。如果“正确”调用,则显然还有其他检查。为了正确使用此选项调用snx,snx期望标准输入、输出和错误是UNIX管道。只有当出现错误并且snx带有错误消息终止时,这些管道才会被使用。启动后,snx检查日志文件的存在,如果不存在或被另一个snx进程锁定,则创建它。然后它创建一些其他锁文件在/etc/snx/tmp,然后立即派生一个子进程并让父进程终止。这种派生和终止将子进程发送到后台。子进程的第一步是关闭标准输入、输出和错误的文件描述符。
在此之后,snx在本地机器的7776端口上打开并监听TCP套接字。我没有找到告诉snx使用其他端口的选项。预期的调用应用程序(例如,snxconnect或原始Java框架)应以上述未记录的二进制格式传递详细的连接信息。之后,snx建立VPN连接,并使用相同套接字上的另一个二进制信息块报告。然后调用应用程序必须保持套接字打开,否则snx将终止。很可能snx将在该套接字上接受更多命令,例如,在VPN超时后更新认证。如果启用了调试,我们将日志记录到文件snxanswer中接收到的二进制数据。
项目详情
snxvpn-1.2.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 76667903e5329f522c4b770054ecc273e22912d5cce27e004fcd8d15f0a98380 |
|
MD5 | b4486e7d974112c905f2058d5801b454 |
|
BLAKE2b-256 | 876be8557ecb712351488f4d08d68a3e926c1b5f03aecadb6513c27979bb8dee |