1. 程式人生 > >基於NTLM的Proxy認證

基於NTLM的Proxy認證

以Matrix的Blog為例,擷取其中的認證過程進行分析(注意,本文中使用的cookie值已經被處理過,呵呵,別想幹壞事握)

測試環境:
域:mydomain.com
域主機:davidturing.mydomain.com
域使用者:[email protected]
代理伺服器:proxyserver.mydomain.com

1) 登陸Windows域(mydomain.com),使用者名稱為davidturing
2) 開啟IE視窗,URL=http://www.matrix.org.cn/blog/cas/,由於公司使用了ProxyServer,員工必須通過ProxyServer才能上網。
於是,IE Client就向Proxyserver請求訪問Matrix Blog。
3) Proxy認證使用了NTLM

,對IE Client進行認證。
於是,IE(Client)就和ProxyServer(Server)執行下面的三次握手的認證過程。

1: C --> S GET ...

2: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM

3: C --> S GET ...
Authorization: NTLM

4: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM

5: C --> S GET ...
Authorization: NTLM

6: C <-- S 200 Ok

需要指出,NTLM

只是兩種Windows認證方式中的一種,Kerberos是另外一種,而且更有名,我會為Kerberos認證再寫一篇Blog:)

4) 握手的過程被我Sniffer了下來,如下文所示:
/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog/cas HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Proxy-Connection: Keep-Alive

{分析:注意,這是一個很簡單的HTTP GET請求,無非是想請求www.matrix.org.cn /blog/cas這張頁面}


/******************
ProxyServer-> Client:
******************/
HTTP/1.1 407 Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied. )
Via:1.1 PROXYSERVER
Proxy-Authenticate: NTLM
Proxy-Authenticate: Kerberos
Proxy-Authenticate: Negotiate
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 2372



......返回給客戶端的HTTP實體,提示頁面內容被省略......


{分析:接著,ProxyServer要求我提供認證資訊,注意,HTTP 407程式碼的含義是類似於401,表示客戶必須先經過代理伺服器的授權。我們還可以看到,Proxy-Authenticate欄位裡面包含了NTLM,Kerberos,表明可以通過客戶端來Negotiate再決定使用兩者中的一種}

/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog/cas HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Proxy-Connection: Keep-Alive
Proxy-Authorization: NTLM TlRMTVNTUAABAAAAB4IAogAAAAAAAAAAAA
AAAAAAAAAFAJMIAAAAD2==

{分析:
這裡,客戶端將自己的NTLM程式碼傳送給伺服器,裡面包含了一些自己的域帳號傳送給ProxyServer,ProxyServer就可以知道使用者是誰,然後去域伺服器取出使用者的域密碼,加密一個隨機字串去Challenge使用者(見下文)。

NTLM中,這是三次握手的"第一手"(Type1 Message),目的是Client告訴Server兩樣東西:
hoststring:即client的主機名(比如davidturing)
domainstring:即client在域中的名(比如davidturing.mydomain.com)

Proxy-Authorization的資訊結構如下
0 1 2 3
+-------+-------+-------+-------+
0: | 'N' | 'T' | 'L' | 'M' |
+-------+-------+-------+-------+
4: | 'S' | 'S' | 'P' | 0 |
+-------+-------+-------+-------+
8: | 1 | 0 | 0 | 0 |
+-------+-------+-------+-------+
12: | 0x03 | 0xb2 | 0 | 0 |
+-------+-------+-------+-------+
16: | domain length | domain length |
+-------+-------+-------+-------+
20: | domain offset | 0 | 0 |
+-------+-------+-------+-------+
24: | host length | host length |
+-------+-------+-------+-------+
28: | host offset | 0 | 0 |
+-------+-------+-------+-------+
32: | host string |
+ +
. .
. .
+ +-----------------+
| | domain string |
+-------------+ +
. .
. .
[如果資料圖顯示的太醜,可以參考:
http://www.innovation.ch/java/ntlm.html
]
由於擷取的資訊經過BASE64處理,所以,你不可能肉眼從Proxy-Authorization值中判斷出主機名和主機域名:)
}


/******************
ProxyServer-> Client:
******************/
HTTP/1.1 407 Proxy Authentication Required ( ¾Ü¾ø•ÃÎÊ¡£ )
Via:1.1 PROXYSERVER

