보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

Tabnabbing 기법을 통한 계정 탈취

2018.02.07

14,928

서비스사업본부 보안분석팀 김유진

 

 

1. 개요

 

2016년 피싱으로 인한 사기 피해가 2015년 대비 65% 급증한 것으로 알려졌다. 피해 사례의 대다수는 e메일을 활용한 공격에 대한 피해로 피싱과 관련된 스팸 e메일은 매일 1,000억 통 이상 발송되고 있는 것으로 밝혀졌다. 이렇게 피싱공격과 피해가 줄어들지 않는 요즘, 알려진 피싱 공격 중 하나인 탭내빙(Tabnabbing) 공격 기법에 대해 조치하지 않는 사이트들이 존재한다.

 

탭내빙(Tabnabbing)이란 여러 탭을 이용하여 웹 페이지를 보고 있으면 사용자가 눈치채지 못하는 사이 사용자가 원래 보고 있던 탭(부모 탭)을 변조하는 공격기법으로 이를 이용하여 실제 사이트와 유사한 피싱 페이지로 리다이렉트 할 수 있는 공격이다.

 

따라서 이번 호에서는 Chrome, explorer와 같은 많은 브라우저에 탭 기능을 악용한 공격 중 하나인 탭내빙(Tabnabbing)기법을 이용하여 사용자의 계정 탈취가 어떻게 진행되고, 대응해야 하는가에 대해 알아보고자 한다. 

 

 

 

[그림 1] 피싱 메일로 인한 피해

 

 

2. 탭내빙(Tabnabbing) 기법

 

탭내빙(Tabnabbing)이란 HTML 문서 내에서 링크(target이 _blank인 태그)를 클릭했을 때 새롭게 열린 탭(또는 페이지)에서 기존의 문서인 location을 피싱 사이트로 변경해 정보를 탈취하는 공격 기술을 말한다. 

 

이 공격은 메일이나 SNS와 같은 오픈 커뮤니티에서 사용 될 수 있다. 사용자의 클릭을 유도하여 웹 브라우저의 탭을 피싱 사이트로 이동시키는 기존의 피싱 기법과 달리 탭내빙(Tabnabbing)은 사용자의 페이지에서 아무런 행위를 하지 않아도 사용자의 눈을 피해 열린 탭 중 하나를 피싱 페이지로 로드한다.

 

 

3. 계정탈취 공격 시나리오

 

공격자가 탭내빙(Tabnabbing) 공격기법을 통해 계정 탈취와 같은 공격을 수행하기 위해서는 HTML 문서 내의 target이 _blank로 설정되어 있어야 한다. 이는 Default 설정으로 location이 제한되지 않고 동작할 수 있게 된다. 또한 피해자가 메일에 전송된 피싱 페이지에 접속하게 만들어 부모 탭이 변경되어 공격자의 서버에 접속되게 해서 원래 사이트와 유사한 형태로 사용자가 의심 없이 로그인을 시도하면 해당 계정이 공격자의 서버로 전송된다.

 

 

[그림 2] Tabnabbing 기법을 통한 계정 탈취 시나리오(출처: 레진기술블로그)

 

 

1) 사용자를 속일 수 있는 피싱 페이지를 메일로 전송

 

공격자는 공격대상에게 클릭하고 싶을 만한 문구로 링크를 생성하여 메일을 전송해 사용자의 접속을 유도한다. 해당 링크는 공격자가 생성해둔 가짜 사이트가 표시되는 동시에 로그인 되어 있는 부모 탭의 사이트를 해당 사이트와 비슷한 피싱 페이지로 이동하는 코드로 이루어져 있다.

 

 

[그림 3] 공격대상에게 보낸 페이지 코드(hack.html)

 

 

 

[그림 4] 공격 대상에 피싱메일 전송

 

 

2) 피싱 사이트로 접속 시 새 탭이 열리는 동시에 원래 페이지(부모 탭) 페이지 이동

 

