分类 wifidog配置 下的文章

wifidog标准流程描述-wifidog原理

一 认证流程描述
  i. Wifidog 运行之后建立一系列的防火墙规则,主要规则起到如下作用:

    1.阻断所有内网到外网的访问。

    2.开通内网到外网的 dns 访问。

    3.开通内网到认证服务器以及域名白名单的访问。

    4.对内网到外网 80 端口的访问转向到 wifidog 自己的 http 服务(2060 端口)。

  ii. 手机、pc 连接上来后,app 或者系统(安卓、ios 会自己连接到各自的服务器上来验证网络的连通性)会发起对外网的访问请求,dns 请求会被放过,然后对应的 80 端口的访问会被指向 2060 的 http 服务,其他的请求都会被拦截。
  iii. Wifidog 的 http 接到 web 请求后,基本上都会被指向 404 页面,404 页面会给客户端一个重定向返回(302),要求客户端重定向访问认证服务器的 login 页面,附加参数 gw_id、gw_address、gw_port、url。
  iv. 手机、pc 客户端加载、显示认证服务器的 login 页面,用户根据页面内容做相关的认证操作(qq 登录、微博登录、用户名密码登录、手机短信登录等多种登录方式) ,原则只有一个认证不成功就仍然让用户停留在认证服务器继续认证操作,认证成功给客户端一个 302 重定向返回,根据 login 接口提交上来的参数 gw_address、gw_port 跳转套 wifidog web 服务的/wifidog/auth 页面上,附带 token 和 url 参数。
  v. Wifidog 的 web 服务收到手机、pc 客户端的/wifidog/auth 请求后,会主动对认证服务器的 auth 接口发起一个验证请求, 附带参数 ip、 mac、 token、 stage=loginvi. 认证服务器的 auth 接口收到 wifidog 的请求, 要根据内部逻辑返回是否允许通过的应答 :

    Auth: 0 拒绝

    Auth: 1 允许

  vii. Wifidog 接收到验证结果后,如果拒绝访问,就会返回 302 给客户端,重定向到认证服务器的 gw_message 接口,附带 message=denied 参数,客户端的上网访问仍然会回到第二步骤;如果允许访问,则改动防火墙规则,开通改客户端的上网(至此客户端已经能够正常上网) ,然后返回 302 重点向给客户端,重定向到认证服务器的 portal 接口,附带参数 gw_id。

  viii. 认证服务器的的 portal 接口根据业务流成显示广告业或者做其他的跳转ix. 整个认证流程完成。

二 ping 心跳流程描述
  i. ping 接口 wifidog 检测认证服务器访问是否正常、并向认证服务器提交 wifidog的运行状态。
  ii. 定时 ping 认证服务器。
  iii. 提交的参数 gw_id、sys_uptime、sys_memfree、wifidog_uptime。

三 auth 心跳流程描述
  i. 和 ping 一样的频率定期请求认证服务器,并且有多少已认证客户端就发多少请求。
  ii. 用来向认证服务器提交客户端的状态以及执行认证服务的验证结果。
  iii. 提交的参数有:ip、mac、token、incoming、outgoing 、stage=counters。
  iv. 如果服务器返回拒绝,则 wifidog 改动防火墙规则,关闭该客户端的上网。

本文章由 http://www.wifidog.pro/2015/03/18/wifidog%E6%A0%87%E5%87%86%E6%B5%81%E7%A8%8B%E6%8F%8F%E8%BF%B0.html 整理编辑,转载请注明出处

wifidog自动升级固件

一些组织机构运行wifidog时,会在不同的位置有许多接入点。当需要升级固件时,最痛苦的就是在所有的热点逐个升级。最好是热点能够在获取新版本固件时自动升级。
以下内容描述了如何配置固件才能让它自动升级。

前提条件

  • 以下内容假定了如何编辑固件的自定义镜像
  • 接入一个网站当做是自定义存储库。这个库将包含自定义固件图像和自定义包版本的目录。

编辑
假定BUILD_ROOT是openwrt镜像生成器的根目录
将自定义文件添加到镜像,在BUILE_ROOT创建一个新的名为files的目录。

  • 创建一个包含镜像编码的文件

    cd files
    mkdir etc
    cd etc
    touch custom_compil

现在编辑custom_compil文件包含自定义镜像版本
   
   1

  • 添加配置文件来保存自定义升级脚本的配置选项。从BUILD_ROOT/files目录

    mkdir etc/config
    cd etc/config
    touch customupgrade.conf

用以下信息编辑customupgrade.conf

# Config file for custom configuration options for the auto-upgrade script
# All options are defined with default values in the script

# custom_file : default /etc/custom_compil
# Specifies the file on the router that contains the number of the custom compilation of this image
# 
custom_file /etc/custom_compil

