原文:http://briteming.blogspot.com/2012/02/socks.html



支持多进程的SOCKS安全代理。即用了认证也用了加密。具体的实现请看下面。

工程结构:
.
|�C client.c (客户端源代码)
|�C server.c(服务器源代码)
|�C Makefile
|�C pwd_file (密码文件)
`�C tags (exuberant ctags)
其中pwd_file是用于认证的,客户端服务器各有自己的。客户端的只包存自己的用户名 和被MD5哈希过的密码, 以'$'为间隔。服务器端存在这多个用户的信息每一个客户占一行。目前是 ”smIlence”的MD5摘要。

设置浏览器代理:
客户端设置浏览器的SOCKS host 为localhost:9050

开发环境:Ubuntu 10.10
开发语言:C (编译器是gcc 4.4.5)

编译方式:参考Makefile(需要openssl library)

运行方式:
客户端: $ ./client <server ip> <server port>
服务器端: $ ./server
其中server port 是8118

流程:
overview

client向server认证过程如下:
我们的认证方式是基于user和password的。首先server端会有数据库(为了简介我们是 用文件形式保存),保存用户和用户密码(当然密码不是明文用,MD5)。 client一开始想和server建立链接时,client会向server发送它是谁,server会向 client发送当时自EPOCH以来的微秒数,client利用收到的数和自己的密码摘要再进行 哈希,然后发给服务器,服务器也会把微秒数和密码摘要哈希然后进行比较,一样就认 证通过。这样做的原因是希望防止replay attack,中间者要是sniff我们的包也对他没 什么用因为客户端没有发送密码摘要,而是摘要再进行哈希的摘要,利用时间是因为时 间不会像随机数重复出现。

为了达到安全传输我们借用openssl来帮我们实现SSL,其中使用ASH-AES256-SHA为我们 的cipher suite。 如下所示,它使用DH算法来进行密钥交换,256-bit AES来加密,和SHA1来进行消息认 证。
$ openssl ciphers ADH-AES256-SHA -v
ADH-AES256-SHA SSLv3 Kx=DH Au=None Enc=AES(256) Mac=SHA1

在已经设置好浏览器的代理下,当有用户输入站点访问,浏览器会和客户端进行 SOCKS4链接,成功后客户端会向我们服务器进行认证。认证成功后,客户端接受并转发 浏览器的GET请求给我们服务器,这里是在SSL下和服务器 链接,服务器再转发给目的 http server,从http服务器接受回应的过程发送过去的逆过程。

最明显的安全弱点是我们的客户端没有对我们服务器进行认证。



from http://course.ccert.edu.cn/2010a/blog/kedy/2011/01/09/socks%e7%9a%84%e5%ae%89%e5%85%a8%e4%bb%a3%e7%90%86%e5%ae%9e%e7%8e%b0/



--
Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 2/09/2012 07:25:00 PM

--
1、翻墙利器赛风3下载地址: http://dld.bz/caonima326http://dld.bz/caonima745/
2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
3、停止订阅,请发邮件到
[email protected]
翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in 
the world.)

回复