Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
poodle-PoC — 🐩 Poodle (패딩 오라클 기반 다운그레이드된 레거시 암호화) 공격 CVE-2014-3566 🐩 | Kitploit
도구/GitHubGitHub/mpgn/poodle-poc
Encryption/Decryption ToolsVulnerability AnalysisExploitationWeb SecurityCryptographyPenetration TestingLearning & Education
GitHubmpgn/poodle-poc

poodle-PoC

🐩 Poodle (패딩 오라클 기반 다운그레이드된 레거시 암호화) 공격 CVE-2014-3566 🐩

저장소 보기
265722년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Poodle PoC 🐩 🐩 🐩

Poodle 공격(Padding Oracle On Downgraded Legacy Encryption)의 개념 증명:

man-in-the-middle 익스플로잇으로, 인터넷 및 보안 소프트웨어 클라이언트의 SSL 3.0으로의 폴백을 이용합니다.

Poodle 공격을 통해 클라이언트가 서버로 전송한 암호화된 데이터를 검색할 수 있습니다(단, 사용된 전송 계층 보안이 SSLv3인 경우). 이 공격으로 요청을 암호화하는 데 사용된 개인 키를 검색할 수는 없습니다.

imgonline-com-ua-twotoone-luefsrwi2n8iqy

1. 🐩 공격 개념 🐩

SSLv3 및 CBC 암호화 모드

SSLv3은 데이터를 암호화/복호화하고 보호하기 위한 프로토콜입니다. 여기서는 CBC 암호화 모드 체인닝을 사용합니다. 평문은 암호화 알고리즘(AES, DES, 3DES)에 따라 블록으로 나뉘며 길이는 8 또는 16의 배수입니다. 평문이 길이를 채우지 못하면 누락된 공간을 채우기 위해 패딩이 끝에 추가됩니다. 이 README를 읽기 전에 암호화 및 복호화 이미지를 열어 보시기를 강력히 권장합니다.

암호화복호화
Ci = Ek(Pi ⊕ Ci-1), and C0 = IVPi = Dk(Ci) ⊕ Ci-1, and C0 = IV

기본적으로 이것은 단순한 XOR입니다. 이 비디오도 시청할 수 있습니다(제가 만든 것은 아닙니다) https://www.youtube.com/watch?v=0D7OwYp6ZEc.

SSLv3를 사용하여 HTTPS를 통해 전송되는 요청은 CBC 모드의 AES/DES로 암호화됩니다. TLS1.x와 비교한 SSLv3의 특성은 패딩입니다. SSLv3에서 패딩은 마지막 바이트가 패딩의 길이와 같은 것을 제외하고 무작위 바이트로 채워집니다.

예시:

T|E|X|T|0xab|0x10|0x02 여기서 0xab|0x10|0x02는 패딩입니다.
T|E|X|T|E|0x5c|0x01 여기서 0x5c|0x01는 패딩입니다.

또한 마지막 블록은 패딩의 전체 블록으로 채워질 수 있습니다. 즉, 마지막 블록은 마지막 바이트를 제외하고 무작위 바이트로 가득 찰 수 있습니다.

T|E|X|T|E|0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07 여기서 |0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07는 패딩이며, 0x07만 공격자가 알 수 있습니다. 따라서 공격자가 패딩 블록에 영향을 줄 수 있다면, 마지막 블록의 마지막 바이트가 블록의 길이와 같다는 것을 알 수 있습니다.

패딩에 영향 주기

공격자는 피해자에게 요청을 보내도록 할 수 있어야 합니다(예: XSS를 악용하여 JavaScript 사용). 그런 다음 각 요청의 경로와 데이터를 제어할 수 있습니다:

예시: 요청 경로에 "A" 바이트 추가

root@kitploit:~
GET / HTTP/1.1\r\nSECRET COOKIE\r\n\r\n
GET /AAA HTTP/1.1\r\nSECRET COOKIE\r\n\r\nDATA

이 기술로 패딩에 영향을 줄 수 있습니다.

HMAC

SSLv3는 또한 평문의 무결성과 인증을 확인하기 위해 HMAC을 사용합니다.

키 해시 메시지 인증 코드(HMAC)는 암호화 해시 함수(따라서 'H')와 비밀 암호화 키를 결합한 특정 유형의 메시지 인증 코드(MAC)입니다.

이를 통해 공격자는 요청을 가로채서 변경한 후 다시 보낼 수 없습니다. 서버에 문제가 발생하면 HMAC 오류를 보냅니다.

MAC-Then-Encrypt

SSLv3 프로토콜은 다음 루틴을 사용합니다: 클라이언트로부터 데이터를 받아 복호화하고 HMAC으로 무결성을 확인합니다.

