
Node.js 및 Java 애플리케이션의 다양한 취약점을 악용하는 단계별 워크숍
이 단계별 워크숍에서는 Node.js 및 Java 애플리케이션의 취약한 패키지 버전에 존재하는 다양한 실제 취약점을 공격하는 방법을 배웁니다.
이 워크숍은 2가지 방식으로 진행할 수 있습니다.
또는
이 워크숍은 의도적으로 취약하게 만든 여러 애플리케이션을 설치하고 공격하는 과정을 안내합니다. 애플리케이션은 알려진 취약점이 있는 실제 패키지를 사용하며, 여기에는 다음이 포함됩니다:
이러한 공격은 여러 애플리케이션에 존재하며, 대부분 로컬 또는 클라우드 인스턴스에 설치해야 합니다. 아래 설명은 로컬 설치를 안내하지만, 원격 클라우드 인스턴스에서도 시도해 볼 수 있습니다.
워크숍의 각 취약점 섹션에서는 취약점과 해당 패키지에 대한 정보를 제공합니다. 처음에는 힌트를 읽지 않고 시행착오를 통해 애플리케이션을 해킹해 보시기 바랍니다. 애플리케이션의 정화 과정을 속일 방법을 생각하고 해커의 마인드가 되어 보세요. 힌트는 막혔을 때를 위해 준비되어 있으니, 도움이 필요할 때 순서대로 읽어보세요. 힌트 없이 해킹을 완료할 수 있다면 훌륭합니다! 하지만 완료 후에 힌트를 읽어서 우리와 같은 방식으로 해킹했는지 확인하는 것도 좋습니다. 또한 배울 만한 작은 팁도 있을 수 있습니다.
이전 선택에 따라 적절한 설치 매뉴얼을 선택하세요.
선호하는 브라우저에서 http://localhost:3001로 이동하면 다음 페이지가 표시됩니다.

사이트를 잠시 사용해 보세요. 특히 일반 텍스트로 “Buy Milk”를 사용하거나 마크다운으로 “Buy **lots** of milk”를 사용하여 몇 가지 할 일(todo) 항목을 만들어 보세요. 또한 홈페이지 하단에서 연결된 매우 간소한 about 페이지로 이동해 보세요. 이 about 페이지를 만드는 데 사용된 CSS-foo를 감상해 보세요. 참고: 이 페이지를 더 멋지게 만드는 PR은 병합되지 않습니다 ;o)

먼저 블루(방어) 측면에서 살펴보겠습니다. goof 애플리케이션을 자신의 GitHub 계정으로 포크하세요. 애플리케이션은 GitHub에서 찾을 수 있습니다: https://github.com/snyk/goof. 애플리케이션의 직접 및 간접 종속성과 각 라이브러리의 취약점을 이해하기 위해 애플리케이션을 스캔해야 합니다. 이를 위해 https://snyk.io로 이동하여 사이트 오른쪽 상단의 "회원가입" 또는 "로그인"(이미 사용자인 경우)을 클릭하세요:

“GitHub로 로그인” 버튼을 클릭하세요:

다음으로, 이전에 클론한 goof 프로젝트를 가져옵니다. GitHub 저장소 목록에서 goof를 선택하고 창 오른쪽 상단의 "프로젝트 가져오기" 버튼을 클릭하세요.

프로젝트가 스캔되면 대시보드에서 확인할 수 있습니다:

package.json 링크를 클릭하면 보안 취약점 전체 목록이 포함된 프로젝트 페이지를 볼 수 있습니다:

issues 및 dependencies 탭을 클릭하면 취약점 및 해당 수정 사항에 대한 자세한 정보와 애플리케이션에서 이러한 취약점이 어디에서 발생하는지 확인할 수 있습니다. 취약점 목록 하단에 st 패키지의 디렉터리 트래버설 취약점이 있음을 알 수 있습니다. 이에 대해 자세히 살펴보겠습니다.

디렉터리 트래버설 공격(경로 트래버설이라고도 함)은 의도된 폴더 외부에 저장된 파일 및 디렉터리에 접근하는 것을 목표로 합니다. "점-점-슬래시"(../) 시퀀스와 그 변형을 사용하여 파일을 조작하거나 절대 파일 경로를 사용함으로써 애플리케이션 소스 코드, 구성 및 기타 중요한 시스템 파일을 포함한 파일 시스템에 저장된 임의의 파일 및 디렉터리에 접근할 수 있습니다.
디렉터리 트래버설 취약점은 일반적으로 두 가지 유형으로 나눌 수 있습니다:
goof 애플리케이션에서 디렉터리 트래버설 취약점이 포함된 패키지는 st 패키지입니다. st 문서를 살펴보고 해당 라이브러리에 익숙해지세요.
이제 디렉터리 트래버설이 무엇인지, st 패키지가 하는 일을 알게 되었으므로 애플리케이션을 해킹해 보세요 -- 이제 다시 레드 팀입니다! 애플리케이션에서 st 패키지가 사용될 수 있는 곳을 찾아보고 접근이 허용되지 않아야 할 디렉터리로 트래버설을 시도하세요.
다음은 막혔을 때 도움이 될 힌트입니다 - 직접 시도해 본 후 도움이 필요할 때만 보려고 노력하세요.
클릭하여 힌트 1 보기.
클릭하여 힌트 2 보기.
클릭하여 힌트 3 보기.
클릭하여 힌트 4 보기.
클릭하여 힌트 5 보기.
클릭하여 힌트 6 보기.
클릭하여 힌트 7 보기.
클릭하여 힌트 8 보기.
클릭하여 힌트 9 보기.
공격자처럼 파일 시스템을 탐색하여 공격자에게 보여주고 싶지 않을 민감한 정보 3개를 찾아보세요.
클릭하여 힌트 10 보기.
취약점 설명과 CVSS 점수를 확인하세요: https://snyk.io/vuln/npm:st:20140206. 이 취약점이 높음(high)이 아닌 중간(medium) 심각도인 이유는 무엇이라고 생각하나요?
snyk 프로젝트 페이지로 돌아가서 st 패키지의 디렉터리 트래버설 취약점을 찾고 수정 조언을 확인하세요. 애플리케이션에서 이 취약점으로 가는 경로가 하나뿐이며 st 패키지가 직접 종속성이므로 수정이 그리 까다롭지 않을 것입니다. st 패키지의 버전을 0.2.5로 업데이트해야 함을 알 수 있습니다. "이 취약점 수정" 버튼을 클릭하여 자동으로 수행할 수 있습니다.

취약점 목록이 표시되며, st 취약점만 선택되어 있어야 합니다. 페이지 하단으로 스크롤하여 "수정 PR 열기"를 클릭하세요:

풀 리퀘스트의 "변경된 파일" 탭에서 코드 변경 사항을 확인하세요:

새 PR 테스트가 새로운 보안 또는 라이선스 문제를 발생시키지 않았으며 통과했는지 확인하세요. 이는 PR의 conversation 탭에서 확인할 수 있습니다:

PR이 마음에 들면 변경 사항을 병합하세요.
로컬에서 애플리케이션을 실행 중인 경우 npm start를 실행한 창에서 Ctrl+C를 눌러 중지하세요. git fetch를 실행하여 GitHub에서 최신 코드를 가져옵니다. npm install을 실행하여 새 버전의 st를 다운로드한 후 npm start를 사용하여 애플리케이션을 다시 시작하세요.
다시 해킹을 시도해 보세요. 축하합니다!, 취약점을 수정했으며 이제 공용 폴더를 벗어나려고 할 때마다 홈페이지로 리디렉션됩니다.
Snyk 스캔에서 ReDoS 취약점에 대한 설명을 확인하세요:

ms 패키지의 이 취약점이 goof 애플리케이션에서 공격할 대상입니다. 다음 명령어를 사용하여 시간 문자열 표현을 포함하는 할 일 항목을 추가하세요:``` $ echo 'content=Call mom in 20 minutes' | http --form http://localhost:3001/create -v
ms 라이브러리가 콘텐츠 입력 문자열에서 시간 패턴을 일치시켰습니다. 이는 goof 웹페이지에서 약간 다르게 표시됩니다.

ReDoS 작동 방식에 대한 지식을 활용하여 눈에 띄는 지연 또는 다른 사용자에 대한 서비스 거부를 일으키는 콘텐츠 문자열을 전달해 보세요. 요청이 처리되는 동안 웹페이지는 첫 번째 요청이 처리될 때까지 추가 요청을 버퍼링합니다.
[힌트 1](https://github.com/snyk-labs/exploit-workshop/blob/main/ms/hint1.md)을 보려면 클릭하세요.
[힌트 2](https://github.com/snyk-labs/exploit-workshop/blob/main/ms/hint2.md)을 보려면 클릭하세요.
[힌트 3](https://github.com/snyk-labs/exploit-workshop/blob/main/ms/hint3.md)을 보려면 클릭하세요.
[힌트 4](https://github.com/snyk-labs/exploit-workshop/blob/main/ms/hint4.md)을 보려면 클릭하세요.
[힌트 5](https://github.com/snyk-labs/exploit-workshop/blob/main/ms/hint5.md)을 보려면 클릭하세요.
애플리케이션 코드에서 이 공격을 프로그래밍 방식으로 방지하려면 어떻게 해야 할지 생각해 보세요.
### 취약점 해결