공격자가 임의의 페이지로 연결하도록 변조한 링크가 포함된 메일을 일반 사용자가 수신하게 되고 일반 사용자가 해당 링크를 클릭하게 될 경우, [그림 4-6]와 같이 공격자가 만들어둔 잘못된 페이지이므로 돌아가라는 문구가 삽입된 페이지로 연결된다. 이와 동시에, 로그인 되어있던 페이지(부모 탭)는 공격자가 해당 사이트 재 로그인 페이지와 비슷하게 만들어둔 피싱 페이지로 이동된다.

 

 

[그림 5] 일반 사용자에게 링크가 포함된 메일 수신

 

 

 

[그림 6] 링크 클릭 시 보이는 화면

 

 

3) 원래 로그인 되어 있던 메일 사이트를 비슷하게 만들어둔 피싱 페이지로 이동 

 

일반 사용자는 잘못된 페이지라는 문구가 담긴 페이지를 보고 다시 메일 확인 탭으로 돌아가게 되는데, 이 탭은 공격자가 심어둔 코드에 의해 실제 사이트의 로그인 페이지와 유사한 형태를 가진 피싱 페이지(http:// 192.168.86.129/index.html)로 이동한 상태이다.   

 

 

[그림 7] 실제 사이트와 유사한 피싱 페이지

 

 

4) 사용자가 가짜 페이지에 재 로그인 시도

 

공격자가 실제 사이트와 유사한 형태로 만들어둔 페이지로 이동된 탭에서 사용자가 피싱 페이지임을 인지하지 못하면 로그인을 시도하게 되고 해당 계정이 공격자의 서버로 전송된다.

 

 

[그림 8] 가짜 페이지에서 사용자 로그인 시도

 

 

5) 로그인 된 사용자의 계정이 공격자의 서버로 전송 

 

사용자가 피싱 페이지에 로그인을 시도하게 되면 공격자의 서버로 해당 아이디와 패스워드가 전송되어 공격자가 지정해둔 파일명에 사용자의 계정 정보가 저장된다.

 

 

 

[그림 9] 공격자의 서버에 전송된 일반 사용자의 계정 정보

 

 

 

 

[그림 10] 사용자의 계정이 공격자 서버로 전송되는 공격 코드

 

 

6) 실제 사이트로 리다이렉트 

 

사용자가 로그인을 시도하면 계정정보가 공격자의 서버로 전송되고, 피싱 페이지에서 실제 사이트로 리다이렉트 되므로 사용자는 피해를 인지하기 어렵다. 

 

 

 

[그림 11] 로그인 시도 후 정상 사이트 화면

 

 

7) 현재 운영중인 사이트 현황

 

실제 운영중인 많은 사이트들 중 5개의 대형 포털 사이트에 탭내빙(tabnabbing) 공격이 가능한지 시연해본 결과, 대부분 사이트에서 공격자가 송신하기 전 메일 미리보기에는 동작이 가능했지만, 수신된 메일에는 조치를 해둔 상태였기 때문에 사용자 입장에서의 결과는 아래 표와 같았다.

 

 

 

 

 

구분

 

 

A

 

 

B

 

 

C

 

 

D

 

 

E

 

 

동작여부

 

 

O

 

 

X

 

 

X

 

 

X

 

 

X

 

 

[표 1] 탭내빙(tabnabbing) 공격기법 동작 여부

 

 

4. 대응방안

 

이러한 공격 기법은 살펴본 바와 같이 현재 운영중인 사이트에서도 동작이 가능하다. 탭내빙(Tabnabbing) 기법은 opener를 참조할 수 있도록 target이 _blank로 되어 부모 탭과 같은 스레드에서 페이지가 동작하여야 하므로 “*noopener” 또는 “noreferrer “속성을 부여하게 되면 이 기법이 동작하지 않게 된다.

 

 

1) noopener 속성 추가

 

*noopener 속성은 헤더와 함께 참조자 정보를 보내지 않도록 하기 때문에 window.opener를 무효화 한다. 따라서 noopener 속성이 부여된 링크를 통해 열린 페이지는 window.opener를 통해 부모 탭을 참조할 수 없고, location과 같은 자바스크립트 요청을 거부한다. 

 

 http://example.com" target=_blank rel="noopener">​ 

 

