Presence detection with Linksys routers and PHP script

Working Devices

Model Number	Description	Vulnerable Firmware Versions (less than or equal to)	
E1200	Linksys E1200	1.0.04 (build 1)	2.0.11 (build 1)
E4200	Simultaneous Dual-Band Wireless-N Gigabit Router	1.0.06 (build 3)	2.1.41 (build 164606)
EA2700	Simultaneous Dual-Band Wireless-N Gigabit Router	1.1.40 (build 189581)	
EA2750	Simultaneous Dual-Band Wireless-N Gigabit Router	1.1.8 (build 184154)	
EA3500	Simultaneous Dual-Band Wireless-N Gigabit Router	1.1.40 (build 162464)	
EA4500	Simultaneous Dual-Band Wireless-N Gigabit Router	2.1.42 (build 183584)	3.1.7 (build 181919)
EA5800	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.6.186296	
EA6100	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.6 (build 181939)	
EA6200	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.41 (build 188556)	
EA6300	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.40 (build 184085)	
EA6350	Simultaneous Dual-Band Wireless-AC Gigabit Router	3.1.10.191322	
EA6400	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.40 (build 184085)	
EA6500	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.40 (build 176451)	
EA6700	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.41 (build 183873)	
EA6900	Simultaneous Dual-Band Wireless-AC Gigabit Router	2.0.3.186963	1.1.43 (build 182871)
EA7300	Max-Stream AC1750 MU-MIMO GIGABIT ROUTER	1.1.4.192824	
EA7400	Simultaneous Dual-Band Wireless-AC Gigabit Router	2.0.7.191563	1.1.5.190349
EA7500	Max-Stream AC1900 MU-MIMO GIGABIT ROUTER	2.0.7.191563	1.1.5.190349
EA8100	Max-Stream AC2600 MU-MIMO GIGABIT ROUTER	1.0.2.193233	
EA8300	Linksys AC2200 MU-MIMO Gigabit Tri-Band Router	1.1.4.191539	
EA8500	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.9.192968	
EA9200	Linksys AC3200 Tri-Band Smart Wi-Fi Router	1.1.9 (Build 183676)	
EA9300	Linksys MAX-STREAM AC4000 MU-MIMO Tri-Band Router	1.1.9.183697	
EA9400	Linksys MAX-STREAM AC5000 MU-MIMO Gigabit Router	1.0.3.181249	
EA9500	Linksys MAX-STREAM AC5400 MU-MIMO Gigabit Router	2.1.1.186574	1.1.7.180968
WRT1200AC	Simultaneous Dual-Band Wireless-AC Gigabit Router	2.0.6.191786	1.0.5.187766
WRT1900AC	Simultaneous Dual-Band Wireless-AC Gigabit Router	2.0.8.187766	1.1.10.187766
WRT1900ACS	Simultaneous Dual-Band Wireless-AC Gigabit Router	2.0.2.188405	1.0.3.187766
WRT3200ACM	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.0.6.186168	
XAC1200	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.42.166111	
XAC1900	Simultaneous Dual-Band Wireless-AC Gigabit Router	1.1.42.162280
WHW01	Velop	1.1.10.191690
WHW03	Velop	1.1.8.192419	2.1.8.192419

PHP code

#!/usr/bin/php
<?php

// Settings
$oh_url = "192.168.1.249";
$oh_port = "8080";
$linksys_ip = "192.168.1.251";
$devices_to_check = array(
    array('mac' => '6c:c7:ec:be:21:77', 'item' => 'Phone_1'),
    array('mac' => '64:cc:2e:64:fe:88', 'item' => 'Phone_2')	 
);

if(!function_exists('curl_version')) {
	echo "Please install cURL for PHP\n";
	echo "Ubuntu: sudo apt install php-curl\n";
	exit;
}

// Get active connections from Linksys router
$connections = getLinksysConnections($linksys_ip);

// Loop throught devices to check
foreach($devices_to_check as $device_to_check) {
	// Get state of device to check
	$state = getOHItemState($oh_url, $oh_port, $device_to_check['item']);
	
	// Check if device is online
	$is_online = isOnline($connections, $device_to_check['mac']);

	// Update status of device to check
	if($state == 'OFF' && $is_online) {
		setOHItemState($oh_url, $oh_port, $device_to_check['item'], 'ON');
	}
	if($state == 'ON' && !$is_online) {
		setOHItemState($oh_url, $oh_port, $device_to_check['item'], 'OFF');
	}	
}


// isOnline
function isOnline($connections, $mac_to_check) {
	$online = false;
	foreach($connections as $connection) {
		$connection_mac = $connection['macAddress'];
		if (strtoupper($mac_to_check)==$connection_mac) {
			$online = true;
		}
	}
	
	return $online;
}

// getOHItemState
function getOHItemState($oh_url, $oh_port, $item) {
	$state = 'OFF';
    $headers = array();
	$headers[] = 'Content-Type: text/plain';
	$headers[] = 'Accept: application/json';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_URL, "http://$oh_url:$oh_port/rest/items/$item");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    if (!curl_errno($ch)) {
        $json = json_decode($response, true);
		if(isset($json['state'])) {
			$state = $json['state'];
		}
    }
	curl_close($ch);
	
	return $state;
}

// setOHItemState
function setOHItemState($oh_url, $oh_port, $item, $state = 'OFF') {
	$return = false;
    $headers = array();
	$headers[] = 'Content-Type: text/plain';
	$headers[] = 'Accept: application/json';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_URL, "http://$oh_url:$oh_port/rest/items/$item");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $state);
    curl_exec($ch);
	
    if (!curl_errno($ch)) {
        $return = true;
    }
	curl_close($ch);
	
	return $return;	
}

// getLinksysConnections
function getLinksysConnections($linksys_ip) {
	define('ACTION', 'http://cisco.com/jnap/networkconnections/GetNetworkConnections');
	$connections = array();

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, 'http://'.$linksys_ip.'/JNAP/');
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, "{}");

	$headers = array();
	$headers[] = 'X-Jnap-Action: '.ACTION;
	$headers[] = 'Content-Type: application/x-www-form-urlencoded';
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

	$json = json_decode(curl_exec($ch), true);
	if (!curl_errno($ch)) {
		$connections = $json['output']['connections'];
	}
	curl_close($ch);
	
	return $connections;
}

Crontab

*/1 * * * * /path/phpscript

2 Likes