HTTP/2 λ‹€μš΄κ·Έλ ˆμ΄λ“œμ—μ„œμ˜ μš”μ²­ μŠ€λ¨ΈκΈ€λ§

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 μ§€μ›ν•˜κΈ°

HTTP/2λŠ” 일반적으둜 각 DATA ν”„λ ˆμž„μ˜ 길이가 λͺ…μ‹œμ μ΄κΈ° λ•Œλ¬Έμ— 고전적인 μš”μ²­ μŠ€λ¨ΈκΈ€λ§μ— 면역이 μžˆλ‹€κ³  μ—¬κ²¨μ§‘λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν”„λ‘ νŠΈμ—”λ“œ ν”„λ‘μ‹œκ°€ μš”μ²­μ„ HTTP/1.x둜 β€œλ‹€μš΄κ·Έλ ˆμ΄λ“œβ€ν•˜μ—¬ λ°±μ—”λ“œλ‘œ μ „λ‹¬ν•˜λ©΄ κ·Έ λ³΄ν˜ΈλŠ” μ‚¬λΌμ§‘λ‹ˆλ‹€. 두 개의 μ„œλ‘œ λ‹€λ₯Έ νŒŒμ„œ(HTTP/2 ν”„λ‘ νŠΈμ—”λ“œμ™€ HTTP/1 λ°±μ—”λ“œ)κ°€ ν•˜λ‚˜μ˜ μš”μ²­μ΄ λλ‚˜λŠ” 지점과 λ‹€μŒ μš”μ²­μ΄ μ‹œμž‘λ˜λŠ” 지점에 λŒ€ν•΄ ν•©μ˜ν•˜λ €κ³  ν•  λ•Œ, λͺ¨λ“  였래된 비동기 트릭이 λ‹€μ‹œ λ‚˜νƒ€λ‚˜λ©° λͺ‡ κ°€μ§€ μƒˆλ‘œμš΄ νŠΈλ¦­λ„ μΆ”κ°€λ©λ‹ˆλ‹€.


λ‹€μš΄κ·Έλ ˆμ΄λ“œκ°€ λ°œμƒν•˜λŠ” 이유

  1. λΈŒλΌμš°μ €λŠ” 이미 HTTP/2λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, λ§Žμ€ λ ˆκ±°μ‹œ μ˜€λ¦¬μ§„ μΈν”„λΌλŠ” μ—¬μ „νžˆ HTTP/1.1만 μ΄ν•΄ν•©λ‹ˆλ‹€.
  2. λ”°λΌμ„œ λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ(CDN, WAF, λ‘œλ“œ λ°ΈλŸ°μ„œ)λŠ” μ—£μ§€μ—μ„œ TLS + HTTP/2λ₯Ό μ’…λ£Œν•˜κ³  λͺ¨λ“  μš”μ²­μ„ HTTP/1.1둜 μž¬μž‘μ„±ν•©λ‹ˆλ‹€.
  3. λ³€ν™˜ λ‹¨κ³„μ—μ„œλŠ” μ˜€λ¦¬μ§„μ΄ λ³Έλ¬Έ 길이λ₯Ό κ²°μ •ν•  수 μžˆλ„λ‘ λ‘˜ λ‹€ Content-Length 및/λ˜λŠ” Transfer-Encoding: chunked 헀더λ₯Ό 생성해야 ν•©λ‹ˆλ‹€.

ν”„λ‘ νŠΈμ—”λ“œκ°€ HTTP/2 ν”„λ ˆμž„ 길이λ₯Ό μ‹ λ’°ν•˜μ§€λ§Œ λ°±μ—”λ“œκ°€ CL λ˜λŠ” TEλ₯Ό μ‹ λ’°ν•  λ•Œ, κ³΅κ²©μžλŠ” 그듀이 λ™μ˜ν•˜μ§€ μ•Šλ„λ‘ κ°•μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


두 κ°€μ§€ μ£Όμš” μ›μ‹œ 클래슀

λ³€ν˜•ν”„λ‘ νŠΈμ—”λ“œ κΈΈμ΄λ°±μ—”λ“œ 길이일반적인 νŽ˜μ΄λ‘œλ“œ
H2.TEHTTP/2 ν”„λ ˆμž„Transfer-Encoding: chunkedμ΅œμ’… 0\r\n\r\n이 μ „μ†‘λ˜μ§€ μ•ŠλŠ” μΆ”κ°€ 청크 λ©”μ‹œμ§€ 본문을 ν¬ν•¨ν•˜μ—¬ λ°±μ—”λ“œκ°€ κ³΅κ²©μžκ°€ μ œκ³΅ν•œ β€œλ‹€μŒβ€ μš”μ²­μ„ κΈ°λ‹€λ¦¬κ²Œ ν•©λ‹ˆλ‹€.
H2.CLHTTP/2 ν”„λ ˆμž„Content-Lengthμ‹€μ œ 본문보닀 μž‘μ€ CL을 μ „μ†‘ν•˜μ—¬ λ°±μ—”λ“œκ°€ 경계λ₯Ό λ„˜μ–΄ λ‹€μŒ μš”μ²­μ„ 읽도둝 ν•©λ‹ˆλ‹€.

