主頁 > 資料庫 > Oracle TNS 314 協議分析——3、連接認證流程與包分析

Oracle TNS 314 協議分析——3、連接認證流程與包分析

2020-09-10 15:01:09 資料庫

Connect 流程

Client

 

 

 

Server

1

-------

Connect(01)

----->

獲取連接字串

2

<-----

Resend

-------

 

3

-------

Connect(01)

----->

 

4

<-----

Accept

-------

獲取協議Version 

5

-------

Data NetworkService(deadbeef)

----->

網路引數交換

6

<-----

Data NetworkService(deadbeef)

-------

 

7

-------

Data SetProtocal(01)

----->

 

8

<-----

Data SetProtocal(01)

-------

 

9

-------

Data SetDataTypes(02)

----->

 

10

<-----

Data SetDataTypes(02)

-------

 

11

-------

Data UOCIFun(03) GetSessionKey(76)

----->

 

12

<-----

Data OPIParam(08)  with 3 params

Sessionkey,verifydata,,dbid

-------

 

13

-------

Data UOCIFun(03) Generic Auth call(73)

----->

獲取驗證引數:用戶名,密碼在此傳輸

Username sessionkey pass

14

<-----

Data OPIParam(08) with 40 params

-------

認證結果包含

AuthDBName;dbid:AuthUserID;SessionID

15

-------

Data Piggyback(11) session switch(6b)

----->

 

16

<-----

Data OPIParam(08)

-------

Oracle版本號

 

認證錯誤時從14包往后,會回傳一個marker,然后客戶端會發送一個請求marker,接著服務端回傳錯誤資訊,此程序詳細參見錯誤資訊回傳這個章節

特殊資料定義

在分析32位和64位客戶端時,可以注意到不同版本客戶端再決議上出現64位feffffffffffffff和00000000000000 在32位情況下分別都被代換為01和00的情況,所以我們定義

feMagic,在32位時為0x01 64位下為0xfe ff ff ff ff ff ff ff

00Magic,在32位時為0x00 64位下為0x00 00 00 00 00 00 00 00

獲取協議版本暨協議頭決議

Connect 的Accept包是獲取TNS版本號的最佳地點,Connect程序會協商版本號,Connect程序中,client會傳輸自己支持的版本號,服務端會結合自己的情況,最終在Accept中選定一個版本號,Accept包的Package Type為2

Accept包格式

 

32bit

64bit

 

Version

2

2

版本號

Service Option

2

2

Bit標志選項

Session Data Unit Size

2

2

一個DataUnit最多多大,在傳輸超長包時,Data 包會被拆解成如此大小的包

Max Transmition Unit Size

2

2

最大Data長度

Value Of 1

2

2

指定了服務端的Endian型別

Accept Data Length

2

2

 

Accept Data Offset

2

2

指向Accept data的指標,一般直接指向結尾(包含TNS頭)

Connect Flag0

1

1

標志位

Connect Flag1

1

1

標志位

Unknown

8 or 17

8 or 17

未知,一般前8位元組為0

Service Option:

    ..0. .... .... .... = Broken Connect Notify

    ...0 .... .... .... = Packet Checksum

    .... 0... .... .... = Header Checksum

    .... .0.. .... .... = Full Duplex

    .... ..0. .... .... = Half Duplex

    .... ...0 .... .... = Don't Care

    .... .... 0... .... = Don't Care

    .... .... ...0 .... = Direct IO to Transpor

    .... .... .... 0... = Attention Processing

    .... .... .... .0.. = Can Receive Attention

    .... .... .... ..0. = Can Send Attention

Connect Flag0 and flag1

    ...0 .... = NA services required

    .... 0... = NA services linked in

    .... .0.. = NA services enabled

    .... ..0. = Interchange is involved

    .... ...0 = NA services wanted

 

Accept包示例

?

代碼示例

從此包中決議TNS version

        --02 get tns version
        if(data:byte(3)==2) then
            tnsVersion=string.unpack(">I2",data:sub(7))
            print("tnsVersion:"..tnsVersion)
        end

獲取連接字串及客戶端資訊

