SOCKS5協(xié)議分析

一、前言

1瓮具、SOCKS名稱來源荧飞。
該協(xié)議設(shè)計之初是為了讓有權(quán)限的用戶可以穿過過防火墻的限制凡人,使得高權(quán)限用戶可以訪問一般用戶不能訪問的外部資源。當時設(shè)計者考慮到幾乎所有使用TCP/IP通信的應(yīng)用軟件都使用socket(套接字叹阔,實際上是一組應(yīng)用程序接口)完成底層的數(shù)據(jù)通信挠轴。為了方便軟件開發(fā)者使用該協(xié)議,協(xié)議設(shè)計者就刻意對應(yīng)了幾組socket編程最經(jīng)典的操作耳幢,并且將協(xié)議定名為SOCKS岸晦。

2、SOCKS版本睛藻。
這個協(xié)議最初由David Koblas開發(fā)启上,而后由NEC的Ying-Da Lee將其擴展到版本4,最新協(xié)議是版本5店印,與前一版本相比冈在,SOCKS5做了以下增強:

  • 增加對UDP協(xié)議的支持;
  • 支持多種用戶身份驗證方式和通信加密方式按摘;
  • 修改了socks服務(wù)器進行域名解析的方法包券,使其更加優(yōu)雅;

3院峡、SOCKS網(wǎng)絡(luò)代理層次兴使。
SOCKS是一種網(wǎng)絡(luò)傳輸協(xié)議,主要用于客戶端與外網(wǎng)服務(wù)器之間通訊的中間傳遞照激。根據(jù)OSI七層模型來劃分,SOCKS屬于會話層協(xié)議盹牧,位于表示層與傳輸層之間俩垃。

4、SOCKS軟件部署架構(gòu)汰寓。
SOCKS實際分為了客戶端和服務(wù)端來共同協(xié)作完成代理目標口柳。在客戶端進行socket網(wǎng)絡(luò)編程時,SOCKS提供了一套和傳統(tǒng)socket接口(socket,listen,bind等)一致的接口SDK供應(yīng)用層調(diào)用有滑,這類軟件最著名的莫過于SocksCap32了跃闹,它是Permeo公司早期推出的一款產(chǎn)品,后來又提供了Permeo Security Driver(稱為PSD)SDK毛好。在服務(wù)端通常是提供一個服務(wù)器提供SOCKS代理服務(wù)望艺,一般監(jiān)聽1080端口。用戶將客戶端的請求和流量代理到目的服務(wù)器肌访,常見的SOCKS服務(wù)像shadowsock等找默。


二、SOCKS代理流程


上圖中是socks代理的簡單流程吼驶。

  1. 客戶端和SOCKS代理服務(wù)器建立TCP三次握手連接惩激。這里需要說明的是不管客戶端是希望和target服務(wù)器建立TCP連接還是UDP連接店煞,客戶端都需要先和SOCKS代理服務(wù)器建立TCP連接。

  2. 在和SOCKS代理服務(wù)器建立連接后风钻,開始進行身份認證顷蟀,目前比較常用的或者說在SOCKS服務(wù)器上實現(xiàn)較多的是無身份驗證和用戶名/密碼這兩種方式。

  3. 身份驗證通過后骡技,客戶端開始請求SOCKS服務(wù)器相應(yīng)的代理命令鸣个,目前SOCKS5協(xié)議規(guī)定了三種代理命令(connect,bind哮兰,udp)毛萌。

  4. SOCKS代理服務(wù)器依據(jù)客戶端請求的命令執(zhí)行相應(yīng)的代理模式,并與target服務(wù)器建立連接喝滞。

  5. 接下來客戶端開始像正常的網(wǎng)絡(luò)收發(fā)包一樣開始進行網(wǎng)絡(luò)通信阁将。


三、SOCKS協(xié)議

階段一:TCP請求

這里省略tcp三次握手建立連接的過程右遭,因為這部分不屬于協(xié)議部分做盅。

階段二:認證過程

在與SOCKS代理服務(wù)器建立tcp連接后客戶端開始發(fā)起認證過程,這個過程中會和服務(wù)器協(xié)商認證方式窘哈。

