■第1章 提权概述
■第2章 环境与工具的准备
■第3章 文件操作
渗透测试是一项技术含量非常高的工作,需要掌握广泛的知识和技能。在学习渗透测试相关技术的初始阶段,很多读者容易陷入“抄袭式”学习的误区,只是跟着教程上的步骤一步一步地操作,缺乏对操作原理和基础知识的理解。这种学习方式往往会让人感到浮躁,而且难以举一反三,因为当目标程序或系统稍有改动时,就需要再次对之前学过的知识进行深入理解,才能做到灵活应对。因此,在学习渗透测试的过程中,理解基础知识和操作原理是非常必要的,只有掌握了基础知识和操作原理,才能更好地理解实际应用场景中遇到的问题,从而更好地解决问题。
本章将介绍权限和权限提升的基本概念及目的,以及Windows和Linux两种操作系统下与权限管理相关的知识点,包括:
❑什么是权限和权限提升,为什么需要进行权限提升;
❑Windows中的用户、用户组、访问控制列表、访问令牌、权限分配等;
❑Linux中的用户、用户组、用户相关配置文件、文件及权限等。
通过对本章的学习,读者将掌握权限和权限提升相关的基础知识,为后续章节的学习和实践奠定基础。
从计算机的角度来说, 权限是指系统或程序中的不同用户对文件夹、文件、服务和注册表等系统资源、对象和任务的访问与控制能力 。通俗一点来讲,一个程序或系统可以供多个用户使用,权限就是不同用户被允许做的事情。
在一个计算机系统中,可以分配给用户的权限包括但不限于访问文件夹和文件、修改文件、安装软件、运行程序、访问网络资源和管理系统服务等。权限管理的目的是确保系统安全、稳定地运行。限制用户对系统资源和对象的访问权限,能够避免出现用户误操作或恶意操作而导致系统崩溃或数据丢失的情况。同时,权限管理也可以避免未经授权的用户访问系统资源和对象,从而确保系统的安全。因此,权限是保护计算机系统安全的一项重要机制。
图1-1所示是权限的概念图。其中,超级管理员具有对系统的完全控制权限,包括Web服务和数据库服务,而员工A只有对Web服务的完全控制权,员工B只有对数据库服务的完全控制权。
图1-1 权限的概念图
什么是权限提升?
权限提升(Privilege Escalation)技术,渗透测试人员常称之为“提权”, 是指在计算机系统中,通过一些技术手段使一个用户账户或进程获得了超出其本来预期或授权范围的非法访问权限的一种攻击方式 。
权限提升攻击技术是渗透测试攻击链条中的重要一环,渗透测试人员在获取初始立足点(通常是普通用户权限,如WebShell、反弹的CmdShell或BashShell等)后,通过操作系统漏洞利用、错误的配置、不安全的服务权限等特定的技术手段,取得特定用户或超级管理员、程序、系统甚至整个网络的完全控制权。
根据渗透测试人员的目标,权限提升可以分为“水平权限提升”和“垂直权限提升”。
❑水平权限提升:是指获取到系统或程序的其他相同级别的用户账户的过程,可以掌控其他用户的功能、数据;或以当前立足点为跳板,攻陷内网其他机器的过程。该操作也被称为“横向移动”。
❑垂直权限提升:是指普通用户获取到系统或程序的最高权限的过程,可以接管系统的全部功能和数据,达到完全控制系统的目的。
图1-2所示为水平权限提升和垂直权限提升的概念图。渗透测试人员通过SQL注入、上传木马、命令执行等方法获得立足点,进而获取到数据库服务权限的过程,即为水平权限提升。渗透测试人员通过系统漏洞利用、系统配置错误等方法获取到超级管理员权限的过程,即为垂直权限提升。
图1-2 水平权限提升和垂直权限提升的概念图
为什么要提升权限?
在过去,提升权限主要是为了展示技术和证明能力。那时我们认为,在一项日常的渗透测试任务中,获取到最高权限才能算得上完美。然而,随着渗透测试技术的不断发展和网络安全形势的日益复杂,获取最高权限已经不再是终点。在某些情况下,获取最高权限可能只是任务的开始,因为渗透测试人员还需要维持权限并在网络中隐藏自己,以便在后续的任务中进一步扩大战果,获得更多资产和信息。获得最高权限可以使渗透测试人员更加游刃有余地进行后续工作,不受到干扰。
1.1.3节提过,提权是将低权限用户的访问控制权限提升到高权限用户的访问控制权限的过程,从而能访问受限资源。高权限用户包括但不限于系统超级管理员级别的账户、本地管理员账户、具有类似管理员权限的账户,以及可以访问特定资源和特定系统、执行特定功能的账户等。
取得更高级别账户的控制权后,可以对目标进行增、删、改、查(修改信息和系统配置,获取敏感数据,破坏系统信息,影响系统的正常运行等)等,这也为后渗透阶段中的权限维持、横向移动提供了更多的便利性和隐蔽性。因此,无论是渗透测试人员还是IT运维人员,都需要熟悉权限提升攻击技术中的常见漏洞和攻击方式,以便能够检测和防范此类攻击。
权限提升技术是一种渗透测试人员和红队成员必须要掌握的技能。
本节将简单介绍Windows系统中的用户和用户组、访问控制列表、安全标识符、身份验证、访问令牌、权限分配、Windows哈希、用户账户控制、Windows服务等与权限提升技术相关的基础知识。
在计算机系统中,每个用户或用户组都会被分配一定的权限。这些权限通常由系统管理员控制和管理。普通用户通常只有受限的访问权限,不能对系统、数据库、敏感文件或其他特定资源进行操作。然而,由于某些错误或不安全的配置,普通用户可能会获得过多的访问控制权限,这就为攻击者提供了机会。例如,某些应用程序可能会以超级用户的权限运行,这意味着普通用户可以利用应用程序漏洞获取超级用户权限,从而访问和操作敏感资源。因此,了解用户或用户组及其权限对于预防和检测权限提升攻击非常重要。
1.本地用户账户
本地用户账户是安全主体,用于标识可以使用此计算机的用户,可以保证计算机安全,也用于控制用户和服务对服务器资源的访问。Windows操作系统有内置的用户账户,也可以创建额外的用户账户以满足不同的需求。
安全主体是Windows系统中重要的安全机制,用于标识用户和程序。安全主体可以是用户账户、计算机账户或进程、线程。
可以执行cmd命令“net user”来查看本地用户账户,也可以执行PowerShell cmdlet命令“Get-LocalUser”,或在桌面模式下打开本地用户和组管理控制台(lusrmgr.msc)来查看本地用户账户,如图1-3~图1-5所示。
图1-3 执行cmd命令查看本地用户账户
图1-4 执行PowerShell cmdlet命令查看本地用户账户
图1-5 打开本地用户和组管理控制台来查看本地用户账户
Windows系统中常见的账户有如下几种。
❑管理员账户:默认名称为Administrator,是管理计算机(域)的内置账户,是每台计算机在安装过程中创建的第一个账户。管理员账户可控制本地计算机上的文件、目录、服务和其他资源,可以创建其他本地用户、分配用户权限,可通过更改用户权限来控制本地资源,但对一些系统服务、程序、进程的访问受限。在高版本Windows系统中,Administrator默认是禁用状态。管理员账户无法删除或锁定,但可以禁用或改名。
❑来宾账户:默认名称为Guest,是供来宾临时访问计算机或域的内置账户。此账户的默认密码为空,存在安全风险,所以在系统安装后默认是禁用状态。
❑默认账户:默认账户名称为DefaultAccount,是一个与用户无关的账户,可用于运行与用户无关的进程。默认是禁用状态。
❑Windows Defender账户:默认名称为WDAGUtilityAccount,是在Windows 10及以上系统中与Windows Defender应用程序防护功能相关的内置账户,默认是禁用状态。
以管理员身份打开命令行,执行以下命令来添加一个用户,如图1-6所示。
执行以下命令来删除一个用户,如图1-7所示。
图1-6 添加一个用户
图1-7 删除一个用户
或在本地用户和组管理控制台中右键单击空白处,选择“新用户”命令,可以添加一个用户,并可配置该用户的一些属性,如图1-8所示。
图1-8 在控制台添加用户并配置属性
双击一个用户,可以修改该用户的配置文件、主文件夹和隶属组,如图1-9所示。
2.本地用户组
本地用户组是用户账户、计算机账户和其他账户组的集合。在Windows操作系统中,默认内置了一些用户组,并对这些用户组预配置了用于执行特定任务的适当权限。
执行cmd命令“net localgroup”,或执行PowerShell cmdlet命令“Get-LocalGroup”,或在本地用户和组管理控制台中可以查看本地用户组,如图1-10~图1-12所示。每个用户组有自己的权限,一个用户可以位于多个用户组中。
图1-9 修改用户配置
图1-10 执行cmd命令查看本地用户组
图1-11 执行PowerShell命令查看本地用户组
图1-12 在本地用户和组管理控制台中查看本地用户组
在渗透测试中常用的组如下。
❑管理员组(Administrators):Administrators具有广泛的系统权限,可以执行许多敏感的操作,包括安装和卸载应用程序、更改系统设置、访问和修改系统文件、管理系统服务等。
❑高权限用户组(Power Users):Power Users是Windows系统中的一个特殊的本地用户组,组成员可以在计算机上执行某些系统管理任务,但不具备完全的管理员权限,无法更改系统级别的设置、管理服务或访问敏感的系统文件和文件夹。与Administrators的权限相比,要受到更多的限制。
❑普通用户组(Users):Users是Windows系统中的一个默认本地用户组,用于管理本地计算机上的标准用户账户。组成员可以在本地计算机上执行基本任务和操作。
❑来宾用户组(Guests):Guests是Windows系统中的一个默认本地用户组。组成员在计算机上只具有非常有限的权限,无法进行系统设置更改、软件安装等系统管理任务。
❑信任程序模块(TrustedInstaller):TrustedInstaller是从Windows Vista开始出现的一个内置安全主体,本体是“Windows Modules Installer”服务,在Windows系统中拥有安装、修改和删除Windows系统组件,修改受保护的系统文件和文件夹的权限,以一个用户组的形式出现。
❑经过身份验证的用户组(Authenticated Users):Authenticated Users是Windows系统中的一个默认本地用户组,包括所有已通过身份验证的用户和计算机账户。Authenticated Users组可以防止匿名访问。
3.系统内置账户
Local System(本地系统)账户是Windows系统中的一个内置账户,在Windows XP及以下版本的计算机中拥有最高权限,真正具有对计算机的完全控制权限,能够随意操纵文件系统和注册表、配置计划任务、操作Windows Installer安装包、管理Windows系统更新等,通常是渗透测试人员的目标权限。但TrustedInstaller问世之后,微软分割了SYSTEM的权限,只有TrustedInstaller权限才可以完全控制系统文件,如图1-13和图1-14所示。
图1-13 SYSTEM的权限
图1-14 TrustedInstaller的权限
Local Service(本地服务)账户是Windows系统中的一个内置账户,在Windows中主要用于运行本地服务,如日志服务、事件服务等。Local Service账户在本地计算机上拥有最低权限,在网络中是匿名的身份,仅能访问本地计算机上的资源。
Network Service(网络服务)账户是Windows系统中的一个内置账户,在Windows中主要作为网络服务的运行账户,如Web服务和FTP服务等。Network Service账户具有较少的权限,仅能访问本地网络上的资源,无法访问其他计算机上的资源,也无法执行系统级别的操作。
4.常用命令
表1-1列出了提权中常用的操作用户和用户组的命令。
表1-1 常用的操作用户和用户组的命令
表1-2列出了关于访问控制列表的一些词汇及对应含义。
表1-2 关于访问控制列表的一些词汇及对应含义
访问控制列表(ACL)是由ACE(访问控制条目)组成的列表,ACL中的每个ACE都标识一个受托人并指定该受托人允许、拒绝或审计的访问权限,如图1-15所示。当进程尝试访问安全对象时,系统会检查对象的DACL中的ACE来确定是否对该进程授予访问权限。如果安全对象没有配置DACL,那么系统将授予所有人完全访问权限;如果安全对象配置了DACL,但DACL里面没有配置任何ACE,那么系统将拒绝所有访问该对象的尝试。系统会依次检查所有的ACE,直到找到至少一个ACE来允许所有请求的访问权限,或者所有请求的访问权限都被拒绝,如图1-16所示。
图1-15 访问控制列表(ACL)
图1-16 访问控制列表(ACL)应用
在图1-16中,ACE1适用于线程A的访问令牌中的用户User1,所以系统不再继续检查ACE,直接给出拒绝访问。线程B不匹配ACE1,系统继续检查ACE2和ACE3,给出允许写入、读取和执行的权限。
安全标识符(SID)是用于标识安全主体的唯一符号,每个用户、每个用户组、每个进程都有唯一的SID。每当用户登录系统或打开进程时,系统都会从本地安全数据库中检索出该用户的SID,并将其放在该用户的访问令牌中。所以,虽然用户使用账号和密码登录系统,但是操作系统是使用访问令牌中的SID在与Windows安全性的所有后续交互中识别用户的。安全标识符在域或者本地始终保持唯一,永远不会重复使用。
1.查看当前用户的SID
执行以下命令来查看当前用户的SID,如图1-17所示。
图1-17 查看当前用户的SID
2.查看所有用户的SID
执行以下命令来查看此计算机中所有用户的SID,如图1-18所示。
图1-18 查看所有用户的SID
例如,“S-1-5-21-1884633534-2219064468-1013623519-500”标识符的含义如下。
❑S:表示此段字符串为Windows安全标识符(SID);
❑1:代表结构修订级别号,总是为1;
❑5:代表标识符颁发机构,这里为NT颁发机构;
❑21-1884633534-2219064468-1013623519:由域标识符组成;
❑500:为相对标识符(RID),用来区分不同权限的用户,500代表本地管理员。
有些SID是不变的,在安装操作系统或域时自动创建并分配。常见的SID如下。
❑Everyone:S-1-1-0;
❑BUILTIN\Administrators:S-1-5-32-544,内置管理员组;
❑BUILTIN\Users:S-1-5-32-545,内置用户组;
❑NTAUTHORITY\INTERACTIVE:S-1-5-4,以交互方式登录的所有用户的组;
❑NTAUTHORITY\AuthenticatedUsers:S-1-5-11,经过身份验证的用户;
❑LocalService:S-1-5-19;
❑NetworkService:S-1-5-20;
❑LocalSystem:S-1-5-18。
关于SID的更多信息请查看Microsoft Learn(网址为https://learn.microsoft.com/)。
身份验证是验证对象或人员身份的过程。当用户试图登录Windows系统时,winlogon.exe进程会显示登录界面,等待接收用户输入的账号和密码;接收到密码后,它会提交给lsass.exe进程,该进程对明文密码进行HASH处理,然后与SAM文件中存储的HASH值进行比对,如图1-19所示。如果匹配成功,则认证成功,并授予相应的访问权限。这个过程被称为身份验证。
图1-19 身份验证概念图
❑lsass.exe是本地安全认证服务器进程,用于本地安全和登录策略;
❑SAM(Security Account Manager,安全账户管理)文件是一个Windows操作系统中管理用户账户和身份验证的数据库文件。
SAM文件存储在系统目录下的“/system32/config/”文件夹中,通常处于锁定状态,不能直接访问、复制或移动,只有系统管理员及具有更高权限的用户才能访问该文件,如图1-20所示。在注册表“HKEY_LOCAL_MACHINE”的根键下,存在一个名为SAM的子键,它也用于存储本地用户账户信息。
访问令牌是描述进程或线程的安全上下文的对象。
当一个用户成功完成身份验证并登录系统后,会创建一个成功的登录会话(Session),Windows返回该用户的SID和所属用户组的SID,LSA(Local Security Authority)会生成该用户的访问令牌。访问令牌是由用户SID、用户组SID、本地安全策略分配给用户和用户组的特权列表、当前登录会话的登录SID、所有者SID、主要安全组的SID、DACL(自主访问控制列表)、访问令牌来源、令牌类型(主令牌或模拟令牌)、限制SID、模拟级别、其他统计信息等组成的。
图1-20 SAM文件的位置
访问令牌附加到用户会话的初始进程userinit.exe,该进程存储在注册表HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon下的Userinit键值中。userinit.exe负责执行该用户环境中的一些初始化工作,如执行登录脚本、建立网络连接、运行用户的自启动程序等。接着,它会在注册表中查找Shell键值(默认为explorer.exe),并创建进程来运行explorer.exe,也就是文件资源管理器——Windows的图形化界面。接下来用户的所有操作创建的子进程和线程都在父进程(explorer.exe)的令牌副本下运行,除非某个进程在创建时自己指定了令牌。因此,在最初的会话中,大部分进程都是在相同的令牌下运行的。
访问令牌分为主令牌(Primary Token)和模拟令牌(Impersonation Token)。
主令牌是Windows操作系统中与进程关联的访问令牌,也被称为授权令牌(Delegation Token)、进程令牌。每个进程都有一个主令牌,用于描述与该进程关联的安全上下文,包括进程的用户账户、权限集和令牌类型等。主令牌通常由本地安全认证服务器(LSA)创建并分配给进程。
模拟令牌是由一个有足够权限的进程生成的访问令牌,可以在进程不影响其真实身份的情况下模拟另一个用户或进程的身份来执行特定操作。模拟令牌包含了模拟的用户或进程的身份信息和权限。
令牌是有模拟级别的,分别是SecurityAnonymous(匿名)、SecurityIdentification(标识)、SecurityImpersonation(模拟)、SecurityDelegation(委托)。
❑SecurityAnonymous:服务器无法模拟或标识客户端;
❑SecurityIdentification:服务器可以获取客户端的标识和特权,但无法模拟客户端;
❑SecurityImpersonation:服务器可以模拟本地系统上客户端的安全上下文;
❑SecurityDelegation:服务器可以在远程系统上模拟客户端的安全上下文。
只有当令牌级别为SecurityImpersonation或SecurityDelegation时,才可以用于模拟。
执行命令“whoami/priv”来获取当前用户或进程的令牌权限,图1-21所示为受限的令牌权限,图1-22所示为管理员会话的令牌权限。
图1-21 受限的令牌权限
图1-22 管理员会话的令牌权限
用户权限是指用户能够在本地计算机或域中执行的某些操作,包括登录权限和其他权限。登录权限是哪些用户被允许登录,以什么样的方式登录。其他权限是用户允许访问本地计算机或域中的哪些资源。每个用户权限都有一个常量名称和一个与之关联的组策略名称。可以使用本地组策略编辑器(gpedit.msc)来分配权限,位置是本地计算机策略→计算机配置→Windows设置→安全设置→本地策略→用户权限分配,如图1-23所示。
图1-23 本地组策略编辑器
在自写程序中可以使用Windows API(AdjustTokenPrivileges)来操作权限的启用或禁用。
在PowerShell下可以使用PoshPrivilege模块进行权限的增加、删除、启用、禁用,安装PoshPrivilege模块如图1-24所示。
图1-24 安装PoshPrivilege模块
执行以下命令启用某些权限,如图1-25所示。
表1-3列出了PoshPrivilege操作权限的常用命令。
表1-3 PoshPrivilege操作权限的常用命令
图1-25 启用权限
也可以使用调试工具WinDbg基于内核模式的扩展PrivEditor,加载扩展如图1-26所示。使用此扩展查看令牌权限,如图1-27所示。移除权限,如图1-28所示。
图1-26 加载扩展
图1-27 查看进程的令牌权限
图1-28 移除某个权限
下面列举了一些常用的命令。
❑!addpriv<进程PID><令牌权限>:添加权限;
❑!enablepriv<进程PID><令牌权限>:启用权限;
❑!disablepriv<进程PID><令牌权限>:禁用权限;
❑!enableall<进程PID>:启用全部权限;
❑!disableall<进程PID>:禁用全部权限。
什么是哈希(HASH)?
把任意长度的输入字符根据特定的算法转换成固定长度字符输出,该过程的结果就是哈希值,也被称为散列值。该流程是单向运算的,具有不可逆性和抗碰撞性,无法从哈希值恢复成原本的输入。
1.LM HASH
LM(LAN Manager)HASH是一种用于创建哈希密码的技术,属于Windows旧版本的较弱的技术,现在已经被淘汰(自Windows Vista和Windows Server 2008问世之后,LM HASH被禁用)。LM HASH加密密码不区分大小写(全部字符转换为大写),密码长度最多为14个字符,加密过程是将明文密码转换为十六进制,然后平均分成两组分别加密,如果密码长度不足7个字符,则用“0”填充,再使用字符串“KGS!@#$%”进行DES加密。这一系列的操作使得LM HASH十分不安全,容易被破解。
2.NTLM HASH
NTLM(NT LAN Manager)HASH是如今Windows操作系统使用的较安全的密码哈希方法。加密的过程是将明文密码转换为十六进制,经过Unicode转换后,再进行MD4加密,如图1-29所示。
用户账户控制(User Account Control,UAC)是自Windows Vista开始加入的安全控制机制,它用于通知用户是否允许应用程序对系统文件或磁盘进行操作。
UAC可以有效地阻止未经授权的应用程序的自动安装和运行,防止对操作系统进行未经授权的更改,以及对用户有意或无意地删除/修改系统文件、修改系统设置等操作进行提醒。当系统配置了UAC时,除非管理员授权,否则应用程序和任务始终在非管理员账户的安全上下文中运行,如图1-30所示。
图1-29 NTLM HASH流程
图1-30 用户账户控制提醒
UAC有4种设置,如图1-31所示。
❑始终通知:最高级别的UAC设置。每当有程序需要使用高级别的权限时都会提示。
❑仅当应用尝试更改我的计算机时通知我(默认):UAC的默认设置。当内置Windows程序需要使用高级别的权限时不会提示用户,而第三方程序要使用高级别的权限时会提示。
❑仅当应用尝试更改我的计算机时通知我(不降低桌面的亮度):与上一条设置相同,但在提示用户时不降低桌面的亮度。
❑从不通知:在尝试安装软件、修改Windows设置时不会提示用户。
图1-31 用户账户控制设置
在“本地安全策略”窗口中也可以配置UAC,如图1-32所示。
图1-32 在“本地安全策略”窗口中配置UAC
在Windows Vista及更高版本中,进程以不同级别的完整性运行,如下:
❑Installer:安装程序;
❑System:核心服务;
❑High:管理员权限;
❑Medium:标准用户权限;
❑Low:被限制的权限,无法写入注册表和部分配置文件;
❑Untrusted:匿名登录的进程。
大多数应用程序都是在中级别完整性进程中运行的,包括本地管理员会话,如图1-33所示。
图1-33 多数应用程序在中级别完整性进程中运行
如果当前用户是管理员用户,则用户登录成功时会生成两种令牌,一种是高级别完整性访问令牌,另一种是中级别的普通用户令牌。常规操作时使用中级别令牌,需要执行特权操作时会按照UAC的当前设置来决定执行方式,正常情况下会弹出“你要允许以下程序对此计算机进行更改吗?”提示信息,单击“是”按钮,则以高级别令牌执行,如图1-34所示。如果当前用户不是管理员用户,则在尝试执行特权操作时会弹出需要高权限用户凭据的提示。
图1-34 “你要允许以下程序对此计算机进行更改吗?”提示信息
Windows服务本质上是一个可执行文件,相比常规的可执行文件,它有以下特点:可以在后台运行,即使用户没有登录或没有打开此程序的窗口;可以带参数随着开机启动、随着关机关闭;Windows服务没有用户交互界面,不直接与用户交互,通常使用服务管理器进行管理。如果管理员需要开机启动某个程序并使它在后台运行,则可以将它写成服务,并在Windows服务控制管理器(services.msc)中或使用命令来配置其启动方式和服务状态,如图1-35所示。启动类型为“自动”时,该程序会随着Windows的启动而启动;设置为“手动”时,该程序需要手动启动;设置为“禁用”时,该程序无法启动。配置服务的启动类型如图1-36所示。Windows服务独立于用户之上,可以为计算机中的任何用户共享,用户注销时不受影响。
图1-35 Windows服务列表
图1-36 配置服务的启动类型
注册表(Registry)相当于Windows系统的分层树状数据库,由根键、子键、项和项值组成,用于存储启动信息、系统信息、用户环境配置信息、软硬件配置和状态信息、系统组件信息等。注册表可以通过注册表编辑器或执行命令来访问和控制,注册表编辑器如图1-37所示。
图1-37 注册表编辑器
注册表项包括以下几种类型:
❑REG_SZ:字符串;
❑REG_MULTI_SZ:多字符串,以\0结尾;
❑REG_BINARY:二进制数据;
❑REG_DWORD:一个32位的整数。
表1-4列出了注册表中的根键及其简称和描述。
表1-4 注册表的根键及其简称和描述
以远程桌面方式登录时,通过执行命令“regedit”来打开注册表编辑器以进行查看和编辑,如图1-38所示。
图1-38 打开注册表编辑器
在cmd命令行下执行“reg”命令可操作注册表,表1-5列出了常用的reg命令及其功能。
表1-5 常用的reg命令及其功能
PowerShell命令行下操作注册表的命令及功能如表1-6所示。
表1-6 PowerShell命令下操作注册表的命令及功能
本节将简单介绍Linux系统中与权限相关的知识,如Linux用户和用户组、Linux文件权限、Linux特殊权限等。
只要是操作系统,就会涉及“用户”这个概念。Linux是一个支持多用户、多任务的操作系统,可以根据特定的任务来创建不同的用户,每个用户都有自己的用户名和密码。各用户可以同时登录操作系统,可以在自己的目录中存储个人文件,而不会干扰其他用户。
Linux操作系统引入了UID(User ID)和GID(Group ID)的概念来识别用户身份。每个用户都有独一无二的UID。根据UID的不同,可以将用户分为3种类型,即超级用户(root)、普通用户(User)和系统用户(伪用户),如图1-39所示。
❑超级用户:默认用户名为root。它拥有Linux系统的最高权限,可以对系统进行任何操作,如读取和修改文件、创建用户、安装软件、启动系统服务等。在实际环境中,为了系统安全,一般禁止root账号通过SSH远程登录服务器。该用户类型默认只有一个用户,UID固定为0。
❑普通用户:是为了能够使用Linux资源而建立的用户,普通用户可在指定的权限内执行有限的操作。该类型的用户一般由超级用户创建,UID通常大于1000。
❑系统用户(伪用户):系统用户是一种特殊的用户,用于运行特定的服务或程序,如bin、mail等。Linux系统为该类型用户预留了1~999的UID范围值。该类用户无法登录系统。
图1-39 3种用户类型
在CentOS的不同版本下,UID设定范围是不同的,如表1-7所示。
表1-7 不同CentOS版本的UID设定范围
Linux的用户组与Windows的用户组在作用上有相似之处,都是为了让多个用户拥有相同的权限或访问限制。将需要授权的用户添加到同一个用户组里,通过修改文件或目录的所属组,可以让该用户组下的所有用户具有相同的权限,从而方便地管理文件和目录的访问权限。
Linux下的用户组可以分为以下两类。
❑基本组(私有组):在建立用户账户时,若没有指定账户所属的组,那么系统会建立一个和用户名相同的组,此用户组的编号和用户的ID(UID)相同,这个组就是基本组。
❑附加组(公有组):可以容纳多个用户,组中的所有用户都具有该组所拥有的权限。
在Linux系统中,每个用户必定属于一个用户组。默认情况下,每个用户的基本组名称与用户名相同。此外,每个用户还可以属于多个附加组,Linux系统默认允许一个用户最多属于31个附加组。
用户和用户组的关系有一对一、一对多、多对一和多对多几种,如图1-40所示。
图1-40 用户和用户组的关系
在Linux系统中,用户可以通过用户名和密码登录系统。在登录过程中,系统将用户名和密码发送到认证模块进行验证。认证模块首先会读取/etc/passwd文件来验证用户名是否存在,并且根据用户名查询相应的密码信息。如果用户名不存在,则返回认证失败的信息;如果用户名存在,则会将用户输入的密码进行加密处理,并与/etc/shadow文件中存储的密码密文进行对比,如果用户输入的密码与存储的密码匹配,则认证成功,否则认证失败。如果认证成功,那么系统会加载用户环境并启动对应的Shell。
表1-8列出了与Linux用户相关的主要配置文件。
表1-8 与Linux用户相关的主要配置文件
1.账户文件
/etc/passwd是用于定义用户账户的系统文件。该文件中存储了每个用户的用户名、密码、用户ID、用户组ID、主目录以及登录时使用的Shell等信息。所有用户都可以读取该文件。
执行如下命令可以查看用户账户文件,如图1-41所示。
图1-41 /etc/passwd文件内容
/etc/passwd文件中的字段以“:”分隔,共有7个字段。对字段的解释如图1-42和表1-9所示。
图1-42 /etc/passwd文件信息
表1-9 /etc/passwd文件的字段及其含义
2.密码文件
/etc/shadow是Linux系统中用于存储用户密码信息的文件。该文件中存储了每个用户加密后的密码、密码最后更改的时间、密码过期时间、密码锁定时间等信息。只有超级用户或shadow组成员才能读取该文件。
执行如下命令可以查看用户密码文件,如图1-43所示。
图1-43 /etc/shadow文件内容
/etc/shadow文件的字段说明如图1-44所示。
图1-44 shadow文件信息
/etc/shadow文件中的字段以“:”分隔,共有9个字段。对字段的解释如表1-10所示。
表1-10 /etc/shadow文件的字段及其含义
3.用户组文件
/etc/group是用于存储用户组信息的系统文件。该文件中存储了每个用户组的组名称、组密码、用户组ID、组成员列表等信息。系统中的每个组在文件中都有一行记录,任何用户均可以读取用户组文件。
执行如下命令可查看用户组文件,如图1-45所示。
图1-45 /etc/group文件内容
/etc/group文件的字段说明如图1-46所示。
图1-46 /etc/group文件信息
/etc/group文件中的字段以“:”分隔,共有4个字段。对字段的解释如表1-11所示。
表1-11 /etc/group文件的字段及其含义
4.用户组密码文件
/etc/gshadow是用于存储用户组密码的系统文件,与用户组配置文件/etc/group相对应,记录了用户组密码的相关信息。
执行如下命令可以查看用户组密码文件,如图1-47所示。
图1-47 /etc/gshadow文件内容
/etc/gshadow文件的字段说明如图1-48所示。
图1-48 /etc/gshadow文件信息
/etc/gshadow文件中的字段以“:”分隔,共有4个字段。对字段的解释如表1-12所示。
表1-12 gshadow文件的字段及其含义
在渗透测试中,有时需要进行用户或用户组添加、密码更改和权限设定等操作,所以掌握用户管理的相关命令是非常重要的。
1.添加用户
在Linux系统中,可以使用useradd命令新建用户。此命令的格式如下:
该命令的常用参数如表1-13所示。
表1-13 useradd命令的常用参数
useradd命令使用示例1:
上面第一条命令表示创建一个名为“linux”的普通用户,第二条命令表示创建一个名为“apache”的新用户,不为其创建家目录,并指定其默认的Shell为/sbin/nologin,即不允许登录。
useradd命令使用示例2:
该命令表示创建一个名为whoami的普通用户,指定其UID为1003,登录Shell为/bin/bash,账号永不过期,如图1-49所示。
图1-49 创建用户示例
创建用户的同时还会创建一个与用户名相同的用户组,在/home/目录下会创建一个名为whoami的目录,这就是whoami用户的家目录。
还有一个用来添加用户的命令“adduser”,adduser和useradd这两个用户创建命令之间的区别如下。
❑adduser:并不是标准的Linux命令,本质是一个perl脚本,也是调用的useradd命令。adduser可以以更友好的交互式方式来添加用户,会自动为创建的用户指定主目录和Shell信息,会在创建时提示输入用户密码和个人信息。
❑useradd:需要使用参数指定基本设置,如果不使用任何参数,则创建的用户无密码,无法登录系统。
在实际的渗透测试中可能无法获取交互式的Shell来执行添加用户并设置密码等命令,那么可以使用如下的一句话命令添加一个带密码的用户,如图1-50所示。
上面使用openssl passwd命令来生成一个基于明文密码(即“password”)和盐值(即“suiyi”)计算出来的哈希值。接下来,该哈希值会作为参数传递给useradd命令,以设置新用户的密码。该命令表示创建一个用户名为“yonghu”、密码为“password”的普通用户。
图1-50 使用一句话命令添加一个带密码的用户
如下命令可在非交互式Shell下添加root用户,如图1-51所示。
该命令表示创建一个用户名为“rootyh”、密码为“password”的root用户。
图1-51 添加root用户
命令参数解释如图1-52所示。
图1-52 添加用户命令参数解释
2.设置密码
在Linux系统中,使用passwd命令可以为当前用户修改密码,或为指定的某个用户修改密码。普通用户修改密码时需要输入原密码,root用户可以随意修改其他用户的密码。此命令的格式如下:
该命令的常用参数如表1-14所示。
表1-14 passwd命令的常用参数
执行如下命令可以在交互式Shell下修改或添加用户密码,如图1-53所示。
图1-53 配置用户密码
在实际的渗透测试中可能无法获取交互式的Shell来设置密码,同样可以使用一句话命令设置密码。
上面的代码中,chpasswd是Linux系统中用于批量更改用户密码的命令。
3.删除用户
在Linux系统中,使用userdel命令可删除指定用户,如图1-54所示。
图1-54 删除用户
该命令的常用参数如表1-15所示。
表1-15 userdel命令的常用参数
也可以通过删除/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow等文件中的用户所在行来手动清除一个用户。
4.切换用户
在Linux系统中,使用“su”(切换用户)命令可切换当前用户至指定用户。若普通用户要切换至root用户,则需输入“su -”或“su root”,并输入正确的root密码;若root用户要切换至普通用户,则只需输入“su<用户名>”即可,而无须输入密码。
切换用户的命令有两种执行方式:
❑su<账户名>:仅切换至指定用户,不会切换到其工作目录,不会载入此用户的环境变量。
❑su-<账户名>:切换用户的同时切换至其工作目录,载入此用户的环境变量和配置文件。
su命令使用示例1(如图1-55所示):
以上命令表示切换到root用户并以root身份执行“whoami”命令,一旦命令执行完成,将返回原用户的Shell下。
su命令使用示例2(如图1-56所示):
以上命令表示切换至root用户。
图1-55 切换用户并执行命令
图1-56 切换至root用户
5.执行特权命令
在Linux系统中,sudo是一个非常重要的命令,它允许普通用户以超级用户(即root用户)的身份执行命令。在/etc/sudoers文件中定义了哪些用户可以使用sudo命令以及可以利用sudo执行哪些命令。要使用sudo命令,需要先输入当前用户的密码,密码验证成功后,将拥有15min的有效时间,在此期限内再次使用sudo命令时无须输入密码,超过期限则必须重新输入密码。如果未经授权的用户使用sudo,则系统会向管理员发送警告邮件。执行sudo命令的格式如下:
该命令的常用参数如表1-16所示。
表1-16 sudo命令的常用参数
sudo命令使用示例:
该命令表示以特权身份读取/etc/gshadow文件,如图1-57所示。
执行如下命令,列出当前用户可以使用sudo执行哪些命令。
在Linux系统中,为了确保只有授权的用户和进程才能访问特定的文件和目录,需要对文件和文件夹的权限进行严格的控制。每个文件和目录都有3组权限:所有者的权限、用户组的权限和其他用户的权限。每组权限都有3种访问权限:读取权限、写入权限和执行权限。
1.文件类型和访问权限
执行命令ls或ll可列出当前目录中的文件并查看文件信息(ls和ll的区别是:ll显示的信息更详细,还会显示当前目录下的隐藏文件,而ls不会),如图1-58所示。
图1-57 以特权身份读取文件
图1-58 列出文件
ll命令的输出包括文件类型、权限、连接数、所属用户、所属用户组、文件大小、文件最近修改时间、文件名,如图1-59所示。
图1-59 文件输出释义
(1)文件类型
在Linux系统中,有7种文件类型,如表1-17所示。
表1-17 Linux文件类型
Linux系统不以扩展名来区分文件类型。扩展名的作用是帮助用户确定使用哪个软件打开文件。
(2)基本权限
在Linux系统中,文件权限分为3种,如表1-18所示。它们适用于每一类用户。
表1-18 Linux文件权限类型
某一位置为空时显示“-”,表示不具备这个权限。
(3)文件权限的表示方法
文件权限的字符表示如表1-19所示。
表1-19 文件权限的字符表示
文件权限的进制表示如表1-20所示。
表1-20 文件权限的进制表示
Linux系统中,文件/文件夹权限由9位组成,前3位表示所有者的权限,中间3位表示用户组的权限,后3位表示其他用户的权限,如表1-21所示。
表1-21 权限位
举例如下:
以上内容表示,列出的是文件夹“account”的信息。该文件夹的所有者是“root”,具有可读、可写、可执行的权限;文件夹所属的用户组是“linux”,具有可读、可执行的权限,但没有可写的权限;其他用户对此文件夹具有可读、可执行的权限,但没有可写的权限。
(4)修改文件权限
在Linux系统中,使用chmod命令来修改文件或目录的访问权限。此命令的格式如下:
常见的权限表示方法有两种:字母法、数字法。
1)字母法。
每个参数代表不同的含义,具体解释如表1-22所示。
表1-22 chmod命令参数及其含义
操作符及其含义如表1-23所示。
表1-23 操作符及其含义
chmod命令的字母法使用示例(如图1-60所示):
该命令表示对1.txt文件赋予其他用户可执行的权限。
2)数字法。
在文件权限表示方法中,前文已提到过权限符号所对应的八进制表示方法(3种用户权限对应3位八进制数字)。
chmod命令的数字法使用示例1:
该命令表示将1.txt文件设置为所有者和用户组可读、可写、可执行,以及其他用户可读的权限(774所对应的权限符号为rwxrwxr--),如图1-61所示。
图1-60 chmod命令的字母法使用示例
图1-61 chmod命令的数字法使用示例1
chmod命令的数字法使用示例2:
该命令表示递归更改test目录及其所有子目录和文件的权限,赋予所有者、用户组和其他用户可读、可写和可执行权限,如图1-62所示。
(5)目录权限
在Linux渗透/提权中常需要上传漏洞利用程序或其他一些辅助工具,所以需要了解目录相关权限。目录权限主要分3种,如表1-24所示。
图1-62 chmod命令的数字法使用示例2
表1-24 目录权限
2.特殊权限
前文介绍了r、w、x这3种基本权限,在Linux中还有3种特殊的权限:SUID、SGID、SBIT。
(1)SUID
SUID(Set User ID)一般出现在文件所有者的执行权限位上,如图1-63所示。
图1-63 SUID示例
图1-63中,文件所有者中的“x”执行权限位,出现了“s”权限,此权限称为SETUID。
SUID特殊权限只适用于可执行文件。当用户执行此类型文件时,操作系统会暂时将当前用户的UID切换为文件所有者的UID。当文件执行结束后,身份的切换随之结束。
举个例子,当用户想修改自己的密码(使用passwd命令,调用/usr/bin/passwd文件)时,此操作需要修改shadow文件,而shadow文件只有root权限才能读取和修改。那么,为什么可以修改成功呢?通过查看passwd文件属性可以看到它已经被设置了特殊权限SUID,所以当普通用户执行passwd命令来修改密码时,是临时切换至root权限去修改shadow文件的,如图1-64所示。
图1-64 修改密码流程
设置SUID也是权限维持中常用的一种方法。例如,将vim、nano等文件设置为SUID特殊权限,则可以修改/root/.ssh/authortizded_keys进行无密码登录,以及编辑/etc/shadow文件。
在Linux中可使用chmod命令为文件添加和撤销SUID特殊权限。
该命令表示使用字符法为/tmp/ServerScan文件添加SUID特殊权限,如图1-65所示。
图1-65 为文件添加SUID权限
(2)SGID
SGID(Set Group ID)一般出现在文件所属用户组的执行权限位上,如图1-66所示。当用户执行此类型文件时,操作系统会暂时将当前用户的组身份切换为文件所属组。文件执行结束后,身份的切换随之结束。当SGID作用于目录时,进入此目录的用户在创建文件或文件夹时,新文件或文件夹的所属组将继承此目录的所属组。
图1-66 SGID示例
如图1-66所示,原本文件所属组中的x执行权限位,出现了s权限,此权限称为SETGID。
在Linux中可使用chmod命令来添加和撤销SGID特殊权限,如图1-67所示。
该命令表示使用字符法为/tmp/ServerScan文件添加SGID特殊权限。
图1-67 为文件添加SGID权限
(3)SBIT
SBIT(Sticky Bit)是另一种特殊权限,用于在共享目录中保护文件和目录。当一个目录被设置了SBIT权限时,该目录中的文件和子目录只能被其所有者和root用户删除或移动,即使其他用户具有该目录的写权限,也无法修改或删除该目录中的文件和子目录。SBIT权限通常用于保护公共目录,如/tmp目录。