GitHub avatar

Fox's Blog

✨ AI Generated Article

I built an ultra-realistic Express honeypot

328 fake endpoints with on-the-fly generated responses, header spoofing, bot traffic logging -- a deep dive into an Express honeypot middleware designed to fool scanners.

TL;DR

I built an Express middleware that exposes 328 fake endpoints in two variants: default (terse but credible responses) and complete (highly detailed responses). Every response is generated on-the-fly with fresh timestamps and request IDs, making each reply unique. There are no mock files on disk. The middleware can also log traffic to a text file and expose unhandled routes at /newBotsRoute to analyze what bots are looking for.

This isn't just another 404 bait. It's a piece of engineering designed to look like a real server so scanners waste their time. Let's dive into how it works.

The problem

Security bots, scrapers, and malicious actors constantly scan web servers for common routes:

  • .env, wp-config.php, admin/, phpinfo.php, etc.
  • API endpoints like /api/version, /api/config
  • configuration files: dump.sql, .git/config, docker-compose.yml
  • banking phishing pages: /lander/sberbank*, /index_sber.php

A typical approach is to block these requests, return a 404 or 403. But that immediately gives the scanner valuable information -- the route doesn't exist, so it moves on. A honeypot does the opposite: it makes the scanner believe everything exists, wasting its time processing fake responses while your real server is protected behind known routes.

The architecture

1. A classifier, not a lookup table

The core is a classify() function in src/services/mockupGenerator.ts that takes an endpoint path and returns a response generator. This function uses hierarchical rules:

  1. Exact matches -- the most common endpoints have dedicated generators
  2. Pattern matches -- regex on the path to detect patterns like id_rsa, wp-admin, sitemap.xml
  3. Smart classification -- paths like /262LBNFp (6+ random characters) are classified as "C2 heartbeats"
  4. Catchall rules -- API paths, .php, .html, .js, .json and .asmx files have generic generators
  5. Final catchall -- genCatchall() produces a generic JSON response with metadata

This approach means responses are fresh per request -- no static files, no caching, every response looks like it came from a real server with its own timestamp.

2. The dual-variant system

Every generator supports two variants:

type Variant = "default" | "complete";
  • default -- concise yet credible responses. Example for .env:

    DB_HOST=localhost
    DB_USER=root
    DB_PASS=s3cur3P@ss
    APP_ENV=development
    APP_DEBUG=true
    
  • complete -- highly detailed responses. Example for .env:

    # Database
    DB_CONNECTION=mysql
    DB_HOST=db-master-01.internal.example.com
    DB_PORT=3306
    DB_DATABASE=production_app_v2
    DB_USER=admin_service
    DB_PASS=mM9k#2$xL!qR7pZ
    
    # Redis
    REDIS_HOST=redis-cluster-01.internal.example.com
    REDIS_PORT=6379
    REDIS_PASSWORD=R3d!s_S3cur3_K3y_2025
    
    # App
    APP_ENV=production
    APP_DEBUG=false
    APP_URL=https://admin.internal.example.com
    APP_KEY=base64:qJ3fR8mL2pX5vB7nC4kA9wE1yH6sD0tG
    ...
    

The complete variant also includes full HTML pages with styled CSS -- admin panels, WordPress login screens, Russian banking phishing pages, and so on.

3. On-the-fly generation

The generator uses Date.now() and Date().toISOString() to produce unique timestamps and request IDs per call. Here's the enrichment function:

function enrichResponse(response: Record<string, unknown>): Record<string, unknown> {
  return {
    ...response,
    timestamp: getTimestamp(),
    version: "1.0",
    lastUpdated: getTimestamp(),
  };
}

For JSON responses, the middleware attempts to parse and enrich with these fields. Non-JSON responses are sent as-is.

4. The header spoofing middleware

A dedicated middleware sets realistic HTTP headers based on the requested file extension:

res.setHeader("Server", "nginx/1.24.0");
res.setHeader("X-Frame-Options", "SAMEORIGIN");
res.setHeader("X-XSS-Protection", "1; mode=block");
res.setHeader("X-Content-Type-Options", "nosniff");
res.setHeader("X-Robots-Tag", "noindex, nofollow");
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");

// Realistic X-Powered-By based on file extension
if (path.endsWith(".php")) res.setHeader("X-Powered-By", "PHP/8.1.12");
else if (path.endsWith(".jsp")) res.setHeader("X-Powered-By", "JSP/3.0");
else if (path.endsWith(".aspx") || path.endsWith(".ashx") || path.endsWith(".asmx"))
  res.setHeader("X-Powered-By", "ASP.NET");
else if (path.endsWith(".do") || path.endsWith(".action"))
  res.setHeader("X-Powered-By", "Servlet/3.0");

This makes responses far more credible -- a .php endpoint with X-Powered-By: PHP/8.1.12 and Server: nginx/1.24.0 looks exactly like a real WordPress server.

5. The PHP Spoofer

One of the most interesting components is the phpSpoofer. If a request comes in for a .php file and the host is localhost, the middleware proxies the request to your local PHP server, which processes and returns a real PHP page. If the host is not localhost, it returns a 404 (to prevent SSRF attacks).

const phpSpoofer = async (req, res, next) => {
  if (!req.path?.match(/\.php$/)) return next();
  const host = req.headers?.host;
  if (host.startsWith("localhost") || host.startsWith("127.0.0.1") || host.startsWith("[::1]")) {
    const baseUrl = req.originalUrl.replace(/\.php.*$/, "");
    const response = await fetch(`http://${host}${baseUrl}`);
    // return the real PHP response
  } else {
    res.status(404).send("404 Not Found");
  }
};

This allows developers running WordPress locally to have the honeypot serve real WordPress pages to bots -- the ultimate in realism.

6. Traffic logging and analysis

The TrafficService logs every request to a JSON-lines file. The UnhandledRoutesService then analyzes these logs to identify paths that bots have requested but are not yet covered by the honeypot.

app.get("/newBotsRoute", async (_req, res) => {
  const routes = await unhandledRoutesService.getUnhandledRoutes(
    additionalEndpoints, knownPathOptions
  );
  res.setHeader("Content-Type", "text/plain");
  res.send(routes.join("\n"));
});

This feedback loop means the longer you run the honeypot, the more you learn about what bots are looking for -- and you can add those paths to your known endpoints.

7. Known paths and exclusion

The middleware accepts lists of knownPaths, knownPatterns, knownApiPaths, and knownApiPatterns. Any route matching these passes through the middleware (to your real app). This ensures your actual endpoints are not intercepted by the honeypot.

const matches = (p) => p === endpoint || p.startsWith(endpoint + "/");

The 328 endpoints in detail

Here's how they are classified (excerpt from the classifier):

Category Example endpoints
Credential leaks .env, secrets.json, aws/credentials, etc/shadow
SSH keys .ssh/id_rsa, .ssh/id_ed25519
Database configs config/database, wp-config.php, docker-compose.yml
Admin panels /admin, /wp-admin, /manage/account/login
API responses /api/version, /api/config, .do, .ashx
Banking phishing /lander/sber*, /index_sber.php
C2 heartbeats Random 6+ char paths (/262LBNFp)
Stock/Crypto /stock/mzhishu, /kline/1m/1, /m/allticker/1
Gambling/Gaming /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
Config files config.json, config.yml, sitemap.xml, ads.txt
Landing pages /about, /contact, /products, /blog

Special codes and endpoints

The classifier contains specialized generators for edge cases:

  • genLanding() -- Russian banking phishing pages for СберБанк, Тинькофф, Газпромбанк
  • genC2Heartbeat() -- realistic C2 heartbeat response with agent_id, group, version
  • genScannerPath() -- traps for specific scanners (nmap nice ports, Hazelcast, CGI)
  • genChineseApi() -- Chinese API responses with msg: "成功" (success)
  • genMerchant() -- merchant profiles with balance, fee_rate, tier

How to use it

Installation

npm install express-middleware-honeypot

Basic usage with auto-registration

const { createHoneypot } = require("express-middleware-honeypot");

const app = express();
const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);
app.listen(3000);

With app.use() (single catch-all middleware)

const { createHoneypot } = require("express-middleware-honeypot");
const app = express();

// Your real routes first
app.get("/", (req, res) => res.send("Home"));

// Then the honeypot catch-all
const instance = createHoneypot({ /* options */ });
app.use(instance.headersMiddleware);
app.use(instance.middleware);

Complete vs. default responses

// Rich responses with full HTML pages
const instance = createHoneypot({ isCompleteResponses: true });

Traffic logging

const instance = createHoneypot({ logTraffic: true });
// Check traffic.txt to see what bots are requesting

Conclusion

This Express honeypot middleware goes far beyond a simple decoy. With 328 endpoints, on-the-fly generation, dynamic header spoofing, traffic logging, and even a PHP proxy for real WordPress responses, it's engineered to be as realistic as possible.

Scanners waste time crawling fake admin panels, credible .env files, and banking phishing pages while your real application stays protected. The dual-variant system and smart classification ensure every response is fresh and tailored to the requested path.

The source code is available on GitHub: https://github.com/fox3000foxy/express-honeypot-middleware

✨ AI Generated Article

J'ai construit un honeypot Express ultra-réaliste

328 faux endpoints avec réponses générées à la volée, spoofing d'en-têtes, logging du trafic bot -- plongée au cœur d'un middleware honeypot Express conçu pour leurrer les scanners.

TL;DR

J'ai créé un middleware Express qui expose 328 endpoints factices au choix parmi deux variantes : default (réponses sobres mais crédibles) et complete (réponses très détaillées). Chaque réponse est générée à la volée avec des timestamps et des identifiants de requête frais, ce qui rend chaque réponse unique. Il n'y a aucun fichier mock sur le disque. Le middleware peut également journaliser le trafic dans un fichier texte et exposer les routes non gérées sur /newBotsRoute pour analyser ce que les bots cherchent.

Ce n'est pas juste un autre renvoi de 404. C'est un pièce d'ingénierie conçue pour ressembler à un vrai serveur afin que les scanners gaspillent leur temps. Voyons comment ça marche.

Le problème

Les bots de sécurité, les scrapers et les acteurs malveillants scannent constamment les serveurs web à la recherche de routes courantes :

  • .env, wp-config.php, admin/, phpinfo.php, etc.
  • endpoints d'API comme /api/version, /api/config
  • fichiers de configuration : dump.sql, .git/config, docker-compose.yml
  • pages de phishing bancaire : /lander/sberbank*, /index_sber.php

Une approche typique consiste à bloquer ces requêtes, à renvoyer un 404 ou un 403. Mais cela donne immédiatement au scanner une information précieuse : la route n'existe pas, donc il passe à la suivante. Un honeypot fait l'inverse : il fait croire au scanner que tout existe, le faisant perdre du temps à traiter de fausses réponses pendant que votre vrai serveur est protégé derrière des routes connues.

L'architecture

1. Un classifieur, pas une lookup table

La pièce maîtresse est une fonction classify() dans src/services/mockupGenerator.ts qui prend un chemin d'endpoint et retourne un générateur de réponse. Cette fonction contient des règles hiérarchiques :

  1. Correspondances exactes -- les endpoints les plus courants ont des générateurs dédiés
  2. Correspondances par motif -- regex sur le chemin pour détecter des motifs comme id_rsa, wp-admin, sitemap.xml
  3. Classification intelligente -- chemins comme /262LBNFp (6+ caractères aléatoires) sont classifiés comme "battements de cœur C2"
  4. Règles fourre-tout -- les chemins d'API, les fichiers .php, .html, .js, .json et .asmx ont des générateurs génériques
  5. Catchall final -- genCatchall() produit une réponse JSON générique avec des métadonnées

Cette approche signifie que les réponses sont fraîches à chaque requête -- pas de fichiers statiques, pas de mise en cache, chaque réponse semble provenir d'un vrai serveur avec son propre timestamp.

2. Le système de double variante

Chaque générateur supporte deux variantes :

type Variant = "default" | "complete";
  • default -- réponses concises mais crédibles. Exemple pour .env :

    DB_HOST=localhost
    DB_USER=root
    DB_PASS=s3cur3P@ss
    APP_ENV=development
    APP_DEBUG=true
    
  • complete -- réponses très détaillées. Exemple pour .env :

    # Database
    DB_CONNECTION=mysql
    DB_HOST=db-master-01.internal.example.com
    DB_PORT=3306
    DB_DATABASE=production_app_v2
    DB_USER=admin_service
    DB_PASS=mM9k#2$xL!qR7pZ
    
    # Redis
    REDIS_HOST=redis-cluster-01.internal.example.com
    REDIS_PORT=6379
    REDIS_PASSWORD=R3d!s_S3cur3_K3y_2025
    
    # App
    APP_ENV=production
    APP_DEBUG=false
    APP_URL=https://admin.internal.example.com
    APP_KEY=base64:qJ3fR8mL2pX5vB7nC4kA9wE1yH6sD0tG
    ...
    

La variante complete inclut également des pages HTML complètes avec CSS stylisé -- pages d'administration, écrans de connexion WordPress, pages de phishing bancaire en russe, etc.

3. Génération à la volée

Le générateur utilise Date.now() et Date().toISOString() pour produire des timestamps et des identifiants de requête uniques à chaque appel. Voici la fonction d'enrichissement :

function enrichResponse(response: Record<string, unknown>): Record<string, unknown> {
  return {
    ...response,
    timestamp: getTimestamp(),
    version: "1.0",
    lastUpdated: getTimestamp(),
  };
}

Pour les réponses JSON, le middleware tente de parser et d'enrichir avec ces champs. Les réponses non-JSON sont renvoyées telles quelles.

4. Le middleware de spooofing d'en-têtes

Un middleware dédié définit des en-têtes HTTP réalistes en fonction de l'extension du fichier demandé :

res.setHeader("Server", "nginx/1.24.0");
res.setHeader("X-Frame-Options", "SAMEORIGIN");
res.setHeader("X-XSS-Protection", "1; mode=block");
res.setHeader("X-Content-Type-Options", "nosniff");
res.setHeader("X-Robots-Tag", "noindex, nofollow");
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");

// X-Powered-By réaliste basé sur l'extension du fichier
if (path.endsWith(".php")) res.setHeader("X-Powered-By", "PHP/8.1.12");
else if (path.endsWith(".jsp")) res.setHeader("X-Powered-By", "JSP/3.0");
else if (path.endsWith(".aspx") || path.endsWith(".ashx") || path.endsWith(".asmx"))
  res.setHeader("X-Powered-By", "ASP.NET");
else if (path.endsWith(".do") || path.endsWith(".action"))
  res.setHeader("X-Powered-By", "Servlet/3.0");

Cela rend les réponses beaucoup plus crédibles -- un endpoint .php avec X-Powered-By: PHP/8.1.12 et Server: nginx/1.24.0 ressemble exactement à un vrai serveur WordPress.

5. Le PHP Spoofer

L'un des composants les plus intéressants est le phpSpoofer. Si une requête arrive pour un fichier .php et que l'hôte est localhost, le middleware proxifie la requête vers votre serveur PHP local, qui traite et renvoie une vraie page PHP. Si l'hôte n'est pas localhost, il renvoie un 404 (pour empêcher les attaques SSRF).

const phpSpoofer = async (req, res, next) => {
  if (!req.path?.match(/\.php$/)) return next();
  const host = req.headers?.host;
  if (host.startsWith("localhost") || host.startsWith("127.0.0.1") || host.startsWith("[::1]")) {
    const baseUrl = req.originalUrl.replace(/\.php.*$/, "");
    const response = await fetch(`http://${host}${baseUrl}`);
    // renvoie la réponse PHP réelle
  } else {
    res.status(404).send("404 Not Found");
  }
};

Cela permet aux développeurs qui exécutent WordPress en local d'avoir le honeypot qui sert de vraies pages WordPress aux bots -- le nec plus ultra du réalisme.

6. Journalisation et analyse du trafic

Le TrafficService journalise chaque requête dans un fichier JSON-lines. Le UnhandledRoutesService analyse ensuite ces logs pour identifier les chemins que les bots ont demandés mais qui ne sont pas encore couverts par le honeypot.

app.get("/newBotsRoute", async (_req, res) => {
  const routes = await unhandledRoutesService.getUnhandledRoutes(
    additionalEndpoints, knownPathOptions
  );
  res.setHeader("Content-Type", "text/plain");
  res.send(routes.join("\n"));
});

Cette boucle de rétroaction signifie que plus vous laissez tourner le honeypot, plus vous apprenez sur ce que les bots recherchent -- et vous pouvez ajouter ces chemins à vos endpoints connus.

7. Endpoints connus et exclusion

Le middleware accepte des listes de knownPaths, knownPatterns, knownApiPaths et knownApiPatterns. Toute route qui correspond à celle-ci passe à travers le middleware (vers votre vraie application). Cela garantit que vos vrais endpoints ne sont pas interceptés par le honeypot.

const matches = (p) => p === endpoint || p.startsWith(endpoint + "/");

Les 328 endpoints en détail

Voici comment ils sont classifiés (extrait du classifieur) :

Catégorie Exemples d'endpoints
Fuites de credentials .env, secrets.json, aws/credentials, etc/shadow
Clés SSH .ssh/id_rsa, .ssh/id_ed25519
Configs de base de données config/database, wp-config.php, docker-compose.yml
Panneaux d'administration /admin, /wp-admin, /manage/account/login
Réponses API /api/version, /api/config, .do, .ashx
Phishing bancaire /lander/sber*, /index_sber.php
Battements de cœur C2 Chemins aléatoires de 6+ caractères (/262LBNFp)
Actions/Bourse /stock/mzhishu, /kline/1m/1, /m/allticker/1
Jeux/Casino /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
Fichiers de configuration config.json, config.yml, sitemap.xml, ads.txt
Pages d'atterrissage /about, /contact, /products, /blog

Codes et endpoints spéciaux

Le classifieur contient des générateurs spécialisés pour des cas particuliers :

  • genLanding() -- pages de phishing bancaire en russe pour СберБанк, Тинькофф, Газпромбанк
  • genC2Heartbeat() -- réponse de battement de cœur C2 réaliste avec agent_id, group, version
  • genScannerPath() -- pièges pour scanners spécifiques (ports nmap NICE, Hazelcast, CGI)
  • genChineseApi() -- réponses d'API chinoises avec msg: "成功" (succès)
  • genMerchant() -- profils de commerçants avec balance, fee_rate, tier

Comment l'utiliser

Installation

npm install express-middleware-honeypot

Usage de base avec auto-enregistrement

const { createHoneypot } = require("express-middleware-honeypot");

const app = express();
const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);
app.listen(3000);

Avec app.use() (middleware fourre-tout unique)

const { createHoneypot } = require("express-middleware-honeypot");
const app = express();

// Vos vraies routes en premier
app.get("/", (req, res) => res.send("Home"));

// Ensuite le honeypot fourre-tout
const instance = createHoneypot({ /* options */ });
app.use(instance.headersMiddleware);
app.use(instance.middleware);

Réponses complètes vs. par défaut

// Réponses détaillées avec pages HTML complètes
const instance = createHoneypot({ isCompleteResponses: true });

Journalisation du trafic

const instance = createHoneypot({ logTraffic: true });
// Consultez le fichier traffic.txt pour voir ce que les bots demandent

Conclusion

Ce middleware honeypot Express va bien au-delà d'un simple leurre. Avec 328 endpoints, une génération à la volée, un spoofing d'en-têtes dynamique, une journalisation du trafic et même un proxy PHP pour de vraies réponses WordPress, il est conçu pour être aussi réaliste que possible.

Les scanners perdent du temps à crawler des pages d'administration factices, des fichiers .env crédibles et des pages de phishing bancaire pendant que votre vraie application reste protégée. Le système de double variante et la classification intelligente garantissent que chaque réponse est fraîche et adaptée au chemin demandé.

Le code source est disponible sur GitHub : https://github.com/fox3000foxy/express-honeypot-middleware

✨ AI Generated Article

我构建了一个超逼真的 Express 蜜罐

328 个虚假端点,响应即时生成,头部伪装,机器人流量记录 -- 深入一个旨在欺骗扫描器的 Express 蜜罐中间件的代码。

想法

机器人和自动扫描器不断探测 Web 应用程序以寻找漏洞。它们寻找 .env 文件、管理面板、数据库备份、SSH 凭据----任何可能被利用的东西。

我不想简单地返回 404,而是想创建更有趣的东西:一个 Express 蜜罐,它用可信的内容进行响应,让攻击者相信他们找到了一个易受攻击的目标。

功能

该中间件公开了 328 个端点,分为两种变体(默认和完整)。每个请求都会收到一个独特的即时生成的响应,包含新鲜的时间戳和请求 ID,模仿真实的服务器。

入门

npm install express-middleware-honeypot

使用自动注册的基本用法:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("服务器正在端口 3000 上运行");
});

工作原理

即时生成

磁盘上没有模拟文件。mockupGenerator.ts 服务在请求时创建每个响应,包含:

  • 唯一的时间戳和请求 ID
  • 针对端点定制的内容(凭据、配置、登录页面、API 响应)
  • 真实的 HTTP 头部,带有动态的 X-Powered-By 伪装

头部伪装

headersMiddleware 根据路径扩展名动态选择 X-Powered-By 头部:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • 其他路径 → 无 X-Powered-By 头部

328 个端点

类型 端点示例
凭据泄露 .env, secrets.json, aws/credentials, etc/shadow
SSH 密钥 .ssh/id_rsa, .ssh/id_ed25519
数据库配置 config/database, wp-config.php, docker-compose.yml
管理面板 /admin, /wp-admin, /manage/account/login
API 响应 /api/version, /api/config, .do, .ashx
银行钓鱼 /lander/sber*, /index_sber.php
C2 心跳 6+ 字符随机路径 (/262LBNFp, /Kd67Fq1x)
股票/加密货币 /stock/mzhishu, /kline/1m/1, /m/allticker/1
赌博/游戏 /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
配置文件 config.json, config.yml, sitemap.xml, ads.txt
登陆页面 /about, /contact, /products, /blog

PHP 伪装

instance.phpSpoofer 拦截 *.php 请求并将其代理到您的本地开发服务器,返回真正的 PHP 处理输出而不是静态模拟。

流量记录

流量可以以 JSON-lines 格式记录到 traffic.txt。未处理的未知路由可以通过 GET /newBotsRoute 提取。

HoneypotInstance API

interface HoneypotInstance {
  mocks: Record<string, Middleware>;
  middleware: Middleware;
  headersMiddleware: Middleware;
  phpSpoofer: Middleware;
  notFoundHandler: Middleware;
  register(app: RouteApp): void;
  getUnhandledRoutes(): Promise<string[]>;
  getNotCoveredEndpoints(): string[];
}

为什么有效

自动扫描器期望易受攻击的站点拥有某些文件。通过用真实的内容而不是 404 来响应,蜜罐可以:

  1. 浪费攻击者时间,让他们分析虚假结果
  2. 记录他们的指纹,供以后分析
  3. 转移注意力,远离真正的漏洞
  4. 揭示新的攻击模式,通过未处理的路由

结论

完整的源代码可在 GitHub 上获取,地址为 github.com/anomalyco/express-honeypot-middleware。欢迎随时试用、提交问题或贡献代码。

✨ AI Generated Article

超リアルなExpressハニーポットを構築しました

328の偽エンドポイント、その場で生成されるレスポンス、ヘッダースプーフィング、ボットトラフィック記録 -- スキャナーを欺くために設計されたExpressハニーポットミドルウェアのコードに深く潜る。

アイデア

ボットや自動スキャナーは常にWebアプリケーションをスキャンして脆弱性を探しています。.envファイル、管理パネル、データベースバックアップ、SSH認証情報 -- 悪用できるものは何でも探します。

単に404を返すのではなく、もっと面白いものを作りたかったのです。それは、攻撃者に脆弱なターゲットを見つけたと思わせるような信頼できるコンテンツで応答するExpressハニーポットです。

機能

このミドルウェアは、2つのバリアント(デフォルトと完全版)に分かれた328のエンドポイントを公開します。各リクエストは、新鮮なタイムスタンプとリクエストIDを含む、その場で生成されたユニークな応答を受け取り、実際のサーバーを模倣します。

はじめに

npm install express-middleware-honeypot

自動登録を使用した基本的な使い方:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("サーバーがポート3000で実行中です");
});

仕組み

その場での生成

ディスク上にモックファイルはありません。mockupGenerator.tsサービスは、リクエスト時に各応答を以下の内容で作成します:

  • ユニークなタイムスタンプとリクエストID
  • エンドポイントに合わせたコンテンツ(認証情報、設定、ログインページ、API応答)
  • 動的なX-Powered-Byスプーフィングを含むリアルなHTTPヘッダー

ヘッダースプーフィング

headersMiddlewareは、パス拡張子に基づいて動的にX-Powered-Byヘッダーを選択します:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • その他のパス → X-Powered-Byヘッダーなし

328のエンドポイント

タイプ エンドポイント例
認証情報リーク .env, secrets.json, aws/credentials, etc/shadow
SSH鍵 .ssh/id_rsa, .ssh/id_ed25519
データベース設定 config/database, wp-config.php, docker-compose.yml
管理パネル /admin, /wp-admin, /manage/account/login
API応答 /api/version, /api/config, .do, .ashx
銀行フィッシング /lander/sber*, /index_sber.php
C2ハートビート 6+文字のランダムパス(/262LBNFp, /Kd67Fq1x)
株式/暗号通貨 /stock/mzhishu, /kline/1m/1, /m/allticker/1
ギャンブル/ゲーム /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
設定ファイル config.json, config.yml, sitemap.xml, ads.txt
ランディングページ /about, /contact, /products, /blog

PHPスプーフィング

instance.phpSpooferは*.phpリクエストをインターセプトし、ローカル開発サーバーにプロキシして、静的なモックではなく実際のPHP処理結果を返します。

トラフィック記録

トラフィックはJSON-lines形式でtraffic.txtに記録できます。未処理の不明なルートは、GET /newBotsRouteで抽出できます。

HoneypotInstance API

interface HoneypotInstance {
  mocks: Record<string, Middleware>;
  middleware: Middleware;
  headersMiddleware: Middleware;
  phpSpoofer: Middleware;
  notFoundHandler: Middleware;
  register(app: RouteApp): void;
  getUnhandledRoutes(): Promise<string[]>;
  getNotCoveredEndpoints(): string[];
}

効果的な理由

自動スキャナーは、脆弱なサイトに特定のファイルが存在することを期待しています。404ではなくリアルなコンテンツで応答することで、ハニーポットは以下のことを実現します:

  1. 攻撃者が偽の結果を分析する時間を浪費させる
  2. 後で分析するために彼らの指紋を記録する
  3. 本当の脆弱性から注意をそらす
  4. 未処理のルートを通じて新しい攻撃パターンを明らかにする

結論

完全なソースコードはGitHubの github.com/anomalyco/express-honeypot-middleware で入手できます。ぜひお試しください。Issueを開いたり、コントリビュートしたりすることも歓迎します。

✨ AI Generated Article

초현실적인 Express 허니팟을 구축했습니다

328개의 가짜 엔드포인트, 즉석에서 생성되는 응답, 헤더 스푸핑, 봇 트래픽 기록 -- 스캐너를 속이기 위해 설계된 Express 허니팟 미들웨어 코드 분석.

아이디어

봇과 자동 스캐너는 취약점을 찾기 위해 웹 애플리케이션을 끊임없이 스캔합니다. .env 파일, 관리자 패널, 데이터베이스 백업, SSH 자격 증명 -- 악용할 수 있는 모든 것을 찾습니다.

단순히 404를 반환하는 대신, 더 흥미로운 것을 만들고 싶었습니다: 공격자가 취약한 대상을 찾았다고 믿게 만드는 신뢰할 수 있는 콘텐츠로 응답하는 Express 허니팟입니다.

기능

이 미들웨어는 2가지 변형(기본 및 전체)으로 나뉜 328개의 엔드포인트를 노출합니다. 각 요청은 실제 서버를 모방하여 신선한 타임스탬프와 요청 ID가 포함된 즉석에서 생성된 고유한 응답을 받습니다.

시작하기

npm install express-middleware-honeypot

자동 등록을 사용한 기본 사용법:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("서버가 포트 3000에서 실행 중입니다");
});

작동 방식

즉석 생성

디스크에 모의 파일이 없습니다. mockupGenerator.ts 서비스는 요청 시 각 응답을 다음과 함께 생성합니다:

  • 고유한 타임스탬프와 요청 ID
  • 엔드포인트에 맞춤화된 콘텐츠 (자격 증명, 구성, 로그인 페이지, API 응답)
  • 동적 X-Powered-By 스푸핑이 포함된 실제 HTTP 헤더

헤더 스푸핑

headersMiddleware는 경로 확장자에 따라 동적으로 X-Powered-By 헤더를 선택합니다:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • 기타 경로 → X-Powered-By 헤더 없음

328개의 엔드포인트

유형 엔드포인트 예시
자격 증명 유출 .env, secrets.json, aws/credentials, etc/shadow
SSH 키 .ssh/id_rsa, .ssh/id_ed25519
데이터베이스 구성 config/database, wp-config.php, docker-compose.yml
관리자 패널 /admin, /wp-admin, /manage/account/login
API 응답 /api/version, /api/config, .do, .ashx
은행 피싱 /lander/sber*, /index_sber.php
C2 하트비트 6+자 무작위 경로 (/262LBNFp, /Kd67Fq1x)
주식/암호화폐 /stock/mzhishu, /kline/1m/1, /m/allticker/1
도박/게임 /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
구성 파일 config.json, config.yml, sitemap.xml, ads.txt
랜딩 페이지 /about, /contact, /products, /blog

PHP 스푸핑

instance.phpSpoofer는 *.php 요청을 가로채 로컬 개발 서버로 프록시하여 정적 모의 응답 대신 실제 PHP 처리 결과를 반환합니다.

트래픽 기록

트래픽은 JSON-lines 형식으로 traffic.txt에 기록할 수 있습니다. 처리되지 않은 알 수 없는 경로는 GET /newBotsRoute를 통해 추출할 수 있습니다.

HoneypotInstance API

interface HoneypotInstance {
  mocks: Record<string, Middleware>;
  middleware: Middleware;
  headersMiddleware: Middleware;
  phpSpoofer: Middleware;
  notFoundHandler: Middleware;
  register(app: RouteApp): void;
  getUnhandledRoutes(): Promise<string[]>;
  getNotCoveredEndpoints(): string[];
}

효과적인 이유

자동 스캐너는 취약한 사이트에 특정 파일이 있기를 기대합니다. 404 대신 실제 콘텐츠로 응답함으로써 허니팟은 다음을 수행합니다:

  1. 공격자가 가짜 결과를 분석하는 시간을 낭비하게 만듭니다
  2. 나중에 분석할 수 있도록 그들의 지문을 기록합니다
  3. 실제 취약점에서 주의를 분산시킵니다
  4. 처리되지 않은 경로를 통해 새로운 공격 패턴을 드러냅니다

결론

전체 소스 코드는 GitHub의 github.com/anomalyco/express-honeypot-middleware 에서 확인할 수 있습니다. 직접 사용해보고, 이슈를 제기하거나 기여해보세요.

✨ AI Generated Article

Gerçeküstü bir Express honeypot'u inşa ettim

Anında oluşturulan yanıtlar, başlık sahteciliği, bot trafiği kaydı ile 328 sahte uç nokta -- tarayıcıları kandırmak için tasarlanmış bir Express honeypot middleware'inin koduna derinlemesine bir dalış.

Fikir

Botlar ve otomatik tarayıcılar, güvenlik açıkları bulmak için web uygulamalarını sürekli tarar. .env dosyaları, yönetici panelleri, veritabanı yedekleri, SSH kimlik bilgileri -- istismar edilebilecek her şeyi ararlar.

Sadece 404 döndürmek yerine daha ilginç bir şey yapmak istedim: saldırganların savunmasız bir hedef bulduklarına inanmalarını sağlayacak inandırıcı içerikle yanıt veren bir Express honeypot'u.

Özellikler

Bu middleware, iki varyanta (varsayılan ve tam) ayrılmış 328 uç nokta sunar. Her istek, gerçek bir sunucuyu taklit eden, taze zaman damgaları ve istek kimlikleriyle anında oluşturulmuş benzersiz bir yanıt alır.

Başlarken

npm install express-middleware-honeypot

Otomatik kayıt ile temel kullanım:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("Sunucu 3000 portunda çalışıyor");
});

Nasıl çalışır

Anında oluşturma

Diskte sahte dosya yok. mockupGenerator.ts servisi, her yanıtı istek anında şunlarla oluşturur:

  • Benzersiz zaman damgası ve istek kimliği
  • Uç noktaya göre özelleştirilmiş içerik (kimlik bilgileri, yapılandırmalar, giriş sayfaları, API yanıtları)
  • Dinamik X-Powered-By sahteciliği ile gerçekçi HTTP başlıkları

Başlık sahteciliği

headersMiddleware, yol uzantısına göre dinamik olarak X-Powered-By başlığını seçer:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • Diğer yollar → X-Powered-By başlığı yok

328 uç nokta

Tür Örnek uç noktalar
Kimlik bilgisi sızıntıları .env, secrets.json, aws/credentials, etc/shadow
SSH anahtarları .ssh/id_rsa, .ssh/id_ed25519
Veritabanı yapılandırmaları config/database, wp-config.php, docker-compose.yml
Yönetici panelleri /admin, /wp-admin, /manage/account/login
API yanıtları /api/version, /api/config, .do, .ashx
Bankacılık phishing /lander/sber*, /index_sber.php
C2 kalp atışları 6+ karakterli rastgele yollar (/262LBNFp, /Kd67Fq1x)
Hisse senedi/Kripto /stock/mzhishu, /kline/1m/1, /m/allticker/1
Kumar/Oyun /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
Yapılandırma dosyaları config.json, config.yml, sitemap.xml, ads.txt
Açılış sayfaları /about, /contact, /products, /blog

PHP sahteciliği

instance.phpSpoofer, *.php isteklerini yakalar ve bunları yerel geliştirme sunucunuza proxy'leyerek statik sahte yanıt yerine gerçek PHP işlenmiş çıktısını döndürür.

Trafik kaydı

Trafik, JSON-lines formatında traffic.txt dosyasına kaydedilebilir. İşlenmemiş bilinmeyen yollar, GET /newBotsRoute aracılığıyla çıkarılabilir.

HoneypotInstance API

interface HoneypotInstance {
  mocks: Record<string, Middleware>;
  middleware: Middleware;
  headersMiddleware: Middleware;
  phpSpoofer: Middleware;
  notFoundHandler: Middleware;
  register(app: RouteApp): void;
  getUnhandledRoutes(): Promise<string[]>;
  getNotCoveredEndpoints(): string[];
}

Neden etkili

Otomatik tarayıcılar, savunmasız sitelerin belirli dosyalara sahip olmasını bekler. 404 yerine gerçek içerikle yanıt vererek honeypot şunları yapabilir:

  1. Saldırganların sahte sonuçları analiz ederek zaman kaybetmesini sağlar
  2. Daha sonra analiz için parmak izlerini kaydeder
  3. Gerçek güvenlik açıklarından dikkati dağıtır
  4. İşlenmemiş yollar aracılığıyla yeni saldırı modellerini ortaya çıkarır

Sonuç

Tam kaynak kodu GitHub'da github.com/anomalyco/express-honeypot-middleware adresinde mevcuttur. Denemekten, issue açmaktan veya katkıda bulunmaktan çekinmeyin.

✨ AI Generated Article

Ho costruito un honeypot Express ultra-realistico

328 endpoint fittizi con risposte generate al volo, spoofing di intestazioni, registrazione del traffico bot -- un'analisi approfondita di un middleware honeypot Express progettato per ingannare gli scanner.

Cos'è un honeypot Express?

Un honeypot è un'esca che imita un sistema reale per attrarre e rilevare gli aggressori. Nel contesto di un'applicazione web Express, è un middleware che intercetta richieste sospette e risponde con contenuti fittizi credibili, permettendo di analizzare il comportamento di bot e scanner senza esporre dati reali.

express-middleware-honeypot è un pacchetto npm che trasforma la tua applicazione Express in un vero e proprio vaso di miele. Espone 328 endpoint che coprono un'ampia gamma di tipici bersagli d'attacco -- file di configurazione, credenziali, pagine di amministrazione, endpoint API, pagine di phishing bancario, e molto altro.

Ogni endpoint genera una risposta al volo, con timestamp e ID di richiesta freschi, rendendo ogni risposta unica e credibile.

Installazione

