`
security
  • 浏览: 379507 次
  • 来自: www.pgp.org.cn
社区版块
存档分类
最新评论

基于NTLM的Proxy认证

阅读更多

以Matrix的Blog为例,截取其中的认证过程进行分析(注意,本文中使用的cookie值已经被处理过,呵呵,别想干坏事握)

测试环境:
域:mydomain.com
域主机:davidturing.mydomain.com
域用户:davidturing@mydomain.com
代理服务器: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;
}

分享到:
评论

相关推荐

    PHP获取windows登录用户名的方法

    NTLM认证是一种挑战/响应认证机制,允许客户端和服务器端之间的通信基于用户的Windows域账户进行身份验证。 从提供的文件内容来看,实现获取Windows登录用户名的操作大致可以分为以下步骤: 1. 使用`session_start...

    基于wininet下的HTTP访问之代理服务器 源代码

    4. 设置代理身份验证:如果代理服务器需要身份验证,可能需要使用`HttpAddRequestHeaders`函数添加相应的授权头信息,如基本认证或NTLM认证。 5. 发送HTTP请求:调用`HttpSendRequest`函数发送请求到服务器。在这个...

    hw面试题,网络安全服务面试题,78页,近三万字,纯手工总结

    - **定义**: Kerberos是一种基于“票证”的认证协议,广泛应用于大数据领域。 - **结构**: 包括KDC(密钥分发中心)、AS(身份验证服务)、TGS(票据授权服务)以及Account Database(账户数据库)等组成部分。 - **...

    UI_CreateWebServices_5min

    4. **NTLM支持**:它支持NT LAN Manager身份验证,实现单一登录功能。 5. **SOAP层功能**:Web服务是基于ASP.NET的,由IIS托管,使用HTTP协议。它支持SSL连接以确保安全性,同时提供基于角色的授权。 创建SAP Web...

    apache管理员手册

    2. 认证与授权:Apache提供多种认证机制,如Basic、Digest和NTLM,以及基于文件、数据库或外部程序的授权策略,确保只有授权用户能访问特定资源。 3. 防火墙和入侵检测:配合防火墙规则和入侵检测系统,可以提高...

    httpd-2.4.23.tar.gz

    此外,Apache还支持基本认证、摘要认证、NTLM认证等多种身份验证机制,以及访问控制列表(ACL)和防火墙规则,确保了服务器的访问安全。 在性能优化上,Apache 2.4引入了新的MPM(多进程模块),如Event MPM,它...

    cas-server-support-spnego-4.0.0-RC3.zip

    在实际应用中,这样的组合可能用于实现安全的、基于查询结果的权限管理,比如根据用户的查询结果来决定他们能访问哪些资源。 对于CAS服务器来说,理解SPNEGO的支持意味着你需要了解Kerberos和NTLM身份验证的工作...

    sqlmap语句.doc

    - `--auth-type=ATYPE`: 设置HTTP认证类型(基本、摘要或NTLM)。 - `--auth-cred=ACRED`: 提供HTTP认证凭据(用户名:密码)。 - `--auth-cert=ACERT`: 使用HTTP认证证书。 - `--proxy=PROXY`: 通过HTTP代理连接...

    Apache v2.2最新中文手册(09年版)

    此外,还有更强的认证机制,如Basic、Digest和NTLM,以及强化的权限控制。 4. **URL重写**:通过`mod_rewrite`模块,Apache v2.2可以实现URL重写,这在SEO优化和创建友好的URL结构方面非常有用。 5. **MIME类型...

    curl-7.55.0

    `curl` 支持多种认证机制,包括HTTP基本认证、NTLM、digest等。可以使用`-u`或`--user`参数提供用户名和密码。 9. **代理支持** 如果需要通过代理访问网络,可以使用`-x`或`--proxy`参数设置代理服务器。 10. **...

    apache 2.2 完全手册

    1. 虚拟主机:Apache 2.2支持基于IP、域名或端口的虚拟主机,这使得一台服务器可以托管多个独立的网站。 2. 访问控制:通过设置Allow、Deny和Order指令,可以控制哪些IP地址或网络段可以访问服务器。 3. 日志管理...

    httpcomponents-client-4.1.1源码

    5. **Authentication and Proxy Support**:HttpClient 4.1.1 支持多种认证机制,如Basic、Digest、NTLM等,同时也支持通过代理服务器进行通信,这使得它能在各种网络环境中正常工作。 6. **Redirect Handling**:...

    Apache2.0中文手册(chm格式)

    - mod_auth模块提供基本、摘要、NTLM和Digest等多种认证方式。 5. **日志记录**: - Apache2.0可以生成访问日志和错误日志,通过`CustomLog`和`ErrorLog`指令自定义日志位置和格式。 - `LogFormat`允许创建...

    httpd-2.2.15.tar.gz

    2. **用户认证**:Apache提供了多种身份验证机制,如Basic、Digest和NTLM,允许服务器控制哪些用户可以访问特定的资源。它还支持通过.htaccess文件进行授权,使得网站管理员可以在目录级别设置访问控制。 3. **模块...

    Apache HTTP服务器2.0中文说明

    13. **安全性认证**:Apache 2.0支持多种身份验证机制,如Basic、Digest、NTLM等,可以通过mod_authn系列模块进行配置,确保只有授权用户可以访问受保护的资源。 14. **SSL/TLS加密**:Apache 2.0通过mod_ssl模块...

    十个免费的Web压力测试工具

    WCAT的一个独特之处在于它支持各种认证机制,如NTLM和SSL,以及HTTP/1.0和HTTP/1.1版本的协议,使其成为全面测试Web服务器的理想选择。 ### 4. fwptt fwptt是另一款用于Web应用性能测试的工具,它不仅能够测试静态...

    HttpClient以及获取页面内容应用

    6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。 7. 插件式的自定义认证方案。 8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。 9. 连接管理器支持多线程应用。支持设置...

Global site tag (gtag.js) - Google Analytics