Upgrade Header Smuggling

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°

H2C Smuggling

HTTP2 Over Cleartext (H2C)

H2C, λ˜λŠ” http2 over cleartext, ν‘œμ€€ HTTP 연결을 지속적인 μ—°κ²°λ‘œ μ—…κ·Έλ ˆμ΄λ“œν•˜μ—¬ μΌμ‹œμ μΈ HTTP μ—°κ²°μ˜ κ·œλ²”μ—μ„œ λ²—μ–΄λ‚©λ‹ˆλ‹€. 이 μ—…κ·Έλ ˆμ΄λ“œλœ 연결은 평문 HTTP의 단일 μš”μ²­ νŠΉμ„± λŒ€μ‹  지속적인 톡신을 μœ„ν•΄ http2 이진 ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

λ°€μˆ˜ 문제의 핡심은 λ¦¬λ²„μŠ€ ν”„λ‘μ‹œμ˜ μ‚¬μš©μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€. 일반적으둜 λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλŠ” HTTP μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  λ°±μ—”λ“œλ‘œ μ „λ‹¬ν•˜λ©°, κ·Έ ν›„ λ°±μ—”λ“œμ˜ 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ HTTP μš”μ²­μ— Connection: Upgrade 헀더가 ν¬ν•¨λ˜μ–΄ μžˆμ„ λ•Œ(μ›Ήμ†ŒμΌ“ μ—°κ²°μ—μ„œ 일반적으둜 λ³Ό 수 있음), λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 지속적인 연결을 μœ μ§€ν•˜μ—¬ νŠΉμ • ν”„λ‘œν† μ½œμ—μ„œ μš”κ΅¬ν•˜λŠ” 지속적인 κ΅ν™˜μ„ μš©μ΄ν•˜κ²Œ ν•©λ‹ˆλ‹€. H2C μ—°κ²°μ˜ 경우, RFC μ€€μˆ˜λ₯Ό μœ„ν•΄ μ„Έ κ°€μ§€ νŠΉμ • 헀더가 ν•„μš”ν•©λ‹ˆλ‹€:

Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
Connection: Upgrade, HTTP2-Settings

취약점은 연결을 μ—…κ·Έλ ˆμ΄λ“œν•œ ν›„, λ¦¬λ²„μŠ€ ν”„λ‘μ‹œκ°€ κ°œλ³„ μš”μ²­μ„ κ΄€λ¦¬ν•˜μ§€ μ•Šκ²Œ λ˜μ–΄ μ—°κ²° μ„€μ • ν›„ λΌμš°νŒ… μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆλ‹€κ³  κ°€μ •ν•  λ•Œ λ°œμƒν•©λ‹ˆλ‹€. H2C Smuggling을 μ΄μš©ν•˜λ©΄ μš”μ²­ 처리 쀑 적용된 λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ κ·œμΉ™(예: 경둜 기반 λΌμš°νŒ…, 인증 및 WAF 처리)을 μš°νšŒν•  수 있으며, H2C 연결이 μ„±κ³΅μ μœΌλ‘œ μ‹œμž‘λ˜μ—ˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

μ·¨μ•½ν•œ ν”„λ‘μ‹œ

취약점은 λ¦¬λ²„μŠ€ ν”„λ‘μ‹œκ°€ Upgrade 및 λ•Œλ•Œλ‘œ Connection 헀더λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식에 따라 λ‹¬λΌμ§‘λ‹ˆλ‹€. λ‹€μŒ ν”„λ‘μ‹œλŠ” ν”„λ‘μ‹œ 패슀 쀑 μ΄λŸ¬ν•œ 헀더λ₯Ό 본질적으둜 μ „λ‹¬ν•˜μ—¬ H2C μŠ€λ¨ΈκΈ€λ§μ„ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€:

  • HAProxy
  • Traefik
  • Nuster

