学习
实践
活动
工具
TVP
写文章

后渗透之权限维持——隐藏用户的创建和使用(全程干货)

0x00 前言

在渗透过程中拿下一台主机后很多时候会选择开 3389 进远程桌面查看一下对方主机内有无一些有价值的东西可以利用,但是这也引出了一个问题,只要是登录进程就一定会留下痕迹,虽然在渗透完成后可以通过痕迹清理的方法清除自己登录的"证据",但是在多次渗透的过程中我不禁产生了思考,有没有一种方法能够最大化的隐藏自己登陆过对方主机呢,于是便有了下文

0x01 隐藏用户(影子用户)的创建与利用进行权限维持

这里先提一个概念,在 windows 环境下创建用户如果后面带了一个"$"符号,在 net user 时默认是不显示的,下文基于这个特性展开

利用条件:①获得管理员权限;②得到cmdshell等shell环境(即管理员cmd)

复制代码

操作步骤(我这里以 Windows10 为例):

1.首先利用 cmdshell 添加一个用户名带 $的用户,如:admin$:123456

命令如下:

net user admin$ 123456 /add #添加用户admin$
net localgroup administrators admin$ /add #将admin$用户添加到管理员组administrators

复制代码

使用命令 net user 查看用户发现并没有这个用户

此时可以直接登录 3389 进行操作,但隐蔽性仍不足,可以在控制面板的管理工具中用户与用户组查看到该用户的存在,还需要进一步操作

2.对注册表进行修改,在命令提示符与管理工具中无法查看

当你利用 shell 创建了一个影子用户的时候,利用这个影子用户可以开启 3389 进行登录,在目标机上对注册表进行数据操作,达到提高影子用户的隐蔽性

利用 运行 输入 regedit 打开注册表 ,找到如下图的 SAM

选择 SAM 项 ,在工具栏上的“编辑 > 权限” 中设置权限 ,将 Administrators 组 的权限设置为完全控制 后保存

(拒绝修改不可逆,出错会造成大问题,别点到完全操控的拒绝项,该操作不可逆,利用这个思路,我们可以在修改注册表后再对 System 与 Administrators 权限进行拒绝访问,可防止管理员删除这个用户)

两个权限都修改为允许

设置好后,回到注册表主页面 ,发现 SAM 项下出现了隐藏的子项,找到

SAM > Domains > Account > Users 和 Names

复制代码

分别找到 Administrator 用户和 admin$用户的两个项

Administrator 用户的 F 值(SID):

将 Administrator F 表内的二进制数据复制下来

找一下 admin$用户对应的 SID 和 F 值,如下所示:

将 admin$目录下的 F 值修改为从 administrator 复制得来的 F 值

复制后如图所示

导出 Users 下对应 admin$项

我这里保存到桌面

再把 Names 下对应的 admin$项导出

同样导出到桌面

导出后如图所示

利用 cmdshell(管理员权限)将 admin$删除,删除后发现注册表中的 admin$用户相关项已经消失

net user admin$ /del

复制代码

这时候我们导入已经备份好的项与数值(导出后双击进行导入或者在注册表中导入)

我这里在注册表进行导入

可以看见导入已经成功了

导入成功后回到管理工具中的查看用户与用户组的页面,发现用户组和用户已经没有 admin$这个用户的存在了,但实际上我们仍可以用这个用户的密码进行登录 RDP,而且可以相当于 Administrator 管理员进行登录操作

开启 3389 进行登录,发现问题

发现用户未授权,这时候又多了一个利用条件,要在右下的选择用户下,添加 admin$用户的用户名,才能正常登录 3389

修改后成功登录

0x02 细节拓展

那我们在实战中,是以远程登录界面为基础的。这时,我们又要拓展另一个权限,userauthentication 权限 ,该权限主要是用于远程连接的身份验证,称之为鉴权

我们以图片直观地查看该权限开启与关闭的区别:

开启状态:

关闭状态就会直接进入远程桌面锁屏处

这里有一个重点:

鉴权开启时,我们在不知道账号密码的情况下无法登录到远程界面,但是鉴权关闭之后,无论我们输入的账号和密码是否正确,都可以进入远程界面窗口

首先关闭鉴权模式,我们采用如下命令,这里 0 代表关闭,1 代表开启

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0

复制代码

关闭鉴权模式还不够,还需要关闭 securitylayer 安全层验证

securitylayer 这个安全层验证简单来说就是保证了对话传输保密性更高,它的默认值为 1,指定在建立远程桌面连接之前,服务器和客户端需要进行身份验证,如果这个地方安全层验证的默认值为 1,服务器和客户端就必须要进行身份验证,也就是输入帐号密码的操作,所以我们需要将安全层验证的这个值改为 0

这里贴一下微软官方对这个验证的解释:https://docs.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/microsoft-windows-terminalservices-rdp-winstationextensions-securitylayer

概括起来就是:

0 就是连接前使用 rdp 协议进行身份验证,rdp 即远程桌面连接,可以简单理解为就是关闭验证。1 是指在连接前两端协商来进行身份验证,这个是默认值。2 就是使用 tls 协议来进行

复制代码

将其参数设置为 0,命令如下:

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer /t REG_DWORD /d 0

复制代码

这里注意一下,我在测试过程中,两个参数同时关闭(也存在关掉一个参数而不用验证的情况,但最好还是两个参数都关闭)才可以不用输入正确凭证进入 3389 的登录页面

以上操作的基础是目标机开启了远程桌面连接,如果没有开启远程连接需要先配置一下防火墙,设置为允许远程桌面连接,命令:

netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow

复制代码

这里解释一下:

netsh 是 windows 的网络配置命令,advfirewall firewall 意思为防火墙的高级设置,add rule 是添加一条规则,name 指定规则名称,protocol 指定协议,dir 指定是出站还是入站,localport 指定端口,action 指定动作 allow 允许

设置后,我们再通过注册表来设置一下允许远程桌面连接,执行以下命令:

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\TerminalServer" /v fDenyTSConnections /t REG_DWORD /D 0 /f

复制代码

做好以上工作,服务器的 RDP 远程登录界面就可以在无输入正确密码的情况下打开,远程桌面连接输入 ip 就会直接跳到目标锁屏页

不用凭证验证进入到登录页面:

0x03 思路拓展

在这里展示的是代表新用户的影子用户的创建利用,如果遇上有意识的管理员,极有可能会在注册表中被发现,如果设置不可逆性的权限(查看访问设置完全控制的拒绝选项)可以暴力有效解决这个账号被删除的问题,但后面也会引发更大的问题

利用新的影子用户登录 3389,会生成数据容易被发现,而且还需要在 3389 上添加条件才能进行正常登录(Windows10 下是如此情况)

此处可以扩展两种方法:

①所以说这里我们可以开启来宾账户 Guest 在注册表对其 F 值进行更换,开启 Guest 账户,我们就可以登录而且减少了一些不必要的关注。

②在添加授权用户那个选项中,将所有已知的用户进行添加,防止管理员过早发现创建的影子用户的存在。

推荐阅读:https://xie.infoq.cn/article/49e1c67f7009a6ade9120cdd4

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/eb8074a67788b4ad24719bef3
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券