
Cake Fuzzer는 특정 프레임워크를 기반으로 생성된 웹 애플리케이션에서 가양성(false positive)이 매우 적은 상태로 자동으로 지속적으로 취약점을 발견하는 데 도움을 주기 위한 프로젝트입니다.
최신 릴리스: 1.0
라이선스: GNU GPL v3.0
Cake Fuzzer는 특정 프레임워크 기반으로 생성된 웹 애플리케이션에서 가양성(false positive)이 매우 적으면서도 자동으로 지속적으로 취약점을 발견하도록 돕는 프로젝트입니다. 현재는 Cake PHP 프레임워크를 지원하도록 구현되어 있습니다.
연구 과정에 대해 더 자세히 알고 싶다면 이 문서 시리즈를 확인하세요: CakePHP 애플리케이션 사이버보안 연구
다음은 Cake Fuzzer가 발견한 버그 중 일부 목록입니다:
| 제목 | 심각도 | 링크 |
|---|---|---|
| Cerebrate의 블라인드 SQL 인젝션 | 9.8 Critical | https://zigrin.com/advisories/cerebrate-blind-sql-injection/ |
| CRUD 컴포넌트의 SQL 인젝션 | 8.8 High | https://zigrin.com/advisories/misp-sql-injection-in-crud-component/ |
| DOM 기반 XSS | 6.1 Medium | https://zigrin.com/advisories/misp-dom-based-xss/ |
| order 파라미터의 블라인드 SQL 인젝션 | 8.8 High | https://zigrin.com/advisories/misp-blind-sql-injection-in-order-parameter/ |
| 배열 입력 파라미터의 블라인드 SQL 인젝션 | 8.8 High | https://zigrin.com/advisories/misp-blind-sql-injection-in-array-input-parameters/ |
| /Logs/index의 시간 기반 SQL 인젝션 | 7.2 High | https://zigrin.com/advisories/misp-time-based-sql-injection-in-logs-index/ |
웹 애플리케이션에서 자동화된 도구를 사용하여 취약점을 발견하는 일반적인 접근 방식은 다음과 같습니다:
두 방법 모두 단점이 있습니다. SAST는 가양성이 높아 발견된 항목이 취약점이 아니거나 악용 가능한 취약점이 아닌 경우가 많습니다. DAST는 가양성이 적지만 제한된 정보로 인해 발견되는 취약점이 적습니다. 또한 애플리케이션에 대한 약간의 지식과 스캔을 실행하는 사람의 보안 배경이 필요합니다. 이는 종종 애플리케이션별로 맞춤형 스캔 구성이 필요하여 제대로 작동합니다.
Cake Fuzzer 프로젝트는 두 접근 방식의 장점을 결합하고 위에서 언급한 단점을 제거하는 것을 목표로 합니다. 이 접근 방식을 IAST(Interactive Application Security Testing)라고 합니다.
프로젝트의 목표는 다음과 같습니다:
참고: 일부 취약점 클래스는 Cake Fuzzer의 대상이 아니므로 Cake Fuzzer가 이를 탐지할 수 없습니다. 이러한 클래스의 예로는 비즈니스 로직 취약점과 접근 제어 문제가 있습니다.

