2015年3月

wifidog 实现无线热点认证

<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)。

web认证服务器端代码大家自己发挥吧。我个人只是实现了记录用户名密码这样一个简单的功能,如果要做的好的话可以用用户提交的密码到真正的认证服务器做一次认证来返回合适的结果,以及自己搭建dns服务器伪装的更加逼真,但是对于那些比较敏感的用户,还是不容易进行欺骗的,比如用回会发现ssl加密不见了。

考虑到功耗和实用问题,我的web认证服务器是搭建在树莓派上的。配置好无线路由的WLAN确保能联网之后,设置路由器的ip为10.1.1.1,手工配置树莓派静态ip为10.1.1.2。树莓派上安装nginx和php,配置好webserver的环境,上传自己的代码。开启无线路由的wifidog就可以守株待兔了。

当用户连接到自己搭建的无线路由器之后,可以说所有的网络流量都在控制之中了。不过怎么拿到这些流量成了一个问题。在此有三种拿到流量的方法。

1、ARP欺骗
这个不多说,大家都懂。不过有种偏离正题的感觉。
2、网线嗅探
当所处的环境通过网线来连到互联网时可用这个方法。将网线接入自制的硬件并将另一端插到无线路由的WLAN口,做好相应的配置。所需硬件参见我之前的一个帖子。原理类似于Throwing star lan tap,直接监听网线上的数据(无线路由的WLAN口)。
3、通过笔记本做中介
当所处的环境只有无线网连到Internet时,可用笔记本来搭建一个中介。
其连接关系为:
AP—无线网卡—有线网卡—自己的无线路由—受害者
这时用笔记本就可以直接嗅探到所有的数据。

这里以windows环境为例,演示如何搭建这个数据流链条。
在无线网卡连接到无线网之后,在属性中选择Internet连接共享,共享给以太网卡(有线网卡)。

此时有线网卡的ip会被设置为192.168.137.1

用网线连接有线网卡的网口和无线路由的WLAN。在无线路由的配置页面,将WLAN口配置静态ip为192.168.137.2,子网掩码255.255.255.0,网关为192.168.137.1。
这时整个数据流链条便搭建成功。

至于在linux下的搭建,注意打开ip_forward功能,并配置好iptables。因为没有linux环境,不在此详细演示。

对于流经网卡的数据包,可以收集的信息主要有两种:密码和session。
windows下的cain用来嗅探并提取得到的用户名密码,改下规则也能得到特定的cookie。
linux下的ettercap设置好规则能获取到几乎所有想要的信息,还能用来更改返回的web页面、挂马、添加cookie等等,可谓神器。

至于开启了ssl加密的服务器,可以用ssltrip来得到明文传送的数据。
如果不怕麻烦的话,还可以自己搭设dns服务器来钓鱼,不过这样就有些杀鸡用牛刀了。

PS:最近出了个叫极路由的东西,号称自动翻墙。目测是内置了一个vpn。大家有兴趣可以去了解下~
PPS:利用web认证方式的热点是挂马利器哦

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

Wifidog门户自定义

简介

  • 自定义静态内容被作为内容类型添加到数据库。他们会显示在结构化区域。
  • 在HTML里无布局
  • Logo和界面布局以CSS形式添加

自定义界面
添加自定义内容
所有自定义内容都应该通过内容管理器显示在数据库中,通常使用TrivialLangstring和Langstring类型。查看

  • ContentDistributionSystem
  • doc/auth-server/ContentManagerTutorial

自定义内容和界面元素的逻辑定位
注:下文提到的是系统目前使用的构架布局,但HTML和CSS重构还没有完成。
我们正在从HTML中将同样的布局导向代码移出,所以在CSS中可做的事还是要在CSS中完成。每个页面的结构标识和内容元素都将始终如一的向CSS提供更多的关联信息,并且让样式表更易编写修改。

当内容从网络接口分配出来时,就会具有三个属性:
1.Page:登录页面,门户或其它(其它是指除了登录页面和门户外,还有管理界面和其它页面)
2.Area:图表中灰色分区的ID
3.Display order:在一个区域内的内容显示顺序