이듀은 고전적인 TE.CL / CL.TE와 본질적으둜 λ™μΌν•˜λ©°, 단지 HTTP/2κ°€ νŒŒμ„œ 쀑 ν•˜λ‚˜λ₯Ό λŒ€μ²΄ν•©λ‹ˆλ‹€.


λ‹€μš΄κ·Έλ ˆμ΄λ“œ 체인 식별

  1. TLS ν•Έλ“œμ…°μ΄ν¬μ—μ„œ ALPN μ‚¬μš© (openssl s_client -alpn h2 -connect host:443) λ˜λŠ” curl:
curl -v --http2 https://target

* Using HTTP2κ°€ λ‚˜νƒ€λ‚˜λ©΄ μ—£μ§€κ°€ H2λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 2. HTTP/2λ₯Ό 톡해 μ˜λ„μ μœΌλ‘œ 잘λͺ»λœ CL/TE μš”μ²­μ„ μ „μ†‘ν•©λ‹ˆλ‹€(Burp RepeaterλŠ” 이제 HTTP/2λ₯Ό κ°•μ œν•˜λŠ” λ“œλ‘­λ‹€μš΄μ„ μ œκ³΅ν•©λ‹ˆλ‹€). 응닡이 400 Bad chunk와 같은 HTTP/1.1 였λ₯˜μΈ 경우, μ—£μ§€κ°€ HTTP/1 νŒŒμ„œλ₯Ό μœ„ν•΄ νŠΈλž˜ν”½μ„ λ³€ν™˜ν–ˆλ‹€λŠ” 증거가 λ©λ‹ˆλ‹€.


μ΅μŠ€ν”Œλ‘œμž‡ μ›Œν¬ν”Œλ‘œμš° (H2.TE μ˜ˆμ‹œ)

:method: POST
:path: /login
:scheme: https
:authority: example.com
content-length: 13      # ignored by the edge
transfer-encoding: chunked

5;ext=1\r\nHELLO\r\n
0\r\n\r\nGET /admin HTTP/1.1\r\nHost: internal\r\nX: X
  1. ν”„λ‘ νŠΈμ—”λ“œλŠ” μ •ν™•νžˆ 13λ°”μ΄νŠΈ(HELLO\r\n0\r\n\r\nGE)λ₯Ό 읽고 μš”μ²­μ΄ 끝났닀고 μƒκ°ν•˜λ©° κ·Έλ§ŒνΌμ„ μ˜€λ¦¬μ§„μœΌλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.
  2. λ°±μ—”λ“œλŠ” TE 헀더λ₯Ό μ‹ λ’°ν•˜κ³ , 두 번째 0\r\n\r\n을 λ³Ό λ•ŒκΉŒμ§€ 계속 읽어 곡격자의 두 번째 μš”μ²­(GET /admin …)의 접두사λ₯Ό μ†ŒλΉ„ν•©λ‹ˆλ‹€.
  3. λ‚˜λ¨Έμ§€(GET /admin …)λŠ” ν”Όν•΄μžμ˜ 뒀에 λŒ€κΈ° 쀑인 μƒˆλ‘œμš΄ μš”μ²­μœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.

λ°€λ°˜μž…λœ μš”μ²­μ„ λ‹€μŒμœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€:

  • POST /api/logout으둜 μ„Έμ…˜ 고정을 κ°•μ œν•©λ‹ˆλ‹€.
  • GET /users/1234둜 ν”Όν•΄μž νŠΉμ • λ¦¬μ†ŒμŠ€λ₯Ό νƒˆμ·¨ν•©λ‹ˆλ‹€.

h2c λ°€λ°˜μž… (λͺ…ν™•ν•œ ν…μŠ€νŠΈ μ—…κ·Έλ ˆμ΄λ“œ)

2023λ…„ 연ꡬ에 λ”°λ₯΄λ©΄, ν”„λ‘ νŠΈμ—”λ“œκ°€ HTTP/1.1 Upgrade: h2c 헀더λ₯Ό λͺ…ν™•ν•œ ν…μŠ€νŠΈ HTTP/2λ₯Ό μ§€μ›ν•˜λŠ” λ°±μ—”λ“œλ‘œ μ „λ‹¬ν•˜λ©΄, κ³΅κ²©μžλŠ” HTTP/1.1만 κ²€μ¦λœ μ—£μ§€λ₯Ό 톡해 μ›μ‹œ HTTP/2 ν”„λ ˆμž„μ„ 터널링할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 헀더 μ •κ·œν™”, WAF κ·œμΉ™ 및 심지어 TLS μ’…λ£Œλ₯Ό μš°νšŒν•©λ‹ˆλ‹€.

