掌桥专利:专业的专利平台
掌桥专利
首页

用户密码获取方法、装置、设备及存储介质

文献发布时间:2024-04-18 19:58:30


用户密码获取方法、装置、设备及存储介质

技术领域

本公开涉及数据安全技术领域,尤其涉及一种用户密码获取方法、装置、设备及存储介质。

背景技术

Linux操作系统主要应用于云服务器和嵌入式设备,OpenSSH服务是应用十分广泛的SSH服务软件,Linux操作系统通常使用它进行远程管理服务。用户在使用OpenSSH服务时通常需要输入目标Linux操作系统中的用户名和密码验证自己的身份。OpenSSH服务在接收到客户端的请求时,会启动一个子进程(会话进程)处理其请求并与之通信。

相关技术中,SSH后门广泛应用在安全行业合法渗透测试过程中,SSH后门运行的前提是重新编译SSH服务程序,使SSH服务程序带有记录密码的后门代码,并将原程序文件进行替换。该方法在渗透测试过程中通过OpenSSH服务读取密码需要替换原程序文件,从而导致破坏系统完整性,不具备隐蔽性;另外,为了使带后门的SSH程序生效,OpenSSH服务必须重启,影响OpenSSH服务的正常运行。

发明内容

有鉴于此,本公开实施例提供了一种用户密码获取方法、装置、设备及存储介质,能够使渗透测试人员可以随时从OpenSSH服务进程获取用户密码,不需要重启OpenSSH服务进程,从而不影响OpenSSH服务进程的正常运行,并且,不需要替换任何系统文件,保证系统完整性。

第一方面,本公开实施例提供了一种用户密码获取方法,采用如下技术方案:

通过初始程序将Shellcode注入OpenSSH服务进程;

通过执行所述Shellcode将主程序加载进所述OpenSSH服务进程;

运行所述主程序,以所述OpenSSH服务进程的身份对所述OpenSSH服务进程的子进程进行控制并获取用户密码。

在一些实施例中,在通过初始程序将Shellcode注入OpenSSH服务进程之前,所述方法还包括:

读取所述OpenSSH服务进程的内存映射,以计算Glibc库中用于加载第三方ELF文件的函数地址;

利用所述函数地址填充所述shellcode中相应的地址值,并设置相应的调用参数;

利用ptrace系统调用接管所述OpenSSH服务进程,并保存所述OpenSSH服务进程的状态;

将所述shellcode注入所述OpenSSH服务进程,并执行所述shellcode。

在一些实施例中,通过执行所述Shellcode将主程序加载进所述OpenSSH服务进程,包括:

通过执行所述Shellcode将主程序以动态链接库的形式加载进所述OpenSSH服务进程。

在一些实施例中,运行所述主程序,以所述OpenSSH服务进程的身份对所述OpenSSH服务进程的子进程进行控制并获取用户密码,包括:

检测所述子进程的状态信息;

当检测到SSH会话进程时,创建用于监控所述SSH会话进程的单独线程;

执行所述单独线程,以获取所述用户密码。

在一些实施例中,执行所述单独线程,以获取所述用户密码,包括:

通过ptrace系统调用接管所述SSH会话进程,并自动暂停所述SSH会话进程;

搜索所述SSH会话进程的内存空间,以定位所述SSH会话进程中的特征代码段;

当定位到所述特征代码段时,按照预设规则在所述特征代码段中设置一个字节的第一中断代码;

运行所述SSH会话进程,并且所述SSH会话进程在执行到所述第一中断代码时中断操作,通过所述ptrace系统调用继续接管所述SSH会话进程;

读取栈内存空间,并获取所述SSH会话进程的密码验证结果和用户密码。

在一些实施例中,在获取所述SSH会话进程的密码验证结果和用户密码之后,所述方法还包括:

将所述第一中断代码恢复为所述特征代码段的原代码;

将程序指针调回原位,以便所述SSH会话进程执行所述原代码;

按照预设规则在所述特征代码段中继续设置第二中断代码。

在一些实施例中,按照预设规则在所述特征代码段中继续设置第二中断代码之后,所述方法还包括:

