![bb24d964289e3b13b699073177a7f6d0.png](https://i-blog.csdnimg.cn/blog_migrate/124ffd05b6ee1958fe4a5ccb7e25daa1.jpeg)
本文介绍了Windows、Linux和Mac等操作系统下密码认证机制,并在此基础上,分别介绍了Windows系统密码破解、Linux系统密码破解、MacOSX登录屏保密码破解。3种操作系统下破解系统密码的方式,以及一种通过直接修改内存、向Mac计算机中植入可执行程序的技术。本文涉及到的理论及方法只得用来内存提取理论研究,不得用于非法用途,所造成的后果一切与本人无关,故不作具体演示示例。
调查取证人员在无法获知犯罪嫌疑人计算机的系统密码时,其在线取证工作受到了阻碍,一旦强制关闭目标计算机,再进行离线取证工作,嫌疑人的犯罪证据很有可能会丢失。此时,绕过系统登录密码或获取系统登录密码明文成为较好的选择。并且,在进行这些操作时,最好能绕过安全日志的审计,尽可能不破坏目标计算机状态。为了解决这个问题,对处于屏保或待机状态的系统密码明文获取或绕过的研究提上日程。本文首先分析Windows/Linux/Mac OS操作系统下密码认证的方式,然后结合内存分析技术,分别讲述Windows/Linux/Mac OS操作系统下破解系统密码的方法。
15.1密码认证机制
15.1.1Windows密码认证机制
(1)安全账户管理器
安全账户管理器(SAM,Security Account Manager)是Windows的用户账户数据库,用于保存用户账户信息,这些信息主要包括:用户账户、用户口令和用户所属组等。SAM数据库记录在注册表的HKLMSAMSAM和HKLMSECURITYSAM两个节点。拥有System权限的用户可以在注册表中查看SAM数据库的信息。
(2)Windows密码验证流程
Windows7以后版本的操作系统中不再使用msgina.dll,而是使用多个进程配合,完成用户认证过程。交互式登录是通过登录进程(Winlogon)、Lsass、一个或多个认证包,以及SAM活动目录之间的相互作用而进行的Winlogon.exe负责管理与安全有关的用户交互。它协调登录过程、在登录时启动用户的第一个进程、处理注销过程,以及管理其他各种与安全有关的操作,包括在登录时输入口令、修改口令、锁定工作站和解除工作站的锁定。
当用户名和口令被输入时,Winlogon通过调用Lsass的函数
LsaLookupAuthenticationPackage来获得一个指向认证包的句柄。在注册表的
HKLMSYSTEMCurrentControlSetLsa下列出了系统中的认证包。Winlogon通过LsaLogonuser函数将登录信息传递给认证包。一旦认证包成功认证了一个用户,Winlogon便继续该用户的登录过程;如果没有一个认证包指示这是一次成功的登录,则登录以失败告终。
当用户以交互方式登录到一个域中时,Windows使用Kerberos作为认证包;当用户以交互方式登录到本地计算机,或登录到Windows 2000以前的可信域中,或当没有域控制器可以访问时,Windows使用MSV1_0作为认证包。具体过程如图1-1所示。
![063737a39f18e0620339977845fa16ba.png](https://i-blog.csdnimg.cn/blog_migrate/40dbbf6b97ecf978ca339bc501eb8582.png)
系统密码的绕过方法针对用户以交互方式登录到本地计算机的情况进行,因此这里着重介绍MSV1_0认证包的认证方式。
MSV1_0是一个实现了“LAN Manager2”协议的认证包。MSV1_0并没有将用户完整的口令散列存在注册表中。MSV1_0缓存了此散列值的一半,这缓存的一半散列值,对于验证用户口令的正确性来说,已经足够。但想要访问EFS密钥,或者证明自己是一个域中的用户,则仍然是不够的,因为这些操作需要整个散列值。
(3)数字加密方式
一般来说,常见的数字加密方式都可以分为两类:对称加密和非对称加密。
对于对称加密来说,其加密运算、解密运算使用的是同样的密钥,信息的发送者和接收者在进行信息的传输和处理时,必须共同持有该密码。在数据传送前,发送方和接收方必须商定好密钥,然后使双方都能保存好密钥。对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。常用的对称加密算法有DES、3DES、RC2、RC4、RC5、IDEA、AES等。
数据加密标准(DES,Data Encryption Standard)是一种传统的对称加密算法。它是一种使用对称密钥加密的块算法,需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(DEA,Data Encryption Algorithm),己与作为标准的DES区分开来。
DES算法的入口参数有3个:Key、Data、Mode。其中,Key为7byte(56bit),是DES算法的工作密钥;Data为8 byte(64 bit),是要被加密或被解密的数据;Mode为DES的工作方式(加密或解密)。
非对称加密在加密和解密时,用的是不同的密钥,分别称为公开密钥(Public Key)和私有密钥(Private Key)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只能用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只能用对应的公开密钥才能解密。
非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解,而非对称加密使用一对密钥,一个用来加密,一个用来解密,而且公钥是公开的,密钥是自己保存的,不需要像对称加密那样在通信之前要先同步密钥。
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
主要非对称加密算法有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
(4)用口令加密算法
Windows系统主要使用单向LM和NTLM两种散列算法对用户的账户信息进行加密。LM散列算法是在对称加密算法DES的基础上实现的,包含以下6个步骤。
①转换:将输入的密码password中所有的小写改为大写。
②定长14byte:如果密码长度超过14byte,将截取前面14 byte数据,如果不足14 byte,则以0x00来补齐。
③分组:将14byte数据均分为两个7byte数据
④Key产生:分别将2个7byte的数据,各生成64 bit的DES的key。
⑤加密:采用DES算法加密一段明文“KGS@#$%”,其中key在步骤④中给出,从而得到两组64bit的数据。
⑥连接:将两组64bit的数据连接为16byte的数据,得到LM散列的最后值。
LM算法加密过程中包含很多弱点,故其安全性较低,从Windows Vista开始就不再使用。
NTLM(New Technology Lan Manage)算法则是在Windows的NT版本上给出的更强的加密算法,其后一直被沿用,NTLM采用MD4和RSA加密存储,极大地加强了密码安全性。
主要包含以下两个步骤。
①将输入的密码password转换为Unicode形式
②对得到的Unicode串进行标准MD4散列,得到16byte的NTLM散列值。
③将16byte的NTLM Hash值用NULL填充至21byte。
④将21byte的NTLMHash值切分成3部分,每部分占7个byte。
⑤切分好的3部分数据使用DES算法处理,生成3个DES密钥,用于对服务器与客户端协商后提供的挑战值进行加密,最终产生3个8byte的密钥串。
⑥将得到的3个8byte密钥组合成一个24byte的字符串,即为最终的NTLM Hash。其中,加密过程中还会用到syskey和SAM中的某些键值。
(5)SAM子项分析
在SAM数据库中,有关用户的账户信息主要保存在节点/Domain/Account/Users下,每个账户下都有两个子项F和V。子项F用于保存用户账户的注册记录信息,如最后一个登录时间、账户锁定时间和登录错误次数等,子项V保存用户账户的基本信息:用户名、密码Hash值、所属组等。这里关注子项V的主要内容,如表1-1所示。
![98fa5c614b101b7aae8a4462660f3d06.png](https://i-blog.csdnimg.cn/blog_migrate/f00771a806958cd7beda039dd05e7e94.jpeg)
1.1.2Linux密码认证机制
(1)与系统登录相关的文件Linux系统用户登录密码主要使用MD5或其他Hash算法,并结合一个系统随机生成的salt对用户输入的密码明文进行加密,加密后的用户信息和对应的密文保存在/etc/passwd和/etc/shadow文件中。
/etc/passwd文件存储所有用户的账户信息,每行表示一个用户,用户信息由用“:”分割的
7个字段组成。这些字段分别表示:用户账户名称、用户口令(以“x”代替,加密后的密码存储在shadow文件中)、用户权限标识、用户所属组、用户信息说明、home目录位置、使用的shell类型。
/etc/shadow文件存储利用上述算法所产生的用户密码密文,该文件仅限最高系统权限用户读取。Shadow每行内容与Passwd文件类似,每行由用“:”分割的9个字段组成。这些字段分别表示:系统登录名、密码密文、密码最后一次修改时间、口令修改间隔最小时间、口令修改间隔最大时间、密码过期前多久提醒用户、密码过期后多久取消用户、密码失效时间、保留字段。其中,密码密文由使用“$”符号分割的3个字段组成,分别表示:加密方式、salt值、加密后的字符串。
(2)Linux PAM认证
PAM(Pluggable Authentication Module)是SUN公司提出的一种身份认证机制。它采用模块化设计和插件功能,提供有关执行用户认证与账号维护的服务。在实现上采用分层的体系结构,将各种具体的认证模块从应用程序中独立出来,使认证机制与应用程序之间相互独立,从而可以在应用程序中根据需要灵活地插入所需要的认证模块或替换原来的认证组件,不必对应用程序做任何修改。应用程序只需要调用编程接口API即可方便地使用PAM提供的各种认证功能。其框架体系结构如图1-2所示。
![561352730baafad3696cbc5e628b8402.png](https://i-blog.csdnimg.cn/blog_migrate/77786aa635642c466bcb1c65a0775f13.png)
PAM框架主要由4个部分组成:PAM应用程序、PAM库、PAM.conf配置文件及PAM服务模块。
OPAM服务模块
PAM服务模块处于整个结构的最底层,向上为接口层提供用户认证等服务,完成具体的认证工作。其以多个动态链接库文件(或静态库)的形式存储在/lib/security目录下。有4种类型的PAM服务模块,如表1-2所示。
![279136c73fe4e20cfa7b725e4b7a9f9a.png](https://i-blog.csdnimg.cn/blog_migrate/76bd1122097e7323122b5f61740d8f9a.jpeg)
表1-2PAM服务模块信息
应用程序接口位于PAM结构的中间部分,它向上为应用程序屏蔽了用户认证等过程的具体细节,向下调用模块层中具体模块所提供的特定服务。应用程序结构主要由PAM API和配置文件两部分组成。PAMAPI分成两类:一类用于调用下层特定模块的接口,该接口与底层的模块相对应,主要接口函数及其实现功能如表1-3所示;第二类接口通常并不与底层模块一一对应,它们对底层模块提供支持以及实现应用程序与模块之间的通信,主要接口函数及其实现功能如表1-4所示。
![a9fc92fdf685768d6b996d9d1eabb949.png](https://i-blog.csdnimg.cn/blog_migrate/8476dbc688250e22b51bf124cef9e1f4.jpeg)
![3cf67be5798c72bece94433c5cccbf22.png](https://i-blog.csdnimg.cn/blog_migrate/22a4a90191ae6df3828727e1a6c101a6.png)
各个独立的服务模块之间可以通过pam get_itemO和pam_set_itemO函数共享某些公共信息,如用户名、服务名、口令等配置文件存储在/etc/pam.d目录下,放置在应用接口层,其与PAMAPI配合使用,为应用程序选定具体的认证模块、模块间的组合以及规定模块的行为,从而可以实现在应用中灵活插入所需认证模块的目的。
③应用程序层
PAM提供了对所有服务进行认证的机制,适应于login、telnet、rlogin、fsh、ftp等应用程序,每个使用PAM的应用程序采用该应用程序的名字来定义自己的服务类型。
(3)工作原理
应用程序层与PAM服务模块通过PAMAPI立联系,按照需要调用相关的服务模块,完成对某种应用程序的认证。工作流程如图1-3所示。
![c93cb62dd81d24d6f8b40ce0538dc11d.png](https://i-blog.csdnimg.cn/blog_migrate/560096b2e7480d23eaea866c7ee64519.png)
PAM机制在运行时,按照图中所标示的数字,依次完成如下步骤。
①用户调用某个应用程序,以得到某种服务。
②PAM应用程序调用后台的PAM库进行认证工作。
③PAM库在/etc/pam.d/目录中查找有关应用程序细节的配置文件,该文件告诉PAM,此应用程序使用何种认证机制。
④PAM库装载所需的认证模块。
⑤上述装载的认证模块让PAM与应用程序中的会话函数进行通信。
⑥会话函数向用户要求相关信息。
⑦用户对这些要求做出回应,提供所需的信息
⑧PAM认证模块通过PAM库将认证信息提供给应用程序。
⑨认证完成后,应用程序做出两种选择:将所需权限赋予用户,并通知用户;若认证失败,也通知用户。
1.1.3MacOS密码认证机制
在Mac OS中,用户登录口令信息的存储位置不固定。在Mac OSX10.4-Mac OSX10.6版本中,shadow文件的存放路径是/var/db/shadow/hash/;在Mac OS X10.7及其以后的版本中,用户口令的散列值保存在/var/db/dslocal/nodes/Default/users/文件夹下的plist文件中。与Linux系统不同,Mac OS中每个用户有其单独的shadow文件,每个文件以用户的GUID作为用户散列密码文件的标识。在加密算法上,MacOS主要使用SHA-1(或SHA-512)进行加密,并加上长度为4byte的salt,最终生成密文。
1.2Windows系统密码破解
对Windows系统的密码破解有多种方式,常见的方式是暴力破解、字典破解。暴力破解是通过穷举的方式生成可能密码对应的Hash值,将这些Hash值与用户账户的Hash值比较,然后确定用户账户密码。字典破解是根据一定规律生成所有可能的密码集合,然后进行比较。基于彩虹表破解方法也是很有效的一种方法。彩虹表是一张针对MD5或其他Hash等加密算法生成的密文和明文之间的对照表,一般体积都比较庞大。
暴力破解要求计算机具有强大的计算能力;字典破解根据密码加密类型寻求最佳的字典密码序列;目前主流的彩虹表占用存储空间较大,并且必须付费才能使用。
另外一些通过向目标计算机注入动态链接库来绕过密码认证或获取密码明文的方式,需要直接对目标计算机进行操作,以致无法保证证据的可信性。随着内存分析技术的不断发展,我们先后采用了3种不同的方法实现Windows系统密码的破解。
1.2.1修改密码方式
修改密码主要是指将目标机器中原有的加密信息替换为已知的加密信息,从而可以输入已知密码进入系统。通过对Windows系统研究,得知系统在屏保或待机状态时的登录密码是以散列值的形式存储在SAM文件中的。修改密码就是修改SAM文件中存储的密码的散列值。
替换密码的流程如图15-4所示,具体方法如下。
(1)通过内存获取工具获取目标系统的内存(2)通过分析得到目标机器操作系统版本。
(3)提取内存镜像中目前机器的SAM文件及syskey值。
运用从内存镜像中提取hive文件的方法,可从注册表中转储出SAM文件。
(4)从SAM文件中提取目标机器密码散列值
(5)对已知的一段明文以syskey值为密钥,通过NTLM算法得到对应的散列值,通过LM算法得到对应的散列值。
(6)使用内存读写器将目标机器内存中的NTLM散列值修改为已知明文的散列值(如果有LM散列值也一起替换)。
![d7221a23c702eb4a7a2c17e343127323.png](https://i-blog.csdnimg.cn/blog_migrate/614165a94c98ad242a456fcbcd1b34bd.png)
从而可以通过输入己知的明文进入目标系统
1.2.2绕过密码方式
(1)绕过密码认证功能
Windows的登录验证是通过Winlogon中的MSV1_0.dll完成的。通常情况下,MSV1_0.dl接收用户输入的用户名和经过散列计算后的口令值,并且向本地的SAM发送一个请求,从SAM中取出有关账户的信息,包括口令的散列值、用户所属的组、用户的权限等,比较两个散列值,以确定用户输入是否正确。此外,Windows的对象管理器可能会生成一些审计日志,并将其保存在Lsass进程的Lsasrv.dll中,以此检查用户对密码验证的破坏行为。
对于系统密码的绕过,我们主要是通过内存分析技术分析内存中有关密码验证的信息,并将其修改为特定的值而实现的,具体流程如下。
①通过内存获取工具获取目标系统的内存。
②通过内存分析得到目标机器操作系统版本。
③获取进程链表,得到Lsass进程调用的动态链接库链表。
④在动态链接库链表中定位MSV1_0.dll。
⑤定位MSV1_0.dll转储文件中密码保护机制所对应的系统设置值。
⑥通过修改内存记录的设置值破解密码。
(2)清除Windows安全审计系统安全日志主要记录了与系统安全相关的一些事件。用户登入/登出事件就被记录在此日志类型中。关于登入/登出的审计事件记录了用户登入/登出是否成功的信息,包含每次登入/登出的一些详细描述。
系统安全日志配置选项对应注册表节点是
:HKEY_LOCAL MACHINESECURITYPol icyPolAdtEv。
这个注册表键值是个二进制值,共有11个DWORD,中间9个DWORD对应审核策略,每个策略对应一个DWORD,前后两个DWORD作用位置,对应策略分别为
“审核系统事件”1
“审核登录事件"2
”审核对象访问“3
“审核特权访问“4
“审核过程跟踪“5
“审核策略更改“6
“审核账户管理"7
“审核目录服务访问”8
“审核账户登录事件”9
读取注册表值,对照上述结构就能获得审核策略配置。然而,在系统运行过程中,系统是通过读取Lsasrv.dll动态链接库中的策略来执行安全日志审计工作的。Lsasrv.dll动态链接库中的策略与注册表中记录的策略是相同的,因此可以通过修改内存来实现Lsasrv.dll动态链接库中对应策略的修改,防止
Windows审计日志记录本次以任意密码登录系统的行为。具体流程如下:
①通过内存获取工具获取目标系统的内存;
②通过分析得到目标机器操作系统版本;
③获取进程链表,得到Lsass进程相关信息;
④获取Lsass进程调用的动态链接库链表;
⑥获取注册表,并得到相关节点中对应策略;
⑥从动态链接库链表中找到Lsasrv.dll;
⑦在Lsasrv.dll中搜索步骤⑤中获取的策略值,
找到日志审计策略所在物理地址;
⑧通过回写内存将策略写为0,实现绕过安全日志审计的功能。
此时,可以输入任意密码进入系统,并不会在安全日志中留下登录事件相关审计记录。在实际取证工作中,回写内存之前,记录回写位置和回写之前的内存块数据,当绕过密码方式进入系统,取证人员完成取证工作后,再次回写原来的内存数据内容,以实现密码认证功能的恢复。
15.2.3密码明文获取方式本节介绍直接从内存镜像文件中解密登录密码的方法。其主要原理是从Lsass进程的Lsasrv.dll中解密出登录密码。系统的登录密码不仅存放在LMHash和NTHash中,也存放在“Lsass.exe”中。解密密码密文的主要步骤如下。
(1)从目标计算机内存镜像文件中转储Lsasrv.dl1文件。
(2)分析密码的密文和它的长度。
(3)在取证计算机上运行解密函数。
(4)设置解密所需的参数和密文,并调用解密函数来解密。
密码的解密是通过转储内存镜像文件中与解密相关的DLL文件进行的,转储DLL的算法流程如图1-5所示。
![e3aeba40442b1756c09d8d2eaccf08f4.png](https://i-blog.csdnimg.cn/blog_migrate/2a27d5a918ad5a7d2daf2519956992d7.jpeg)
(1)从内存镜像中查找密文和密文的长度密文存放在一个双向循环链表中,这个链表的头可以通过在“wdigest.dll”中搜索“8B45088908C74004”得到,搜索结果如图1-6所示。
![bd23d672ae117c849a70c1987e0c7d76.png](https://i-blog.csdnimg.cn/blog_migrate/93e0d696e5f8605ab2d37dffce0194b6.png)
在密文中包含5个变量:第1个是链表下一个元素的指针;第2个是在偏移0x10处的指针,为LUID的低阶部分;第3个是在偏移0x14处的指针,为LUID的高阶部分;第4个是在偏移0x36处,是密文的长度;第5个是在偏移0x38处,为密文。可通过循环搜索链表逐渐找到正确的记录。
(2)加载解密函数解密的方法以Windows XP为例给出加载解密函数解密的方法。
①得到目标计算机加载“Lsasrv.dll”的虚拟地址,记为“lsasrvdllbase”,加载代码如下所示。
hmapping=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGB_READWRITE,0,dwImagesize+SIZE_OF_PARAMETER_BLOCK,svMappingName);MapViewofFileEx(hmapping,FILE_MAP_WRITE,0,0,0,lsasrvDllBase)
②复制“Lsasrv.dll”转储文件中“.data”字段的数据到一个缓冲区中。将指针指向这个缓冲区,相关代码如下所示。转储文件可以在取证计算机上运行。
dataPa= pSectionHead->VirtualAddress;
lsasrvDumpFile.Seek(dataPa,CFile::begin);
lsasrvDumpFile.Read(pagebuf,dwBytes);
pdataAddr =(LPVOID)((DNORD)pSectionHead->VirtualAddress+(DWORD)
hModlsasrv);
memcpy(pdataAddr,pagebuf,dwBytes)
③设置解密所需函数的全局变量。通过在解密函数代码空间中搜索·特殊字符串
“8D85F0FEFFFF50FF7510FF35”找出全局变量的地址,记为GAddr;GAddr在内存中的值如图15-7所示。
![1fe2950b4dfa5719f354169955c6e002.png](https://i-blog.csdnimg.cn/blog_migrate/ac9b91e4fa77431f6035cb52dec2d046.png)
加载内存镜像文件中这个地址的数据,并将其复制到缓冲区。将指针指向缓冲区。
④加载“bcrypt.dll”和“beryptprimitives.dll”用于解密。
整个流程如图1-8所示。
![edd3e8f409d5d8cebd4f0c762acde449.png](https://i-blog.csdnimg.cn/blog_migrate/e9ac6d7adeea3801332307c95f9dd7e4.jpeg)
利用此算法可以从内存中分析出如图1-9所示的密码信息。
![5347b8d300ee430dbef79e5565195ac3.png](https://i-blog.csdnimg.cn/blog_migrate/38b8bad75cecd6d94163056f8cbac88b.png)
1.3Linux系统密码破解在Linux系统中,绕过系统密码认证的常规方法有很多,比较典型的有以下几种。
1.3.1单用户模式进入系统在系统启动时,通过GRUB界面以单用户模式进入系统,然后在终端命令行窗口重置root管理员密码,即以root身份进入系统。然而,这种方式存在很大弊端:一方面,在当前众多的Linux系统发行版本中,以单用户模式进入系统的方式各不相同,以致用户在使用这种方式进入系统前必须查阅相关文献资料或官方说明文档,寻找对应方法;另一方面,在安全性较高的Linux服务器中,系统管理员通常会修改GRUB配置文件,禁止用户以单用户模式登录系统。
1.3.2修改配置文件
可以通过Ex2Fsd软件挂载Linux文件系统镜像,提供对Linux系统分区的读写访问控制,然后在程序中修改用于存储用户口令信息的配置文件,最终实现无密码登录Linux系统。
(1)Ext2Fsd Ext2Fsd是一款基于GUI图形界面的Linux文件系统驱动软件,能够在Windows系统中自动识别和挂载Linux系统分区,提供ext2、ext3和ext4等文件系统格式的读写访问控制。
无密码登录Linux系统需要修改用户密码配置文件,清除配置文件中的密码Hash值[100]。
(2)清除root权限
清除root权限登录限制时,需要修改/etc/pam.d目录下以gdm开头的文件。修改方法是:在搜索到的以gdm开头的文件中将存在auth required pam_succeed_if.so user!=root quiet的内容删除。
(3)清除Passwd文件中的密码Hash值如前面所述,Passwd文件中存储了所有用户的账户信息,其中记录用户口令的字段以“x”代替,加密后的密码存储在Shadow文件中。
将这里的“x”改成0,即可清空口令。此方法的优点是可以在未知系统密码的情况下,实现登录密码的绕过。然而它具有一定的局限性:当系统处于关机状态时能够挂载其系统分区,并进行配置文件的修改,并且,当系统处于屏保状态时,无法使用该方法
实现系统密码的绕过。
1.3-3mimipenguin mimipenguin是一个免费、开源的shell/python脚本,它可从Linux系统内存中获取登录密码明文。此脚本可从
https://github.com/huntergregal/mimipenguin处获取。
Linux发行版在内存中存储大量的重要信息,如凭证(cred)、加密密钥以及个人数据,尤其是用户名和密码,有的进程将其保存在内存中,并以明文形式存储较长时间。基于以
上原理,mimipenguin在内存中转储进程,并提取可能包含明文凭证的行,然后通过以下内容的散列值尝试计算每个单词的出现概率:/etc/shadow、内存和regx搜索,最后找到相关口令。
此脚本需要在目标计算机上直接运行,因此在不知道目标计算机密码,无法进入目标计算机系统的情况下,此方法变得不可行。
1.3.4访问物理内存获取密码明文基于mimipenguin的实现原理,当系统处于屏保或待机状态时,可通过如下方式获取Linux系统密码明文:通过DMA方式读取Linux的物理内存,结合内存分析技术,转储进程内存,并进行一系列与mimipenguin类似的计算,获取Linux系统密码明文。
此方法消除了mimipenguin必须运行在目标机系统的弊端,对处于屏保或待机状态的系统,同样可以获取密码明文,具有较高的实用性。
1.3.5Inception Inception是一套可使用IEEE1394、Thunderbolt、ExpressCard、PC Card和任何PCI/PCIe等硬件以DMA方式读写操作系统内存来绕过密码认证的工具。该工具不仅支持Linux系统,也支持Windows操作系统和Mac OSX。该工具使用SBP-2(Serial Bus Protocal
2)设备与目标计算机IEEE1394接口相连,来读取目标计算机4GB以下内存空间数据,从中搜寻负责密码认证的代码,并修改其密码认证模块以实现任意密码都能够进入目标计算机系统的目标。
由于该工具最终是基于SBP-2设备读写目标计算机物理内存的,所以,其使用受到硬件设备以DMA方式读取计算机物理内存的限制。
1-4MacOSX登录屏保密码破解Mac OSX绕过密码认证有两种方式:修改内存绕过密码认证的方式和读取内存获取密码明文的方式。
1.4.1修改内存实现密码绕过的方式1-4.1.1相关基本知识
(1)FileVault FileVault使用全磁盘、XTS-AES128加密来保证数据安全,通过FileVault2,可以对整个驱动器的内容进行加密,用于防止他人在未经授权的情况下访问启动磁盘中的信息。该加密软件自动实时加密和解密,对用户来讲是透明的。即使磁盘被他人拿到,在未对磁盘解密的情况下,也无法查看其中的信息。
(2)Hopper Disassembler Hopper Disassembler是Mac OS下的一款二进制反汇编软件,一般用于实现MacOS下的逆向工作。利用它可查看其函数伪代码、字符串等信息。
绕过密码认证的方式根据系统是否开启FileVault和VT-d(详见第3章的相关内容)功能的情况,而采取不同的方式。无论采取什么方式,其原理都是以DMA方式修改Mac OS X的物理内存,绕过密码认证机制。
2012年下半年后生产的苹果系列计算机,默认都是开启VT-d功能的。从Mac OSX10.10以后的版本中,当用户进行系统初始配置时,默认都是开启FileVault功能的。可根据计算机开机启动界面判断其是否开启了FileVault功能。
开启了FileVault功能的目标计算机在其待机界面中有睡眠标签,且能显示其他账户。
1-4-1.2未开启FileVault和VT-d计算机上的密码绕过方法
在未开启FileVault和vt-d的苹果系列计算机中,可通过DMA方式正常读取其物理内存,绕过屏保待机状态密码认证机制的方法如下。
(1)使用内存分析技术,从内存里将
loginwindow的可执行文件转储出来,记录转储文件中每个物理页的虚拟地址与物理地址(2)对loginwindow的可执行文件样本进行反汇编,寻找字符串修改位置。
使用Hopper Disassembler对loginwindow进行逆向工作,如图1-12所示。
![d481dc2b0d1b28da75bacc6b1d3998b4.png](https://i-blog.csdnimg.cn/blog_migrate/5261fe2a13cd98e1dcd7df8348431678.png)
(3)找到实现密码认证功能的函数:methImpl_LWBuiltInScreenLockAuthLion verifyPassword,认证代码如图1-13所示。方框的位置为最终结果返回位置,将此处返回值设置为1,即可实现绕过密码认证直接进入系统。
![6d5397eb9438fda5114f955630a481ec.png](https://i-blog.csdnimg.cn/blog_migrate/8e88aa163d433c22fce398c3caa0c2d9.png)
(4)修改物理内存,绕过密码认证。
①使用特征字符串搜索的方法,从loginwindow的可执行文件样本中搜索出函数methImpl_LWBuiltInScreenLockAuthLion_ve rifyPassword对应返回值的特征字符串。
②将步骤①中记录的物理页的物理地址和特征字符串在物理页的偏移相加,获得特征字符
串在内存中的位置,将返回值由原来的0修改为1。
1-4.1.3开启VT-d未开启FileVault功能的计算机上的密码绕过方法
对于开启了VT-d功能,但没有开启FileVault功能的苹果系列计算机,在苹果系列计算机
处于关机状态时,可首先关闭VT-d功能,然后再执行1.4.1.2节中的密码绕过步骤,具体实现步骤如下。
(1)开机按住“Command”+“R”键,进入恢复模式。
(2)打开终端,输入命令“nvram boot-args=“dart=0”。
(3)重启计算机,使用1.4.1.2节中描述的步骤破解密码。
1.4.1.4开启VT-d和FileVault功能的计算机上的密码绕过方法
在苹果计算机开启VT-d和FileVault功能的情况下,为了绕过密码认证功能,需要两次接触目标计算机,前两步操作与1.4.1.3节中操作相同,都是为了关闭VT-d功能。具体步骤如下。
(1)开机按住“Command”+“R”键,进入恢复模式。
(2)打开终端,输入命令“nvram boot-args=“dart=o”,并离开。
(3)等待目标计算机处于屏保状态(用户己经输入过登录密码)时,再执行1.4.1.2节中的密码绕过步骤。
由以上步骤可见:对于开启VT-d功能的苹果计算机,首先关闭VT-d;然后根据其是否开启FileVault判断下一步工作:如果没有开启FileValut功能,开机后就能破解密码;如果开启了FileValut功能,等待目标计算机用户登录后,才能破解密码。
1.4.2读取内存获取密码明文的方式在Mac OSX10.12.2之前版本的苹果系统中,用户输入的密码会在内存中以明文的Unicode形式存在,而且在每次重新热启动,且没有载入操作系统时,这些内存没有被刷新,密码仍存在内存中的某个地方。当Mac OS热启动到File Vaulte开机登录界面时(此时没有启动操作系统),通过DMA方式读取内存,可从内存中搜索到密码明文。如前面所述,支持VT-d的计算机对DMA方式访问内存做了一定的限制。而此处,又可以在Mac计算机开机但操作系统没有被加载的情况下以DMA方式获取内存,这是因为,只有在操作系统启动后,那些系统保护区域的内存和DMA才会被系统接管。
一套名为“PCILeech”的软件实现了从内存中读取密码明文的功能。
“PCILeech”的使用步骤如下。
(1)将一台待破解的Mac计算机锁屏,将设备的一端连接待破解计算机,另一端连接Windows系统计算机(取证计算机)。
(2)在Windows系统计算机上运行相关程序,程序提示重启Mac计算机系统时,同时按Ctrl+Command+Power键重启Mac计算机。
(3)稍等片刻,程序会提示待破解计算机上的登录密码。
(4)在FileVault2的开机登录界面中输入此密码,则进入系统。
该方式利用了Mac OSX10.12.2以前的漏洞,但是该漏洞在Mac OSX10.12.2及其以后的版本上都被修复了。
1.5以修改内存方式向MacOS植入应用程序
恶意代码检测的相关章节中介绍了多种向一个正在运行的系统中植入应用程序,并使应用程序顺利执行的方法。然而,无论是通过网络植入,还是通过移动存储设备植入,最终都需要用户的参与。本节介绍一种在攻击者能够接触到目标计算机的情况下,向目标计算机直接植入可执行程序的方法,其植入过程无需用户参与,相对来说更方便。另外,在攻击者无法获知系统登录密码并进入系统的情况下,在目标计算机处于屏保或待机状态时,上述方法也可以实现可执行程序的植入,其基本方式是:结合内存分析技术,通过直接修改内存的方式向目标计算机植入可执行程序。
下面以Mac OS为例介绍该方法,在Windows和Linux系统下的植入原理与Mac OS下的植入原理相同。
在目标计算机处于屏保或待机状态下,无需登录进入目标机系统,并保证目标机正常运行的情况下,向目标计算机物理内存中植入可执行程序的技术原理是:通过向目标机系统内存中写入一段汇编程序,使系统通过调用命令行的方式执行存放在U盘中的可执行程序。
系统调用命令行程序的方法有很多,这里通过调用NSTask类中的“SetLaunchPath"“Launch”等函数来调用命令行。因此,汇编程序正常执行需要知道NSTask类及其相关函数在进程空间中的地址;同时,还需要将进程空间中某些字符串替换为执行命令行所需的参数。可以将内存分析技术和进程可执行样本函数分析技术结合起来完成这两项任务。综上所述,首要进行的工作是如何选择合适的进程空间,以使被植入的代码在其中正常执行。
(1)选择实现植入可执行程序功能代码所在的进程空间
代码所在进程应具备两个基本条件:①曾经通过调用NSTask类执行过命令行或应用程序,以保证汇编程序能在进程空间中找到NSTask类及相关函数的地址;②进程中存在函数,在目标机处于屏保或待机状态下,取证人员可方便地激活该函数,汇编程序即在该函数内执行。选择满足以上两点的程序是实现植入可执行程序的关键点之一。根据第②条要求,当目标机处于屏保待机状态下,可激活的按钮可能会有密码认证按钮、取消、切换用户按钮等,然而,当系统只有一个用户的情况下,切换用户按钮是不存在的,因此,选择执行密码认证功能的函数,作为汇编程序的宿主程序是比较合适的。执行密码认证功能的函数处于loginwindow系统进程中。如何从几十乃至上百进程中找到该进程,是需要解决的问题。找到该进程后,需要对该进程可执行文件进行分析,以判断其中是否存在NSTask类及相关函数。
(2)构建汇编语句并写入内存,通过直接启动U盘中应用程序的方式,实现将U盘中可执行程序植入目标机系统的功能选择合适的进程之后,需要解决的第二个难点是如何编写汇编程序,在不影响目标机系统正常运行的情况下,将其写入进程可执行文件的代码区中,以保证汇编程序的执行。可以使用苹果系统内存获取及内存分析技术,实现汇编程序的编写与植入。
Loginwindow进程的可执行文件内容在物理地址空间中是离散存储的,若要把它的可执行文件转储出来,则需要使用虚拟地址向物理地址转换的技术:首先根据可执行文件首页虚拟地址,转换成首页物理地址,并定位到内存相关位置,读取该页内容;然后对Mach-O格式的苹果系统内存进程可执行头文件分析(头文件在可执行文件首页中),获取文件长度;最后根据文件长度,基于进程可执行文件在虚拟地址空间中是连续存储的这一原理,继续使用虚拟地址转换物理地址技术,获取剩余各页文件物理地址,并按照顺序组合成样本转储文件。
在寻找汇编代码的具体写入位置时,需要注意的是:一方面,汇编程序需要被放入进程代码段中,并被用户激活,其功能才能正常执行;另一方面,由于执行任务的汇编程序代码量达到上百字节,而一般进程空间代码段中能找到2o~3obyte的空白区域都非常难并且这20~30byte还不是连续存储的空间)。
由于无法在进程代码段中找到如此多的连续空白位置可供写入,只能通过分析处于可执行文件代码区的函数反汇编代码,寻找可覆盖汇编代码(覆盖后不影响系统的正常运行)片段,组成可修改代码空间,这就增加了功能实现的难度。而这些片段通过跳转语句进行组合使用,又给汇编程序的编写带来了挑战。
编写汇编程序时,即使NSTask类及相关函数的位置固定,若汇编语句所在位置不同,调用NSTask类及相关函数的汇编语句也不相同,因此,确定NSTask类及相关函数在汇编语句中的调用方式是编写汇编程序关键点之一总体而言,植入过程分为两步:
①选择汇编程序所在进程空间及进程内激活可执行程序功能汇编代码的函数;
②构建汇编语句并写入内存,在不影响目标机系统正常运行的情况下,将其写入进程可执行文件的代码区中,以保证汇编程序的执行使用苹果系统内存获取及内存分析技术,实现汇编程序的编写与植入。具体流程如图1-15所示。
![b99b83c2c36a60a506899f25f85ec629.png](https://i-blog.csdnimg.cn/blog_migrate/94143848d5d96c28a7c8931393e07af9.png)
①使用反汇编分析技术,获取loginwindow进程可执行文件中实现密码认证功能的函数位置。
②使用基于雷口的屏保状态下内存获取和分析技术,从目标机内存中获取loginwindow进程的可执行文件首页虚拟地址、loginwindow进程的页目录基地址(该基地址用于实现步骤③
中的地址转换功能)。
③使用苹果系统内存进程可执行文件转储技术,转储loginwindow进程的可执行文件样本。
④对样本文件格式进行深入分析,获取NSTask类及执行任务所需要的其他相关函数地址:首先从样本头文件中找到类地址存储段及函数地址存储段;然后对相应段内容进行分析,获取NSTask类及执行任务所需要的其他相关函数地址。
⑤将反汇编分析技术和样本文件格式分析技术相结合,获取可修改的字符串地址及长度:
首先使用反汇编分析技术查看loginwindow进程可执行文件中字符串及字符串长度;然后从中筛选出对目标机运行无影响,长度大于所需执行命令长度的字符串;最后使用Mach-O格式文件分析技术,从样本文件中获取字符串存储位置及其长度存储位置。
⑥在进程空间中选择无关系统正常运行的可执行代码空间,并编写汇编语句,调用NSTask类,启动U盘中的可执行程序。
⑦使用内存写入技术,将汇编语句回写入进程空间中,并修改汇编语句中所用到的字符串内容及长度。
根据步骤①中所获取的函数位置,使用反汇编技术分析该函数的执行流程,选择不影响系统正常运行的位置为起始点,开始写入汇编程序。根据步骤⑤中筛选出的字符串存储位置及长度存储位置,将字符串内容修改为需要执行的命令,定位到长度存储位置,将长度修改为需要执行的命令的长度。通过以上步骤实现向目标机植入可执行程序的功能。
1.6本文小结
本文介绍了Windows、Linux和Mac等操作系统下密码认证机制,并在此基础上,分别介绍了3种操作系统下破解系统密码的方式,以及一种通过直接修改内存、向Mac计算机中植入可执行程序的技术。
从内存分析的角度来讲,在Windows操作系统中,破解系统密码一般可采用3种方式实现:第1种是采用替代原密码的方法,此时,可使用已知密码进入系统;第2种是采用绕过密码认证的方式实现任意密码进入系统;第3种是当用户近期输入过密码明文之后,采用直接破解密码明文的方式进入目标机系统。在Linux操作系统中,密码破解可采用从内存中获取登录密码明文的方式,在Mac OS中,可通过访问内存获取登录密码明文或通过内存分析技术绕过密码认证的方式实现密码的破解。
替换Hash值、绕过密码登录认证机制和获取密码明文这3种方式各有优缺点。第1种方式通过替换固定密码对应的Hash值来实现,一旦微软将密码Hash算法修改,或者在算法中将与用户系统相关的数据作为参数之一来计算密码Hash值,该方法便无用武之处。第2种绕过密码认证的方式,直接从可执行代码角度分析并修改认证方式,此方式相对第1种方式较为可靠。第3种获取密码明文的方式,首先要求用户在本次开机过程中曾经输入过登录密码,并且在Windows系统中,需要从内存中获取相关动态链接库中的数据。然而,在分析过程中发现,当密文解密时间距离用户输入密码时间间隔较长时,获取密码明文所需的数据可能被替换到物理内存交换分区(该交换分区是存储在硬盘上的一个文件)中,因此,无法获取该数据的值并进一步获取用户登录密码明文。综上所述,第2种方式相对来讲实用性较强。
通过修改内存的方式向目标计算机系统植入可执行文件的技术原理在Windows、Linux和Mac OS下是类似的,只是不同的系统所选择执行命令行的函数有所不同。即使在未知目标计算机系统登录密码的情况下,该技术也可以方便地操作目标计算机系统,突破了目标计算机的安全限制,被植入的可执行文件具备管理员权限,可以执行任意它想执行的功能,具有很大的实用价值。
然而,直接读写系统物理内存的设备需要目标计算机具有1394、PCI Express以及雷电等接口,但是,近年来生产的计算机几乎都不再配有1394接口和PCI Express接口;在新生产的苹果系列计算机中,雷口也逐渐被USB Type C接口取代。因此,借助硬件接口实现的破解系统密码功能和植入可执行程序的功能都受到相关限制。
参考文献
[1]LIGH M,ADAIR S,HARTSTEIN B,et al.Malware analyst's cookbook and DVD:tools and techniques for fighting malicious code[M].Wiley Publishing,2010.
[2]GOEL C K,ARYA G.Hacking of passwords in Windows environment[J].International Journal of Computer Science&Communication Networks,2012,2(3).
[3]李继伟.计算机取证磁盘镜像研究与虚拟仿真实现[D].重庆:重庆邮电大学,2016.
[4]PAM的应用开发和内部实现源码分析[R].2013.
[5]范萌.一种Linux登录认证安全增强方案的设计与实现[D].北京:北京交通大学,2014.
[6]孙春燕.基于Linux的用户认证与应用授权研究[D].西安:西安电子科技大学,2007.
[7]林淑强.Mac OSX口令认证机制的安全性分析[D].厦门:厦门大学,2014.
[8]陈凯林.基于Windows的Mac动态仿真系统的设计与实现[D].厦门:厦门大学,2014.
[9]SU L J,WU S X,CAO D.Windows-based analysis for HFS+file system[J].Advanced Materials Research,2011,(179/180):538-543.
[10]BENGTSSON J.Parallel password cracker:a feasibility study of using linux clustering technique in computer forensics[C]//The Second International Workshop on Digital Forensics and Incident Analysis(WDFIA).2007:75-82.
[11]蓝朝祥,沈长达,钱镜洁.FileVaulte加密分区离线解密技术及其取证应用[J].信息网络安全,2014(9):211-213.