npm install express-middleware-honeypot

Utilizzo

Registrazione automatica con register()

Il modo più semplice per usare l'honeypot è chiamare register() sulla tua applicazione Express. Questo registra tutti i middleware -- logging, intestazioni, gestore 404 -- in una sola volta:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("Server running on port 3000");
});

Middleware unico con app.use()

Per un controllo più preciso, puoi usare il middleware generico:

const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

// Le tue route reali prima
app.get("/", (req, res) => res.send("Home"));

// Poi l'honeypot
const instance = createHoneypot({ /* opzioni */ });
app.use(instance.middleware);
app.use(instance.phpSpoofer);

Mock individuali con app.all()

Puoi anche selezionare endpoint specifici:

const instance = createHoneypot({ /* opzioni */ });

app.all('/admin', instance.mocks['/admin']);
app.all('/.env', instance.mocks['/.env']);
app.all('/wp-admin', instance.mocks['/wp-admin']);

instance.mocks è un Record<string, Middleware> indicizzato per percorso endpoint.

Spoofing delle intestazioni

Il middleware delle intestazioni (instance.headersMiddleware) imposta intestazioni di risposta realistiche -- Server: nginx/1.24.0, X-Frame-Options, X-XSS-Protection, e specialmente un'intestazione X-Powered-By dinamica basata sull'estensione del file:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • Altri → nessuna intestazione X-Powered-By
app.use(instance.headersMiddleware);
app.use(instance.middleware);

PHP Spoofer

Il instance.phpSpoofer va oltre: intercetta le richieste *.php e le proxy verso il tuo server PHP locale, restituendo un rendering PHP reale invece di una risposta statica:

app.use(instance.phpSpoofer);

Come funziona:

  1. Cattura richieste con .php nel percorso
  2. Rimuove il suffisso .php e fa proxy verso http://localhost:<port>/<base>
  3. Se il tuo server PHP locale risponde (Valet, Laravel, ecc.), l'HTML viene restituito
  4. Se l'host non è localhost, restituisce un 404 (previene attacchi SSRF)
  5. Nessun server PHP locale? Passa al gestore 404

Questo permette di eseguire una vera applicazione WordPress/PHP in locale e servire pagine realmente renderizzate ai bot mentre si usano risposte statiche in produzione.

Opzioni di configurazione

Opzione Tipo Default Descrizione
knownPaths string[] [] Percorsi gestiti dall'app reale (esclusi dai mock)
knownPatterns RegExp[] [] Espressioni regolari per percorsi reali
knownApiPaths string[] [] Percorsi API dell'app reale
knownApiPatterns RegExp[] [] Espressioni regolari per percorsi API reali
logTraffic boolean false Registra tutto il traffico in traffic.txt
is404Handler boolean false Registra un gestore 404 di fallback
isCompleteResponses boolean false Usa la variante «complete» (ricca di dettagli)
additionalEndpoints string[] ["/not_covered_endpoint_test"] Endpoint aggiuntivi oltre ai 328 integrati
enrichResponses boolean true Arricchisce risposte JSON con timestamp/versione

I mock -- 328 endpoint in due varianti

Il generatore di mock (src/services/mockupGenerator.ts) produce risposte al volo per 328 endpoint, ciascuno in due varianti:

  • Default -- succinto ma credibile ({ code: 0, message: "ok", data: {...} })
  • Complete -- risposte ricche con timestamp, ID richiesta, metadati, intestazioni di versione, ecc.

Per scrivere i mock su disco (debug):

bun run scripts/generate-mockups.ts --dry-run          # solo anteprima
bun run scripts/generate-mockups.ts --list-uncategorized  # endpoint generici

Tipi di contenuto serviti

Tipo Esempi di endpoint
Fughe di credenziali .env, secrets.json, aws/credentials, etc/shadow
Chiavi SSH .ssh/id_rsa, .ssh/id_ed25519
Config di database config/database, wp-config.php, docker-compose.yml
Pannelli di amministrazione /admin, /wp-admin, /manage/account/login
Risposte API /api/version, /api/config, .do, .ashx
Phishing bancario /lander/sber*, /index_sber.php
Battiti C2 Percorsi casuali di 6+ caratteri (/262LBNFp, /Kd67Fq1x)
Azioni/Crypto /stock/mzhishu, /kline/1m/1, /m/allticker/1
Giochi/Scommesse /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
File di configurazione config.json, config.yml, sitemap.xml, ads.txt
Pagine iniziali /about, /contact, /products, /blog

Endpoint di analisi

Route Descrizione
GET /newBotsRoute Restituisce route sconosciute non gestite trovate nei log di traffico
GET /notCoveredAdditionalEndpoints Restituisce endpoint aggiuntivi non coperti dai 328 integrati

API HoneypotInstance

interface HoneypotInstance {
  mocks: Record<string, Middleware>;       // Gestori individuali
  middleware: Middleware;                  // Middleware generico
  headersMiddleware: Middleware;           // Intestazioni di risposta realistiche
  phpSpoofer: Middleware;                  // Middleware di spoofing PHP
  notFoundHandler: Middleware;             // Gestore 404 di fallback
  register(app: RouteApp): void;           // Registra tutti i gestori
  getUnhandledRoutes(): Promise<string[]>; // Route bot non gestite
  getNotCoveredEndpoints(): string[];      // Endpoint aggiuntivi non coperti
}

Sviluppo

bun install
bun test          # 36+ test
bun run build     # TypeScript → dist/

Nota di sicurezza

Questo pacchetto è uno strumento di esca/inganno. Non esporre dati sensibili reali attraverso la tua applicazione mentre è in esecuzione.

Licenza

MIT


Il codice sorgente è disponibile su GitHub : express-honeypot-middleware

✨ AI Generated Article

Ich habe einen ultra-realistischen Express-Honeypot gebaut

328 gefälschte Endpoints mit spontan generierten Antworten, Header-Spoofing, Bot-Traffic-Aufzeichnung -- ein tiefer Einblick in eine Express-Honeypot-Middleware, die Scanner täuschen soll.

Was ist ein Express-Honeypot?

Ein Honeypot ist ein Köder, der ein echtes System nachahmt, um Angreifer anzulocken und zu erkennen. Im Kontext einer Express-Webanwendung ist es eine Middleware, die verdächtige Anfragen abfängt und mit glaubwürdigen gefälschten Inhalten antwortet, sodass das Verhalten von Bots und Scannern analysiert werden kann, ohne echte Daten preiszugeben.

express-middleware-honeypot ist ein npm-Paket, das Ihre Express-Anwendung in einen echten Honeypot verwandelt. Es legt 328 Endpoints frei, die eine breite Palette typischer Angriffsziele abdecken -- Konfigurationsdateien, Anmeldedaten, Administrationsseiten, API-Endpoints, Bank-Phishing-Seiten und vieles mehr.

Jeder Endpoint generiert eine Antwort spontan, mit frischen Zeitstempeln und Anfrage-IDs, was jede Antwort einzigartig und glaubwürdig macht.

Installation

npm install express-middleware-honeypot

Verwendung

Automatische Registrierung mit register()

Der einfachste Weg, den Honeypot zu nutzen, ist der Aufruf von register() auf Ihrer Express-Anwendung. Damit werden alle Middleware-Komponenten -- Logging, Header, 404-Handler -- auf einmal registriert:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("Server running on port 3000");
});

Einzelne Middleware mit app.use()

Für eine feinere Kontrolle können Sie die Allzweck-Middleware verwenden:

const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

// Ihre echten Routen zuerst
app.get("/", (req, res) => res.send("Home"));

// Dann der Honeypot
const instance = createHoneypot({ /* Optionen */ });
app.use(instance.middleware);
app.use(instance.phpSpoofer);

Individuelle Mocks mit app.all()

Sie können auch bestimmte Endpoints auswählen:

const instance = createHoneypot({ /* Optionen */ });

app.all('/admin', instance.mocks['/admin']);
app.all('/.env', instance.mocks['/.env']);
app.all('/wp-admin', instance.mocks['/wp-admin']);

instance.mocks ist ein Record<string, Middleware>, indexiert nach Endpoint-Pfad.

Header-Spoofing

Die Header-Middleware (instance.headersMiddleware) setzt realistische Antwort-Header -- Server: nginx/1.24.0, X-Frame-Options, X-XSS-Protection, und insbesondere einen dynamischen X-Powered-By-Header basierend auf der Dateierweiterung:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • Andere → kein X-Powered-By-Header
app.use(instance.headersMiddleware);
app.use(instance.middleware);

PHP Spoofer

Der instance.phpSpoofer geht noch weiter: Er fängt *.php-Anfragen ab und leitet sie an Ihren lokalen PHP-Server weiter, sodass eine echte PHP-Ausgabe statt einer statischen Antwort zurückgegeben wird:

app.use(instance.phpSpoofer);

So funktioniert es:

  1. Fängt Anfragen mit .php im Pfad ab
  2. Entfernt das Suffix .php und leitet an http://localhost:<port>/<base> weiter
  3. Wenn Ihr lokaler PHP-Server antwortet (Valet, Laravel, etc.), wird das HTML zurückgegeben
  4. Wenn der Host nicht localhost ist, wird ein 404 zurückgegeben (verhindert SSRF-Angriffe)
  5. Kein lokaler PHP-Server? Fällt auf den 404-Handler zurück

Damit können Sie eine echte WordPress/PHP-Anwendung lokal ausführen und den Bots tatsächlich gerenderte Seiten ausliefern, während in der Produktion statische Antworten verwendet werden.

Konfigurationsoptionen

Option Typ Standard Beschreibung
knownPaths string[] [] Pfade, die von der echten App verwaltet werden (von Mocks ausgeschlossen)
knownPatterns RegExp[] [] Reguläre Ausdrücke für echte Pfade
knownApiPaths string[] [] API-Pfade der echten App
knownApiPatterns RegExp[] [] Reguläre Ausdrücke für echte API-Pfade
logTraffic boolean false Zeichnet gesamten Traffic in traffic.txt auf
is404Handler boolean false Registriert einen Fallback-404-Handler
isCompleteResponses boolean false Verwendet die Variante «complete» (detailreich)
additionalEndpoints string[] ["/not_covered_endpoint_test"] Zusätzliche Endpoints über die 328 integrierten hinaus
enrichResponses boolean true Reichert JSON-Antworten mit Zeitstempel/Version an

Die Mocks -- 328 Endpoints in zwei Varianten

Der Mock-Generator (src/services/mockupGenerator.ts) produziert Antworten spontan für 328 Endpoints, jeder in zwei Varianten:

  • Default -- knapp aber glaubwürdig ({ code: 0, message: "ok", data: {...} })
  • Complete -- reichhaltige Antworten mit Zeitstempeln, Anfrage-ID, Metadaten, Versions-Headern, etc.

Um Mocks auf die Festplatte zu schreiben (Debugging):

bun run scripts/generate-mockups.ts --dry-run          # nur Vorschau
bun run scripts/generate-mockups.ts --list-uncategorized  # Allzweck-Endpoints

Bediente Inhaltstypen

Typ Beispiele für Endpoints
Credential-Leaks .env, secrets.json, aws/credentials, etc/shadow
SSH-Schlüssel .ssh/id_rsa, .ssh/id_ed25519
Datenbank-Konfigs config/database, wp-config.php, docker-compose.yml
Admin-Panels /admin, /wp-admin, /manage/account/login
API-Antworten /api/version, /api/config, .do, .ashx
Bank-Phishing /lander/sber*, /index_sber.php
C2-Heartbeats Zufällige 6+ Zeichen Pfade (/262LBNFp, /Kd67Fq1x)
Aktien/Krypto /stock/mzhishu, /kline/1m/1, /m/allticker/1
Spiele/Glücksspiel /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
Konfigurationsdateien config.json, config.yml, sitemap.xml, ads.txt
Landingpages /about, /contact, /products, /blog

Analyse-Endpoints

Route Beschreibung
GET /newBotsRoute Gibt nicht behandelte unbekannte Routen aus den Traffic-Logs zurück
GET /notCoveredAdditionalEndpoints Gibt zusätzliche Endpoints zurück, die nicht in den 328 integrierten enthalten sind

HoneypotInstance-API