1吹榴、客戶端請求認證

VERSION METHODS_COUNT METHODS
1字節(jié) 1字節(jié) 1到255字節(jié),長度由METHODS_COUNT值決定
0x05 0x03 0x00 0x01 0x02
  • VERSION SOCKS協(xié)議版本滚婉,目前固定0x05
  • METHODS_COUNT 客戶端支持的認證方法數(shù)量
  • METHODS… 客戶端支持的認證方法疟游,每個方法占用1個字節(jié)

METHOD定義

  • 0x00 不需要認證(常用)
  • 0x01 GSSAPI認證
  • 0x02 賬號密碼認證(常用)
  • 0x03 - 0x7F IANA分配
  • 0x80 - 0xFE 私有方法保留
  • 0xFF 無支持的認證方法

2、服務(wù)器返回選定的認證方法

a吵护、無需認證

VERSION METHOD
1字節(jié) 1字節(jié)
0x05 0x00

b列赎、賬號密碼認證

VERSION METHOD
1字節(jié) 1字節(jié)
0x05 0x02
  • VERSION SOCKS協(xié)議版本,目前固定0x05
  • METHOD 本次連接所用的認證方法骇窍,0x00無需認證瓜晤,0x02賬號密碼認證

3、如果為賬號密碼認證客戶端再次發(fā)送賬密密碼進行認證

VERSION USERNAME_LENGTH USERNAME PASSWORD_LENGTH PASSWORD
1字節(jié) 1字節(jié) 1-255字節(jié) 1字節(jié) 1-255字節(jié)
0x01 0x01 0x0a 0x01 0x0a
  • VERSION 認證子協(xié)商版本(與SOCKS協(xié)議版本的0x05無關(guān)系)
  • USERNAME_LENGTH 用戶名長度
  • USERNAME 用戶名字節(jié)數(shù)組腹纳,長度為USERNAME_LENGTH
  • PASSWORD_LENGTH 密碼長度
  • PASSWORD 密碼字節(jié)數(shù)組痢掠,長度為PASSWORD_LENGTH

4、服務(wù)器響應(yīng)賬號密碼認證結(jié)果

VERSION STATUS
1字節(jié) 1字節(jié)
  • VERSION 認證子協(xié)商版本嘲恍,與客戶端VERSION字段一致
  • STATUS 認證結(jié)果(0x00 認證成功大于0x00 認證失斪慊)

階段三:命令過程

在客戶端和SOCKS代理服務(wù)器身份認證階段結(jié)束后,客戶端開始向代理服務(wù)器發(fā)送命令協(xié)議蛔钙,指示代理服務(wù)器接下來啟用何種代理模式(TCP/UDP)锌云。這里SOCKS5協(xié)議中規(guī)定了三種命令,分別是CONNECT吁脱,BIND桑涎,UDP ASSOCIATE彬向。

1、客戶端發(fā)起命令請求

VERSION COMMAND RSV ADDRESS_TYPE DST.ADDR DST.PORT
1字節(jié) 1字節(jié) 1字節(jié) 1字節(jié) 1-255字節(jié) 2字節(jié)
  • VERSION SOCKS協(xié)議版本攻冷,固定0x05
  • COMMAND 命令
    • 0x01 CONNECT 連接目標服務(wù)器
    • 0x02 BIND 綁定娃胆,客戶端會接收來自代理服務(wù)器的鏈接,也就是說告訴代理服務(wù)器創(chuàng)建socket等曼,監(jiān)聽來自目標機器的連接里烦。像FTP服務(wù)器這種主動連接客戶端的應(yīng)用場景。
    • 0x03 UDP ASSOCIATE UDP中繼
  • RSV 保留字段
  • ADDRESS_TYPE 目標服務(wù)器地址類型
    • 0x01 IP V4地址
    • 0x03 域名地址(沒有打錯禁谦,就是沒有0x02)胁黑,域名地址的第1個字節(jié)為域名長度,剩下字節(jié)為域名名稱字節(jié)數(shù)組
    • 0x04 IP V6地址
  • DST.ADDR ip地址
  • DST.PORT 端口號

