专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »安全 » socks5代理:有关socks5代理的编写 »正文

socks5代理:有关socks5代理的编写

来源: 发布时间:星期六, 2009年9月12日 浏览:60次 评论:0
作者:WinEggDrop  http://www.ph4nt0m.org/

邮箱中收到几封有关socks5代理编写我也不知道来信者是不是这个论坛不过为了省却个人回复麻烦就写个贴子当是全部回复了

socks5代理和sock4代理都是很相似(sock4代理网上应该有很多代码我也曾在这里放过sock4代理代理),区别就是sock5代理除了支持UDP协议数据外还支持多种验证模式.般常用只是无验证模式(NO AUTHENTICATION )和用户/密码模式(USERNAME/PASSWORD),其它模式就算加上了应用也不支持(你可以看看oicq,msn,flashfxp等软件Software也都只是支持这两种模式).socks5代理般是 3种模式支持,TCP CONNECT,TCP BIND和UDP ASSOCIATE,这里最常用是TCP CONNECT,绝大部分TCP协议软件Software都是使用这种模式TCP BIND只会用在FTPActive模式中(就是数据连接是由FTP服务连接回FTP客户),并不常用而且我测试过flashfxp和cuteftp,两种都不支持TCP BIND(就是说如果是用了代理两种软件Software都不支持使用Active模式,定要使用Passive模式和FTP服务进行数据交换),所以我们只简单地讨论下TCP CONNECT和UDP ASSOCIATE两种模式.

Socks5代理请求和返回信息.
1.客户端发送到socks5代理至少 3个字节请求,第个字节定为5,第 2个字节为使用多少种验证,第 3个字节为验证模式代码.
例:如果要使用"USERNAME/PASSWORD"那么这 3个字节为5 1 2

2.Sock5代理接到上面请求后,如果是支持"USERNAME/PASSORD"验证模式就会返回两个字节,第字节为5,第 2字节为2.

3.客户端然后就向socks5代理发送验证信息,信息第字节不需要理会,第 2字节为验证用户名长度第 3字节开始是用户名和密码信息.

4.socks5代理验证用户名和密码成功后向客户端返回两个字节,5和0,如果验证失败返回0x05和0xff.

5.客户端开始向sock5代理发送第个向远程目标进行操作请求,请求模式如下:
位为5
第 2位是使用模式,0x01代表TCP CONNECT,0x02代表TCP BIND,0x03代表UDP ASSOCIATE
第 3位保留
第 4位是地址使用模式:0x01代表IP V4地址;0x03代表域名;0x04代表IP V6地址(般常见只是0x01和0x03两种模式很多软件Software都不支持IP V6)
第 5位开始就是目标地址和端口.

6.socks代理开始处理这个请求,对于TCP CONNECT和UDP ASSOCIATE模式有区别处理.
A.对于TCP CONNECT
将请求分析后将目标地址和 目标端口从请求中解析出来(无论请求中带地址是否以域名方式发送过来最终要将地址转换为IPV4地址),然后使用connect连接到目标地址中目标端口中去如果成功连接那就向客户端发送回10个字节信息,第字节为5,第 2字节为0,第 3字节为0,第 4字节为1,其它字节都为0.
B.对于UDP ASSOCIATE(这个复杂很多了)
将请求分析后先保存好客户端连接信息(客户端IP和连接过来源端口),然后本地创建个UDP,并将使用bind绑入本地所有地址中个UDP端口中去然后得到本地UDP绑定IP和端口,创建个10个字节信息返回给客户端去.第字节为0x05,第 2和第 3字节都为0,第 4字节为0x01(IPV4地址),第 5位到第8位是UDP绑定IP(以DWORD模式保存),第9位和第10位是UDP绑定端口(以WORD模式保存).