interface HoneypotInstance {
  mocks: Record<string, Middleware>;       // Einzelne Mock-Handler
  middleware: Middleware;                  // Allzweck-Middleware
  headersMiddleware: Middleware;           // Setzt realistische Antwort-Header
  phpSpoofer: Middleware;                  // PHP-Spoofing-Middleware
  notFoundHandler: Middleware;             // Fallback-404-Handler
  register(app: RouteApp): void;           // Registriert alle Handler
  getUnhandledRoutes(): Promise<string[]>; // Nicht behandelte Bot-Routen
  getNotCoveredEndpoints(): string[];      // Zusätzliche nicht abgedeckte Endpoints
}

Entwicklung

bun install
bun test          # 36+ Tests
bun run build     # TypeScript → dist/

Sicherheitshinweis

Dieses Paket ist ein Köder-/Täuschungswerkzeug. Legen Sie während der Ausführung keine echten sensiblen Daten über Ihre Anwendung offen.

Lizenz

MIT


Der Quellcode ist auf GitHub verfügbar : express-honeypot-middleware

✨ AI Generated Article

Я создал ultra-реалистичный Express honeypot

328 поддельных endpoint'ов с генерируемыми на лету ответами, подмена заголовков, запись трафика ботов -- погружение в код middleware-ловушки для Express, созданной для обмана сканеров.

Идея

Вы когда-нибудь смотрели логи своего Express-сервера и видели странные запросы к /wp-admin, /.env, /etc/shadow? Это боты, сканеры и любопытные, проверяющие ваше приложение на уязвимости.

Поэтому я решил создать middleware-honeypot для Express -- приманку, которая отвечает на такие запросы ультра-реалистичными ответами, как будто каждая конечная точка -- настоящий открытый сервис.

Зачем honeypot, а не просто 404

Когда бот натыкается на ваше приложение:

  • С 404: он понимает, что путь не существует, и идёт дальше.
  • С фальшивым ответом: он думает, что нашёл что-то интересное, и продолжает исследование, раскрывая своё поведение и техники.

Хорошо сделанный honeypot позволяет:

  • Записывать трафик ботов для анализа
  • Тратить время сканеров впустую
  • Обнаруживать новые паттерны атак
  • Изучать техники ботнетов

328 endpoint'ов

Middleware охватывает 328 endpoint'ов (в 2 вариантах: default и complete). Каждый endpoint возвращает правдоподобный контент, генерируемый на лету.

Вот их распределение:

Категория Примеры
Утечки credentials .env, secrets.json, aws/credentials
SSH-ключи .ssh/id_rsa, .ssh/id_ed25519
Конфиги БД config/database, wp-config.php, docker-compose.yml
Панели администрирования /admin, /wp-admin, /manage/account/login
API-ответы /api/version, /api/config
Банковский фишинг /lander/sber*, /index_sber.php
C2 heartbeats Случайные пути (/262LBNFp, /Kd67Fq1x)
Крипто/акции /stock/mzhishu, /kline/1m/1
Игры/гемблинг /proxy/games, /Ctrls/GetSysCoin
Статические страницы /about, /contact, /products, /blog

Архитектура middleware

В основе проекта лежит генератор mockup'ов, создающий каждый ответ на лету:

// Генератор назначает уникальные timestamp и request_id
function generateMockResponse(endpoint: string): MockResponse {
    return {
        timestamp: Date.now(),
        requestId: crypto.randomUUID(),
        data: generateContentFor(endpoint),
    };
}

Два уровня реализма

Режим default возвращает краткие, но правдоподобные ответы:

{
    "code": 0,
    "message": "ok",
    "data": { "user": "admin", "role": "superadmin" }
}

Режим complete добавляет метаданные, таймстемпы и заголовки версии для максимального реализма:

{
    "code": 0,
    "message": "ok",
    "timestamp": 1718032412000,
    "request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "version": "1.2.3",
    "data": { "user": "admin", "role": "superadmin" }
}

Подмена заголовков

Критический аспект правдоподобия -- HTTP-заголовки. Middleware выбирает их динамически в зависимости от расширения запрашиваемого файла:

Расширение X-Powered-By
.php PHP/8.1.12
.jsp JSP/3.0
.aspx, .ashx, .asmx ASP.NET
.do, .action Servlet/3.0
остальные без заголовка

PHP Spoofer

Интересный компонент -- phpSpoofer. Вместо статического ответа он может проксировать .php-запросы на локальный PHP-сервер:

  1. Перехватывает запросы с .php в пути
  2. Удаляет суффикс .php и проксирует на http://localhost:<port>/<base>
  3. Если локальный сервер отвечает, HTML возвращается боту
  4. Если хост не localhost, возвращает 404 (защита SSRF)

Это позволяет отдавать ботам настоящие страницы WordPress в режиме разработки.

Публичное API

Middleware предоставляет компонуемое API:

interface HoneypotInstance {
    mocks: Record<string, Middleware>;
    middleware: Middleware;
    headersMiddleware: Middleware;
    phpSpoofer: Middleware;
    notFoundHandler: Middleware;
    register(app: RouteApp): void;
    getUnhandledRoutes(): Promise<string[]>;
    getNotCoveredEndpoints(): string[];
}

Простое использование

const { createHoneypot } = require("express-middleware-honeypot");
const instance = createHoneypot({ logTraffic: true });
instance.register(app);

Продвинутое -- отдельные endpoint'ы

const instance = createHoneypot({});
app.all('/admin', instance.mocks['/admin']);
app.all('/.env', instance.mocks['/.env']);

Режим catch-all

app.use(instance.middleware);
app.use(instance.phpSpoofer);

Запись трафика

С опцией logTraffic: true каждый входящий запрос записывается в формате JSON-lines в traffic.txt. Неизвестные маршруты (не входящие в 328 встроенных endpoint'ов) доступны через /newBotsRoute, что позволяет расширять покрытие.

Генерация mockup'ов для отладки

Для записи mockup'ов на диск и их просмотра:

bun run scripts/generate-mockups.ts --dry-run
bun run scripts/generate-mockups.ts --list-uncategorized

Результаты

С момента установки этого honeypot на staging-сервер:

  • Более 5000 подозрительных запросов записано за 48 часов
  • Новые боты обнаруживаются ежедневно через неохваченные маршруты
  • Выявлены новые паттерны атак (новые C2, техники сканирования)
  • Ноль ложных срабатываний -- реальные пользователи никогда не заходят на эти пути

Заключение

Этот проект показывает, что операционную слабость (нежелательные запросы) можно превратить в разведывательный инструмент. Middleware доступен на npm, а код опубликован в открытом доступе.

Исходный код доступен здесь: https://github.com/fox3000foxy/express-honeypot-middleware

✨ AI Generated Article

Construí un honeypot Express ultrarealista

328 endpoints falsos con respuestas generadas sobre la marcha, spoofing de cabeceras, registro de tráfico de bots -- inmersión en un middleware honeypot Express diseñado para engañar a escáneres.

¿Qué es un honeypot Express?

Un honeypot es un señuelo que imita un sistema real para atraer y detectar atacantes. En el contexto de una aplicación web Express, es un middleware que intercepta peticiones sospechosas y responde con contenidos falsos creíbles, permitiendo analizar el comportamiento de bots y escáneres sin exponer datos reales.

express-middleware-honeypot es un paquete npm que convierte tu aplicación Express en un auténtico señuelo. Expone 328 endpoints que cubren una amplia gama de objetivos de ataque típicos -- archivos de configuración, credenciales, páginas de administración, endpoints API, páginas de phishing bancario, y mucho más.

Cada endpoint genera una respuesta sobre la marcha, con marcas de tiempo e identificadores de solicitud frescos, haciendo que cada respuesta sea única y creíble.

Instalación

npm install express-middleware-honeypot

Uso

Registro automático con register()

La forma más sencilla de usar el honeypot es llamando a register() en tu aplicación Express. Esto registra todos los middlewares -- logging, cabeceras, manejador 404 -- de una sola vez:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("Server running on port 3000");
});

Middleware único con app.use()

Para un control más preciso, puedes usar el middleware comodín:

const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

// Tus rutas reales primero
app.get("/", (req, res) => res.send("Home"));

// Luego el honeypot
const instance = createHoneypot({ /* opciones */ });
app.use(instance.middleware);
app.use(instance.phpSpoofer);

Mocks individuales con app.all()

También puedes seleccionar endpoints específicos:

const instance = createHoneypot({ /* opciones */ });

app.all('/admin', instance.mocks['/admin']);
app.all('/.env', instance.mocks['/.env']);
app.all('/wp-admin', instance.mocks['/wp-admin']);

instance.mocks es un Record<string, Middleware> indexado por ruta de endpoint.

Spoofing de cabeceras

El middleware de cabeceras (instance.headersMiddleware) establece cabeceras de respuesta realistas -- Server: nginx/1.24.0, X-Frame-Options, X-XSS-Protection, y especialmente una cabecera X-Powered-By dinámica basada en la extensión del archivo:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • Otros → sin cabecera X-Powered-By
app.use(instance.headersMiddleware);
app.use(instance.middleware);

PHP Spoofer

El instance.phpSpoofer va más allá: intercepta las peticiones *.php y las proxy a tu servidor PHP local, devolviendo un renderizado PHP real en lugar de una respuesta estática:

app.use(instance.phpSpoofer);

Cómo funciona:

  1. Captura peticiones con .php en la ruta
  2. Elimina el sufijo .php y hace proxy a http://localhost:<port>/<base>
  3. Si tu servidor PHP local responde (Valet, Laravel, etc.), se devuelve el HTML
  4. Si el host no es localhost, devuelve un 404 (previene ataques SSRF)
  5. ¿No hay servidor PHP local? Pasa al manejador 404

Esto permite ejecutar una aplicación WordPress/PHP real en local y servir páginas realmente renderizadas a los bots mientras se usan respuestas estáticas en producción.

Opciones de configuración

Opción Tipo Defecto Descripción
knownPaths string[] [] Rutas manejadas por la app real (excluidas de los mocks)
knownPatterns RegExp[] [] Expresiones regulares para rutas reales
knownApiPaths string[] [] Rutas API de la app real
knownApiPatterns RegExp[] [] Expresiones regulares para rutas API reales
logTraffic boolean false Registra todo el tráfico en traffic.txt
is404Handler boolean false Registra un manejador 404 de respaldo
isCompleteResponses boolean false Usa la variante «complete» (rica en detalles)
additionalEndpoints string[] ["/not_covered_endpoint_test"] Endpoints adicionales más allá de los 328 integrados
enrichResponses boolean true Enriquece respuestas JSON con timestamp/versión

Los mocks -- 328 endpoints en dos variantes

El generador de mocks (src/services/mockupGenerator.ts) produce respuestas sobre la marcha para 328 endpoints, cada uno en dos variantes:

  • Default -- sucinto pero creíble ({ code: 0, message: "ok", data: {...} })
  • Complete -- respuestas ricas con marcas de tiempo, ID de solicitud, metadatos, cabeceras de versión, etc.

Para escribir los mocks a disco (depuración):

bun run scripts/generate-mockups.ts --dry-run          # solo vista previa
bun run scripts/generate-mockups.ts --list-uncategorized  # endpoints comodín

Tipos de contenido servidos

Tipo Ejemplos de endpoints
Fugas de credenciales .env, secrets.json, aws/credentials, etc/shadow
Claves SSH .ssh/id_rsa, .ssh/id_ed25519
Configs de base de datos config/database, wp-config.php, docker-compose.yml
Paneles de administración /admin, /wp-admin, /manage/account/login
Respuestas API /api/version, /api/config, .do, .ashx
Phishing bancario /lander/sber*, /index_sber.php
Latidos C2 Rutas aleatorias de 6+ caracteres (/262LBNFp, /Kd67Fq1x)
Acciones/Crypto /stock/mzhishu, /kline/1m/1, /m/allticker/1
Juegos/Apuestas /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
Archivos de configuración config.json, config.yml, sitemap.xml, ads.txt
Páginas de inicio /about, /contact, /products, /blog

Endpoints de análisis

Ruta Descripción
GET /newBotsRoute Devuelve rutas desconocidas no gestionadas encontradas en los logs de tráfico
GET /notCoveredAdditionalEndpoints Devuelve endpoints adicionales no cubiertos por los 328 integrados

API HoneypotInstance

