#安全 #rdp #网络 #Windows

程序+库 rdp-rs

纯 Rust 实现的远程桌面协议

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2020年4月11日

#3#rdp

Download history • Rust 包仓库 41/week @ 2023-11-20 • Rust 包仓库 79/week @ 2023-11-27 • Rust 包仓库 43/week @ 2023-12-04 • Rust 包仓库 32/week @ 2023-12-11 • Rust 包仓库 104/week @ 2023-12-18 • Rust 包仓库 14/week @ 2023-12-25 • Rust 包仓库 23/week @ 2024-01-01 • Rust 包仓库 98/week @ 2024-01-08 • Rust 包仓库 101/week @ 2024-01-15 • Rust 包仓库 89/week @ 2024-01-22 • Rust 包仓库 85/week @ 2024-01-29 • Rust 包仓库 50/week @ 2024-02-05 • Rust 包仓库 49/week @ 2024-02-12 • Rust 包仓库 61/week @ 2024-02-19 • Rust 包仓库 85/week @ 2024-02-26 • Rust 包仓库 86/week @ 2024-03-04 • Rust 包仓库

290 每月下载量
legba 中使用

MIT 许可证

305KB
5K SLoC

rdp-rs

RUST 中的远程桌面协议

API Docs Build Status LICENSE Downloads

rdp-rs 是 Microsoft 远程桌面协议的纯 Rust 实现。 rdp-rs 附带名为 mstsc-rs 的客户端实现。

该软件包专注于安全性,面向希望拥有安全客户端的用户,或希望研究 RDP 的安全研究员。

为什么?

一方面,远程桌面协议是一个复杂的协议,与它交互起来并不容易。我已经在 Python 和 JavaScript 中实现了 RDP,并采用了事件驱动模式。但这种模式似乎提高了库的复杂性,最终出现了很多错误,没有人能够深入地研究 RDP。

另一方面,没有开源的 RDP 协议安全实现。

最终,我希望构建一个高度安全、跨平台且高度可定制的客户端。

安装

要在项目中使用 rdp-rs 作为库,请将以下内容添加到 Cargo.toml

[dependencies]
rdp-rs = "0.1.0"

您可以通过 cargo 安装二进制文件

cargo install rdp-rs
mstsc-rs --help

对于 Windows 平台,在 发布 会话中提供了某些预构建的二进制文件。

使用 mstsc-rs

mstsc-rs 是基于 rdp-rs 软件包的 RDP 客户端。它是跨平台的且高度可定制的

mstsc-rs 0.1.0
Sylvain Peyrefitte <citronneur@gmail.com>
Secure Remote Desktop Client in RUST

USAGE:
    mstsc-rs.exe [FLAGS] [OPTIONS]

FLAGS:
        --admin      Restricted admin mode
        --auto       AutoLogon mode in case of SSL nego
        --blank      Do not send credentials at the last CredSSP payload
        --check      Check the target SSL certificate
        --ssl        Disable Netwoek Level Authentication and only use SSL
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
        --dom <domain>       Windows domain [default: ]
        --hash <hash>        NTLM Hash
        --height <height>    Screen height [default: 600]
        --layout <layout>    Keyboard layout: us or fr [default: us]
        --name <name>        Name of the client send to the server [default: mstsc-rs]
        --pass <password>    Password [default: ]
        --port <port>        Destination Port [default: 3389]
        --target <target>    Target IP of the server
        --user <username>    Username [default: ]
        --width <width>      Screen width [default: 800]

mstsc-rs 已经过测试,可以连接到从 Windows 7 运行到 Windows 10 的服务器。

基本连接(使用 SSL 上的网络级别身份验证)

默认情况下,mstsc-rs 使用 NLA 作为身份验证协议

mstsc-rs --target IP --user foo --pass bar --dom enterprise

基本连接(使用不带 NLA 的 SSL)

您可以使用 ssl 选项禁用 nla,但如果您想使用凭证登录,则需要指定 auto 选项

mstsc-rs --target IP --user foo --pass bar --ssl --auto

传递哈希值(使用受限管理员模式)

微软最近为NLA身份验证添加了一些新功能。其中之一是受限管理员模式。此模式允许管理员将网络身份验证作为交互式身份验证使用。此模式允许管理员仅通过其NTLM散列进行身份验证。

mstsc-rs --target IP --user foo --hash a4c37e22527cc1479a8d620d2953b6c0 --admin

检查已登录用户

在某些情况下,使用SSL以便NLA是有用的。当服务器不强制执行NLA时,使用SSL可以查看服务器上连接的用户,而不会窃取会话。

mstsc-rs --target IP --ssl

当强制执行NLA时,您可以通过使用blank选项发送空白凭据来检查打开或可用的会话。

mstsc-rs --target IP --user foo --pass bar --blank

篡改LogonType=10到LogonType=7

当您在NLA会话中将blank选项和auto选项混合使用时,会导致不发出带有LogonType=10但带有LogonType=7

mstsc-rs --target IP --user foo --pass bar --blank --auto

篡改客户端名称

RDP客户端会发送客户端名称。mstsc-rs允许用户自定义它。

mstsc-rs --target IP --user foo --pass bar --name mstsc

rdp-rs构建块玩耍

rdp-rs被设计为易于集成到Rust环境中。

如果您想使用正常凭据和NLA进行连接

use std::net::{SocketAddr, TcpStream};
use rdp::core::client::Connector;
use rdp::core::event::{RdpEvent, PointerEvent, PointerButton};
let addr = "192.168.0.1:3389".parse::<SocketAddr>().unwrap();
let tcp = TcpStream::connect(&addr).unwrap();
let mut connector = Connector::new()
    .screen(800, 600)
    .credentials("domain".to_string(), "username".to_string(), "password".to_string());
let mut client = connector.connect(tcp).unwrap();

现在您想要发送一个输入,例如鼠标

client.write(RdpEvent::Pointer(
    // Send a mouse click down at 100x100
    PointerEvent {
        x: 100 as u16,
        y: 100 as u16,
        button: PointerButton::Left,
        down: true
    }
 )).unwrap()

现在您想要从服务器接收事件,例如位图事件

client.read(|rdp_event| {
    match rdp_event {
        RdpEvent::Bitmap(bitmap) => {
            // do something with bitmap
        }
         _ => println!("Unhandled event")
    }
}).unwrap()

依赖项

~9–21MB
~271K SLoC