7.最后是数据传送了,TCP CONNECT和UDP ASSOCIATE模式又有所区别
A.对于TCP CONNECT
很简单,从客户中读到所有数据马上发送到远程目标;从远程目标中读到所有数据马上全部发送到客户端
B.对于UDP ASSOCIATE(又是复杂)
有数据包时首先将数据全部读取然后判断数据是从客户端还是远程目标传送过来(在读取时可以得到是从什么地址和端口读取到数据然后比较上面第6步时我们保存了下来客户端连接信息)如果数据是从客户端读取过来,我们要将UDP头去掉.例如我们读取到Buffer,Buffer[3]是1时UDP头就是10个字节长度,如果Buffer[3]是3话,UDP头长度是7+Buffer[4].例如我们得到UDP头是20位我们接收到Buffer是50位长度那么我们发送到目标数据包长度是30位前20位不发送只发送后面30位.如果数据是
从远程目标发送来,我们就要多发送多10位UDP头,这10位UDP头前 3位都是0,第 4位是0x01,第 5到第 8位是我们保存下来客户端IP,第9和第十位是客户端端口.如果我们接收到Buffer长度是50,那么我们发送到客户端数据就要加上10位UDP头也就是共要发送60位字节长度数据.

支持验证支持TCP CONNECT和UDP ASSOCIATE模式sock5代理基本编写就是这样
http://www.faqs.org/rfcs/rfc1928.html 是socks5代理rfc,不过是写得非常非常简单我也有时会质疑rfc为什么都这么简单和模糊为什么不可以写详细或加上几个简单例子FTP服务rfc甚至连列举文件时ftp服务向客户发送回去行信息标准都没有所以大家可以看到几乎每个ftp服务向客户端返回文件列表都不定是相同

点需要补充那就是socks5代理超时在刚连接和验证那段期间可以设置超时例如用户连接后30秒都没有验证就将那连接关闭但验证后就不可以设置超时了(或者是可以设置但我实在不知道如何做)不可以设置超时原因有两个:

1.对于UDP连接UDP是无连接你很难确定用户是否还是连接着还会继续发送数据过来有人说可以定时发送数据过去这是种办法但是要考虑到你不知道用户是使用什么软件Software在发送UDP数据过来你乱发数据过去很大可能是被客户软件Software认为是不合法数据而过滤掉如果sock5代理发过去数据被过滤了而认为客户 是断开了那么极容易就将没有断开用户也踢下去了,而且现在oicq还会使用使用两个连接个是UDP连接个是TCP连接UDP连接只是登陆上服务器时使用TCP连接却是进行数据传输而UDP连接却是直都不会有数据传输如果socks5代理UDP连接长时间没有数据传输而将那个UDP连接关闭oicq也会这样而掉线(你关闭了UDP连接oicq以为代理是不可用了自己会将TCP连接断开)

2.对于TCP连接设置超时是很简单但只是对于般只是使用个连接进行数据通讯软件Software有效对于FTP是完全失效当FTP客户挂socks5代理时当有数据传输例如列文件下载文件或上传文件时就会需要两个TCP连接个是接收FTP客户或接收FTP服务器返回信息个是进行数据交换如果在进行长时间数据交换时例如上传文件或下载文件有可能是要进行几小时或更长数据交换接收FTP客户命令或接收FTP服务器返回信息那个TCP连接直都没有数据通过,如果设置了超时例如1小时没有数据通过就断开连接你就会将那个TCP连接关闭了如果你关闭了那个TCP连接FTP客户端也会马上将数据交换那个TCP连接马上关闭(FTP客户端会认为自己被断开了)

这两点,我自己认为无法设置超时.也测试过几个socks5代理软件Software也是没有在验证后做超时处理TCP连接正常断开还是非正常断开,socks5代理都可以轻易检查到但UDP连接就很难检查所以在测试中都有发现些不正常断开UDP连接还是直没被socks5代理关闭到(ccproxy,wingate还有大家可能最熟悉skserver也是这样).



  • 篇文章: 浅析数据完整性问题

  • 篇文章: javascript加密解密终级指南
  • 0

    相关文章

    读者评论

    发表评论

    • 昵称:
    • 内容: