前三篇文章中創(chuàng)建了PSNet程序集,其中包含了對指定IP進(jìn)行端口掃描,收發(fā)TCP消息包和收發(fā)UDP消息包的相關(guān)功能,作為這是最基本的對網(wǎng)絡(luò)情況的最基本檢測,后續(xù)的文章將會對此程序集進(jìn)行不斷的擴(kuò)充使其包含更全面的功能。但是光有這些簡單網(wǎng)絡(luò)探測的功能還遠(yuǎn)遠(yuǎn)不夠,為了能更全面的使用PowerShell針對網(wǎng)絡(luò)安全進(jìn)行檢測,在本文中將會創(chuàng)建PSSecurity程序集用于存放相關(guān)通過PowerShell的腳本。參照前幾篇文章中創(chuàng)建PSNet程序集的方法和目錄結(jié)構(gòu)創(chuàng)建PSSecurity程序集目錄,便于后續(xù)對程序集的擴(kuò)展。
=====文件名: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 #創(chuàng)建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]
}
}
}
Get-SqlSysLogin -ComputerName SRV01 -UserName sa -Password sa #單臺主機(jī)登錄嘗試
"SQL01","SQL02","SQL03" | Get-SqlSysLogin -UserName sa -Password sa #多臺主機(jī)登錄嘗試
其中ComputerName代表sqlserver的主機(jī)名或者IP;UserName是用戶名,如果不填,則使用默認(rèn)的windows身份認(rèn)證,如果使用windows身份認(rèn)證則需要確保當(dāng)前登錄允許可以通過windows身份認(rèn)證登錄;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 : **.**.**.**
后續(xù)思路:這里是對單臺SQLServer服務(wù)器的登錄嘗試,如果通過對指定范圍的IP進(jìn)行端口的掃描發(fā)現(xiàn)相關(guān)的SQLServer服務(wù)器,而且能夠有比較齊全的字典,對這個函數(shù)進(jìn)行改造就可以字典模式暴力破解SQLServer的用戶名、密碼(注意:本文只提供安全攻防的思路,請勿對他人系統(tǒng)進(jìn)行暴力嘗試,否則后果由攻擊者個人自行承擔(dān))。
本文創(chuàng)建了PSSecurity工具集,介紹了通過PowerShell嘗試登錄SQLServer的方法,此種方法可以用于暴力破解和窮舉賬戶密碼,窮舉就需要依靠比較全面的字典的支持了。后續(xù)的文章中將會分別對PSNet和PSSecurity兩個工具集進(jìn)行擴(kuò)充和升級,使其能適應(yīng)真實(shí)環(huán)境的需求。