欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PowerShell脚本开发尝试登录SQL Server

程序员文章站 2022-06-25 10:08:49
前三篇文章中创建了psnet程序集,其中包含了对指定ip进行端口扫描,收发tcp消息包和收发udp消息包的相关功能,作为这是最基本的对网络情况的最基本检测,后续的文章将会对...

前三篇文章中创建了psnet程序集,其中包含了对指定ip进行端口扫描,收发tcp消息包和收发udp消息包的相关功能,作为这是最基本的对网络情况的最基本检测,后续的文章将会对此程序集进行不断的扩充使其包含更全面的功能。但是光有这些简单网络探测的功能还远远不够,为了能更全面的使用powershell针对网络安全进行检测,在本文中将会创建pssecurity程序集用于存放相关通过powershell的脚本。参照前几篇文章中创建psnet程序集的方法和目录结构创建pssecurity程序集目录,便于后续对程序集的扩展。

具体详细的步骤请参见前几篇文章,创建pssecurity程序集之后的目录结构和文件如下所示:

复制代码 代码如下:

+d:\my documents\windowspowershell\modules
└─pssecurity
    │  pssecurity.psm1
    │ 
    └─sqlserver
            get-sqlsyslogin.ps1

在$profile中添加:

复制代码 代码如下:

import-module $env:psspace\pssecurity  #用于在powershell启动时自动加载pssecurity程序集

其中pssecurity.psm1中的内容如下:

复制代码 代码如下:

. $env:psspace/pssecurity/sqlserver/get-sqlsyslogin.ps1 #导入get-sqlsyslogin函数
write-host "pssecurity module added" -backgroundcolor green -foregroundcolor blue #用于提示此模块已加载
export-modulemember -function *  #用于将函数导出为模块成员

接下来就是get-sqlsyslogin.ps1的内容了

复制代码 代码如下:

 =====文件名:get-sqlsyslogin.ps1=====
function get-sqlsyslogin {

  param(
    [parameter(mandatory = $true,
      position = 0,
      valuefrompipeline= $true)]
    [alias("pscomputername","cn","machinename","ip","ipaddress")]
    [string]$computername,
    [parameter(position = 1)]
    [string]$username,
    [parameter(position = 2)]
    [string]$password
  )
  process {
    $connection = new-object system.data.sqlclient.sqlconnection
    if($username) {
      $connection.connectionstring = "data source=$computername;initial catalog=master;user id=$username;password=$password;"
    } else {
      $connection.connectionstring = "server=$computername;initial catalog=master;trusted_connection=true;"
    }
    try {
      $connection.open()
      $command = new-object system.data.sqlclient.sqlcommand #创建sqlclient对象
      $command.connection = $connection
      $command.commandtext = "select * from master.sys.syslogins"  #从syslogin表读取sqlserver登录账户
      $reader = $command.executereader()
      $counter = $reader.fieldcount
      while ($reader.read()) {
        $sqlobject = @{}
        for ($i = 0; $i -lt $counter; $i++) {
          $sqlobject.add(
            $reader.getname($i),
            $reader.getvalue($i)
          );
        }
        # 获取登录类型
        $type =
          if($sqlobject.isntname -eq 1) {
            if($sqlobject.isntgroup -eq 1) {
              "nt group"
            } else {
              "nt user"
            }
            } else {
              "sql server"
            }

        new-object psobject -property @{
          name = $sqlobject.loginname;
          created = $sqlobject.createdate;
          denylogin = [bool]$sqlobject.denylogin;
          hasaccess =  [bool]$sqlobject.hasaccess;
          type = $type;
          sysadmin = [bool]$sqlobject.sysadmin;
          securityadmin = [bool]$sqlobject.securityadmin;
          serveradmin = [bool][bool]$sqlobject.serveradmin;
          setupadmin = [bool]$sqlobject.setupadmin;
          processadmin = [bool]$sqlobject.processadmin;
          diskadmin = [bool]$sqlobject.diskadmin;
          dbcreator = [bool]$sqlobject.dbcreator;
          ntuser = [bool]$sqlobject.isntuser;
          computername = $computername
        } | select-object name, created, type, denylogin, hasaccess, sysadmin, securityadmin, serveradmin, setupadmin, processadmin, diskadmin, dbcreator, ntuser, computername
      }
      $connection.close()
    }
    catch {
      $error[0]
    }
  }
}

启动powershell进程,可以用下面的两种方式调用

复制代码 代码如下:

get-sqlsyslogin -computername srv01 -username sa -password sa #单台主机登录尝试

"sql01","sql02","sql03" | get-sqlsyslogin -username sa -password sa #多台主机登录尝试

其中computername代表sqlserver的主机名或者ip;username是用户名,如果不填,则使用默认的windows身份认证,如果使用windows身份认证则需要确保当前登录允许可以通过windows身份认证登录;password不用说就是密码了。

复制代码 代码如下:

ps c:\users\fuhj> get-sqlsyslogin -computername **.**.**.** -username sa -password ***********
name          : sa

created       : 2003/4/8 9:10:35
type          : sql server
denylogin     : false
hasaccess     : true
sysadmin      : true
securityadmin : false
serveradmin   : false
setupadmin    : false
processadmin  : false
diskadmin     : false
dbcreator     : false
ntuser        : false
computername  : **.**.**.**
name          : *****

created       : 2011/3/14 8:31:44
type          : sql server
denylogin     : false
hasaccess     : true
sysadmin      : false
securityadmin : false
serveradmin   : false
setupadmin    : false
processadmin  : false
diskadmin     : false
dbcreator     : false
ntuser        : false
computername  : **.**.**.**


PowerShell脚本开发尝试登录SQL Server

后续思路:这里是对单台sqlserver服务器的登录尝试,如果通过对指定范围的ip进行端口的扫描发现相关的sqlserver服务器,而且能够有比较齐全的字典,对这个函数进行改造就可以字典模式暴力破解sqlserver的用户名、密码(注意:本文只提供安全攻防的思路,请勿对他人系统进行暴力尝试,否则后果由攻击者个人自行承担)。

本文创建了pssecurity工具集,介绍了通过powershell尝试登录sqlserver的方法,此种方法可以用于暴力破解和穷举账户密码,穷举就需要依靠比较全面的字典的支持了。后续的文章中将会分别对psnet和pssecurity两个工具集进行扩充和升级,使其能适应真实环境的需求。