PowerShell脚本开发尝试登录SQL Server

所属分类: 脚本专栏 / PowerShell 阅读数: 1305
收藏 0 赞 0 分享

前三篇文章中创建了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两个工具集进行扩充和升级,使其能适应真实环境的需求。

更多精彩内容其他人还在看

Windows Powershell 管道和重定向

这篇文章主要介绍了Windows Powershell 管道和重定向,需要的朋友可以参考下
收藏 0 赞 0 分享

Windows Powershell 进行数学运算

在Windows PowerShell中, 使用数学运算符来进行数学运算,数学运算符允许你在命令参数中计算数值. 你可以使用一个或者多个运算符进行加减乘除法, 也可以返回除法的余数(模). 包含这些计算的参数, 将计算结果作为参数值. 命令就像处理其他类型参数一样, 来处理参数值
收藏 0 赞 0 分享

Windows Powershell 执行外部命令

Windows PowerShell 在使用方面与 Cmd.exe 并无多大不同,只是 Windows PowerShell 的功能更为强大。与 Cmd.exe 一样,Windows PowerShell 具有内置的脚本编写语言,不过它比 Cmd.exe 原始的批处理语言更为灵活
收藏 0 赞 0 分享

Windows Powershell 命令集 cmdlets

在Windows PowerShell中,需要使用cmdlet执行指令。一个cmdlet代表着可操作某一对象的功能命令,cmdlet可使用"动词-名词"形式的语法:一个动词和一个名词,中间使用连字符连接,例如get-service和start-service。
收藏 0 赞 0 分享

Windows Powershell 别名

简单的说在Windows PowerShell中, 别名就是cmdlets或其他命令的替代名称.为什么要替代cmdlets呢,因为cmdlets命令说实话有点麻烦。
收藏 0 赞 0 分享

Windows Powershell 通过函数扩展别名

这篇文章主要介绍了Windows Powershell 通过函数扩展别名,需要的朋友可以参考下
收藏 0 赞 0 分享

Windows Powershell 执行文件和脚本

PowerShell脚本提供了一个方便的方法来自动化各种琐事。下面是关于PowerShell的一些基本概念,对于PowerShell初学者,掌握这些概念有助于加深对PowerShell脚本的理解。
收藏 0 赞 0 分享

Powershell小技巧之系统运行时间

本文主要教你如何使用powershell计算系统运行时间,其实很简单,因为Windows每次启动都有一个高进度计数器并且当系统运行这个计数器将返回一个毫秒,我们把这个毫秒计算下就得到系统运行时间了
收藏 0 赞 0 分享

Powershell小技巧之使用WMI测试服务响应

这篇文章主要介绍了Powershell小技巧之使用WMI测试服务响应,需要的朋友可以参考下
收藏 0 赞 0 分享

Powershell小技巧之使用WMI查询插上的U盘

本文主要讲诉了如何使用WMI查询当前插在你电脑上的USB设备,非常简单,学习powershell的同学可以参考下
收藏 0 赞 0 分享
查看更多