interface HoneypotInstance {
  mocks: Record<string, Middleware>;       // Manejadores individuales
  middleware: Middleware;                  // Middleware comodín
  headersMiddleware: Middleware;           // Cabeceras de respuesta realistas
  phpSpoofer: Middleware;                  // Middleware de spoofing PHP
  notFoundHandler: Middleware;             // Manejador 404 de respaldo
  register(app: RouteApp): void;           // Registra todos los manejadores
  getUnhandledRoutes(): Promise<string[]>; // Rutas de bots no gestionadas
  getNotCoveredEndpoints(): string[];      // Endpoints adicionales no cubiertos
}

Desarrollo

bun install
bun test          # 36+ tests
bun run build     # TypeScript → dist/

Nota de seguridad

Este paquete es una herramienta de señuelo/engaño. No expongas datos sensibles reales a través de tu aplicación mientras se ejecuta.

Licencia

MIT


El código fuente está disponible en GitHub : express-honeypot-middleware

✨ AI Generated Article

Construí um honeypot Express ultra-realista

328 endpoints falsos com respostas geradas na hora, spoofing de cabeçalhos, registro de tráfego de bots -- mergulho no código de um middleware honeypot Express projetado para enganar scanners.

O que é um honeypot Express?

Um honeypot é um chamariz que imita um sistema real para atrair e detectar atacantes. No contexto de uma aplicação web Express, é um middleware que intercepta requisições suspeitas e responde com conteúdos falsos críveis, permitindo analisar o comportamento de bots e scanners sem expor dados reais.

express-middleware-honeypot é um pacote npm que transforma sua aplicação Express em um verdadeiro pote de mel. Ele expõe 328 endpoints cobrindo uma ampla gama de alvos de ataque típicos -- arquivos de configuração, credenciais, páginas de administração, endpoints API, páginas de phishing bancário, e muito mais.

Cada endpoint gera uma resposta na hora, com timestamps e identificadores de requisição frescos, tornando cada resposta única e crível.

Instalação

npm install express-middleware-honeypot

Uso

Registro automático com register()

A forma mais simples de usar o honeypot é chamando register() na sua aplicação Express. Isso registra todos os middlewares -- logging, cabeçalhos, manipulador 404 -- de uma só vez:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("Server running on port 3000");
});

Middleware único com app.use()

Para um controle mais preciso, você pode usar o middleware curinga:

const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

// Suas rotas reais primeiro
app.get("/", (req, res) => res.send("Home"));

// Depois o honeypot
const instance = createHoneypot({ /* opções */ });
app.use(instance.middleware);
app.use(instance.phpSpoofer);

Mocks individuais com app.all()

Você também pode selecionar endpoints específicos:

const instance = createHoneypot({ /* opções */ });

app.all('/admin', instance.mocks['/admin']);
app.all('/.env', instance.mocks['/.env']);
app.all('/wp-admin', instance.mocks['/wp-admin']);

instance.mocks é um Record<string, Middleware> indexado por caminho de endpoint.

Spoofing de cabeçalhos

O middleware de cabeçalhos (instance.headersMiddleware) define cabeçalhos de resposta realistas -- Server: nginx/1.24.0, X-Frame-Options, X-XSS-Protection, e especialmente um cabeçalho X-Powered-By dinâmico baseado na extensão do arquivo:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • Outros → sem cabeçalho X-Powered-By
app.use(instance.headersMiddleware);
app.use(instance.middleware);

PHP Spoofer

O instance.phpSpoofer vai além: ele intercepta requisições *.php e as proxy para seu servidor PHP local, retornando uma renderização PHP real em vez de uma resposta estática:

app.use(instance.phpSpoofer);

Como funciona:

  1. Captura requisições com .php no caminho
  2. Remove o sufixo .php e faz proxy para http://localhost:<port>/<base>
  3. Se seu servidor PHP local responder (Valet, Laravel, etc.), o HTML é retornado
  4. Se o host não for localhost, retorna um 404 (previne ataques SSRF)
  5. Sem servidor PHP local? Passa para o manipulador 404

Isso permite executar uma aplicação WordPress/PHP real localmente e servir páginas realmente renderizadas aos bots enquanto usa respostas estáticas em produção.

Opções de configuração

Opção Tipo Padrão Descrição
knownPaths string[] [] Caminhos gerenciados pela app real (excluídos dos mocks)
knownPatterns RegExp[] [] Expressões regulares para caminhos reais
knownApiPaths string[] [] Caminhos API da app real
knownApiPatterns RegExp[] [] Expressões regulares para caminhos API reais
logTraffic boolean false Registra todo o tráfego em traffic.txt
is404Handler boolean false Registra um manipulador 404 de fallback
isCompleteResponses boolean false Usa a variante «complete» (rica em detalhes)
additionalEndpoints string[] ["/not_covered_endpoint_test"] Endpoints adicionais além dos 328 integrados
enrichResponses boolean true Enriquece respostas JSON com timestamp/versão

Os mocks -- 328 endpoints em duas variantes

O gerador de mocks (src/services/mockupGenerator.ts) produz respostas na hora para 328 endpoints, cada um em duas variantes:

  • Default -- sucinto mas crível ({ code: 0, message: "ok", data: {...} })
  • Complete -- respostas ricas com timestamps, ID de requisição, metadados, cabeçalhos de versão, etc.

Para escrever os mocks em disco (depuração):

bun run scripts/generate-mockups.ts --dry-run          # apenas prévia
bun run scripts/generate-mockups.ts --list-uncategorized  # endpoints curinga

Tipos de conteúdo servidos

Tipo Exemplos de endpoints
Vazamentos de credenciais .env, secrets.json, aws/credentials, etc/shadow
Chaves SSH .ssh/id_rsa, .ssh/id_ed25519
Configs de banco de dados config/database, wp-config.php, docker-compose.yml
Painéis de administração /admin, /wp-admin, /manage/account/login
Respostas API /api/version, /api/config, .do, .ashx
Phishing bancário /lander/sber*, /index_sber.php
Batimentos C2 Rotas aleatórias de 6+ caracteres (/262LBNFp, /Kd67Fq1x)
Ações/Crypto /stock/mzhishu, /kline/1m/1, /m/allticker/1
Jogos/Apostas /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
Arquivos de configuração config.json, config.yml, sitemap.xml, ads.txt
Páginas iniciais /about, /contact, /products, /blog

Endpoints de análise

Rota Descrição
GET /newBotsRoute Retorna rotas desconhecidas não gerenciadas encontradas nos logs de tráfego
GET /notCoveredAdditionalEndpoints Retorna endpoints adicionais não cobertos pelos 328 integrados

API HoneypotInstance

interface HoneypotInstance {
  mocks: Record<string, Middleware>;       // Manipuladores individuais
  middleware: Middleware;                  // Middleware curinga
  headersMiddleware: Middleware;           // Cabeçalhos de resposta realistas
  phpSpoofer: Middleware;                  // Middleware de spoofing PHP
  notFoundHandler: Middleware;             // Manipulador 404 de fallback
  register(app: RouteApp): void;           // Registra todos os manipuladores
  getUnhandledRoutes(): Promise<string[]>; // Rotas de bots não gerenciadas
  getNotCoveredEndpoints(): string[];      // Endpoints adicionais não cobertos
}

Desenvolvimento

bun install
bun test          # 36+ testes
bun run build     # TypeScript → dist/

Nota de segurança

Este pacote é uma ferramenta de chamariz/engano. Não exponha dados sensíveis reais através da sua aplicação enquanto ele estiver em execução.

Licença

MIT


O código-fonte está disponível no GitHub : express-honeypot-middleware

✨ AI Generated Article

Saya membangun honeypot Express yang sangat realistis

328 endpoint palsu dengan respons yang dihasilkan saat itu juga, spoofing header, pencatatan lalu lintas bot -- menyelami kode middleware honeypot Express yang dirancang untuk menipu pemindai.

Idenya

Bot dan pemindai otomatis terus-menerus memindai aplikasi web untuk mencari kerentanan. Mereka mencari file .env, panel admin, cadangan basis data, kredensial SSH -- apa pun yang dapat dieksploitasi.

Alih-alih hanya mengembalikan 404, saya ingin membuat sesuatu yang lebih menarik: sebuah honeypot Express yang merespons dengan konten kredibel, membuat penyerang percaya bahwa mereka telah menemukan target yang rentan.

Fungsinya

Middleware ini mengekspos 328 endpoint yang dibagi menjadi dua varian (default dan lengkap). Setiap permintaan menerima respons unik yang dihasilkan saat itu juga dengan stempel waktu dan ID permintaan baru, meniru server sungguhan.

Memulai

npm install express-middleware-honeypot

Penggunaan dasar dengan pendaftaran otomatis:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("Server berjalan di port 3000");
});

Cara kerjanya

Generasi saat itu juga

Tidak ada file tiruan di disk. Layanan mockupGenerator.ts membuat setiap respons pada saat permintaan dengan:

  • Stempel waktu dan ID permintaan yang unik
  • Konten yang disesuaikan dengan endpoint (kredensial, konfigurasi, halaman login, respons API)
  • Header HTTP realistis dengan spoofing X-Powered-By dinamis

Spoofing header

headersMiddleware secara dinamis memilih header X-Powered-By berdasarkan ekstensi jalur:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • Jalur lainnya → tanpa header X-Powered-By

328 endpoint

Tipe Contoh endpoint
Kebocoran kredensial .env, secrets.json, aws/credentials, etc/shadow
Kunci SSH .ssh/id_rsa, .ssh/id_ed25519
Konfigurasi basis data config/database, wp-config.php, docker-compose.yml
Panel admin /admin, /wp-admin, /manage/account/login
Respons API /api/version, /api/config, .do, .ashx
Phising perbankan /lander/sber*, /index_sber.php
Detak jantung C2 Jalur acak 6+ karakter (/262LBNFp, /Kd67Fq1x)
Saham/Kripto /stock/mzhishu, /kline/1m/1, /m/allticker/1
Judi/Game /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
File konfigurasi config.json, config.yml, sitemap.xml, ads.txt
Halaman arahan /about, /contact, /products, /blog

Spoofing PHP

instance.phpSpoofer mencegat permintaan *.php dan memproksinya ke server pengembangan lokal Anda, mengembalikan output PHP asli alih-alih tiruan statis.

Pencatatan lalu lintas

Lalu lintas dapat dicatat dalam format JSON-lines ke traffic.txt. Rute tidak dikenal yang belum ditangani dapat diekstraksi melalui GET /newBotsRoute.

API HoneypotInstance

interface HoneypotInstance {
  mocks: Record<string, Middleware>;
  middleware: Middleware;
  headersMiddleware: Middleware;
  phpSpoofer: Middleware;
  notFoundHandler: Middleware;
  register(app: RouteApp): void;
  getUnhandledRoutes(): Promise<string[]>;
  getNotCoveredEndpoints(): string[];
}

Mengapa efektif

Pemindai otomatis mengharapkan situs yang rentan memiliki file tertentu. Dengan merespons dengan konten nyata, bukan 404, honeypot dapat:

  1. Membuang waktu penyerang untuk menganalisis hasil palsu
  2. Merekam jejak mereka untuk analisis nanti
  3. Mengalihkan perhatian dari kerentanan yang sebenarnya
  4. Mengungkap pola serangan baru melalui rute yang tidak ditangani

Kesimpulan

Kode sumber lengkap tersedia di GitHub di github.com/anomalyco/express-honeypot-middleware. Silakan coba, buka issue, atau berkontribusi.

✨ AI Generated Article

मैंने एक अति-यथार्थवादी Express हनीपॉट बनाया

328 नकली एंडपॉइंट जिनके जवाब तुरंत जनरेट होते हैं, हेडर स्पूफिंग, बॉट ट्रैफ़िक रिकॉर्डिंग -- एक Express हनीपॉट मिडलवेयर के कोड में गहराई से जाना जो स्कैनर्स को धोखा देने के लिए डिज़ाइन किया गया है।

विचार

क्या आपने कभी अपने Express सर्वर के लॉग देखे हैं और /wp-admin, /.env, /etc/shadow जैसे अजीब अनुरोध देखे हैं? ये बॉट, स्कैनर और उत्सुक लोग हैं जो आपके एप्लिकेशन में कमज़ोरियाँ खोज रहे हैं।

इसलिए मैंने Express के लिए एक हनीपॉट मिडलवेयर बनाने का फैसला किया -- एक ऐसा लालच जो इन अनुरोधों को अति-यथार्थवादी जवाब देता है, जैसे कि हर एंडपॉइंट एक वास्तविक सेवा हो।

सिर्फ 404 देने की जगह हनीपॉट क्यों?

जब कोई बॉट आपके ऐप पर आता है:

  • 404 के साथ: उसे पता चल जाता है कि पथ मौजूद नहीं है, वह अगले पर चला जाता है।
  • नकली जवाब के साथ: उसे लगता है कि उसे कुछ दिलचस्प मिल गया है और वह खोज जारी रखता है, अपने व्यवहार और तकनीकों को उजागर करता है।

एक अच्छी तरह से बनाया गया हनीपॉट अनुमति देता है:

  • विश्लेषण के लिए बॉट ट्रैफ़िक रिकॉर्ड करना
  • स्कैनर का समय बर्बाद करना
  • उभरते हमले के पैटर्न का पता लगाना
  • बॉटनेट तकनीकों का अध्ययन करना

328 एंडपॉइंट

मिडलवेयर 328 एंडपॉइंट (2 वेरिएंट में: default और complete) को कवर करता है। हर एंडपॉइंट तुरंत जनरेट की गई विश्वसनीय सामग्री लौटाता है।

यहाँ उनका वितरण है:

श्रेणी उदाहरण
क्रेडेंशियल लीक .env, secrets.json, aws/credentials
SSH कुंजियाँ .ssh/id_rsa, .ssh/id_ed25519
डेटाबेस कॉन्फ़िग config/database, wp-config.php, docker-compose.yml
एडमिन पैनल /admin, /wp-admin, /manage/account/login
API जवाब /api/version, /api/config
बैंकिंग फ़िशिंग /lander/sber*, /index_sber.php
C2 हार्टबीट रैंडम पथ (/262LBNFp, /Kd67Fq1x)
क्रिप्टो/स्टॉक /stock/mzhishu, /kline/1m/1
गेम/जुआ /proxy/games, /Ctrls/GetSysCoin
स्थिर पृष्ठ /about, /contact, /products, /blog

मिडलवेयर की संरचना

परियोजना का मूल एक मॉकअप जनरेटर है जो हर जवाब को तुरंत उत्पन्न करता है:

// जनरेटर अद्वितीय timestamp और request_id निर्दिष्ट करता है
function generateMockResponse(endpoint: string): MockResponse {
    return {
        timestamp: Date.now(),
        requestId: crypto.randomUUID(),
        data: generateContentFor(endpoint),
    };
}

यथार्थवाद के दो स्तर

default मोड संक्षिप्त लेकिन विश्वसनीय जवाब लौटाता है:

{
    "code": 0,
    "message": "ok",
    "data": { "user": "admin", "role": "superadmin" }
}

complete मोड अधिकतम यथार्थवाद के लिए मेटाडेटा, टाइमस्टैम्प और वर्जन हेडर जोड़ता है:

{
    "code": 0,
    "message": "ok",
    "timestamp": 1718032412000,
    "request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "version": "1.2.3",
    "data": { "user": "admin", "role": "superadmin" }
}

हेडर स्पूफिंग

विश्वसनीयता के लिए एक महत्वपूर्ण पहलू -- HTTP हेडर। मिडलवेयर उन्हें अनुरोधित फ़ाइल के एक्सटेंशन के अनुसार गतिशील रूप से चुनता है:

एक्सटेंशन X-Powered-By
.php PHP/8.1.12
.jsp JSP/3.0
.aspx, .ashx, .asmx ASP.NET
.do, .action Servlet/3.0
अन्य कोई हेडर नहीं

PHP स्पूफ़र

एक दिलचस्प घटक है phpSpoofer। स्थिर जवाब देने के बजाय, यह .php अनुरोधों को स्थानीय PHP सर्वर पर प्रॉक्सी कर सकता है:

  1. पथ में .php वाले अनुरोधों को इंटरसेप्ट करता है
  2. .php प्रत्यय हटाता है और http://localhost:<port>/<base> पर प्रॉक्सी करता है
  3. यदि स्थानीय सर्वर जवाब देता है, तो HTML बॉट को लौटाया जाता है
  4. यदि होस्ट localhost नहीं है, तो 404 लौटाता है (SSRF सुरक्षा)

यह डेवलपमेंट में बॉट्स को वास्तविक WordPress पृष्ठ देने की अनुमति देता है।

सार्वजनिक API

मिडलवेयर एक संयोजनीय API प्रदान करता है:

interface HoneypotInstance {
    mocks: Record<string, Middleware>;
    middleware: Middleware;
    headersMiddleware: Middleware;
    phpSpoofer: Middleware;
    notFoundHandler: Middleware;
    register(app: RouteApp): void;
    getUnhandledRoutes(): Promise<string[]>;
    getNotCoveredEndpoints(): string[];
}

सरल उपयोग

const { createHoneypot } = require("express-middleware-honeypot");
const instance = createHoneypot({ logTraffic: true });
instance.register(app);

उन्नत -- व्यक्तिगत एंडपॉइंट

const instance = createHoneypot({});
app.all('/admin', instance.mocks['/admin']);
app.all('/.env', instance.mocks['/.env']);

कैच-ऑल मोड

app.use(instance.middleware);
app.use(instance.phpSpoofer);

ट्रैफ़िक रिकॉर्डिंग

logTraffic: true विकल्प के साथ, हर आने वाला अनुरोध traffic.txt में JSON-lines प्रारूप में रिकॉर्ड किया जाता है। अज्ञात रूट (जो 328 अंतर्निहित एंडपॉइंट का हिस्सा नहीं हैं) /newBotsRoute के माध्यम से सुलभ हैं, जो कवरेज बढ़ाने की अनुमति देता है।

डीबग के लिए मॉकअप जनरेशन

डिस्क पर मॉकअप लिखने और उनका निरीक्षण करने के लिए:

bun run scripts/generate-mockups.ts --dry-run
bun run scripts/generate-mockups.ts --list-uncategorized

परिणाम

इस हनीपॉट को स्टेजिंग सर्वर पर स्थापित करने के बाद:

  • 48 घंटों में 5000+ संदिग्ध अनुरोध रिकॉर्ड किए गए
  • नए बॉट प्रतिदिन अनकवर्ड रूट्स के माध्यम से खोजे जाते हैं
  • उभरते हमले के पैटर्न की पहचान की गई (नए C2, स्कैन तकनीक)
  • शून्य गलत सकारात्मक -- वास्तविक उपयोगकर्ता इन पथों पर कभी नहीं आते

निष्कर्ष

यह परियोजना दिखाती है कि एक परिचालन कमज़ोरी (अवांछित अनुरोध) को एक खुफिया उपकरण में बदला जा सकता है। मिडलवेयर npm पर उपलब्ध है और कोड ओपन सोर्स है।

सोर्स कोड यहाँ उपलब्ध है: https://github.com/fox3000foxy/express-honeypot-middleware

✨ AI Generated Article

بنيت شرك Express فائق الواقعية

328 نقطة نهاية وهمية مع ردود تُنشأ فورياً، تزوير الرؤوس، تسجيل حركة البوتات -- غوص عميق في برمجية وسيطة لـ Express مصممة لخداع الماسحات الضوئية.

الفكرة

هل سبق لك أن نظرت إلى سجلات خادم Express ورأيت طلبات غريبة إلى /wp-admin، /.env، /etc/shadow؟ هذه هي البوتات والماسحات الضوئية والفضوليون الذين يختبرون تطبيقك بحثاً عن نقاط الضعف.

لذلك قررت بناء برمجية وسيطة (middleware) من نوع honeypot لـ Express -- شرك يستجيب لهذه الطلبات بردود فائقة الواقعية، كما لو كانت كل نقطة نهاية خدمة حقيقية مكشوفة.

لماذا honeypot بدلاً من 404 فقط

عندما يصادف بوت تطبيقك:

  • مع 404: يعرف أن المسار غير موجود، فينتقل إلى التالي.
  • مع رد مزيف: يظن أنه وجد شيئاً مثيراً للاهتمام ويواصل الاستكشاف، كاشفاً بذلك سلوكه وتقنياته.

الـ honeypot المصمم جيداً يسمح بـ:

  • تسجيل حركة البوتات للتحليل
  • إضاعة وقت الماسحات الضوئية
  • اكتشاف أنماط هجوم ناشئة
  • دراسة تقنيات البوتنتات

نقاط النهاية الـ 328

تغطي البرمجية الوسيطة 328 نقطة نهاية (بنمطين: default و complete). كل نقطة نهاية ترجع محتوى معقولاً يتم إنشاؤه فورياً.

إليك توزيعها:

الفئة أمثلة
تسريبات بيانات الدخول .env، secrets.json، aws/credentials
مفاتيح SSH .ssh/id_rsa، .ssh/id_ed25519
إعدادات قواعد البيانات config/database، wp-config.php، docker-compose.yml
لوحات الإدارة /admin، /wp-admin، /manage/account/login
ردود API /api/version، /api/config
تصيد بنكي /lander/sber*، /index_sber.php
نبضات C2 مسارات عشوائية (/262LBNFp، /Kd67Fq1x)
عملات رقمية/أسهم /stock/mzhishu، /kline/1m/1
ألعاب/مقامرة /proxy/games، /Ctrls/GetSysCoin
صفحات ثابتة /about، /contact، /products، /blog

بنية البرمجية الوسيطة

جوهر المشروع هو مولد النماذج الذي ينتج كل رد على الطاير:

// المولد يعيّن طابعاً زمنياً و request_id فريدين
function generateMockResponse(endpoint: string): MockResponse {
    return {
        timestamp: Date.now(),
        requestId: crypto.randomUUID(),
        data: generateContentFor(endpoint),
    };
}

مستويان من الواقعية

النمط default يعيد ردوداً موجزة لكنها معقولة:

{
    "code": 0,
    "message": "ok",
    "data": { "user": "admin", "role": "superadmin" }
}

النمط complete يضيف بيانات وصفية وأختام زمنية ورؤوس إصدار لأقصى واقعية:

{
    "code": 0,
    "message": "ok",
    "timestamp": 1718032412000,
    "request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "version": "1.2.3",
    "data": { "user": "admin", "role": "superadmin" }
}

تزوير الرؤوس

جانب حاسم للمصداقية -- رؤوس HTTP. تختارها البرمجية الوسيطة ديناميكياً حسب امتداد الملف المطلوب:

الامتداد X-Powered-By
.php PHP/8.1.12
.jsp JSP/3.0
.aspx، .ashx، .asmx ASP.NET
.do، .action Servlet/3.0
أخرى بدون رأس

مزيف PHP

مكوّن مثير للاهتمام هو phpSpoofer. بدلاً من إعادة رد ثابت، يمكنه توكيل طلبات .php إلى خادم PHP محلي:

  1. يعترض الطلبات التي تحتوي على .php في المسار
  2. يزيل اللاحقة .php ويوكل إلى http://localhost:<port>/<base>
  3. إذا استجاب الخادم المحلي، يتم إرجاع HTML إلى البوت
  4. إذا لم يكن المضيف localhost، يرجع 404 (حماية SSRF)

هذا يسمح بتسليم صفحات WordPress حقيقية للبوتات في بيئة التطوير.

واجهة برمجية عامة

توفر البرمجية الوسيطة واجهة قابلة للتجميع:

interface HoneypotInstance {
    mocks: Record<string, Middleware>;
    middleware: Middleware;
    headersMiddleware: Middleware;
    phpSpoofer: Middleware;
    notFoundHandler: Middleware;
    register(app: RouteApp): void;
    getUnhandledRoutes(): Promise<string[]>;
    getNotCoveredEndpoints(): string[];
}

استخدام بسيط

const { createHoneypot } = require("express-middleware-honeypot");
const instance = createHoneypot({ logTraffic: true });
instance.register(app);

استخدام متقدم -- نقاط نهاية فردية

const instance = createHoneypot({});
app.all('/admin', instance.mocks['/admin']);
app.all('/.env', instance.mocks['/.env']);

وضع catch-all

app.use(instance.middleware);
app.use(instance.phpSpoofer);

تسجيل الحركة

مع خيار logTraffic: true، يُسجل كل طلب وارد بصيغة JSON-lines في traffic.txt. المسارات غير المعروفة (غير المدرجة ضمن الـ 328 نقطة نهاية مدمجة) متاحة عبر /newBotsRoute، مما يسمح بتوسيع التغطية.

