웹 사이트 중요 정보 전송 구간(로그인, 회원 가입, 회원정보 수정, 결재 등)에 계정 정보, 개인 정보를 전송 시 암호화 통신을 하여 전송해야 한다.


암호화를 하지 않고 평문으로 전송하면 동일 네트워크 대역의 공격자가 스니핑 공격을 시도하여 계정 정보, 개인 정보 등 중요 정보를 획득할 수 있다.


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 기능 및 사용법

▶ CVE-2014-6332 취약점 분석 (Internet Explorer)

▶ DVWA 취약점 분석

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유