zoukankan      html  css  js  c++  java
  • PowerShell尝试登录SQL Server

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

     Get-SqlSysLogin

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

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

    作者: 付海军
    出处:http://blog.csdn.net/fuhj02
    版权:本文版权归作者和csdn共有
    转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
    要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接且保证内容完整!否则必究法律责任!
    个人网站: http://txj.shell.tor.hu/

  • 相关阅读:
    如何实现1080P延迟低于500ms的实时超清直播传输技术
    直播体验深度优化方案——连麦互动直播
    前向纠错码(FEC)的RTP荷载格式
    C++通过COM接口操作PPT
    neo4j的搭建和实例使用
    【neo4j】neo4j Desktop1.1.9,windows 安装
    Neo4j删除节点和关系、彻底删除节点标签名
    知识图谱赵军学习笔记(五)--实体消歧
    实体消歧简介
    svn服务器时间与本地时间不同步解决
  • 原文地址:https://www.cnblogs.com/fuhj02/p/2728742.html
Copyright © 2011-2022 走看看