Proxy-Authenticate:
NTLM TlRMTVNTUAACAAAAGAAYADgAAAAFgoGikmfj
JzhsTW0AAAAAAAAAAIoAigBQAAAABQCTCAAA
AA9IAE4ASQBTAEkALgBDAE8ATQAuAEMATgAC
ABgASABOAEkAUwBJAC4AQwBPAE0ALgBDAE4A
AQAWAFAAUgBPAFgAWQBTAEUAUgBWAEUAUgA
EABgAaABuAGkAcwBpAC4AYwBvAG0ALgBjAG4A
AwAwAHAAcgBvAHgAeQBzAGUAcgB2AGUAcgAuA
GgAbgBpAHMAaQAuAGMAbwBtAC4AYwBuAAAAA
AA=

Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 0


{分析:這個步驟中,ProxyServer迴應我的IE一個Proxy-Authorization,其值就是上面那段很長的字元,這是一個authcode,目的是Chanllenge客戶端(IE)。Chanllenge是對客戶端的一種身份挑戰,好比方,你說你是張三,OK,伺服器用張三的密碼加密一段咚咚,你能告訴伺服器這段咚咚是什麼,伺服器就相信你了。

這條type-2 Message是的三次握手的第二握。
0 1 2 3
+-------+-------+-------+-------+
0: | 'N' | 'T' | 'L' | 'M' |
+-------+-------+-------+-------+
4: | 'S' | 'S' | 'P' | 0 |
+-------+-------+-------+-------+
8: | 2 | 0 | 0 | 0 |
+-------+-------+-------+-------+
12: | 0 | 0 | 0 | 0 |
+-------+-------+-------+-------+
16: | message len | 0 | 0 |
+-------+-------+-------+-------+
20: | 0x01 | 0x82 | 0 | 0 |
+-------+-------+-------+-------+
24: | |
+ server nonce |
28: | |
+-------+-------+-------+-------+
32: | 0 | 0 | 0 | 0 |
+-------+-------+-------+-------+
36: | 0 | 0 | 0 | 0 |
+-------+-------+-------+-------+
裡面包含了server nounce值,這個值就是Challenge了。我們需要
根據這個8位元組的隨機數構造type-3 message。
}

/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog/cas HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
Proxy-Authorization:
NTLM TlRMTVNTUAADAAAAGAAYAJIAAAAYABgAqgA
AABgAGABIAAAAGAAYAGAAAAAaABoAeAAAA
AAAAADCAAAABYKAogUAkwgAAAAPaABuAGk
AcwBpAC4AYwBvAG0ALgBjAG4AaAB1AGEAbg
BnAHoAaABhAG8AcQBpAG4ASABVAEEATgBHA
FoASABBAE8AUQBJAE4AMQCGRQ1i+bZleAs2A
kgEXS/CfJ3oOrsi6prctAW2HyADaWwbNqmpO1
Eptq7yJUh4SXd=

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Proxy-Connection: Keep-Alive
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==


{分析:OK,這裡就是IE客戶端響應ProxyServer的Chanllenge,上面的NTLM=TIRMT….就是Challenge迴應碼,如果這段程式碼正確,ProxyServer就承認使用者的身份,就可以讓他到訪問外網資源。

分析一下這個type-3 Message,它的結構如下:
0 1 2 3
+-------+-------+-------+-------+
0: | 'N' | 'T' | 'L' | 'M' |
+-------+-------+-------+-------+
4: | 'S' | 'S' | 'P' | 0 |
+-------+-------+-------+-------+
8: | 3 | 0 | 0 | 0 |
+-------+-------+-------+-------+
12: | LM-resp len | LM-Resp len |
+-------+-------+-------+-------+
16: | LM-resp off | 0 | 0 |
+-------+-------+-------+-------+
20: | NT-resp len | NT-Resp len |
+-------+-------+-------+-------+
24: | NT-resp off | 0 | 0 |
+-------+-------+-------+-------+
28: | domain length | domain length |
+-------+-------+-------+-------+
32: | domain offset | 0 | 0 |
+-------+-------+-------+-------+
36: | user length | user length |
+-------+-------+-------+-------+
40: | user offset | 0 | 0 |
+-------+-------+-------+-------+
44: | host length | host length |
+-------+-------+-------+-------+
48: | host offset | 0 | 0 |
+-------+-------+-------+-------+
52: | 0 | 0 | 0 | 0 |
+-------+-------+-------+-------+
56: | message len | 0 | 0 |
+-------+-------+-------+-------+
60: | 0x01 | 0x82 | 0 | 0 |
+-------+-------+-------+-------+
64: | domain string |
+ +
. .
. .
+ +-------------------+
| | user string |
+-----------+ +
. .
. .
+ +-------------+
| | host string |
+-----------------+ +
. .
. .
+ +---------------------------+
| | LanManager-response |
+---+ +
. .
. .
+ +------------------+
| | NT-response |
+------------+ +
. .
. .
+-------+-------+-------+-------+

domain string: 主機域名(如davidturing.mydomain.com)
user string:使用者名稱(davidturing)
LanManager-response: 類DES的雜湊處理
NT-response:MD4雜湊處理
詳情可參考:
http://samba.kn.vutbr.cz/samba/docs/man/Samba-Developers-Guide/pwencrypt.html
}