λ°˜λŒ€λ‘œ, μ΄λŸ¬ν•œ μ„œλΉ„μŠ€λŠ” ν”„λ‘μ‹œ 패슀 쀑 두 헀더λ₯Ό 본질적으둜 μ „λ‹¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λΆˆμ•ˆμ „ν•˜κ²Œ ꡬ성될 수 μžˆμ–΄ Upgrade 및 Connection ν—€λ”μ˜ 필터링 μ—†λŠ” 전달을 ν—ˆμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • AWS ALB/CLB
  • NGINX
  • Apache
  • Squid
  • Varnish
  • Kong
  • Envoy
  • Apache Traffic Server

μ•…μš©

λͺ¨λ“  μ„œλ²„κ°€ H2C μ—°κ²° μ—…κ·Έλ ˆμ΄λ“œμ— ν•„μš”ν•œ 헀더λ₯Ό 본질적으둜 μ „λ‹¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점에 μœ μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ”°λΌμ„œ AWS ALB/CLB, NGINX 및 Apache Traffic Server와 같은 μ„œλ²„λŠ” μžμ—°μŠ€λŸ½κ²Œ H2C 연결을 μ°¨λ‹¨ν•©λ‹ˆλ‹€. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³ , Connection: Upgrade λ³€ν˜•μ„ μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈν•΄ λ³Ό κ°€μΉ˜κ°€ 있으며, μ΄λŠ” Connection ν—€λ”μ—μ„œ HTTP2-Settings 값을 μ œμ™Έν•©λ‹ˆλ‹€. 일뢀 λ°±μ—”λ“œλŠ” ν‘œμ€€μ„ μ€€μˆ˜ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

Caution