在设置完所述第二中断代码后,继续执行所述SSH会话进程;

当所述密码验证结果为密码错误时,发送用户密码验证错误的提示信息;

所述SSH会话进程继续运行,并在执行到所述第二中断代码时中断操作,重新执行用户密码验证操作;

当所述密码验证结果为密码正确时,用户正常登录所述OpenSSH服务进程,并保存正确的用户密码。

第二方面,本公开实施例还提供了一种用户密码获取装置,采用如下技术方案:

注入单元,被配置为通过初始程序将Shellcode注入OpenSSH服务进程;

加载单元,被配置为通过执行所述Shellcode将主程序加载进所述OpenSSH服务进程;

获取单元,被配置为运行所述主程序,以所述OpenSSH服务进程的身份对所述OpenSSH服务进程的子进程进行控制并获取用户密码。

第三方面,本公开实施例还提供了一种电子设备,采用如下技术方案:

所述电子设备包括:

至少一个处理器;以及,

与所述至少一个处理器通信连接的存储器;其中,

所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行以上任一所述的用户密码获取方法。

第四方面,本公开实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储计算机指令,该计算机指令用于使计算机执行以上任一所述的用户密码获取方法。

本公开实施例提供的一种用户密码获取方法,能够使渗透测试人员可以随时从OpenSSH服务进程获取用户密码,不需要重启OpenSSH服务进程,从而不影响OpenSSH服务进程的正常运行,并且,不需要替换任何系统文件,保证系统完整性。

上述说明仅是本公开技术方案的概述,为了能更清楚了解本公开的技术手段,而可依照说明书的内容予以实施,并且为让本公开的上述和其他目的、特征和优点能够更明显易懂,以下特举较佳实施例,并配合附图,详细说明如下。

附图说明

为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。

图1为本公开实施例提供的一种用户密码获取方法的流程示意图;

图2为本公开实施例提供的一种用户密码获取装置的结构示意图;

图3为本公开实施例提供的一种电子设备的结构示意图。

具体实施方式

下面结合附图对本公开实施例进行详细描述。

应当明确,以下通过特定的具体实例说明本公开的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本公开的其他优点与功效。显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。本公开还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本公开的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。

需要说明的是,下文描述在所附权利要求书的范围内的实施例的各种方面。应显而易见,本文中所描述的方面可体现于广泛多种形式中,且本文中所描述的任何特定结构及/或功能仅为说明性的。基于本公开,所属领域的技术人员应了解,本文中所描述的一个方面可与任何其它方面独立地实施,且可以各种方式组合这些方面中的两者或两者以上。举例来说,可使用本文中所阐述的任何数目各方面来实施设备及/或实践方法。另外,可使用除了本文中所阐述的方面中的一或多者之外的其它结构及/或功能性实施此设备及/或实践此方法。

还需要说明的是,以下实施例中所提供的图示仅以示意方式说明本公开的基本构想,图式中仅显示与本公开中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。

另外,在以下描述中,提供具体细节是为了便于透彻理解实例。然而,所属领域的技术人员将理解,可在没有这些特定细节的情况下实践所述方面。

图1为本公开实施例提供的一种用户密码获取方法的流程示意图,本公开实施例提供的一种用户密码获取方法,包括以下步骤:

S101、通过初始程序将Shellcode注入OpenSSH服务进程。

可选地,OpenSSH服务进程是应用较为广泛的SSH服务软件,Linux操作系统通常使用OpenSSH服务进程进行远程管理服务,用户使用OpenSSH服务进程通常需要输入目标Linux系统中的用户名和密码验证用户身份。OpenSSH服务进程在接到客户端请求时,会启动一个子进程处理客户端请求并与之通信,该子进程为SSH会话进程。

可选地,Shellcode是指一段可以实现特定功能的汇编指令代码,用于直接替换当前进程的执行流程。

S102、通过执行Shellcode将主程序加载进OpenSSH服务进程。

S103、运行主程序,以OpenSSH服务进程的身份对OpenSSH服务进程的子进程进行控制并获取用户密码。

