内网渗透测试基础——内网信息收集
在内网渗透测试环境中,有很多设备和防护软件,例如Bit9、ArcSight、Maniant等。它们通过收集目标内网的信息,洞察内网网络拓扑结构,找出内网中最薄弱的环节。信息收集的深度,直接关系到内网渗透测试的成败。
1. 内网信息收集概述
渗透测试人员进入内网后,面对的是一片“黑暗森林”。所以,渗透测试人员首先需要对当前所处的网络环境进行判断。判断设计如下三个方面。
我是谁?——对当前机器角色的判断。
这是哪?——对当前机器所处网络环境的拓扑结构进行分析和判断。
我在哪?——对当前机器所处区域的判断。
对当前机器角色的判断,是指判断当前机器是普通Web服务器、开发测试服务器、公共服务器、文件服务器、代理服务器、DNS服务器还是存储服务器等。具体的判断过程,是根据机器的主机名、文件、网络连接等情况综合完成的。
对当前机器所处网络环境的拓扑结构进行分析和判断,是指对所处内网进行全面的数据收集和分析整理,绘制出大致的内网整体拓扑结构图。对当前机器所处区域的判断,是指判断机器处于网络拓扑中的哪个区域,是在DMZ、办公区还是核心区。当然,这里的区域不是绝对的,只是一个大概的环境。处于不同位置的网络,环境不一样,区域界限也不一定明显。
2. 收集本机信息
不管是在外网还是内网中,信息收集都是重要的第一步。对于内网中的一台机器,其所处内网的结构是什么样的、其角色是什么、使用这台机器的人的角色是什么,以及这台机器上安装了什么杀毒软件、这台机器是通过什么方式上网的、这台机器是笔记本电脑还是台式机等问题,都需要通过信息收集来解答。
2.1 手动收集信息
本机信息包括操作系统、权限、内网IP地址段、杀毒软件、端口、服务、补丁更新频率、网络连接、共享、会话等。如果是域内主机,操作系统、应用软件、补丁、服务、杀毒软件一般都是批量安装的。通过本机的相关信息,可以进一步了解整个域的操作系统版本、软件及补丁安装情况、用户命名方式等。
1. 查询网络配置信息
执行如下命令,获取本机网络配置信息,如图所示。
ipconfig /all
2. 查询操作系统及软件的信息
(1)查询操作系统和版本信息
systeminfo | findstr /B /C:“OS Name” /C:“OS Version”
执行以上命令,可以看到当前系统为Windows Server 2008 R2 Enterprise。如果是中文版操作系统,则输入如下命令,如图所示。
systeminfo | findstr /B /C:“OS 名称” /C:“OS 版本”
(2) 查看系统体系结构
执行如下命令,查看系统体系结构,如图所示。
echo %PROCESSOR_ARCHITECTURE
(3) 查看安装的软件及版本、路径等
利用wmic命令,将结果输出到文本文件中。具体命令如下,运行结果如图所示。
wmic product get name, version
利用PowerShell命令,收集软件的版本信息。具体命令如下,运行结果如图所示。
powershell “Get-WmiObject -class Win32_Prodcut |Select-Object -Property name, version"
3. 查询本机服务信息
执行如下命令,查询本机服务信息,如图所示。
wmic service list brief
4. 查询进程列表
执行如下命令,可以查看当前进程列表和进程用户,分析软件、邮件客户端、VPN和杀毒软件等进程,如图所示。
tasklist
执行如下命令,查看进程信息,如图所示。
wmic process list brief
常见杀毒软件的进程,如表所示。
常见杀毒软件的进程
进 程 | 软件名称 |
360sd.exe | 360杀毒 |
360tray.exe | 360实时保护 |
ZhDongFangYu.exe | 360主动防御 |
KSafeTray.exe | 金山卫士 |
SafeDogUpdateCenter.exe | 服务器安全狗 |
McAfee McShield.exe | McAfee |
egui.exe | NOD32 |
AVP.EXE | 卡巴斯基 |
avguard.exe | 小红伞 |
bdagent.exe | BitDefender |
5. 查看启动程序信息
执行如下命令,查看启动程序信息,如图所示。
wmic startup get command, caption
6. 查看计划任务
执行如下命令 ,查看计划任务,结果如图所示。
schtasks /query /fo LIST /v
7. 查看主机开机时间
执行如下命令,查看主机开机时间,如图所示。
net statistics workstation
8. 查询用户列表
执行如下命令,查看本机用户列表。
net user
通过分析本机用户列表,可以找出内网机器的命名规则。特别是个人机器的名称,可以用来推测整个域的用户命名方式,如图所示。
执行如下命令,获取本地管理员(通常包含域用户)信息。
net localgroup administrators
执行如下命令,查看当前在线用户,如图所示。
query user || qwinsta
9. 列出或断开本地计算机与所连接的客户端之间的会话
执行如下命令,列出或断开本地计算机与所连接的客户端之间的会话。
net session
10. 查询端口列表
执行如下命令,查看端口列表、本机开放的端口所对应的服务和应用程序。
netstat -ano
此时可以看到当前机器和哪些主机建立了连接,以及TCP、UDP等端口的使用和监听情况,如图所示。可以先通过网络连接进行初步判断(例如,在代理服务器中可能会有很多机器开放了代理端口,更新服务器可能开放了更新端口8530,DNS服务器可能开放了53端口等),再根据其他信息进行综合判断。
11. 查看补丁列表
执行如下命令,查看系统的详细信息。
systeminfo
需要注意系统的版本、位数、域、补丁信息及更新频率等。域内主机的补丁通常是批量安装的,通过查看本机补丁列表,就可以找到未补丁的漏洞。可以看到,当前系统更新了4个补丁,如图所示。
使用wmic命令查看安装在系统中的补丁,具体如下。
wmic qfe get Caption,Description,HotFixID,InstalledOn
补丁的名称、描述、ID、安装时间等信息,如图所示。
12. 查询本机共享列表
执行如下命令,查看本机共享列表和可访问的域共享列表(域共享在很多时候是相同的),如图所示。
net share
利用wmic命令查找共享列表,具体如下,如图所示。
wmic share get name,path,status
13. 查询路由表及所有可用接口的ARP缓存表
执行如下命令,查询路由表及所有可用接口的ARP(地址解析协议)缓存表,结果如图所示。
route print
arp -a
14. 查询防火墙相关配置
(1)关闭防火墙
Windows Server 2003及之前的版本,命令如下。
netsh firewall set opmode disable
Windows Server 2003之后的版本,命令如下。
netsh advfirewall set allprofiles state off
(2) 查看防火墙配置
netsh firewall show config # win2008 Server 系统
netsh advfirewall firewall show rule name=all dir=in type=dynamic # Windows 10操作系统
(3)修改防火墙配置
Windows Server 2003及之前的版本,允许指定程序全部连接,命令如下。
netsh firewall add a allowedprogram c:\nc.exe “allow nc” enable
Windows Server2003之后的版本,情况如下。
- 允许指定程序进入,命令如下。
netsh advfirew
all firewall add rule name=“pass nc” dir=in action=allow program=“C:\nc.exe”
- 允许指定程序退出,命令如下。
netsh advfirewall firewall add rule name=“Allow nc” dir=out action=allow program=“C:\nc.exe”
- 允许3389端口放行,命令如下。
netsh advfirewall firewall add rule name=“Remote Desktop” protocol=TCP dir=in localport=3389 action=allow
(4) 自定义防火墙日志的存储位置
netsh advfirewall set currentprofile logging filename “C:\windows\temp\fw.log”
15. 查看代理配置情况
执行如下命令,可以看到服务器127.0.0.1的1080端口的代理配置信息,如图所示。
reg query “HKEY_CURRENT_USER\SoftWare\Microsoft\Windows\CurrentVersion\Internet Settings”
16. 查询并开启远程连接服务
(1)查看远程连接端口
在命令行环境中执行注册表查询语句,命令如下。连接的端口为0xd3d,转换后为3389,如图所示。
REG QUERY”HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /V PortNumber
(2)在Windows Server 2003中开启3389端口
wmic path win32_terminalservicesetting where (_CLASS !=“”) call setallowtsconnections 1
(3)在Windows Server 2008和Windows Server 2012中开启3389端口,如图所示。
wmic .namespace:\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS !=“”) call setallowtsconnections 1
wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName=‘RDP-Tcp’) call setuserauthenticationrequired 1
reg add “HKLM\SYSTEM\CURRENT\CONTROLSET\CONTROL\TERMINAL SERVER” /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
2.2 自动收集信息
为了简化操作,可以创建一个脚本,在目标机器上完成流程、服务、用户账号、用户组、网络接口、硬盘信息、网络共享信息、操作系统、安装的补丁、安装的软件、启动时运行的程序、时区等信息的查询工作。网上很多类似的脚本,当然,我们也可以自己定制一个。在这里,推荐一个利用WMIC收集目标机器信息的脚本。
WMIC(Windows Management Instrumentation Command-Line, Windows管理工具命令行)是最有用的Windows命令行工具。在默认情况下,任何版本的Windows XP的低权限用户不能访问WMIC,Windows 7以上版本的低权限用户允许访问WMIC并执行相关查询操作。
WMIC脚本的下载地址,[http://www.fuzzysecurity.com/scripts/files/wmic_info.rar]
3. 查询当前权限
3.1 查看当前权限
查看当前权限,命令如下。
whoami
获取一台主机的权限后,有如下三种情况。
- 本地普通用户:当前为win7本机的user用户,如图所示。
- 本地管理员用户:当前为win7本机的administrator用户,如图所示。
- 域内用户:当前为htftime域内的administrator用户,如图所示。
在这三种情况中,如果当前内网中存在域,那么本地普通用户只能查询本机相关信息,不能查询域内信息,而本地管理员用户和域内用户可以查询域内信息。其原理是:域内的所有查询都是通过域控制器实现的(基于LDAP协议),而这个查询需要经过权限认证,所以,只有域用户才拥有这个权限;当域用户执行查询命令时,会自动使用Kerberos协议进行认证,无须额外输入账号和密码。
本地管理员Administrator权限可以直接提升为Ntauthority或System权限,因此,在域中,除普通用户外, 所有的机器都有一个机器用户(用户名是机器名加上"$")。在本质上,机器的system用户对应的就是域里面的机器用户。所以,使用System权限可以运行域内的查询命令。
3.2 获取域SID
执行如下命令,获取域SID,如图所示。
whoami /all
当前域htftime的SID为S-1-5-21-3021483069-261499070-2475277354,域用户administrator的SID为S-1-5-21-3021483069-261499070-2475277354-500。
3.3 查询指定用户的详细信息
执行如下命令,查询指定用户的详细信息。
net user XXX /domain
在命令行环境中输入命令"net user user /domain",可以看到,当前 用户在本地组中没有本地管理员权限,在域中属于Domain Users组,如图所示。
4. 判断是否存在域
获得了本机的相关信息后,就要判断当前内网中是否存在域。如果当前内网中存在域,就需要判断所控主机是否在域内。下面讲解几种方法。
4.1 使用ipconfig命令
执行如下命令,可以查看网关IP地址、DNS的IP地址、域名、本机是否和DNS服务器处于同一网段等信息,如图所示。
ipconfig /all
然后,通过反向解析查询命令nslookup来解析域名的IP地址。用解析得到的IP地址进行对比,判断域控制器和DNS服务器是否在同一台服务器上,如图所示。
4.2 查看系统详细信息
执行如下命令,如图所示,”域“即域名(当前域名为htftime.com),”登录服务器“为域控制器。如果”域“为”WORKGROUP",表示当前服务器不在域内。
systeminfo
4.3 查询当前登录域及登录用户信息
执行如下命令,如图所示,“工作站域DNS名称”为域名(如果为“WORKGROUP”, 表示当前为非域环境),“登录域”用于表示当前登录的用户是域用户还是本地用户,此处表示当前登录的用户是域用户。
net config workstation
4.4 判断主域
执行如下命令,判断主域(域服务器通常会同时作为时间服务器使用)。
net time /domain
执行以上命令后,通常有如下情况。
- 存在域,且当前用户是域用户,如图所示。
- 当前网络环境为工作组,不存在域,如图所示。
5. 探测域内存活主机
内网存活主机探测是内网渗透测试中不可或缺的一个环节。可在白天和晚上分别进行探测,以对比分析存活主机和对应的IP地址。
5.1 利用NetBIOS快速探测内网
NetBIOS是局域网程序使用的一种应用程序编程接口(API),为了程序提供了请求低级别服务的统一命令集,为局域网提供了网络机及其他特殊功能。几乎所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS也是计算机的标识名,主要用于局域网中计算机的互访。NetBIOS的工作流程就是正常的机器名解析查询应答过程,因此推荐优先使用。
nbtscan是一个命令行工具,用于扫描本地或远程TCP/IP网络上的开放NetBIOS名称服务器。nbtscan有Windows和Linux两个版本,体积很小,不需要安装特殊的库或DLL就能使用。NetBIOS的使用方法比较简单。将其上传到目标主机中,然后直接输入IP地址范围并运行,如图所示。
显示结果的第一列为IP地址,第二列为机器名和所在域的名称,最后一列是对应的MAC地址。
5.2 利用ICMP协议快速探测内网
除了利用NetBIOS探测内网,还可以利用ICMP协议探测内网。依次对内网中的每个IP地址执行ping命令,可以快速找出内网中所有存活的主机。在渗透测试中,可以使用如下命令循环探测整个C段,如图所示。
for /l %i in (1,1,200) do @ping -w 1 -n 1 192.168.1.%i | find /i “ttl”
也可以使用VBS脚本进行探测,具体如下。
strSubNet = “192.168.1.”
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set objTS = objfso.CreateTextFile(“C:\Windows\Temp\Result.txt”)
For i = 1 To 254
strComputer = strSubNet & i
blnResult = Ping(strComputer)
If blnResult = True Then
objTS.WriteLine strComputer & " is alived ! 😃 "
End If
Next
objTS.Close
WScript.Echo "All Ping Scan , All Done ! 😃 "
Function Ping(strComputer)
Set objWMIService = GetObject(“winmgmts:\.\root\cimv2”)
Set colItems = objWMIService.ExecQuery(“Select * From Win32_PingStatus Where Address='” & strComputer & “'”)
For Each objItem In colItems
Select case objItem.StatusCode
Case 0
Ping = True
Case Else
Ping = False
End select
Exit For
Next
End Function
在使用VBS脚本时,需要修改IP地址段。输入如下命令,扫描结果默认保存在C:\Windows\Temp\Result.txt中,如图所示。
cscript c:\windows\temp\1.vbs
5.3 通过ARP扫描探测内网
- arp-scan工具
直接把arp.exe上传到目标机器中并运行,可以自定义掩码、指定扫描范围等,命令如下,如图所示。
arp.exe -t 192.168.1.0/20
- Empire中的arpscan的模块
Empire内置了arpscan模块。该模块用于在局域网内发生ARP数据包、收集活跃主机的IP地址和MAC地址信息。在Empire中输入命令”usemodule situational_awareness/network/arpscan",即可使用其内置的arpscan模块,如图所示。
- Nishang中的Invoke-ARPScan.ps1脚本
使用Nishang中的Invoke-ARPScan.ps1脚本,可以将脚本上传到目标主机中运行,也可以直接远程加载脚本、自定义掩码和扫描范围,命令如下,如图所示。
powershell.exe -exec bypass -Command “& {Import-Module C:\windows\temp\Invoke-ARPScan.ps1; Invoke-ARPScan -CIDR 192.168.1.0/20}” >> C:\windows\temp\log.txt
5.4 通过常规TCP/UDP端口扫描探测内网
ScanLine是一款经典的端口扫描工具,可以在所有版本的Windows操作系统中使用,体积小,仅使用单个文件,同时支持TCP/UDP端口扫描,命令如下,如图所示。
scanline -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\log.txt -p 192.168.1.1-254 /b
6. 扫描域内端口
通过查询目标主机的端口开放信息,不仅可以了解目标主机所开放的服务,还可以找出其开放服务的漏洞、分析目标网络的拓扑结构等,具体需要关注以下三点。
- 端口的Banner信息。
- 端口上运行的服务。
- 常见应用的默认端口。
在进行内网渗透测试时,通常会使用Metasploit内置的端口进行扫描。也可以上传端口扫描工具,使用工具进行扫描。还可以根据服务器的环境,使用自定义的端口扫描脚本进行扫描。在获得授权的情况下,可以直接使用Nmap、masscan等端口扫描工具获取开放的端口信息。
6.1 利用telnet命令进行扫描
Telnet协议是TCP/IP协议族的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在目标计算机上使用Telnet协议,可以与目标服务器建立连接。如果只是想快速探测某台主机的某个常规高危端口是否开放,使用telnet命令是最方便的。telnet命令的一个简单使用示例,如图所示。
6.2 S扫描器
S扫描器是早期的一种快速端口扫描工具,支持大网段扫描,特别适合运行在Windows Server 2003以下版本的操作系统中。S扫描器的扫描结果默认保存在其安装目录下的result.txt文件中。推荐使用TCP扫描,命令如下,如图所示。
S.exe TCP 192.168.1.1 192.168.1.254 445, 3389,1433, 7001,1099,9080,80,22,23,21,25,110,3306,5432,1521,6379,2049,111 256 /Banner /save
6.3 Metasploit端口扫描
Metasploit 不仅提供了多钟端口扫描技术,还提供了与其他扫描工具的接口。在msfconsole下运行"search portscan"命令,即可进行搜索。
在本实验中,使用auxiliary/scanner/portscan/tcp模块进行演示,如图所示。
可以看到,使用Metasploit的内置端口扫描模块,能够找到系统中开放的端口。
6.4 PowerSploit的Invoke-portscan.ps1脚本
PowerSploit的Invoke-Portscan.ps1脚本,推荐使用无文件的形式进行扫描,命令如下,如图所示。
powershell.exe -nop -exec bypass -c “c:\Users\CISP-PTE\Desktop\Invoke-Portscan -Hosts 192.168.1.0/24 -T 4 -ports ‘445,1433,8080,3389,80’ -oA c:\windows\temp\res.txt”
6.5 Nishang的Invoke-PortScan模块
Invoke-PortScan是Nishang的端口扫描模块,用于发现主机、解析主机名、扫描端口,是一个很实用的模块。输入“Get-Help Invoke-PortScan-full"命令,即可查看帮助信息。
Invoke-PortScan的参数介绍如下。
- StartAddress:扫描范围的开始地址。
- EndAddress:扫描范围的结束地址。
- ScanPort:进行端口扫描。
- 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:设置超时时间。
使用以下命令对本地局域网进行扫描,搜索存活主机并解析主机名,如图所示。
Invoke-PortScan -StartAddress 192.168.1.1 -EndAddress 192.168.1.255 -ResolveHost
备注:Nishang的用法可以参照【】
⚠️:不知为啥解析出来的主机名都是同一个。如果有知道为什么的,给我留言或私信。
6.6 端口Banner信息
如果通过扫描发现了端口,可以使用客户端连接工具或者nc,获取服务端的Banner信息。获取Banner信息后,可以在漏洞库中查找对应CVE编号的POC、EXP,在ExploitDB、Seebug等平台上查看相关的漏洞利用工具,然后到目标系统中验证漏洞是否存在,从而有针对性地进行安全加固。相关漏洞的信息,可以参考如下两个网站。
- 安全焦点:其中的BugTraq是一个出色的漏洞和Exploit数据源,可以通过CVE编号或者产品信息漏洞直接搜索,
- Exploit-DB:取代了老牌安全网站milw0rm,提供了大量的Exploit程序和相关公告,【https://www.exploit-db.com/】
常见的端口及说明,如下表所示。
文件共享服务端口
端口号 | 端口说明 | 使用说明 |
21、22、69 | FTP/TFTP文件传输协议 | 允许匿名的上传、下载、爆破和嗅觉操作 |
2049 | NFS服务 | 配置不当 |
139 | SAMBA服务 | 爆破、未授权访问、远程代码执行 |
389 | LDAP目录访问协议 | 注入、允许匿名访问、弱口令 |
远程连接服务端口
端口号 | 端口说明 | 使用说明 |
22 | SSH远程连接 | 爆破、SSH隧道及内网代理转发、文件传输 |
23 | Telnet远程连接 | 爆破、嗅探、弱口令 |
3389 | RDP远程桌面连接 | Shift后门(Windows Server 2003以下版本)、爆破 |
5900 | VNC | 弱口令爆破 |
5632 | PcAnywhere服务 | 抓取密码、代码执行 |
Web应用服务端口
端口号 | 端口说明 | 使用说明 |
80、443、8080 | 常见的Web服务端口 | Web攻击、爆破、对应服务器版本漏洞 |
7001、7002 | WebLogic控制台 | Java反序列化、弱口令 |
8080、8089 | JBoss/Resin/Jetty/Jenkins | 反序列化、控制台弱口令 |
9090 | WebSphere控制台 | Java反序列化、弱口令 |
4848 | GlassFish控制台 | 弱口令 |
1352 | Lotus Domino邮件服务 | 弱口令、信息泄露、爆破 |
10000 | webmin控制面板 | 弱口令 |
数据库服务端口
端口号 | 端口说明 | 使用说明 |
3306 | MySQL数据库 | 注入、提取、爆破 |
1433 | MSSQL数据库 | 注入、提权、SA弱口令、爆破 |
1521 | Oracle数据库 | TNS爆破、注入、反弹Shell |
5432 | PostgreSQL数据库 | 爆破、注入、弱口令 |
27017、27018 | MongoDB数据库 | 爆破、未授权访问 |
6379 | Redis数据库 | 可尝试未授权访问、弱口令爆破 |
5000 | Sysbase/DB2数据库 | 爆破、注入 |
邮件服务
端口号 | 端口说明 | 使用说明 |
25 | SMTP邮件服务 | 右键伪造 |
110 | POP3协议 | 爆破、嗅探 |
143 | IMAP协议 | 爆破 |
网络常见协议端口
端口号 | 端口说明 | 使用说明 |
53 | DNS域名系统 | 允许区域传送、DNS劫持、缓存投毒、欺骗 |
67、68DNS域名系统 | DHCP服务 | 劫持、欺骗 |
161 | SNMP协议 | 爆破、搜集目标内网信息 |
特殊服务端口
端口号 | 端口说明 | 使用说明 |
2181 | ZooKeeper服务 | 未授权访问 |
8069 | Zabbix服务 | 远程执行、SQL注入 |
9200、9300 | Elasticsearch服务 | 远程执行 |
11211 | Memcached服务 | 未授权访问 |
512、513、514 | Linux rexec服务 | 匿名访问、文件上传 |
873 | rsync服务 | 匿名访问、文件上传 |
3690 | SVN服务 | SVN泄露、未授权访问 |
使用说明 | ||
----------------- | ----------- | ------------------------------------- |
53 | DNS域名系统 | 允许区域传送、DNS劫持、缓存投毒、欺骗 |
67、68DNS域名系统 | DHCP服务 | 劫持、欺骗 |
161 | SNMP协议 | 爆破、搜集目标内网信息 |
特殊服务端口
端口号 | 端口说明 | 使用说明 |
2181 | ZooKeeper服务 | 未授权访问 |
8069 | Zabbix服务 | 远程执行、SQL注入 |
9200、9300 | Elasticsearch服务 | 远程执行 |
11211 | Memcached服务 | 未授权访问 |
512、513、514 | Linux rexec服务 | 匿名访问、文件上传 |
873 | rsync服务 | 匿名访问、文件上传 |
3690 | SVN服务 | SVN泄露、未授权访问 |
50000 | SAP Management Console | 远程执行 |