最近想实现一个通过PROXY穿越的网络编程,将相关的内容进行一下汇总。很多东西来自网络共产主义,也应该为共产主义有所回馈。
HTTP PROXY穿越的流程
从第一个HTTP请求到200 Connected established,一共有6个步骤『PROXY需要校验,如果Proxy不需要验证,非常简单,直接供步骤一跳到步骤六,不再做描述』。下面以HTTP的CONNECT方法为例子,GET和POST的实现是类似的。
步骤一:
C --》 P : HTTP/1.1 CONNECT …… Connect:keep-Alive
步骤二:
C 《-- P :HTTP 407 Connect: close
在这里,PROXY给出三个Proxy-Auchenticate参数。Negotiate, Kerberos、NTLM的算法要求,其中NTLM根据后面交互的flags,有v1和v2两种算法。
Negotiate是一个ssp,它会根据用户的环境选择其它合适的具体SSP(更像是一个重定向器,协商):NTLM或者kerberos。 NTLM 是一个比较老的SSP,但支持广泛,Kerberos是新的比较好的SSP,但不支持NT4.0以及之前版本。用户一般不直接调用NTLM或者 Kerberos,而是调用Negotiate。Negotiate的策略是,如果用户系统不支持Kerberos,或者没有提供支持Kerberos的信息,则Negotiate会默认返回NTLM给客户端。
根据Connect的字段,客户端需要Close TCP连接,重新建立一条新的连接,发送步骤三的数据包。
步骤三:
C --》 P : HTTP/1.1 CONNECT NTLMSSP …… Connect:keep-Alive
选择NTLM算法,向P发送经过base64处理的type1 message,带有用户的HOST名字『机器名字』和域名,例如我的机器HOST为YJY-WEI,域名为GDCTC。这些通过获取计算机的信息得到。如果在LINUX或者其他操作系统,可以填为NULL、NULL。
步骤四:
C 《-- P :HTTP 407 Connect: Keep-Alive
P通过经过base64加密的信息给出type2 Message,其中包含nonce,提供给客户端计算,并给出NTLM算法的特性,这个特定由步骤三给出的NTLM flags,P来进行选择,可以指定使用NTLM使用v1还是v2。
步骤五:
C --》 P : HTTP/1.1 CONNECT NTLMSSP …… Connect:keep-Alive
C根据NTLM算法计算nonce、user、passwd,给出type3Message,并经过base64扰码给P送去。
步骤六:
C --》 P : HTTP/1.1 200
Connection建立,可以传递非HTML格式的内容 。
相关算法:NTLM
如果通过网络抓包,一般采用NTLM和kerberos。我们的第一个目的是通过NTLM实现通信。需现对NTLM算法有所了解。
windows的登录。按从弱至强可使用LM、NTLM、NTLM v2,kerberos。
- LM网络认证协议是很多年前Microsoft和IBM合作开发操作系统是开发的,比较薄弱,经常被用作攻击工具获得windows的密码。他的薄弱基于以下原因:
- LM无法辨别大小写字母,在密码哈希将所有字母都被转换成大写字谜,但包含不同类型字符的密码是难破译的。
- LM将长于7为的密码分为两块,分别处理。攻击者可分别攻击LMmima的两个部分。因此创建一个长于7位的密码不能是密码更安全。
- LM密码不能长于14个字符,但是长密码是更安全的密码。
- LM协议使用DES,DES是所有加密协议中较弱的一个协议。
默认情况下,Windows Server 2003钱的操作系统会创建、贮存一个LM hash和一个NTLM hash。此外,网络认证是传送一个LM喝NTLM版本的相应。这些因素使得LM较容易攻击,破解,通过破解LM hash值得到账户密码。通过消除LM hash的存贮,有很多方法可用于加强密码安全。
Windows NT引入NT LAN Manager认证协议。和LM不同,NTLM能辨别大小写字母。NTLM为整个密码生成一个MD4哈希(不分为7个字符的块)。虽然NTLM支持更长的字符,但是Window NT用户 界面不支持超过14位字符的密码,因此实际上这也是NT密码的长度。Windows 2000以后的版本能支持更长的密码,知道最到128位字符。
NTLMv2支持信息的保密性和完整性。用独立密钥和HMAC-MD5算法,NTLMv能提供128位加密和NTLMv会话安全性。当配置NTLMv作为唯一允许协议时,LM的响应将不会被发送。
计算机升级到Windows 2000及以上版本,更常用Kerberos认证协议。Kerberos协议被认为是专家级的强协议。协议的很多部分是专门针对那些有名的认证攻击而开发。区别Kerberos协议和NTLM的一个办法就是,NTLM是为应用于可信任网络而开发的,而Kerberos是为了应用于不可信任网络而开发。但是需要注意如果驱动器是由服务器IP地址而不是计算机名映射,Kerberos不可用,LM或NTLM可用。
如果我们进行抓包,在步骤二、步骤三、步骤四中,传递相关信息,在WWW-Authenticate中,使用了Base64算法进行扰码。
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
BASE64的原理可以在RFC中查阅,或者青参考网络共产主义:http://www.5dmail.net/html/2004-1-30/200413084348.htm。我们在下面给出相关的程序代码。
// ********************************* Base64 算法 begin *****************************
// Translation Table as described in RFC1113
static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static unsigned char db64[256] = {
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
255, 255, 255, 0, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255,
255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,