第一节
万由U-NAS5.0还能在虚拟机上安装吗?
以前的U-NAS 3.0和U-NAS 4.0的系统我都是在虚拟机上安装测试的。这次在获得U-NAS_PRO_5.1.2_ZH_2022.03.28-1600.iso 这个版本的安装盘后,据说要用这个ISO文件生成一个USB盘启动盘才能安装。于是我就想先试着在虚拟机上安装,直接使用ISO文件比用USB盘启动盘更为方便,为什么不按照这个思路试试呢?所以我决定不做USB盘启动盘,直接用ISO文件来在虚拟机上安装测试。
具体的安装步骤就不在这里赘述了。一般情况下我都是使用Linux系统下的KVM虚拟机进行安装测试的。考虑到大多数坛友们喜欢使用Windows系统的虚拟机,这次我特意使用Oracle 公司的 VirtualBox虚拟机来做万由U-NAS 5.0的安装测试。
我选用的网卡是Intel PRO/1000 MT Desktop (82540EM),它实际上相当于e1000网卡。如下截图是我的虚拟机配置:
先要将虚拟机设定为从CDROM盘启动。然后启动虚拟机,这个的安装过程很顺利,只是创建启动盘的过程比较长,只要耐心等待就好。
安装创建启动盘的过程完成以后,先要关闭虚拟机,重新调整设定。要把CDROM盘启动的ISO映像删除。再次设定从硬盘启动系统即可。
再次启动后就进入万由UNAS 5.1.2系统了。在虚拟机的启动过程中,可能会出现一些提示或警告信息。这些都不要理睬。直到出现如下的截屏画面,万由UNAS 5.1.2系统就启动成功了。
从控制台的提示信息中,我们可以看到当前IP地址。这时我们就可以使用万由提供的默认账户:root和默认密码:yutech从控制台登录系统了。
当然我们也可以使用浏览器通过IP地址连接万由UNAS 5.1.2系统,但非常不幸的是我们获得的是如下的界面:
要求你必须提供激活码才能使用系统。其实此时的系统已经是正常启动的NAS系统了。只是没有激活浏览器的管理界面而已。因此你就无法使用浏览器对系统进行配置管理。但是如果你是Liunx系统的专家,你依然可以使用控制台的命令对系统进行配置管理的。
到目前为止,我的结论是万由U-NAS 5.X仍然可以在虚拟机上安装使用。接下来的问题就是,如何破解激活授权的问题了。这样才可以方便大家使用。这也是本文要解决的重点问题。我将会讲解我的破解思路,也回在讲解的时候提供相关的补充知识,供大家学习参考。并在参考文献中注明所有引用文献的出处。
第二节
万由U-NAS 5.X激活授权的破解思路
破解的思路一般来讲有两种。其一就是阻断激活状态的检测,让万由的系统误认为已处于激活状态。这样做的优点是,比较简单易行。缺点是可能会缺失激活状态的必要数据,有可能影响系统运行。其二是破解激活码的算法,通过正常的激活过程对系统进行激活。例如:使用一些技术手段,通常是使用WireShark; TCPDump等等网络抓包工具;并结合静态程序算法分析。截取激活过程中万由U-NAS 系统与在线激活服务器的信息交互。然后设计一个模拟的自授权激活服务器,取代真实的授权服务。这样做的优点是,系统获得了真正的激活授权。缺点是破解过程比较复杂,需要有一定的经验和必要的相关知识。
以上是我的破解思路。接下来我会对两种思路的破解方法做详细的深入浅出讲解。让我们开始吧,看看我是如何一步一步实现破解的过程。
首先我会通过控制台用万由提供的默认账户:root和默认密码:yutech 来登录万由系统,并对系统的运行状态和配置做初步探索。
题外点评:当然这时有些读者可能提出这样的问题,如果万由不提供默认的root账户和密码怎么办?其实对于我们做逆向工程的专业人员来说,这根本就不是问题。可以通过将启动盘挂载到任何具有root权限的Linux系统上,直接修改/etc/passwd 和/etc/shadow文件来获取 root账号和密码。
登录万由U-NAS系统后的截图如下:
第一步:登录系统后我会在第一时间修改默认账户root的密码。这是我做逆向工程的习惯性动作。Linux系统的root账户是最高权限级别的账户。当然还是使用自己的密码比默认密码更安全,更放心对吧。修改默认密码可以使用命令:passwd然后按照提示输入两次新密码即可。
为了便于破解工作的顺利进行,我要做的第一件事儿是开放sshd的root登录权限,以便可以使用PuTTY; WinSCP等工具。具体步骤如下:
编辑修改/etc/ssh/sshd_config文件容许root登录。
去掉注释# PermitRootLogin prohibit-passwoed
把“PermitRootLogin prohibit-passwoed”改为“PermitRootLogin yes”。下面给出一个截图供参考:
然后存盘修改后的文件,重启服务: service sshd restart 。
第二步:查看Web服务的配置。我通常会使用如下命令:
root@U-NAS-IC61NQS35:~# netstat -tuple | grep http
tcp6 0 0 [::]:http [::]:* LISTEN root 21291 1164/apache2
tcp6 0 0 [::]:https [::]:* LISTEN root 21294 1164/apache2
root@U-NAS-IC61NQS35:~#
我们可以看到,万由U-NAS使用apache2提供它的Web服务。接下来我们要查看apache2的配置文件。它通常位于/etc/ apache2/ 的目录中。我查看了/etc/apache2/sites-available目录中的unasdesktop.conf这个文件。它包含了如下内容:
<VirtualHost *:80>
ServerName U-NAS
AddDefaultCharset UTF-8
IncludeOptional /unas/etc/apache2/conf.d/*.conf
# This include should always be with VirtualHost *:80.
IncludeOptional /unas/etc/apache2/http/*.conf
</VirtualHost>
它的IncludeOptional包含了/unas/etc/apache2/http/*.conf中的配置文件。需要再继续查看。
root@U-NAS-IC61NQS35:/unas/etc/apache2/http# cat unasdesktop.conf
Include /unas/etc/apache2/apps/desktop/conf/unasdesktop-directory.conf
# This include should always be with unasdesktop.
IncludeOptional /unas/etc/apache2/apps/desktop/http/*.conf
它的IncludeOptional又包含了/unas/etc/apache2/apps/desktop/conf/unasdesktop-directory.conf配置文件。还需要再继续查看。
root@U-NAS-IC61NQS35:/unas/etc/apache2/apps/desktop/conf# cat unasdesktop-directory.conf
DocumentRoot /unas
<Directory /unas>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride None
Require all granted
RedirectMatch ^/$ /desktop/
</Directory>
<LocationMatch ^/(apps|desktop).*/languages/.*Translation>
Header set Content-Type application/json
</LocationMatch>
好了,到此为止已经找到了我想要的东西。我找到了万由apache2的Web服务的根目录位置:DocumentRoot /unas。在这个服务的根目录又有如下设定RedirectMatch ^/$ /desktop/。所以我会试着开始着手分析/unas/desktop/目录中的Web服务程序。先用ls命令看看目录中都有些什么?
root@U-NAS-IC61NQS35:/unas/desktop# ls
admin.html html includes js login php test.html upgrade.html wallpapers
css images index.php languages logout.php plugins themes upgrade.php
噢,有一个index.php文件。初步猜想万由的U-NAS 5.X 系统的Web服务管理界面是用php程序写的。再简单查看一下其它目录,我的猜想很快就得到了证实。
第三步:用file命令查看一下index.php文件的属性。
root@U-NAS-IC61NQS35:/unas/desktop# file index.php
index.php: data
咦?这个文件的属性居然是data,而不是PHP script, ASCII text。显然万由对它的php程序都进行了加密处理。不过对于我们做逆向工程的专业人员来说,破解这些东西都是小菜一碟。
作为补充知识,下一节我要先介绍一下如何处理加密的php程序的破解问题。然后再接着讲激活授权的破解。
第三节
使用php screw 或者screw plus来保护php的代码安全
我们大家都知道php程序是脚本程序,但php也支持二进制扩展。为了不让php脚本程序被开发者之外的人阅读,有人开发了一款免费的针对PHP源码进行加密的PHP的扩展。它的名称为:PHP_Screw。这里我要先介绍一下有关php_screw的发展历史和现状。让大家对php_screw是个什么软件有一个一般性的了解。见参考文献[1]。
PHP_Screw是一款由日本人“野田邦昌”开发的免费的针对PHP源码进行加密的PHP的二进制扩展库,可以自定义加密种子文件,加密后的文件效率还不会下降。当前的最终版本是2016开发的php_screw-1.5.tar.gz。目前没有更进一步的开发与更新维护。
由于他是初探PHP扩展,所以php_screw扩展的加密原理以及源码结构都非常简单。下面来简单分析一下他的php扩展库的编写和这种加密算法的实现,在解压php_screw-1.5.tar.gz后的tools目录下的screw.c可以看到其主要流程:
打开目标文件→判断是否已经加密→创建备份文件→调用zencode进行压缩→使用密码pm9screw_mycryptkey进行加密→保存结果。关注的重点是如下的两个部分,即zencode函数和加密方式。其中zencode在同目录下的zencode.c中定义,与它一起的还有zdecode函数。
两个函数都调用了zcodecom函数,而传入的第一个参数决定了是进行压缩还是解压。
可以说PHP_Screw是一个加密和压缩俩种功能集成在一起的加密软件。PHP_Screw使用“对称”密钥进行加解密。(与此相对的是非对称密钥,典型代表是公开密钥密码体制的RSA算法,椭圆曲率密钥密码算法。部分密钥可以公布。笔者对这个研究领域也有一定造诣。)“对称”密钥是绝对不能泄露的。另外加过密的文件还需要有一个标识Tag,以便解密程序识别。“野田邦昌”开发的版本中,他会编译创建了一个扩展库.so文件。并将密钥隐藏在该扩展库的.so文件中。
后来又有人在“野田邦昌”开发的免费版软件PHP_Screw基础上,做了一个简单的二次开发扩展名称为:screw_plus。它的确是有些进步。方便简单了一些。例如:不再需要标识Tag了。取而代之的是先将对称密钥作md5散列hash处理后,用前16个字节当作标识Tag。并采用了高强度AES-256-ECB加密。但在反破解方面没有任何新的建树。仍然是对称密钥,并且隐藏在.so的扩展库中。万由对php的加密处理就是采用了这个screw_plus的二次开发扩展。
这种设计思路,对于提供web服务的网站可能是非常有效的。但是对于用户可以拿到拥有root访问权限的万由U-NAS系统,就不那么有效了。是有可能被轻而易举地破解的。我现在已经拥有对于万由U-NAS系统的root权限。对于“老骥伏枥”这样的江湖老手来说,破解它当然不成问题了。其实老骥伏枥早已解甲归田,隐退江湖已久。只是有时耐不住寂寞,偶尔露峥嵘而已。
为了获取隐藏在php扩展库so文件中的密钥,就要先找到这个扩展库。实际上这是很容易的事情。我们知道php 的二进制扩展库都是通过它的配置文件*.ini引入的。那好,我们就去它的配置文件那里找找看。首先我们需要知道php.ini配置文件的位置。这不难,我们可以用如下命令来找:
root@U-NAS-4C1JVEUK:~# php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php/7.3/cli
Loaded Configuration File => /etc/php/7.3/cli/php.ini
看到了吧,万由系统的php文件在 /etc/php/7.3/cli/这个目录中。在该目录的conf.d子目录里,有一个20-php_screw_plus.ini的配置文件。在它里面定义了一个扩展库:
; configuration for php screw plus module
extension=php_screw_plus.so
接下来我们可以用如下命令来找到php_screw_plus.so的位置。
root@U-NAS-IC61NQS35:/# find / -name php_screw_plus.so
./usr/lib/php/20180731/php_screw_plus.so
再接下来就是要找到隐藏在该扩展库的.so文件中的php加密的密码了。我以前曾经用hex-rays公司的反汇编的利器IDA对php_screw_plus.so扩展库的程序进行过细致的分析。也知道用C++编译后产生的 ELF文件会有一个静态数据区,它们一般都会编译到.rodata这个区域中。隐藏扩展库中的php加密的密码就是属于这类数据。因此,这次为了快捷起见,根据经验,我就直接使用如下命令objdump -s -j .rodata php_screw_plus.so来查看密码。
root@U-NAS-IC61NQS35:/# cd /usr/lib/php/20180731/  进入该目录
root@U-NAS-IC61NQS35:/usr/lib/php/20180731# objdump -s -j .rodata php_screw_plus.so
php_screw_plus.so: file format elf64-x86-64
Contents of section .rodata:
5000 656e6162 6c656400 7068705f 73637265 enabled.php_scre
5010 775f706c 75732073 7570706f 72740025 w_plus support.%
5020 30327800 41434345 53532044 454e4945 02x.ACCESS DENIE
5030 44007368 6f775f73 6f757263 65006869 D.show_source.hi
5040 67686c69 6768745f 66696c65 00726200 ghlight_file.rb.
5050 7068705f 73637265 775f706c 75730031 php_screw_plus.1
5060 2e352e30 00415049 32303138 30373331 .5.0.API20180731
5070 2c4e5453 00000000 454a4b6a 646f6f64 ,NTS....EJKjdood
5080 57705a4b 786a6b77 70647373 34554577 WpZKxjkwpdss4UEw
5090 72727266 66454657 33543233 6a484e4a rrrffEFW3T23jHNJ
50a0 48000000 00000000 00002000 H......... .
根据经验,我立即分析出php的密码就应该是: EJKjdoodWpZKxjkwpdss4UEwrrrffEFW3T23jHNJH。
当然你可能会问,如果没有经验怎么办?那就只能使用IDA或者ghidra这类反汇编工具自行分析了。具体的分析方法,已经超出了本文所以讲述的范围,请读者自行查阅有关书籍和文献。不过对于万由U-NAS 5.X版本,读者们就不必费功夫了。我提供的php的密码肯定是正确的啦。
为了解密万由的php文件,我自己写了一段解密程序:screw_plus_decrypt。这段程序极其简单。如果大家也想试试自己解密万由的php文件,可以到网上搜一搜。有很多这类开源的样本程序。我的目的是讲解破解过程,因此我就不提供我的解密程序了。解析出php的密码就足够了。
由于NASYUN的篇幅限制,请看楼下,第四节 【破解的思路之一“阻断激活状态的检测”的实施】,精彩继续!