# temp_file : default /tmp/latest
# The temporary file to which to download the 'latest' file from the server
# Default value should do usually, unless the tmp directory is somewhere else
# temp_file /tmp/latest

# server 
# MANDATORY
# The web server root where the 'latest' file, and 'package-list' files are kept
server http://wifidog.testserver/files/

# filename : default latest
# The name of the file on the server containing the information on the latest image
#
filename latest

# packagelist : default packages-list
# The name of the file on the server containing the information on the package 
# versions that should be installed on the server
packagelist packages-list

# temp_package: default /tmp/packages-list
# The temporary file to which will be downloaded the packages list file from the server
# Default value should do usually
# temp_package /tmp/packages-list
  • 添加脚本来检测镜像和程序包的更新。从BUILD_ROOT/files目录

    mkdir usr
    mkdir usr/bin
    cd usr/bin
    touch customupgrade
    a+x customupgrade

用以下脚本编辑customupgrade

#!/bin/sh
#
# This script verifies if a new firmware is available on the server
# It supposes that a file on the machine exists in /etc/custom_compil.txt containing
# the custom firmware's version.  On the server, a file named "latest" contains the compil
# number of the latest firmware

CUSTOM_FILE=/etc/custom_compil.txt
TEMP_FILE=/tmp/latest
SERVER=http://wifidog.testserver/files/
FILENAME=latest
PACKAGELIST=packages-list
TEMP_PACKAGE=/tmp/packages-list

CONF_FILE=/etc/config/customupgrade.conf

# Overwrite the default values with the config if necessary
if egrep -v '^#.*' "$CONF_FILE" | grep 'custom_file'; then
        CUSTOM_FILE=$(egrep -v '^#.*' "$CONF_FILE" | grep 'custom_file' | awk '{print $2}')
fi
if egrep -v '^#.*' "$CONF_FILE" | grep 'temp_file'; then
        TEMP_FILE=$(egrep -v '^#.*' "$CONF_FILE" | grep 'temp_file' | awk '{print $2}')
fi
if egrep -v '^#.*' "$CONF_FILE" | grep 'server'; then
        SERVER=$(egrep -v '^#.*' "$CONF_FILE" | grep 'server' | awk '{print $2}')
fi
if egrep -v '^#.*' "$CONF_FILE" | grep 'filename'; then
        FILENAME=$(egrep -v '^#.*' "$CONF_FILE" | grep 'filename' | awk '{print $2}')
fi
if egrep -v '^#.*' "$CONF_FILE" | grep 'packagelist'; then
        PACKAGELIST=$(egrep -v '^#.*' "$CONF_FILE" | grep 'packagelist' | awk '{print $2}')
fi
if egrep -v '^#.*' "$CONF_FILE" | grep 'temp_package'; then
        TEMP_PACKAGE=$(egrep -v '^#.*' "$CONF_FILE" | grep 'temp_package' | awk '{print $2}')
fi

# Verify is a new firmware upgrade is available on the server
if [ -f $CUSTOM_FILE ]; then
        ACTUAL=$(cat $CUSTOM_FILE)

        if [ -f $TEMP_FILE ]; then
                rm $TEMP_FILE
        fi
        wget -O $TEMP_FILE $SERVER$FILENAME

        if [ -f $TEMP_FILE ]; then
                cat $TEMP_FILE | grep 'version' | cut -d: -f2 | awk '{print $1}'
                LATEST=$(cat $TEMP_FILE | grep 'version' | cut -d: -f2 | awk '{print $1}')
                LATESTIMG=$(cat $TEMP_FILE | grep 'file' | cut -d: -f2 | awk '{print $1}')
                MD5SUM=$(cat $TEMP_FILE | grep 'md5sum' | cut -d: -f2 | awk '{print $1}')
        fi

        if [ $LATEST -gt $ACTUAL ]; then
                wget -O "/tmp/"$LATESTIMG $SERVER$LATESTIMG
                ACTUALMD5=$(md5sum "/tmp/"$LATESTIMG | awk '{print $1}')
                if [ $MD5SUM = $ACTUALMD5 ]; then
                        sysupgrade "/tmp/"$LATESTIMG
                fi
        fi
fi

# If we get here in the script, then no new firmware was installed, we check for new packages

# First, verify if the custom package repository is in the opkg.conf file
#
# If you do not plan to have one such directory on your server, you may comment out
# the following lines
#
REPO=$(grep "$SERVER" /etc/opkg.conf)
if [ -z "$REPO" ]; then
        echo "src custom_pack "$SERVER"packages" >> /etc/opkg.conf
fi

# update the package repository to get all the latest versions
opkg update