μ£Όμš” μš”κ΅¬ 사항:

  • μ—£μ§€λŠ” λ‘˜ λ‹€ Connection: Upgrade와 Upgrade: h2cλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  μ „λ‹¬ν•©λ‹ˆλ‹€.
  • μ˜€λ¦¬μ§„μ€ HTTP/2둜 μ¦κ°€ν•˜κ³  μš”μ²­ λŒ€κΈ°μ—΄μ„ κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” μ—°κ²° μž¬μ‚¬μš© 의미λ₯Ό μœ μ§€ν•©λ‹ˆλ‹€.

μ™„ν™”λŠ” κ°„λ‹¨ν•©λ‹ˆλ‹€ – WebSocketsλ₯Ό μ œμ™Έν•˜κ³  μ—£μ§€μ—μ„œ Upgrade 헀더λ₯Ό μ œκ±°ν•˜κ±°λ‚˜ ν•˜λ“œμ½”λ”©ν•©λ‹ˆλ‹€.


μ£Όλͺ©ν•  λ§Œν•œ μ‹€μ œ CVE (2022-2025)

  • CVE-2023-25690 – Apache HTTP Server mod_proxy μž¬μž‘μ„± κ·œμΉ™μ΄ μš”μ²­ λΆ„ν•  및 λ°€λ°˜μž…μ„ μœ„ν•΄ 연결될 수 μžˆμŠ΅λ‹ˆλ‹€. (2.4.56μ—μ„œ μˆ˜μ •λ¨)
  • CVE-2023-25950 – HTX νŒŒμ„œκ°€ νŒŒμ΄ν”„λΌμΈ μš”μ²­μ„ 잘λͺ» μ²˜λ¦¬ν•  λ•Œ HAProxy 2.7/2.6 μš”μ²­/응닡 λ°€λ°˜μž….
  • CVE-2022-41721 – Go MaxBytesHandlerκ°€ 남은 λ³Έλ¬Έ λ°”μ΄νŠΈλ₯Ό HTTP/2 ν”„λ ˆμž„μœΌλ‘œ νŒŒμ‹±ν•˜μ—¬ ν”„λ‘œν† μ½œ κ°„ λ°€λ°˜μž…μ„ κ°€λŠ₯ν•˜κ²Œ ν–ˆμŠ΅λ‹ˆλ‹€.

도ꡬ

  • Burp Request Smuggler – v1.26λΆ€ν„° H2.TE/H2.CL 및 μˆ¨κ²¨μ§„ ALPN 지원을 μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€. ν™•μž₯ μ˜΅μ…˜μ—μ„œ β€œHTTP/2 ν”„λ‘œλΉ™β€μ„ ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
  • h2cSmuggler – Bishop Fox의 Python PoC둜 λͺ…ν™•ν•œ ν…μŠ€νŠΈ μ—…κ·Έλ ˆμ΄λ“œ 곡격을 μžλ™ν™”ν•©λ‹ˆλ‹€:
python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n'
  • curl/hyper – μˆ˜λ™ νŽ˜μ΄λ‘œλ“œ μž‘μ„±: curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target.

λ°©μ–΄ 쑰치

  1. 쒅단 κ°„ HTTP/2 – λ‹€μš΄κ·Έλ ˆμ΄λ“œ λ³€ν™˜μ„ μ™„μ „νžˆ μ œκ±°ν•©λ‹ˆλ‹€.
  2. 길이 μ§„μ‹€μ˜ 단일 좜처 – λ‹€μš΄κ·Έλ ˆμ΄λ“œν•  λ•ŒλŠ” 항상 μœ νš¨ν•œ Content-Lengthλ₯Ό μƒμ„±ν•˜κ³  μ‚¬μš©μž 제곡 Content-Length/Transfer-Encoding 헀더λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
  3. 라우트 전에 μ •κ·œν™” – λΌμš°νŒ…/μž¬μž‘μ„± 둜직 이전에 헀더 μ •ν™” μ μš©ν•©λ‹ˆλ‹€.
  4. μ—°κ²° 격리 – μ‚¬μš©μž 간에 λ°±μ—”λ“œ TCP 연결을 μž¬μ‚¬μš©ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€; β€œμ—°κ²°λ‹Ή ν•˜λ‚˜μ˜ μš”μ²­β€μ€ λŒ€κΈ°μ—΄ 기반 곡격을 무λ ₯ν™”ν•©λ‹ˆλ‹€.
  5. WebSocket이 μ•„λ‹Œ 경우 Upgrade 제거 – h2c 터널링을 λ°©μ§€ν•©λ‹ˆλ‹€.

μ°Έκ³  λ¬Έν—Œ

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 μ§€μ›ν•˜κΈ°