跳转到主要内容

用于连接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 兼容,关键字 serverhost 的别名。您可以通过指定 --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,它将立即终止。如果“正确”调用,则显然还有其他检查。为了正确使用此选项调用snxsnx期望标准输入、输出和错误是UNIX管道。只有当出现错误并且snx带有错误消息终止时,这些管道才会被使用。启动后,snx检查日志文件的存在,如果不存在或被另一个snx进程锁定,则创建它。然后它创建一些其他锁文件在/etc/snx/tmp,然后立即派生一个子进程并让父进程终止。这种派生和终止将子进程发送到后台。子进程的第一步是关闭标准输入、输出和错误的文件描述符。

在此之后,snx在本地机器的7776端口上打开并监听TCP套接字。我没有找到告诉snx使用其他端口的选项。预期的调用应用程序(例如,snxconnect或原始Java框架)应以上述未记录的二进制格式传递详细的连接信息。之后,snx建立VPN连接,并使用相同套接字上的另一个二进制信息块报告。然后调用应用程序必须保持套接字打开,否则snx将终止。很可能snx将在该套接字上接受更多命令,例如,在VPN超时后更新认证。如果启用了调试,我们将日志记录到文件snxanswer中接收到的二进制数据。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

snxvpn-1.2.tar.gz (15.5 kB 查看哈希值)

上传时间

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面