From 584f0f913e3b543359ece1dc7223a3b2063b0a95 Mon Sep 17 00:00:00 2001 From: Martin Matous Date: Sun, 24 Sep 2023 02:54:57 +0200 Subject: [PATCH] add ensure-port-fwd.py Signed-off-by: Martin Matous --- README.md | 14 +++++++++++ ensure-port-fwd.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100755 ensure-port-fwd.py diff --git a/README.md b/README.md index 2108742..9e2b21c 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,20 @@ alias -s dnf '/usr/local/bin/dnf-search-installed.py' Usage: `dnf search ` +## ensure-port-fwd.py +Ensure given ports are present in TC7200 port forwarding table. + +For all those who get shitty routers shoved down their throats +by their greedy and incompetent ISPs who like to randomly +reset their settings for fun and profit using a backdoor. + +Status: active use (🖕 UPC/Vodafone) + +Dependencies: selenium, geckodriver, e-waste + +Usage: Run as a systemd service + + ## gasquery.py Query Alchemy API for current ETH L1 basefee. Intended for consumption by i3status-rs' custom block. diff --git a/ensure-port-fwd.py b/ensure-port-fwd.py new file mode 100755 index 0000000..9d635d2 --- /dev/null +++ b/ensure-port-fwd.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 + +# 3rd-party dependencies: selenium + +import os +import sys + +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys + +username = os.environ['ROUTER_USERNAME'] +password = os.environ['ROUTER_PASSWORD'] +target_ip = sys.argv[1] + +PORTS = {22, 25, 80, 443, 465, 993} + +options = webdriver.FirefoxOptions() +options.add_argument('-headless') +browser = webdriver.Firefox(options) +browser.implicitly_wait(1) +browser.get('http://192.168.0.1/') + +username_text_box = browser.find_element(By.ID, 'loginUsername') +username_text_box.send_keys(username) + +password_text_box = browser.find_element(By.ID, 'loginPassword') +password_text_box.send_keys(password) + +submit_button = browser.find_element(By.XPATH, '/html/body/div[1]/div[4]/div[1]/form/button') +submit_button.click() + +browser.get('http://192.168.0.1/advanced/forwarding.asp') +form_fields = '/html/body/div/div[4]/div[1]/form/input' +forwarded_ports = browser.find_elements(By.XPATH, form_fields) +forwarded: set[int] = set() +forwarded = { int(port.get_attribute('value').split('-')[0]) for port in forwarded_ports[1::4] } + +missing = PORTS - forwarded +n_missing = len(missing) +add_row = browser.find_element(By.XPATH, '/html/body/div/div[4]/div[1]/form/button[1]') +for i in range(n_missing): + add_row.click() + +n_fwd = len(forwarded) +for i, port in enumerate(missing): + browser.find_element(By.NAME, f'ForwardingPortRange{i + n_fwd}').clear() + browser.find_element(By.NAME, f'ForwardingPortRange{i + n_fwd}').send_keys(port) + browser.find_element(By.NAME, f'ForwardingTargetIp{i + n_fwd}').clear() + browser.find_element(By.NAME, f'ForwardingTargetIp{i + n_fwd}').send_keys(target_ip) + browser.find_element(By.NAME, f'ForwardingTargetPort{i + n_fwd}').clear() + browser.find_element(By.NAME, f'ForwardingTargetPort{i + n_fwd}').send_keys(port) +submit = browser.find_element(By.XPATH, '/html/body/div/div[4]/div[1]/form/button[2]') +submit.click() + +logout = browser.find_element(By.CLASS_NAME, 'logout') +logout.click() + +browser.quit()