分类 默认分类 下的文章

Wifidog Flow Diagram

wifidog-flow-2009.png

General Flow Description:

1.The client does his initial request, as if he was already connected, (e.g.: http://www.google.ca)
2.The Gateway's firewall rules mangle the request to redirect it to a local port on the Gateway. When that's the done, the Gateway provides an HTTP Redirect reply that contains the Gateway ID, Gateway FQDN and other informations
3.The Client does his request to the Auth Server as specified by the Gateway, see Login Protocol
4.The Gateway replies with a (potentially custom) splash (login) page
5.The Client provides his identification informations (username and password)
6.Upon succesful authentication, the client gets an HTTP Redirect to the Gateway's own web server with his authentication proof (a one-time token), http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token]
7.The Client then connects to the Gateway and thus gives it his token
8.The Gateway requests validation of the token from the Auth Server, see Client Protocol
9.The Auth Server confirms the token
10.The Gateway then sends a redirect to the Client to obtain the Success Page from the Auth Server, redirects to http://auth_server/portal/
11.The Auth Server notifies the Client that his request was successful

本文章由 http://www.wifidog.pro/2015/01/28/wifidog-flow.html 整理编辑,转载请注明出处

wifidog 认证wifi

Wifi有一种web方式认证方案,当连接到某些不加密的热点之后,会跳转到一个网页来认证登陆,大家熟悉的CMCC就采用了这种web的验证方式。
它的原理是在得到正确的认证之前,会把所有的流量重定向到认证服务器上,通过认证后,便可以正常使用。
如果说仅仅想获取web验证时其他用户的用户名和密码,arp欺骗然后嗅探足够了。因为此时攻击者已经分配到了ip,且同一网关下产生的流量是不会重定向的。
但是目前的情况是,认证服务器用的https加密传输,无法嗅探到明文密码。
于是萌生了伪造热点及web认证服务器,然后记录密码的想法。

客户端在接受WiFi信号的时候有一个特点,在ssid相同的时候,会只保留信号强的那一个无线路由的ssid。
这样,只要伪造热点的ssid与原热点的相同,会有部分人搜到伪造的热点,从而登陆,记录密码。

本无线路由用的ddwrt的系统,装了wifidog来进行辅助web认证。

至于如何搭建web认证系统,百度一大把,但主要是用了wiwiz和wifiap这两个成熟的网站提供的方案。
但是,利用第三方的网站无法拦截到用户名和密码,而且无法控制认证的过程。
最好的解决方法是自己搭建一个简单的系统。

Wifidog的认证流程如下:
1、客户端发出一个http请求(http://www.xxx.com)
2、网关将该请求信息以及网关本身的一些信息作为参数,将原始的请求重定向到web认证服务器(http://auth_server/login/)
3、Web认证服务器通过客户端的认证之后,返回一个一次性的token,客户端带着这个token去网关上的wifidog开放的端口去做验证(http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token])
4、Wifidog拿到token后,到web认证服务器检测token是否有效,如果有效则通过客户端的验证,开放访问权限,并将客户端重定向到web认证服务器的欢迎界面(http://auth_server/portal/);如果token无效,则需要继续验证

Wifidog官方推荐的web认证服务软件为authpuppy (http://www.authpuppy.org),不过其代码比较复杂,可以参考wifidog之前的web认证服务软件。获取方式为:
svn checkout https://dev.wifidog.org/svn/trunk/wifidog-auth
web认证服务软件用php写成,重点文件为wifidog-auth\wifidog\login\index.php(客户端web认证、产生token以及重定向到wifidog的开放端口)、wifidog-auth\wifidog\auth\index.php(wifidog验证token)、wifidog-auth\wifidog\portal\index.php(认证成功后页面重定向)。宏定义在wifidog-auth\wifidog\include\common.php文件中。

了解了基本流程就可以DIY出一个简单的web认证服务器了。在认证的过程中可以顺便记录下客户端的密码。
路由器上Wifidog配置如下图。重点配置的地方为端口号(port),认证服务器(AuthServer Hostname), 认证服务器web端口(AuthServer HTTP Port),路径(AuthServer Path)。
1.png

本文章由 http://www.wifidog.pro/2015/01/28/wifidog%E8%AE%A4%E8%AF%81-3.html 整理编辑,转载请注明出处

wifidog 认证 php

1.首先简单说说wifidog认证的过程

客户端首次连接到wifi后,浏览器请求将会被重定向到:

login/?gw_address=%s&gw_port=%d&gw_id=%s&url=%s

验证通过后,客户端被重定向到网关,url格式如下:

http://网关地址:网关端口/wifidog/auth?token=

wifidong会启动一个线程周期性地报告每一个用户的状态信息,并通过如下地址发送给认证

服务器:

auth_server:/auth/?stage=
ip=
mac=
token=
incoming=
outgoing=

认证服务器根据该状态信息决定是否允许该用户继续连接,并回复网关,回复格式为:Auth:状态码,

如:Auth:1

常用状态码:

0:AUTH_DENIED,表示拒绝

1:AUTH_ALLOWED,验证通过

验证通过后,将重定向到如下地址:

portal/?gw_id=%s

wifidog的ping协议

wifidog通过ping协议将当前状态信息发送给认证服务器,发送地址为:

http://auth_sever/ping/?
gw_id=%s
sys_uptime=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu

认证服务器须返回一个“Pong”作为回应。

2.具体php实现代码如下

<pre code_snippet_id="335795" snippet_file_name="blog_20140509_1_6007550" name="code">public function auth()  
    {  
    <span style="white-space:pre">  </span>//响应客户端的定时认证,可在此处做各种统计、<a title="计费" href="index.php?c=search&amp;key=%E8%AE%A1%E8%B4%B9" target="_blank">计费</a>等等  
    <span style="white-space:pre">  </span>/*  
    <span style="white-space:pre">      </span>wifidog 会通过这个接口传递连接客户端的信息,然后根据返回,对客户端做<a title="开通" href="index.php?c=search&amp;key=%E5%BC%80%E9%80%9A" target="_blank">开通</a>、断开等处理,具体返回值可以看wifidog的文档  
    <span style="white-space:pre">  </span>wifidog主要提交如下参数  
    <span style="white-space:pre">  </span>1.ip  
    <span style="white-space:pre">  </span>2. mac  
    <span style="white-space:pre">  </span>3. token(login页面<a title="下发" href="index.php?c=search&amp;key=%E4%B8%8B%E5%8F%91" target="_blank">下发</a>的token)  
    <span style="white-space:pre">  </span>4.incoming 下载流量  
    <span style="white-space:pre">  </span>5.outgoing 上传流量  
    <span style="white-space:pre">  </span>6.stage  认证阶段,就两种 login 和 counters  
    <span style="white-space:pre">  </span>*/  


    <span style="white-space:pre">  </span>$stage = $_GET['stage'] == 'counters'?'counters':'login';  
    <span style="white-space:pre">  </span>if($stage == 'login')  
    <span style="white-space:pre">  </span>{  
    <span style="white-space:pre">      </span>//XXXX跳过login 阶段的处理XXXX不能随便跳过的  
    <span style="white-space:pre">      </span>//默认返回 允许  
    <span style="white-space:pre">      </span>echo "Auth: 1";  
    <span style="white-space:pre">  </span>}  
    <span style="white-space:pre">  </span>else if($stage == 'counters')  
    <span style="white-space:pre">  </span>{  

    <span style="white-space:pre">      </span>//做一个简单的流量判断验证,下载流量超值时,返回<a title="下线" href="index.php?c=search&amp;key=%E4%B8%8B%E7%BA%BF" target="_blank">下线</a>通知,否则保持在线  
    <span style="white-space:pre">      </span>if(!empty($_GET['incoming']) and $_GET['incoming'] &gt; 10000000)  
    <span style="white-space:pre">      </span>{  
    <span style="white-space:pre">          </span>echo "Auth: 0";  
    <span style="white-space:pre">      </span>}else{  
    <span style="white-space:pre">          </span>echo "Auth: 1\n";  
    <span style="white-space:pre">      </span>}  
    <span style="white-space:pre">  </span>}  
    <span style="white-space:pre">  </span>else  
    <span style="white-space:pre">      </span>echo "Auth: 0"; //其他情况都返回拒绝  
    <span style="white-space:pre">      </span>  
    <span style="white-space:pre">      </span> <span style="white-space:pre">  </span>  
    <span style="white-space:pre">  </span>/*  
    <span style="white-space:pre">      </span>返回值:主要有这两种就够了  
    <span style="white-space:pre">  </span>0 - 拒绝  
    <span style="white-space:pre">  </span>1 - <a title="放行" href="index.php?c=search&amp;key=%E6%94%BE%E8%A1%8C" target="_blank">放行</a>  

    <span style="white-space:pre">  </span>官方文档如下  
    <span style="white-space:pre">  </span>0 - AUTH_DENIED - User firewall users are deleted and the user removed.  
    <span style="white-space:pre">  </span>6 - AUTH_VALIDATION_FAILED - User email validation timeout has occured and user/firewall is deleted(用户邮件验证超时,防火墙关闭该用户)  
    <span style="white-space:pre">  </span>1 - AUTH_ALLOWED - User was valid, add firewall rules if not present  
    <span style="white-space:pre">  </span>5 - AUTH_VALIDATION - Permit user access to email to get validation email under default rules (用户邮件验证时,向用户开放email)  
    <span style="white-space:pre">  </span>-1 - AUTH_ERROR - An error occurred during the validation process  
    <span style="white-space:pre">  </span>*/  
    }  
    public function portal()  
    {  
    <span style="white-space:pre">  </span>/*  
    <span style="white-space:pre">  </span> wifidog 带过来的参数 如下  
    <span style="white-space:pre">  </span>1. gw_id  
    <span style="white-space:pre">  </span>*/  
    <span style="white-space:pre">  </span>//重定到指定网站 或者 显示splash广告页面  
    <span style="white-space:pre">  </span>redirect('http://www.baidu.com', 'location', 302);  
    <span style="white-space:pre">      </span>  
    }  
    public function ping()  
    {  
    <span style="white-space:pre">  </span>//url请求 "gw_id=$gw_id&amp;sys_uptime=$sys_uptime&amp;sys_memfree=$sys_memfree&amp;sys_load=$sys_load&amp;wifidog_uptime=$wifidog_uptime";  
    <span style="white-space:pre">  </span>//log_message($this-&gt;config-&gt;item('MY_log_threshold'), __CLASS__.':'.__FUNCTION__.':'.debug_printarray($_GET));  

    <span style="white-space:pre">  </span>//判断各种参数是否为空  
    <span style="white-space:pre">  </span>if( !(isset($_GET['gw_id']) and isset($_GET['sys_uptime']) and isset($_GET['sys_memfree']) and isset($_GET['sys_load']) and isset($_GET['wifidog_uptime']) ) )  
    <span style="white-space:pre">  </span>{  
    <span style="white-space:pre">      </span>echo '{"error":"2"}';  
    <span style="white-space:pre">      </span>return;  
    <span style="white-space:pre">  </span>}  
    <span style="white-space:pre">  </span>//添加<a title="心跳" href="index.php?c=search&amp;key=%E5%BF%83%E8%B7%B3" target="_blank">心跳</a>日志处理功能  
    <span style="white-space:pre">  </span>/*  
    <span style="white-space:pre">      </span>此处可获取 wififog提供的 如下参数  
    <span style="white-space:pre">  </span>1.gw_id  来自wifidog 配置文件中,用来区分不同的路由设备  
    <span style="white-space:pre">  </span>2.sys_uptime 路由器的系统启动时间  
    <span style="white-space:pre">  </span>3.sys_memfree 系统内存使用百分比  
    <span style="white-space:pre">  </span>4.wifidog_uptime wifidog持续运行时间(这个数据经常会有问题)  
    <span style="white-space:pre">  </span>*/  

    <span style="white-space:pre">  </span>//返回值  
    <span style="white-space:pre">  </span>echo 'Pong';  
    }  
    /**  
     * wifidog 的gw_message 接口,信息提示页面  
     */  
    function gw_message()  
    {  
    <span style="white-space:pre">  </span>if (isset($_REQUEST["message"])) {  
    <span style="white-space:pre">      </span>switch ($_REQUEST["message"]) {  
    <span style="white-space:pre">          </span>case 'failed_validation':  
    <span style="white-space:pre">              </span>//auth的stage为login时,被服务器返回AUTH_VALIDATION_FAILED时,<a title="来到" href="index.php?c=search&amp;key=%E6%9D%A5%E5%88%B0" target="_blank">来到</a><a title="该处" href="index.php?c=search&amp;key=%E8%AF%A5%E5%A4%84" target="_blank">该处</a>处理  
    <span style="white-space:pre">              </span>//认证失败,请重新认证  
    <span style="white-space:pre">              </span>break;  
    <span style="white-space:pre">          </span>case 'denied':  
    <span style="white-space:pre">              </span>//auth的stage为login时,被服务器返回AUTH_DENIED时,来到该处处理  
    <span style="white-space:pre">              </span>//认证被拒  
    <span style="white-space:pre">              </span>break;  
    <span style="white-space:pre">          </span>case 'activate':  
    <span style="white-space:pre">              </span>//auth的stage为login时,被服务器返回AUTH_VALIDATION时,来到该处处理  
    <span style="white-space:pre">              </span>//待激活  
    <span style="white-space:pre">              </span>break;  
    <span style="white-space:pre">          </span>default:  
    <span style="white-space:pre">              </span>break;  
    <span style="white-space:pre">      </span>}  
    <span style="white-space:pre">  </span>}else{  
    <span style="white-space:pre">      </span>//不回显任何信息  
    <span style="white-space:pre">  </span>}  
    }</pre>  
</p>  

本文章由 http://www.wifidog.pro/2015/01/28/wifidog-php-1.html 整理编辑,转载请注明出处