MAC-Then-Encrypt: 암호문에 대한 무결성을 제공하지 않습니다. 메시지가 실제로 진짜인지 위조된 것인지 복호화할 때까지 알 수 있는 방법이 없기 때문입니다. 평문 무결성. 암호 체계가 가변적이라면 메시지를 변경하여 유효하게 보이고 유효한 MAC을 가질 수 있습니다. 이는 실질적으로 MAC 비밀이 보호를 제공해야 하므로 이론적인 지점입니다. 여기서 MAC은 평문에 대한 정보도 제공할 수 없습니다. 암호화되어 있기 때문입니다.

https://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac

이는 서버가 알지 못하게 암호문을 변경할 수 있음을 의미합니다. 정말 좋습니다. :)

2. 🔑 암호학 🔑

먼저 마지막 블록이 패딩으로 가득 차야 합니다. 이전에 본 것처럼 공격자는 요청 경로를 사용하고 요청 길이를 확인합니다.

  • 원래 암호문의 길이를 저장합니다.
  • 경로에 1바이트를 추가하고 길이를 확인합니다.
    • 길이가 변하지 않으면 다른 바이트를 추가하는 식으로 진행합니다.
    • 그 외: 암호화된 요청의 길이가 변경되면 마지막 블록이 패딩으로 가득 찬 것을 알 수 있습니다.

마지막 블록은 마지막 바이트를 제외하고 무작위 바이트로 가득 차 있으므로, 이 마지막 블록 Cn을 복호화하려는 블록 Ci로 대체할 수 있습니다. 변경된 요청이 서버로 전송됩니다.

서버:

  • 마지막 바이트의 길이에 따라 패딩을 제거합니다.
  • 요청에서 HMAC을 가져옵니다 = HMAC
  • 평문을 가져옵니다.
  • hmac(plaintext)와 HMAC을 비교합니다.
    • 같으면 => 좋은 패딩
    • 다르면 => 잘못된 패딩

마지막 블록을 대체함으로써 공격자는 마지막 블록의 마지막 바이트(패딩의 길이)도 변경합니다. 대체된 패딩 블록의 마지막 바이트가 원본과 같을 확률은 1/256입니다. 이 경우 패딩 오류가 발생하지 않으며, 공격자는 다음 XOR 연산을 사용하여 블록 Ci의 마지막 바이트를 검색할 수 있습니다:

Pn = Dk(Cn) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
xxxxxxx7 = Dk(Ci) ⊕ Cn-1
Dk(Ci) = xxxxxxx7 ⊕ Cn-1
Pi ⊕ Ci-1 = xxxxxxx7 ⊕ Cn-1
Pi = Ci-1 ⊕ xxxxxxx7 ⊕ Cn-1

(xxxxxxx7 또는 xxxxxxx15 및 x 무작위 바이트)

블록의 마지막 바이트를 검색할 수 있습니다: Pi[7] = Ci-1[7] ⊕ xxxxxxx7 ⊕ Cn-1[7] 패딩의 경우 공격자는 SSL 세션을 닫아 다른 핸드셰이크(새 AES 키)를 수행하고 새로운 암호문을 얻은 다음 마지막 블록을 대체해야 합니다(일반적으로 300회 이상의 핸드셰이크 필요).

한 바이트가 검색되면 경로에 바이트를 추가하고 데이터에서 한 바이트를 제거하여 블록의 다른 모든 바이트를 얻습니다.

바이트 E,I,K,O를 검색하기 위한 요청
GET /a SECRET_COOKIE dataazerty PADDING_7
GET /aa SECRET_COOKIE dataazert PADDING_7
GET /aaa SECRET_COOKIE dataazer PADDING_7
GET /aaaa SECRET_COOKIE dataaze PADDING_7

TLS1.0에 관하여

TLS 사양에서는 서버가 패딩을 확인하도록 요구하지만, 일부 구현에서는 제대로 검증하지 않아 SSL 3.0을 비활성화하더라도 일부 서버가 POODLE에 취약해집니다.

TLS는 일반적으로 Poodle에 안전하지만, 일부 구현에서는 패딩을 확인하지 않아 SSLv3를 사용하는 것과 같습니다. 이것이 일부 TLS 버전이 취약한 이유입니다.

3. 💥 공격 시작 💥

이 저장소에는 세 개의 파일이 있습니다:

  • poodle-poc.py -> 사전 요구 사항이 필요 없는 개념 증명
  • parallelization-poodle.py -> 병렬 처리를 사용하는 또 다른 개념 증명(매우 빠름)
  • poodle-exploit.py -> 실제 시나리오를 위한 익스플로잇
1. poodle-poc.py 파일

이 PoC는 공격의 암호학적 원리를 탐구합니다. 이 파일을 통해 공격이 간단한 방식으로 어떻게 작동하는지 이해할 수 있습니다.

root@kitploit:~
python3 poodle-poc.py
2. parallelization-poodle.py 파일

parallelization-poodle.py 파일은 프로젝트이자 아이디어입니다. :) https://github.com/mpgn/poodle-PoC/issues/1 확인