Drawio: Cake Fuzzer 아키텍처
Cake Fuzzer는 3개의 주요(상당히 독립적인) 서버로 구성되며, 이 서버들이 함께 CakePHP 애플리케이션의 동적 취약점 테스트를 가능하게 합니다.
다른 구성 요소는 다음과 같습니다:
Cake Fuzzer는 IAST(Interactive Application Security Testing) 개념을 기반으로 합니다. 사전 정의된 공격 세트를 포함하며 실행 전에 무작위로 수정됩니다. Cake Fuzzer는 Cake PHP 프레임워크 덕분에 애플리케이션 내부 구조를 알고 있으므로 공격은 애플리케이션의 가능한 모든 진입점에서 실행됩니다.
공격 중에 Cake Fuzzer는 애플리케이션 및 기본 시스템의 다양한 측면을 모니터링합니다:
이러한 정보 소스를 통해 Cake Fuzzer는 더 많은 취약점을 식별하고 더 높은 확신을 가지고 보고할 수 있습니다.
다음 섹션에서는 대상이 CVE-2021-41326에 취약한 구형 MISP v2.4.146인 Cake Fuzzer 개발 환경을 설정하는 단계를 설명합니다.
호스트 운영 체제에서 다음 명령을 실행하여 구형 MISP VM을 다운로드합니다:
cd ~/Downloads # MISP VM을 저장할 위치로 변경
wget https://vm.misp-project.org/MISP_v2.4.146@0c25b72/[email protected] -O MISP.zip
unzip MISP.zip
rm MISP.zip
mv VMware/ MISP-2.4.146
VMWare GUI에서 다음 작업을 수행하여 호스트 OS와 MISP 간 Cake Fuzzer 파일 공유를 준비합니다:
호스트 OS에서 다음 명령을 실행합니다(MISP_IP_ADDRESS를 이전에 기록한 IP 주소로 바꿈):
ssh-copy-id misp@MISP_IP_ADDRESS
ssh misp@MISP_IP_ADDRESS
MISP에 SSH로 접속한 후 다음 명령을 실행하여(MISP 터미널에서) 호스트 OS와 MISP 간 Cake Fuzzer 파일 공유 설정을 완료합니다:
sudo apt update
sudo apt-get -y install open-vm-tools open-vm-tools-desktop
sudo apt-get -y install build-essential module-assistant linux-headers-virtual linux-image-virtual && sudo dpkg-reconfigure open-vm-tools
sudo mkdir /cake_fuzzer # 참고: 이 경로는 계측(패치 중 하나)에 하드코딩되어 있으므로 고정되어 있습니다.
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000 -o max_write=61440
# max_write는 이상한 파일 복사 버그를 수정합니다: https://github.com/vmware/open-vm-tools/issues/437#issuecomment-669663891
ls -l /cake_fuzzer # 모든 것이 정상이면 호스트 OS의 Cake Fuzzer 디렉터리 내용이 표시됩니다. 호스트 OS에서 변경한 사항은 VM에 반영되며 그 반대도 마찬가지입니다.
간단한 테스트를 위해 MISP를 준비합니다(MISP 터미널에서):
CAKE=/var/www/MISP/app/Console/cake
SUDO='sudo -H -u www-data'
$CAKE userInit -q
$SUDO $CAKE Admin setSetting "Security.password_policy_length" 1
$SUDO $CAKE Admin setSetting "Security.password_policy_complexity" '/.*/'
$SUDO $CAKE Password [email protected] admin --override_password_change
마지막으로 Cake Fuzzer 종속성을 설치하고 venv를 준비합니다(MISP 터미널에서):
source /cake_fuzzer/precheck.sh
Cake Fuzzer는 /cake_fuzzer/strategies 폴더 내의 취약점을 스캔합니다.
새로운 공격을 추가하려면 strategies 폴더에 새 new-attack.json 파일을 추가해야 합니다.
각 취약점에는 Scenarios와 Scanners라는 두 가지 주요 필드가 있습니다. Scenarios는 공격 페이로드 기본 양식이 저장되는 곳입니다. 반면 Scanners는 응답, 표준 출력, 표준 오류, 로그 및 결과에 대한 정규식 또는 구문을 감지합니다.
Scenarios에 대한 페이로드 생성페이로드를 생성하려면 먼저 취약점을 이해하고 가능한 적은 수의 페이로드로 이를 감지하는 방법을 알아야 합니다.
시나리오를 구성할 때 가능한 가장 일반적인 페이로드를 생각해야 합니다. 그러나 페이로드가 일반적일수록 가양성을 생성할 가능성이 높아집니다.
시나리오에서 __cakefuzzer__new-attack_§CAKEFUZZER_PAYLOAD_GUID§__와 같은 카나리 값을 사용하는 것이 좋습니다.
카나리 값에는 고정 문자열(예: __cakefuzzer__new-attack_)과 퍼저에 의해 동적으로 변경될 동적 식별자(GUID 부분 §CAKEFUZZER_PAYLOAD_GUID§)가 포함됩니다. 첫 번째 카나리 부분은 페이로드가 Scanners에 의해 감지되도록 하는 데 사용됩니다. 두 번째 카나리 부분인 GUID는 페이로드가 실행될 때마다 의사 난수 값으로 변환됩니다. 따라서 페이로드가 애플리케이션에서 사용하는 매개변수에 주입될 때마다 카나리는 __cakefuzzer__new-attack_8383938__와 같이 변경되며, 여기서 8383938은 다른 모든 공격에서 고유합니다.
Scanners 감지 및 생성스캐너를 생성하려면 먼저 취약점이 트리거될 때 애플리케이션이 어떻게 동작할 수 있는지 이해해야 합니다. response, stderr, logs, files, processes와 같이 사용할 수 있는 몇 가지 스캐너 유형이 있습니다. 각 스캐너는 다른 목적을 제공합니다.
예를 들어 XSS에 대한 스캐너를 구축할 때는 애플리케이션의 HTML 응답에서 취약점의 징후를 찾습니다. ResultOutputScanner 스캐너를 사용하여 카나리 값과 페이로드를 찾을 수 있습니다. 반면 SQL 인젝션 취약점은 오류 로그를 통해 감지될 수 있습니다. 이를 위해 LogFilesContentsScanner와 ResultErrorsScanner를 사용할 수 있습니다.
Scanner 정규식의 마지막 속성은 효율적인 정규식을 생성하는 것입니다. 모든 경우를 매칭하는 .* 또는 .+와 같은 정규식은 사용하지 마십시오. 이러한 정규식은 매우 시간이 많이 소요되며 전체 스캔을 완료하는 데 필요한 시간을 급격히 증가시킵니다.앞서 언급했듯이 효율성은 취약점의 중요한 부분입니다. Scenarios와 Scanners 모두 가능한 적은 요소를 포함해야 합니다. 그 이유는 Cake Fuzzer가 모든 가능한 감지된 경로에서 모든 단일 시나리오를 여러 번 실행하기 때문입니다. 반면 모든 응답, 새 로그 항목 등은 Scanners에 의해 지속적으로 확인됩니다. 많은 매개변수, 경로 및 엔드포인트가 감지되므로 더 많은 페이로드나 Scanner를 사용하면 효율성에 상당한 영향을 미칩니다.
특정 취약점 클래스를 스캔하지 않으려면 strategies 폴더에서 해당 json 파일을 제거하고 데이터베이스를 정리한 후 퍼저를 다시 실행하십시오.
예를 들어 애플리케이션에서 SQL 인젝션 취약점을 스캔하고 싶지 않다면 다음 단계를 수행하십시오:
먼저 이미 준비된 공격 시나리오를 제거합니다. 이를 위해 /cake_fuzzer/databases 폴더 내의 모든 파일을 삭제합니다:
rm /cake_fuzzer/databases/*
그런 다음 /cake_fuzzer/strategies에서 sqlinj.json 파일을 제거합니다:
rm /cake_fuzzer/strategies/sqlinj.json
마지막으로 퍼저를 다시 실행하면 SQL 인젝션 공격 없이 모든 cake_fuzzer 실행 프로세스가 실행됩니다.
git clone https://github.com/Zigrin-Security/CakeFuzzer /cake_fuzzer
경고 Cake Fuzzer는
/cake_fuzzer가 아닌 다른 경로에 있으면 제대로 작동하지 않습니다. 파일 시스템의 루트 디렉터리 아래,/root,/tmp등 옆에 배치해야 합니다.
cd /cake_fuzzer
아직 가상 환경에 들어가지 않았다면 다음을 실행하여 진입:
source /cake_fuzzer/precheck.sh
또는
source venv/bin/activate
cp config/config.example.ini config/config.ini
config/config.ini 구성:
WEBROOT_DIR="/var/www/html" # 테스트 대상 애플리케이션의 `webroot` 디렉터리 경로
CONCURRENT_QUEUES=5 # [선택 사항] 동시에 실행되는 공격 개수
ONLY_PATHS_WITH_PREFIX="/" # [선택 사항] 퍼저는 이 접두사로 시작하는 공격에 대해서만 공격을 생성합니다.
EXCLUDE_PATHS="" # [선택 사항] 퍼저는 이 정규식과 일치하는 모든 경로를 스캔에서 제외합니다. 비어 있으면 모든 경로가 처리됩니다.
PAYLOAD_GUID_PHRASE="§CAKEFUZZER_PAYLOAD_GUID§" # [선택 사항] 공격 직전에 고유 페이로드 ID로 대체되는 내부 키워드
INSTRUMENTATION_INI="config/instrumentation_cake4.ini" # [선택 사항] 애플리케이션의 사용자 정의 계측 경로.
경고 Cake Fuzzer 스캔 중에는 애플리케이션의 여러 기능이 통제되지 않은 방식으로 여러 번 호출됩니다. 이로 인해 애플리케이션이 연결된 외부 서비스에 연결이 발생하고 데이터를 가져오거나 보낼 수 있습니다. 중요한 외부 서비스에 접근할 수 없는 격리된 통제된 환경에서 Cake Fuzzer를 실행하는 것이 좋습니다.
참고 Cake Fuzzer는 블랙홀링, CSRF 보호 및 인증을 우회합니다. 모든 공격을 데이터베이스의 첫 번째 사용자 권한으로 보냅니다. 이 사용자가 가장 높은 권한을 가지고 있는 것이 좋습니다.
애플리케이션은 여러 구성 요소로 구성됩니다.
경고 모든 cake_fuzzer 명령은 루트로 실행해야 합니다.
퍼저를 시작하기 전에 대상 애플리케이션이 완전히 계측되었는지 확인:
python cake_fuzzer.py instrument check
적용되지 않은 변경 사항이 있으면 다음으로 적용:
python cake_fuzzer.py instrument apply
cake fuzzer를 실행하려면 다음을 수행합니다(최소 3개의 별도 터미널을 사용하는 것이 좋습니다):
# 첫 번째 터미널
python cake_fuzzer.py run fuzzer # 공격을 생성하고 QUEUE에 추가하며 새로운 SCANNERS를 등록합니다 (그런 다음 종료)
python cake_fuzzer.py run periodic_monitors # 모니터링 담당 (CTRL+C로 중지하고 스캔 종료 시 종료)
# 두 번째 터미널
python cake_fuzzer.py run iteration_monitors # 모니터링 담당 (CTRL+C로 중지하고 스캔 종료 시 종료)
# 세 번째 터미널
python cake_fuzzer.py run attack_queue # ATTACK QUEUE 시작 (CTRL+C로 중지하고 스캔 종료 시 종료)
# 모든 공격이 실행된 후
python cake_fuzzer.py run registry # 발견된 취약점을 기반으로 `results.json` 생성
참고: 현재 로그(또는 대상 웹 앱의 동적으로 변경되는 다른 파일)의 소유자를 변경할 수 있는 버그가 있습니다. 이로 인해 일반적으로 웹 애플리케이션을 사용할 때 오류가 발생하거나 향후 Cake Fuzzer 실행에서 위음성(false-negative)이 발생할 수 있습니다. MISP의 경우 퍼저를 실행할 때마다 다음을 실행하는 것이 좋습니다:
sudo chown -R www-data:www-data /var/www/MISP/app/tmp/logs/
스캔이 완료되면 계측을 되돌립니다:
python cake_fuzzer.py instrument revert
cake fuzzer를 다시 실행하려면 다음을 수행하십시오:
애플리케이션 로그 삭제 (예를 들어 MISP 로그는 /var/www/MISP/app/tmp/logs에 저장됨)
rm /var/www/MISP/app/tmp/logs/*
/cake_fuzzer/databases 폴더 내의 모든 파일 삭제
rm /cake_fuzzer/databases/*
cake_fuzzer/results.json 파일 삭제 (먼저 이전 스캔 결과를 저장하거나 검토하는 것을 잊지 마십시오)
rm /cake_fuzzer/results.json
마지막으로 3개의 터미널로 이전 실행 프로세스를 다시 따르십시오.
Attack Queue는 데이터베이스에서 실행된 공격을 '실행됨'으로 표시하므로 전체 스위트를 다시 실행하려면 데이터베이스를 제거하고 공격을 다시 추가해야 합니다.
데이터베이스를 제거하기 전에 모니터와 Attack Queue를 중지하십시오.
rm database.db*
python cake_fuzzer.py run fuzzer
python cake_fuzzer.py run attack_queue
이는 이전 로그 파일이 root에 의해 덮어쓰여졌기 때문일 수 있습니다. Cake Fuzzer는 root로 작동하므로 새 로그 파일은 root를 소유자로 생성됩니다. 이를 제거하십시오:
chmod -R a+w /var/www/MISP/app/tmp/logs/*
호스트 시스템과 cake fuzzer를 공유하는 VM을 사용하는 경우 호스트 디렉터리가 게스트 VM에 제대로 연결되었는지 확인하십시오:
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000
Cake Fuzzer는 시스템의 루트 디렉터리 아래에 위치해야 하며 기본 디렉터리 이름은 정확히 cake_fuzzer여야 합니다.
mv CakeFuzzer/ /cake_fuzzer
instrument apply 실행 중 "Patch" 오류계측 프로세스는 Cake Fuzzer 실행 흐름의 일부입니다. instrument apply를 실행한 다음 instrument check를 실행하면 두 명령 모두 동일한 수의 변경 사항이 나와야 합니다.
"patch" 오류가 발생하면 수동으로 패치를 적용하고 문제가 있는 패치 파일을 삭제할 수 있습니다. 패치는 /cake_fuzzer/cakefuzzer/instrumentation/pathces 디렉터리에 있습니다.
설치 또는 실행 중에 Python 종속성 오류가 발생하면 가상 환경으로 전환한 후 수동으로 종속성을 설치하십시오.
먼저 가상 환경으로 전환:
source venv/bin/activate
그런 다음 pip3로 종속성을 설치할 수 있습니다.
pip3 install -r requriments.txt
이 프로젝트는 다음에서 영감을 받았습니다:
이 프로젝트는 다음 기관이 의뢰했습니다: