
MacStealer: Wi-Fi 클라이언트 격리 우회
이 저장소에는 MacStealer가 포함되어 있습니다. 이 도구는 Wi-Fi 네트워크에서 클라이언트 격리 우회(client isolation bypass) 를 테스트할 수 있습니다 (CVE-2022-47522). 이 공격은 클라이언트들이 서로 통신하지 못하도록 차단된 경우에도 MAC 계층에서 다른 클라이언트로 향하는 트래픽을 가로챌(스틸) 수 있습니다. 이 취약점은 악의적인 내부자가 존재하는 Wi-Fi 네트워크에 영향을 미치며, 이 공격은 AP 격리라고도 불리는 클라이언트 격리를 우회할 수 있습니다. 이 공격은 동적 ARP 검사(DAI)를 우회하는 데에도 사용될 수 있으며, 클라이언트들이 서로를 공격하지 못하게 하는 다른 방법들을 우회하는 데에도 사용될 수 있습니다. 이 공격은 보안 컨텍스트 재정의(security context override) 공격 이라고도 알려져 있습니다. 자세한 내용은 USENIX Security '23 논문의 5절을 참조하세요 (저장소).
영향을 받을 수 있는 네트워크의 구체적인 예는 다음과 같습니다:
사용자들이 서로를 신뢰하지 않을 수 있고, 클라이언트 격리 또는 ARP 검사와 같은 기술을 사용하여 사용자들이 서로를 공격하지 못하도록 하는 엔터프라이즈 네트워크. 예를 들어, 게스트와 직원 모두를 위한 계정이 있는 회사 네트워크, eduroam 및 govroam과 같은 네트워크 등이 있습니다.
Passpoint(이전 명칭 Hotspot 2.0)로 보호되는 공공 핫스팟. 이는 자동으로 안전하게 연결할 수 있는 핫스팟입니다. 예를 들어, 휴대폰의 SIM 카드를 사용하여 원활하게 인증할 수 있습니다.
클라이언트 격리가 활성화된 가정용 WPA2 또는 WPA3 네트워크. 여기에는 게스트 또는 안전하지 않은(IoT) 장치를 위한 별도의 SSID가 있는 네트워크가 포함됩니다. 또한 장치를 추가로 격리하기 위해 여러 비밀번호가 사용되는 네트워크도 포함되며, 이를 Multi-PSK, Identity PSK, per-station PSK, 또는 EasyPSK라고도 합니다. 추가 정보는 위협 모델 논의를 참조하세요.
WPA3 SAE-PK 기반의 공공 핫스팟. 이는 공유된 공개 비밀번호로 보호되는 핫스팟이지만, 공격자는 이 공개적으로 알려진 비밀번호를 남용할 수 없습니다.
이 공격은 VLAN을 우회할 수 없습니다. 즉, 현재 실험에 따르면, 이 공격을 사용하여 다른 VLAN에 있는 장치를 공격할 수 없습니다.
USENIX Security '23의 다른 결과 저장소도 이용할 수 있습니다.
이 공격의 핵심 아이디어는 클라이언트가 인증되는 방식이 패킷이 올바른 Wi-Fi 클라이언트로 라우팅되는 방식과 무관하다는 것입니다. 즉, 인증은 비밀번호, 사용자 이름, 802.1X ID 및/또는 인증서를 기반으로 수행되지만, 클라이언트가 연결되면 패킷 라우팅은 MAC 주소를 기반으로 수행됩니다. 악의적인 내부자는 이를 남용하여 피해자를 연결 해제한 다음 (공격자의 자격 증명을 사용하여) 피해자의 MAC 주소로 연결함으로써 Wi-Fi 클라이언트로 향하는 데이터를 가로챌 수 있습니다. 피해자에게 아직 전송 중이던 패킷(예: 피해자가 아직 로드 중이던 웹사이트 데이터)은 이제 공격자가 대신 수신하게 됩니다.
보다 정확하게는, 공격은 세 단계로 구성됩니다:
피해자가 데이터를 요청하도록 함: 공격자는 먼저 피해자(클라이언트)가 취약한 액세스 포인트(AP)와 Wi-Fi 연결을 수립할 때까지 기다립니다.
피해자가 인터넷의 서버에 요청을 보낼 것이라고 가정합니다. 예를 들어, 피해자는 평문 웹사이트 example.com에 HTTP 요청을 보낼 수 있습니다.
공격자의 목표는 웹사이트가 보낼 응답을 가로채는 것입니다.
피해자의 MAC 주소로 연결: 피해자가 예를 들어 HTTP 요청 패킷을 보내 데이터를 요청한 후, 공격자는 응답이 취약한 AP에 도착하기 전에
피해자를 네트워크에서 강제로 연결 해제합니다. 이 예에서 피해자는 example.com의 응답이 AP에 도착하기 전에 연결이 끊어집니다.
피해자가 연결 해제되면 공격자는 피해자의 MAC 주소를 스푸핑하고 자신의 자격 증명을 사용하여 네트워크에 연결합니다.
즉, 공격자는 자신의 자격 증명(예: 엔터프라이즈 Wi-Fi 네트워크에서 자신의 사용자 이름과 비밀번호)을 사용하여 네트워크에 연결할 수 있는 악의적인 내부자입니다.
응답 가로채기: 공격자가 피해자의 MAC 주소로 연결되면 AP는 공격자가 새로 생성한 암호화 키를 피해자의 MAC 주소와 연결합니다.
그 결과, 서버의 응답이 Wi-Fi 네트워크에 도착하거나 일반적으로 피해자에게 향하는 수신 트래픽이 있으면 라우터는 이러한 수신 패킷을 피해자의
MAC 주소로 전달합니다. 이 예에서 example.com의 응답은 라우터에 의해 피해자의 MAC 주소로 전달됩니다. 그러나 공격자는 현재 이 MAC 주소를 사용하고 있습니다.
즉, AP는 응답을 공격자의 키로 암호화합니다. 다시 말해, 공격자는 피해자에게 아직 전송 중인 대기 트래픽을 수신하게 됩니다.
가로챈 트래픽은 TLS 및 HTTPS와 같은 상위 계층 암호화로 보호될 수 있습니다. 그럼에도 불구하고, 상위 계층 암호화가 사용되는 경우에도 이 공격은 피해자가 통신 중인 IP 주소를 드러냅니다. 이는 피해자가 방문 중인 웹사이트를 드러내며, 그 자체로 민감한 정보가 될 수 있습니다.
기본적으로 이 공격은 피해자가 보낸 트래픽을 가로채지 않으며, 피해자에게 보내지는 트래픽만 가로챌 수 있습니다. 그러나 공격자는 피해자가 보낸 트래픽도 가로채기 위해 후속 공격을 시도할 수 있습니다. 특히, 피해자에게 전달되는 DNS 응답을 가로챔으로써 공격자는 DNS 응답을 스푸핑하고 피해자에게 보내지거나 피해자가 보낸 모든 IP 트래픽을 가로챌 수 있습니다.
위 공격을 수행하는 것은 대상 네트워크에서 클라이언트 격리가 활성화된 경우에만 의미가 있습니다. 그렇지 않고 클라이언트 격리가 비활성화된 경우, 악의적인 내부자는 ARP 스푸핑과 같은 기술을 사용하여 다른 클라이언트를 직접 공격할 수 있습니다 (클라이언트 격리 테스트 참조).
이 공격은 엔터프라이즈 WPA1, WPA2 및 WPA3 네트워크에 대해 동일하게 동작합니다. 이는 이 공격이 Wi-Fi의 암호화 속성을 악용하는 것이 아니라 네트워크가 패킷을 보낼 클라이언트를 결정(즉, 라우팅)하는 방식을 남용하기 때문입니다.
공격에 대한 추가 세부 정보는 논문 Framing Frames: Bypassing Wi-Fi Encryption by Manipulating Transmit Queues의 보안 컨텍스트 재정의 공격(5절)을 참조하세요.
이 공격을 완화하기 위해 AP는 최근에 AP에 연결된 MAC 주소를 사용하여 연결하려는 클라이언트를 일시적으로 차단할 수 있습니다. 이렇게 하면 공격자가 MAC 주소를 스푸핑하여 피해자에게 향하는 대기 중이거나 대기열에 있는 프레임을 가로채는 것을 방지할 수 있습니다. MAC 주소 뒤의 사용자가 변경되지 않았음을 보장할 수 있는 경우, 클라이언트는 즉시 다시 연결하도록 허용할 수 있습니다. 이 검사는 동일한 분산 시스템에 속한 모든 AP, 더 정확하게는 클라이언트가 현재 IP 주소를 유지하면서 로밍할 수 있는 모든 AP에서 수행되어야 합니다.
최근에 연결된 사용자를 안전하게 인식하기 위해 AP는 클라이언트의 MAC 주소와 캐시된 보안 연관(예: 캐시된 PMK) 간의 매핑을 저장할 수 있습니다. 클라이언트는 이 MAC 주소와 연결된 캐시된 보안 연관을 보유하고 있음을 증명함으로써(예: 올바른 캐시된 PMK를 사용하여 연결) 최근에 사용된 MAC 주소로 즉시 (재)연결이 허용될 수 있습니다.
multi-PSK(또는 per-station PSK 또는 Identity PSK라고도 함)를 사용하는 경우, AP는 최근에 연결된 MAC 주소와 사용된 (고유한) 비밀번호의 매핑을 유지할 수 있습니다. 클라이언트가 연결하면 AP는 해당 MAC 주소가 최근에 사용되었는지 확인합니다. 사용되지 않았거나, 사용되었지만 클라이언트가 이전과 동일한 비밀번호를 사용하는 경우 클라이언트는 정상적으로 연결할 수 있습니다. 그러나 동일한 MAC 주소가 다른 비밀번호와 함께 사용되는 경우, 클라이언트는 사전 정의된 시간 동안 대기한 후에야 성공적으로 연결할 수 있습니다.
SAE-PK를 사용하여 핫스팟을 보호하는 경우, MAC 주소가 이전과 동일한 사용자에 의해 재사용되고 있음을 안전하게 인식할 수 있는 유일한 방법은 캐시된 보안 연관(예: MAC 주소와 연결된 캐시된 PMK)에 의존하는 것입니다.
위의 방어책은 일정 시간이 지나면 피해자에게 더 이상 대기 중인 패킷이 도착하지 않는다고 가정합니다. 이 지연 시간 이후의 유출을 방지하려면 클라이언트는 통신하는 서비스와 종단 간 암호화(예: TLS)를 사용해야 합니다.
802.1X EAP 기반 인증을 사용하는 경우, 최근에 연결된 사용자를 안전하게 인식하는 더 나은 대체 방법은 802.1X 인증 중에 사용한 EAP ID를 기반으로 합니다. AP는 클라이언트를 인증한 RADIUS 서버로부터 EAP ID를 안전하게 학습할 수 있으며, 최근에 연결된 MAC 주소와 해당 EAP ID의 매핑을 유지할 수 있습니다. 클라이언트가 연결하면 AP는 해당 MAC 주소가 최근에 사용되었는지 확인합니다. 사용되지 않았거나, 사용되었지만 클라이언트가 이전과 동일한 EAP ID를 사용하는 경우 클라이언트는 정상적으로 연결할 수 있습니다. 그러나 동일한 MAC 주소가 다른 EAP ID로 사용되는 경우, 클라이언트는 사전 정의된 시간 동안 대기한 후에야 성공적으로 연결할 수 있습니다.
한 가지 과제는 개인정보 보호 문제로 인해 AP가 클라이언트의 802.1X ID를 항상 알지 못할 수 있다는 것입니다. 예를 들어, 이 정보는 홈 AAA 서버에서만 사용할 수 있고 AP는 RADIUS 서버로부터 Chargeable User Identity만 받을 수 있습니다. 이 ID는 값이 지속적으로 변경될 수 있으므로 AP가 동일한 장치/자격 증명의 두 연결을 인식하는 것을 허용하지 않습니다. AP는 EAP-Response/Identity에서 anonymous@realm과 같은 익명 ID를 수신하며, 이를 사용하여 적어도 서로 다른 영역(realm)의 사용자를 인식할 수 있습니다.
동일한 영역의 사용자들이 서로를 공격하는 것을 방지하면서도 클라이언트의 ID를 AP에 공개하지 않으려면 RADIUS 서버의 협력과 변경이 필요합니다. 특히, RADIUS 서버는 MAC 주소가 최근에 동일한 영역(주어진 로컬 네트워크 내)의 다른 사용자에 의해 사용되었는지 감지하도록 업데이트될 수 있습니다. 그러면 클라이언트가 연결을 끊을 때 RADIUS 서버에 알려야 하며, 이를 통해 MAC 주소가 마지막으로 사용자 중 한 명에 의해 사용된 시점을 알 수 있고, 연결을 시도하는 클라이언트의 MAC 주소를 알려야 합니다.
마지막으로, EAP ID에 의존하는 이 접근 방식은 서로 다른 사용자가 서로를 공격하는 것을 방지하지만, 손상된 장치가 동일한 사용자의 다른 장치를 공격하는 것을 방지하지는 못합니다. 즉, 공격은 서로 다른 사용자 간에만 방지되며 동일한 사용자의 서로 다른 장치 간에는 방지되지 않습니다.
중요한 점은 이 공격이 Wi-Fi 클라이언트로 향하는 패킷을 가로채는 것에만 국한되지 않는다는 것입니다. 공격자는 기본 게이트웨이 또는 로컬 네트워크의 다른 서버의 MAC 주소로 연결을 시도할 수도 있습니다. 이러한 공격을 방지하기 위해 AP 또는 컨트롤러는 클라이언트가 기본 게이트웨이와 동일한 MAC 주소를 사용하는 것을 금지할 수 있습니다. 보다 일반적으로, Wi-Fi 클라이언트가 네트워크에 연결될 때 중복 MAC 주소 감지를 사용하여 Wi-Fi 클라이언트가 네트워크의 다른 장치에서도 사용 중인 MAC 주소를 사용하지 못하도록 할 수 있습니다.
관리 프레임 보호(MFP)를 사용하면 공격이 더 어려워지지만 불가능하지는 않습니다. 이전 연구에서 우리는 MFP가 사용되는 경우에도 클라이언트가 연결 해제/비인증될 수 있는 몇 가지 방법을 발견했습니다. 이 경험에 기반하여, MFP가 사용되는 경우에도 클라이언트를 네트워크에서 강제로 연결 해제할 수 있는 방법은 항상 존재하는 것으로 보입니다. 다시 말해, 연결 해제 및 비인증 공격을 완전히 방지하는 것은 어렵습니다. 그럼에도 불구하고, MFP는 실제 공격을 수행할 때 극복해야 할 추가 장애물이 될 수 있으므로 실제로 공격을 더 어렵게(불가능하지는 않지만) 만드는 유용한 완화 방법이 될 수 있습니다.
예비 실험에 따르면, 이 공격은 서로 다른 VLAN에서는 작동하지 않습니다. 즉, 공격을 수행하는 악의적인 내부자는 피해자와 동일한 VLAN에 있어야 합니다. 따라서 한 가지 완화 방법은 서로 다른 사용자 그룹을 서로 다른 VLAN에 배치하는 것입니다. 그러나 악의적인 내부자는 여전히 동일한 VLAN의 다른 사용자를 공격(즉, 클라이언트 격리 우회)할 수 있습니다.
multi-PSK(일명 per-station PSK 또는 identity PSK)를 사용하는 경우, 클라이언트가 사용하는 비밀번호에 따라 클라이언트를 다른 VLAN에 배치할 수 있습니다. 즉, 각 비밀번호에 대해 VLAN을 사용할 수 있습니다. 이렇게 하면 서로 다른 비밀번호를 가진 클라이언트가 서로를 공격하는 것을 방지할 수 있습니다.
MacStealer 도구는 Linux에서 지원하는 모든 네트워크 카드와 함께 작동합니다. 우리는 Ubuntu 22.04에서 MacStealer를 테스트했습니다. Ubuntu 22.04에 필요한 종속성을 설치하려면 다음을 실행하세요:
sudo apt update
sudo apt install libnl-3-dev libnl-genl-3-dev libnl-route-3-dev libssl-dev \
libdbus-1-dev git pkg-config build-essential net-tools python3-venv \
aircrack-ng rfkill
이제 이 저장소를 클론하고 도구를 빌드하고 가상 python3 환경을 구성합니다:
git clone https://github.com/vanhoefm/macstealer.git macstealer
cd macstealer/research
./build.sh
./pysetup.sh
위 지침은 한 번만 실행하면 됩니다.
git을 사용하여 새 코드를 가져온 후에는 ./build.sh와 ./pysetup.sh를 다시 실행해야 합니다.
MacStealer 업데이트에 대한 자세한 개요는 변경 로그를 참조하세요.
MacStealer를 사용할 때마다 먼저 루트로 가상 python3 환경을 로드해야 합니다. 이는 다음을 사용하여 수행할 수 있습니다:
cd research
sudo su
source venv/bin/activate
이제 네트워크 관리자에서 Wi-Fi를 비활성화해야 합니다.
그래야 MacStealer를 방해하지 않습니다. 선택적으로 sudo airmon-ng check를 사용하여 무선 네트워크 카드를 사용하고 MacStealer를 방해할 수 있는
다른 프로세스가 있는지 확인할 수 있습니다.
다음 단계는 테스트하려는 네트워크의 정보로 client.conf를 편집하는 것입니다.
이는 wpa_supplicant용 구성으로,
두 개의 네트워크 블록이 포함되어야 합니다: 하나는 피해자를 나타내고 하나는 공격자를 나타냅니다. 가상의 네트워크 kuleuven을 테스트하기 위한
예제 구성 파일은 다음과 같습니다:
# Don't change this line, other MacStealer won't work
ctrl_interface=wpaspy_ctrl
network={
# Don't change this field, the script relies on it
id_str="victim"
# Network to test: fill in properties of the network to test
ssid="kuleuven"
key_mgmt=WPA-EAP
eap=PEAP
phase2="auth=MSCHAPV2"
# Victim login: fill in login credentials representing the victim
identity="[email protected]"
password="SuperSecret"
}
network={
# Don't change this field, the script relies on it
id_str="attacker"
# Network to test: you can copy this from the previous block
ssid="kuleuven"
key_mgmt=WPA-EAP
eap=PEAP
phase2="auth=MSCHAPV2"
# Attacker login: fill in login credentials representing the attacker
identity="[email protected]"
password="SomePassword"
}
"테스트할 네트워크" 부분에서는 테스트 중인 네트워크의 이름과 보안 구성을 제공해야 합니다. 다양한 유형의 Wi-Fi 네트워크에 대한 구성 파일 작성/편집 방법과 예제 네트워크 블록은 wpa_supplicant.conf를 참조하세요. 첫 번째 네트워크 블록의 "피해자 로그인" 아래에는 시뮬레이션된 피해자를 나타내는 유효한 로그인 자격 증명을 지정해야 합니다. 두 번째 네트워크 블록에서는 "테스트할 네트워크" 아래에 정확히 동일한 정보를 제공할 수 있지만, 시뮬레이션된 공격자를 나타내는 로그인 자격 증명을 제공해야 합니다.
위 예제에서 MacStealer는 공격자가 [email protected]인 공격을 테스트하며, 이 공격자는 피해자 [email protected]에게
보내지는 트래픽을 가로채려고 시도합니다.
기본적으로 스크립트는 구성 파일 client.conf를 사용합니다. --config network.conf 매개변수를 제공하여 다른 구성 파일을 사용할 수 있습니다.
여기서 network.conf를 사용하려는 구성 파일로 바꿀 수 있습니다.
이 저장소에는 다음 예제 구성 파일도 포함되어 있습니다:
multipsk.conf: 하나의 비밀번호는 신뢰할 수 있는 장치가 사용하고 두 번째 비밀번호는 게스트에게 제공되는 multi-PSK를 사용하는 네트워크를 테스트하기 위한 구성 파일.
saepk.conf: SAE-PK를 사용하는 공공 핫스팟을 테스트하기 위한 구성 파일.
특정 AP/BSS를 테스트하기 위해 네트워크 블록을 편집하는 것도 가능합니다.
기본적으로 MacStealer는 모든 테스트에서 8.8.8.8의 포트 443으로 TCP SYN 패킷을 보냅니다. 이는 Google의 DNS 서버입니다.
다른 서버나 포트를 사용하려면 --server 매개변수를 사용하여 제공할 수 있습니다. 예를 들어:
./macstealer.py wlan0 --server 208.67.222.222
TCP SYN 패킷에 사용할 포트를 추가할 수도 있습니다:
./macstealer.py wlan0 --server 208.67.222.222:80
wlan0을 Wi-Fi 인터페이스의 이름으로 바꾸고 IP 주소를 사용하려는 서버로 바꾸세요.
이 서버는 TCP SYN/ACK 응답을 재전송해야 하며, 이상적으로는 MacStealer가 초기 TCP SYN을 전송한 후 10초 이상 경과한 시점에도 재전송된
SYN/ACK를 보내야 합니다. 이러한 재전송 동작은 다음과 같이 --ping 매개변수를 사용하여 테스트할 수 있습니다:
./macstealer.py wlan0 --server 208.67.222.222 --ping
서버가 필요한 재전송 동작을 갖춘 경우 MacStealer는 다음을 출력합니다:
[22:53:15] Received SYN/ACK 15.265095233917236 seconds after sending SYN.
[22:53:20] >>> Ping test done, everything looks good so far. You can continue with other tests.
제공된 서버가 TCP SYN/ACK 응답을 보내지 않거나 충분히 늦게 재전송하지 않는 경우, MacStealer는 다음을 출력합니다:[22:52:05] Received SYN/ACK 1.0727121829986572 seconds after sending SYN. [22:52:24] >>> Ping test done. Consider using a server that retransmits SYN/ACK for a longer time.
서버가 10초 이상 경과한 후에도 SYN/ACK를 재전송해야 하는 이유는, 시뮬레이션된 공격자로 다시 연결하는 데 때때로 몇 초가 걸릴 수 있기 때문입니다. 이 재연결 과정은 서버가 마지막으로 재전송하는 TCP SYN/ACK 패킷을 보내기 전에 완료되어야 합니다.
다음 표에는 네트워크를 테스트할 때 실행할 일반적인 명령어와 각 명령어가 수행하는 작업에 대한 간단한 설명이 포함되어 있습니다. 표 아래에는 각 명령어에 대한 자세한 설명이 나와 있습니다.
테스트 대상 네트워크가 관리 프레임 보호(Management Frame Protection, 802.11w)를 사용하는 경우, 이 도구는 공격자가 여전히 피해자를 네트워크에서 강제로 연결 해제할 수 있다고 가정합니다. 이 가정은 MFP를 사용하더라도 연결 해제 공격이 일반적으로 여전히 가능하다는 것을 보여준 최근 연구를 기반으로 합니다. 다만 덜 직접적이거나 덜 일반적일 뿐입니다.
취약점을 테스트하기 전에 다음 명령어를 사용하여 MacStealer가 피해자와 공격자 양쪽으로 네트워크에 연결할 수 있는지 확인할 수 있습니다:
./macstealer.py wlan0 --ping: 피해자의 인증 정보를 사용하여 네트워크에 연결합니다. 연결되면 서버(기본적으로 8.8.8.8이며 변경할 수 있습니다)에 TCP SYN이 전송됩니다. MacStealer는 SYN/ACK가 (재)전송되는지 여부와 횟수를 확인합니다. 이를 사용하여 피해자의 인증 정보가 올바른지 확인하고 구성된 서버가 SYN/ACK 응답을 제대로 재전송하는지 확인할 수 있습니다.
./macstealer.py wlan0 --ping --flip: 위 테스트와 동일하지만, 이제 스크립트는 공격자의 인증 정보를 사용하여 연결합니다. 공격자의 인증 정보가 올바른지 확인하는 데 사용할 수 있습니다.
./macstealer.py wlan0: MAC 주소 도용 공격의 기본 변형을 테스트합니다. 공격자는 피해자와 동일한 AP/BSS에 다시 연결합니다.
./macstealer.py wlan0 --other-bss: 공격자는 동일한 네트워크의 다른 AP/BSS에 연결합니다. (또한) 이 테스트에 취약한 네트워크는 실제로 악용하기 더 쉽습니다. 무선 범위 내에 AP/BSS가 하나만 있는 경우, 공격자로 연결할 때 스크립트는 시간 초과됩니다.
MAC 주소 도용 취약점을 악용하는 것은 클라이언트 격리가 활성화되어 있거나 ARP 검사와 같은 기술을 사용하여 클라이언트 간 공격을 방지하는 경우에만 의미가 있습니다. 그렇지 않으면 공격자는 ARP 포이즈닝과 같은 더 쉬운 공격을 사용하여 트래픽을 가로챌 수 있습니다. 클라이언트 격리가 활성화되어 있는지 또는 네트워크에서 ARP 검사가 사용되는지 테스트하려면 다음 명령어를 사용할 수 있습니다:
./macstealer.py wlan0 --c2c wlan1: 이 인수를 사용하면 MacStealer는 네트워크가 공격자(wlan1)에서 피해자(wlan0)로의 클라이언트 간 ARP 포이즈닝 트래픽을 허용하는지 테스트합니다. 여기서 wlan1은 두 번째 무선 네트워크 인터페이스입니다. 그런 다음 스크립트는 악성 ARP 패킷이 공격자에서 피해자로 전송될 수 있는지 테스트합니다.
./macstealer.py wlan0 --c2c-eth wlan1: 위 테스트와 유사하지만, 악성 ARP 패킷을 보내는 대신 공격자가 DNS 패킷을 피해자에게 보냅니다.
위 두 테스트 중 하나라도 클라이언트 간 트래픽이 차단된 경우(즉, 클라이언트 격리가 활성화되었거나 ARP 검사와 같은 다른 기술을 사용하여 사용자 간 공격을 방지하는 경우) MAC 주소 도용 취약점은 실제로 위험으로 간주되어야 합니다.
기본적으로 MacStealer는 두 인터페이스를 모두 사용하여 동일한 AP/BSS에 연결하려고 시도하므로 두 네트워크 카드가 동일한 네트워크를 볼 수 있는 것이 중요합니다(즉, 두 네트워크 인터페이스가 동일한 주파수 대역과 채널을 지원하는지 확인하세요). 두 클라이언트가 서로 다른 AP/BSS에 연결하려면 --other-bss 매개변수를 사용할 수 있습니다.
--flip-id 매개변수를 사용하여 피해자(wlan0)에서 공격자(wlan1)로의 트래픽이 허용되는지 테스트할 수 있습니다.
MacStealer가 제대로 작동하지 않는 것 같으면 다음 사항을 확인하세요:
다른 프로세스가 네트워크 카드를 사용하고 있지 않은지 확인하세요(예: 네트워크 관리자를 종료). 다른 프로세스가 네트워크 카드를 사용하는 경우 kernel reports: match already configured 출력이 표시될 수 있습니다.
이전에 모든 것이 정상적으로 작동했다면 Wi-Fi 동글을 뽑고 컴퓨터나 가상 머신을 다시 시작한 다음 다시 시도하세요.
올바른 네트워크에 연결하고 있는지 확인하세요. client.conf를 다시 확인하세요.
git을 사용하여 코드를 업데이트한 경우 ./build.sh와 ./pysetup.sh를 다시 실행하세요(사전 요구 사항 참조).
가상 머신을 사용하는 경우 네이티브 Linux 설치에서 MacStealer를 실행해 보세요.
추가 매개변수 -dd를 사용하여 MacStealer를 실행하면 wpa_supplicant와 MacStealer 자체의 추가 디버그 출력을 얻을 수 있습니다.
기본 클라이언트 격리 테스트는 클라이언트 간 이더넷 계층 트래픽이 허용되는지 확인합니다. 다음 명령어를 사용하여 클라이언트 간 IP 계층 트래픽이 허용되는지도 테스트할 수 있습니다:
./macstealer.py wlan0 --c2c-ip wlan1 [--flip-id]
클라이언트 간 IP 계층 트래픽이 허용되면 클라이언트가 서로를 공격하는 것이 여전히 가능합니다. 예를 들어 ICMP 리다이렉트 공격이 여전히 가능할 수 있습니다. 이러한 공격은 ARP 스푸핑보다 번거롭지만, 클라이언트 간 IP 계층 트래픽도 차단하여 이상적으로는 여전히 방지되어야 합니다.
다음 테스트는 네트워크의 일반적인 속성을 테스트하기 위해 실행할 수 있습니다. 이 테스트는 취약점과 직접적인 관련은 없지만 네트워크의 동작을 더 잘 이해하는 데 사용할 수 있습니다.
./macstealer.py wlan0 --same-id [--other-bss] [--flip]: 액세스 포인트에 연결을 끊고 다시 연결한 후에도 TCP 연결이 유지되는지 테스트합니다. 재연결 후에도 연결이 유지되지 않으면 네트워크가 MAC 주소 도용 공격에 취약하지 않을 가능성이 높습니다. 그러나 이 동작의 가장 큰 단점은 합법적인 클라이언트가 이 네트워크에 다시 연결할 때마다 새 TCP 연결을 열어야 하므로 네트워크가 느리고 불안정해 보인다는 것입니다(따라서 더 나은 방어가 대신 사용되어야 합니다).
--other-bss 매개변수를 사용하여 동일한 네트워크의 다른 AP/BSS에 다시 연결할 수 있습니다. --flip 인수를 사용하면 피해자 신원 대신 공격자 신원으로 이 테스트를 수행할 수 있습니다.
./macstealer.py wlan0 --flip: 일반적인 MAC 주소 도용 공격을 테스트하되 공격자와 피해자의 역할을 바꿉니다. 즉, 공격자는 구성 파일에 제공된 "피해자 인증 정보"를 사용하고 피해자는 "공격자 인증 정보"를 사용합니다.
./macstealer.py wlan0 --c2c wlan1 --same-id [--flid-id]: 동일한 사용자의 두 장치 간에 클라이언트 간 트래픽이 허용되는지 테스트합니다. wlan1 매개변수에 대한 문서는 클라이언트 격리 테스트를 참조하세요.
--flip 인수를 사용하면 피해자 신원 대신 공격자 신원으로 이 테스트를 수행할 수 있습니다.
--delay seconds: --delay 매개변수를 사용하여 공격자로 다시 연결하기 전 지연 시간을 초 단위로 지정할 수 있습니다.
-d 또는 -dd: 이 매개변수 중 하나를 추가하면 스크립트와 기본 wpa_supplicant 인스턴스의 디버그 출력 상세도가 높아집니다.
기본적으로 MacStealer는 연결 및 테스트할 네트워크의 AP/BSS를 자동으로 선택합니다. 여러 AP/BSS가 있는 네트워크의 경우, 피해자의 네트워크 블록에서 bssid 키워드를 사용하여 특정 AP/BSS를 지정함으로써 해당 AP/BSS를 테스트할 수 있습니다. 예를 들어 다음과 같이 사용할 수 있습니다:
...
network={
# Don't change this field, the script relies on it
id_str="victim"
# Network to test: fill in properties of the network to test
ssid="kuleuven"
key_mgmt=WPA-EAP
eap=PEAP
phase2="auth=MSCHAPV2"
# Victim login: fill in login credentials representing the victim
identity="[email protected]"
password="SuperSecret"
# This a specific AP/BSS
bssid=00:11:22:33:44:55
}
...
위 구성에서 MacStealer는 00:11:22:33:44:55를 테스트합니다. 즉, 피해자 및 공격자로 이 AP에 연결하게 됩니다.
--other-bss 매개변수와 결합할 수도 있습니다. 이 경우 피해자는 00:11:22:33:44:55에 연결하고 공격자는 동일한 네트워크의 다른 AP/BSS에 연결합니다.
또 다른 옵션은 피해자 및 공격자의 네트워크 블록에 명시적인 BSS/AP를 지정하는 것입니다.
MacStealer는 지정된 AP/BSS를 최대 30초 동안 검색합니다. 지정된 AP/BSS를 찾을 수 없으면 도구가 종료됩니다.
다음 구성 파일을 사용하여 SAE-PK 네트워크를 테스트할 수 있습니다. SAE-PK 네트워크에서는 피해자와 공격자가 인증하는 방식에 차이가 없습니다. 즉, 둘 다 동일한 비밀번호를 사용합니다.
# Don't change this line, other MacStealer won't work
ctrl_interface=wpaspy_ctrl
# WPA3/SAE: support both hunting-and-pecking loop and hash-to-element
sae_pwe=2
network={
# Don't change this field, the script relies on it
id_str="attacker"
# Network to test - attacker login
ssid="test-saepk"
psk="7iip-ytnz-qa25"
key_mgmt=SAE
ieee80211w=2
}
network={
# Don't change this field, the script relies on it
id_str="victim"
# Network to test - victim login
ssid="test-saepk"
psk="7iip-ytnz-qa25"
key_mgmt=SAE
ieee80211w=2
}
실제로 클라이언트 격리는 사전 공유 비밀번호로 보호되는 네트워크에서도 사용됩니다. 예를 들어 여러 라우터에는 게스트 또는 보안에 취약한(IoT) 장치를 위한 네트워크를 만드는 옵션이 있으며, 이 네트워크의 클라이언트는 서로 공격할 수 없도록 격리됩니다. 그러나 이 시나리오에서 클라이언트 격리를 사용하는 것의 보안 이점은 의문이 제기될 수 있습니다. 클라이언트 격리는 악의적인 내부자가 다른 사람을 공격하는 것을 방지하기 위한 것입니다. 하지만 악의적인 내부자가 사전 공유 비밀번호를 알고 있다면, 로그 클론(이블 트윈)을 만들어 피해자들이 이 악성 복제 네트워크에 연결하도록 속인 다음 다른 클라이언트를 공격할 수 있습니다! 즉, 클라이언트 격리는 비밀번호로 보호되는 네트워크에서 강력한 보안을 제공하지 않습니다. 악의적인 클라이언트는 여전히 다른 클라이언트를 공격하기 위해 로그 AP를 만들 수 있습니다.
그렇긴 하지만, 로그 AP를 만드는 것은 네트워크 관리자가 탐지할 수 있으므로 클라이언트 격리가 공격을 더 어렵게 만든다고 볼 수 있습니다. 또한 경량 장치가 (원격으로) 손상된 경우, 로그 AP로 (쉽게) 작동할 리소스가 없을 수 있습니다. 이로 인해 클라이언트 격리가 사용될 때 공격을 수행하기가 더 어려워지지만 불가능하지는 않습니다. 전반적으로 클라이언트 격리는 비밀번호로 보호되는 네트워크에서 강력한 보안을 보장하지는 않지만, 공격을 수행하는 실질적인 어려움을 증가시킨다고 볼 수 있습니다.
우리의 MacStealing 공격은 로그 AP를 만드는 것보다 수행하기 쉽습니다. 악의적인 내부자(예: 손상된 경량 IoT 장치)가 해야 할 일은 MAC 주소를 스푸핑하고 네트워크에 (재)연결하는 것뿐입니다. 이러한 공격은 또한 탐지하기 더 어렵습니다. 이러한 관찰에 기반하여, 우리의 새로운 공격은 상황을 더 악화시키므로, 사전 공유 비밀번호로 보호되는 네트워크에서도 우리의 공격이 관련이 있다고 고려되어야 한다고 주장할 수 있습니다.
결론: 비밀번호로 보호되는 네트워크에서 클라이언트 격리를 사용할 때, 악의적인 내부자가 로그 AP를 만들지 않을 것이라는 가정을 하는 것입니다. 그렇지 않으면 클라이언트 격리 사용은 보안 관점에서 무의미합니다. MacStealing 공격은 로그 AP를 만들지 않고도 수행할 수 있으며 따라서 공격을 더 쉽게 만듭니다.
우리 공격의 목표는 액세스 포인트의 MAC 주소 거부/허용 목록을 우회하는 것이 아닙니다. MAC 주소 필터링을 우회하기 위해 MAC 주소를 스푸핑하는 것은 별개의 잘 알려진 공격입니다.
우리 공격의 목표는 Wi-Fi 핫스팟에서 누군가의 유료 연결을 가로채는 것이 아닙니다. 예를 들어 일부 개방형(또는 보호된) 핫스팟은 사용자가 인터넷에 접속하기 전에 비용을 지불하도록 요구합니다. 유료 가입자는 종종 MAC 주소를 기반으로 인식되는데, 공격자는 피해자의 MAC 주소를 스푸핑하여 인터넷에 접속할 수 있습니다. 이것은 우리 공격의 목적이 아닙니다. MacStealer의 목표는 클라이언트 격리를 우회하는 것입니다.
우리의 공격은 Hole 196 취약점을 방어하는 네트워크에도 영향을 미칩니다. 예를 들어 Passpoint(이전의 Hotspot 2.0) 네트워크는 Hole 196 취약점을 방지해야 하지만 여전히 우리의 공격에 취약합니다.
우리의 공격은 ARP 스푸핑을 방어하는 네트워크에서도 작동합니다. 제대로 보호되지 않은 Wi-Fi 네트워크에서는 공격자가 ARP 스푸핑을 쉽게 수행하여 피해자의 트래픽을 가로챌 수 있으므로 우리의 공격은 실질적이지 않습니다. 그러나 악의적인 내부자가 존재할 수 있는 현대 네트워크는 중간자(machine-in-the-middle) 공격을 방지하기 위해 클라이언트 격리 또는 다른 방법에 의존합니다. 우리의 공격은 이러한 모든 현대적 방어를 우회하며 여전히 공격자가 피해자에게 향하는 트래픽을 가로챌 수 있게 합니다.
요약하면, 우리의 공격은 클라이언트 간 공격이 차단된 Wi-Fi 네트워크에 영향을 미치며, 공격자가 다른 클라이언트로 향하는 트래픽을 가로챌 수 있게 합니다.
대부분의 벤더는 이 git 저장소에서 논의된 Wi-Fi 클라이언트 격리 우회 취약점을 지칭하기 위해 CVE-2022-47522를 사용하고 있습니다. 이 취약점은 우리 논문의 5장에 있는 공격에 해당합니다.
안타깝게도 일부 다른 벤더는 우리 논문의 3장에서 논의된 (엄밀히 말하면 관련 없는) 취약점을 지칭하기 위해서도 이 CVE를 사용하고 있습니다. 실제로 MITRE에서 찾을 수 있는 CVE의 실제 설명은 우리의 의견으로는 논문의 3장에 있는 공격만을 설명합니다. 실제로 CVE-2022-47522는 기술적으로 다름에도 불구하고 우리 논문의 모든 공격을 지칭하는 데 사용되는 것으로 보입니다.
버전 1.2 (진행 중)
README 개선: CVE 식별자 사용법을 명확히 했습니다.
README 개선: 서론을 클라이언트 격리 우회에 초점을 맞추고, 802.1X 관련 설명과 기본 게이트웨이의 MAC 주소 도용 방지를 포함하도록 방어 섹션을 업데이트했습니다.
공격자로 다시 연결하기 전 지연 시간을 초 단위로 지정하는 --delay 매개변수를 추가했습니다.
버전 1.1 (2023년 1월 18일)
기본적으로 서버로 216.58.208.100 대신 8.8.8.8을 사용합니다(둘 다 Google 서버입니다).
클라이언트 격리 테스트 업데이트: 기본적으로 이더넷 계층에서 ARP 포이즈닝을 사용하여 테스트합니다. 또한 이더넷 계층에서 포워딩하여 UDP 데이터를 보내는 옵션과 IP 계층에서 포워딩하는 테스트도 제공합니다.
README 개선: 영향을 받을 수 있는 네트워크 유형을 업데이트했습니다. 비밀번호로 보호된 WPA2 또는 WPA3 네트워크가 영향을 받는지에 대한 논의를 포함했습니다. 클라이언트 간 이더넷 또는 IP 계층 트래픽을 테스트하기 위한 다양한 명령어를 설명했습니다.
README 개선: MFP 논의, 완화 조치로서의 VLAN 논의, 신원 확인이 수행되어야 하는 AP 범위 명확화, 서버 포트 지정,
MacStealer 출력 개선.
버전 1.0 (2023년 1월 3일):
| 명령어 | 간단한 설명 |
|---|
./macstealer.py wlan0 --ping | 피해자로 연결하여 서버의 재전송 동작을 테스트합니다. |
./macstealer.py wlan0 --ping --flip | 공격자로 연결하여 서버의 재전송 동작을 테스트합니다. |
./macstealer.py wlan0 | MAC 주소 도용 공격의 기본 변형을 테스트합니다. |
./macstealer.py wlan0 --other-bss | 공격자가 피해자와 다른 AP에 연결하도록 합니다. |
./macstealer.py wlan0 --c2c wlan1 | 클라이언트 간 이더넷 계층 트래픽을 테스트합니다(ARP 포이즈닝). |
./macstealer.py wlan0 --c2c-eth wlan1 | 클라이언트 간 이더넷 계층 트래픽을 테스트합니다(DNS). |