Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/aleister1102/kibana-prototype-pollusion
Analyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebArticles et RechercheApprentissage et Éducation
GitHubaleister1102/kibana-prototype-pollusion

kibana-prototype-pollusion

PoC et analyse pour l'exécution de code à distance (RCE) par pollution de prototype dans Kibana (CVE-2019-7609).

Voir le dépôt
11il y a 2 ansPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2019-7609

Les versions de Kibana antérieures à 5.6.15 et 6.6.1 contiennent une faille d'exécution de code arbitraire dans le visualiseur Timelion. Un attaquant ayant accès à l'application Timelion pourrait envoyer une requête tentant d'exécuter du code Javascript. Cela pourrait éventuellement permettre à un attaquant d'exécuter des commandes arbitraires avec les permissions du processus Kibana sur le système hôte.

CVSS:

cvss

Blog: https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/

Payload: https://github.com/mpgn/CVE-2019-7609

Cible

Configuration :

  • Docker: https://www.elastic.co/guide/en/kibana/8.14/docker.html
  • Docker Compose

Utilisation :

  • Kibana: https://www.elastic.co/guide/en/kibana/current/development-getting-started.html
  • Timelion: https://www.elastic.co/guide/en/kibana/5.4/timelion.html

Analyse

Timelion

Après l'analyse de la feuille :

alt text

Après le prétraitement de la feuille, nous avons un objet queries :

alt text

Ensuite, nous parcourons le tableau queries (qui est converti en tableau en utilisant la méthode values) et passons à invoke les query.function et query.arguments pour invoquer la fonction.

Dans la fonction invoke, nous obtenons d'abord la définition de la fonction basée sur son nom (query.function) :

alt text

Cette définition de fonction inclut trois types de fonction : fn, originalFn et timelionFn. Ensuite, elle parcourt les args (qui sont query.arguments) et résout les arguments :

alt text

Dans ce cas, l'argument dans args est un objet de type 'literal' donc il retourne simplement la valeur littérale :

alt text

En réalité, la valeur est enveloppée dans une promesse.

alt text

L'argument indexé est un argument avec un objet byName qui contient un tableau q à l'intérieur :

alt text

Après cela, la fonction invoke appellera functionDef.fn, qui est une fonction de la classe Timelion, avec tous les arguments indexés :

alt text

La fonction fn appellera originalFn, qui provient de config.fn où config est tlConfig. Et cette fonction est fn de la classe Datasource extends Timelion :

alt text

Comme nous pouvons le voir, elle appelle une autre originalFn nommée esFn qui retourne un objet seriesList :

alt text

Cette fonction est utilisée pour "Extraire des données d'une instance Elasticsearch" en appelant la fonction callWithRequest.

Le seriesList ressemble à cela dans Datasource.fn :

alt text

Et il ressemble à cela dans Timelion.fn :

alt text

Après le prétraitement de la feuille, la liste des chaînes est :

alt text

Et le code appellera resolveChainList pour résoudre la liste des chaînes :

alt text

Chaque chaîne sera mappée à une Promise retournée par une fonction qui invoke avec 'first' comme fnName et la chaîne elle-même comme args.

La définition de fonction est à nouveau obtenue par le nom :

alt text

Cette fois, resolveArguments reçoit args comme un tableau et appellera resolveArguments récursivement pour résoudre chaque argument. Mais nous n'avons qu'un seul argument avec l'index 0. Et cet argument est un objet avec type == chain.

Donc, dans le switch case, il appellera la fonction invokeChain et lui passera l'objet chaîne :

alt text

À l'intérieur de la chaîne d'invocation, il shift le tableau chain. La fonction shift retournera l'élément supprimé, donc link sera l'objet es :

alt text

Parce que le type de es n'est pas 'chain' (c'est 'function') et que !result est truthy, le code appelle la fonction invoke avec 'first' comme fnName et l'objet es comme args :

Cette fois, la procédure est la même que ci-dessus, donc passons à l'appel de invokeChain avec link qui est l'objet props :

alt text

Encore une fois, le code appelle la fonction invoke avec 'first' comme fnName et l'objet props comme args :

alt text

Le originalFn de props est maintenant firstFn au lieu de fn comme es et n'accepte qu'un seul argument :

alt text

Cette fonction originale appellera éventuellement la fonction vulnérable unflatten. En réalité, elle appellera d'abord le fn de Timelion. Ensuite, fn appellera le originalFn de props :

alt text

Le firstFn de props omettra les propriétés inputSeries et global dans l'objet byName de args :

alt text

Donc les data passées à unflatten seront :

{
    label.__proto__.env.AAA: "a"
}

Preuve :

alt text

Unflatten

Utilisez props(label.__proto__.env.AAA="a"). Les data ressembleront à ceci :

Télécharger l’outil