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

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

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

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

도구 디렉토리

카테고리

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

poodle-PoC

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

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Poodle PoC 🐩 🐩 🐩

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

인터넷 및 보안 소프트웨어 클라이언트가 SSL 3.0으로 대체(fallback)되는 것을 이용하는 중간자 공격(man-in-the-middle)입니다.

Poodle 공격은 사용 중인 전송 계층 보안이 SSLv3인 경우 클라이언트가 서버로 보낸 암호화된 데이터를 검색할 수 있게 해줍니다. 하지만 요청을 암호화하는 데 사용된 개인 키를 검색할 수는 없습니다.

imgonline-com-ua-twotoone-luefsrwi2n8iqy

1. 🐩 공격의 개념 🐩

SSLv3 및 CBC 암호 모드

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

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

기본적으로 이것은 단순한 XOR일 뿐입니다. 다음 동영상도 볼 수 있습니다(제 것이 아닙니다) https://www.youtube.com/watch?v=0D7OwYp6ZEc.

SSLv3를 사용하여 HTTPS로 전송된 요청은 AES/DES 및 CBC 모드로 암호화됩니다. TLS 1.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를 악용한 자바스크립트 사용). 그러면 각 요청의 경로와 데이터를 제어할 수 있습니다:

예: 요청 경로에 "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: 암호문에 대한 무결성을 제공하지 않습니다. 메시지를 복호화하기 전까지는 그것이 실제로 정당한 것인지 위조된 것인지 알 수 없기 때문입니다. 평문 무결성. 암호 방식이 가변적(malleable)이라면 메시지를 변경하여 유효하게 보이고 유효한 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입니다. 이 경우 패딩 오류가 발생하지 않으며, 공격자는 다음 연산을 통해 블록 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 -> 사전 요구 사항이 필요 없는 개념 증명(Proof of Concept)
  • parallelization-poodle.py -> 병렬 처리를 사용하는 또 다른 개념 증명(정말 빠름)
  • poodle-exploit.py -> 실제 시나리오를 위한 익스플로잇
1. poodle-poc.py 파일

이 PoC는 공격의 배후에 있는 암호학을 탐구합니다. 이 파일은 공격이 어떻게 작동하는지 간단한 방식으로 이해할 수 있게 해줍니다.

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

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

root@kitploit:~
python3 parallelization-poodle.py

asciicast

3. poodle-exploit.py 파일

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

요구 사항:

  • 클라이언트와 브라우저가 SSLv3 프로토콜 만으로 통신할 수 있는지 확인하십시오. 예를 들어 Firefox에서 security.tls.version.min: 0을 사용하여 SSLv3만 강제합니다. 또는 클라이언트가 TLS도 사용한다면 다운그레이드를 강제할 수 있습니다.
  • 서버가 취약한지 확인하고 testssl.sh 도구를 사용하십시오. image
  • 클라이언트 측에서 자바스크립트를 주입할 수 있는지 확인하십시오(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를 사용하여 취약한 웹사이트에 악성 자바스크립트 코드(poodle.js)를 삽입합니다. Python 스크립트를 실행하고 help를 입력한 다음 search, 마지막으로 active를 입력합니다. 그동안 자바스크립트와의 상호작용은 두 번만 필요합니다(search 및 active 명령).

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

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

전체 공격 영상:

ezgif-3-90a926f34356

Asciinema:

asciicast

기여자

mpgn

라이선스

MIT 라이선스

참고 자료

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