1.2 Windows提权基础知识
本节将简单介绍Windows系统中的用户和用户组、访问控制列表、安全标识符、身份验证、访问令牌、权限分配、Windows哈希、用户账户控制、Windows服务等与权限提升技术相关的基础知识。
1.2.1 用户和用户组
在计算机系统中,每个用户或用户组都会被分配一定的权限。这些权限通常由系统管理员控制和管理。普通用户通常只有受限的访问权限,不能对系统、数据库、敏感文件或其他特定资源进行操作。然而,由于某些错误或不安全的配置,普通用户可能会获得过多的访问控制权限,这就为攻击者提供了机会。例如,某些应用程序可能会以超级用户的权限运行,这意味着普通用户可以利用应用程序漏洞获取超级用户权限,从而访问和操作敏感资源。因此,了解用户或用户组及其权限对于预防和检测权限提升攻击非常重要。
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.2 访问控制列表
表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,给出允许写入、读取和执行的权限。
1.2.3 安全标识符
安全标识符(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/)。
1.2.4 身份验证
身份验证是验证对象或人员身份的过程。当用户试图登录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的子键,它也用于存储本地用户账户信息。
1.2.5 访问令牌
访问令牌是描述进程或线程的安全上下文的对象。
当一个用户成功完成身份验证并登录系统后,会创建一个成功的登录会话(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时,才可以用于模拟。
1.2.6 权限分配
执行命令“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>:禁用全部权限。
1.2.7 Windows哈希
什么是哈希(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所示。
1.2.8 用户账户控制
用户账户控制(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 “你要允许以下程序对此计算机进行更改吗?”提示信息
1.2.9 Windows服务
Windows服务本质上是一个可执行文件,相比常规的可执行文件,它有以下特点:可以在后台运行,即使用户没有登录或没有打开此程序的窗口;可以带参数随着开机启动、随着关机关闭;Windows服务没有用户交互界面,不直接与用户交互,通常使用服务管理器进行管理。如果管理员需要开机启动某个程序并使它在后台运行,则可以将它写成服务,并在Windows服务控制管理器(services.msc)中或使用命令来配置其启动方式和服务状态,如图1-35所示。启动类型为“自动”时,该程序会随着Windows的启动而启动;设置为“手动”时,该程序需要手动启动;设置为“禁用”时,该程序无法启动。配置服务的启动类型如图1-36所示。Windows服务独立于用户之上,可以为计算机中的任何用户共享,用户注销时不受影响。
图1-35 Windows服务列表
图1-36 配置服务的启动类型
1.2.10 注册表
注册表(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命令下操作注册表的命令及功能