Impacket
项目
原项目:python
1 | https://github.com/fortra/impacket |
windows/linux平台文件运行:
1 | #Windows&Linux |
GUI图形化项目:
1 | #C/S |
介绍
类型 | 脚本名 | 脚本介绍 |
---|---|---|
远程执行 | psexec.py | 使用了RemComSvc的实现了PSEXEC功能的脚本。 |
远程执行 | smbexec.py | 类似PSECEX的执行方式,但未使用RemComSvc。这个脚本使用了一个本地SMB Server接收返回的结果,可以避免目标SMB没有可写的目录 |
远程执行 | atexec.py | 这个脚本通过MS-TSCH协议控制计划任务在目标机器上执行命令并获得回显 |
远程执行 | wmiexec.py | 通过WMI实现了半交互式的Shell,不需要在目标安装任何服务或软件。而且高度隐蔽的以管理员权限运行 |
远程执行 | dcomexec.py | 类似wmiexec.py的半交互式Shell,但是使用了DCOM接口,目前支持的接口有MMC20.Application 、ShellWindows 、ShellBrowserWindows |
Kerberos协议 | GetTGT.py | 提供密码、hash或aeskey用来请求TGT并且保存为ccache格式 |
Kerberos协议 | GetST.py | 提供密码、hash、aeskey或ccache格式的TGT,可以请求服务票据并保存为ccache格式。如果提供的账户存在约束委派且支持协议转换,那么可以使用-impersonate选项模拟为其他用户请求票据 |
Kerberos协议 | GetPac.py | 这个脚本会为指定用户请求经过身份验证的PAC,通过使用MS-SFU协议的S4USelf和U2U的Kerberos认证实现 |
Kerberos协议 | GetUserSPNs.py | 这个脚本会找出和普通用户账户关联的SPN,输出格式与JtR和hashcat兼容 |
Kerberos协议 | GetNPUsers.py | 这个脚本会尝试获得并列出不需要Kerberos域认证(UF_DONT_REQUIRE_PREAUTH)的用户,输出和JtR兼容。 |
Kerberos协议 | rbcd.py | 这个脚本可以处理目标机器的msDS-AllowedToActOnBehalfOfOtherIdentity属性 |
Kerberos协议 | ticketConverter.py | 这个脚本可以在mimikatz常用的kirbi文件和Impacket常用的ccache文件之间进行转换 |
Kerberos协议 | ticketer.py | 这个脚本可以基于模板或自己创建金、银票据,并允许你自定义PAC_LOGON_INFO、groups、ExtraSids、duration等属性 |
Kerberos协议 | raiseChild.py | 这个脚本通过金票据和ExtraSids实现从子域到域森林的提权 |
Windows密码 | secretsdump.py | 提供各种技术以不运行任何程序远程dump密码。对SAM和LSA以及缓存的凭据,会尝试从目标注册表中读取并将hives保存在%SYSTEMROOT%\Temp 目录,再将hives读取回来。对于DIT文件,会使用DL_DRSGetNCChanges 函数来dump目标的NTLM hash、明文密码和Kerberos keys。也可以通过smbexec或wmiexec执行vssadmin得到NTDS.dit,并对其进行解密。这个脚本在服务不可用的情况下会打开对应的服务,例如远程注册表。在执行结束后,会将激活的服务还原。 |
Windows密码 | mimikatz.py | 一个用来控制远程mimikatz RPC服务器的Shell,由@gentikiwi开发。 |
模块
psexec
简介
psexc最初是由sysinternals提供的windows官方工具,用来管理大量机器
https://learn.microsoft.com/zh-cn/sysinternals/downloads/
https://learn.microsoft.com/zh-cn/sysinternals/downloads/psexec
背景知识(IPC$)
- 命名管道:IPC$ 共享实际上是一个命名管道(Named Pipe),它通过 SMB 协议在网络上提供了一个虚拟的通信通道。这意味着远程客户端可以通过网络连接到这个管道,并通过它发送和接收数据。
- RPC 过程:通过 IPC$ 共享,客户端可以发起 RPC 调用,从而执行远程系统上的特定服务或功能。SMB 协议在这种情况下提供了传输层的支持,使得 RPC 能够在不同主机之间传递消息。
利用条件:
1、开启139、445端口
2、管理员开启默认共享
IPC$连接失败原因:
1、用户名或密码错误
2、没有打开ipc$默认共享
3、139、445端口不能成功连接(防火墙)
IPC$常见连接错误:
1 | 错误号5:拒绝访问 |
命令
1 | #建立IPC$连接 |
使用条件
1、SMB开启(139、445端口开启状态)能建立IPC$链接,目标机器开启admin$共享(默认开启)
2、明文密码/NTLM Hash
3、用户权限
(1)将文件写入共享文件夹的权限
(2)能够在远程机器上创建服务:SC_MANAGER_CREATE_SERVICE
(3)能够启动所创建的服务:SERVICE_QUERY_STATUS && SERVICE_START
总结:IPC$的利用条件+用户权限
工具
原版psexec只支持明文账号密码,Impacket中的psexec支持NTLM Hash登录
1 | 原版 |
原理
1、建立IPC$连接
2、通过IPC$连接释放上传psexecsvc.exe
3、通过服务管理SCManager远程创建psexecsvc服务,并远程启动服务
4、客户端执行命令连接服务端,服务端启动程序执行并回显数据
5、运行后删除服务
PSEXESVC
服务充当一个重定向器(包装器)。它在远程系统上运行指定的可执行文件(示例中的cmd.exe),同时,它通过主机之间来重定向进程的输入/输出(利用命名管道)。
最终生成4个管道:
服务本身
、stdin(输入)
、stdout(输出)
、stderr(错误输出)
小知识
首次使用建议 带上-accepteula参数 否则会弹窗
RDP劫持
注意:管理员运行CMD
psexec -s -i cmd
quser
tscon 2 /dest:console
hash登录
refer:https://xz.aliyun.com/t/8574?time__1311=n4%2BxnD0DcDuD90DRAYD%2Fia4BIoD5itetKi1rO4D
准备工作:
1 | #读取lass密码抓取 |
1 | NTML Hash :a2ada404e9515cfb77f9877cf7641855 |
登录过程:
1 | #查看是否已开启 DisableRestrictedAdmin REG_DWORD 0x0 存在就是开启 |
mimikatz
1 | ERROR kuhl_m_privilege_simple ; RtlAdjustPrivilege (20) c0000061管理员打开CMD |
1 | privilege::debug |
Refer
https://cn-sec.com/archives/2961299.html
https://xz.aliyun.com/t/11877?time__1311=Cq0xuD0DnAit%3DGNeeeuDYqAKRAxjEow%2BEbD
https://0range-x.github.io/2021/11/15/PSexec%E7%9A%84%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/
https://www.freebuf.com/articles/system/332115.html
smbexec
简介
与psexec类似
相同:
1、139/445 SMB协议
2、建立IPC$连接
不同:
1、smbexec不会将二进制文件放入磁盘,smbexec利用一个批处理文件和一个临时文件来执行和转发消息
使用条件
1、139/445 SMB端口开启,能建立IPC$链接,目标机器开启admin$共享(默认开启)
2、权限
(1)能在远程机器上创建服务
(2)能够启动所创建的服务
工具
1 | ## 工作组环境下 |
原理
1、建立IPC$连接
2、svcctl协议在目标主机创建和启动服务
在使用
svcctl
时,通常需要通过SMB协议中的IPC共享来与远程系统建立连接。IPC共享来与远程系统建立连接。IPC$(Inter-Process Communication)共享是一个特殊的共享资源,它允许远程系统通过SMB协议进行进程间通信。IPC$共享的存在是为了方便系统之间的通信以及远程管理,但它也可能成为安全风险点,尤其是在默认情况下它通常是开放的,并且不需要显式的用户凭证即可访问。通过IPC$共享,
svcctl
可以:
- 枚举远程系统上可用的服务列表。
- 启动或停止远程系统上的服务。
- 修改服务的配置。
3、将用户需要执行的命令存放在服务中的ImagePath属性中(每执行一次命令就需要创建一次服务)
1 | 首先会将命令存放进入%TEMP%\execute.bat文件的头部 |
Refer
深入了解Psexec与SMBexec - FreeBuf网络安全行业门户
atexec
原理
通过远程调用对方主机的任务计划程序(Task Scheduler)创建一个定时任务,然后通过手动触发该定时任务将执行结果写入文本中,再利用smb共享去读取执行结果。
MS-TSCH:任务调度程序服务远程协议,该协议用于注册和配置任务以及查询远程计算机上运行的任务的状态,主要由三个独立的RPC接口组成
这三个接口都使用RPC作为远程配置和管理任务的传输,且它们的功能是逐级递增的。现如今,ITaskSchedulerService 成为了大部分计划任务操作的首选。同时,ITaskSchedulerService 接口不通过远程注册表和文件系统协议,而是通过XML来指定任务的配置。
该三个接口在Impacket中均有实现
工具
与smbexec类似
明文和哈希值均可传递,并且连接后自动提权
atexec是通过windows计划任务执行远程命令,atexec是一个半交互的工具,即参数中添加需要在远程主机执行的命令,工具执行后即返回命令结果,适用于webshell下,也适用于其他网络环境。
1 | atexec.exe ./administrator:Admin12345@192.168.3.21 "whoami" # 本地用户明文连接执行命令 |
wmiexec
项目
https://github.com/rootclay/WMIHACKER
利用条件
1、远程主机的WMI服务为开启状态(默认开启)
2、远程主机防火墙放行135端口,这是WMI管理的默认端口
内网中,由于大多数 Windows 系统自带 wmic 命令, 所以 WMIC 是内网横向的常用方法之一,使用 WMI 的前置要求是,目标端口开放 135 端口,且允许随机一个高位端口进行通信。这是由于 WMI 是先通过 135 端口建立连接,而后通过随机的高位端口进行数据传输。
直接使用系统自带的 WMIC 进行连接,执行命令是无回显的,常常需要将执行的返回结果写入文件,再通过文件读取的方式将回显带回来。
WMI
全称是Windows management instrumentation,它出现在所有的Windows操作系统中,并由一组强大的工具集合组成,用于管理本地或远程的Windows系统,攻击者使用wmi来进行攻击,但Windows系统默认不会再日志中记录这些操作,可以做到无日志,攻击脚本无需写入到磁盘,增加了隐蔽性。推荐使用wmiexec进行远程执行命令
wmiexec
大牛使用VBS脚本调用WMI来模拟 psexec 的功能,于是乎WMIEXEC 就诞生了。基本上psexec 能用的地方,这个脚本也能够使用。整个过程是先调用WMI通过账号密码或者NTLM认证(WCE注入)连接到远程计算机,然后如果提供了账号密码,则用这个账号密码建立一个到目标的IPC连接。随后WMI会建立一个共享文件夹,用于远程读取命令执行结果。 当用户输入命令时,WMI创建进程执行该命令,然后把结果输出到文件,这个文件位于之前创建的共享文件夹中。最后,通过FSO组件访问远程共享文件夹中的结果文件,将结果输出。当结果读取完成时,调用WMI执行命令删除结果文件。最后当WMIEXEC退出时,删除文件共享
原理
wmiexec.py
首先是 impacket 工具包里的 wmiexec.py。提供了通过 wmi 执行命令并回显的功能。其原理较为简单:通过 wmi 执行命令,并将执行结果保存文件,通过 smb 读取返回结果。如下是 wmiexec.py 的一个片段,其中 __output 为输出的临时文件, __transferClient 为 smb 的连接。所以,该工具的使用条件是需要 445、135 和高位随机的一个端口都允许通信。
wmiexec.py 还支持无回显的方式进行命令执行。这种方式是不会建立 SMB 连接,也就不需要 445 端口的开放。
WMICMD
WMICMD 的实现原理和 wmiexec.py 有些出入。上面介绍了 WMICMD 之所以能得到回显的原因,是借助了 445 端口的 SMB 连接。而 WMICMD 能够做到不需要 445 端口就可以完成命令执行并回显。其原理是通过命令执行将执行结果写入注册表之中,再通过 WMI 对注册表进行操作,读取结果,这样一来就不需要 445 端口了。如下是 WMICMD 通过注册表获取执行结果回显的代码片段。
WMIHACKER
WMIHACKER 也是通过将命令执行将执行结果写入到注册表,但不一样的地方是 wmiexe.py 和 wmicmd 是通过创建一个 win32Process 进程来执行命令,而 WMIHACKER 是使用事件触发器来调用 VB 代码,达到命令执行的效果。根据介绍,这种方式在当时可以绕过杀软。
使用
1 | python wmiexec.py uf9n1x/Administrator:123qwe@@192.168.1.131 |
Refer
https://cloud.tencent.com/developer/article/1895804
dcomexec
背景
COM
COM即组件对象模型(Component Object Model,COM) ,是基于 Windows 平台的一套组件对象接口标准,由一组构造规范和组件对象库组成。COM是许多微软产品和技术,如Windows媒体播放器和Windows Server的基础。
一般的对象是由数据成员和作用在其上的方法组成,而组件对象和一般对象虽有相似性,但又有较大不同。组件对象不使用方法而用接口来描述自身。接口被定义为“在对象上实现的一组语义上相关的功能”,其实质是一组函数指针表,每个指针必须初始化指向某个具体的函数体,一个组件对象实现的接口数量没有限制。
Windows COM(Component Object Model,组件对象模型)是微软开发的一种软件架构,它允许应用程序的组件以对象的形式进行交互。COM 定义了一种标准,这种标准与编程语言无关,并且可以使组件在进程内或跨进程(甚至跨网络)进行通信。这意味着开发者可以使用任何支持 COM 的编程语言来创建或使用 COM 组件。
DCOM
DCOM(分布式组件对象模型)是微软基于组件对象模型(COM)的一系列概念和程序接口,它支持不同的两台机器上的组件间的通信,不论它们是运行在局域网、广域网、还是Internet上。利用这个接口,客户端程序对象能够向网络中另一台计算机上的服务器程序对象发送请求。
DCOM是COM(组件对象模型)的扩展,它允许应用程序实例化和访问远程计算机上COM对象的属性和方法。DCOM 使用远程过程调用(RPC)技术将组件对象模型(COM)的功能扩展到本地计算机之外,因此,在远程系统上托管COM服务器端的软件(通常在DLL或exe中)可以通过RPC向客户端公开其方法。
攻击者可使用 DCOM 进行横向移动,通过 DCOM,攻击者可在拥有适当权限的情况下通过 Office 应用程序以及包含不安全方法的其他 Windows 对象远程执行命令。
使用DCOM进行横向移动的优势之一在于,在远程主机上执行的进程将会是托管COM服务器端的软件。例如我们滥用ShellBrowserWindow COM对象,那么就会在远程主机的现有explorer.exe进程中执行。对攻击者而言,这无疑能够增强隐蔽性,由于有大量程序都会向DCOM公开方法,因此防御者可能难以全面监测所有程序的执行。
介绍
类似wmiexec.py的半交互式Shell,但是使用了DCOM接口,目前支持的接口有MMC20.Application
、ShellWindows
、ShellBrowserWindows
工具
1 | ./dcomexec.py domain/username:password@ip |
powershell
refer
https://www.freebuf.com/articles/network/261454.html
https://xz.aliyun.com/t/9691?time__1311=n4%2BxnD0DuDRDgD02DhD%2Fia4BKK0KKhR%2Bqq%2BFID
__END__