說明:這里的DST.ADDR和DST.PORT在COMMAND不同時有不用的表示

  • CONNECT 希望連接的target服務(wù)器ip地址和端口號
  • BIND 希望連接的target服務(wù)器ip地址和端口號
  • UDP ASSOCIATE 客戶端本地使用的ip地址和端口號州泊,代理服務(wù)器可以用這個信息對訪問進行一些限制丧蘸。

2、代理服務(wù)器響應(yīng)

VERSION RESPONSE RSV ADDRESS_TYPE BND.ADDR BND.PORT
1字節(jié) 1字節(jié) 1字節(jié) 1字節(jié) 1-255字節(jié) 2字節(jié)
  • VERSION SOCKS協(xié)議版本遥皂,固定0x05
  • RESPONSE 響應(yīng)命令
    • 0x00 代理服務(wù)器連接目標服務(wù)器成功
    • 0x01 代理服務(wù)器故障
    • 0x02 代理服務(wù)器規(guī)則集不允許連接
    • 0x03 網(wǎng)絡(luò)無法訪問
    • 0x04 目標服務(wù)器無法訪問(主機名無效)
    • 0x05 連接目標服務(wù)器被拒絕
    • 0x06 TTL已過期
    • 0x07 不支持的命令
    • 0x08 不支持的目標服務(wù)器地址類型
    • 0x09 - 0xFF 未分配
  • RSV 保留字段
  • BND.ADDR 代理服務(wù)器連接目標服務(wù)器成功后的代理服務(wù)器IP
  • BND.PORT 代理服務(wù)器連接目標服務(wù)器成功后的代理服務(wù)器端口

說明:這里的DST.ADDR和DST.PORT在COMMAND不同時有不用的表示

  • CONNECT 此時綁定的地址是指代理服務(wù)器連接到目標機器時的ip和端口
  • BIND 這里有兩次響應(yīng)
  • 第一次響應(yīng)中是指代理服務(wù)器創(chuàng)建監(jiān)聽socket時綁定的ip和端口
  • 第二次響應(yīng)中是指代理服務(wù)器監(jiān)聽的scoket收來自目標機器連接時的ip和端口
  • UDP ASSOCIATE 此時綁定地址指明了客戶發(fā)送UDP消息至服務(wù)器的端口和地址力喷。

階段四:數(shù)據(jù)轉(zhuǎn)發(fā)

這里如果代理的是tcp連接則直接轉(zhuǎn)發(fā)tcp數(shù)據(jù)。如果代理的是udp數(shù)據(jù)客戶端和代理服務(wù)器之間需要對原始UDP數(shù)據(jù)包進行包裝之后再進行轉(zhuǎn)發(fā)演训。

RSV FRAG ATYP DST.ADDR DST.PORT DATA
2字節(jié) 1字節(jié) 1字節(jié) 1-255字節(jié) 2字節(jié) variable
  • RSV 保留字段
  • FRAG 包編號
  • ATYP 目標服務(wù)器地址類型
  • 0x01 IP V4地址
  • 0x03 域名地址(沒有打錯弟孟,就是沒有0x02),域名地址的第1個字節(jié)為域名長度样悟,剩下字節(jié)為域名名稱字節(jié)數(shù)組
  • 0x04 IP V6地址
  • DST.ADDR 目標服務(wù)器地址
  • DST.PORT 目標服務(wù)器端口
  • DATA 用戶數(shù)據(jù)

四拂募、實例分析

在本實例中演示UDP代理過程及其中抓包過程。

UDP服務(wù):127.0.0.1:19999(每收到一個請求包返回一個this is udp server的字符串給客戶端)

SOCKS代理服務(wù):127.0.0.1:1080

階段一:TCP請求窟她。
編號489,490,491没讲。客戶端127.0.0.1:26551請求到127.0.0.1:1080的TCP三次握手協(xié)議礁苗。

階段二:認證過程。

1徙缴、編號492试伙。客戶端發(fā)起認證請求于样。版本為0x05疏叨,客戶端認證方法總數(shù)為0x01,認證方式0x00不認證穿剖。編號493為TCP的ACK確認包蚤蔓。


pSFDjPI.png