本公开实施例提供的一种用户密码获取方法,能够解决渗透测试过程中从OpenSSH服务进程获取用户密码需要重启现有OpenSSH服务进程的问题,以及可以解决渗透测试过程中通过OpenSSH服务进程读取密码需要修改系统文件从而破坏系统完整性的问题。从而能够使渗透测试人员可以随时从OpenSSH服务进程获取用户密码,不需要重启OpenSSH服务进程,从而不影响OpenSSH服务进程的正常运行,并且,不需要替换任何系统文件,保证系统完整性。

在一些实施例中,在通过初始程序将Shellcode注入OpenSSH服务进程之前,该方法还包括:

读取OpenSSH服务进程的内存映射,以计算Glibc库中用于加载第三方ELF文件的函数地址;

利用函数地址填充shellcode中相应的地址值,并设置相应的调用参数;

利用ptrace系统调用接管OpenSSH服务进程,并保存OpenSSH服务进程的状态;

将shellcode注入OpenSSH服务进程,并执行shellcode。

可选地,Ptrace系统调用是一个Linux系统调用,用于接管并控制一个目标进程,对其进行调试,本公开实施例利用Ptrace系统调用对OpenSSH服务进程进行控制并读取其存储的明文密码。

可选地,Glibc库是Linux系统最常见的C运行库。

可选地,计算Glibc库中用于加载第三方ELF文件的函数地址,其中,该函数可以为Glibc库的内部函数__libc_dlopen_mode,__libc_dlopen_mode函数的功能是加载并初始化一个ELF shared object文件,该文件可在加载时被执行。

在一些实施例中,通过执行Shellcode将主程序加载进OpenSSH服务进程,包括:

通过执行Shellcode将主程序以动态链接库的形式加载进OpenSSH服务进程。

本公开实施例以动态链接库的形式将主程序加载进OpenSSH服务进程,在进程列表里是不可见的,可以伪装为合法的动态链接库,从而最大化隐蔽性。

在一些实施例中,运行主程序,以OpenSSH服务进程的身份对OpenSSH服务进程的子进程进行控制并获取用户密码,包括:

检测子进程的状态信息;

当检测到SSH会话进程时,创建用于监控SSH会话进程的单独线程;

执行单独线程,以获取用户密码。

本公开实施例通过监控当前进程也就是OpenSSH服务进程的子进程变化来确定是否出现SSH会话进程,如果出现子进程也就是SSH会话进程,则执行一个单独的线程用于监控该SSH会话进程并获取用户密码。

在一些实施例中,执行单独线程,以获取用户密码,包括:

通过ptrace系统调用接管SSH会话进程,并自动暂停SSH会话进程;

搜索SSH会话进程的内存空间,以定位SSH会话进程中的特征代码段;

当定位到特征代码段时,按照预设规则在特征代码段中设置一个字节的第一中断代码;例如,在特征代码段的开头替换一个字节的0xCC代码,0xCC代码即为中断指令;

运行SSH会话进程,并且SSH会话进程在执行到第一中断代码时中断操作,通过ptrace系统调用继续接管SSH会话进程;

此时,OpenSSH服务进程的状态是刚完成密码验证,因此可以通过读取栈内存空间,并获取SSH会话进程的密码验证结果和用户密码。

可选地,OpenSSH服务进程运行时,无法获知OpenSSH服务进程用于密码验证部分的代码位置,因此需要定位到该段代码,因此通过设置中断代码以便在此读取用户密码。本公开实施例通过在特征代码段中设置中断代码以便在中断代码的位置读取用户密码。

在一些实施例中,在获取SSH会话进程的密码验证结果和用户密码之后,方法还包括:

将第一中断代码恢复为特征代码段的原代码;

将程序指针调回原位,以便SSH会话进程执行原代码;

按照预设规则在特征代码段中继续设置第二中断代码。

在一些实施例中,按照预设规则在特征代码段中继续设置第二中断代码之后,方法还包括:

在设置完第二中断代码后,继续执行SSH会话进程;

当密码验证结果为密码错误时,发送用户密码验证错误的提示信息;