通過決議包Connect包可以獲得連接字串,進而獲取客戶端的詳細資訊,包含客戶端程式,當前用戶,windows版本等,

 

Connect包格式

 

32bit

64bit

 

Version

2

2

版本號

Compatible Version

2 2 兼容最低版本

Service Options

2

2

Bit標志選項

Session Data Unit Size

2

2

一個DataUnit最多多大,在傳輸超長包時,Data 包會被拆解成如此大小的包

Max Transmition Unit Size

2

2

最大Data長度

NT Protocol Characteristics

2

2

網路引數

Line Turn Around Value

2

2

 

Value 1

2

2

指定了本地的Endian型別

Length of Connect Data

2

2

連接字串長度

Offset of Connect Data

2

2

連接字串從TNS頭算的偏移量

Max Receivable Connect Data

4

4

 

Connection Flag0

1 1  

Connection Flag1

1 1  

Trace Across Facility item1

4 4  
Trace Across Facility item2 4 4  

Trace Unique Connection ID

8 8  

unknown

8 or 20 8 or 20  

Service Options,Connection Flag 同Accept

NT Protocol Characteristics:
    0... .... .... .... = Hangon to listener connect
    .0.. .... .... .... = Confirmed release
    ..0. .... .... .... = TDU based IO
    ...0 .... .... .... = Spawner running
    .... 0... .... .... = Data test
    .... .0.. .... .... = Callback IO supported
    .... ..0. .... .... = ASync IO Supported
    .... ...0 .... .... = Packet oriented IO
    .... .... 0... .... = Can grant connection to another
    .... .... .0.. .... = Can handoff connection to another
    .... .... ..0. .... = Generate SIGIO signal
    .... .... ...0 .... = Generate SIGPIPE signal
    .... .... .... 0... = Generate SIGURG signal
    .... .... .... .0.. = Urgent IO supported
    .... .... .... ..0. = Full duplex IO supported
    .... .... .... ...0 = Test operation

包示例

?

示例代碼

獲取TNS版本及連接字串

        if(data:byte(3)==1) then
            tnsVersion=string.unpack(">I2",data,7)
            print("requestTnsVersion:"..tnsVersion)
            
            local connectDataLength=string.unpack(">I2",data,23)
            local connectDataOffset=string.unpack(">I2",data,25)
            
            print("connect string:"..string.unpack("c"..connectDataLength,data,connectDataOffset-2))
        end

網路引數交換(deadbeef)Secure Network Service

通過決議包 Data  Network Service 包可以獲得網路相關引數比如servie version,其意義暫不明確,注意此包是data包,下面示例資料沒有帶data包頭

包決議示例

?

獲取驗證引數

通過決議包dataid 03 callid 73可以獲得用戶名,密碼hash等很多資訊

包格式

 

32bit

64bit

 

序列號

1

1

 

可變位元組

16 or 20

44 or 48

 

用戶名長度

1

1

 

用戶名

上位元組決定

上位元組決定

 

Keyvalue pairs

變長

變長

sessionkey及密碼等資料

可變頭

注意到使用不同客戶端連接不同資料庫,資料包到用戶名這里的偏移量不同(可能原因,oracle版本,不同的客戶端)

Sqlplus11 to oracle12c

Navicat to oracle11 

 

32位Navicat

fe ff ff ff ff ff ff ff

18 00 00 00 01 01 00 00

fe ff ff ff ff ff ff ff

12 00 00 00 00 00 00 00

fe ff ff ff ff ff ff ff

fe ff ff ff ff ff ff ff

fe ff ff ff ff ff ff ff

0f 00 00 00 01 01 00 00

fe ff ff ff ff ff ff ff

12 00 00 00

fe ff ff ff ff ff ff ff

fe ff ff ff ff ff ff ff

 

01

0f 00 00 00 01 01 00 00

01

13 00 00 00

01

01

一個在序號后有44個位元組,一個48個位元組,具體處理可以先跳過44個位元組看是否ff,如果是跳到48個位元組

32位情況類似,只是將feMagic變為01,所以也有兩種情況16或20個位元組

???????Keyvalue對

對灰色頭部以下內容除直接跟的用戶名外,全部以keyvalue形式存在,

