windows访问令牌 深度利用 [ 上 ]

  • A+
所属分类:安全文章

windows访问令牌 深度利用 [ 上 ]


0x01 本节重点快速预览

  • 访问令牌在windows中到底是干什么用的? 想成功窃取指定系统用户令牌的必要前提条件是什么?

  • 如何借助CobaltStrike来窃取伪造当前机器指定系统进程中的用户访问令牌

  • 如何利用meterpreter自带的incognito模块来窃取伪造当前机器指定系统进程中的用户访问令牌

  • 借助incognito以任意用户身份的访问令牌去执行任意payload

  • 利用Invoke-TokenManipulation.ps1无文件窃取指定用户身份令牌执行任意payload

  • 借助Invoke-TokenManipulation.ps1窃取system访问令牌以实现mssql本地免密码登录

  • 通过 Tokenvator.exe来窃取伪造模拟指定用户的访问令牌去执行任意payload

  • 最后一种方式就是通过Mimikatz来伪造指定用户的访问令牌,此处暂以同步目标域内的所有域用户密码hash为例


0x02 访问令牌在windows中到底是干什么的以及想成功窃取指定系统用户令牌的必要前提条件又是什么

维基百科上的标准描述是这样的,访问令牌是windows用于确定指定进程或线程安全上下文的一种对象,讲的通俗一点就是这么个意思,当前系统中的某个进程或线程能访问到什么样的系统资源,完全取决于你当前进程是拿着谁的令牌,比如,有些需要用管理员令牌的资源,你拿着普通用户的令牌肯定是访问不到了[暂且不要把它狭隘的理解平常我们所熟知的那个密码,密码只是所有认证方式里最简单粗暴的一种,并不是唯一],众所周知,在windows中我们通常只会关注两种令牌,如下


  • 一种就是授权令牌  [Delegation token],这种令牌通常用于本地及远程RDP登录

  • 一种就是模拟令牌  [Impersonation token],这种则通常用于各种非交互式的登录,比如,net use ,wmi,winrm 等等...


    注: 上面的这两种令牌,都会在系统重启以后被清除, 否则将会一直驻留在内存中,而授权令牌则会在用户注销以后自动被转为模拟令牌,但仍然可利用,至于更详细深度的理解,此处暂不多做说明,可自行去参考微软官方文档,毕竟,本次的目的也并非要带大家写这样的工具

默认情况下,当前用户肯定是只能看到当前用户自己和比自己权限低的所有访问令牌,这无可厚非,现代操作系统在早期就是这样来设计用户空间ACL的,所以,如果你想看到系统中所有用户的访问令牌,那就务必要将自己当前用户的权限提到一个特权用户的身份上,比如,windows的system或者administrator,这样你才能看到当前系统中所有用户的访问令牌,至此,我想我应该是把一些必要的利用前提大致说清楚了


0x03 借助CobaltStrike来窃取伪造当前机器指定系统进程中的用户访问令牌

    首先,既然是用CobaltStrike,那我们肯定就要想办法先把beacon弹回来再说,这里暂且还是用我们之前提到的aspx执行shellcode,来把beacon弄回来,而后再简单看下当前系统的详细基础配置信息[08r2,后面要用powershell,所以提前说明下],具体如下

windows访问令牌 深度利用 [ 上 ]

windows访问令牌 深度利用 [ 上 ]


接着,再简单的看下当前机器的基础网络配置,发现当前机器是处在目标域内网下的,我们都很清楚,对于一般性的域渗透来讲,在前期我们绝大部分的时间可能都会花在如何去搞到域管密码或者密码hash随后登到域控拿下整个目标域中的机器权限[至于如何bypass 目标的各种入侵检测防护以及在后渗透中如何实现更隐蔽的权限维持,那些都是非常大的内容,此处暂且不说],此处想说明的主要还是另一种不需要域管密码或者密码hash也能拿下域控权限的常用方式,具体是这样,先尝试提权拿下当前机器,假设在当前机器中就有域管进程[也就是说在这些进程中有域管的访问令牌],那么,此时我们就可以通过窃取伪造域管令牌的方式去直接以域管的身份访问域控,这个效果其实是跟你拿着域管的密码或者hash直接wmi或者net use过去的效果是一模一样的,想必说到这里,大家对windows访问令牌的利用应该都已经有个初步的认识了,下面我们就来简单看下具体的利用过程到底是怎样的

windows访问令牌 深度利用 [ 上 ]


我们在开头已经详细说明过,要想看到当前机器中的所有用户访问令牌,必须要先把自己提到一个系统特权身份上[对于windows来讲,一般情况下,都是指system权限],我们也看到了,当前回来的shell权限只是一个很低的web服务权限,所以我们要先来尝试提下权,如下,提成功以后,就会弹回一个system权限的shell,注意,这里仅仅只是个最简单的提权demo[提权也并非今天重点,不多做说明],在实战中,一般情况下都绝不会这么轻轻松松就能提成功,后续有机会再慢慢聊

windows访问令牌 深度利用 [ 上 ]


如下,拿到当前机器的system权限以后,我们就可以用它来尝试真正的干些活儿了

windows访问令牌 深度利用 [ 上 ]


    比如,我们现在就可以先去试下,直接去dir域控机器的windows目录,你会发现它提示没权限,这很正常,因为你当前还没有提供任何的认证凭据 [比如,域管的账号密码或者密码hash,再或者域管令牌]

windows访问令牌 深度利用 [ 上 ]


那么,紧接下来的事情就很清晰了,首先,你得先去找下当前机器中的任意一个域管进程并确定其进程id,因为我们现在已有了当前机器的system权限,所以,理论上你应该可以看到机器中的所有用户进程,这其中就包括域管的,至于怎么去快速确定当前域内的哪些机器上可能存在域管进程,后续会再单独提供一些靠谱的思路,如下,我们发现了当前机器中有一个用域管起的java进程[其实是我事先起好的tomcat服务],注意此处进程身份前面显示的虽然是以本地管理员身份起的,但实际上tomcat是用域管的身份来运行的,有个众所周知的细节,需要稍微知道下,当一台机器加到某个域中时会自动往当前机器的administrators组添加一个域管用户,这也就是为什么域管可随意管理当前域内的任意一台机器的关键原因之一

windows访问令牌 深度利用 [ 上 ]


Ok,大致情况摸清楚以后,我们就先用beacon内置的steal_token工具,来尝试窃取上面那个java进程中的域管令牌,当看到提示模拟域管令牌成功后,此时我们再直接去dir域控的windows目录,发现就可以正常访问了,这也就是我前面一直在说的,当前拥有什么样的访问令牌直接决定了你能访问到当前或远程机器中的哪些系统资源,至此,借助CobaltStrike来窃取伪造指定进程的用户访问令牌的简单演示就说完了,实战中一般也都不会这么简单容易,某些AV可能还会是最大的障碍,这就需要团队配合或者自行解决了

windows访问令牌 深度利用 [ 上 ]

    

    注意,当我们用完某个用户的访问令牌以后,一定要记得再把它顺手还原回去,在beacon也内置了一个叫rev2self工具,直接执行即可把当前令牌还原为原来的用户令牌,因为是在提到system以后才做的操作,所以就直接给还原到了system下,实际效果如下

windows访问令牌 深度利用 [ 上 ]


0x04 如何利用meterpreter自带的incognito模块来窃取伪造当前机器指定系统进程中的用户访问令牌

    此处,就暂且以已事先拿到目标的一台个人机的meterpreter为例,并以此对整个令牌窃取伪造利用过程做个简单的演示,由于是个人机,通常情况下,回来的可能都是一个被"降权"的"管理"用户,所以我们需要先bypass下UAC,弹回一个真正的administrator权限的shell

windows访问令牌 深度利用 [ 上 ]