/******************
ProxyServer-> Client:
******************/
HTTP/1.1 301 Moved Permanently
Via: 1.1 PROXYSERVER
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 158
Date: Wed, 21 Sep 2005 03:44:57 GMT
Location: http://www.matrix.org.cn/blog//cas/
Content-Type: text/html
Server: Microsoft-IIS/6.0

Object Moved

This document may be found here

{分析:很明顯,ProxyServer已經承認了我的身份,並讓我訪問Matrix了。這裡有一個小插曲,Matrix做了重定向(熟悉HTTP協議的人應該知道HTTP 301表示move permanetly,即客戶請求的文件在其他地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。)比如,如果我們直接訪問http://www.matrix.org.cn/blog//cas/,伺服器會IE重定向到http://61.142.81.140:9703/blog/cas/,你在頁面上不會察覺到這一點。Chris估計是想做備份吧?Blog這東西經常出問題。}

到此,我們已經通過了Proxy認證了,下面的通訊的Traffic我就不想說了,反正就是先取HTML網頁,再取網頁的Style.css,有一個先後順序,大家不必關心了。

/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog//cas/ HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
If-Modified-Since: Mon, 19 Sep 2005 03:19:14 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Proxy-Connection: Keep-Alive
If-None-Match: "ea7c9ee9c8bcc51:10a4"
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==

/******************
ProxyServer-> Client:
******************/
HTTP/1.1 200 OK
Via: 1.1 PROXYSERVER
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 36149
Date: Wed, 21 Sep 2005 03:44:57 GMT
Content-Location: http://www.matrix.org.cn/blog//cas/index.html
Content-Type: text/html
Server: Microsoft-IIS/6.0
Last-Modified: Tue, 20 Sep 2005 14:29:13 GMT
Accept-Ranges: bytes
ETag: "4a5cbacefbdc51:10ce"



....頁面內容被省略.........

/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog/cas/styles-site.css HTTP/1.0
Accept: */*
Referer: http://www.matrix.org.cn/blog//cas/
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
Proxy-Connection: Keep-Alive
If-Modified-Since: Sat, 13 Aug 2005 13:23:57 GMT
If-None-Match: "3cea6142aa0c51:10a4"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==


/******************
ProxyServer-> Client:
******************/
HTTP/1.1 200 OK
Via: 1.1 PROXYSERVER
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 5379
Date: Wed, 21 Sep 2005 03:44:57 GMT
Content-Type: text/css
Server: Microsoft-IIS/6.0
Last-Modified: Sat, 13 Aug 2005 13:23:57 GMT
Accept-Ranges: bytes
ETag: "3cea6142aa0c51:10ce"

body {
margin:0px 0px 20px 0px;
background:#FFF;
}
A { color: #003366; text-decoration: underline; }
A:link { color: #003366; text-decoration: underline; }
.....styles-site.css內容被省略 .....
padding-right:15px;
padding-top:5px;
padding-bottom:5px;
}

相關推薦

Django 基於session認證 小作業

女生 ons not 密碼 作業 param http clas type 基於session認證 相親小作業 用戶登錄 如果男用戶登錄,顯示女生列表 如果女用戶登錄,顯示男生列表    """s4day74 URL Configu

ssh基於key認證登陸

我們 對稱 for dom pub ide 密鑰對 fin ## ssh基於key認證登陸一、在客戶端生成密鑰對 ssh-keygen -t rsa [-P ‘‘] [-f “~/.ssh/id_rsa"] ## -r rsa:指定算法 ## -P :加對稱秘鑰口令 ##

redhat 7實現基於chap認證的iscsi,包括發現認證,和正常認證

getc 配置方法 redhat 7 啟動 src var yum 源 -o 客戶端 實驗環境:兩臺虛擬機,系統為redhat7.0以上(本文使用redhat 7.5)第一臺虛擬ip地址為ip:192.168.0.118/24 gw:192.168.0.1 hostname

CentOS配置基於web認證的squid 3.1.23

環境清單:          Centos 6.4 X64          Squid 3.1.23  &n

基於Token認證的多點登入和Api保護

  在文章中有錯誤的地方,或是有建議或意見的地方,請大家多多指正,郵箱: [email protected]   一天張三,李四,王五,趙六去動物園,張三沒買票,李四製作了個假票,王五買了票,趙六要直接FQ進動物園   到了門口,驗票的時候,張三沒有買票被拒絕進入動物園,李四因為買假票而被補,趙

基於Token認證的多點登錄和WebApi保護

是否 鍵值對 實的 定義 alt post 新的 就是 存在 原文 基於Token認證的多點登錄和WebApi保護 在文章中有錯誤的地方,或是有建議或意見的地方,請大家多多指正,郵箱: [email protected]   一天張三,李四,王五,趙六去動物園,張三

kafka使用筆記-基於SASL認證的kafka偽叢集windows環境搭建及測試

繼 基於SASL認證的kafka偽叢集linux環境搭建及測試 之後,由於環境的問題,需要在windows平臺搭建同樣的一個基於sasl認證的kakfa偽叢集環境。本次同樣使用的是 kafka_2.10-0.10.1.0.tgz 版本的kafka,整合zookeeper。只需要對此進行配

kafka使用筆記-基於SASL認證的kafka偽叢集環境搭建及測試

繼 搭建免認證kafka單機 之後由於業務需要,搭建了基於SASL認證的kafka偽叢集環境。本次同樣使用的是 kafka_2.10-0.10.1.0.tgz 版本的kafka,整合zookeeper,只需要對此進行配置即可,無需單獨安裝。 一、準備工作 1、環境:ubuntu1

Java實現基於token認證

       隨著網際網路的不斷髮展,技術的迭代也非常之快。我們的使用者認證也從剛開始的使用者名稱密碼轉變到基於cookie的session認證,然而到了今天,這種認證已經不能滿足與我們的業務需求了(分散式,微服務)。我們採用了另外一種認證方式:基於token的認證。 一、

奧塔線上:基於token認證的基礎知識詳解

一、    什麼是TokenToken原始的意思是“令牌”,是服務端生成的一個自定義字串,作為客戶端進行資料請求的一個標識。在區塊鏈興起後,Token被賦予“代幣”或“通證”的含義,意思是一種可流通的加密數字權益證明。二、    Token的起源早在計算機網路剛興起時,Tok

搭建基於TLS認證的Docker Registry

Docker Registry 生成SSL證書 $ openssl req -newkey rsa:4096 -nodes -sha256 -keyout alleyz.key -x509

SharePoint 2013 配置基於表單的身份認證

framework 中心 fig token borde 和數 說明 ember 選擇 前 言  這裏簡介一下為SharePoint 2013 配置基於表單的身份認證。簡單的說,就是用Net提供的工具創建數據庫。然後配置SharePoint 管理中心、STS服務、Web應

Django基於Cookie裝飾器實現用戶認證

.html 用戶 print class request 裝飾器 col password bsp def login(request): if request.method =="GET": return render(request,"logi

vsftpd基於pam_mysql做虛擬用戶認證

vsftpd pam_mysql (1)下載epel源[[email protected]/* */ ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #下載阿裏雲的epel

linux主機間基於密鑰認證

認證 密鑰 1.生成公鑰私鑰 ssh-genkey -t rsa2.復制公鑰到其他主機 ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]/* */ 該命令實際是將公鑰放到~/.ssh/authorized_keys文件

使用密鑰登錄CentOS系統(基於密鑰的認證

支持 使用 enter ase add 默認 strong rdquo mage 在Window客戶端有多種軟件可以登陸ssh,比如putty,xshelll,secureCRT,我就以xshell為例設置使用公鑰和私鑰驗證登陸服務器。 使用Xshell密鑰認證機制遠程登

基於FormsAuthentication的用戶、角色身份認證

add quest provide 數據庫 登錄 username uname 是否 image 一般情況下,在我們做訪問權限管理的時候,會把用戶的正確登錄後的基本信息保存在Session中,以後用戶每次請求頁面或接口數據的時候,拿到 Session中存儲的用戶基本信息,

ssh基於密鑰認證的登錄方式

ssh (ssh:secure shell, protocol, 22/tcp,安全的遠程登錄) SSH相關的安裝包: openssh-clients.x86_64 SSH的客戶端安裝包 openssh-server.x86_64 SSH的服務器端安裝包 o

基於HTTP 協議認證介紹與實現

idt 興趣 cati 生成 保護 進行 pos 響應 label 導言 一直對http 的頭認證有興趣,就是路由器的那種彈出對話框輸入賬號密碼怎麽實現一直不明白,最近,翻了一下http 協議,發現這是一個RFC 2617的實現,所以寫篇文章介紹一下吧. Http基本認證

vsftpd基於mysql實現用戶認證

pri fig rom 用戶 nbsp bre localtime margin align 一、演示環境:IP地址操作系統服務器角色192.168.1.144CentOS 6.9 vsftpd服務器192.168.1.145CentOS 6.9mysql服務器二、