Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
vulnerability-in-Remix-React-Router-CVE-2025-31137- — CTF चुनौती जो Remix/React Router Express में CVE-2025-31137 की प्रतिकृति बनाती है। प्रशासक फ़्लैग खोजने के लिए सर्वर-साइड भेद्यता का शोषण करना सीखें। | Kitploit
उपकरण/GitHubGitHub/pouriam23/vulnerability-in-remix-react-router-cve-2025-31137-
भेद्यता विश्लेषणशोषणवेब एप्लिकेशन शोषणवेब सुरक्षाCTFलर्निंग और शिक्षा
GitHubpouriam23/vulnerability-in-remix-react-router-cve-2025-31137-

vulnerability-in-Remix-React-Router-CVE-2025-31137-

CTF चुनौती जो Remix/React Router Express में CVE-2025-31137 की प्रतिकृति बनाती है। प्रशासक फ़्लैग खोजने के लिए सर्वर-साइड भेद्यता का शोषण करना सीखें।

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें
रिपॉजिटरी देखें
11 साल पहलेअभी तक समीक्षित नहीं

अवलोकन

@zhero___ के व्यक्तिगत ब्लॉगपोस्ट में उनके राइटअप को पढ़ने के बाद मैंने इस CTF को बनाने का निर्णय लिया ताकि यह जान सकूं कि चीजें कैसे काम करती हैं, और उसके बाद मैंने इसे उन सभी के साथ साझा करने का फैसला किया जो इस कमजोरी का शोषण करना सीखना चाहते हैं। मैंने [email protected] संस्करण के साथ CTF बनाने की कोशिश की, लेकिन जब मैंने @remix-run/express की जांच की, तो मैंने देखा कि उन्होंने कोड को पैच कर दिया है, और मैंने उनके GitHub से कमजोर कोड को कॉपी-पेस्ट किया, इसलिए आपको @remix-run/express पैकेज के कोड को नीचे बताए अनुसार बदलना होगा।

लक्ष्य

आपको व्यवस्थापक पृष्ठ में झंडा ढूंढना होगा, और एप्लिकेशन के अन्य भाग कार्यात्मक नहीं हैं, इसलिए केवल व्यवस्थापक पृष्ठ पर ध्यान केंद्रित करें और झंडा ढूंढें। साथ ही, मैं यह अद्भुत राइटअप "https://zhero-web-sec.github.io/research-and-things/react-router-and-the-remixed-path" पढ़ने की सलाह देता हूं जानने के लिए कि शोधकर्ता ने यह बग कैसे पाया, और आप कोड भी पढ़ सकते हैं और पता लगा सकते हैं कि चीजें कैसे काम करती हैं।

आरंभ करना

प्रोजेक्ट को सेट अप करने के लिए इन चरणों का पालन करें:

1. रिपॉजिटरी को क्लोन करें

root@kitploit:~
git clone https://github.com/pouriam23/vulnerability-in-Remix-React-Router-CVE-2025-31137-.git
cd vulnerability-in-Remix-React-Router-CVE-2025-31137-

2. निर्भरताएं स्थापित करें

सुनिश्चित करें कि आपके पास pnpm स्थापित है, फिर चलाएं:

root@kitploit:~
pnpm install

3. Remix Express Server कोड को कमजोर संस्करण में बदलें (जब zhero ने बग पाया था)

निम्नलिखित फ़ाइल की सामग्री को बदलें:

root@kitploit:~
/my-remix-app/node_modules/@remix-run/express/dist/server.js

नीचे दिए गए कोड से, और फ़ाइल का नाम बदलकर:

root@kitploit:~
server.ts

📄 server.ts

root@kitploit:~
// IDK why this is needed when it's in the tsconfig..........
// YAY PROJECT REFERENCES!
/// <reference lib="DOM.Iterable" />

import type * as express from "express";
import type { AppLoadContext, ServerBuild } from "@remix-run/node";
import {
  createRequestHandler as createRemixRequestHandler,
  createReadableStreamFromReadable,
  writeReadableStreamToWritable,
} from "@remix-run/node";

/**
 * A function that returns the value to use as `context` in route `loader` and
 * `action` functions.
 *
 * You can think of this as an escape hatch that allows you to pass
 * environment/platform-specific values through to your loader/action, such as
 * values that are generated by Express middleware like `req.session`.
 */
export type GetLoadContextFunction = (
  req: express.Request,
  res: express.Response
) => Promise<AppLoadContext> | AppLoadContext;

export type RequestHandler = (
  req: express.Request,
  res: express.Response,
  next: express.NextFunction
) => Promise<void>;

/**
 * Returns a request handler for Express that serves the response using Remix.
 */
export function createRequestHandler({
  build,
  getLoadContext,
  mode = process.env.NODE_ENV,
}: {
  build: ServerBuild | (() => Promise<ServerBuild>);
  getLoadContext?: GetLoadContextFunction;
  mode?: string;
}): RequestHandler {
  let handleRequest = createRemixRequestHandler(build, mode);

  return async (
    req: express.Request,
    res: express.Response,
    next: express.NextFunction
  ) => {
    try {
      let request = createRemixRequest(req, res);
      let loadContext = await getLoadContext?.(req, res);

      let response = await handleRequest(request, loadContext);

      await sendRemixResponse(res, response);
    } catch (error: unknown) {
      next(error);
    }
  };
}

export function createRemixHeaders(
  requestHeaders: express.Request["headers"]
): Headers {
  let headers = new Headers();

  for (let [key, values] of Object.entries(requestHeaders)) {
    if (values) {
      if (Array.isArray(values)) {
        for (let value of values) {
          headers.append(key, value);
        }
      } else {
        headers.set(key, values);
      }
    }
  }

  return headers;
}

export function createRemixRequest(
  req: express.Request,
  res: express.Response
): Request {
  let [, hostnamePort] = req.get("X-Forwarded-Host")?.split(":") ?? [];
  let [, hostPort] = req.get("host")?.split(":") ?? [];
  let port = hostnamePort || hostPort;
  let resolvedHost = `${req.hostname}${port ? `:${port}` : ""}`;
  let url = new URL(`${req.protocol}://${resolvedHost}${req.originalUrl}`);

  let controller: AbortController | null = new AbortController();
  let init: RequestInit = {
    method: req.method,
    headers: createRemixHeaders(req.headers),
    signal: controller.signal,
  };

  if (req.method !== "GET" && req.method !== "HEAD") {
    init.body = createReadableStreamFromReadable(req);
    (init as { duplex: "half" }).duplex = "half";
  }

  res.on("finish", () => (controller = null));
  res.on("close", () => controller?.abort());

  return new Request(url.href, init);
}

export async function sendRemixResponse(
  res: express.Response,
  nodeResponse: Response
): Promise<void> {
  res.statusMessage = nodeResponse.statusText;
  res.status(nodeResponse.status);

  for (let [key, value] of nodeResponse.headers.entries()) {
    res.append(key, value);
  }

  if (nodeResponse.headers.get("Content-Type")?.match(/text\/event-stream/i)) {
    res.flushHeaders();
  }

  if (nodeResponse.body) {
    await writeReadableStreamToWritable(nodeResponse.body, res);
  } else {
    res.end();
  }
}
टूल डाउनलोड करें