# Download the packages-list file from the custom server.  
# This file is such that for each line contains the package name and version to be installed 
# example: 
#
# wifidog 1.1.5-1
# ntp 2.1-1
#
# Only those packages will be installed if the version is different from the one currently installed
if [ -f $TEMP_PACKAGE ]; then
        echo "removing file "$TEMP_PACKAGE
        rm $TEMP_PACKAGE
fi

wget -O $TEMP_PACKAGE $SERVER$PACKAGELIST

if [ -f $TEMP_PACKAGE ]; then
        cat $TEMP_PACKAGE | while read line; do
                PACKAGE=$(echo $line | cut -f1,2 | awk '{print $1}')
                VERSION=$(echo $line | cut -f1,2 | awk '{print $2}')
                if opkg status $PACKAGE | grep 'Version' | grep $VERSION > /dev/null; then
                        echo "package "$PACKAGES" "$VERSION" is already installed"
                else
                        echo "installing package "$PACKAGE
                        opkg install $PACKAGE
                fi              
        done
fi 
  • 现在我们需要添加一个定时任务来运行这个脚本。每天或根据所需的作何时候运行。从BUILD_ROOT/files目录

    cd etc
    mkdir crontabs
    cd crontabs
    touch root

编辑root文件包含所需的定时任务

# /etc/crontab/root:  Cron job to be run on custom openwrt firmware

# m h   dom mon dow command
*   2   *   *   *   /usr/bin/customupgrade > /tmp/custom.log

本文章由 http://www.wifidog.pro/2015/03/13/wifidog%E8%87%AA%E5%8A%A8%E5%8D%87%E7%BA%A7%E5%9B%BA%E4%BB%B6.html 整理编辑,转载请注明出处

wifidog配置网关注意事项

用户超时
跟其它解决方法不同,Wifidog无需一直打开认证页面用脚本来保持连接。网关只会在数秒中没有获得任何来自客户端的流量时,才判断为超时断开连接。确保客户端没有因为闲置而超时,网关将会在每个时间间隔来重新ping每个客户端来检测流量。遗憾的是,有些所谓防火墙设置很讨厌,防ping,造成检测时完全丢包被误判为离线。这也是经常超时的原因。

Wifidog网关网站界面
网关只有最小化的网站界面,为用户提供了很少的信息。这样就不会与门户相混淆,门户必须由认证服务器进行管理。以下信息可以直接从网关得到:

http://gateway_ip:gateway_port/wifidog/

  • 网关版本
  • 节点ID

http://gateway_ip:gateway_port/wifidog/status

  • 网关版本
  • 网关正常运行时间
  • 网关是否具有网络连通性
  • 是否与认证服务器相连接
  • 获得此服务的用户编码
  • 已连接的用户编码
  • 用户列表
      IP
      MAC
      Token
      下载字节
      上传字节
  • 目前使用的认证服务器

http://gateway_ip:gateway_port/wifidog/about

OLSR和Wifidog网关
问题:如果你选择只安装一个Wifidog网关服务器,那么所有用户的MAC地址都将被最近的OLSR路由器所“掩饰”。
解决办法:
在OLSR节点安装Wifidog。允许HTTP在OLSR节点间流动,可以通过用Cron在所有节点启用以下脚本来实现。

ipkg install ip
#!/bin/sh
#
# Script to bypass HTTP interception for traffic forwarded by OLSR
# bms 9-Aug-2005
# Licensed under GPL
#

rm -f /tmp/get_neighbors.awk
cat > /tmp/get_neighbors.awk <<__HERE1__
BEGIN {
 while("route -n"|getline) {
    if (/^[0-9]/) {
        if (0 < \$5) {
           if (\$3 == "255.255.255.255 <http://255.255.255.255>") {
             printf "%s\n", \$1;
                 }
               }
             }
           }
        }
__HERE1__

iptables -t nat -D WiFiDog_Unknown -j OlsrNeighbors 2>&1 >/dev/null
iptables -t nat -F OlsrNeighbors 2>&1 >/dev/null
iptables -t nat -X OlsrNeighbors 2>&1 >/dev/null
iptables -t nat -N OlsrNeighbors

neighbors=$(awk -f /tmp/get_neighbors.awk)

for _neighbor in ${neighbors} ; do

   _mac=$(grep "^${_neighbor}" /proc/net/arp | awk '{print $4}')
   echo ${_mac}
   iptables -t nat -A OlsrNeighbors -m mac --mac-source ${_mac} \
          -p tcp --dport 80 -j ACCEPT

done

iptables -t nat -I WiFiDog_Unknown -j OlsrNeighbors

本文章由 http://www.wifidog.pro/2015/03/13/wifidog%E9%85%8D%E7%BD%AE%E7%BD%91%E5%85%B3%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.html整理编辑,转载请注明出处

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