웹 사이트 중요 정보 전송 구간(로그인, 회원 가입, 회원정보 수정, 결재 등)에 계정 정보, 개인 정보를 전송 시 암호화 통신을 하여 전송해야 한다.
암호화를 하지 않고 평문으로 전송하면 동일 네트워크 대역의 공격자가 스니핑 공격을 시도하여 계정 정보, 개인 정보 등 중요 정보를 획득할 수 있다.
SSL/TLS 1.2 암호화 프로토콜이 적용되어 있어도 강력한 알고리즘이 적용되어 있지 않으면 취약점이 발생한다.
웹 사이트가 HTTP, HTTPS를 같이 사용한 경우 사용자가 중요 정보 전송 시 HTTPS로 연결을 유도한다. 하지만, HTTPS로 연결을 유도하는 과정에 보안 설정이 되어 있지 않으면 사용자에게 HTTP 무한 패킷을 전송해 중요 정보를 획득할 수 있다.
취약점 진단
공격 시나리오 |
사용자가 웹 사이트에 최초 접근 시 로그인 시도 |
웹 서버는 사용자가 암호화 통신이 이루어지도록 HTTPS 연결 유도 |
공격자는 웹 서버가 사용자에게 보낸 HTTPS를 가로채서 HTTP로 전달 |
사용자는 HTTP로 로그인 시도하여 웹 서버로 전달 |
공격자는 사용자가 웹 서버에게 보낸 HTTP를 가로채서 HTTPS로 전달 |
공격자는 동일 네트워크 대역의 호스트를 스캔하고, 현재 활성화 되어 있는 특정 호스트를 희생자로 선정한다.
특정 호스트를 대상으로 중간자 공격(MITM, Man In The Middle) 중 하나로 ARP 스푸핑(Address Resolution Protocol Spoofing) 공격을 수행한다.
이 공격을 사전에 수행하면 희생자가 서버로 전달하는 패킷, 서버가 희생자로 전달하는 패킷을 중간에 위치한 공격자가 가로채서 패킷을 훔쳐볼 수 있다.
○ arpspoof -i 인터페이스명 -t 게이트웨이IP 희생자IP
○ arpspoof -i 인터페이스명 -t 희생자IP 게이트웨이IP
ARP Spoofing 공격만 진행하면 희생자는 외부와 통신이 불가능하므로 패킷 릴레이(Packet Relay)를 수행하여 통신이 가능하도록 설정한다.
○ fragrouter -B1
공격이 진행되기 전 희생자의 ARP 테이블을 보면 게이트웨이의 MAC(Media Access Control) 주소가 00-50-56-ec-bd-92이다.
공격이 진행된 후 ARP 테이블을 보면 게이트웨이의 MAC 주소가 공격자의 MAC 주소(00-0c-29-40-ca-47)로 변경 된다.
웹 서버에서 중요 정보 전송 구간에 암호화 통신이 적용되어 있는 상태에서 패킷을 캡처하면 희생자의 중요 정보는 암호화되어 공격자 서버로 전송된다.
본격적인 SSL Strip 공격을 수행하기 전 희생자, 웹 서버에서 HTTP 패킷을 수신 시 SSL Strip의 기본 포트(10000)로 연결한다.
○ iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-ports 10000
SSL Strip 공격 명령어를 입력하면 희생자와 웹 서버가 통신한 모든 과정이 공격자 서버의 sslstrip.log 파일에 저장된다.
○ sslstrip -a -f -k
SSL Strip 공격을 수행하기 전 희생자가 중요 정보 구간에 기본적으로 HTTPS가 적용되어 있었다. 하지만, 공격 수행 후 희생자가 웹 사이트에 접속하면 HTTPS가 아닌 HTTP로 연결된다.
웹 서버가 희생자에게 HTTPS로 유도하는 과정에서 SSL Strip 공격으로 S를 제외한 HTTP로 통신한다. 단, 웹 사이트 접속 시 https://로 지정하여 접속하면 공격이 되지 않는다.
희생자가 계정 정보를 입력하면 HTTP로 공격자 서버에 전달이 되고, sslstrip.log 파일을 보면 계정 정보가 평문으로 저장된다.
대응 방안
각 가상 호스트 섹션에 HSTS 설정으로 하루(86400) 동안 HSTS를 유지하며 서브 도메인도 적용하도록 설정한다.
○ add_header Strict-Transport-Security "max-age=86400; includeSubdomains; preload";
# PHP
<?php
function BlockHttp() {
// 사용자가 HTTPS로 요청했는지, 서버에서 HTTPS가 활성화되어 있는지 판단
$is_https = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'));
if(!$is_https){
die('http://로 접속하실 수 없습니다.');
}
}
?>
# Apache
LoadModule headers_module modules/mod_headers.so
// SSL이 사용 가능한 가상 호스트로 경로 재지정
<VirtualHost *:80>
ServerName example.com
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L]
</VirtualHost>
# NginX
server {
listen 80;
server_name example.com;
return 301 https://$http_host$request_uri;
}
▶ Metasploit meterpreter 기능 및 사용법