2、編號494糊余。代理服務(wù)器回復(fù)請求版本為0x05秀又,認證方式確認為0x00不認證单寂。編號495為TCP確認包。


pSFrCqg.png

階段三:命令過程

1吐辙、編號496.客戶端向代理服務(wù)器發(fā)送命令請求包版本為0x05宣决,命令字為0x03(udp associate)客戶端的IP端口號為127.0.0.1:60842。編號497為TCP請求確認包昏苏。


pSFrJRx.png

2尊沸、編號498。代理服務(wù)器向客戶端回復(fù)確認包贤惯,版本為0x05洼专,狀態(tài)為0x00成功,代理服務(wù)器的開啟的UDP地址為127.0.0.1:60843孵构。編號499為TCP確認包屁商。


498-1.png

498-2.png

階段四:數(shù)據(jù)轉(zhuǎn)發(fā)

1、編號500為客戶端向代理服務(wù)器發(fā)送UDP數(shù)據(jù)報文浦译,客戶端地址127.0.0.1:60842棒假,服務(wù)器地址127.0.0.1:60843。包裝過的udp載荷中reserve保留字段0x00精盅,fragment 0x00帽哑,address type ipv4,要連接的遠端服務(wù)器地址端口為127.0.0.1:19999叹俏,發(fā)送的數(shù)據(jù)為“some data”妻枕。


500-1.png

500-2.png

2、編號501為代理服務(wù)器127.0.0.1:60843向遠端udp服務(wù)器127.0.0.1:19999發(fā)送數(shù)據(jù)包常規(guī)UDP數(shù)據(jù)包粘驰。


501-1.png

501-2.png

3屡谐、編號502位遠端UDP服務(wù)器127.0.0.1:19999向代理服務(wù)器127.0.0.1:60843返回數(shù)據(jù),返回“this is udp server”蝌数。


502-1.png

502-2.png

4愕掏、編號503為代理服務(wù)器127.0.0.1:60843向客戶端127.0.0.1:60842轉(zhuǎn)發(fā)遠端服務(wù)器的返回數(shù)據(jù),包裝過的udp載荷中reserve保留字段0x00顶伞,fragment 0x00饵撑,address type ipv4,遠端服務(wù)器地址端口為127.0.0.1:19999唆貌,發(fā)送的數(shù)據(jù)為“this is udp server”滑潘。


503-1.png

503-2.png

五、引用

https://www.rfc-editor.org/rfc/rfc1928.txt

https://www.rfc-editor.org/rfc/rfc1929.txt

https://www.ddhigh.com/2019/08/24/socks5-protocol.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锨咙,一起剝皮案震驚了整個濱河市语卤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖粹舵,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钮孵,死亡現(xiàn)場離奇詭異,居然都是意外死亡齐婴,警方通過查閱死者的電腦和手機油猫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柠偶,“玉大人情妖,你說我怎么就攤上這事∮盏#” “怎么了毡证?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔫仙。 經(jīng)常有香客問我料睛,道長,這世上最難降的妖魔是什么摇邦? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任恤煞,我火速辦了婚禮,結(jié)果婚禮上施籍,老公的妹妹穿的比我還像新娘居扒。我一直安慰自己,他們只是感情好丑慎,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布喜喂。 她就那樣靜靜地躺著,像睡著了一般竿裂。 火紅的嫁衣襯著肌膚如雪玉吁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天腻异,我揣著相機與錄音进副,去河邊找鬼。 笑死悔常,一個胖子當著我的面吹牛敢会,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播这嚣,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼塞俱!你這毒婦竟也來了姐帚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤障涯,失蹤者是張志新(化名)和其女友劉穎罐旗,沒想到半個月后膳汪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡九秀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年遗嗽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼓蜒。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡痹换,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出都弹,到底是詐尸還是另有隱情娇豫,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布畅厢,位于F島的核電站冯痢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏框杜。R本人自食惡果不足惜浦楣,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咪辱。 院中可真熱鬧振劳,春花似錦、人聲如沸梧乘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽选调。三九已至夹供,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仁堪,已是汗流浹背哮洽。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弦聂,地道東北人鸟辅。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像莺葫,于是被迫代替她去往敵國和親匪凉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容