更改布局
Stylesheets在wifidog可以做以下应用:
1.默认wifidog stylesheet(默认主题)
2.网络指定的由网络参数选择的stylesheet(网络主题公园)
3.Stylesheet内容类型被添加在内容管理器

使用CSS主题管理器进行样式化
所有网络主题公园都保存在自己的文件夹内,允许分享和用stylesheet来引用图形元素。
使用网络主题公园的优势在于:

  • 易于添加图像
  • 能够在SVN版本化
  • 在服务器上的负载极小
    网络主题公园最多的用于创建网络的大致外观和感觉。你也可以在这更换wifidog logo等。

使用Stylesheet内容类型样式化
使用内容管理器可以添加一个或多个stylesheet snipplets。
使用Stylesheet内容类型的优势在于:
能够被添加到一组热点或者单块内容
能够从网站界面进行编辑
Stylesheet内容类型大多用于暂时更改和定位专一样式化。

自定义UI
内容服务器的静态UI元素
一些重要的界面元素(例如:在线用户列表)已经被重新写成静态内容类型,所以每组可以逐个配置并决定在哪里显示。你可以向空白的门户添加人认为合适的元素。这些元素可以从内容管理器中获得。

动态Smarty模版
你可以使用Smarty语言直接在内容管理器上创建自定义UI元素,并可以从wifidog获得许多稳定的变量(热点名称,登录用户数量等)。当创建SmartyTemplate时可以看到获取完整列表的说明。

本地化
Static strings和gettext
所有static strings能够放在_()内,通过gettext来本地化。如果不支持你的语言,查看doc/developer/LanguageTranslation。
代码提示:

