vpn otp 폼 입력값 기반으로 제출

This commit is contained in:
2026-07-13 17:31:12 +09:00
parent 2c0b6e8123
commit 93b877e60a
+69 -2
View File
@@ -191,6 +191,71 @@ runs:
curl -k -sS --http1.1 -A "$UA" "$@"
}
build_otp_post_body() {
python3 - "$1" "$2" <<'PY'
from html.parser import HTMLParser
import sys
import urllib.parse
html_file, otp_code = sys.argv[1], sys.argv[2]
class FormParser(HTMLParser):
def __init__(self):
super().__init__()
self.forms = []
self.current = None
def handle_starttag(self, tag, attrs):
attrs = {k.lower(): (v if v is not None else "") for k, v in attrs}
if tag.lower() == "form":
self.current = {"attrs": attrs, "inputs": []}
self.forms.append(self.current)
elif tag.lower() == "input" and self.current is not None:
self.current["inputs"].append(attrs)
def handle_endtag(self, tag):
if tag.lower() == "form":
self.current = None
parser = FormParser()
with open(html_file, encoding="utf-8", errors="ignore") as f:
parser.feed(f.read())
form = None
for candidate in parser.forms:
names = {field.get("name", "") for field in candidate["inputs"]}
if "ga_code_attempt" in names:
form = candidate
break
if form is None:
raise SystemExit("OTP form not found")
data = []
seen = set()
for field in form["inputs"]:
name = field.get("name", "")
if not name:
continue
field_type = field.get("type", "text").lower()
if field_type in {"button", "image", "file"}:
continue
if field_type in {"checkbox", "radio"} and "checked" not in field:
continue
value = field.get("value", "")
if name == "ga_code_attempt":
value = otp_code
data.append((name, value))
seen.add(name)
if "ga_code_attempt" not in seen:
data.append(("ga_code_attempt", otp_code))
if "vhost" not in seen:
data.append(("vhost", "standard"))
print(urllib.parse.urlencode(data))
PY
}
debug_print_otps() {
echo "DEBUG OTP 확인용 코드 (unix-time=$(date +%s))"
for otp_offset in 0 -1 1; do
@@ -255,12 +320,14 @@ runs:
if [ "$DEBUG_OTP" = "true" ]; then
echo "DEBUG generated OTP offset=${otp_offset}: ${OTP_CODE} (unix-time=$(date +%s))"
fi
OTP_POST_BODY="$WORKDIR/03-otp-post-${otp_offset}.body"
build_otp_post_body "$WORKDIR/02-otp.html" "$OTP_CODE" > "$OTP_POST_BODY"
rm -f "$TOKEN_HEADERS" "$WORKDIR/04-token.body"
curl_common -L -b "$COOKIE_JAR" -c "$COOKIE_JAR" \
-X POST "$VPN_HOST/my.policy" \
--data-urlencode "ga_code_attempt=$OTP_CODE" \
--data-urlencode "vhost=standard" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-binary "@$OTP_POST_BODY" \
-o "$WORKDIR/03-webtop-${otp_offset}.html"
curl_common -b "$COOKIE_JAR" -c "$COOKIE_JAR" \