内网渗透体系建设-信息搜集
信息搜集
当渗透测试人员通过 Web 渗透或其他方式获得服务器主机的权限后,需要以该主机为跳板,对其内网环境进行渗透。对于攻陷的第一台主机,其在内网中所处的网络位置当前登录的用户、该用户有什么样的权限、其操作系统信息、网络配置信息及当前运行的进程信息等都是未知的,这就需要测试人员以当前主机为中心进行信息收集。
本机基础信息搜集
查看当前用户、权限
|
查看当前用户以及当前用户所处的用户组、所拥有的特权等信息,测试
人员可以对当前用户所拥有的特权有一个大致的了解,并综合判断是否需要提升权限。
查看网络配置信息
|
查看当前主机的网络配置情况,包括主机的IP 地址、主机名、各网络适配器的信息可以从中判断出当前主机所处的内网网段
查看主机路由信息
|
在路由表中的“网络目标”都是主机可以直接访问到的,测试人员在后续的横向渗透中可以尝试探测相关地址段的存活主机。
查看操作系统信息
|
查看端口连接信息
|
这里可以看到有哪些外部主机与本机建立连接,从这里可以收集内网地址段的信息,如果有内网主机连接就会显示地址信息,我这里连个百度网站来看看外部地址的变化
查看当前会话列表
|
查看当前主机与所连接的客户端主机之间的会话,我这里还没有建立连接
查看当前网络共享信息
|
查看当前主机与其他主机远程建立的网络共享连接
查看当前进程信息
|
|
该命令可以i查询主机进程信息,并过滤出进程的路径、名称和PID
WMIC 是微软为 Windows管理规范(Windows Management Instrumentation,WMI)提供的一个命令行工具,提供从命令行接口和批处理脚本执行系统管理的支持。
|
该命令可以查看指定进程的路径信息
查看当前服务信息
|
该命令查看当前所有服务的信息,并过滤出服务的名称、路径、创建时间、运行状态信息。
|
查看指定服务的信息,并过滤出服务名称、路径和运行状态
查看计划任务信息
|
该命令查看当前主机上所有的计划任务
查看自启程序信息
|
该命令查看当前主机上所有的自启程序信息,并过滤出程序名称、所执行的命令、程序的路径所属用户
查看系统补丁安装信息
|
查看当前主机安装的补丁列表,并过滤出补丁链接、名称、描述、补丁编号以及安装时间;通常,测试人员可以根据目标主机的操作系统版本和缺少的补丁来辅助后面的提权操作。
查看应用安装信息
|
查看本地用户/组信息
|
|
可以看到,本地管理员组中除了本地管理员 Administrator,还包含域全局组clown,其在该主机加入域时自动被添加到计算机本地Administrators 组中,所以Domain Admins 组拥有该计算机的管理权限,那么我们就可以创建一个新的本地用户加入到本地管理员组
|
查看当前登陆用户
|
域内信息搜集
判断是否存在域环境
|
查看当前工作站的信息,包括当前计算机名、用户名、系统版本、工作站、登录的域等
查看域用户信息
|
|
|
注意,只有域用户才有权限执行域内查询操作。而计算机本地用户除非提升为本地系统权限,否则只能查询本机信息,无法查询域内信息并提示“拒绝访问”。这是因为,在域环境中,所有与域有关的查询都需要通过域控制器来实现,并且需要经过Kerberos协议进行认证。
查看域用户组信息
|
还可以通过上面的信息来指定用户组来查询详细信息
|
|
下面是一些常见组
域组名称 | 说明 |
---|---|
Domain Admins | 域管理员组,包括所有的域管理员用户 |
Domain Computers | 域成员主机组,包括加入域的所有工作站和服务器 |
Domain Controllers | 域控制器组,包括域中的所有域控制器 |
Domain Guests | 域来宾组,包括域中所有的来宾用户 |
Domain Users | 域用户组,包括所有域用户 |
Enterprise Admins | 企业系统管理员组,适用于域林范围 |
在默认情况下,Domain Admins 组和Enterprise Admins 组中的用户对域内所有域控制器和域成员主机拥有完全控制权限。Enterprise Admins 组是一个通用组,是域林的根域中的一个组,并且其中的成员对域林中的所有域拥有完全控制权限而 Domain Admins 组是一个全局组,只对本域拥有完全控制权限。
查看域内密码策略
|
查看域控制器列表
|
|
查看主域控制器
|
在域环境中,主域控制器会同时被用作时间服务器,使得域中所有计算机的时钟同步。执行以下命令,通过查询时间服务器来找到主域控制器的名称。
定位域控制器
|
通过上面知道目标主机的主机名后,可以直接对主机名执行ping命令,根据执行返回的内容即可得知目标主机在内网中的IP地址。
除此之外,域控制器往往会被用作DNS服务器,所以找到当前主机的DNS服务器地址也可以定位域控。
查看信任关系
|
域信任用于多域环境中的跨域资源的共享。一般情况下,一个域的用户只能访问本域内的资源,无法访问其他域的资源,而要想不同域之间实现互访就需要建立域信任。
内网资源探测
在内网渗透中,测试人员往往需要通过各种内网扫描技术来探测内网资源的情况,为后续的横向渗透做准备,通常需要发现内网存活的主机,并探测主机的操作系统、主机开放了哪些端口、端口上运行了哪些服务、服务的当前版本是否存在已知漏洞等信息。这些信息可以帮助测试人员发现内网的薄弱资源,确定后续的攻击方向。
发现内网存活主机
渗透测试中可以根据主机情况,上传工具进行主机存货探测,也可以借助内网代理或者路由转发对目标主机所处的局域网进行探测。
基于ICMP发现存活主机
ping命令就是利用ICMP数据报来确认主机是否存活,下面命令可以循环探测整个局域网C段中存活的主机
|
|
基于 NetBIOS(网络基本输入/输出系统)协议发现存活主机
NetBIOS 提供 OSI/RM的会话层(在TCP/IP模型中包含在应用层中)服务,让不同计算机上运行的不同程序可以在局域网中互相连接和共享数据。
NetBIOS 的工作流程就是正常的机器名解析、查询、应答的过程。在 Windows 中,默认安装 TCP/IP 后会自动安装 NetBIOS。
在实际利用时,向局域网的每个IP地址发送NetBIOS状态查询,可以获得主机名MAC 地址等信息。
NBTScan 是一款用于扫描 Windows 网络上NetBIOS 名称的程序,用于发现内网中存活的 Windows 主机。NBTScan 可以对给定IP范围内的每个IP地址发送 NetBIOS 状态查询,并且以易读的表格列出接收到的信息,对于每个响应的主机,会列出它的IP地址NetBIOS计算机名、登录用户名和MAC地址。工具地址:http://www.unixwiz.net/tools/nbtscan.html
将工具上传到主机之后执行下面命令
|
基于UDP发现存活主机
在实际利用中,可以将一个空的UDP报文发送到目标主机的特定端口,如果目标主机的端口是关闭的,UDP探测就马上得到一个ICMP端口无法到达的回应报文,这意味着该主机正在运行。如果到达一个开放的端口,大部分服务仅仅忽略这个空报文而不做任何回应。
Unicornscan 是Kali Linux平台的一款信息收集工具,提供了网络扫描功能。执行以下命令,通过 UDP协议扫描内网的存活主机
|
基于ARP发现存活主机
在实际利用中,可以向网络发送一个ARP请求,若目标主机处于活跃状态,则其一定会回应一个 ARP 响应,否则不会做出任何回应。
- 利用ARP-Scan
ARP-Scan 是一款快速、便捷的内网扫描工具,利用 ARP 发现内网中存活的主机。将工具上传到目标主机,执行以下命令,即可扫描内网中存活的主机。
|
- 利用powershell
Empire 渗透框架的 Invoke-ARPScan.psl脚本可利用 ARP发现内网存活主机,工具地址:https://github.com/EmpireProject/Empire。(暂时不会用,因为没找到powershell脚本,好像是已经取消了,把使用命令放这)使用时,需要将脚本导入执行:
|
基于 SMB(Server Message Block,服务器消息块)协议发现存活主机
SMB 又称为网络文件共享系统(CommonInternetFileSystem,CIFS)协议,是一种应用层传输协议,主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通信等资源。CIFS 消息一般使用 NetBIOS 或 TCP 发送,分别使用139或 445 端口目前倾向于使用 445 端口。
在实际利用中,可以探测局域网中存在的SMB 服务,从而发现内网的存活主机,多适用于 Windows 主机的发现。
CrackMapExec(简称CME)是一款十分强大的后渗透利用工具,在KaliLinux上可以直接使用 apt-get命令进行安装。CrackMapExec能够枚举登录用户、枚举SMB服务列表、执行 WINRM 攻击等功能,可以帮助测试人员自动化评估大型域网络的安全性.
|
我的kali不在同一个网络检测不了,检测出来的效果如下:
内网端口扫描
端口扫描就是用于探测主机开启了哪些服务,从而查找相应的漏洞进行攻击
利用Telnet探测端口
Telnet 是进行远程登录的标准协议和主要方式,为用户提供了在本地计算机上完成远程主机工作的能力。telnet命令可以简单测试指定的端口号是正常打开还是关闭状态。
|
利用nmap进行端口扫描
Nmap 是一个十分强大的端口扫描工具,在实际利用中可以借助内网代理对内网主机进行端口扫描。nmap的使用需要好好去学习,到时查查资料学习。
下面是一些常用的扫描命令:
|
|
利用PowerShell进行端口扫描
NiShang 是基于PowerShell 的渗透测试专用框架,集成了各种脚本和Payload,广泛用于渗透测试的各阶段。
NiShang 的 Scan 模块中也有一个 Invoke-PortsCan.ps1 脚本,可以用来对主机进行端口扫描,工具地址:https://github.com/samratashok/nishang。
执行下面命令对内网的一个主机范围执行默认的端口扫描,这里要先用管理员权限修改成可以执行脚本策略,然后导入模块再使用
|
利用MetaSploit探测内网
MetaSploit 渗透框架中内置了几款资源收集模块,可用于发现内网存活主机、探测内网服务、对目标主机进行端口扫描,如图:
获取端口Banner信息
Banner 中可能包含一些敏感信息。通过查看端口的Banner,测试人员往往可以获取软件开发商、软件名称、服务类型、版本号等信息,根据不同的服务,可以制订不同的攻击方案,而服务的版本号有时会存在公开的漏洞可以被利用。
利用NetCat获取端口Banner
Netcat 是一款常用的测试工具和黑客工具,使用 NetCat 可以轻易建立任何连接,具有“瑞士军刀”的美誉。
通过-nv选项可以在连接端口时获取该端口的Banner信息
nc -nv <IP> <Port>
利用Telnet获取端口Banner
如果目标端口开放,使用Telnet连接后,也会返回相应的Banner信息.
telnet <IP> <Port>
利用Nmap获取端口Banner
在Nmap中指定脚本**–script=banner**就可以在扫描中获取端口的banner信息
nmap --script=banner -p <Ports> <IP>
用户凭据收集
在内网渗透中,当测试人员获取某台机器的控制权后,会以被攻陷的主机为跳板进行横向渗透,进一步扩大所掌控的资源范围。但是横向渗透中的很多攻击方法都需要先获取到域内用户的密码或哈希值才能进行,如哈希传递攻击、票据传递攻击等。所以在进行信息收集时,要尽可能收集域内用户的登录凭据等信息
获取域内单机密码和哈希值
在 Windows中,SAM文件是 Windows用户的账户数据库,位于系统的%SystemRoot%System32\Config 目录中,所有本地用户的用户名、密码哈希值等信息都存储在这个文件中。用户输入密码登录时,用户输入的明文密码被转换为哈希值,然后与SAM文件中的哈希值对比,若相同,则认证成功。
lsass.exe是Windows的一个系统进程,用于实现系统的安全机制,主要用于本地安全和登录策略。在通常情况下,用户输入密码登录后,登录的域名、用户名和登录凭据等信息会存储在lsass.exe的进程空间中,用户的明文密码经过 WDigest和 Tspkg模块调用后,会对其使用可逆的算法进行加密并存储在内存中。
用来获取主机的用户密码和哈希值的工具有很多,这些工具大多是通过读取 SAM 文件或者访问 lsass.exe 进程的内存数据等操作实现的。这些操作大多需要管理员权限,这意味着需要配合一些提权操作。
下面利用Mimikatz工具来进行学习,Mimikatz是一款功能强大的凭据转储开源程序,可以帮助测试人员提升进程权限、注入进程、读取进程内存等,广泛用于内网渗透测试领域
在线读取lsass进程内存
将mimikatz上传到主机执行下面命令
|
可直接从lsass.exe进程的内存中读取当前已登录用户的凭据
不过我这里失败了不知道为什么,成功的话应该是下面这样
后来试了一下需要管理员权限,那应该是提权之后的事情了这一步
离线读取lsass内存文件
除了在线读取,也可以直接将Isass.exe的进程内存转储,将内存文件导出到本地后使用 Mimikatz 进行离线读取。用于转储进程内存的工具有很多,如 OutMinidump.ps1、Procdump、SharpDump等,甚至可以手动加载系统自带的comsvcs.dll 来实现内存转储。
这里用微软官方提供的Procdump工具,首先要在主机上传该程序,然后执行下面命令
|
然后再执行下面命令:
|
注意,为了防止用户的明文密码在内存中泄露,微软在2014年5月发布了KB2871997补丁,关闭了 WDigest 功能,禁止从内存中获取明文密码,且 Windows Server 2012 及以上版本默认关闭 WDigest 功能。但是测试人员通过修改注册表,可以重新开启 WDigest功能,当用户注销或者重新登录后,就可以重新获取到用户的明文密码。
|
在线读取SAM文件
|
读取 SAM 文件中保存的用户登录凭据,可以导出当前系统中所有本
地用户的哈希值。
离线读取SAM文件
离线读取就是将SAM文件导出,再用mimikatz来读取。不过为了提高 SAM 文件的安全性以防止离线破解,Windows 会对 SAM 文件使用密钥进行加密,这个密钥存储在 SYSTEM 文件中,与 SAM 文件位于相同目录下。
因为系统在运行时,这两个文件是被锁定的,所以需要借助一些工具来实现,而PowerSploit 项目中提供的Invoke-NinjaCopy.ps1脚本可以完成这项工作
|
此外如果能够提权,测试人员可以直接读取SAM和SYSTEM
还可以在管理员权限下通过保存注册表的方式导出
|
然后将导出的两个文件使用mimikatz加载并读取sam中的用户凭据信息
|
获取常见应用软件凭据
为了扩大可访问的范围,测试人员通常会搜索各种常见的密码存储位置,以获取用户凭据。一些特定的应用程序可以存储密码,以方便用户管理和维护,如Xmanager、TeamViewer、FileZilla、NaviCat和各种浏览器等。通过对保存的用户凭据进行导出和解密,测试人员通常可以获取登录内网服务器和各种管理后台的账号密码,可以通过它们进行横向移动和访问受限资源。
获取RDP保存的凭据
为了避免每次连接服务器都进行身份验证,经常使用RDP远程桌面连接远程服务器的用户可能勾选保存连接凭据,以便进行快速的身份验证。这些凭据都使用数据保护API以加密形式存储在 Windows 的凭据管理器中,路径为%USERPROFILE%\AppData\LocalMicrosoft\Credentials
%USERPROFILE%即为C:\Users<用户名>
下面命令可以查看当前主机上保存的所有连接凭据
|
我这里没有凭据所以就借助书中的图来记录,我们可以看到两个历史凭据
然后用mimikatz来导出指定RDP连接凭据,执行下面命令解析连接凭据
|
上图中得到的 pbData就是凭据的加密数据,guidMasterKey 是该凭据的 GUID,记录 guidMasterKey 的值。然后执行以下命令:
|
找到与 guidMasterKey(GUID)相关联的MasterKey,这个MasterKey就是加密凭据所使用的密钥。
记录结果中的MasterKey值,最后执行下面命令:
|
最后成功解密得到RDP明文凭据
获取Xshell保存的凭据
Xshell 会将服务器连接信息保存在Session目录下的.xsh 文件中,路径如表 如下图。如果用户在连接时勾选了“记住用户名/密码”,该文件会保存远程服务器连接的用户名和经过加密后的密码。
Xshell 7 前的版本,测试人员可以直接通过 SharpDecryptPwd 工具进行解密,包括Navicat、TeamViewer、FileZilla、WinSCP和Xmangager 系列产品,工具地址:https://github.com/uknowsec/SharpDecryptPwd
将工具上传到主机,执行下面命令可以直接获取Xshell保存的所有连接凭据
|
Xshell 7后的版本,Session目录中不再存储用户密码,用上述方法获取的密码为一串乱码,只能使用星号密码查看器直接查看密码.
获取FileZilla保存的凭据
FileZilla 是一款快速的、可依赖的、开源的 FTP 客户端软件,具备大多数 FTP 软件功能。FileZila会将所有FTP登录凭据以Base64密文的格式保存在%USERPROFILE%\AppData\Roaming\FileZilla\recentservers.xml文件中,如图所示。
由图可知
使用SharpDecryptPwd执行下面命令可以一键导出FileZilla保存的FTP登录凭据
|
获取NaviCat保存的凭据
用户连接数据库时,需要填写相关信息,如IP、用户名、密码等。用户选择保存密码(默认勾选)后,Navicat将把这些信息保存到注册表中,具体路径如下表
数据库类型 | 凭据存储路径(注册表) |
---|---|
Mysql | HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers\< Connetion Name> |
MariaDB | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMARIADB\Servers\< Connetion Name> |
MongoDB | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMONGODB\Servers\< Connetion Name> |
SQL SERVER | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMSSQL\Servers\< Connetion Name> |
Oracle | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatOra\Servers\< Connetion Name> |
PostgreSQL | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPG\Servers\< Connetion Name> |
SQLite | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatSQLite\Servers\< Connetion Name> |
数据库的连接记录中的Pwd键的值为经过Navicat<=11版本算法加密过后的密码,可以在网上搜索解密脚本解出。
也可以直接使用 Navicat 导出所有连接,将生成connections.ncx 文件,保存所有连接记录。其中,“Password”对应的值即使用 Navicat>=12 版本算法加密过后的密码,再对其进行解密。
下面命令可以一键导出当前主机上用户连接过的所有数据库的登录凭据
|
获取浏览器保存的登陆凭据
Web 浏览器通常会保存网站用户名和密码等凭据,以避免多次手动输入。通常,用户的凭据以加密格式存储在本地文件中,测试人员可以通过读取特定的文件,从Web 浏览器中获取凭据。
HackBrowserData 是一款开源工具,可以直接从浏览器解密数据包括用户登录密码书签、Cookie、历史记录、信用卡、下载链接等,支持流行的浏览器,可在 Windows、macOS 和 Linux平台上运行,工具地址:https://github.com/moonD4rk/HackBrowserData
只需将 HackBrowserData 上传到目标主机,然后直接运行即可,执行完毕后,会在当前目录下生成一个 result 目录,包含当前主机中已安装的所有浏览器保存的用户登录密码、浏览器书签、Cookie、历史记录等信息的 CSV 文件。
用excel打开就可以看到解密出来的所有登陆凭据
获取WinSCP保留的登陆凭据
WinSCP是Windows环境下使用SSH的开源图形化SFTP 工具客户端。在使用SFTP连接时,如果勾选了“保存密码”,WinSCP就会将密码保存在WinSCP.ini文件下。Winscppwd工具则可以进行解密。