Good: $output=sprintf(('Welcome %s'), $username); Bad:
$output=
('Welcome').' '.$username; Very bad: $output=_("Welcome
$username");

内容管理器的文本内容
在Wifidog,所有安装语言都有相对应的文本内容版本。如果精确的语言没有文本的话,Wifidog会:
1.用同样语言显示文本(如:fr_FR或fr)
2.用国家子代码显示文本(如:en_CA)
3.用默认语言显示字符串
显示任何可得字符串

编辑静态模版
Wifidog的所有模版都旨在缓解开发,并不主要是做为自定义工具。它们可以随时更改并且可以在不得已时进行编辑。没有任何机制来要求模版必须用在哪里,而不认可默认设置。将来也不可能有这种机制。
不到万不得已不要编辑模版!这对你没有帮助并且可能会影响项目。如果你想进行一些操作,但又不知道如何进行,那选择下面一项:

  • 查询IRC邮件列表应该如何操作
  • 用不影响组群的方法修改模版,并提交修改补丁。通常会像创建HTML元素一样简单。
    如果你编辑了模版却没有提交修改,那么你就要负责根据基础模版的变更将它们进行更新。因此,我强烈建议从SVN启动成品服务器,而不是在tarball。这样SVN将会做一部分变更合并工作,并且有冲突提示。

与现有CMS整合
一些组群可能已经有定位感知CMS,他们想继续使用或不想提供任何定位专一内容。鉴于整合水平,已存在系统或网页可以选择一种或两种方法进行整合:
1.使用IFrame内容类型,它会使一个网页作为Wifidog门户的一部显示出来
2.使用SmartyWifidog内容类型,当往目标传递一个些wifidog变量时,可以使一个网页作为wifidog门户的一部分显示出来。
3.使用“URLto show instead of the portal”来完成关闭此热点的Wifidog门户,并且显示一个自定义URL。

与现有认证系统整合
通过扩展认证器的级别,Wifidog已经支持一些外部认证系统。不久,认证器确认了登录界面,创建新用户界面和用户管理部分以后,这个概念就会更加丰富。

本文章由 http://www.wifidog.pro/2015/03/12/wifidog%E9%97%A8%E6%88%B7%E8%87%AA%E5%AE%9A%E4%B9%89.html 整理编辑,转载请注明出处

Wifidog认证服务器常见错误提示

execSql() : An error occured while executing the following SQL query :
SELECT node_id, last_heartbeat_ip from nodes WHERE last_heartbeat_ip='1.2.3.4' ORDER BY last_heartbeat_timestamp DESC

Error message :
ERROR: relation "nodes" does not exist

execSqlUniqueRes() : An error occured while executing the following SQL query :
SELECT network_id FROM networks WHERE is_default_network=TRUE ORDER BY creation_date LIMIT 1

Error message :
ERROR: relation "networks" does not exist
: Network::getDefaultNetwork: Fatal error: Unable to find the default network! in /var/www/wifidog-auth/wifidog/classes/Network.php on line 101

Postgresql的数据库连接正常和wifidog已存在的数据库,但是最初的SQL结构和数据丢失。


: Unable to connect to database on localhost in /usr/local/apache2/htdocs/wifidog-auth/wifidog/classes/AbstractDbPostgres.php on line 71
  • Wifidog未在Postgresql创建的数据库
  • 与Postgresql数据库连接失败:错误配置或许可
    Install.php可以帮你解决这一问题并提供更多相关信息。

Le systeme tente de mettre a jour le schema de la base de donnees.
Preparing SQL statements to update schema to version 34

execSqlUpdate(): SQL Query :

BEGIN;


UPDATE schema_info SET value='34' WHERE tag='schema_version';
ALTER TABLE node_stakeholders DROP CONSTRAINT "$1";
ALTER TABLE node_stakeholders ADD CONSTRAINT nodes_fkey FOREIGN KEY (node_id) REFERENCES nodes(node_id) ON UPDATE CASCADE ON DELETE CASCADE;
COMMIT;
VACUUM ANALYZE;

0 rows affected by the SQL query.
Elapsed time for query execution : 0,847244 second(s)

execSqlUpdate(): 0 rows affected by the SQL query.

你的数据库结构没有更新,wifidog门户检测到这个问题,将结构更新到最新版本。如果进行此操作,刷新浏览器时这个提示就会消失。如果再看到这个提示并且又没有更新源代码,结构更新操作可能会失败。


Warning in /classes/Locale.php : Unable to setlocale() to en, return value: , current locale: 
LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;
LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
Warning in /classes/Locale.php : Unable to setlocale() to en, return value: , current locale: 
LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;
LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
Warning in /classes/Locale.php : Unable to setlocale() to en, return value: , current locale: 
LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;
LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
Warning in /classes/Locale.php : Unable to setlocale() to en, return value: , current locale: 
LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;
LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C

这个“locale”取决于服务器的配置。在大多数Unix/Linux系统中,可能会用locale –a来列出所有服务器可得语言环境。许多系统对每个国家都有特定的语言环境,所以你需要更改config.php或者local.config.php。例如:将fr改为fr_CA或fr_FR,将en改为en_US或en_GB。


HTML pages contain strange characters ....

修改你的Apache服务器配置文件,并将“AddDefaultCharset on”更改为“AddDefaultCharset utf-8”。


运行install.php脚本的错误提示
关闭错误日志,你可以看到空白页面。
如果你用以下命令打开错误日志:

here's how to turn on php error message display so you can debug problem.

In php.ini (in FC5 most likely located at /etc/php.ini) enable the

error_reporting = E_ALL 
display_errors = On

This will display any error encounter in you browser window. 

错误提示可能是这样的:

Postgresql database connection :
Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: FATAL: Ident authentication failed for user
"wifidog" in /var/www/html/wifidog/install.php on line 1062

这个问题与PostgreSQL安全有关。比较理想的情况是研究一下PGSQL调用的安全系统,但这也会解决这个问题。需要注意的是是否也可能会在不同系统中产生安全问题,这取决于数据库的配置。
编辑pg_hba.conf文件

#TYPE     DATABASE          USER            IP-ADDRESS             SUBNET MASK               METHOD
host      wifidog           wifidog         192.168.0.11           255.255.255.0             md5

当IPF 地址与设备的IP地址吻合时,连接到PGSQL服务器。
重启PGSQL服务器进行新设置。

本文章由 http://www.wifidog.pro/2015/03/12/Wifidog%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B8%B8%E8%A7%81%E9%94%99%E8%AF%AF%E6%8F%90%E7%A4%BA.html 整理编辑,转载请注明出处

WIFIDOG认证服务器内容管理器指南

内容管理器是WIFIDOG认证服务器最权威也最误解的组成部分。此文档不是内容管理器手册,而是共通使用案例的列单,和作为内容管理器如何去解决。

内容显示脚本
第一部分是简单脚本列表,回答问题“我想这样操作,我该如何操作?”

交替显示图像
1.连接想要显示图像的BannerAddGroup。
2.在“ContentGroup访问控制”将ContentGroup设置成不可再用。
3.将图像做为ContentGroup元素进行添加

在若干(并非全部)热点显示单块内容
这是非常普遍的情况:在所有热点以特定的顺序呈现特定的内容,或者是特定类型的所有热点(咖啡厅,酒吧,图书馆等等)
1.创建一个连接到全网络的可再用内容组
2.将内容作为内容组的第一元素进行添加
3.在“Only display at node(s)”文件添加所需热点

只向用户显示一次单块(或若干块)内容
这些对notices有帮助:
1.连接ContentGroup,添加notice。
2.在“ContentGroup access control”,将ContentGroup设置成不可再用。
3.将notice作为ContentGroup的元素进行添加
4.在“ContentGroup configuration”/“Can content be shown more than once to the same user?”:选择“Content can only be shown once。”

做一次“寻宝”或“串酒吧”
这是给用户提示来寻找下一个位置(和下一个线索)的活动。
1.连接一个新的内容组全网络
2.确保ContentGroup是可再用的
3.将提示作为ContentGroup元素进行添加
4.为每一个将要显示的提示添加热点

处理多个路径
如果你想有多条用户路径或者不全得到相同的提示,操作如下:
1.在“ContentGroup configuration”/“When does the content rotate?”选择“Content rotates each time you change node”。在这种情况下,这意味着内容将不会为单独一个用户循环,这正是我们想要的。
2.确保“In what order should the content displayed?”选择的是“Randomly”。

与另外一个网页或CMS整合
如果能够输入http GET参数,SmartyTemplate内容类型允许经过认证服务器变量到远程服务器。以下例子指出了两个方法。

IRC chat示例使用简单的HTML连接来获取变量
此代码示例允许使用IRC网络接口来直接连接到#wifidog通道。你通常需要手动选择用户名和通道。以下代码会创建一个新连接,此连接将直接将你引导到#wifidog通道,如果你连接到热点,你会告诉其用户你是从哪里连接的。

{if $userName}
<a target='_new' href='http://www.linux-quebec.org/cgi-bin/cgiirc/irc.cgi?interface=nonjs&Nickname={$userName|remove_accents|urlencode}{if $realNodeName}{'|'|urlencode}{$realNodeName|remove_accents|urlencode}{/if}&Realname={$userName|remove_accents|urlencode}{if $realNodeName}{'@'|urlencode}{$realNodeName|remove_accents|urlencode}{/if}&Server={'irc.freenode.net'|urlencode}&Channel={'#wifidog'|urlencode}'>
Chat with wifidog developers</a>

ShoutBox示例使用JavaScript取得变量
此代码将发送用户对另外一个网页的请求,并在新窗口打开。它已经尝试整合ISF的网络。

  • 创建ShoutBox
  • 在“Shout button ‘onclick=’value”中添加SmartyTemplate。
  • 将以下代码粘贴到SmartyTemplate,不用换行

    indow.open('http://www.cwide.org/scripts/cwide_addMsgAndRedirect.php?hotspotID={$realNodeId}&hotspotName={$realNodeName|urlencode}&message='+escape(document.getElementById('shout_text').value)+'&ipAddress={$realNodeLastHeartbeatIP}&username={$userNam|urlencode}');、

本文章由http://www.wifidog.pro/2015/03/12/wifidog%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%86%85%E5%AE%B9%E7%AE%A1%E7%90%86%E5%99%A8%E6%8C%87%E5%8D%97.html整理编辑,转载请注明出处