信息收集中的一项重要工作是发现内网中的主机、数据库、IP段网络设备、安全设备等资产,以便于更快地获取更多权限和密码,更加接近红队的目标资产。在控制的入口点权限不足的情况下,如果补丁更新较多,不能进行提权或提权会影响主机稳定性,就不便于我们对当前计算机进行详细的主机信息收集。发现更多主机的优势在于,我们能够以入口点计算机作为跳板机,发现更多的内网主机,获取其他计算机权限,收集更多密码,以滚雪球式地获得战果。常见的主机发现方法有网络连接、路由表、常见IP段、ARP记录、NetBIOS扫描、ICMP、TCP/UDP、HTTP(S)、DNS缓存等。
在进行内网主机发现时,使用系统自带命令或软件可以减少在目标磁盘落地二进制文件,减少EDR的监测及拦截。如在Windows主机中可以使用VBS、PowerShell等进行探测,但是由于现在安全软件对PowerShell监控较严格,可以使用直接将C#加载到内存的方式,减少二进制文件落地。
1.利用ICMP发现主机
ICMP探测的优势在于系统自带,内网中终端设备一般会将该协议放行,并且安全设备的默认策略不对该协议进行安全分析。常见的ICMP探测方法是使用ping命令,可以配合使用for循环,慢速探测整个C段存活情况。可以使用for /l %i in(1, 1, 255)do @ping 192.168.3.%i-w 1-n 1|find/i“ttl”命令匹配返回字符串“ttl”,探测当前C段内的所有存活主机,如图2-1所示。
图2-1 使用命令探测一个C段内的所有存活主机
2.利用ARP发现主机
在利用ARP(Address Resolution Protocol,地址解析协议)发现主机时,可以利用arp-scan工具来发现主机,该工具会遍历预设的IP段并发送ARP请求,如果主机回复,则会返回主机IP和MAC地址。如果使用ARP扫描,尽量不要指定过大的扫描范围,否则会引起大量告警,导致权限丢失。可以执行命令arp-scan.exe-t cidr(cidr表示网段,此处指192.168.3.1/24),如图2-2所示。此外,ARP扫描工具还有netdiscover、Invoke-ARPScan.ps1、Empire等。
图2-2 利用ARP发现主机
3.利用NetBIOS协议发现主机
在实际应用中,NetBIOS协议对各种IDS(入侵检测系统)、IPS(入侵防御系统)、杀毒软件的规避效果比其他协议更好,因为利用NetBIOS是正常的机器名解析查询应答的过程,推荐优先使用。NetBIOS通常被称为Windows网络邻居协议,是一种局域网程序可以使用的应用程序编程接口(API),为应用程序提供了请求低级服务的统一命令集,作用是为局域网提供网络以及其他特殊功能。NetBIOS名也是计算机的标识名,该名字主要用于局域网中计算机之间的相互访问。NBNS协议是TCP/IP上的NetBIOS(NetBT)协议族的一部分,它在基于NetBIOS名称访问的网络上提供主机名和地址映射方法。nbtscan是一个命令行工具,用于扫描本地或远程TCP/IP网络上的开放NetBIOS名称服务器。nbtscan有Windows和Linux两个版本,体积都很小,且不需要特殊的库或DLL。如果主机存活,则发送NBNS消息查询对方主机名,输入命令nbtscan.exe cidr(此处cidr为192.168.3.1/24),如图2-3所示。
图2-3 使用nbtscan工具发现主机
显示结果的第一列为IP地址,第二列是计算机名和域名,最后一列是计算机所开服务的列表,具体参数的含义如表2-1所示。
表2-1 计算机所开服务的参数说明
如果使用nbtscan.exe批量扫描,会发送大量请求,导致安全设备告警,并且该工具需要落地磁盘,而这会增加被发现风险。可以使用Windows自带命令nbtstat指定IP识别信息,输入命令nbtstat -A 192.168.3.58,如图2-4所示。
图2-4 指定IP识别信息
4.利用TCP/UDP发现主机
基于TCP/UDP探测,利用端口扫描技术能探测出一些存活主机,但是主动探测大量端口可能会触发安全设备告警,建议每次在尽量小的范围(如一个C段)内单线程扫描单端口,并且在扫描每个IP中间增加适当延迟,伪造成正常业务请求来逃避安全设备的识别。下面介绍两款端口扫描工具:PortCheck和scanline。
(1)PortCheck
PortCheck是一款小众的端口扫描工具,没有反病毒软件认为它是恶意软件,甚至它也不被认为是黑客工具,如图2-5所示。
我们利用PortCheck工具和for循环,批量低速扫描一个C段内的单端口,并将结果保存,输入命令:for/L%I in(1,1,255)do@portcheck.exe-w:6 192.168.3.%I 445 200 c:\success.log,如图2-6所示。
图2-5 PortCheck工具在VirusTotal病毒分析引擎检测结果
图2-6 批量低速扫描一个C段内的单端口
其中使用的参数及其作用如表2-2所示。
表2-2 PortCheck参数说明
(2)scanline
也可以使用另一款工具——scanline。它是一款经典而古老的端口扫描工具,它支持banner获取,Windows全版本通用、依赖少、体积小、单文件,便于上传,同时支持对TCP/UDP的端口扫描。scanline的最大优势在于,在进行单端口扫描时,可以对需要扫描的IP段进行随机扫描,避免顺序扫描触发规则,引起告警。但是它的免杀效果一般,很多反病毒软件将其识别为恶意黑客软件,可能会发出告警。可以采取相应的免杀策略绕过。常用参数如表2-3所示,输入命令可以扫描常见TCP/UDP端口:sl -bh -t 21-23, 25, 53, 80-90, 110, 389, 443, 445, 1099, 1433, 1521, 3306, 3389, 6379, 7001, 8080-8090, 8443 192.168.3.1-254-u 53, 161-c 5000-d 6-r-p-z-O c:\scan.log,如图2-7所示。
表2-3 scanline参数说明
图2-7 扫描一个C段内的指定端口
5.利用DNS协议发现主机
大型企业内部均有DNS服务器,用于解析内网域名地址、审计与转发内部主机的DNS请求、降低内网域名解析流量。我们如果得到了内部的DNS服务器地址,也就是NS记录,一般会通过DHCP自动分配。可以指定内网中的DNS服务器,然后以目标域名为规则逐个解析常见生产力系统域名的二级域名,这样就能够发现大量内部业务及IP段。
1)Invoke-DNSDiscovery.ps1可用于识别内部网络/Windows域上的常用二级域名列表,此脚本可用于在突破边界后进行内部DNS侦察。这个脚本内置了大量常见二级域名,可以执行命令Invoke-DNSDiscovery -Namelist name.txt -Path dns_short.csv将存在的域名保存到dns_short.csv中(见图2-8),也可以使用-Namelist names.txt语法自定义二级域名。
2)gobusterdns是爆破二级域名工具gobuster的精简版,该工具只用于子域名爆破,支持自定义DNS服务器运行,内置精简字典,可导入域名列表进行扫描。可以执行命令gobusterdns_linux-d dm.org-r 192.168.79.5:53-i-q,如图2-9所示。
图2-8 自定义二级域名
图2-9 指定DNS服务器发现资产
6.利用RPC协议发现主机程序
为了更便捷地进行内网信息收集,我们使用RPCSCAN以无须经过身份认证来访问目标的135端口并获取目标的RPC map,然后通过解析RPC map中的UUID判断目标主机可能存在的进程(许多进程会在RPC map中注册RPC服务,类似360.exe),还可以通过相关进程判断远程主机可能开放的端口。整个过程只需要向目标的135端口发送十几个流量包,在网络与主机层的特征和动静比较小,方便隐秘渗透。在本案例中,我们先使用Cobalt Strike控制目标主机来加载RPCSCAN脚本(见图2-10),随后执行rpcscan 172.16.178.0/24命令来使用RPCSCAN匿名探测远程C段主机信息,探测结果如图2-11所示。
在主机发现时,如果使用扫描技术,在扫描的时候应尽量避免使用namp等工具暴力扫描,因为这样容易触发安全设备告警,导致权限丢失。最开始可以对入口点机器进行分析,得出已经存在的资产IP,从而确定更多IP段。如对网络连接、路由表、特殊行业常见IP段、DNS缓存、HOSTS等进行分析,可以得到更多的IP。通过执行netstat-ano命令来查看网络连接,发现更多IP,如图2-12所示。
图2-10 使用Cobalt Strike加载RPCSCAN脚本
图2-11 使用RPCSCAN匿名探测远程C段主机信息的结果
图2-12 查看网络连接
1.利用Browser机制探测存活主机
SMB协议提供了Browsing机制,客户端可以利用该机制访问网络中的计算机列表。在SMB协议中,经常通过广播的方式来获取当前的网络资源,但这会消耗大量的网络资源。而Browsing机制提供一个计算机列表,每当一台计算机在网络中寻找另一个计算机的时候,无须再通过广播的方式,而可以直接从计算机列表中查找目标计算机。这个计算机列表需要一台专门的计算机来维护,而这台计算机就叫作Browser。Browser通过记录广播数据来记录网络上的各种计算机。
Browser可分为两种:本地子网的Browser和工作组与域的Browser。其中:本地子网的Browser是由网络中的计算机自动推举出来的,并非事先设定好的;而域的Browser也是自动推举出来的,不过在推举过程中由于主域控制器的权重较高,所以普遍会优先推举主域控制器。本地子网的Browser又叫作本地主Browser,而工作组与域的Browser又叫作域主Browser。
要想知道哪台计算机为主Browser,可以使用nbtstat -A ipadder命令来探测主机是不是主Browser。如果返回信息包含了_MSBROWSE_,那么证明该计算机为主Browser,而在Browsing协议包中会携带计算机名及系统版本,如图2-13所示。
图2-13 Browsing协议包中携带计算机名及系统版本
还可以借助工具使用Browsing来进行被动主机发现,在Kali中执行python2 1.py eth0命令,如图2-14所示。
图2-14 通过Browsing进行被动主机发现
2.利用IP段探测主机存活
大家默认规定了一些私有地址。私有地址是指RFC1918定义的PrivateAddressSpace,包括10.0.0.0~10.255.255.255(10/8,简称10地址)、172.16.0.0~172.31.255.255(172.16/12,简称172地址)、192.168.0.0~192.168.255.255(192.168/16,简称192地址)。另外,国家电子政务外网(简称政务外网)是按照中办发〔2002〕17号文件和〔2006〕18号文件要求建设的我国电子政务重要公共基础设施,是服务于各级党委、人大、政府、政协、法院和检察院等政务部门,满足其经济调节、市场监管、社会管理和公共服务等方面需要的政务公用网络。政务外网支持跨地区、跨部门的业务应用、信息共享和业务协同,以及不需在政务内网中运行的业务。政务外网由中央政务外网和地方政务外网组成,与互联网逻辑隔离。如果经常在国内参加HW等行动,你就会知道打开59.192.0.0~59.255.255.255之间的地址(59.192/10)即进入了政务外网,每省(区、市)预分配一个/16网段。我们可以根据以上的私有地址段来探测主机的存活。
3.利用net命令探测主机存活
net use命令用于ipc$命名管道连接,查看计算机连接信息以及连接与断开计算机共享资源。它不带参数使用。执行net use命令会列出已经建立连接的网络列表,如图2-15所示。
图2-15 查看IPC连接记录
在Windows系统中,使用net use命令能够实现远程连接网络中其他计算机的共享资源,连接建立后会创建一个net session。在渗透测试中,如果获得了一台Windows主机的权限,在上面发现了net session,就可以使用这个net session的令牌创建进程。执行net session命令,就可以看到其他主机连接当前主机的记录,如图2-16所示。
图2-16 查看其他主机连接当前主机的记录
4.利用arp命令被动探测主机存活
arp命令用于显示和修改ARP缓存中的项目。ARP缓存中有一个或多个表,这些表用于存储IP地址以及经过解析的以太网或令牌环物理地址。计算机上安装的每一个以太网或令牌环网络适配器都有自己单独的表。
不带参数时,arp命令将显示帮助信息。arp -a命令用于记录出现的IP地址与物理地址的列表信息,如图2-17所示。
图2-17 使用arp命令被动获取存活主机
5.利用HOSTS文件探测主机存活
在一些大型企业中,网络管理员为了减轻DNS服务器的压力,将内网中的一些生产力系统域名(如邮件服务器、OA服务器、Wiki等常见域名)和IP地址写在HOSTS文件中。
依据DNS解析顺序,首先使用C:\Windows\System32\drivers\etc\HOSTS中的规则解析,如图2-18所示。
图2-18 通过HOSTS文件发现新资产
6.利用DNS缓存探测主机存活
Windows会将经DNS解析过的域名缓存下来。如果你控制了一台PC,可以查看它的DNS解析记录,发现一些内网中的生产力系统域名。输入命令ipconfig/displaydns,如图2-19所示。
图2-19 显示DNS缓存的记录
系统中有大量文件记录可以帮助我们发现更多的存活IP。在Windows中,有mstsc连接记录,Chrome、Firefox、360等浏览器中的历史记录、书签,以及数据库配置文件、技术文档、安全日志等。在Linux系统中,可以通过ssh连接记录的known_hosts文件、last命令查看登录记录和history中是否有存在的IP地址。
在内网渗透过程中,目标网络一般是分区域使用防火墙进行隔离的。在日常运维过程中,运维人员为了方便操作,会为特定主机配置多网卡以访问不同网络区域的计算机。可以通过Windows的一些接口、NetBIOS进行网卡信息的收集,用来定位多网卡主机。在无须进行身份验证的情况下,可以获得远程主机是否存在多个网卡和多个IP地址,以绕过限制,访问受保护的网络。
1.前提条件
使用内网多网卡主机探测发现工具的前提条件如表2-4所示。
表2-4 使用内网多网卡主机探测发现工具的前提条件
2.分类
❑通过IOXIDResolver接口不需要用户身份认证获取远程主机多网卡信息。
❑通过UDP 137端口的NBNS协议不需要用户身份认证获取远程主机Multi-Homed Host。
❑使用cornershot通过RpcRemoteFindFirstPrinterChangeNotificationEx获取主机能访问到目标网络。
3.利用方法
(1)通过IOXIDResolver接口获取远程多网卡主机
IOXIDResolver是在支持COM+的计算机上运行的服务,它存储与远程对象连接所需的RPC字符串绑定,并将其提供给本地客户端。将ping消息发送到本地计算机中具有客户端的远程对象,并接收在本地计算机上运行的对象的ping消息。红队可以通过IOXIDResolver接口,在没有任何身份验证的情况下对远程计算机的网络接口信息进行远程枚举。首先使用DCERPC请求与IOXIDResolver接口进行绑定,然后通过ServerAlive2()方法获得远程主机的DUALSTRINGARRAY,里面包含目标主机的计算机名和所有网卡对应的IP地址,如图2-20所示。
图2-20 通过IOXIDResolver接口获取远程主机多网卡信息
使用SharpOXID-Find.exe批量枚举多网卡主机。执行SharpOXID-Find.exe-c 172.16.6.0/24命令,如图2-21所示。
(2)通过NBNS获取远程多网卡主机
第一个包通过NBNS协议获取172.16.6.231的主机名,第二个包收到该IP地址对应的主机名。第三个包继续通过NBNS协议去查询SRV1主机对应的Multi-Homed Host,以获得多网卡的IP地址,如图2-22所示。
图2-21 批量枚举远程主机多网卡信息
图2-22 通过NBNS协议获取多网卡的IP地址
使用nextnet通过UDP 137端口枚举多网卡主机。执行nextnet 172.16.6.0/24命令,如图2-23所示。
图2-23 枚举多网卡主机
(3)通过RPC获取任意主机可访问的网络范围
通过经过身份验证的用户利用RpcRemoteFindFirstPrinterChangeNotificationEx强制远程主机访问指定服务器。后面在讲解BloodHound时会对此进行详细描述。
4.防御方式
❑在敏感网络与互联网之间采用物理隔离而不是防火墙策略。
❑禁止敏感网络出网。
❑不使用多网卡主机。
❑梳理防火墙策略,删除无用放行策略。
❑在防火墙中配置拒绝访问TCP 135/UDP 137端口。