SSH会话进程继续运行,并在执行到第二中断代码时中断操作,重新执行用户密码验证操作;

当密码验证结果为密码正确时,用户正常登录OpenSSH服务进程,并保存正确的用户密码。

本公开实施例可以验证密码的正确性,避免无效记录。

例如,当渗透测试人员试图在一台Linux主机上获取Linux系统的用户密码,渗透测试人员使用本公开实施例提供的初始程序将Shellcode注入OpenSSH服务进程,然后,Shellcode将本公开实施例的主程序加载进OpenSSH服务进程,并运行主程序。此时,Linux主机的用户尝试登录Linux系统的OpenSSH服务进程。渗透测试人员输入自己的用户名和密码,此时提交的是一个错误密码。本公开实施例的主程序截获了该错误密码,然后通过检验内存中相应的密码验证结果,发现此密码为无效密码,放弃记录该密码,并向客户端发送用户密码验证错误的提示信息。并恢复OpenSSH服务进程的子进程(即SSH会话进程),重新等待渗透测试人员提交密码。渗透测试人员接收到密码错误的提示信息,于是重新提交了正确的密码,本公开实施例通过主程序再次截获密码,并检验发现密码有效,进行记录该正确的用户并恢复SSH会话进程。用户正常登录OpenSSH服务进程,本公开实施例至此可将主程序卸载。

本公开实施例采用shared object注入技术,使用Shellcode将本公开实施例的主程序注入OpenSSH服务进程而不产生其他进程和文件行为。注入后主程序即可以OpenSSH服务进程的身份对其子进程(SSH会话进程)进行控制并读取用户密码。本公开实施例使用内存搜索和特征代码段技术,对OpenSSH服务进程中的代码进行定位,从而定位到负责密码验证部分的一段唯一的代码块,并在此进行密码读取操作;另外,本公开实施例在进行密码读取的同时,可以读取OpenSSH服务进程的密码校验的结果,并依此对密码有效性进行判断,避免无效记录。

图2为本公开实施例提供的一种用户密码获取装置的结构示意图,本公开实施例提供的一种用户密码获取装置,包括:

注入单元21,被配置为通过初始程序将Shellcode注入OpenSSH服务进程;

加载单元22,被配置为通过执行Shellcode将主程序加载进OpenSSH服务进程;

获取单元23,被配置为运行主程序,以OpenSSH服务进程的身份对OpenSSH服务进程的子进程进行控制并获取用户密码。

根据本公开实施例的电子设备包括存储器和处理器。该存储器用于存储非暂时性计算机可读指令。具体地,存储器可以包括一个或多个计算机程序产品,该计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。该易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。该非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。

该处理器可以是中央处理单元(CPU)或者具有数据处理能力和/或指令执行能力的其它形式的处理单元,并且可以控制电子设备中的其它组件以执行期望的功能。在本公开的一个实施例中,该处理器用于运行该存储器中存储的该计算机可读指令,使得该电子设备执行前述的本公开各实施例的一种用户密码获取方法全部或部分步骤。

本领域技术人员应能理解,为了解决如何获得良好用户体验效果的技术问题,本实施例中也可以包括诸如通信总线、接口等公知的结构,这些公知的结构也应包含在本公开的保护范围之内。

图3为本公开实施例提供的一种电子设备的结构示意图。其示出了适于用来实现本公开实施例中的电子设备的结构示意图。图3示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。

如图3所示,电子设备可以包括处理器(例如中央处理器、图形处理器等),其可以根据存储在只读存储器(ROM)中的程序或者从存储装置加载到随机访问存储器(RAM)中的程序而执行各种适当的动作和处理。在RAM中,还存储有电子设备操作所需的各种程序和数据。处理器、ROM以及RAM通过总线彼此相连。输入/输出(I/O)接口也连接至总线。

通常,以下装置可以连接至I/O接口:包括例如传感器或者视觉信息采集设备等的输入装置;包括例如显示屏等的输出装置;包括例如磁带、硬盘等的存储装置;以及通信装置。通信装置可以允许电子设备与其他设备(比如边缘计算设备)进行无线或有线通信以交换数据。虽然图3示出了具有各种装置的电子设备,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。

