MotionEye: LFI → pass-the-hash admin → 안전하지 않은 복원 → unauth action exec(RCE)
MotionEye의 다단계 체인은 원격 코드 실행으로 이어집니다. 체인은 다음을 결합합니다.
/action/<id>/<action>을 통한 인증되지 않은 작업 실행.일반 사용자 비밀번호가 설정되지 않은 경우, 체인은 인증되지 않은 RCE가 됩니다. 일반 비밀번호가 존재하는 경우 일반 사용자는 계속해서 관리자 에스컬레이션 및 RCE를 달성할 수 있습니다.
사진/<id>/다운로드파일:
motioneye/motioneye/handlers/picture.py → download() (로컬 모션 카메라 분기)motioneye/motioneye/mediafiles.py → get_media_content()문제: get_media_content()는 ..만 차단한 다음 target_dir을 path와 결합합니다. 절대 경로(예: /etc/hosts)는 조인을 우회하고 직접 읽습니다.
파일: motioneye/motioneye/handlers/base.py → get_current_user()
문제: 서명 확인에서는 관리자 비밀번호 해시(SHA1)를 키로 사용하여 계산된 서명을 허용합니다. 해시가 LFI를 통해 유출된 경우 일반 텍스트 비밀번호 없이 관리자 액세스를 얻을 수 있습니다.
파일: motioneye/motioneye/config.py → restore()
문제: tar zxC CONF_PATH는 항목을 삭제하지 않고 사용자 제공 데이터에 사용됩니다. 제작된 tar는 실행 파일을 CONF_PATH에 드롭할 수 있습니다.
파일: motioneye/motioneye/handlers/action.py → post()
문제: 인증 데코레이터가 없습니다. subprocess.Popen을 사용하여 CONF_PATH에 있는 <action>_<camera_id>를 실행합니다.
/picture/<id>/download/<absolute_path>/picture/1/download/%2Fetc%2Fhosts/etc/motioneye/motion.conf에서 관리자 해시 읽기:
@admin_password <SHA1_HASH>를 포함합니다./config/restore?_username=admin에 대한 서명을 계산합니다.lock_<id>(또는 모든 작업)가 포함된 tar를 실행 파일로 업로드합니다.CONF_PATH에 기록됩니다./action/<id>/lock로컬 테스트에서 삽입된 작업은 마커 파일을 생성했습니다.
/tmp/meye_rce_ok
확인 명령:
docker exec -it Motioneye ls -la /tmp | grep meye_rce_ok
예제 출력:
-rw-r--r-- 1 루트 루트 0 ... /tmp/meye_rce_ok
netcam_url, videodevice).picture/<id>/download에 접근 가능:
@normal_password가 비어 있으면 인증되지 않음(일부 설치에서는 기본값).get_media_content() 및 get_media_path()에서 절대 경로를 차단합니다..., 심볼릭 링크, 비정규 파일을 거부합니다.ActionHandler에 대한 인증 필요(관리자 전용).왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 98.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 98.00 |
VPI 공식 vpi-v1 기준