Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
kibana-prototype-pollusion — Kibana Prototype Pollution RCE (CVE-2019-7609)에 대한 PoC 및 분석. | Kitploit
도구/GitHubGitHub/aleister1102/kibana-prototype-pollusion
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPapers & ResearchLearning & Education
GitHubaleister1102/kibana-prototype-pollusion

kibana-prototype-pollusion

Kibana Prototype Pollution RCE (CVE-2019-7609)에 대한 PoC 및 분석.

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기
2년 전아직 검토되지 않음

CVE-2019-7609

5.6.15 이전 및 6.6.1 이전의 Kibana 버전은 Timelion 시각화 도구에서 임의 코드 실행 취약점을 포함합니다. Timelion 애플리케이션에 접근할 수 있는 공격자는 JavaScript 코드를 실행하려는 요청을 보낼 수 있습니다. 이로 인해 공격자가 호스트 시스템에서 Kibana 프로세스의 권한으로 임의 명령을 실행할 수 있습니다.

CVSS:

cvss

블로그: https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/

페이로드: https://github.com/mpgn/CVE-2019-7609

대상

설정:

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

사용:

  • 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

분석

Timelion

시트 파싱 후:

alt text

시트 전처리 후, queries 객체가 생성됩니다:

alt text

그런 다음, queries 배열을 순회하며 (values 메서드를 사용하여 배열로 변환됨) 각 query.function과 query.arguments를 invoke에 전달하여 함수를 호출합니다.

invoke 함수에서는 먼저 함수 이름(query.function)에 기반하여 함수 정의를 가져옵니다:

alt text

이 함수 정의에는 세 가지 유형의 함수(fn, originalFn, timelionFn)가 포함됩니다. 그런 다음 args(query.arguments)를 순회하며 인자를 해석합니다:

alt text

이 경우, args의 인자는 'literal' 타입의 객체이므로 리터럴 값을 반환합니다:

alt text

실제로 값은 promise로 감싸집니다.

alt text

인덱스 인자는 byName 객체로, 내부에 q 배열이 포함되어 있습니다:

alt text

이후 invoke 함수는 모든 인덱스 인자를 사용하여 functionDef.fn을 호출합니다. 이는 Timelion 클래스의 함수입니다:

alt text

fn 함수는 config.fn에서 가져온 originalFn을 호출합니다. 여기서 config는 tlConfig입니다. 그리고 이 함수는 Datasource extends Timelion 클래스의 fn입니다:

alt text

보시다시피, seriesList 객체를 반환하는 또 다른 originalFn인 esFn을 호출합니다:

alt text

이 함수는 callWithRequest 함수를 호출하여 "elasticsearch 인스턴스에서 데이터를 가져오는" 데 사용됩니다.

Datasource.fn에서 seriesList는 다음과 같습니다:

alt text

Timelion.fn에서는 다음과 같습니다:

alt text

시트 전처리 후, 체인 목록은 다음과 같습니다:

alt text

코드는 resolveChainList를 호출하여 체인 목록을 해석합니다:

alt text

각 체인은 'first'를 fnName으로, 체인 자체를 args로 하여 invoke를 호출하는 함수에서 반환된 Promise에 매핑됩니다.

함수 정의는 이름으로 다시 가져옵니다:

alt text

이번에는 resolveArguments가 args를 배열로 받아들이고, 각 인자를 해석하기 위해 재귀적으로 resolveArguments를 호출합니다. 하지만 인덱스가 0인 인자는 하나만 있습니다. 그리고 그 인자는 type == chain인 객체입니다.

따라서 switch case에서 invokeChain 함수를 호출하고 체인 객체를 전달합니다:

alt text

invokeChain 내부에서는 chain 배열을 shift합니다. shift 함수는 제거된 요소를 반환하므로, link는 es 객체가 됩니다:

alt text

es의 타입이 'chain'이 아니고('function'임) !result가 truthy이므로, 코드는 'first'를 fnName으로, es 객체를 args로 하여 invoke 함수를 호출합니다:

이번에도 절차는 위와 동일하므로, link가 props 객체인 invokeChain 호출로 건너뜁니다:

alt text

다시, 코드는 'first'를 fnName으로, props 객체를 args로 하여 invoke 함수를 호출합니다:

alt text

props의 originalFn은 이제 firstFn이며, es처럼 fn이 아니고 인자를 하나만 받습니다:

alt text

이 original 함수는 결국 취약한 unflatten 함수를 호출합니다. 실제로는 먼저 Timelion의 fn을 호출합니다. 그런 다음 fn은 props의 originalFn을 호출합니다:

