前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 NTLM 安全登录 Windows 域主机进行管理

使用 NTLM 安全登录 Windows 域主机进行管理

作者头像
运维开发王义杰
发布2023-08-10 19:09:10
3370
发布2023-08-10 19:09:10
举报

在 Windows 环境中,远程管理主机通常涉及到身份验证和权限的问题。一般来说,我们可能会依赖于 PowerShell Remoting 和 WinRM(Windows Remote Management),但现在运行程序通常使用linux系统,linux通过winrm协议访问windows系统通常需要在服务器上启用基本身份验证或者允许未加密的消息,这在一些严格的安全环境中可能是不允许的。

然而,有一种可以绕过这个问题的方法,就是使用 NTLM(NT LAN Manager)协议进行身份验证。下面,我将通过一个 Python 示例,展示如何使用 NTLM 协议安全地进行远程管理。

NTLM 协议和 pywinrm

NTLM 是一种挑战/响应式的身份验证协议,常用在 Windows 环境中。在 Python 中,我们可以使用 pywinrm 库结合 NTLM 实现对 Windows 主机的远程管理。

下面是一段使用 pywinrm 和 NTLM 进行远程命令执行的示例代码:

代码语言:javascript
复制
from winrm.protocol import Protocol

p = Protocol(
    endpoint='http://10.0.0.1:5985/wsman',
    transport='ntlm',
    username=r'administrator@wang.com',
    password='Admin_123',
    message_encryption='auto',
    server_cert_validation='ignore')

# 运行命令
shell_id = p.open_shell()
command_id = p.run_command(shell_id, 'ipconfig')
std_out, std_err, status_code = p.get_command_output(shell_id, command_id)
p.cleanup_command(shell_id, command_id)
print(std_out)

p.close_shell(shell_id)

# 输出命令的返回结果

在这个示例中,我们首先创建了一个 Protocol 对象,指定了我们想要连接的远程主机的 IP 地址和端口,以及我们的用户名和密码。然后,我们打开了一个 shell,运行了一个命令,获取了该命令的输出,然后清理了命令和关闭了 shell。

注意事项

  • 使用 NTLM 协议并不意味着可以无视权限。例如,如果你尝试使用非管理员用户在域控制器上执行操作,可能会遇到问题,因为域控制器的安全策略通常比常规 Windows 服务器更严格。
  • 如果你使用 NTLM 协议和非管理员用户登录域控制器,你可能需要对你的 WinRM 和 PowerShell Remoting 配置进行相应的调整。
  • 使用 NTLM 也不能解决双跳问题。如果你想在一个远程会话中再次进行远程连接,你可能需要额外的配置。

更完善的脚本:

代码语言:javascript
复制
from base64 import b64encode
from winrm.protocol import Protocol
import json

def run_ps(ps_script):
    encoded_ps = b64encode(ps_script.encode('utf_16_le')).decode('ascii')
    return 'powershell -encodedcommand {}'.format(encoded_ps)

p = Protocol(
    endpoint='http://10.0.0.1:5985/wsman',
    transport='ntlm',
    username=r'administrator',
    password='Admin_123',
    message_encryption='auto',
    server_cert_validation='ignore')

ps_script = """
$user1 = "administrator"
$ramPassword = "Admin_123"
$password = ConvertTo-SecureString $ramPassword -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($user1, $password)
Get-ADComputer -Properties * -Credential $Cred | ConvertTo-Json
"""

# 运行命令
shell_id = p.open_shell()
command_id = p.run_command(shell_id, run_ps(ps_script))
std_out, std_err, status_code = p.get_command_output(shell_id, command_id)
p.cleanup_command(shell_id, command_id)
p.close_shell(shell_id)

# 输出命令的返回结果
output = json.loads(std_out)
print(json.dumps(output, indent=4))

通过适当地使用 NTLM 和 pywinrm,我们可以在不牺牲安全性的情况下进行有效的远程管理。这样,我们就可以在遵循最佳安全实践的同时,仍然能够实现我们的目标。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在 Windows 环境中,远程管理主机通常涉及到身份验证和权限的问题。一般来说,我们可能会依赖于 PowerShell Remoting 和 WinRM(Windows Remote Management),但现在运行程序通常使用linux系统,linux通过winrm协议访问windows系统通常需要在服务器上启用基本身份验证或者允许未加密的消息,这在一些严格的安全环境中可能是不允许的。
    • NTLM 协议和 pywinrm
      • 注意事项
      相关产品与服务
      多因子身份认证
      多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档