从此认识到自己不是做win安全的料
个人认为JuictPotato的前身是著名的Rotten Potato
- 使用CoGetInstanceFromIStorage API 调用欺骗RPC,对代理进行身份验证.在此调用中指定了代理 IP/端口
- RPC 向代理发送 NTLM 协商包
- 代理依赖的NTLM协商到RPC在端口135,被用作模板。同时,执行对AcceptSecurityContext的调用以强制进行本地身份验证
注:此包被修改为强制本地身份验证.- & 5. RPC 135和AcceptSecurityContext用NTLM Challenge回复
- 将两个数据包的内容混合以匹配本地协商并转发到RPC
- RPC使用发送到AcceptSecurityContext(8.)的NLTM Auth包进行响应,并执行模拟
-
【PotatoAPI】创建COM监听器
startCOMListenerThread
-
初始化
WinSocket
,创建非阻塞式socket,并监听-t
端口。跳转到2,后面的就是监听循环中的 -
【LocalNegotiator】使用
processNtlmBytes
处理返回地NTLM信息。处理顺序刚好是1,2,3- 首先获取安全主体的预先存在的凭据的句柄,初始化Client和Sever的Token,建立安全上下文(新进程的身份验证),转发给RPC
- RPC返回NTLM挑战应答问题,新进程的身份验证也会返回他的NTLM挑战应答问题,然后改装RPC的数据,塞入新进程的身份验证的NTLM挑战应答的部分数据
- 从系统回答中,创建新的system令牌
-
-
【PotatoAPI】同本地135端口建立RPC连接,发送消息从
PotatoAPI->rpcSendQ
走出队列 -
【PotatoAPI】触发
triggerDCOM
StgCreateDocfileOnILockBytes
:创建Istorage对象- 【IStorageTrigger】创建
IStorageTrigger
对象 CLSIDFromString
:将CLSID字符转为COM对象CoGetInstanceFromIStorage
:创建一个新的 对象,使用IPersistFile::Load
初始化- 触发DCOM后,进入1中的监听循环
-
通过得到的system token,经典的
CreateProcessWithTokenW
创建新的进程
要一个人写的话工作量还是挺大的,而且IstroageTrigger
得自己构造,感谢开源PoC!