Skip to content

Rust implementation of the SQL Server Resolution Protocol

Notifications You must be signed in to change notification settings

Wazner/mssql-browser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mssql-browser   Latest Version

Rust implementation of the SQL Server Resolution Protocol.

The SQL Server Resolution Protocol enables finding endpoint information of MSSQL servers running in the current network.

The SQL Server Resolution Protocol (SSRP) [MC-SQLR] is a simple application-level protocol for the transfer of requests and responses between clients and database server discovery services. To determine the communication endpoint information of a particular database instance, the client sends a single request to a specific machine and waits for a single response. To enumerate database instances in the network and obtain the endpoint information of each instance, the client broadcasts or multicasts a request to the network and waits for responses from different discovery services on the network.

The SQL Server Resolution Protocol is appropriate for retrieving database endpoint information or for database instance enumeration in scenarios where network or local connectivity is available.

Usage

To use mssql-browser, first add this to your Cargo.toml:

[dependencies]
mssql-browser = "0.1"

Then you can make the different types and methods available in your module via an use statement:

use mssql_browser::{ 
  browse, browse_host, browse_instance, browse_instance_dac
};

Examples

Below are a few different ways to get endpoint information of MSSQL server instances. Check out the docs for a list of fields returned for each found instance.

Discover endpoint information of instances within network

use std::net::{ IpAddr, Ipv4Addr };
use std::error::Error;
use mssql_browser::{ browse, BrowserError };

async fn run() -> Result<(), Box<dyn Error>> {
  let broadcast_addr = IpAddr::V4(Ipv4Addr::BROADCAST);
  let mut iterator = browse(broadcast_addr).await?;
  
  while let instance = iterator.next().await? {
    println!("Found instance {} on host {}.", instance.instance_name, instance.addr);
  }
  
  Ok(())
}

Discover endpoint information of instances on host

use std::net::{ IpAddr, Ipv4Addr };
use std::error::Error;
use mssql_browser::{ browse_host, BrowserError };

async fn run() -> Result<(), Box<dyn Error>> {
  let host_addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
  let mut iterator = browse_host(host_addr).await?;
  
  while let Some(instance) = iterator.next()? {
    println!("Found instance {}", instance.instance_name);
  }
  
  Ok(())
}

Discover endpoint information of specific instance

use std::net::{ IpAddr, Ipv4Addr };
use std::error::Error;
use mssql_browser::{ browse_instance, BrowserError };

async fn run() -> Result<(), Box<dyn Error>> {
  let host_addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
  let instance = browse_instance(host_addr, "MSSQLSERVER").await?;
  
  if let Some(tcp) = instance.tcp_info {
    println!("Instance is available via TCP on port {}", tcp.port);
  }
 
  if let Some(np) = instance.np_info {
    println!("Instance is available via named pipe {}", np.name);
  }
 
  Ok(())
}

Discover DAC endpoint information

use std::net::{ IpAddr, Ipv4Addr };
use std::error::Error;
use mssql_browser::{ browse_instance_dac, BrowserError };

async fn run() -> Result<(), Box<dyn Error>> {
  let host_addr = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
  let dac_info = browse_instance_dac(host_addr, "MSSQLSERVER").await?;
  
  println!("DAC is exposed on port {}", dac_info.port);
 
  Ok(())
}

About

Rust implementation of the SQL Server Resolution Protocol

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages