fix(mitmproxy): Fix web UI token access and transparent mode setup
- Add get_web_token to RPCD ACL permissions (was missing, causing 403) - Add fallback token retrieval from container via lxc-attach - Improve token capture regex to support alphanumeric tokens - Fix startup script with background process + tee for reliable capture - Add IP forwarding enablement for transparent proxy mode - Fix bypass rule for traffic destined to router itself Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
a960c20124
commit
99aa610879
@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=luci-app-mitmproxy
|
PKG_NAME:=luci-app-mitmproxy
|
||||||
PKG_VERSION:=0.4.0
|
PKG_VERSION:=0.4.0
|
||||||
PKG_RELEASE:=3
|
PKG_RELEASE:=5
|
||||||
PKG_ARCH:=all
|
PKG_ARCH:=all
|
||||||
|
|
||||||
PKG_LICENSE:=Apache-2.0
|
PKG_LICENSE:=Apache-2.0
|
||||||
|
|||||||
@ -408,15 +408,37 @@ get_web_token() {
|
|||||||
local web_port=$(uci -q get mitmproxy.main.web_port || echo "8081")
|
local web_port=$(uci -q get mitmproxy.main.web_port || echo "8081")
|
||||||
local token=""
|
local token=""
|
||||||
|
|
||||||
|
# Try reading token from host-mounted path
|
||||||
if [ -f "$token_file" ]; then
|
if [ -f "$token_file" ]; then
|
||||||
token=$(cat "$token_file" 2>/dev/null | tr -d '\n\r')
|
token=$(cat "$token_file" 2>/dev/null | tr -d '\n\r')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Fallback: read token directly from container if host file is missing/empty
|
||||||
|
if [ -z "$token" ] && command -v lxc-attach >/dev/null 2>&1; then
|
||||||
|
if lxc-info -n "$LXC_NAME" -s 2>/dev/null | grep -q "RUNNING"; then
|
||||||
|
token=$(lxc-attach -n "$LXC_NAME" -- cat /data/.mitmproxy_token 2>/dev/null | tr -d '\n\r')
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Second fallback: parse token from mitmweb log inside container
|
||||||
|
if [ -z "$token" ] && command -v lxc-attach >/dev/null 2>&1; then
|
||||||
|
if lxc-info -n "$LXC_NAME" -s 2>/dev/null | grep -q "RUNNING"; then
|
||||||
|
token=$(lxc-attach -n "$LXC_NAME" -- grep -o 'token=[a-zA-Z0-9_-]*' /tmp/mitmweb.log 2>/dev/null | head -1 | cut -d= -f2)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Construct URL - only add token parameter if token exists
|
||||||
|
local web_url="http://$router_ip:$web_port"
|
||||||
|
local web_url_with_token="$web_url"
|
||||||
|
if [ -n "$token" ]; then
|
||||||
|
web_url_with_token="$web_url/?token=$token"
|
||||||
|
fi
|
||||||
|
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
{
|
{
|
||||||
"token": "$token",
|
"token": "$token",
|
||||||
"web_url": "http://$router_ip:$web_port",
|
"web_url": "$web_url",
|
||||||
"web_url_with_token": "http://$router_ip:$web_port/?token=$token"
|
"web_url_with_token": "$web_url_with_token"
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,10 +6,15 @@
|
|||||||
"luci.mitmproxy": [
|
"luci.mitmproxy": [
|
||||||
"get_status",
|
"get_status",
|
||||||
"get_config",
|
"get_config",
|
||||||
|
"get_transparent_config",
|
||||||
|
"get_whitelist_config",
|
||||||
|
"get_filtering_config",
|
||||||
|
"get_all_config",
|
||||||
"get_stats",
|
"get_stats",
|
||||||
"get_requests",
|
"get_requests",
|
||||||
"get_top_hosts",
|
"get_top_hosts",
|
||||||
"get_ca_info"
|
"get_ca_info",
|
||||||
|
"get_web_token"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"uci": [
|
"uci": [
|
||||||
@ -22,7 +27,11 @@
|
|||||||
"service_start",
|
"service_start",
|
||||||
"service_stop",
|
"service_stop",
|
||||||
"service_restart",
|
"service_restart",
|
||||||
|
"firewall_setup",
|
||||||
|
"firewall_clear",
|
||||||
"set_config",
|
"set_config",
|
||||||
|
"add_to_list",
|
||||||
|
"remove_from_list",
|
||||||
"clear_data"
|
"clear_data"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=secubox-app-mitmproxy
|
PKG_NAME:=secubox-app-mitmproxy
|
||||||
PKG_RELEASE:=14
|
PKG_RELEASE:=16
|
||||||
PKG_VERSION:=0.4.0
|
PKG_VERSION:=0.4.0
|
||||||
PKG_ARCH:=all
|
PKG_ARCH:=all
|
||||||
PKG_MAINTAINER:=CyberMind Studio <contact@cybermind.fr>
|
PKG_MAINTAINER:=CyberMind Studio <contact@cybermind.fr>
|
||||||
|
|||||||
@ -132,6 +132,11 @@ nft_setup() {
|
|||||||
|
|
||||||
log_info "Setting up nftables for transparent proxy..."
|
log_info "Setting up nftables for transparent proxy..."
|
||||||
|
|
||||||
|
# Enable IP forwarding (required for transparent proxying)
|
||||||
|
log_info "Enabling IP forwarding..."
|
||||||
|
sysctl -w net.ipv4.ip_forward=1 >/dev/null 2>&1
|
||||||
|
sysctl -w net.ipv6.conf.all.forwarding=1 >/dev/null 2>&1
|
||||||
|
|
||||||
# Create mitmproxy table
|
# Create mitmproxy table
|
||||||
nft add table inet $NFT_TABLE 2>/dev/null || true
|
nft add table inet $NFT_TABLE 2>/dev/null || true
|
||||||
|
|
||||||
@ -169,8 +174,9 @@ nft_setup() {
|
|||||||
nft add rule inet $NFT_TABLE prerouting ip daddr @bypass_ipv4 return 2>/dev/null || true
|
nft add rule inet $NFT_TABLE prerouting ip daddr @bypass_ipv4 return 2>/dev/null || true
|
||||||
nft add rule inet $NFT_TABLE prerouting ip6 daddr @bypass_ipv6 return 2>/dev/null || true
|
nft add rule inet $NFT_TABLE prerouting ip6 daddr @bypass_ipv6 return 2>/dev/null || true
|
||||||
|
|
||||||
# Don't intercept traffic from the proxy itself
|
# Don't intercept traffic destined for the router itself (local services)
|
||||||
nft add rule inet $NFT_TABLE prerouting meta skuid mitmproxy return 2>/dev/null || true
|
local router_ip=$(uci -q get network.lan.ipaddr || echo "192.168.1.1")
|
||||||
|
nft add rule inet $NFT_TABLE prerouting ip daddr "$router_ip" return 2>/dev/null || true
|
||||||
|
|
||||||
# Redirect HTTP traffic
|
# Redirect HTTP traffic
|
||||||
if [ "$redirect_http" = "1" ]; then
|
if [ "$redirect_http" = "1" ]; then
|
||||||
@ -385,17 +391,37 @@ rm -f /data/.mitmproxy_token /tmp/mitmweb.log
|
|||||||
|
|
||||||
echo "Starting mitmweb..."
|
echo "Starting mitmweb..."
|
||||||
|
|
||||||
# Run mitmweb with unbuffered output and inline token capture
|
# Start mitmweb in background, output to log file
|
||||||
/usr/local/bin/mitmweb $ARGS 2>&1 | while IFS= read -r line; do
|
/usr/local/bin/mitmweb $ARGS 2>&1 | tee /tmp/mitmweb.log &
|
||||||
echo "$line"
|
MITMWEB_PID=$!
|
||||||
echo "$line" >> /tmp/mitmweb.log
|
|
||||||
case "$line" in
|
# Wait for token to appear in log (with timeout)
|
||||||
*token=*)
|
echo "Waiting for authentication token..."
|
||||||
token=$(echo "$line" | grep -o 'token=[a-f0-9]*' | cut -d= -f2)
|
ATTEMPTS=0
|
||||||
[ -n "$token" ] && echo "$token" > /data/.mitmproxy_token
|
MAX_ATTEMPTS=30
|
||||||
;;
|
while [ $ATTEMPTS -lt $MAX_ATTEMPTS ]; do
|
||||||
esac
|
sleep 1
|
||||||
|
ATTEMPTS=$((ATTEMPTS + 1))
|
||||||
|
|
||||||
|
if [ -f /tmp/mitmweb.log ]; then
|
||||||
|
# Extract token from log - mitmweb outputs: "Web server listening at http://x.x.x.x:8081/?token=XXXXX"
|
||||||
|
# Token can be alphanumeric, not just hex
|
||||||
|
TOKEN=$(grep -o 'token=[a-zA-Z0-9_-]*' /tmp/mitmweb.log 2>/dev/null | head -1 | cut -d= -f2)
|
||||||
|
if [ -n "$TOKEN" ]; then
|
||||||
|
echo "$TOKEN" > /data/.mitmproxy_token
|
||||||
|
echo "Token captured: $(echo "$TOKEN" | cut -c1-8)..."
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ ! -f /data/.mitmproxy_token ]; then
|
||||||
|
echo "Warning: Could not capture authentication token after ${MAX_ATTEMPTS}s"
|
||||||
|
echo "Check /tmp/mitmweb.log for details"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Wait for mitmweb process to keep container running
|
||||||
|
wait $MITMWEB_PID
|
||||||
START
|
START
|
||||||
chmod +x "$rootfs/opt/start-mitmproxy.sh"
|
chmod +x "$rootfs/opt/start-mitmproxy.sh"
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user