
Web Exploit Detector는 웹 호스팅 환경에서 가능한 감염, 악성 코드 및 의심스러운 파일을 탐지하는 데 사용되는 Node.js 애플리케이션입니다.

웹 익스플로잇 탐지기는 웹 호스팅 환경에서 가능한 감염, 악성 코드 및 의심스러운 파일을 탐지하는 데 사용되는 Node.js 애플리케이션(및 NPM 모듈)입니다. 이 애플리케이션은 하나 이상의 웹사이트를 호스팅하는 웹 서버에서 실행하도록 설계되었습니다. 애플리케이션을 실행하면 잠재적으로 감염된 파일 목록이 생성되며, 각 파일에는 감염에 대한 설명과 관련 온라인 리소스 링크가 함께 제공됩니다.
버전 1.1.0부터 이 애플리케이션에는 디렉터리 구조의 스냅샷을 생성하고 비교하는 유틸리티도 포함되어 있어, 사용자가 파일이 수정되었는지, 추가되었는지 또는 제거되었는지 확인할 수 있습니다.
이 애플리케이션은 다른 사람들도 혜택을 받을 수 있도록 GitHub에 호스팅되어 있으며, 다른 사람들이 자신만의 탐지 규칙을 기여할 수도 있습니다.
웹 익스플로잇 탐지기를 설치하는 가장 간단한 방법은 전역 NPM 모듈로 설치하는 것입니다: -
npm install -g web_exploit_detector
Linux 또는 다른 Unix 계열 OS를 사용 중이라면 이 명령을 root로 실행해야 할 수 있습니다(예: sudo npm install -g web_exploit_detector).
최신 탐지 규칙이 모두 포함되도록 모듈을 정기적으로 업데이트해야 합니다. 위 명령을 실행하면 항상 최신 안정(테스트 완료) 버전이 다운로드됩니다. 이미 설치된 버전을 업데이트하려면 다음을 실행하면 됩니다: -
npm update -g web_exploit_detector
마찬가지로, 위와 같이 sudo 명령을 사용해야 할 수 있습니다.
Git 저장소를 클론하여 다음과 같이 스크립트를 직접 실행할 수도 있습니다: -
git clone https://github.com/polaris64/web_exploit_detectorcd web_exploit_detectornpm install웹 익스플로잇 탐지기를 NPM 모듈로 설치했다면(위 참조), 웹 루트(웹사이트 파일의 위치) 경로를 전달하여 다음 명령을 실행하는 것만으로 스캐너를 실행할 수 있습니다: -
wed-scanner --webroot=/var/www/html
다른 명령줄 옵션도 사용할 수 있으며, wed-scanner --help를 실행하면 해당 옵션을 설명하는 도움말 메시지를 확인할 수 있습니다.
이렇게 스크립트를 실행하면 사람이 읽을 수 있는 출력이 콘솔에 표시됩니다. 예를 들어 cron과 함께 스크립트를 실행할 때 매우 유용한데, 스크립트가 실행될 때마다 출력을 이메일로 보낼 수 있기 때문입니다.
또한 스크립트는 이후 처리를 위해 결과를 컴퓨터가 처리하기 쉬운 JSON 형식으로 작성하는 것도 지원합니다. 이 출력을 활성화하려면 --output 명령줄 인수를 참조하세요.
다음과 같이 node를 통해 스크립트를 호출하고 웹 루트 경로를 전달하기만 하면 됩니다: -
node index.js --webroot=/var/www/html
웹 익스플로잇 탐지기에는 예상치 못하게 변경되었을 수 있는 파일을 식별하는 데 도움이 되는 두 가지 유틸리티도 포함되어 있습니다. 사이트에 대한 성공적인 공격은 일반적으로 파일 삭제, 새 파일 추가 또는 기존 파일의 변경을 수반합니다.
이 유틸리티에서 사용하는 스냅샷은 스냅샷이 생성된 시점의 모든 파일과 해당 파일 내용에 대한 설명을 나열하는 JSON 파일입니다. 예를 들어 월요일에 스냅샷을 생성했는데 화요일에 사이트가 공격을 받았다면, 이후 이 스냅샷과 현재 사이트 파일을 비교하여 하나 이상의 파일이 추가, 삭제 또는 변경되었는지 확인할 수 있습니다. 따라서 이러한 유틸리티의 목표는 스냅샷을 생성하고 필요할 때 비교를 수행할 수 있게 하는 것입니다.
스냅샷은 각 파일 경로와 함께 파일 내용의 SHA-256 해시를 저장합니다. 해시(또는 다이제스트)는 메시지의 작은 요약으로, 여기서는 파일의 내용에 해당합니다. 파일 내용이 아주 사소한 방식으로라도 변경되면 해시는 완전히 달라집니다. 이는 파일 내용의 모든 변경 사항을 탐지하는 좋은 방법을 제공합니다.
다음 두 가지 유틸리티도 웹 익스플로잇 탐지기의 일부로 설치됩니다: -
wed-generate-snapshot: 이 유틸리티는 "--webroot"로 지정된 디렉터리의 모든 파일(재귀적으로)에 대한 스냅샷을 생성할 수 있게 해줍니다. 스냅샷은 "--output" 옵션에 지정된 파일로 저장됩니다.wed-compare-snapshot: 스냅샷이 생성되면 동일한 디렉터리의 현재 내용과 비교할 수 있습니다. 확인할 스냅샷은 "--snapshot" 옵션으로 지정합니다. 비교 기준이 되는 기본 디렉터리는 스냅샷 내에 저장되지만, 스냅샷 생성 이후 기본 디렉터리가 변경된 경우 --webroot 옵션을 사용할 수 있습니다.스냅샷은 필요한 만큼 자주 생성할 수 있지만, 일반적인 기준으로는 사이트가 깨끗한(감염되지 않은) 상태일 때와 합법적인 변경이 이루어졌을 때 생성해야 합니다. WordPress와 같은 CMS 기반 사이트의 경우 새 업로드로 인해 저장된 스냅샷과 새 상태가 달라지므로 스냅샷을 정기적으로 생성해야 합니다. 파일이 절대 변경되어서는 안 되는 사이트의 경우 단일 스냅샷을 생성한 후, 실제로 아무것도 변경되지 않았는지 확인하는 데 무기한 사용할 수 있습니다.
src/web-exploit-detector.js 스크립트는 규칙 집합을 rules로 내보내는 ES6 모듈이며, 여러 함수도 함께 내보냅니다: -
executeTests(settings): 전달된 settings 객체를 기반으로 익스플로잇 검사기를 실행합니다. 사용법은 index.js 스크립트를 참조하세요.formatResult(result): executeTests()가 반환한 배열에서 단일 테스트 result를 가져와 해당 테스트에 대한 출력 준비가 된 결과 문자열을 생성합니다.getFileList(path): readDirRecursive()를 사용하여 기본 path의 파일 배열을 반환합니다.processRulesOnFile(file, rules): 배열 rules의 모든 규칙을 단일 file(문자열 경로)에 대해 처리합니다.readDirRecursive(path): path와 하위 디렉터리의 모든 파일 배열로 resolve되는 Promise를 반환하는 재귀 함수입니다.src/cli.js 스크립트는 wed-scanner 스크립트에서 사용하는 이 모듈의 간단한 명령줄 인터페이스(CLI)이므로, 이 스크립트를 읽어 보면 이 모듈을 사용할 수 있는 한 가지 방법을 알 수 있습니다.
이 프로젝트는 Babel을 사용하여 "src"의 ES6 모듈을 "lib"의 일반 JavaScript 모듈로 컴파일합니다. 이전 버전의 Node.js를 실행 중이라면 "lib" 디렉터리에서 모듈을 require()'d로 사용할 수 있습니다.
이 패키지에는 Babel이 dev-dependency로 포함되어 있으며 "build" 및 "watch:build" 스크립트가 포함되어 있습니다. "build" 스크립트(npm run build)를 실행하면 "./src"의 ES6 모듈이 컴파일되어 "./lib"에 저장되며, CLI 스크립트에 포함됩니다.
"./lib" 디렉터리는 저장소에 포함되어 있으므로, 사용자는 dev-dependencies를 설치하고 애플리케이션을 빌드하지 않고도 저장소를 클론하여 애플리케이션을 직접 실행할 수 있습니다.
때때로 규칙, 특히 suspicion 태그가 붙은 규칙은 깨끗한 파일을 잠재적 익스플로잇으로 식별합니다. 이 때문에 특정 규칙에 대한 검사에서 파일을 제외할 수 있는 시스템도 포함되어 있습니다.
wed-results-to-exceptions 스크립트는 기본 탐지기 스크립트의 출력 파일(--output 옵션 참조)을 받아 각 특정 규칙에 대해 각 파일을 하나씩 차례로 제외할지 선택할 수 있게 해줍니다. 제외된 모든 파일은 wed-exceptions.json(사용자 홈 디렉터리에 있는) 파일에 저장되며, 기본 스크립트가 스캔을 실행하기 전에 이 파일을 읽습니다. 이 파일에 나열된 파일을 검사할 때는 연결된 모든 규칙(ID 기준)이 건너뛰어집니다.
사용법은 wed-results-to-exceptions를 실행하기만 하면 됩니다. 먼저 --output 옵션을 사용하여 기본 탐지기를 이전에 실행한 유효한 출력 JSON이 있어야 합니다.
Git 저장소에서 직접 작업하는 사용자는 프로젝트 루트 디렉터리에서 node results_to_exceptions.js를 실행하세요.
애플리케이션은 실행 시 로드되는 "규칙" 모음을 사용하여 작동합니다. 각 규칙은 ID, 이름, 설명, URL 목록, 태그, 더 이상 사용되지 않음(deprecation) 플래그, 그리고 가장 중요한 테스트 집합으로 구성됩니다.
각 개별 테스트는 다음 중 하나여야 합니다: -
다음 테스트 유형이 지원됩니다: -
웹 기반 익스플로잇은 지속적으로 진화하고 새로운 익스플로잇이 계속 만들어지기 때문에 규칙 집합도 업데이트해야 합니다. 저는 여러 웹사이트를 호스팅하면서 새로운 유형의 익스플로잇을 끊임없이 관찰하고 있으므로, 가능할 때마다 규칙 집합에 추가할 예정입니다. 저는 이 도구를 제 서버에서 직접 실행하므로, 당연히 가능한 한 기능적으로 만들고 싶습니다!
이것이 제가 이 애플리케이션을 오픈소스 프로젝트로 공개한 이유와도 연결됩니다: 첫째, 여러분과 다른 사람들이 혜택을 받을 수 있도록 하기 위함이고, 둘째, 애플리케이션이 항상 최신 상태를 유지하도록 우리 모두가 탐지 규칙을 기여하기 위해 협력할 수 있기 때문입니다.
이 도구로 탐지되지 않는 익스플로잇을 발견했다면 저에게 연락하여 알려주시거나, 더 좋은 방법으로 직접 규칙을 작성하여 서드파티 규칙 집합(rules/third-party/index.js)에 추가한 후 풀 리퀘스트를 보내주세요.
직접 규칙을 작성하는 방법을 모르더라도 걱정하지 마세요. 가장 중요한 것은 규칙이 추가되는 것이므로, 익스플로잇에 대해 가능한 한 많은 정보를 보내주시면 제가 직접 규칙을 만들어 보겠습니다.
규칙은 분류되어 있지만, 자신만의 규칙을 추가하는 가장 간단한 방법은 위에서 언급한 서드파티 규칙 집합에 추가하는 것입니다. 규칙 ID는 "author:type:sub-type(s):rule-id" 형식으로 작성됩니다. 예를 들어, 제 규칙 중 하나는 "P64:php:cms:wordpress:wso_webshell"입니다. "P64"는 저(작성자)를 의미하고, "php:cms:wordpress"는 그룹(WordPress라는 콘텐츠 관리 시스템(CMS)에 대한 PHP 전용 규칙)이며, "wso_webshell"은 특정 규칙 ID입니다. 자신만의 규칙을 작성할 때는 이 형식을 따르고 "P64"를 자신의 GitHub 사용자 이름이나 다른 고유 ID로 바꾸세요.
이 프로젝트에는 npm test로 실행할 수 있는 Jasmine 테스트 세트가 포함되어 있습니다. 또한 ESLint 구성이 포함되어 있으며, ESLint는 npm run lint로 실행할 수 있습니다.
개발 중에는 npm run watch:test를 실행하여 소스 파일이 변경될 때마다 테스트를 실행할 수도 있습니다. 테스트와 ESLint를 실행하려면 npm run watch:all 스크립트를 사용할 수 있습니다.
참고: 이미 Jasmine 및/또는 nodemon이 설치되어 있지 않다면, dev-dependencies가 설치되도록 비프로덕션 모드로 npm install을 실행해야 합니다.
1.1.0에 추가된 디렉터리 스냅샷 기능을 제안하고 곧 추가될 새 규칙을 제안해 준 Reddit 사용자 mayupvoterandomly에게 감사드립니다.
ISC License
Copyright (c) 2017, Simon Pugnet
이 소프트웨어를 어떠한 목적으로든 유료 또는 무료로 사용, 복사, 수정 및/또는 배포할 수 있는 권한은 위의 저작권 고지와 이 허가 고지가 모든 사본에 포함된다는 조건 하에 이로써 부여됩니다.
이 소프트웨어는 "있는 그대로" 제공되며, 저자는 상품성 및 특정 목적에의 적합성에 대한 묵시적 보증을 포함한 이 소프트웨어에 관한 모든 보증을 부인합니다. 어떠한 경우에도 저자는 이 소프트웨어의 사용 또는 성능과 관련하여 또는 이로 인해 발생하는, 계약, 과실 또는 기타 불법 행위에 의한 것이든, 특별, 직접, 간접 또는 결과적 손해나 사용, 데이터 또는 이익의 손실로 인한 어떠한 손해에 대해서도 책임을 지지 않습니다.