2015年1月

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 整理编辑,转载请注明出处

OpenWRT wifidog

基于OpenWRT SVN r39999源码,包含常用组件。
SVN r39161编译:http://blog.ich8.com/post/4274
SVN r39433编译:http://blog.ich8.com/post/4363

前言说明

本版本(Build1403)作为Build1402的更新,与上一个版本主要修改之处开启内核对更多的芯片组支持(测试),使用animefans_xj童鞋的vsftp插件,完善一些细节。如使用之前版本无重大问题,木必要升级。若一定想升级及保留配置文件请参考下文。
samba性能优化请自行寻找。

主要软件版本及更新

+更新 linux kernel 3.10.36
+更新 nginx 1.5.12
+更新 OpenSSL 1.0.1g
+新增 支持更多芯片组及部分第三方芯片组的IDE通道*(测试)
-增删 取消默认的vsftp,使用animefans_xj童鞋的vsftp插件
+新增 fping工具
+完善 BCM千兆网卡支持
+保持 Transmission 2.82
+保持 Aria2 1.18.3
+保持 带vim文本编辑器

可选组件

所有ipk文件(linux kernle 3.10.36)都位于packages压缩包中,如有需要可直接该压缩包获取。
nginx:http://files1.ich8.com/upfiles/2014/openwrt-trunk-1403/packages/nginx_1.5.12-1_x86.ipk
multiwan:http://files1.ich8.com/upfiles/2014/openwrt-trunk-1403/packages/multiwan_1.0.22-2_x86.ipk

ipk通过网络的安装方法

关于nginx的使用方法和一些问题,参考:http://blog.ich8.com/post/4359 ,nginx的默认端口是8080。

安装要求

最低512M的存储空间(硬盘 电子盘 CF卡均可)
最低64M的内存容量
最少一张有线网卡

硬件支持

无线网卡支持:
Atheros 5K/9K/10K
Broadcom B43xx
Intel 3945/4965/以及部分支持agn规格的网卡
Ralink RT2x00 USB网卡/RT73
Realtek RTL8187/RTL8192CE/CU/DE/SE
ZyDAS zd1211rw
有线网卡支持:
支持主流百兆和千兆网卡以及部分marvell网卡

安装方法

可参考详细过程:http://blog.ich8.com/post/4499
方法1(推荐):
1.下载vmdk磁盘文件放到其他存储设备(比如U盘等)
2.使用winimage软件进行镜像恢复操作。
具体步骤:磁盘 – 恢复物理驱动器中的虚拟硬盘映像 – 选择物理驱动器(如果是硬盘请勾选包括不可移动的硬盘) – 确定 在弹出的文件选择框中,下拉菜单选择vmdk格式,之后选择vmdk文件。
3.选择要安装的磁盘(被安装的该磁盘的所有分区以及数据都会被覆盖,谨慎选择磁盘!)
4.重启,注:如果在SATA模式或者AHCI模式下无法启动成功请将硬盘类型修改成IDE。
5.默认网关地址:192.168.1.1,单网卡和多网卡都可以通过WAN IP访问设置界面。默认WAN设置为DHCP,用户名为root,密码为admin。
方法2:
1.下载img文件和 physdiskwrite 工具,一起放到其他存储设备(比如U盘等)
链接:http://blog.ich8.com/file/53
2.在命令行窗口(CMD)中,进入文件所放的目录,输入
physdiskwrite.exe -u openwrt-ext4.img
3.选择要安装的磁盘(被安装的该磁盘的所有分区以及数据都会被覆盖,谨慎选择磁盘!)
4.重启,注:如果在SATA模式或者AHCI模式下无法启动成功请将硬盘类型修改成IDE。
5.默认网关地址:192.168.1.1,单网卡和多网卡都可以通过WAN IP访问设置界面。默认WAN设置为DHCP,用户名为root,密码为admin。

升级方法

首先,备份配置文件。系统 – 备份/升级 中备份配置文件。接着选择上述方法1或者方法2,安装完成进入设置页面,导入配置文件,重启即可。

设备挂载

挂载无线网卡:
插入USB/PCI-E无线网卡,之后重启路由器,网络 – 无线 菜单配置无线网卡,如果未生效请重启路由。并不保证一定完美支持上述列表所列网卡或者不在列表中的网卡,可以尝试,如果驱动不在列表之中也可以自行安装驱动。也可以直接编辑/etc/config/wireless,如果弄乱wireless文件,可以删除etc/config/wireless文件,重启后会重建该文件的默认设置。
挂载存储设备:
如果是已经安装好的,请在 磁盘 – 挂载点 中寻找你的设备,点击修改按钮,选择你的磁盘文件系统,可选添加一些参数。保存/应用即可。或者直接在 挂载点 中勾选相关设备,自动识别。支持挂载ntfs格式,ext3,ext4,推荐挂载ext4。

统计图表

关于统计图表,可以通过 统计 – Collectd 中的network设置来添加删除需要被统计接口,RRDTool之中建议将存储目录改为其他目录而非tmp目录。增减接口后如果图表中存在老的接口图表记录,而此接口已经从被统计接口中删除,请重启系统。

其他说明

如果启动停留在EXT4-fs (sda1): mounted filesystem without journal. Opts: (null)阶段,请直接回车即可,不影响使用。

包含以下功能:

1)状态
–|总览
–|防火墙
–|路由表
–|系统日志
–|内核日志
–|系统进程
–|实时信息
2)统计
–|Collectd
–|图表
3)系统
–|系统
–|管理权
–|软件包
–|启动项
–|计划任务
–|时间同步
–|LED配置
–|备份/升级
–|重启
4)服务
–|动态DDNS
–|UPNP
5)网络
–|接口
–|无线
–|DHCP/DNS
–|主机名
–|静态路由
–|诊断
–|防火墙
–|网络唤醒
–|QoS
6)磁盘应用
–|挂载点
–|磁盘信息
–|Aria2
–|FTP服务器
–|UPnP/AV媒体
–|miniDLNA
–|网络共享
–|Transmission
7)释放内存
8)重启

预览图

1.png

2.png

3.png

4.png

5.png

6.png

7.png

8.png

9.png

下载地址

vmdk文件:
下载地址:http://blog.ich8.com/file/106
SHA1:AA22BAA16EA712908CB497CE5DB0864F604F0B98

img文件:
下载地址:http://blog.ich8.com/file/107
SHA1:6F4B0A0F7249F8943D8767B4934967A11895FCE3
Packages打包:
下载地址:http://blog.ich8.com/file/108
SHA1:C38BDAF2DDF04FE547579CBEA7B62E1A0914BA57

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