'스미싱(Smishing)'은 SMS를 악용한 피싱의 호칭으로 'SMS'와 'Phishing'을 조합한 신조어이다. 통신사업자와 택배업체를 가장한 스미싱이 다발하고 있으며, 2019년 6월에는 JC3(일본 사이버범죄 예방센터)가 '통신사업자를 사칭한 스미싱 사기수법에 관한 주의를 촉구했다.
JC3는 'SMS 발신을 위장한 메시지가 정규 발신자의 스레드에 전송된다'고 설명하고 있다.
평소 아무런 의심없이 SMS를 이용하고 있던 나는 경악했다. 정규 스레드로 피싱메시지가 들어오다니. JC3의 주의를 읽은 것만으로는 믿을 수 없었기 때문에 클라우드 전화서비스 'Twilio'를 이용하여 실제로 시험해 보았다. Twilio의 이용약관은 원본을 위장하고 타인을 속이는 행위를 금지하고 있기 때문에 검증은 내가 소유한 환경에서 실시했다.


송신자 표기가 송신자ID인 케이스

SMS 메시지를 수신했을 때 표시되는 발신자는 전화번호 대신 영숫자로도 표기할 수 있다. 이 숫자의 송신자 표기를 '송신자ID(Sender ID)'라고 한다.

송신자ID의 사용 여부는 수신하는 통신사업자의 대응상황에 따라 다르다. Twilio의 판매파트너 KWC의 설명에 따르면, 일본에서는 NTT DOCOMO와 SoftBank가 송신자ID에 대응하고 KDDI는 지원하지 않는다고 한다. 나는 KDDI의 회선을 소유하고 있지 않기 때문에 수신자가 KDDI의 전화번호를 사용하는 경우의 동작은 확인하지 못하고 있다.

우선 iOS의 공식메시지 앱에 도착해 있었던 Amazon의 메시지 스레드에서 위장을 시도했다. 송신자ID가 Amazon이기 때문에 Twilio로 SMS를 보낼 때의 From 값을 Amazon으로 지정한다.

curl -X POST https://api.twilio.com/2010-04-01/Accounts/{$ACCOUNT_SID}/Messages.json \
--data-urlencode 'From = Amazon'\
--data-urlencode 'Body = hello'\
--data-urlencode 'To = $ IPHONE_NUMBER'\
-u $ ACCOUNT_SID : $ AUTH_TOKEN

Twilio에서 보낸 메시지 'hello'가 정규의 스레드에 포함됐다. JC3의 설명은 사실이었다. 일본어나 URL 링크를 포함한 현실적인 피싱메시지의 전송도 시도한다. Curl은 장문의 메시지가 보내기 힘들었기 때문에, Twilio의 Python 모듈을 사용하여 메시지를 보낸다.

import os
from twilio . rest import Client

account_sid = os . environ . get ( 'ACCOUNT_SID' )
auth_token = os . environ . get ( 'AUTH_TOKEN' )
client = Client ( account_sid , auth_token )

message = client . messages . create (
body = ( 'Amazon Pay 캐쉬백 캠페인에 당선되었습니다. \ n \ n'
'아래 링크에서 로그인하고 1만 엔 분의 포인트를 이용해 주십시오. \ n'
'https://amazon.akaki.io/' ) ,
from_ = 'Amazon' ,
to = os . environ . get ( 'IPHONE_NUMBER' )
)

URL 링크를 포함한 일본어의 메시지도 보낼 수 있었다. Android의 공식메시지 앱에서도 마찬가지로 보내는 위장을 시도했다. Google의 메시지 송신자ID인 Google을 From 값으로 지정하면 보낸 메시지가 정규의 스레드에 포함됐다.


당초 Amazon 대신 Apple의 스레드로 실증을 예정하고 있었지만, From 값을 지정하면 Error 21212가 발생했다. From 값을 변경하면 메시지를 보낼 수 있으므로 Twilio 측에서 특정 송신자ID 지정을 금지하고 있다고 짐작한다.

$ curl -X POST https://api.twilio.com/2010-04-01/Accounts/{$ACCOUNT_SID}/Messages.json \
> --data-urlencode 'From = Apple'\
> --data-urlencode 'Body = hello'\
> --data-urlencode 'To = $ IPHONE_NUMBER'\
> -u $ ACCOUNT_SID : $ AUTH_TOKEN
{ 'code': 21212 'message': 'The 'From'number Apple is not a valid phone number, shortcode, or alphanumeric sender ID', 'more_info': 'https://www.twilio.com/docs / errors / 21212 ','status ': 400}

송신자 표기가 전화번호인 경우

발신자가 전화번호로 표기되는 스레드에도 위장한 메시지를 포함할 수 있을까? 슈퍼 콜프리 번호가 발신자로 되어 있는 PayPay의 메시지 스레드로 위장을 시도했다.

보낸 사람의 전화번호를 From 값으로 지정하면 Error 21212가 발생한다. From 값에 공백이 포함된 것을 원인으로 보고 국가번호를 추가하자 오류코드가 변화했다. 새롭게 발생한 Error 21606의 설명에 따르면, Twilio는 스팸방지를 위해 계정에 연동되지 않은 전화번호를 From 값으로 지정할 수 없는 사양이었다.

$ curl -X POST https://api.twilio.com/2010-04-01/Accounts/{$ACCOUNT_SID}/Messages.json \
> --data-urlencode 'From = + 81120990637'\
> --data-urlencode 'Body = hello'\
> --data-urlencode 'To = $ IPHONE_NUMBER'\
> -u $ ACCOUNT_SID : $ AUTH_TOKEN
{ 'code': 21606 'message': 'The From phone number +81120990637 is not a valid, SMS-capable inbound phone number or short code for your account.' 'more_info': 'https : //www.twilio .com / docs / errors / 21606 ','status ': 400}

Twilio를 이용한 검증 결과, 보낸 사람의 전화번호를 위장해 정규의 스레드에 메시지를 포함할 수 없었다. 그러나 정규 스레드에 포함할 목적으로 하지 않으면 독자적으로 송신자ID를 지정하는 것만으로 위장한 메시지를 보낼 수 있다. 송신자ID를 지정하면 PayPay의 공식메시지를 위장할 수 있다.


iOS 및 Android의 공식메시지 앱은 메시지의 URL 링크를 이미지와 제목을 포함한 링크로 대체하는 링크 미리보기 기능이 탑재되어 있다. iOS에서는 연락처에 등록하지 않은 소스에서 보내온 메시지라면 미리보기가 작동하지 않았다. 그러나 Android에서는 앱 설정에서 자동 미리보기가 활성화되어 있으면 연락처에 등록하지 않은 소스도 미리보기가 작동했다. 미리보기를 로드할 때 정규사이트와 공통점이 늘어나기 때문에 구분이 어려워진다.

지금까지 LINE와 같은 감각으로 SMS를 이용하고 있었기 때문에 정규 스레드로 위장된 메시지가 전송될 것이라고는 생각도 하지 않았다. 만약 교묘하게 위장된 피싱메시지를 보냈다면 이변을 눈치챌 수 없었을 것이다. 기존 메일에는 없는 채팅 특유의 스레드 표시를 무의식적으로 믿어버리고 있었다. 피해를 입기 전에 이런 사양에 주의한 것은 다행이었지만, SMS 이용자로서 더 빨리 알아야 했다. 피싱 동향을 매일 살필 필요성을 실감했다.

Twilio를 이용한 검증에서는 송신자 표기로 전화번호가 있는 스레드는 메시지를 포함할 수 없었다. 하지만 송신자ID를 위장하는 것만으로도 충분히 위협이 될 수 있다. 실제로 2018년 7월경부터 발생하는 택배업체를 가장한 스미싱은 SMS에서 부재 중 알림을 하지 않는 택배업체로 위장한 메시지로 많은 피해가 나왔다.

출처 참조 번역
· Wikipedia
· SMSで送信元を偽装したメッセージを送る
https://akaki.io/2019/sms_spoofing

Posted by 말총머리
,