alt text

props의 firstFn은 args의 byName 객체에서 inputSeries와 global 속성을 생략합니다:

alt text

따라서 unflatten에 전달되는 data는 다음과 같습니다:

root@kitploit:~
{
    label.__proto__.env.AAA: "a"
}

증명:

alt text

Unflatten

props(label.__proto__.env.AAA="a")를 사용합니다. data는 다음과 같이 보입니다:

alt text

첫 번째 반복에서 prop = ''은 존재하지 않으므로, cur[''] = {}를 할당합니다. 즉, result에도 ''라는 이름의 속성이 생기고 값은 빈 객체입니다. 그 후, cur는 이전 할당의 반환값인 {}가 할당됩니다(cur와 cur[prop] 모두 동일한 객체를 가리킴):

alt text

이제 prop은 'label'이 됩니다:

alt text

앞과 마찬가지로, result에 'label' 속성이 생기고 prop은 __proto__가 됩니다:

alt text

세 번째 반복에서, __proto__는 모든 객체에 항상 존재하므로 cur는 프로토타입이 됩니다:

alt text

그 후, prop은 env가 됩니다.

그런 다음, cur가 Object.prototype을 가리키므로, Object.prototype에 env를 빈 객체로 추가하고 cur는 Object.prototype.env 내부의 env를 참조하게 됩니다.

alt text

그 후, 루프가 종료되고 cur[prop] = data[p]는 env[AAA] = 'a'와 동일하게 됩니다.

alt text

Object.prototype이 env로 오염되었습니다:

alt text

Canvas

fork 함수는 spawn을 호출하는 데 사용할 수 있는 ChildProcess를 반환합니다

fork 함수를 호출할 때 포트를 9669(다른 포트)로 변경하면, 메인 프로세스를 정상적으로 디버깅할 수 있습니다:

alt text

오염된 Object.prototype을 시뮬레이션하고 루프 이전으로 이동합니다:

alt text

보시다시피, 프로토타입 오염으로 인해 env는 { AAA: 'a' }와 동일합니다. 더 정확히는, env는 options.env에 할당됩니다. 그리고 options는 해당 속성을 정의하지 않으므로 프로토타입의 값을 사용합니다.

루프 이후:

alt text

어떤 이유로 잘못된 환경 변수(AAA=a, env=[Object object])로 인해 canvas가 새 소켓을 생성할 수 없습니다:

alt text

하지만 자식 프로세스는 여전히 생성될 수 있습니다:

alt text

정상 흐름에서는 새 WebSocket 연결을 생성합니다:

alt text

이제 페이로드를 사용하여 normalizeSpawnArguments로 이동합니다:

alt text

보시다시피, 스택 트레이스는 동일합니다.

하지만 env가 오염되었습니다:

alt text

짜잔!

루프 후의 envPairs:

alt text

그리고 리버스 셸을 획득했습니다:

alt text

Spawn

spawn 함수 내에서 normalizeSpawnArguments를 호출한 후:

alt text

보시다시피, envPairs에 페이로드가 포함되어 있습니다. 또한, 이후 spawn은 internal/child_process.js 내부의 spawn 함수를 호출합니다:

alt text

options 변수는 this._handle.spawn으로 전달됩니다:

alt text

여기서 this._handle은 프로세스에 대한 핸들입니다:

alt text

패치

root@kitploit:~
From 3377f813a5d96ff466bdf7343ce161de24830ed4 Mon Sep 17 00:00:00 2001
From: ppisljar <[email protected]>
Date: Wed, 16 Jan 2019 06:01:20 -0800
Subject: [PATCH] fixes

---
 .../core_plugins/timelion/server/series_functions/props.js      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/legacy/core_plugins/timelion/server/series_functions/props.js b/src/legacy/core_plugins/timelion/server/series_functions/props.js
index 81b74901d4db..80e9cafd6712 100644
--- a/src/legacy/core_plugins/timelion/server/series_functions/props.js
+++ b/src/legacy/core_plugins/timelion/server/series_functions/props.js
@@ -32,7 +32,7 @@ function unflatten(data) {
     let prop = '';
     let m;
     while (m = regex.exec(p)) {
-      cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));
+      cur = (cur.hasOwnProperty(prop) && cur[prop]) || (cur[prop] = (m[2] ? [] : {}));
       prop = m[2] || m[1];
     }
     cur[prop] = data[p];
도구 다운로드