proxy_pass URL에 μ§€μ •λœ νŠΉμ • 경둜(예: http://backend:9999/socket.io)와 관계없이, μ„€μ •λœ 연결은 기본적으둜 http://backend:9999둜 μ„€μ •λ©λ‹ˆλ‹€. μ΄λŠ” 이 κΈ°μˆ μ„ ν™œμš©ν•˜μ—¬ ν•΄λ‹Ή λ‚΄λΆ€ μ—”λ“œν¬μΈνŠΈ λ‚΄μ˜ λͺ¨λ“  κ²½λ‘œμ™€ μƒν˜Έμž‘μš©ν•  수 있게 ν•©λ‹ˆλ‹€. λ”°λΌμ„œ proxy_pass URL에 경둜λ₯Ό μ§€μ •ν•˜λŠ” 것은 접근을 μ œν•œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

도ꡬ h2csmuggler by BishopFox 및 h2csmuggler by assetnoteλŠ” H2C 연결을 μ„€μ •ν•˜μ—¬ ν”„λ‘μ‹œκ°€ λΆ€κ³Όν•œ 보호λ₯Ό μš°νšŒν•˜λ €λŠ” μ‹œλ„λ₯Ό μš©μ΄ν•˜κ²Œ ν•˜μ—¬ ν”„λ‘μ‹œλ‘œ 보호된 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•  수 있게 ν•©λ‹ˆλ‹€.

이 취약점에 λŒ€ν•œ μΆ”κ°€ 정보, 특히 NGINX와 κ΄€λ ¨ν•˜μ—¬, 이 상세 λ¦¬μ†ŒμŠ€λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μ›Ήμ†ŒμΌ“ μŠ€λ¨ΈκΈ€λ§

μ›Ήμ†ŒμΌ“ μŠ€λ¨ΈκΈ€λ§μ€ ν”„λ‘μ‹œλ₯Ό 톡해 μ ‘κ·Όν•  수 μžˆλŠ” μ—”λ“œν¬μΈνŠΈμ— HTTP2 터널을 μƒμ„±ν•˜λŠ” 것과 달리, 잠재적인 ν”„λ‘μ‹œ μ œν•œμ„ μš°νšŒν•˜κ³  μ—”λ“œν¬μΈνŠΈμ™€ 직접 ν†΅μ‹ ν•˜κΈ° μœ„ν•΄ μ›Ήμ†ŒμΌ“ 터널을 μ„€μ •ν•©λ‹ˆλ‹€.

μ‹œλ‚˜λ¦¬μ˜€ 1

이 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œλŠ” 곡개 μ›Ήμ†ŒμΌ“ API와 μ ‘κ·Όν•  수 μ—†λŠ” λ‚΄λΆ€ REST APIλ₯Ό μ œκ³΅ν•˜λŠ” λ°±μ—”λ“œκ°€ μ•…μ˜μ μΈ ν΄λΌμ΄μ–ΈνŠΈμ˜ 곡격 λŒ€μƒμ΄ λ©λ‹ˆλ‹€. 곡격은 μ—¬λŸ¬ λ‹¨κ³„λ‘œ μ§„ν–‰λ©λ‹ˆλ‹€:

  1. ν΄λΌμ΄μ–ΈνŠΈλŠ” 잘λͺ»λœ Sec-WebSocket-Version ν”„λ‘œν† μ½œ 버전을 헀더에 ν¬ν•¨ν•˜μ—¬ λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλ‘œ μ—…κ·Έλ ˆμ΄λ“œ μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€. ν”„λ‘μ‹œλŠ” Sec-WebSocket-Version 헀더λ₯Ό κ²€μ¦ν•˜μ§€ λͺ»ν•˜κ³  μ—…κ·Έλ ˆμ΄λ“œ μš”μ²­μ΄ μœ νš¨ν•˜λ‹€κ³  λ―Ώκ³  λ°±μ—”λ“œλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.
  2. λ°±μ—”λ“œλŠ” Sec-WebSocket-Version ν—€λ”μ˜ 잘λͺ»λœ ν”„λ‘œν† μ½œ 버전을 λ‚˜νƒ€λ‚΄λŠ” μƒνƒœ μ½”λ“œ 426으둜 μ‘λ‹΅ν•©λ‹ˆλ‹€. λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλŠ” λ°±μ—”λ“œμ˜ 응닡 μƒνƒœλ₯Ό κ°„κ³Όν•˜κ³  μ›Ήμ†ŒμΌ“ 톡신 μ€€λΉ„κ°€ μ™„λ£Œλ˜μ—ˆλ‹€κ³  κ°€μ •ν•˜λ©° ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 응닡을 μ „λ‹¬ν•©λ‹ˆλ‹€.
  3. 결과적으둜 λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ λ°±μ—”λ“œ 간에 μ›Ήμ†ŒμΌ“ 연결이 μ„€μ •λ˜μ—ˆλ‹€κ³  잘λͺ» 믿게 되며, μ‹€μ œλ‘œλŠ” λ°±μ—”λ“œκ°€ μ—…κ·Έλ ˆμ΄λ“œ μš”μ²­μ„ κ±°λΆ€ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  ν”„λ‘μ‹œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ λ°±μ—”λ“œ 간에 μ—΄λ¦° TCP λ˜λŠ” TLS 연결을 μœ μ§€ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 이 연결을 톡해 비곡식 REST API에 λ¬΄μ œν•œμœΌλ‘œ μ ‘κ·Όν•  수 있게 ν•©λ‹ˆλ‹€.

영ν–₯을 λ°›λŠ” λ¦¬λ²„μŠ€ ν”„λ‘μ‹œμ—λŠ” 문제λ₯Ό ν•΄κ²°ν•˜μ§€ μ•ŠκΈ°λ‘œ κ²°μ •ν•œ Varnish와 μ—…κ·Έλ ˆμ΄λ“œ λ©”μ»€λ‹ˆμ¦˜μ΄ λ³€κ²½λœ Envoy ν”„λ‘μ‹œ 버전 1.8.0 μ΄ν•˜κ°€ ν¬ν•¨λ©λ‹ˆλ‹€. λ‹€λ₯Έ ν”„λ‘μ‹œλ„ μ·¨μ•½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png

μ‹œλ‚˜λ¦¬μ˜€ 2

이 μ‹œλ‚˜λ¦¬μ˜€λŠ” 곡개 μ›Ήμ†ŒμΌ“ API와 건강 검사λ₯Ό μœ„ν•œ 곡개 REST API, 그리고 μ ‘κ·Όν•  수 μ—†λŠ” λ‚΄λΆ€ REST APIλ₯Ό κ°€μ§„ λ°±μ—”λ“œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. 곡격은 더 λ³΅μž‘ν•˜λ©° λ‹€μŒ λ‹¨κ³„λ‘œ μ§„ν–‰λ©λ‹ˆλ‹€:

  1. ν΄λΌμ΄μ–ΈνŠΈλŠ” 건강 검사 APIλ₯Ό νŠΈλ¦¬κ±°ν•˜κΈ° μœ„ν•΄ POST μš”μ²­μ„ 보내고 μΆ”κ°€ HTTP 헀더 Upgrade: websocket을 ν¬ν•¨ν•©λ‹ˆλ‹€. NGINXλŠ” λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλ‘œμ„œ 이λ₯Ό Upgrade ν—€λ”λ§Œ 기반으둜 ν‘œμ€€ μ—…κ·Έλ ˆμ΄λ“œ μš”μ²­μœΌλ‘œ ν•΄μ„ν•˜κ³  μš”μ²­μ˜ λ‹€λ₯Έ 츑면을 λ¬΄μ‹œν•˜λ©° λ°±μ—”λ“œλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.
  2. λ°±μ—”λ“œλŠ” 건강 검사 APIλ₯Ό μ‹€ν–‰ν•˜κ³  κ³΅κ²©μžκ°€ μ œμ–΄ν•˜λŠ” μ™ΈλΆ€ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜μ—¬ μƒνƒœ μ½”λ“œ 101이 ν¬ν•¨λœ HTTP 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 이 응닡은 λ°±μ—”λ“œμ— μ˜ν•΄ μˆ˜μ‹ λ˜κ³  NGINX둜 μ „λ‹¬λ˜λ©°, ν”„λ‘μ‹œλŠ” μƒνƒœ μ½”λ“œλ§Œ κ²€μ¦ν•˜μ—¬ μ›Ήμ†ŒμΌ“ 연결이 μ„€μ •λ˜μ—ˆλ‹€κ³  잘λͺ» μƒκ°ν•˜κ²Œ λ©λ‹ˆλ‹€.

https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png

κ²½κ³ : 이 기술의 λ³΅μž‘μ„±μ€ μƒνƒœ μ½”λ“œ 101을 λ°˜ν™˜ν•  수 μžˆλŠ” μ—”λ“œν¬μΈνŠΈμ™€ μƒν˜Έμž‘μš©ν•  수 μžˆλŠ” λŠ₯λ ₯을 μš”κ΅¬ν•¨μ— 따라 μ¦κ°€ν•©λ‹ˆλ‹€.

κ²°κ΅­ NGINXλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ λ°±μ—”λ“œ 간에 μ›Ήμ†ŒμΌ“ 연결이 μ‘΄μž¬ν•œλ‹€κ³  믿게 λ©λ‹ˆλ‹€. μ‹€μ œλ‘œλŠ” κ·ΈλŸ¬ν•œ 연결이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©°, 건강 검사 REST APIκ°€ λͺ©ν‘œμ˜€μŠ΅λ‹ˆλ‹€. κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλŠ” 연결을 μ—΄μ–΄ 두어 ν΄λΌμ΄μ–ΈνŠΈκ°€ 이λ₯Ό 톡해 비곡식 REST API에 μ ‘κ·Όν•  수 있게 ν•©λ‹ˆλ‹€.

https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png

λŒ€λΆ€λΆ„μ˜ λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλŠ” 이 μ‹œλ‚˜λ¦¬μ˜€μ— μ·¨μ•½ν•˜μ§€λ§Œ, μ•…μš©μ€ 일반적으둜 μ €μœ„ν—˜ 문제둜 κ°„μ£Όλ˜λŠ” μ™ΈλΆ€ SSRF μ·¨μ•½μ μ˜ μ‘΄μž¬μ— 달렀 μžˆμŠ΅λ‹ˆλ‹€.

μ‹€μŠ΅

두 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•œ μ‹€μŠ΅μ„ ν™•μΈν•˜μ‹­μ‹œμ˜€ https://github.com/0ang3el/websocket-smuggle.git

참고자료

Tip

AWS ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°:HackTricks Training AWS Red Team Expert (ARTE)
GCP ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training GCP Red Team Expert (GRTE) Azure ν•΄ν‚Ή 배우기 및 μ—°μŠ΅ν•˜κΈ°: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks μ§€μ›ν•˜κΈ°