特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在非暂态计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置从网络上被下载和安装,或者从存储装置被安装,或者从ROM被安装。在该计算机程序被处理器执行时,执行本公开实施例的一种用户密码获取方法的全部或部分步骤。

有关本实施例的详细说明可以参考前述各实施例中的相应说明,在此不再赘述。

根据本公开实施例的计算机可读存储介质,其上存储有非暂时性计算机可读指令。当该非暂时性计算机可读指令由处理器运行时,执行前述的本公开各实施例的一种用户密码获取方法的全部或部分步骤。

上述计算机可读存储介质包括但不限于:光存储介质(例如:CD-ROM和DVD)、磁光存储介质(例如:MO)、磁存储介质(例如:磁带或移动硬盘)、具有内置的可重写非易失性存储器的媒体(例如:存储卡)和具有内置ROM的媒体(例如:ROM盒)。

有关本实施例的详细说明可以参考前述各实施例中的相应说明,在此不再赘述。

以上结合具体实施例描述了本公开的基本原理,但是,需要指出的是,在本公开中提及的优点、优势、效果等仅是示例而非限制,不能认为这些优点、优势、效果等是本公开的各个实施例必须具备的。另外,上述公开的具体细节仅是为了示例的作用和便于理解的作用,而非限制,上述细节并不限制本公开为必须采用上述具体的细节来实现。

在本公开中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序,本公开中涉及的器件、装置、设备、系统的方框图仅作为例示性的例子并且不意图要求或暗示必须按照方框图示出的方式进行连接、布置、配置。如本领域技术人员将认识到的,可以按任意方式连接、布置、配置这些器件、装置、设备、系统。诸如“包括”、“包含”、“具有”等等的词语是开放性词汇,指“包括但不限于”,且可与其互换使用。这里所使用的词汇“或”和“和”指词汇“和/或”,且可与其互换使用,除非上下文明确指示不是如此。这里所使用的词汇“诸如”指词组“诸如但不限于”,且可与其互换使用。

另外,如在此使用的,在以“至少一个”开始的项的列举中使用的“或”指示分离的列举,以便例如“A、B或C的至少一个”的列举意味着A或B或C,或AB或AC或BC,或ABC(即A和B和C)。此外,措辞“示例的”不意味着描述的例子是优选的或者比其他例子更好。

还需要指出的是,在本公开的系统和方法中,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本公开的等效方案。

可以不脱离由所附权利要求定义的教导的技术而进行对在此所述的技术的各种改变、替换和更改。此外,本公开的权利要求的范围不限于以上所述的处理、机器、制造、事件的组成、手段、方法和动作的具体方面。可以利用与在此所述的相应方面进行基本相同的功能或者实现基本相同的结果的当前存在的或者稍后要开发的处理、机器、制造、事件的组成、手段、方法或动作。因而,所附权利要求包括在其范围内的这样的处理、机器、制造、事件的组成、手段、方法或动作。

提供所公开的方面的以上描述以使本领域的任何技术人员能够做出或者使用本公开。对这些方面的各种修改对于本领域技术人员而言是非常显而易见的,并且在此定义的一般原理可以应用于其他方面而不脱离本公开的范围。因此,本公开不意图被限制到在此示出的方面,而是按照与在此公开的原理和新颖的特征一致的最宽范围。

为了例示和描述的目的已经给出了以上描述。此外,此描述不意图将本公开的实施例限制到在此公开的形式。尽管以上已经讨论了多个示例方面和实施例,但是本领域技术人员将认识到其某些变型、修改、改变、添加和子组合。

相关技术
  • 一种获取用户画像的方法、装置、电子设备及存储介质
  • IoT设备的权限获取方法、装置、存储介质及电子装置
  • 确定数字专辑的用户获取数量的方法、装置及存储介质
  • 获取用户轨迹的方法、装置、系统和存储介质
  • 用户贡献值的获取方法、装置及存储介质
  • 用户密码加密存储方法、装置、设备及存储介质
  • 密码信息的获取方法、装置、计算机设备及存储介质
技术分类

06120116497246