大家知道本地系统访问权限的Windows用户可以重置其他用户的密码,但其实,本地权限用户还可以劫持其他用户的会话呢,包括管理员用户,而这个过程不需要知道用户密码。

以色列安全研究员Alexander Korznikov在个人博客中披露,本地高权限用户可以劫持任何已登录Windows用户会话,而不需要知晓用户密码,所需工具也仅仅是内置命令行工具。即便已登录用户权限较高,也难以幸免。

发现过程

首先我们来看段视频:RDP劫持有sethc后门的主机

Korznikov最近在研究sethc/utilman登录界面后门,基本上每次都只用到了命令行。一个偶然的情况下,Korznikov查看了任务管理器(taskmgr.exe)中的用户项,然后点击“连接”,居然真的可以连上选中用户的会话。

taskmgr1.png

Korznikov再用本地管理员权限尝试,发现这时就需要用户密码了。

注意事项

1. 必须要有全面控制访问权限或者能够连接的访问权限,来连接到另一个会话。

2. 用/dest:<SessionName>参数,可连接不同用户的会话。

3. 如果在<Password>参数中没有指定特定密码,且目标会话不是当前用户会话,那么tscon就会失效。

其实就是Windows登录界面的粘滞键是使用NT AUTHORITY/SYSTEM用户身份运行的,也就是以系统身份运行,拥有完全控制访问权限,可以连接到任一用户会话,无需密码。

这就有了我们上面所说的会话劫持。这里最有趣的点在于,用这个技术去劫持,系统不会请求合法用户登出,而是在没有任何通知的情况下,直接将用户踢出。

漏洞细节

本地用户若能获取NT AUTHORITY/SYSTEM权限执行命令,就能够劫持任何处于已登录用户的会话,而无需获得该用户的登录凭证。终端服务会话可以是连接状态也可以是未连接状态。

Korznikov认为这是个高危漏洞,可允许任何本地管理员劫持会话并访问:

1. 域管理员会话;

2. 被劫持用户正在处理的任何未保存文件;

3. 被劫持用户先前登录的任何其他系统或应用(可能包括其他远程桌面会话、网络共享映射、需要其他登录凭证的应用、邮箱等)

实现条件

要成功利用,攻击者必须物理接触目标设备;不过,用RDP会话,也可以远程实现攻击。

影响版本

Windows 2016(推特用户@GossiTheDog证实)

Windows 2012 R2

Windows 2008

Windows 10

Windows 7

PoC

用命令行实现,这个微软文档可以帮助我们:https://technet.microsoft.com/en-us/library/cc771505(v=ws.11).aspx

实现这些只需要NT AUTHORITY/SYSTEM命令行。用psexec很容易实现,但前提是要有psexec.exe

psexec -s \\localhost cmd

另一种方法是创建一个服务,来连接目标会话。

1. 获取所有会话信息:


C:\Windows\system32>query user

 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME

 administrator                             1  Disc            1  3/12/2017 3:07 PM

>localadmin            rdp-tcp#55          2  Active          .  3/12/2017 3:10 PM

C:\Windows\system32>

2. 创建劫持用户会话的服务


C:\Windows\system32>sc create sesshijack binpath= "cmd.exe /k tscon 1 /dest:rdp-tcp#55"

[SC] CreateService SUCCESS

3. 启动服务

net setart sesshijack

之后,当前会话就会替换成目标

视频

用任务管理器在Windows7上实现

用命令行在Windows7上实现

用创建服务在Windows12 R2上实现

这个真的是漏洞么?

Korznikov发现的这个问题并不完全是新的,六年前,有个名叫Benjamin Delpy的法国安全研究员也在自己的博客中记录了类似的用户会话劫持技术。

所以,其实微软早就意识到这个问题的存在了,不过微软很可能没有将其视为漏洞,毕竟需要目标设备的本地管理员权限,微软很可能认为这是操作系统应有的行为。

安全研究员观点

可能有人会认为这不算漏洞。但Korznikov认为它还是有很高的利用价值,他举了个例子来说明:

某银行职员能够访问账务系统,并有登录凭证。

某天,该职员正常来上班,登录账务系统,并开始日常的工作。然后,到吃饭的点了,他就锁定了工作站,吃饭去了。

这时候,某系统管理员接近该员工的工作站,然后用管理员账户登录。根据银行的政策,管理员账户不能访问账务系统,但是只需要几行内置命令,这个管理员就可以劫持去吃饭的员工锁定的桌面。得手之后,这个管理员就可以以账务员工身份在账户系统中为所欲为。

Korznikov认为像这样的例子还有很多啊!

而且,攻击者不需要metasploit、incognito、mimikatz这样的工具,只要内置命令就可以!每一个管理员都可以伪装成任何登录用户,这个可以在物理访问的情况下实现,也可以通过远程桌面协议实现。

Korznikov还就这个问题跟6年前的发现者Benjamin Delpy沟通了一番,Delpy认为:“这是正常的Windows API,这就是设计流程,他们就这样用。像你之前提到的一样,如果你是管理员,你什么都能做。那么你为什么成为管理员以及如何成为管理员?如果某个低权限用户本地提权成为管理员,那才是问题,并不是我们讨论的设计流程。你什么都能做,你还可以修改终端服务,让该服务接受你的token并允许影子模式,而用户完全不会知道这个事情。”

*参考来源:thehackernewskorznikov的博客,FB小编kuma编译