当前位置 博文首页 > PowerShell脚本开发尝试登录SQL Server

    PowerShell脚本开发尝试登录SQL Server

    作者:admin 时间:2021-02-07 18:01

    前三篇文章中创建了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  : **.**.**.**


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

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

    js
    下一篇:没有了