然而,有一种可以绕过这个问题的方法,就是使用 NTLM(NT LAN Manager)协议进行身份验证。下面,我将通过一个 Python 示例,展示如何使用 NTLM 协议安全地进行远程管理。
NTLM 是一种挑战/响应式的身份验证协议,常用在 Windows 环境中。在 Python 中,我们可以使用 pywinrm
库结合 NTLM 实现对 Windows 主机的远程管理。
下面是一段使用 pywinrm
和 NTLM 进行远程命令执行的示例代码:
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。
更完善的脚本:
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
,我们可以在不牺牲安全性的情况下进行有效的远程管理。这样,我们就可以在遵循最佳安全实践的同时,仍然能够实现我们的目标。