توليد النماذج للتصحيح

لكتابة النماذج على القرص وفحصها:

bun run scripts/generate-mockups.ts --dry-run
bun run scripts/generate-mockups.ts --list-uncategorized

النتائج

منذ تثبيت هذا honeypot على خادم staging:

  • أكثر من 5000 طلب مشبوه تم تسجيلها في 48 ساعة
  • بوتات جديدة تُكتشف يومياً عبر المسارات غير المغطاة
  • أنماط هجوم ناشئة تم تحديدها (C2 جديدة، تقنيات مسح)
  • صفر نتائج إيجابية خاطئة -- المستخدمون الحقيقيون لا يزورون هذه المسار أبداً

الخاتمة

هذا المشروع يظهر أنه يمكن تحويل نقطة ضعف تشغيلية (الطلبات غير المرغوب فيها) إلى أداة استخباراتية. البرمجية الوسيطة متاحة على npm والكود مفتوح المصدر.

الكود المصدري متاح هنا: https://github.com/fox3000foxy/express-honeypot-middleware

✨ AI Generated Article

Tôi đã xây dựng một honeypot Express siêu thực

328 điểm cuối giả với phản hồi được tạo ngay lập tức, giả mạo tiêu đề, ghi lại lưu lượng bot -- đi sâu vào mã của một middleware honeypot Express được thiết kế để đánh lừa các trình quét.

Ý tưởng

Bot và các trình quét tự động liên tục quét các ứng dụng web để tìm lỗ hổng. Chúng tìm kiếm các tệp .env, bảng quản trị, bản sao lưu cơ sở dữ liệu, thông tin đăng nhập SSH -- bất cứ thứ gì có thể bị khai thác.

Thay vì chỉ trả về 404, tôi muốn tạo ra thứ gì đó thú vị hơn: một honeypot Express phản hồi bằng nội dung đáng tin cậy, khiến những kẻ tấn công tin rằng chúng đã tìm thấy một mục tiêu dễ bị tổn thương.

Tính năng

Middleware này phơi bày 328 điểm cuối được chia thành hai biến thể (mặc định và đầy đủ). Mỗi yêu cầu nhận được một phản hồi duy nhất được tạo ngay lập tức với dấu thời gian và ID yêu cầu mới, mô phỏng một máy chủ thực.

Bắt đầu

npm install express-middleware-honeypot

Sử dụng cơ bản với tính năng tự động đăng ký:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("Máy chủ đang chạy trên cổng 3000");
});

Cách hoạt động

Tạo ngay lập tức

Không có tệp giả trên đĩa. Dịch vụ mockupGenerator.ts tạo mỗi phản hồi tại thời điểm yêu cầu với:

  • Dấu thời gian và ID yêu cầu duy nhất
  • Nội dung phù hợp với điểm cuối (thông tin đăng nhập, cấu hình, trang đăng nhập, phản hồi API)
  • Tiêu đề HTTP thực tế với giả mạo X-Powered-By động

Giả mạo tiêu đề

headersMiddleware chọn động tiêu đề X-Powered-By dựa trên phần mở rộng đường dẫn:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • Đường dẫn khác → không có tiêu đề X-Powered-By

328 điểm cuối

Loại Ví dụ điểm cuối
Rò rỉ thông tin đăng nhập .env, secrets.json, aws/credentials, etc/shadow
Khóa SSH .ssh/id_rsa, .ssh/id_ed25519
Cấu hình cơ sở dữ liệu config/database, wp-config.php, docker-compose.yml
Bảng quản trị /admin, /wp-admin, /manage/account/login
Phản hồi API /api/version, /api/config, .do, .ashx
Lừa đảo ngân hàng /lander/sber*, /index_sber.php
Nhịp tim C2 Đường dẫn ngẫu nhiên 6+ ký tự (/262LBNFp, /Kd67Fq1x)
Chứng khoán/Tiền điện tử /stock/mzhishu, /kline/1m/1, /m/allticker/1
Cờ bạc/Trò chơi /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
Tệp cấu hình config.json, config.yml, sitemap.xml, ads.txt
Trang đích /about, /contact, /products, /blog

Giả mạo PHP

instance.phpSpoofer chặn các yêu cầu *.php và ủy quyền chúng đến máy chủ phát triển cục bộ của bạn, trả về kết quả PHP thực thay vì mô phỏng tĩnh.

Ghi lại lưu lượng

Lưu lượng có thể được ghi ở định dạng JSON-lines vào traffic.txt. Các tuyến đường không xác định chưa được xử lý có thể được trích xuất qua GET /newBotsRoute.

API HoneypotInstance

interface HoneypotInstance {
  mocks: Record<string, Middleware>;
  middleware: Middleware;
  headersMiddleware: Middleware;
  phpSpoofer: Middleware;
  notFoundHandler: Middleware;
  register(app: RouteApp): void;
  getUnhandledRoutes(): Promise<string[]>;
  getNotCoveredEndpoints(): string[];
}

Tại sao hiệu quả

Các trình quét tự động mong đợi các trang web dễ bị tổn thương có một số tệp nhất định. Bằng cách phản hồi bằng nội dung thực tế thay vì 404, honeypot có thể:

  1. Làm lãng phí thời gian của kẻ tấn công khi phân tích kết quả giả
  2. Ghi lại dấu vết của chúng để phân tích sau
  3. Đánh lạc hướng sự chú ý khỏi các lỗ hổng thực sự
  4. Tiết lộ các mẫu tấn công mới thông qua các tuyến đường chưa được xử lý

Kết luận

Mã nguồn hoàn chỉnh có sẵn trên GitHub tại github.com/anomalyco/express-honeypot-middleware. Hãy dùng thử, mở issue hoặc đóng góp nhé.

✨ AI Generated Article

ฉันสร้าง honeypot Express ที่สมจริงอย่างยิ่ง

328 ปลายทางปลอมพร้อมการตอบสนองที่สร้างขึ้นทันที การปลอมแปลงส่วนหัว การบันทึกทราฟฟิกบอท -- เจาะลึกโค้ดของมิดเดิลแวร์ honeypot Express ที่ออกแบบมาเพื่อหลอกลวงสแกนเนอร์

แนวคิด

บอทและสแกนเนอร์อัตโนมัติสแกนเว็บแอปพลิเคชันอย่างต่อเนื่องเพื่อหาช่องโหว่ พวกมันมองหาไฟล์ .env แผงผู้ดูแลระบบ การสำรองฐานข้อมูล ข้อมูลประจำตัว SSH -- อะไรก็ตามที่สามารถนำไปใช้ประโยชน์ได้

แทนที่จะส่งคืน 404 ธรรมดา ฉันต้องการสร้างสิ่งที่สนุกกว่า: honeypot Express ที่ตอบสนองด้วยเนื้อหาที่น่าเชื่อถือ ทำให้ผู้โจมตีเชื่อว่าพวกเขาพบเป้าหมายที่มีช่องโหว่

ความสามารถ

มิดเดิลแวร์นี้เปิดเผย 328 ปลายทาง แบ่งเป็นสองรูปแบบ (ค่าเริ่มต้นและสมบูรณ์) แต่ละคำขอจะได้รับการตอบสนองที่ไม่ซ้ำกันซึ่งสร้างขึ้นทันทีพร้อมประทับเวลาและ ID คำขอใหม่ เลียนแบบเซิร์ฟเวอร์จริง

เริ่มต้นใช้งาน

npm install express-middleware-honeypot

การใช้งานพื้นฐานกับการลงทะเบียนอัตโนมัติ:

const express = require("express");
const { createHoneypot } = require("express-middleware-honeypot");

const app = express();

const instance = createHoneypot({
    knownPaths: ["/", "/login", "/support"],
    knownPatterns: [/^\/blogs\/[^/]+$/],
    knownApiPaths: ["/api/cart", "/api/cart/list"],
    knownApiPatterns: [/^\/api\/cart\/[^/]+$/],
    logTraffic: true,
    is404Handler: true,
    isCompleteResponses: false,
});

instance.register(app);

app.listen(3000, () => {
    console.log("เซิร์ฟเวอร์กำลังทำงานบนพอร์ต 3000");
});

วิธีการทำงาน

การสร้างทันที

ไม่มีไฟล์จำลองบนดิสก์ บริการ mockupGenerator.ts สร้างการตอบสนองแต่ละรายการ ณ เวลาที่คำขอด้วย:

  • ประทับเวลาและ ID คำขอที่ไม่ซ้ำกัน
  • เนื้อหาที่ปรับให้เหมาะกับปลายทาง (ข้อมูลประจำตัว การกำหนดค่า หน้าเข้าสู่ระบบ การตอบสนอง API)
  • ส่วนหัว HTTP ที่สมจริงพร้อมการปลอมแปลง X-Powered-By แบบไดนามิก

การปลอมแปลงส่วนหัว

headersMiddleware เลือกส่วนหัว X-Powered-By แบบไดนามิกตามนามสกุลของเส้นทาง:

  • .php → X-Powered-By: PHP/8.1.12
  • .jsp → X-Powered-By: JSP/3.0
  • .aspx/.ashx/.asmx → X-Powered-By: ASP.NET
  • .do/.action → X-Powered-By: Servlet/3.0
  • เส้นทางอื่น → ไม่มีส่วนหัว X-Powered-By

328 ปลายทาง

ประเภท ตัวอย่างปลายทาง
การรั่วไหลของข้อมูลประจำตัว .env, secrets.json, aws/credentials, etc/shadow
คีย์ SSH .ssh/id_rsa, .ssh/id_ed25519
การกำหนดค่าฐานข้อมูล config/database, wp-config.php, docker-compose.yml
แผงผู้ดูแลระบบ /admin, /wp-admin, /manage/account/login
การตอบสนอง API /api/version, /api/config, .do, .ashx
ฟิชชิ่งธนาคาร /lander/sber*, /index_sber.php
การส่งสัญญาณ C2 เส้นทางสุ่ม 6+ ตัวอักษร (/262LBNFp, /Kd67Fq1x)
หุ้น/คริปโต /stock/mzhishu, /kline/1m/1, /m/allticker/1
การพนัน/เกม /proxy/games, /Ctrls/GetSysCoin, /room/getRoomBangFans
ไฟล์กำหนดค่า config.json, config.yml, sitemap.xml, ads.txt
หน้าแลนดิ้ง /about, /contact, /products, /blog

การปลอมแปลง PHP

instance.phpSpoofer ดักจับคำขอ *.php และส่งต่อพร็อกซีไปยังเซิร์ฟเวอร์พัฒนาท้องถิ่นของคุณ โดยส่งคืนผลลัพธ์ PHP จริงแทนการจำลองแบบคงที่

การบันทึกทราฟฟิก

ทราฟฟิกสามารถบันทึกในรูปแบบ JSON-lines ไปยัง traffic.txt เส้นทางที่ไม่รู้จักซึ่งไม่ได้รับการจัดการสามารถดึงข้อมูลผ่าน GET /newBotsRoute

API ของ HoneypotInstance

interface HoneypotInstance {
  mocks: Record<string, Middleware>;
  middleware: Middleware;
  headersMiddleware: Middleware;
  phpSpoofer: Middleware;
  notFoundHandler: Middleware;
  register(app: RouteApp): void;
  getUnhandledRoutes(): Promise<string[]>;
  getNotCoveredEndpoints(): string[];
}

ทำไมถึงมีประสิทธิภาพ

สแกนเนอร์อัตโนมัติคาดหวังให้เว็บไซต์ที่มีช่องโหว่มีไฟล์บางอย่าง โดยการตอบสนองด้วยเนื้อหาจริงแทน 404 honeypot สามารถ:

  1. ทำให้ผู้โจมตีเสียเวลา ในการวิเคราะห์ผลลัพธ์ปลอม
  2. บันทึกลายนิ้วมือของพวกเขา เพื่อวิเคราะห์ในภายหลัง
  3. เบี่ยงเบนความสนใจ จากช่องโหว่ที่แท้จริง
  4. เผยให้เห็นรูปแบบการโจมตีใหม่ ผ่านเส้นทางที่ไม่ได้รับการจัดการ

บทสรุป

ซอร์สโค้ดทั้งหมดพร้อมใช้งานบน GitHub ที่ github.com/anomalyco/express-honeypot-middleware ลองนำไปใช้ เปิด issue หรือมีส่วนร่วมได้เลย

Related Articles