[표 2] noopener 속성 사용법 예시

 

 

2) noreferrer 추가

 

noreferrer를 지정하여 noopener와 유사한 동작을 구현할 수 있는데, noreferrer는 링크를 통해 접근 시 포함된 referrer를 전송하지 않도록 하여 링크를 클릭하더라도 referrer 정보가 유출되지 않는다.

 

 http://example.com" target=_blank rel="noreferrer">​ 

 

[표 3] noreferrer 사용법 예시

 

 

3) nofollow 추가

 

nofollow는 사용 중인 브라우저에서 문서에 포함된 링크로 따라가지 않도록 지정하는 속성으로 모든 링크를 따라가지 않게 하려면 meta 요소에 nofollow를 지정하고 개별적으로 지정하려면 href 해당 요소에 지정한다.

 

 http://example.com" target=_blank rel="nofollow">​ 

 

[표 4] nofollow 사용법 예시

 

 

* noopener 속성을 사용하여 열린 탭은 부모를 호출할 일이 없고, 같은 스레드일 필요가 없기 때문에 사이트 변조가 거부됨과 더불어 새로운 페이지가 느리다고 부모 탭까지 느려질 일이 없어 효율적이다.

 

 

5. 대응방안 적용 사례

 

최근 나온 공격이 아님에도 불구하고 대응이 미숙한 사이트가 존재했다. 앞서 테스트해본 첫 번째 사이트는 누군가가 조치방안과 함께 권고를 했음에도 불구하고 테스트해본 사이트 5개 중 대중적으로 쓰이고 있는 대형 포털 사이트에서 조치가 되어있지 않았다. 

 

 

1) 사용자를 속일 수 있는 피싱 페이지를 메일로 전송

 

동일한 방법으로 타 사이트에 공격자가 만든 피싱 페이지 링크를 메일로 전송하고 사용자가 해당 링크에 접속하게 한다. 

 

 

[그림 12] 사용자에게 수신된 피싱 사이트 메일 

 

 

2) 사용자가 해당 링크로 접속

 

해당 사이트는 사이트 리다이렉트가 불가능 하도록 조치되어 있어 공격자가 만들어둔 페이지로 리다이렉트 되지 못하고 오류 메시지만 표시된다.

 

 

 

[그림 13] 공격자가 실패 시 넣어둔 오류 문구 출력 

 

 

3) 각 페이지의 조치된 부분

 

부모 탭의 주소가 리다이렉트 되지 않는 이유는 해당 페이지에 “noopener”, “noreferrer” 설정이 되어 있어 공격자가 생성한 코드인 window.opener 기능이 동작하지 않기 때문이다.

 

 

 

[그림 14] noreferrer로 방지된 페이지

 

 

 

 

[그림 15] noopener로 방지된 페이지

 

 

탭내빙(Tabnabbing) 기법이 통하지 않는 사이트 중 한 곳은 target=_blank 값 뒤에 “data-saferedirecturl” 속성을 자동으로 부여해 공격자가 보낸 링크는 href에 포함되어 있고, 해당 링크를 실제로는 구글에서 보낸 링크로 연결될 수 있도록 조치해두었다.

 

 

 

[그림 16] data-saferedirecturl 속성을 통한 조치

 

 

6. 참고자료

 

[1] https://mathiasbynens.github.io/rel-noopener/#hax

[2] https://blog.coderifleman.com/2017/05/30/tabnabbing_attack_and_noopener/

[3] http://www.boannews.com/media/view.asp?idx=54693

[4] http://www.koreatimes.com/article/20170713/1065585

[5] http://www.koreadaily.com/news/read.asp?art_id=5410760

[6] https://blog.jxck.io/entries/2016-06-12/noopener.html

[7] https://www.quora.com/What-does-noopener-attribute-mean-in-a-tag

[8] https://html.spec.whatwg.org/multipage/links.html#link-type-noopener

[9] http://tech.lezhin.com/2017/06/12/tabnabbing