root@kitploit:~
python3 parallelization-poodle.py

asciicast

3. poodle-exploit.py 파일

이것이 실제 익스플로잇입니다. 오래된 서버와 브라우저를 사용하는 고객을 대상으로 침투 테스트 중 Poodle 공격에 대한 개념 증명을 만들고 싶다면 매우 유용합니다. 악성 프록시의 IP를 올바른 포트와 함께 브라우저 구성에 설정하면 프록시가 나머지를 처리합니다.

필요 사항:

  • 클라이언트와 브라우저가 SSLv3 프로토콜 만 사용하여 통신할 수 있는지 확인하세요. 예를 들어 Firefox에서 security.tls.version.min: 0을 사용하여 SSLv3만 강제합니다. 또는 클라이언트가 TLS도 사용하는 경우 다운그레이드를 강제할 수 있습니다.
  • 서버가 취약한지 확인하세요. testssl.sh 도구를 사용하세요. image
  • 클라이언트 측에 JavaScript를 주입할 수 있는지 확인하세요 (XSS)
  • 클라이언트와 서버 간의 연결을 가로챌 수 있는지 확인하세요

💀 위 사전 요구 사항을 충족하면 공격을 시작할 수 있습니다 💀:

이 익스플로잇에는 두 가지 옵션이 있습니다:

  1. 클라이언트 측에 프록시의 IP 주소와 포트를 직접 설정하고 익스플로잇을 실행합니다 (3번 부분으로 이동)
  2. ARP 스푸핑 공격을 설정하여 클라이언트와 서버 간의 모든 트래픽을 자신의 머신으로 리디렉션합니다
  • 포워딩을 활성화하고 Iptable 규칙을 설정하여 클라이언트의 트래픽을 프록시로 리디렉션합니다
root@kitploit:~
$> echo 1 > /proc/sys/net/ipv4/ip_forward
$> iptables -i vmnet1 -t nat -A PREROUTING -p tcp --dport 1337 -j REDIRECT --to-ports 1337
  • arpspoof, ettercap 또는 bettercap 도구를 사용하여 ARP 스푸핑 공격을 실행합니다
root@kitploit:~
$> bettercap -iface vmnet1
net.show
set arp.spoof.internal true
arp.spoof on
  1. 프록시 실행
root@kitploit:~
⋊> ~/T/poodle-Poc on master ⨯ python3 poodle-exploit.py -h              13:10:24
usage: poodle-exploit.py [-h] [--start-block START_BLOCK]
                         [--stop-block STOP_BLOCK] [--simpleProxy SIMPLEPROXY]
                         proxy port server rport

Poodle Exploit by @mpgn_x64

positional arguments:
  proxy                 ip of the proxy
  port                  port of the proxy
  server                ip of the remote server
  rport                 port of the remote server

optional arguments:
  -h, --help            show this help message and exit
  --start-block START_BLOCK
                        start the attack at this block
  --stop-block STOP_BLOCK
                        stop the attack at this block
  --simpleProxy SIMPLEPROXY
                        Direct proxy, no ARP spoofing attack

$> python3 poodle-exploit.py 192.168.13.1 4443 192.168.13.133 443 --start-block 46 --stop-block 50

블록 선택: 블록 옵션을 지정하지 않으면 모든 블록이 복호화되지만 시간이 오래 걸릴 수 있습니다. 요청이 어떻게 구성될지 '알고' 있다면 request-splitter.py 스크립트를 사용하여 복호화하려는 블록(이상적으로는 쿠키 블록!)을 파악하는 것이 좋습니다.

그런 다음 XSS 등을 사용하여 취약한 웹사이트에 악성 JavaScript 코드(poodle.js)를 삽입합니다. Python 스크립트를 실행하고 help를 입력한 다음 search, 마지막으로 active를 입력합니다. 그동안 JavaScript와의 상호 작용은 두 번만 필요합니다(search 및 active 명령).

업데이트 2018/01/04: 익스플로잇에 다운그레이드 옵션이 추가되었습니다. 익스플로잇이 TLS 프로토콜을 감지하면 downgrade 명령을 입력하여 SSLv3.0으로 다운그레이드합니다.

작동 방식: 핸드셰이크 중(헬로 클라이언트 이후) 익스플로잇이 handshake_failure 15030000020228을 보내면 브라우저는 기본 프로토콜로 SSLv3.0을 사용하여 다시 헬로 클라이언트를 보내야 합니다. Chrome 버전 15에서 테스트했지만 Firefox에서는 작동하지 않습니다(프로토콜 재협상을 지원하지 않는 것으로 보입니다). #4 확인

익스플로잇 전체 영상:

ezgif-3-90a926f34356

Asciinema:

asciicast

기여자

mpgn

라이선스

licence MIT

참고 자료

  • https://en.wikipedia.org/wiki/POODLE
  • https://www.openssl.org/~bodo/ssl-poodle.pdf
도구 다운로드