全网最全的Cobalt Strike使用教程-内网渗透之信息收集篇
一、前言
从本篇文章开始,斗哥将向大家详细的介绍cobalt Strike 这款工具在内网渗透中的具体使用方式,因为涉及的内容较多,大致会分为信息收集篇、横向渗透篇、域控攻击篇、权限维持篇,在本篇文章中将为大家介绍信息收集篇。
测试环境:
系统 |
服务 |
IP地址 |
kali |
外网VPS(teamserver) |
192.168.0.108 |
win2008 |
web服务器(边界服务器) |
192.168.0.109/1.1.1.10 |
win2012 |
域控(受害者) |
1.1.1.2 |
win7sp1 |
域内主机(受害者) |
1.1.1.23 |
m0n0wall |
防火墙 |
1.1.1.1/192.168.0.105 |
2.1 判断是否存在域
具体方式如下:
1、ipconfig /all
2、systeminfo
3、net config workstation
4、net time /domain
输入该命令可能存在如下三种情况:
●1.存在域,当前用户不是域用户。
●2.存在域,当前用户是域用户。
●3.不存在域。
通过shell net view /domain 查看当前域。
2.2 域内存活主机探测
1、利用netbios快速探测内网
工具:Nbtscan
使用方法:将该文件上传到目标机器上并执行 nbtscan.exe IP 即可
效果如下:
2、通过arp 扫描完整探测内网
方式一:工具:arp-scan
命令:arp.exe –t IP
效果如下:
方式二:通过ARPScan脚本
命令:
powershell-import
powershell Invoke-ARPScan -CIDR 1.1.1.0/24
效果如下:
3、利用常规 tcp / udp 端口扫描探测内网
工具:scanline
命令:
sl -h -t 22,80-89,110,389,445,3389,1099,1433,2049,6379,7001,8080,1521,3306,3389,5432 -u 53,161,137,139 -p 1.1.1.1-254 /b
效果如下:
可以通过判端口开放情况来确定域内存活主机情况。
2.3 域内基础信息收集
获取域内主机信息,命令如下:
1.net view
效果如下:
获取所在域的域名,命令如下:
net view /domain
在得到域名后,通过shell net view /domain:hacker 查看当前域内主机。
查询结果可以在 View->target中进行查看。
通过 net group “domain computers” /domain 命令可以查看域内计算机。
通过 shell nltest /domain_trusts 命令查看域信任关系。
通过 shell net accounts /domain 命令查看域内账号密码信息。
2.4 域内控制器的查找
通过如下命令查看当前域的域控制器。
1、 shell nltest /dclist:hacker
2、shell net time /domain
3、net group “Domain Controllers” /domain
4、netdom query pdc
2.5 定位域管理员工具
2.5.1 通过psloggedon.exe
该工具可以查看本地登录的用户和通过本地计算机或远程计算机的资源登录的用户。如果指定的是用户名而不是计算机名,该工具会搜索网上邻居中的计算机,并显示该用户当前是否已经登录。其原理是通过检查注册表 HKEY_USERS 项的 key 值 和 通过NetSessionEnum API 来枚举网络会话,但是该工具的某些功能需要管理员权限才能使用
参数:
●-l:仅显示本地登录,不显示本地和网络资源登录
●-x:不显示登录时间
●\计算机名:指定要列出登录信息的计算机的名称
●用户名:指定用户名,在网络中搜索该用户登录的计算机,该功能实现有问题。
效果如下:
1、获取本地及远程登录的计算机名称。
2、获取指定计算机名的用户。
3、获取指定用户登录的计算机。
2.5.2 通过PVEFindADUser.exe
该工具可用于查找活动目录用户登录的位置,枚举域用户,以及查找在特定计算机上登录的用户,包括 本地用户,通过RDP登录的用户、用于运行服务和计划任务的用户。该工具的运行不需要管理员权限, 只需要普通域用户即可。
参数:
●-h:显示帮助信息
●-u:检查程序是否有新版本
●-current :如果仅指定了-current参数,将获取目标计算机上当前登录的所有用户。如果指定了用户名,则显示该用户登录的计算机
●-last:如果仅制定了-last参数,将获取目标计算机的最后一个登录用户。如果指定了用户名,则显 示此用户上次登录的计算机。根据网络的安全策略,可能会隐藏最后一个登录用户的用户名,此时 使用该工具可能无法得到该用户名。
●-noping:阻止该工具在尝试获取用户登录信息之前对目标计算机执行ping命令
●-target:可选参数,用于指定要查询的主机。如果未指定此参数,将查询当前域中的所有主机。如果指定了此参数,则后跟一个由逗号分隔的主机名列表,此功能实现由问题。
效果如下:
1、查询所有主机当前的登录用户。
直接运行 pveadfinduser.exe -current ,则可显示域中所有计算机上当前登录的所有用户。查询结果将 被输出到 report.csv文件中。
2、查询指定用户当前登录的主机。
shell PVEFindADUser.exe -current hacker\administrator
3、查询指定主机当前的登录用户。
shell PVEFindADUser.exe -current -target DC
2.5.3 通过PowerSploit的PowerView
PowerView.ps1脚本的Invoke-StealthUserHunter和Invoke-UserHunter函数。
●Invoke-UserHunter:找到域内特定的用户群,接收用户名、用户列表和域组查询,接收一个主机 列表或查询可用的主机域名。它可以使用Get-NetSessions和Get-NetLoggedon扫描每台服务器并 对扫描结果进行比较,从而找到目标用户集,不需要管理员权限。
●Invoke-StealthUserHunter:只需要进行一次查询,就可以获取域内的所有用户。该函数从 user.HomeDirectories 中提取所有用户,并对每台服务器进行Get-NetSessions获取。因为不需 要使用Invoke-UserHunter对每台机器进行操作,所以这个方法的隐蔽性相对较高,但是扫描结果 不一定全面。PowerView默认使用Invoke-StealthUserHunter,如果找不到需要的信息,就使用 Invoke-UserHunter。
执行以下命令可用于定位指定域用户登录的主机和查看指定主机当前的登录用户。但是值得说明的是,查看指定主机当前登录的用户这个功能并不好用,仅仅能列出当前主机登录的用户,枚举其他主机时不显示。
powershell-import
powershell Invoke-UserHunter
5.1.5.4 通过NetSess工具
netsess.exe的原理也是调用NetSessionEnum API,并且无需管理员权限。
命令如下:
netsess.exe -h 机器名
还有其他很多方式,这里就不一一列举了。
2.6 查找域管理进程
当计算机加入到域后,默认将”Domain Admin”组赋予了本地系统管理员的权限。也就是说,在计算机添加到域,成为域的成员主机的过程中,系统将会自动把”Domain Admin”域组添加到本地的Administrators组中。因此,只要是Domain Admin组的成员均可访问本地计算机,而且具备”完全控制”的权限。
因此对于渗透测试人员来说,把”Domain Admin”域组添加到本地的Administrators组中是他们模拟域管理员帐户操作的常用方式。不过前提是,他们需要知道这些进程正在运行的系统。在本文中,五种寻找 “Domain Admin” 运行的进程的方法,其中涉及的技术包括:
1.本地检查;
2.查询活动域用户会话的域控制器;
3.扫描运行任务的远程系统;
4.扫描NETBIOS协议信息的远程系统。
2.6.1 本地检查
首先检查最初被破坏的系统,如果你已经存在于域管理进程中,那么在网络上运行真的没什么意义了。以下是使用本机命令检查是否有任何域管理进程正在运行的简单方法:
1、运行以下命令获取域控制器列表。
shell net group 'Domain Controllers' /domain
2、运行以下命令以获取域管理员列表。
shell net group 'Domain Admins' /domain
3、运行以下命令列出进程和进程用户,运行该过程的帐户应该在第7列。
shell Tasklist /v
也可以直接通过CS模块查看进程列表。
4、将任务列表与域管理员列表交叉引用,查看你是否进入域管理进程中
如果域管理进程始终是在最初受到攻击的系统上运行,那就太好了,但这属于理想的情况所以接下来的几种技术将帮助你在各种情况下的远程域系统上找到域管理进程。
2.6.2 查询域控制器的活动域用户会话
这项技术是安全公司Netspi的原创技术。我们需要一种用来识别活动的域管理进程和登录,而不是在整个网络上执行shell喷洒或执行任何会引发“入侵检测系统”的扫描。最终,我发现只需简单地查询以获取一个活动域用户会话列表即可,然后将该列表与域管理列表交叉引用。唯一可能出现问题的环节,就是你必须查询所有的域控制器。下面是我提供的一些基本步骤,以获得具有域用户权限的活动域管理会话的系统列表。
1、使用LDAP查询或net命令从“域控制器”OU中收集域控制器的列表,以下是我用过的一个net命令:
net group “Domain Controllers” /domain
请注意:虽然OU是域控制器列表的最佳来源,但前提是,你要对受信任域完成枚举并监控这些域控制器的过程。或者,你可以通过DNS查找它们:Nslookup –type=SRV _ldap._tcp.
2、使用LDAP查询或net命令从“域管理员”组中收集域管理员的列表。以下是我用过的一个net命令:
net group “Domain Admins” /domain
3、通过使用Netsess.exe查询每个域控制器,收集所有活动域会话的列表。Netsess工具是Joe Richards提供的一个很棒的工具,它里面包含了本地Windows函数“netsession enum”。该函数可以返回活动会话的IP地址、域帐户、会话启动时间和空闲时间。以下是我用过的一个net命令:
shell netsess.exe -h dc
4、将Domain Admin列表与活动会话列表交叉引用,以确定哪些IP地址上有活动的域令牌。在更安全的环境中,你可能需要等待具有域管理员权限的域管理员或服务帐户在网络上执行此操作。下面是一个使用netsess的非常快速和具有攻击力的Windows命令行脚本。
FOR /F %i in (dcs.txt) do @echo [ ] Querying DC %i && @netsess -h %i 2>nul > sessions.txt && FOR /F %a in (admins.txt) DO @type sessions.txt | @findstr /I %a
2.6.3 扫描NetBIOS信息的远程系统
某些版本的Windows操作系统允许用户通过NetBIOS查询已登录用户,下面这个命令就用于扫描远程系统中的管理会话。将目标域内主机ip保存为ips.txt文件,域管理员保存为admins.txt文件。
for /F %i in (ips.txt) do @echo [ ] Checking %i && nbtstat -A %i 2>NUL >res.txt && FOR /F %n in (admins.txt) DO @type res.txt | findstr /I %n > NUL && echo [!] %n w
2.6.4 查询远程系统中运行的任务
如果目标机器在域系统中是通过共享的本地管理员账号运行的,就可以使用下列脚本来查询系统中的域管理任务。将目标域内主机ip保存为ips.txt文件,域管理员保存为admins.txt文件。
FOR /F %i in (ips.txt) DO @echo [ ] %i && @tasklist /v /S %i /U user /P password 2 > NUL > output.txt && FOR /F %n in (admins.txt) Do @Type output.txt | findstr %n > NUL && echo [!] %n was found running a process on %i && pause
2.7 通过PowerView模块
PowerView是由Will Schroeder开发的PowerShell脚本,属于PowerSploit框架和Empire的一部分。该脚本完全依赖于PowerShell和WMI(Windows Management Instrumentation)查询。
下载地址:PowerTools/PowerView at master · PowerShellEmpire/PowerTools · GitHub
使用前需要进行导入,命令如下:
powershell-import
导入以后就可以执行命令进行域内信息收集了,常用命令如下表所示,具体命令使用可以查阅官方手册。
下面演示其中几个命令的使用,其他命令的使用方式与之类似,大家可以自行尝试。
2.7.1 Get-Domain
该命令可以获取域的信息。
2.7.2 Get-DomainController
该命令可以查看域控信息。
2.7.3 Get-DomainComputer
该命令可以查看域内主机。
2.7.4 Get-NetLocalGroup
该命令可以查看本地组。
2.7.5 Invoke-ShareFinder
该命令可以查看域内共享。
2.8 判断当前用户
2.8.1 判断当前域用户是否是域内主机的超管
因为普通域用户在进行一些高级别操作的配置时通常是需要域管理员的账号和密码,这是很不方便的。因此有的时候就会将普通的域用户增加到目标主机的超级管理员组,那么再做配置的时候就不需要域的超级管理员账号和密码。
可以通过下面的方式进行判断:
1、通过net view 查看域内主机。
2、通过shell dir \\目标机器名\C$查看是否能够成功访问。
这里以WIN7-SP为例。
shell dir \\WIN7-SP\C$
可以看到成功访问到了WIN7-SP的C盘。
现在再来看看能不能成功访问域控DC的C盘。
可以看到权限不够,说明本机用户是WIN7-SP的本地超级管理员。
我们也可以通过powershell脚本查询WIN7-SP的信息,命令如下。
powershell Get-NetLocalGroup -HostName WIN7-SP
也可以通过如下命令查看登录过目标主机的用户。
shell dir /S /B \\WIN7-SP\c$\Users\ > user.txt
2.8.2 判断当前域用户是否是域管理员名
1、查看enterprise admins组内用户,命令如下:
shell net group 'enterprise admins' /domain
2、查看domain admins组内用户,命令如下:
shell net group 'domain admins' /domain
3、查看本地管理员组内用户,命令如下:
shell net localgroup 'administrators' /domain
在本篇文章中,斗哥为大家介绍了内网信息收集的一些方式,在下一篇文章中,斗哥将继续为大家介绍在进行信息收集后,我们该如何获取用户的凭证信息进行横向渗透。
1、《内网安全攻防渗透测试实战指南》
2、CobaltStrike的使用
作者:C1ay,转载于国科漏洞社区。