Key和value間存在固定4位元組未知欄位,keyvalue對之間存在8位元組未知欄位,

Key和value均以長度開頭,長度fe表示變長,fe后續一個位元組的長度byte并以00結尾如sessionid的值,

下面以上面的包為例進行決議:

用戶名:scott

0863232373636f7474

4位元組未知欄位

24000000

AUTH_SESSKEY

0c415554485f534553534b4559

4位元組未知欄位

20010000

value

fe403346334137413241324636443935363537434643383241304439314141383033354334334532413932313746424334384437313935343137323638374442414120423145303544373245443630413239333636454331334131444232423941303500

8位元組未知欄位

100000027000000

AUTH_PASSWORD

0d415554485f50415353574f5244

4位元組未知欄位

c0000000

value

4042353343343732314336334342323537334244423535383936364541364630363844353834423034364134313945373146463430444444363537464343343742

...

...

...

...

...

...

8位元組未知欄位

0000000030000000

AUTH_FAILOVER_ID

10415554485f4641494c4f5645525f4944

8位元組未知欄位

0000000000000000

 

???????包示例

?

代碼示例

獲取用戶名

        --060307 get username
        if(data:byte(3)==6 and data:byte(9)==3 and data:byte(10)==0x73) then
            local userNamePos
            --test client 32bit or 64bit
            if(data:byte(12)~=0xfe)then
                is64Bit=false 
            end
            if(is64Bit) then print("64bit:true") else print("64bit:false") end
            if(is64Bit) then
                if(data:byte(9+2+1+43)==0xff)then userNamePos=9+2+1+44 end
                if(data:byte(9+2+1+47)==0xff)then userNamePos=9+2+1+48 end
            else
                if(data:byte(9+2+1+15)==0xff)then userNamePos=9+2+1+16 end
                if(data:byte(9+2+1+21)==0xff)then userNamePos=9+2+1+20 end
            end
            if(userNamePos) then
                local username=string.unpack("s1",data,userNamePos)
                print("username:"..username)
                ngx.ctx.username=username
            end
        end

???????獲取Oracle版本號

在連接完成之后,客戶端會發起data 116b包,內部后續一個data DB Version(033b)請求,ThinClient 下會直接發起data 033b,請求oracle版本,版本號以data 08包形式回傳,決議其回傳包可以獲得Oracle版本號,注意回傳的data 08 包不止在這里使用,很多命令的回傳都使用此包,此種包有這樣幾種形式,

08后直接后續欄位:如版本號包

08后后續回傳欄位數,再接續欄位:比如認證結果回傳

獲取版本包格式如下

 

32bit

64bit

 

unused

2

2

ThinDriver 此處為1

Banner Length

1

1

版本字串長度

Banner

上位元組決定

上位元組決定

Oracle版本字串

版本號

4

4

版本int表示,little endian,minor版本號和build號分別用第二個位元組的高低4bit表示

變長結尾 變長 變長 可能是1702包也可能是0901包,內容不詳

???????包示例

?

???????代碼示例

--06033b oracle version request
if(data:byte(3)==6 and data:byte(9)==3 and data:byte(10)==0x3b) then
    cHeaderPos=9
end
        
--start to process db version request
if(cHeaderPos>1 and data:byte(cHeaderPos)==3 and data:byte(cHeaderPos+1)==0x3b) then
    requestOracleVersion=true
end

--06089a get oracle version
if(data:byte(3)==6 and requestOracleVersion) then
    local versionString,p=string.unpack("s1",data,12)
    print("oracleVersion:"..versionString)
    local minor        
oracleVersion.fix,oracleVersion.subbuild,minor,oracleVersion.major=string.unpack("BBBB",data,p)
    oracleVersion.minor=minor/16
    oracleVersion.build=minor%16           print(oracleVersion.major..'.'..oracleVersion.minor..'.'..oracleVersion.build..'.'..oracleVersion.subbuild..'.'..oracleVersion.fix)
    requestOracleVersion=false
end

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/2484.html

標籤:Oracle

上一篇:Oracle TNS 314 協議分析——2、基礎包結構

下一篇:Oracle TNS 314 協議分析——4、SQL執行流程與包分析

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more