Potato家族提权学习

声明

出品|博客(ID:moon_flower)
======================

以下内容,来自moon_flower作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

Origin Potato(MS08-068)

原理就是上文提到的ntlm反射,

图片

重点看一下修复,微软在kb957097补丁中通过修复SMB身份验证答复的验证方式来防止凭据重播。当主机A向主机B进行SMB认证的时候,将 pszTargetName设置为cifs/B,然后在 type2拿到B发送的Challenge之后,在lsass里面缓存 (Challenge,cifs/B),接着B拿到A的ype3,这时会去检查lsass缓存里是否有 (Challenge,cifs/B),如果有就说明这是同一台主机,那么认证失败。

Hot Potato(MS16-075)

影响范围Windows 7,8,10,Server 2008以及Server 2012,经典的ntlm relay 攻击链,依靠windows update触发。

工具地址:

https://github.com/foxglovesec/Potato

图片

实现流程:

1.本地 NBNS Spoofer :冒充名称解析,强制系统下载恶意 WAPD 配置2.伪造 WPAD 代理服务器:部署 malicios WAPD 配置,强制系统进行 NTLM 认证3.HTTP -> SMB NTLM 中继:将 WAPD NTLM 令牌中继到 SMB 服务以创建提升的进程
流程分3步,首先进行本地NBNS欺骗,windows通常通过这一协议进行域名
解析,当windows在hosts文件和dns查询都搜索失败后,会再进行NBNS
查询,在本地广播域中向所有的主机发出UDP广播询问。

但是直接嗅探到网络流量信息需要本地管理员权限,这里曲线救国。

如果我们能提前知道NBNS请求所对应的目标主机的主机名(目标主机 127.0.0.1),就可以创建一个虚假的应答信息,并快速地使用NBNS应答信息来对目标主机进行泛洪攻击。

因为NBNS数据包中有一个长度为2子节的数据-TXID,要求与请求和应答信息相匹配,所以要通过泛洪暴力枚举65536 个可能性。

这是没有匹配到dns的情况,如果之前就保存了主机的DNS记录,那么可以使用UDP端口枯竭(使每一个UDP端口失效),迫使目标系统中所有的DNS查询失败。

下一步是伪造WPAD代理服务器,在windows操作系统中,IE浏览器在默认情况下会通过http://wpad/wpad.dat来自动尝试检查网络代理,同时也有其它一些windows中的服务会采用这一机制(比如利用中提到的Windows Update)。

但是并不是所有网络中都可以正常访问这个url(不是所有的dns域名服务器都存在主机wpad),那么我们就可以伪造一个WPAD代理服务器,结合前文的本地NBNS欺骗,就可以声称WPAD主机的ip地址是目标地址(127.0.0.1)。

这时127.0.0.1本地运行一个HTTP服务器,当收到http://wpad/wpad.dat请求时,做以下答复:

FindProxyForURL(url,host){    if (dnsDomainIs(host, "localhost")) return "DIRECT";    return "PROXY 127.0.0.1:80";
这样目标上所有的 http 流量都通过127.0.01重定向。之前对于NTLM 反射的补丁只限于SMB->SMB,但NTLM支持跨协议,也就是说像HTTP->SMB仍可正常工作。

现在HTTP流量都会途径我们控制的HTTP服务器,那么就可以将其重定向到

URL: http://localhost/GETHASHESxxxxx,以NTLM身份验证的401请求响应(其中xxxxx是某个唯一标识符)。然后将NTLM凭据中继到本地SMB监听器以创建运行用户定义命令的新系统服务。

当这个请求由高权限发起的时候(比如windows update,system权限),就完成了提权。再看一下漏洞的触发,依赖于发送http://wpad/wpad.dat请求,而当windows已经由WPAD的缓存条目或因为没有找到WPAD而允许直接上网时,需要30-60min才会刷新。

Rotten Potato(MS16-075的变种)

通过DCOM call来使服务向攻击者监听的端口发起连接并进行NTLM认证,

需要SelmpersonatePrivilege权限。

可以立即触发,不需要等待windows更新。

影响范围:< win10 1809和windows server 2019

图片

实现流程:

1.通过 NT AUTHORITY/SYSTEM 运行的 RPC 将尝试通过 CoGetInstanceFromIStorage API 调用向我们的本地代理进行身份验证2.135 端口的 RPC 将用于回复第一个 RPC 正在执行的所有请求充当模板3.AcceptSecurityContextAPI 调用以在本地模拟 NT AUTHORITY/SYSTEM
首先是用CoGetInstanceFromIStorage尝试从调用者(system)指定的位置获取指定对象的实例,下面代码试图从127.0.0.1的6666端口上获取一个BITS对象。(实际上是从IStorage中获取对象)

其中,CLSID是标识COM类对象的全局唯一标识符,类似uuid。BITS(后台只能传输服务)实现从HTTP web服务器和SMB服务实现文件共享,BITS实现了 IMarshal接口并允许代理声明强制NTLM身份验证。

public static void BootstrapComMarshal(){IStorage stg = ComUtils.CreateStorage();//使用已知的本地系统服务 COM 服务器,在此强制执行 BITSv1Guid clsid = new Guid("4991d34b-80a1-4291-83b6-3328366b9097");TestClass c = new TestClass(stg, String.Format("{0}[{1}]", "127.0.0.1", 6666)); // ip and portMULTI_QI[] qis = new MULTI_QI[1];qis[0].pIID = ComUtils.IID_IUnknownPtr;qis[0].pItf = null;qis[0].hr = 0;CoGetInstanceFromIStorage(null, ref clsid, null, CLSCTX.CLSCTX_LOCAL_SERVER, c, 1,       qis);}
现在有一个COM试图连接127.0.0.1:6666(通过RPC协议),那么我们在6666
端口上建立一个本地TCP监听器,如果这时我们以正确的方式回复,
那么这个COM(system 权限运行)就会尝试与我们进行NTLM身份验证。在这里我们做的是将6666接收到的数据包中继到本地的135端口的RPC监听上,并将135端口返回的数据包作为回复COM的模板。

如果从调用函数的层面理解NTLM的认证过程,有下图:

图片

重点看服务端的调用,首先调用acquirecdentialshandle获取相应的句柄,然后用AcceptSecurityContext处理type1,这个函数的输出就是type2的消息,该消息将被发送回试图进行身份验证的客户端,这里就是DCOM。

当客户端回复type3后,服务端将其传递给AcceptSecurityContext,以完成身份验证并获得令牌。在我们的攻击中,type1被转发到了RPC的135端口上,RPC回复一个Type2,但不是直接转发回去,需要在中转的时候进行一些处理,这里做的使用AcceptSecurityContext 调用的结果替换发送到COM数据包中的NTLM blob(?)。

但为什么要这样?因为我们需要的是用system账户运行的COM来完成NTLM Challenge和Reserved(我们使用这两个部分来协商本地令牌),所以如果不替换,后续再次调用AcceptSecurityContext就会失败。

到现在为止,我们能确定的是,客户端以system权限执行的COM需要对服务端返回的NTLM type2数据包中的NTLM Server Challenge和Reserved部分进行一些操作(magic?)

而只有对AcceptSecurityContext生成的结果执行这些操作的时候,才能获得令牌。

这里的Reserved字段实际上是对SecHandle的引用,当system账户接收到 NTLM type2的消息时,会在内存中进行Reserved验证(如果没有替换,将被认证为RPC而不是我们。

完成上述操作后,system权限运行的COM将向我们发送type3(是空的?),

但会用它来调用AcceptSecurityContext。最后使用其调用结果用

ImpersonateSecurityContext获得一个模拟令牌。

有了模拟令牌,根据 SeImpersonate 权限的特性,可以以此令牌创建进程(基本直接翻译原文,其中有很多地方还不是很理解,有错误希望各位师傅指出)

原版的Rotten Potato的实现基于meterpreter shell,后来有人写了webshell的版本(也就是Lonely Potato)。

复现:新建一个IIS服务器,传上shell,连上马

图片

尝试获取不同权限,直接cd到public中可以获取IUSR权限

图片

用烂土豆提权:

图片

PrintSpoofer

看这个洞之前先回顾一下getsystem的原理那篇文章,提权的原理就是诱使 system权限的服务访问我们指定的命名管道,getsystem提供各种模式欺骗 system连接管道:

图片

其中第5个就是PrintSpoofer,利用了打印机组件路径检查的bug。
项目地址:

https://github.com/leechristensen/SpoolSample

Windows的MS-RPRN协议用于打印客户机和打印服务器之间的通信,默认情况下启用。

协议定义的RpcRemoteFindFirstPrinter-ChangeNotificationEx()

调用创建一个远程更改通知对象,该对象监视对打印机对象的更改,并将更改通知发送到打印客户端。

DWORD RpcRemoteFindFirstPrinterChangeNotificationEx(     /* [in] */ PRINTER_HANDLE hPrinter,    /* [in] */ DWORD fdwFlags,    /* [in] */ DWORD fdwOptions,    /* [unique][string][in] */ wchar_t *pszLocalMachine,    /* [in] */ DWORD dwPrinterLocal,    /* [unique][in] */ RPC_V2_NOTIFY_OPTIONS *pOptions)
同时,Print Spooler服务的RPC接口暴露在命名管道:\\.\pipe\spoolss 中,
该服务默认开启。其中pszLocalMachine是指向表示客户端计算机名称的
字符的指针,需要传递一个UNC路径,传递\\127.0.0.1时,服务器会访问\\127.0.0.1\pipe\spoolss,但这个管道已经被系统注册了,并由NT AUTHORITY\SYSTEM控制。那么下一步就是要想办法把这个请求让
我们准备好的恶意管道接收。

考虑到UNC路径的性质,如果主机名包含/,它将通过路径检查,但真正连接的时候会转化为\ 。那么,如果传递一个\\127.0.0.1/pipe/foo,检查时会认为127.0.0.1/pipe/foo是一个主机名,随后在连接named pipe时会对参数做标准化,于是就会连接\\127.0.0.1\pipe\foo\pipe\spoolss,那么攻击者就可以把主机名改为\\127.0.0.1/pipe/foo并注册这个named pipe从而窃取 client的token。

工具地址:

https://github.com/itm4n/PrintSpoofer

还有crisprss修改的免杀版:

https://github.com/crisprss/PrintSpoofer

图片

参考

  • https://www.anquanke.com/post/id/92908

  • https://forum.butian.net/share/860

  • https://tttang.com/archive/1560/

  • https://www.anquanke.com/post/id/217397

  • https://www.anquanke.com/post/id/83322

  • https://www.anquanke.com/post/id/194514

欢迎关注长白山攻防实验室微信公众号
定期更新优质文章分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13925.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

potato电脑版连接不上_potato chat正式版PC端安装教程

potato chat正式版PC端是一款非常优秀的聊天工具,potato chat正式版PC端具有快速、安全、云存储等特点,它支持主流的操作系统进行使用,也可选择您需要使用的平台,支持windows、mac、linux、ios、android、web多平台;软件的功能方面也比较的全面,支持多国语言进行使用,可…

PG::Potato

nmap -Pn -p- -T4 --min-rate1000 192.168.171.101 nmap -Pn -p 22,80,2112 -sCV 192.168.171.101 打开80端口未发现可利用的服务 尝试对路径爆破&#xff0c;同时FTP可匿名访问&#xff0c;查看FTP内是否有可用信息 dirb http://192.168.171.101 在FTP中得到了网站源码的…

python实现一个土豆聊天 potato chat 机器人

python实现一个土豆聊天 potato chat 机器人 一、下载安装1、 官网&#xff1a; [https://www.potato.im/](https://www.potato.im/)&#xff0c; 下载对应版本的程序 二、创建机器人1、创建机器人注册开发者注册开发者成功后&#xff0c;创建机器人 2、获得token设置允许您的机…

ios跳转到potato群聊

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/weixin_43299553/article/details/84632269 首先贴代码&#xff1a; NSString *url [NSString stringWithFormat:"pt://join?invite202cb962ac59075b964b07152d234b70…

ChatGPT | LangChain的文本切割方法对比

本文来自http://blog.csdn.net/hellogv/ &#xff0c;引用必须注明出处&#xff01; ChatGPT面向对话格式的文本理解很好&#xff0c;但如果要把网络上的文章让ChatGPT直接分析则会有格式的问题。文本清洗是个大课题&#xff0c;讲起来需要很多篇幅&#xff0c;优化起来前路漫…

ChatGPT确实有一种即时学习的能力

以下是ChatGPT即时纠正自己错误的一段对话&#xff0c;大家发现了什么没有&#xff0c;欢迎评论。 再次回答时&#xff0c;它立即更正了自己之前的错误&#xff1b; 提问中的个别错别字并没有影响到它对问题的理解&#xff1b; 再次回答时并没有重复第一次回答中的大部分内容&a…

ChatGPT办公应用:制作PPT大纲

正文共 617字&#xff0c;阅读大约需要 4 分钟 解决方案专家必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 制作PPT大纲 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Yuke PPT技能是一…

chatgpt赋能python:Python抢单软件:如何优化SEO?

Python抢单软件&#xff1a;如何优化SEO&#xff1f; 导言 随着互联网技术的飞速发展&#xff0c;越来越多的人开始关注SEO&#xff08;Search Engine Optimization&#xff09;技术。而对于Python编程工程师来说&#xff0c;了解SEO技术也是非常重要的。那么&#xff0c;如何…

腾讯回应与Meta VR头显合作传闻;美国考虑限制中国用户使用美国云计算服务;ChatGPT暂停联网测试|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

比ChatGPT更恐怖的AI应用,来了...

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 这两周AI界真的太刺激了&#xff01;一个接一个令人惊艳的应用发布&#xff0c;比如今天要介绍的这个----AutoGPT。 AutoGPT是做什么的呢&#xff1f;简单的说&#xff0c;你告诉它一个任务&#xff0…

Midjourney学习系列之三——宝藏网站与博主分享

在学习了Midjourney保姆级教程&#xff08;点击Midjourney学习系列之一 —— 保姆级入门教程_输出啊靓仔的博客-CSDN博客阅读&#xff09;和进阶学习内容&#xff08;点击Midjourney学习系列之二 —— Midjourney进阶之路_输出啊靓仔的博客-CSDN博客&#xff09;之后&#xff0…

ChatGPT专业应用:生成直播关注话术

正文共 1120 字&#xff0c;阅读大约需要 7 分钟 直播运营等必备技巧&#xff0c;您将在7分钟后获得以下超能力&#xff1a; 生成直播关注话术 Beezy评级 &#xff1a;A级 *经过寻找和一段时间的学习&#xff0c;一部分人能掌握。主要提升效率并增强自身技能。 推荐人 | Kim …

只会玩ChatGPT?惊艳我们的又不只是它一个对话系统

1. 引言 终于回归到本尊开始上手了。这次是介绍了几个和ChatGPT一样强大或者基于GPT系列的新鲜对话系统&#xff0c;各有优劣和长处吧。大家感兴趣的话可以自己搜索一下&#xff0c;这里仅做简要介绍。 2. ChatGPT ChatGPT是最近最火的&#xff0c;也是我深入上手一星期的产…

让ChatGPT发挥出最强威力的7大技巧!

大家好&#xff0c;我是小z&#xff08;也是阿粥&#xff09; 今天给大家分享一本如何更好的使用GPT的干货书籍——《与 AI 对话&#xff1a;ChatGTP 提示工程揭秘》。 当然&#xff0c;依照惯例&#xff0c;文末有几本作为粉丝福利~ 机器有机器的作用&#xff0c;人有人的独特…

chatgpt赋能python:Python如何创建集合——你必须知道的所有知识

Python 如何创建集合——你必须知道的所有知识 作为一位有10年 Python 编程经验的工程师&#xff0c;我可以告诉你&#xff0c;Python 集合是编程中非常重要的一部分。如果你不知道如何创建集合&#xff0c;那么你可能会错过很多东西。所以&#xff0c;让我们深入探讨 Python …

chatgpt赋能python:Python合并集合:学习如何在Python中合并多个集合

Python合并集合&#xff1a;学习如何在Python中合并多个集合 在Python编程语言中&#xff0c;集合是一组互不相同的元素。在处理数据时&#xff0c;我们通常需要将多个集合合并为一个。Python提供了几种方法来合并集合&#xff0c;本文将介绍这些方法以及如何使用它们。 什么…

chatgpt赋能python:Python中的集合:什么是集合及如何创建集合

Python中的集合: 什么是集合及如何创建集合 当你需要存储一组无序且互不相同的数据时&#xff0c;Python的集合&#xff08;set&#xff09;是一种非常有用的数据类型&#xff0c;它是可变、无序、且不包含重复元素的数据类型。本文将简要介绍Python中的集合&#xff0c;包括其…

我和ChatGPT聊了聊个人知识管理 | ChatGPT实践

话说&#xff0c;昨天我终于申请了一个ChatGPT的账号&#xff0c;完之后&#xff0c;就玩儿嗨了嘛&#xff0c;问东问西地&#xff0c;简直停不下来。 不过除了闲聊之外&#xff0c;还是想借助ChatGPT的帮忙完成一些具体的任务&#xff0c;于是我就和它聊了聊个人知识管理。 文…

Midjourney案例-4步完成海报设计

Midjourney 大家都很熟悉了&#xff0c;大大提高了UED团队出稿制作效率。画面创意也为设计师的思维拓宽了新的边界。此外&#xff0c;Midjourney的多领域专业知识也成为设计师跨越不同领域的有力工具。今天就给大家分享一个 Midjourney 商业化UI应用——ChatGPT分享会海报&…

全网热议的chatgpt是什么?如何参与chatgtp小组件的制作?

ChatGPT是什么&#xff1f; ChatGPT&#xff0c;美国OpenAI 研发的聊天机器人程序 &#xff0c;于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff…