内网渗透-1
没有放弃写博客,主要最近确实没啥好些的!
寒假期间算是把web漏洞分析学了,现在致力于学习内网渗透。先写一篇简单的知识吧
内网渗透就是指获取目标服务器控制权后,使用内网信息收集,内网代理,权限提升,横向移动等技术。对其内网环境进行渗透,最终获取内网其他主机的权限,比如域控或者运维主机。
内网工作环境
工作组
工作组是最简单最常用的计算机资源管理模式,局域网内默认使用工作组方式,主机默认工作组就是WORKGROUP
域
域是比工作组更高级的计算机资源管理模式,它是一个有安全边界的计算机集合。在域环境中所有用户,用户组,计算机,打印机以及其他安全设备都要在域控中央数据库中注册。而且域内用户想要访问域内资源也是需要在域控中通过身份验证,通过身份验证后能访问哪些资源取决于在域内的身份。
1.单域
一般使用在计算机数量比较小的情况,网络环境就只有一个域。
2.父域和子域
有些情况下会把一个域划分出多个域,被划分的称之为父域,划分出来的是子域。
3.域树
多个域通过父子关系形成的域集合,而且所有的域名形成连续的命名空间。所有的域共享一个表结构和配置
4.域林
就是一个或多个没有形成连续命名空间的域树构成的。最显著的特点就是不是连续的命名空间。同样所有的域共享一个表结构和配置
域控
域控(DC)是域环境的核心服务器计算机。主要作用有三个
1.域内身份验证
2.存储域内用户信息
3.执行域内安全策略
域控中有一个活动目录(Active Directory),里面记录了域内关键信息。域控之所以是域控就是因为存有活动目录
活动目录
我们说了域控之所以是域控就是因为有活动目录,这个活动目录是啥呢?活动目录本质上就是一个目录服务数据库里面存储了大量信息,比如用户,用户组,计算机,组织单位,共享资源,安全策略。目录数据存储在Ntds.dit文件下面
Ntds.dit文件
这个文件是域控下一个二进制文件,文件路径是%SystemRoot%\ntds\ntds.dit 文件包含但不限于域用户名,口令哈希值,用户组,组成员身份,组策略并且Ntds.dit文件使用System下的密钥对hash值进行加密而在工作组环境下,用户的登录凭证存储在SAM文件下面!
目录服务和LDAP
我们说了活动目录AD其实就是一个目录服务数据库,他和关系型数据库不一样,他将所有数据组织成一个树结构。每个节点是一个对象(这里说的对象就是类对象,AD有很多类),有关这个对象的信息存储在对象的属性里面。而LDAP就是用来访问目录服务数据库的一个协议。
相关的一些概念
1.目录树目录服务数据库将所有数据组织成树结构,这个树称之为目录树
2.条目目录树的每个条目就是一条记录
3.DN(Distinguished Name)绝对可辨识名称,指向一个LDAP对象的完整路径。有点类似文件系统的绝对路径比如一个DN为:CN=DC1, OU=Domain Controllers, DC=hack-my, DC=com
4.DC(Domain Component)域组件,这个容易和域控搞混了
5.OU(Organizational Unit)组织单位
6.CN(Common Name)通用名7.属性描述每个对象的具体信息
活动目录分区
一个活动目录可以支持上万的对象,为了方便管理和复制。划分为多个分区,这些分区被称之为NC(Naming Context)上下文命名
一般是域分区,配置分区和架构分区三个分区
1.域分区
这个分区存储本域相关的信息,如该域的计算机,用户,组,组织单位等信息
比如这个 “DC=hack-my,DC=com"
2.配置分区
配置分区存储整个域林的主要配置信息,包括有关站点,服务,分区和整个活动回顾目录结构的信息
比如"CN=Configruration,DC=hack-my,DC=com"
3.架构分区
存储整个域林的架构信息,包括活动目录的类,对象和属性的定义数据。整个域林共享同一份架构分区。会被复制到林中所有域的所有域控制器中。
比如"CN=Schema,CN=Configuration,DC=hack-my,DC=com"就是架构分区
活动目录的所有类都会存储在架构分区中,是架构分区的一个条目。所谓条目其实就是一个类的实例对象。
在LDAP中,类是存在继承关系的,子类可以继承父类的所有属性,而top类是所有类的父类。并且每个类都会有一个ObjectClass属性,这个属性指向实例对象所继承的类
活动目录的查询
LDAP的按位查询
在LDAP中有些类的属性是位属性,也就是很多的标志位组成的。不同的标志位代表不同的数值,属性的值就是这些数值的和
此时我们查询的并不是属性本身,而是属性中的标志位了
查询规则:
<属性名称>:<查询规则>:操作符<十进制数值>
查询规则一般如下:
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_TRANSTIVE_EVAL 1.2.840.113556.1.4.1941
LDAP_MATCHING_RULE_DN_WITH_DATA 1.2.840.113556.1.4.2253
其中最常见的就是用户属性userAccountControl,一个属性包含32个位
比如这个查询命令
(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
这个会返回就是在user类中,所有启用的用户账户
使用AdFind查询活动目录
AdFind是C++编写的活动目录查询工具,可以在域中任何一台主机上使用。在内网渗透中使用率极高
AdFind常见用法如下
连接参数:
-h 指定主机与端口ip:port
-p 单独指定端口
-u 指定用户
-up 指定密码
过滤参数:
-b 指定要查询的根节点basedn
-bit 指定位查询
-f LDAP过滤条件,条件要符合LDAP语法
显示参数:
-appver 显示Adfind版本信息
-c 只统计数量
-csv 导出为csv格式
-dn 只显示DN,不返回详细信息
-s 搜索的范围,包括one=当前层级 sub=一层一层递归,默认是sub
-recmute 如果所有属性都为空,则禁止显示DN,主要适用于-sddl过滤器选项
-t 查询超时时间,默认为120s
帮助参数:
-help 基础帮助
-? 基级帮助
-?? 高级帮助
-???? 快捷方式帮助
-sc? 快捷方式帮助
-meta? 元数据帮助
-regex? 固定表达式帮助
使用结构:
Adfind.exe [switches] [options] [attr list]
switches:
连接参数如果在域内机器上运行则不需要,如果是域外机器上执行
则需要指定域控并提供一个有效的域用户和密码。
options:
就是很多选项
attr list:
指定显示的属性,如果没有指定会默认显示所有属性
例子:
AdFind.exe -h 10.211.55.66:389 -u test\hack -up Pass@666 -sc dclist
常用的一些命令如下:
查询域信息关系(用于查询父子域/域树/域林等)
1.Adfind.exe -f objectclass=trusteddomain -dn
域控相关:
2.查询域控名称
Adfind.exe -sc dclist
3.查询域控版本
Adfind.exe -schema -s base objectversion
机器查询相关:
4.查询域内所有机器DN显示
Adfind.exe -f "objectcategory=computer" dn
5.查询域内所有机器显示机器名和操作系统
Adfind.exe -f "objectcategory=computer" name operatingSystem
6.查询域中活跃的机器
Adfind.exe -sc computers_active dn
7.查询域中活跃的机器,显示机器名和操作系统
Adfind.exe -sc computers_active name operatingSystem
8.指定查询域中活跃的机器
Adfind.exe -f "(&objectcategory=computer)(name=机器名称)"
用户查询相关:
9.查询域管理员
Adfind.exe -b "CN=Domain Admins,CN=Users,DC=test,DC=com" member
10.查询域内所有用户
Adfind.exe -b DC=test,DC=com -f "(&(objectCategory=person)(objectClass=user))"
11.查询域内指定用户(administrator例子)
Adfind.exe -sc u:administrator
12.查询域内指定用户的sid(administrator例子)
Adfind.exe -sc u:administrator objectSid
13.根据sid查询用户
Adfind.exe -sc adsid:S-1-5-21-1873282888-450677352-877677906-500
14.查询域内用户属于哪个组
Adfind.exe -s subtree -b CN=administrator,CN=users,DC=test,DC=com memberOf
15.递归查询指定用户隶属组以及隶属组隶属信息(类似于bloodhound中的Unrolled Group Membership组成员关系)
Adfind.exe -s subtree -b DC=test,DC=com -f "(member:INCHAIN:="CN=administrator,CN=users,DC=test,DC=com")" -bit dn
16.查询域内不要求Kerberos预身份认证的用户(用于AS-REP Roasting攻击)
Adfind.exe -f "useraccountcontrol:1.2.840.113556.1.4.803:=4194304" dn
17.查询受保护的用户(比如krbtgt就属于受保护用户)
Adfind.exe -f "&(objectcategory=person)(samaccountname=*)(admincount=1)" dn
18.查询users容器下所有对象
Adfind.exe -users dn
组相关查询:
19.查询域内所有全局组:
Adfind.exe -f "(grouptype=-2147483646)" dn
20.查询域内所有的通用组
Adfind.exe -f "(grouptype=-2147483640)" dn
21.查询域内所有本地域组
Adfind.exe -f ”(grouptype=-2147483644)(grouptype=-2147483643))" dn
22.查询指定组内包含哪些对象
Adfind.exe -s subtree -b "CN=Domain Admins,CN=Users,DC=test,DC=com" member
23.递归查询指定组包含哪些域用户
Adfind.exe -s subtree -b DC=test,DC=com -f "(memberos:INCHAIN:="CN="Domain Admins",CN=Users,DC=test,DC=com")" -bit dn
委派相关查询命令
24.非约束委派查询(查询了配置了非约束委派的主机)
Adfind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
25.非约束委派查询(查询了配置了非约束委派的服务账号)
AdFind.exe -b "DC=xie,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
26.查询约束委派(配置约束委派的主机,并可以看到被委派的SPN)
Adfind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
27.查询约束委派(配置约束委派的服务账号,并可以看到被委派的SPN)
Adfind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
28.基于资源的约束委派(配置了基于资源约束委派的主机)
Adfind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369)(msDS-AllowedToAct OnBehalfOfotherIdentity=*))" msDS-AllowedToActOnBehalfOfOtherIdentity
29.基于资源的约束委派(配置了基于资源约束委派的服务账号)
Adfind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306368)(msDS-AllowedToAct OnBehalfOfotherIdentity=*))" msDS-AllowedToActOnBehalfOfOtherIdentity
ACL与DCSync等会用得到的查询
30.DCSync(查询域中具有复制目录权限的用户)
Adfind.exe -s subtree -b "DC=test,DC=com" nTSecurityDescriptor -sddl+++ -sddlfilter ;;; "Replicating Directory Changes";; -recmute -resolvesids
31.DCSync(查询域中具有复制目录所有权限的用户)
Adfind.exe -s subtree -b "DC=test,DC=com" nTSecurityDescriptor -sddl+++ -sddlfilter ;;; "Replicating Directory Changes All";; -recmute -resolvesids
32.查询域中的OU
Adfind.exe -f "objectClass=organizationalUnit" dn
33.查询域的ACL
Adfind.exe -b DC=test,DC=com -sc getacl
34.查询rightsGuid对应的扩展权限
Adfind.exe -b CN=Extended-Rights,CN=Configuration,DC=test,DC=com -f "rightsGuid=1131f6aa-9c07-11dl-f79f-00c04fc2dcd2" dn
35.查询域内所有GPO
Adfind.exe -sc gpodmp
36.查询域内高权限的SPN
Adfind.exe -b "DC=test,DC=com" -f "&(servicePrincipalName=*)(admincount=1)" servicePrincipalName
37.查询域内所有邮箱并以csv格式显示
Adfind.exe -f "mail=*" mail -s Subtree -recmute -csv mobile
38.查询域内所有手机号并以csv格式显示
Adfind.exe -f "telephonenumber=*" telephoneumber -s Subtree -recmute -csv mobile
另外AdFind还提供便捷的LDAP按位查询
上面也说了,AdFind在-f 中指定LDAP过滤条件,所以只需要将LDAP的查询语句在-f中写就行了
<属性名称>:<位操作规则>:操作符<十进制数值>
其中位操作规则可以写成ruleid 也可以使用AdFind的快捷方式
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_TRANSTIVE_EVAL 1.2.840.113556.1.4.1941 :INCHAIN:
LDAP_MATCHING_RULE_DN_WITH_DATA 1.2.840.113556.1.4.2253 :DNWDATA:
比如一个
adfind.exe -b dc=hack-my,dc=com -f "(userAccoutControl:AND:=131080)" -bit -dn
域用户和机器用户介绍
用户组
没啥说的,就是用户的集合。分为安全组和通讯组。主要关注安全组,安全组就是拥有相同权限的用户集合
按照安全组的作用范围,可以分为域本地组,通用组,全局组
用户组本质都是Group类的实例,而有一个属性groupType决定组类型,他也是一个位属性
域本地组(domain local group)
域本地组作用于本域,除了本域内的用户,还可以包含域林的任何一个域的通用组和全局组。但是无法包含其他组的域本地组
域本地组只能访问本域中的资源,无法访问其他不同域的资源。
比如一个域林中只有林根域有Enterprise Admins组(通用组),但是然后其他子域的域本地组Administrators会添加Enterprise Admins组,这样林根域的Enterprise Admins组用户就可以获取整个域林管理员权限
AdFind.exe -b "dc=hack-my,dc=com" -bit -f "(&(objectClass=group)(grouptype:AND:=4))" cn -dn
查询所有域本地组
常见的一些系统内置域本地组和权限如下
-
Administrators: 管理员组,该组的成员可以不受限制的访问所有域中资源。是域林中强大的服务管理组
-
Print Operators: 打印机操作组,该组的成员可以管理网络中的打印机,还可以在本地登录和关闭域控制器
-
Backup Operators: 备份操作员组,改组的成员可以在域控制器执行备份操作
-
Remote Desktop Users: 远程桌面登录组,只有改组的成员才有成员登录服务的权限
-
Accout Operators: 账号操作员组,改组的成员可以创建和管理该域中的用户和组
-
Server Opretors: 服务器操作组
通用组(Universal group)
通用组可以作用在域林的所有域,其成员可以是任何域中的用户,通用组和全局组。但是不能添加任何一个域的域本地组。
而且域管理员可以授予通用组任何域的资源访问权限,不需要考虑通用组所在的域。所以称之为Universal Group
AdFind.exe -b "dc=hack-my,dc=com" -bit -f "(&(objectClass=group)(groupType:AND:=8))" cn -dn
查询所有的通用组
系统常见的通用组:
-
Enterpirse Admins: 企业管理员组,一般是林根域的一个通用组,这个通用组被会添加进每个域的域本地组Administrators
-
Schema Admins: 架构管理员组,也是林根域的一个通用组,它可以修改活动目录。比如在架构分区添加一个类或者属性
全局组(Global group)
全局组也是作用域林的所有域,它介于域本地组和通用组之间。全局组只能包含本域的用户或者本域的其他全局组,也可以被其他的域本地组或者通用组嵌套。他也是可以访问任何域的资源。
注意:正是因为全局组只能包含本域的用户或者本域的全局组。所以其他域的成员不可能进入全局组,也就不可进入Domain Admins.所以没法称为其他域的域管理员。
常见的系统全局组:
-
Domain Admins: 域管理员组,该组的成员在所有的加入域的服务器中拥有完整权限。而且这个全局组会被加入域本地组的Administrators组,因此获得Administrators组的所有权限。并且还会默认写进计算机本地的Administrators组,也就说拥有所有域内计算机的控制权
-
Domain Users: 域成员组,域中所有成员都是这个组的,默认情况下,新建的用户都会添加到这里
-
Domain Computers: 域成员主机组,任何新建的计算机账号都是改组的成员
-
Domain Controllers: 域控制器组,改组的成员包含域中所有域控
-
Domain Guests: 域访客用户组
-
Group Policy Creator Owners: 组策略对象组,这里的成员可以修改组策略
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效