具体的UAC bypass过程如下,我们暂且就用bypassuac_eventvwr模块来搞[因为它相对更通用些],一切顺利的情况下,我们应该就可以弹回一个真正意义上的administrator权限的meterpreter,如下,此后,为了方便后续操作可直接执行getsystem,先把shell提到system下,最后列举当前系统中的所有可用令牌,如下图所示,在授权令牌的那部分我们发现了域管的访问令牌,没错,这也正是我们想要的

windows访问令牌 深度利用 [ 上 ]


另外,不妨再回去看一下,当前这台机器其实也是处在rootkit.org这个域中的

windows访问令牌 深度利用 [ 上 ]


在还没有尝试窃取域管令牌的情况下去直接dir域控的windows目录,很明显,提示没权限

windows访问令牌 深度利用 [ 上 ]


此时,我们尝试载入incognito模块,列举当前系统中的所有可用令牌,并伪造ROOTKITadministrator[这里稍微注意下格式]域管的访问令牌,具体过程如下

windows访问令牌 深度利用 [ 上 ]


由于上面成功伪造令牌,这次我们再去直接dir域控的windows目录就可以正常访问了,效果如下,ok,至此,整个基于meterpreter下的令牌窃取伪造利用过程就结束了,不过说实话,实战中,能直接就用msf来这样搞的情况真的不太多,其实,关于msf各个协议的payload包括用于免杀的各种编码器[里面的所有算法几乎都已经被av盯的死死的] 早都已经被无数人分析了无数遍,在一些目标环境中,想存活下来的几率几乎为0,个人建议,没必要在msf上去花过多的时间,单实战意义来讲不是特别大,当然,日常用来学习还是可以的

windows访问令牌 深度利用 [ 上 ]


0x05 借助incognito工具以任意用户身份的访问令牌去执行任意payload

图方便,这次我们就暂且直接在目标系统的cmd下进行各种操作,首先,还是先用psexec弹个system权限的cmd出来以进行后续的各种演示,顺手准备好CobaltStrike payload,因为等会儿要用incognito.exe来模拟其它用户令牌来执行该payload,在system权限的cmd下通过incognito.exe我们可以看到,当前机器存在administrator用户的访问令牌,注意,因为这里只是个简单demo,实战中不一定就非得是administrator这个用户,它也可以是其它的任意用户的令牌,比如,其它域的域用户,众所周知,搜集指定目标域中资源最简便快捷的方式就是以那个域的某个域用户身份去操作,那么你就可以通过这种伪造令牌的方式,去搜集那个域的信息,而后继续渗透那个域,除此之外,由于系统用户间环境变量的不同,导致在执行某些操作时,会出些小问题,比如,你以system权限去启动某些系统服务时可能就会出现某些异常...这个时候也许你只需要把自己降权到一个完全正常的administrator上再去启动应该就不会有什么问题了,诸如此类的情况吧,想必说到这里,弟兄们也都应该明白我说的什么意思了,ok,如下是具体操作

windows访问令牌 深度利用 [ 上 ]

windows访问令牌 深度利用 [ 上 ]

windows访问令牌 深度利用 [ 上 ]

windows访问令牌 深度利用 [ 上 ]


关于incognito.exe的具体用法格式如下

windows访问令牌 深度利用 [ 上 ]


可以看到,新弹回来的那个beacon就是一个正常的administrator权限的beacon

windows访问令牌 深度利用 [ 上 ]


0x06 利用Invoke-TokenManipulation.ps1 "无文件"窃取指定用户身份令牌执行任意payload

图方便,同上就不在beacon中进行操作了,如果是在实战中,你可以直接把本地的ps脚本通过beacon远程加载到目标机器上去用,都非常简单,就不细说了,还是直接在目标系统的cmd下搞,先把powershell起起来而后把Invoke-TokenManipulation.ps1脚本加载进去,当然啦,在此之前依然还是先想办法把自己当前提到system权限下,通常情况我们只需跟上-Enumerate选项即可枚举当前系统中所有用户的访问令牌

windows访问令牌 深度利用 [ 上 ]


同样,在当前机器中发现了域管的令牌,至于具体利用就不再废话了

windows访问令牌 深度利用 [ 上 ]


因为我们当前是system,比如,现在你就想以一个正常的本地管理员的身份重新起个cmd,如下

