mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-21 22:50:42 +08:00
fix: rm landing page
This commit is contained in:
@@ -1,3 +1,2 @@
|
||||
VITE_APP_API_URL=http://127.0.0.1:8080
|
||||
VITE_APP_BASE_PATH=/
|
||||
VITE_APP_LANDING=false
|
||||
VITE_APP_BASE_PATH=/
|
||||
+1
-2
@@ -1,3 +1,2 @@
|
||||
VITE_APP_API_URL=
|
||||
VITE_APP_BASE_PATH=/
|
||||
VITE_APP_LANDING=true
|
||||
VITE_APP_BASE_PATH=/
|
||||
Binary file not shown.
+1
-1
@@ -31,7 +31,7 @@
|
||||
"dependencies": {
|
||||
"@hookform/resolvers": "^5.2.1",
|
||||
"@tailwindcss/vite": "^4.1.11",
|
||||
"@tanstack/react-query": "^5.84.2",
|
||||
"@tanstack/react-query": "^5.85.0",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"framer-motion": "^12.23.12",
|
||||
|
||||
@@ -4,7 +4,6 @@ const EnvSchema = yup.object({
|
||||
API_URL: yup.string().optional(),
|
||||
BASE_PATH: yup.string().optional(),
|
||||
MODE: yup.string().required(),
|
||||
LANDING: yup.boolean().required(),
|
||||
});
|
||||
|
||||
type EnvSchema = yup.InferType<typeof EnvSchema>;
|
||||
|
||||
@@ -1,296 +0,0 @@
|
||||
import {motion} from "framer-motion";
|
||||
import {
|
||||
CombineIcon,
|
||||
GithubIcon,
|
||||
MinimizeIcon,
|
||||
ServerIcon,
|
||||
ShellIcon,
|
||||
Shield,
|
||||
ShieldCheckIcon,
|
||||
TerminalIcon,
|
||||
ZapIcon,
|
||||
} from "lucide-react";
|
||||
import {NavLink} from "react-router-dom";
|
||||
import {LineShadowText} from "@/components/magicui/line-shadow-text";
|
||||
import {RainbowButton} from "@/components/magicui/rainbow-button";
|
||||
import {useTheme} from "@/components/theme-provider";
|
||||
import {Badge} from "@/components/ui/badge";
|
||||
import {Button} from "@/components/ui/button";
|
||||
import {Card, CardContent, CardDescription, CardHeader, CardTitle} from "@/components/ui/card";
|
||||
|
||||
export default function LandingPage() {
|
||||
const features = [
|
||||
{
|
||||
icon: <ShieldCheckIcon className="w-8 h-8 text-green-400" />,
|
||||
title: "Non-Intrusive",
|
||||
description:
|
||||
"Generated memshells don't interfere with normal middleware traffic, even with multiple shells injected.",
|
||||
},
|
||||
{
|
||||
icon: <ZapIcon className="w-8 h-8 text-yellow-400" />,
|
||||
title: "High Availability",
|
||||
description: "Comes with comprehensive CI integration tests, covering mainstream middleware for reliability.",
|
||||
},
|
||||
{
|
||||
icon: <MinimizeIcon className="w-8 h-8 text-blue-400" />,
|
||||
title: "Minimal Size",
|
||||
description: "The core code of the memshell is kept as concise as possible for efficient transfer and injection.",
|
||||
},
|
||||
{
|
||||
icon: <CombineIcon className="w-8 h-8 text-purple-400" />,
|
||||
title: "Strong Compatibility",
|
||||
description: "Covers common middleware and frameworks like Tomcat, WebLogic, and Spring.",
|
||||
},
|
||||
];
|
||||
|
||||
const supportedMiddleware = [
|
||||
"Tomcat",
|
||||
"Jetty",
|
||||
"GlassFish",
|
||||
"Payara",
|
||||
"Resin",
|
||||
"SpringWebMVC",
|
||||
"SpringWebFlux",
|
||||
"XXL-JOB",
|
||||
"JBossAS",
|
||||
"JBossEAP",
|
||||
"WildFly",
|
||||
"Undertow",
|
||||
"WebLogic",
|
||||
"WebSphere",
|
||||
"BES",
|
||||
"TongWeb",
|
||||
"InforSuite AS",
|
||||
"Apusic AS",
|
||||
"Primeton",
|
||||
];
|
||||
const supportedShells = [
|
||||
"Godzilla",
|
||||
"Behinder",
|
||||
"AntSword",
|
||||
"Suo5",
|
||||
"Neo-reGeorg",
|
||||
"Command Execution",
|
||||
"Custom Shell",
|
||||
];
|
||||
|
||||
const theme = useTheme();
|
||||
const shadowColor = theme.theme === "dark" ? "#ffffff" : "#000000";
|
||||
|
||||
return (
|
||||
<div className="min-h-screen font-sans bg-background text-foreground">
|
||||
<section className="relative text-center py-20 overflow-hidden">
|
||||
<div className="absolute top-0 left-0 w-full h-full bg-grid-black/[0.05] dark:bg-grid-white/[0.05] [mask-image:linear-gradient(to_bottom,white_10%,transparent_100%)]" />
|
||||
<div className="container mx-auto px-4 relative z-10">
|
||||
<motion.div initial={{ opacity: 0, y: -50 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.8 }}>
|
||||
<div className="inline-flex items-center px-4 py-2 rounded-full border sm:h-8 mb-8 transition-colors dark:bg-red-900/20 dark:border-red-800 dark:text-red-300 bg-red-50 border-red-200 text-red-700">
|
||||
<Shield className="w-4 h-4 mr-2" />
|
||||
<span className="text-sm">For Security Research & Authorized Testing Only</span>
|
||||
</div>
|
||||
<h1 className="text-5xl md:text-7xl font-bold mb-8">
|
||||
<span className="dark:text-white text-gray-900">
|
||||
MemShell
|
||||
<LineShadowText className="italic" shadowColor={shadowColor}>
|
||||
Party
|
||||
</LineShadowText>
|
||||
</span>
|
||||
</h1>
|
||||
<p className="text-xl md:text-2xl mb-12 max-w-4xl mx-auto leading-relaxed text-muted-foreground">
|
||||
A self-hosted, visual platform for one-click generation of Java memory shells for common middleware and
|
||||
frameworks. The ultimate learning platform for security researchers.
|
||||
</p>
|
||||
</motion.div>
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 50 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
transition={{ duration: 0.8, delay: 0.3 }}
|
||||
className="mt-8 flex justify-center gap-4 flex-wrap"
|
||||
>
|
||||
<NavLink to="/memshell">
|
||||
<Button size="lg">
|
||||
<TerminalIcon className="mr-2 h-5 w-5" />
|
||||
Get Started
|
||||
</Button>
|
||||
</NavLink>
|
||||
<a href="https://github.com/ReaJason/MemShellParty" target="_blank" rel="noopener noreferrer">
|
||||
<Button size="lg" variant="outline">
|
||||
<GithubIcon className="mr-2 h-5 w-5" />
|
||||
View on GitHub
|
||||
</Button>
|
||||
</a>
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="py-20 bg-secondary/30">
|
||||
<div className="container mx-auto px-4">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl md:text-4xl font-bold tracking-tight">Why Choose MemShellParty?</h2>
|
||||
<p className="mt-3 text-lg text-muted-foreground">Designed for modern offensive and defensive scenarios.</p>
|
||||
</div>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
|
||||
{features.map((feature, index) => (
|
||||
<motion.div
|
||||
key={feature.title}
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true, amount: 0.5 }}
|
||||
transition={{ delay: index * 0.1 }}
|
||||
>
|
||||
<Card className="h-full border-border/60 bg-card">
|
||||
<CardHeader className="flex flex-row items-center gap-4">
|
||||
{feature.icon}
|
||||
<CardTitle className="text-lg">{feature.title}</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<CardDescription>{feature.description}</CardDescription>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="py-20">
|
||||
<div className="container mx-auto px-4">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl md:text-4xl font-bold tracking-tight">Extensive Support Matrix</h2>
|
||||
<p className="mt-3 text-lg text-muted-foreground">
|
||||
Compatible with a wide range of industry-standard technologies.
|
||||
</p>
|
||||
</div>
|
||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12">
|
||||
<motion.div
|
||||
initial={{ opacity: 0, x: -20 }}
|
||||
whileInView={{ opacity: 1, x: 0 }}
|
||||
viewport={{ once: true, amount: 0.5 }}
|
||||
transition={{ duration: 0.5 }}
|
||||
>
|
||||
<Card className="h-full">
|
||||
<CardHeader>
|
||||
<CardTitle className="flex items-center gap-2">
|
||||
<ServerIcon className="w-6 h-6" />
|
||||
Supported Middleware
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="flex flex-wrap gap-2 mt-2">
|
||||
{supportedMiddleware.map((tech) => (
|
||||
<Badge key={tech} variant="secondary" className="text-base py-1 px-3">
|
||||
{tech}
|
||||
</Badge>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
</motion.div>
|
||||
<motion.div
|
||||
initial={{ opacity: 0, x: 20 }}
|
||||
whileInView={{ opacity: 1, x: 0 }}
|
||||
viewport={{ once: true, amount: 0.5 }}
|
||||
transition={{ duration: 0.5 }}
|
||||
>
|
||||
<Card className="h-full">
|
||||
<CardHeader>
|
||||
<CardTitle className="flex items-center gap-2">
|
||||
<ShellIcon className="w-6 h-6" />
|
||||
Supported Shell Tools
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent className="flex flex-wrap gap-2 mt-2">
|
||||
{supportedShells.map((shell) => (
|
||||
<Badge key={shell} variant="secondary" className="text-base py-1 px-3">
|
||||
{shell}
|
||||
</Badge>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
</motion.div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="py-20">
|
||||
<div className="container mx-auto px-4">
|
||||
<div className="text-center mb-16">
|
||||
<h2 className="text-3xl md:text-4xl font-bold tracking-tight">Get Your Shell in 3 Simple Steps</h2>
|
||||
<p className="mt-3 text-lg text-muted-foreground">A streamlined process from selection to generation.</p>
|
||||
</div>
|
||||
<div className="max-w-4xl mx-auto grid grid-cols-1 md:grid-cols-3 gap-8 text-center">
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true, amount: 0.5 }}
|
||||
transition={{ delay: 0.1 }}
|
||||
className="flex flex-col items-center"
|
||||
>
|
||||
<div className="flex items-center justify-center w-16 h-16 rounded-full bg-primary text-primary-foreground text-2xl font-bold mb-4">
|
||||
1
|
||||
</div>
|
||||
<h3 className="text-xl font-semibold mb-2">Select Middleware</h3>
|
||||
<p className="text-muted-foreground">Choose your target environment like Tomcat or Spring.</p>
|
||||
</motion.div>
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true, amount: 0.5 }}
|
||||
transition={{ delay: 0.2 }}
|
||||
className="flex flex-col items-center"
|
||||
>
|
||||
<div className="flex items-center justify-center w-16 h-16 rounded-full bg-primary text-primary-foreground text-2xl font-bold mb-4">
|
||||
2
|
||||
</div>
|
||||
<h3 className="text-xl font-semibold mb-2">Configure Shell</h3>
|
||||
<p className="text-muted-foreground">Pick a shell type and set parameters like passwords or keys.</p>
|
||||
</motion.div>
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true, amount: 0.5 }}
|
||||
transition={{ delay: 0.3 }}
|
||||
className="flex flex-col items-center"
|
||||
>
|
||||
<div className="flex items-center justify-center w-16 h-16 rounded-full bg-primary text-primary-foreground text-2xl font-bold mb-4">
|
||||
3
|
||||
</div>
|
||||
<h3 className="text-xl font-semibold mb-2">Generate Payload</h3>
|
||||
<p className="text-muted-foreground">Click generate to get the final payload for your operation.</p>
|
||||
</motion.div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* --- Final CTA Section --- */}
|
||||
<section className="py-20 text-center bg-secondary/30">
|
||||
<div className="container mx-auto px-4">
|
||||
<h2 className="text-3xl md:text-4xl font-bold tracking-tight">Ready to Join the Party?</h2>
|
||||
<p className="mt-4 text-lg text-muted-foreground max-w-xl mx-auto">
|
||||
Visit the GitHub repository to start your memshell exploration, or contribute to the project!
|
||||
</p>
|
||||
<div className="mt-8">
|
||||
<a href="https://github.com/ReaJason/MemShellParty" target="_blank" rel="noopener noreferrer">
|
||||
<RainbowButton size="lg">
|
||||
<GithubIcon className="mr-2 h-5 w-5" />
|
||||
Star & Fork on GitHub
|
||||
</RainbowButton>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* --- Footer --- */}
|
||||
<footer className="border-t py-8">
|
||||
<div className="container mx-auto px-4 flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between text-center sm:text-left">
|
||||
<div>
|
||||
<p className="text-sm font-semibold">MemShellParty</p>
|
||||
<p className="text-xs">
|
||||
Built with ❤️ by{" "}
|
||||
<a href="https://reajason.eu.org" rel="noreferrer noopener" target="_blank" className="font-medium">
|
||||
ReaJason
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
+1
-9
@@ -1,7 +1,6 @@
|
||||
import {createHashRouter} from "react-router-dom";
|
||||
import RootLayout from "@/components/layouts/root-layout";
|
||||
import {env} from "@/config";
|
||||
import LandingPage from "@/pages/landing";
|
||||
import MemShellPage from "@/pages/memshell";
|
||||
import ProbeShellPage from "@/pages/probeshell";
|
||||
import type {MemShellFormSchema} from "@/types/schema";
|
||||
@@ -42,13 +41,6 @@ const parseUrlParams = (searchParams: URLSearchParams): Partial<MemShellFormSche
|
||||
return result;
|
||||
};
|
||||
|
||||
function RootIndexPage() {
|
||||
if (env.LANDING) {
|
||||
return <LandingPage />;
|
||||
}
|
||||
return <MemShellPage />;
|
||||
}
|
||||
|
||||
export const router = createHashRouter(
|
||||
[
|
||||
{
|
||||
@@ -57,7 +49,7 @@ export const router = createHashRouter(
|
||||
children: [
|
||||
{
|
||||
index: true,
|
||||
element: <RootIndexPage />,
|
||||
element: <MemShellPage />,
|
||||
loader: ({ request }) => {
|
||||
const url = new URL(request.url);
|
||||
return parseUrlParams(url.searchParams);
|
||||
|
||||
Reference in New Issue
Block a user