内网渗透体系建设——基础知识
内网渗透建设基础知识
内网工作环境
- 工作组 (work group)
组(Group)是用户账号的集合。通过向一组用户分配权限,就可以不必向每个用户分别分配权限了。按照用途分类,域组分为通讯组和安全组
对于通讯组,我们接触的比较多的就是邮件组,将若干个人划分到一个通讯组,给这个通讯组发件,组内用户都能收到
安全组则是用户权限的集合。举个例子,管理员在日常的网络管理中,不必向每个单个用户账号都设置单独的访问权限,只需要创建一个组,对这个组配置访问权限,然后将需要配置该访问权限的用户账号拉进这个组中即可。并且如果管理员在网络运维中需要一些特殊的管理权限时,只需将自己的运维账号拉进该组中就行了
工作组适用于网络中计算机不多、资产规模较小、对安全管理控制要求不严格的情况。当组织中的网络规模越来越大,需要统一的管理和集中的身份认证,并且能够为用户提供更加方便的网络资源搜索和使用方式是,就要放弃工作组而使用域
- 域
域与工作组概念类似,但是域的计算机集合更大,适用于计算机数量众多的大型网络环境
域用户需要访问域中资源时,必须通过域控制器集中进行身份验证获取相应访问权限
域管理员用户是域中最强大的用户,在域中具有最高访问权限和最高管理权限
单域: 只有一个域的环境
父域和子域:把一个域分成若干个域,被划分的叫父域,划分出来的叫子域。从域名上看,各个子域会用点进行分割,如
aaa.bbb.ccc
是bbb.ccc
的子域域树:多个域通过建立信任关系组成的域集合,形如子域和父域关系就像子叶和根。域树中域的命名具有连续性
在域树中,域管理员只能管理本域,不能访问或者管理其他域,要访问就要建立信任关系
- 域控制器(Domain Controller , DC)
域控制器又称”域控”,是域环境核心的服务器计算机,用于安全身份认证、存储用户账户信息并执行域的安全策略等
域控制器包含一个活动目录数据库,存储着整个域的账户密码计算机等信息
一个域环境可以拥有多台域控制器
活动目录
活动目录(Active Directory , AD) 是指安装在域控制器上为整个域环境提供集中式目录管理服务的组件。活动目录存储了有关网络对象的信息,例如域、用户、用户组、计算机、组织单位、共享资源、安全策略、打印机和联系人等信息,并使管理员和用户可以方便的查找和使用这些网络信息。 目录数据存储在域控制器的Ntds.dit文件中
主要提供以下功能:计算机集中管理,用户集中管理,资源集中管理,环境集中配置,应用集中管理
Ntds.dit
文件
这是域环境的域控制器上保存的%SystemRoot%\ntds\ntds.dtd
路径下的二进制文件,是主要的活动目录数据库。这个文件包括但不限于有关域用户,用户密码的哈希值,用户组,组成员身份和组策略的信息。Ntds.dit文件使用存储在SYSTEM文件的密钥对这些哈希值进行加密
在非域环境即工作组环境中,用户的登录凭证存储等信息在本地的SAM文件中
目录服务与LDAP
活动目录是一个目录服务数据库,里面的数据是树状结构存储
LDAP (全称Lightweight Directory Access Protocol
,即轻量级目录访问协议, 和jndi注入用的ldap协议是同一个东西), 可以用于访问目录服务数据库
目录树:整个目录的信息都可以抽象为一个树,每个节点就是条目
条目:每个条目就是一个记录,每个条目哦都有自己唯一的绝对可辨识名称(DN)
DN:就是绝对可辨识名称,它指向一个LDAP对象的完整路径。DN由本体开始,向上延伸到DNS命名空间,CN代表通用名,OU代表组织单位,DC代表域组件
1 | CN=DC1, OU=Domain Controllers, DC=hack-my, DC=com |
RDN:相对可辨识名称
活动目录的访问
这里使用微软提供的AD Exploerer
工具,在域中任意一台主机上,以域用户身份进行连接域控制器,链接成功后可以查看域各种信息
活动目录分区
活动目录预定义了域分区、配置分区和架构分区三个分区
域分区
域分区存储着该域有关的对象信息,比如说域中的计算机、用户、组、组织单位等信息
可以看到包含了
配置分区
架构分区
选中一个条目,左边就会有详细信息
一个条目有哪些属性是由它的所属的类所决定的
ldap中,类有继承关系,子类可以继承父类的所有属性,而top类是所有类的父类
活动目录的查询
Active Directory 的查询基础语法
BaseDN
即基础可分辨名称,其指定了这棵树的根。比如指定BaseDN
为DC=whoamianony,DC=org
就是以DC=whoamianony,DC=org
为根往下搜索,类似于在文件系统中指定了一个根目录
若指定BaseDN
为CN=Computers,DC=whoamianony,DC=org
就是以CN=Computers,DC=whoamianony,DC=org
为根往下搜索
过滤规则
LDAP 搜索过滤器语法有以下逻辑运算符
运算符 | 说明 | |
---|---|---|
& | AND 运算符 | |
\ | OR 运算符 | |
! | NOT 运算符 | |
= | 用与名称和值做相等比较 | |
* | 通配符 |
举几个例子
(uid=testuser)
:匹配 uid 属性为 testuser 的所有对象(uid=test*)
:匹配 uid 属性以 test 开头的所有对象(!(uid=test*))
:匹配 uid 属性不以 test 开头的所有对象(&(department=1234)(city=Paris))
:匹配 department 属性为1234且city属性为Paris的所有对象(|(department=1234)(department=56*))
:匹配 department 属性的值刚好为1234或者以56开头的所有对象
需要注意的点就是运算符是放在前面的,跟我们之前常规思维的放在中间不一样
LDAP按位查询
在 LDAP 里面,有些属性字段是位字段,这里以 userAccountControl
举例,其记录了用户的 AD 账号的很多属性信息,该字段就是一个的位字段。之所以说 userAccountControl
是一个位字段,是因为它是由一个个位构成:
Property flag | Value in hexadecimal | Value in decimal |
---|---|---|
LOCKOUT | 0x0010 | 16 |
PASSWD_NOTREQD | 0x0020 | 32 |
PASSWD_CANT_CHANGE | 0x0040 | 64 |
ENCRYPTED_TEXT_PWD_ALLOWED | 0x0080 | 128 |
TEMP_DUPLICATE_ACCOUNT | 0x0100 | 256 |
NORMAL_ACCOUNT | 0x0200 | 512 |
INTERDOMAIN_TRUST_ACCOUNT | 0x0800 | 2048 |
WORKSTATION_TRUST_ACCOUNT | 0x1000 | 4096 |
SERVER_TRUST_ACCOUNT | 0x2000 | 8192 |
DONT_EXPIRE_PASSWORD | 0x10000 | 65536 |
MNS_LOGON_ACCOUNT | 0x20000 | 131072 |
SMARTCARD_REQUIRED | 0x40000 | 262144 |
TRUSTED_FOR_DELEGATION | 0x80000 | 524288 |
NOT_DELEGATED | 0x100000 | 1048576 |
比如一个账户,他的 userAccountControl
属性只有 LOCKOUT 和 NOT_DELEGATED 这两个位有值,其他的位都没有,那这个用户的 userAccountControl
属性的值就为 0x100000+0x0010,是个32 位 INT 类型
现在,如果我要搜索域内所有设置了 NOT_DELEGATED 位的所有对象,那么像之前那样简单的 LDAP 搜索语法肯定是不行了。因为简单的 LDAP 搜索语法只能对某个属性进行过滤,还不能对属性里面的某个具体的位进行过滤,这就引出了 LDAP 的按位搜索
LDAP 的按位搜索的语法如下:
1 | <属性名称>:<BitFilterRule-ID>:= <十进制的位值> |
其中的<BitFilterRule-ID>
指的是位查询规则所对应的 ID,大致内容如下:
位查询规则 |
BitFilterRule-ID |
---|---|
LDAP_MATCHING_RULE_BIT_AND | 1.2.840.113556.1.4.803 |
LDAP_MATCHING_RULE_OR | 1.2.840.113556.1.4.804 |
LDAP_MATCHING_RULE_TRANSITIVE_EVAL | 1.2.840.113556.1.4.1941 |
LDAP_MATCHING_RULE_DN_WITH_DATA | 1.2.840.113556.1.4.2253 |
最常的用是LDAP_MATCHING_RULE_BIT_AND ,也就是1.2.840.113556.1.4.803
比如我们查询域内所有设置了 NOT_DELEGATED 位的所有对象,NOT_DELEGATED 对应的十进制比较值位 1048576,那么根据语法,我们便可以构造以下过滤语法:
1 | (userAccountControl:1.2.840.113556.1.4.803:=1048576) |
想查询哪些对象设置了 TRUSTED_FOR_DELEGATION
TRUSTED_FOR_DELEGATION对应的十进制比较值为524288,根据语法我们就可以构造以下过滤规则
1 | (userAccountControl:1.2.840.113556.1.4.803:=524288) |
使用AdFind
查询活动目录
AdFind
是一款 C++ 语言编写的域内信息查询的命令行工具,可以再域中任何一台主机上使用,在域渗透里面的出场率极高
1 | AdFind.exe [switches] [-b basedn] [-f filter] [attr list] |
1 | # 搜索 whoamianony.org 域下 objectcategory=computer 的所有对象,会显示出所有对象以及对象的所有属性 |
Adfind
还提供了一个快捷的按位查询方式,可以直接用来代替那些复杂的 BitFilterRule-ID
:
位过滤规则 | BitFilterRule-ID |
Adfind BitFilterRule |
---|---|---|
LDAP_MATCHING_RULE_BIT_AND | 1.2.840.113556.1.4.803 | :AND: |
LDAP_MATCHING_RULE_OR | 1.2.840.113556.1.4.804 | :OR: |
LDAP_MATCHING_RULE_TRANSITIVE_EVAL | 1.2.840.113556.1.4.1941 | :INCHAIN: |
LDAP_MATCHING_RULE_DN_WITH_DATA | 1.2.840.113556.1.4.2253 | :DNWDATA: |
上面那个例子可以这样写:
1 | Adfind.exe -b dc=whoamianony,dc=org -f "(userAccountControl:AND:=524288)" -bit -dn |
域用户与机器用户
域用户,就是域环境中的用户,在域控制器中被创建,并且其所有信息都保存在活动目录中。域用户位于域的全局组Domain Users中,而计算机本地用户账户位于本地User组中。当计算机加入域时,全局组Domain Users会被添加到计算机本地的User组中。因此,域用户可以在域中的任何一台计算机上登录
1 | net user /domain #查看域中所有的域用户 |
机器用户其实是一种特殊的域用户,域用户有的属性机器用户都有
在域环境中,计算机上的本地System用户对应域中的机器用户==账户,在域中用户名就是”机器名+$“
1 | net group "Domain Computers" /domain #查看域中所有的机器用户 |
当获取一合域中主机的控制权后,发现没有域中用户凭据,此时可以利用一些系统提权方法,将当前用户提升到SYSTEM,以机器账户权限进行域内的操作。如图所示,刚开始以计算机本地用户的权限执行域中命令,由于该用户不是域用户,因
此会报错,显示拒绝访问
这里用psexec
(pstool
)系统内核漏洞提权,将当前用户提升到SYSTEM用户权限,以机器账户权限进行域内的操作
1 | PsExec -i -s -d cmd |
之后弹出一个system权限用户的CMD,该用户对应域中的机器账户,具有域用户的属性,所以可以成功执行域中命令
域用户组的分类和权限
在域环境中,为了方便对用户权限进行管理,需要将具有相同权限的用户划为一组。只要对这个用户组赋予一定的权限,那么该组内的用户就获得了相同的权限
组的用途
用户账号的集合称为组,按照用途可以分为通讯组和安全组
通讯组:给通信组发信息时,组内的用户都能收到
安全组:对一个组赋予权限,则组内都是那个权
根据组的作用范围,安全组可以分为域本地组 通用组和全局组。注意这里的”作用范围”指的是组在域树或域林中应用的范围
- 域本地组
查询域内的所有域本地组:
1 | Adfind.exe -b dc=hack-my,dc=com -bit -f "(&(objectClass=group)(grouptype:AND:=4))" cn -dn |
几个的常见的系统内置的域本地组及其组权限:
Administrators:管理员组,该组的成员可以不受限制地存取计算机/域的资源。不仅是最具有权限的一个组,也是在活动目录和域控制器中默认具有管理员权限的组,是域森林中强大的服务管理组
Remote Desktop Users:远程登录组,处于远程登录组中的用户才有权限使用远程登录服务
Print Operators:打印机操作员组,位于该组内的成员可以管理网络中的打印机,还可以在本地登录和关闭域控制器
Account Operators:账号操作员组,该组的成员可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录域控制器,但不能更改属于Administrators或Domain Admins组的账户,也不能修改这些组。默认情况下该组中没有成员
Server Operators:服务器操作员组,该组的成员可以管理域服务器,其权限包括建立/管理/删除任意服务器的共享目录、管理网络打印机、备份任何服务器的文件、格式化服务器硬盘、锁定服务器、变更服务器的系统时间、关闭域控制器等。默认情况下该组中没有成员
Backup Operators:备份操作员组,该组的成员可以在域控制器中执行备份和还原操作,还可以在本地登录和关闭域控制器。默认情况下该组中没有成员
通用组
查询域内的所有通用组:
1
Adfind.exe -b dc=hack-my,dc=com -bit -f "(&(objectClass=group)(grouptype:AND:=8))" cn -dn
两个的常见的系统内置的通用组及其组权限:
Enterprise Admins:组织系统管理员组,该组是域林的根域中的一个组。Enterprise Admins 组中的成员在域林中的每个域内都是 Administrators 组的成员,因此对所有域控制器都有完全访问控制权
Schema Admins:架构管理员组,该组是域森林的根域中的一个组,该组成员可以修改活动目录和域森林的模式。Schema Admins 组是为活动目录和域控制器提供完整权限的域用户组,因此,该组成员的资格是非常重要的
全局组
以下命令可以查询域内的所有全局组:
1
Adfind.exe -b dc=hack-my,dc=com -bit -f "(&(objectClass=group)(grouptype:AND:=2))" cn -dn
几个的常见的系统内置的全局组及其组权限:
Domain Admins:域管理员组,该组的成员在所有加入域的服务器、域控制器和活动目录中均默认拥有完整的管理员权限。因为该组会被添加到自己所在域的 Administrators 组中,因此可以继承 Administrators 组的所有权限。同时,该组默认会被添加到每台域成员计算机的本地 Administrators 组中,这样Domain Admins 组就获得了域中所有计算机的所有权。如果希望某用户成为域系统管理员,建议将该用户添加到 Domain Admins 组中,而不要直接将该用户添加到 Administrators 组中
Domain Users:域用户组,该组的成员中是所有的域用户。默认情况下任何由我们新建立的计算机账号都是该组成员
Domain Computers:域成员主机组,该组的成员是域内所有的域成员主机,任何由我们建立的计算机账号都属于 Domain Computers 组
Domain Controllers:域控制器组,该组成员包含了域内所有的域控制器
Domain Guests:域访客用户组,该组内的成员默认为域访客用户,域成员计算机会自动将此组加到本地的 Guests 组中
Group Policy Creator Owners:新建组策略对象组,此组成员可以修改域的组策略
组织单位
当需要对用户赋予某特殊权限时,可以设置一个域用户组,对这个组配置资源访问权限,再将该用户拉进这个组,这样用户就拥有了这个组的权限。同样,如果需要对指定部门的用户进行统一管理,便可以设置类似集合的概念,然后把该部门的用户拉入,这样就可以对该部门的用户进行集中管理了,如下发组策略等。这个集合就是组织单位。
组织单位(Organization Unit, OU)是一个可以将域中的用户、组和计算机等对象放入其中的容器对象,是可以指派组策略或委派管理权限的最小作用域或单元
所有组织单位在活动目录中都是organizationalUnit
类的示例,所以可以通过 (objectclass=organizationalUnit)
或 (objectCategory=organizationalUnit)
来查询所有的OU:
1 | Adfind.exe -b "dc=hack-my, dc=com" -f "(objectclass=organizationalUnit)" -dn |
1 | Adfind.exe -b "OU=科研中心,DC=hack-my,DC=com" -dn #查询"科研中心"的对象 |
访问控制
Windows访问控制模型
Windows访问控制模型主要由访问令牌(Access Token)和安全描述符(Security Descriptor)两部分组成,分别由访问者和被访问者持有。通过比较两者,可以知道访问者有无访问资源对象
访问令牌
当用户登录时,Windows将对用户进行身份验证,如果验证通过,就会为用户创建一个访问令牌,包括登录过程返回的SID、由本地安全策略分配给用户和用户所属安全组的特权列表。此后,代表该用户执行的每个进程都有此访问令牌的副本,每当线程或进程与安全对象交互或尝试执行需要特权的系统任务,Windows都会使用此访问令牌标识并确定关联的用户
安全描述符
当安全对象被创建时,操作系统会为其创建一个安全描述符。安全描述符主要由SID和ACL(Access Control List,访问控制列表)组成。SID用来标识用户账户和该用户所属的组。ACL分为DACL和SACL两种
访问控制列表
访问控制列表(ACL)是访问控制项(Access Control Entry, ACE)的列表 访问控制列表中的每个访问控制项指定了一系列访问权限
DACL自主访问控制列表 SACL系统访问控制列表
Icacls
是一种命令行工具,可以查看和修改指定文件上的访问控制列表(ACL),并将存储的DACL应用于指定目录的文件
1 | 简单权限序列 (基本权限): |
组策略
组策略是Windows环境下管理账户的一种手段,可以控制用户账户和计算机账户的工作环境
包括但不限于以下功能:
- 账户策略的配置:如密码长度,复杂程度
- 脚本的配置:如登录与注销、启动和关机脚本的设置
- 应用程序的安装与删除:用户登录或计算机启动时,自动为用户安装应用,自动修复应用的错误
- 文件夹重定向
- 限制访问可移动存储设备
- 用户工作环境的配置
- 其他系统设置等
组策略对象
组策略对象(Group Policy Object,GPO)即组策略设置的集合,其中包含应用于特定用户或计算机的策略信息和具体配置。在设置组策略时,只需将组策略对象链接到指定的站点、域和组织单位,其中的策略值便会应用到该站点、域和组织单位的所有用户和计算机
组策略对象由组策略容器(Group Policy Container, GPC)和组策略模板(Group Policy Container, GPT)构成,其中组策略容器存储在活动目录的域分区,组策略模板放在域控制器的如下文件夹中: %SYSTEMROOT%\SYSVOL\sysvol\域名\Polices