windows访问令牌 深度利用 [ 上 ]


比如,我们又发现某个进程是以域管的身份起的,现在我们想直接用这个域管进程的用户身份去重新起个cmd,也可以以像下面这么干

windows访问令牌 深度利用 [ 上 ]


0x07 借助Invoke-TokenManipulation.ps1窃取system访问令牌以实现mssql本地免密码登录

在说这个之前,首先,我要特别感谢下T4skill兄弟,毕竟,最初的想法完全是从他那里来的,当然啦,像这样认真做事的兄弟,自己的密圈里其实还有很多很多,这也是自己创建小密圈的一个非常重要的初衷,所以,如果你真的是同路人,不妨加进来大家一起交流,相信实实在在的收获会非常非常大,众人的力量才是不可估量的,至于一些乱七八糟,另有他图兄弟,为了尽量不浪费彼此的时间,就不要来了,非常感谢,ok,咱们接着说正题,mssql本地免密码登录的核心其实就在于mssql支持以windows本地登录验证,默认情况下,用于安装mssql的administrator用户[一般在windows服务器也都是这个用户]和system用户[其实也并非完全是这样,这还要看你在安装mssql时指明用的那个用户来跑服务的]直接在本地以windows验证方式登录是不需要密码直接连接即可登录的,也正是由于此,我们才可以通过窃取system的 token 的方式,直接在目标机器本地实现免密码登录mssql

一般都是什么情况才会导致必须要这么干呢? 比如,你现在已经通过其它的方式拿下了当前这台数据库服务器的最高权限[比如,system权限],但比较蛋疼的是,你抓不到当前系统管理员的明文账号密码,管理员密码hash虽然是抓过来了,但死活跑不出来,数据库的任何账号密码都没有,但是我还想要当前机器中的数据库中的数据,怎么办呢,可以这样,等你确认那边管理员不在的时候,你可以先在这台机器创建个管理用户,然后rdp登过去,登上去以后,当你试着直接打开SQL Server Management Studio 以windows认证方式执行本地连接时却连不上[连不上的原因可能是因为你当前这个用户并不是安装mssql的用户,所以,认证通不过,不能达到免密码的效果],这怎么搞呢,其实也非常简单,先在目标桌面里面起个system权限的cmd,而后直接用这个权限的cmd去启动SQL Server Management Studio就可以了,或者可以更直接点,就像我们下面这样直接用powershell一键搞,此时,同样是以windows认证直接无需密码即可登录,具体如下

windows访问令牌 深度利用 [ 上 ]

windows访问令牌 深度利用 [ 上 ]


    如下,找到SQL Server Management Studio的客户端的绝对路径直接以system权限去启动

windows访问令牌 深度利用 [ 上 ]


之后会正常弹出mssql的登录界面,此时你只需要在Server name中输入'.[表示本地,当前机器]',而后点击connect即可直接连进去,过程中不再需要输入任何密码,如下是实际的连接效果,至此,关于Invoke-TokenManipulation.ps1脚本的利用,也就算顺带着说完了,对了,脚本中一样也提供了RevToSelf选项,当你用完某个用户令牌后,记得再把它恢复回来,话说回来,如果目标机器环境确实允许你这么干,对于windows来讲,个人肯定推荐首选powershell,当然啦,有时候碰到内网断网机直接IEX外网加载就不大现实了,其实也并不是完全不能用,你可以试着把这些ps脚本都统一放到目标边界的一台已控的web机器的指定站点目录下,放的隐蔽点就行,而后再去内网的其它机器上IEX这台边界机器就行,这也只是其中的一种办法,并不是绝对,唯一的缺点就是powershell不能适用于一些老系统上,不过也没多大关系,用incognito.exe或者后面的Tokenvator.exe去搞也都是一样的

windows访问令牌 深度利用 [ 上 ]

windows访问令牌 深度利用 [ 上 ]


0x08 通过 Tokenvator.exe来窃取伪造模拟指定用户的访问令牌去执行任意payload

    还是接着最上面的说,这里的1892其实就是我们前面说的那个里面有域管令牌的的java进程[以rootkitadministrator的身份去起的tomcat服务],只不过,此处我们换个工具来搞,用Tokenvator.exe来模拟域管去执行任意payload,具体如下

windows访问令牌 深度利用 [ 上 ]


    随后,我们发现弹回来的这个就是一个域管[rootkitadministrator]权限的beacon,那后面的事情,想必大家也都应该很清楚了,这里就不多废话了

windows访问令牌 深度利用 [ 上 ]



0x09 最后一种方式就是通过Mimikatz来伪造指定用户的访问令牌,此处暂以同步目标域内的所有域用户密码hash为例

    

    首先,用本地管理员权限执行Mimikatz,先查看当前用户令牌,接着,查看当前系统中的所有用户令牌,而后,把当前令牌提为system,紧接着,再去查找域管令牌,最后,模拟域管令牌去同步出域内所有用户的密码hash


mimikatz # token::whoami 查看当前用户令牌

mimikatz # TOKEN::List 查看当前机器中的所有用户令牌

windows访问令牌 深度利用 [ 上 ]


mimikatz # TOKEN::Elevate 把当前提升为system令牌

mimikatz # TOKEN::Elevate /domainadmin 模拟域管令牌

windows访问令牌 深度利用 [ 上 ]


mimikatz # lsadump::dcsync /domain:rootkit.org /all /csv 导出域控种的所有用户的密码hash

mimikatz # token::revert 还原令牌到初始状态

windows访问令牌 深度利用 [ 上 ]


    最后,不妨再看下没有窃取域管令牌之前同步hash的实际效果,很显然,当前用户的另外,在目标域控上的认证没通过,所以才同步不过来

windows访问令牌 深度利用 [ 上 ]


一点小结

    有一点需要非常明确的是,在进行类似的各种令牌窃取伪造模拟利用之前,为避免后续出问题,务必先自行想办法把当前权限提到system下,而后再去搞,另外,上面的有些工具确实都已经比较老了,所以实战过程中的各种免杀问题还需要自行解决,根据此,能衍生出的用法,其实还有非常非常的多,绝不仅限于你在上面看到的这些,比如,上面说到,直接以system起mssql客户端即可实现免密码登录,其实,你也可以这么稍微延伸着想下,是不是还有其它的什么服务也是用windows本地系统用户身份的验证方式去登录呢 ?[比如,vnc...],是不是也可以进行类似的利用呢 ? 这些也都是值得大家可以多思考多实践的地方,虽然都是些微不足道的小技巧,但关键时候,他们往往就能派上大用场,自己还是那句话,工具是死的,人是活的,工具的好坏,完全取决于人怎么用,就像wireshark一样,在某些人手里就像尤物,而在某些人手里跟狗屎也差不太多,你觉得能单单这样去评价某些工具的好坏吗,说白点,对协议的熟练程度,直接决定了wireshark在你手中能产生的实际价值,再多的废话就不多说了,只是想让某些朋友明白,一定要先花点儿时间去好好思考你想做什么,然后才是怎么做,做到什么程度,至于如何更靠谱的去发现域内所有存在域管进程机器,待我解决后,会分享到密圈,最后,还是祝大家好运吧 ^_^


注: 写文不易,公众号之外的转发请务必通过此公众号与作者本人联系并严格声明文章出处,非常感谢 ! 


    更多更优质的精品原创实用技术干货分享,和众多资深apt及红队玩家一起深度无缝交流,欢迎微信扫码加入小密圈,另外,关于本文完整pdf原件现也已分享到自己密圈中,我们会在那里一直等你 

windows访问令牌 深度利用 [ 上 ]


    更多优质公开技术分享,欢迎关注个人公众号 "红队攻防揭秘",另,同时欢迎大家的无私 转发 , 打赏 , 点赞 与 留言, 非常感谢 

windows访问令牌 深度利用 [ 上 ]


本文始发于微信公众号(红队防线):windows访问令牌 深度利用 [ 上 ]

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: