본문 바로가기
Experience/IOS

[단축어 공유] 큐싱 예방하기 (with. VirusTotal API)

by Castanea_ 2023. 11. 14.
반응형

큐싱 예방하기

최근 몇 개월전 큐싱 관련된 뉴스를 접하게 되었다. 코로나 이후로 QR코드 사용에 익숙해져가고 있는 우리들이지만 이를 이용하여 내 소중한 금융 정보를 털어가려는 친구들이 생겼나 보다. 해킹이라는 게 아무리 백신 깔고 뭔 난리를 쳐도 결국에 사용자 입장에서 주의하지 않는다면 한순간에 털리는 것이다 보니 법적 분쟁으로 이어져도 사용자 과실 문제로 보상받기도 어려운게 현실이다.

 

단축어로 만들 것을 고민하다가 해당 주제로 어떻게 할 수 있을까 하고 구현하게 되었다.


큐싱 (Qshing)

큐싱이란?

QR코드와 피싱(Phishing)의 합성어로 QR코드를 이용한 해킹을 의미한다.

 

큐싱의 흐름은 다음과 같다

1. 정상 QR 위에 악성 QR을 덧붙이거나, 대놓고 악성 QR을 정상인 것처럼 해서 QR코드를 찍도록 유도한다.

2. URL 접속 시 악성 프로그램이 설치되거나 피싱사이트로 유도되어 중요 정보를 입력하면 유출되는 흐름이다.


바이러스 토탈

 

바이러스 토탈은 구글의 자회사이다. 바이러스, 웜, 트로이 목마, 유해 URL을 검사하고 점수로 정량적인 데이터를 제공해 준다.

무료 API를 제공해 주고 있으며 해당 API를 이용해 직접 바이러스 토탈 사이트에 접속하지 않고 데이터를 요청, 응답받을 수 있다.

 

QR코드는 URL로 연결해 주는 특성을 착안하여 단축어와 결합할 아이디어를 얻었다.


 

API (Application Programming Interface)

API는 애플리케이션 프로그래밍 인터페이스라고 하는데 프로그램들끼리 서로 소통하는 방법이라고 생각하면 편하다.

 

특정 데이터를 요청하면, 그에 맞는 데이터를 반환해 주는 것, 인스타에서 잘 비유돼서 설명된 사진을 봤었던 기억이 나는데

마치 식당에서 손님(클라이언트)이 점원한테 음식을 주문하면 점원이 요청 내용을 요리사(서버)에게 전달하고, 요리사가 음식을 만들어 점원에게, 점원은 손님에게 음식을 전달해 주기까지 이 과정에서 '점원'이 API 역할을 하는 것이다.

 

단축어(손님)에서 바이러스 토탈(식당)이 제공하는 API(점원)를 이용하여 내 입맛에 맞는 요리를 주문해보자


사전준비 (API Key 발급)

 

바이러스 토탈 페이지 가입 후 우측 상단 프로필에서 API Key를 발급받을 수 있다.

API를 요청하기 위한 Key로 발급 후 사용하면 된다.

눈 모양 옆 클립보드로 복사버튼을 눌러 API Key를 얻으면 된다.

 

기능구현

프로그램 흐름은 다음과 같다.

1. QR코드 스캔

2. URL 정상 판단 여부를 위해 VirusTotal API를 사용하여 URL 스캔 (API에서 요구하는 URL의 id 값 추출)

3. id 값을 파라미터로 전달하여 URL 스캔 보고서 반환받기

4. 보고서 내용 중 점수만 추출

5. 추출된 점수로 악성일지 정상일지 판단 후 URL을 열지 말지 결정

1. QR 코드 스캔뿐 아니라 얻어낸 링크를 검사할 수 있도록 '메뉴에서 선택'으로 분기점을 만들어 직접 입력할지말지 결정할 수 있도록 했다.

코드가 스캔 되거나 URL을 입력받으면 set_URL 변수로 URL을 저장한다.

 

2. URL 콘텐츠 가져오기에서 API를 요청할 수 있다

바이러스 토탈 API 문서를 보면 URL 스캔을 위해 API한테 던져줘야 하는 데이터들이 보이는데 여기서 요구하는 데이터는

POST 메소드로 url과 x-apikey를 string(문자열) 형태로 요구하고 있다.

 

위 사진에서 보면 알 수 있지만 URL 콘텐츠 가져오기 상세 보기 부분을 눌러서 메소드와 던져줄 데이터를 적어주면 된다.

x-apikey는 발급받은 API Key를 넣고, url은 위에서 설정했던 set_URL 변수로 넣어주었다.

 

이후 응답받은 데이터는 사전(Dictionary) 형태로 자바스크립트처럼 객체형식으로 돌아오는데

네이버 URL 요청 시 돌아오는 데이터다. 우리가 필요한 데이터는 URL 스캔 보고서 요청 시 필요한 'id'이므로 id의 값을 접근하여 저장하면 된다.

3. 위의 데이터를 사전으로 가져오기에 넣고 넣은 사전에서 id에 접근하기 위해

'키' 칸에 data.id를 넣어 '값'을 가져온다.

 

id가 생긴 것을 보면

u-6c660c73546d4facc1eba3758224062e4a1f80eba73e7d69475f6c4a32b294f7-1699895035

이런 형식으로 데이터가 들어가있다.

 

그대로 넣었다가 오류가 나서 시간 소비가 많았는데 원인을 알아보니 바이러스 토탈 사이트에서 URL 인코딩 시

이렇게 id의 가운데 부분만 넣어서 GET 요청을 하는 것을 보고 가운데 데이터만 추출하기 위해 정규 표현식을 사용했다.

 

'텍스트에서 일치'를 쓰면 정규 표현식을 사용해서 데이터를 추출할 수 있는데

위 데이터에서 u-와 1699895035만 빼고 추출하면 된다

 

"(?=-)(.*)(?=-)"

4. '-' 하이픈 단어를 기준으로 전방 탐색 연산자, 후방 탐색 연산자만 넣어서 추출하였다.

5. 이제 id를 얻었으니 최종 주문서만 넣으면 된다.

요구되는 주문서에 포함될 내용은 x-apikey와 id 값을 GET 메소드로 파라미터를 넘겨주면 된다.

 

6. 추출된, 일치된 데이터를 '텍스트로 합치기'에서 URL 보고서 요청을 위한 API URL과 합쳐

API URL + id 형태로 만들어준다

 

URL 콘텐츠 가져오기로 최종적으로 요청을 한다

응답 데이터는 바이러스 토탈에서 제공하는 엔진들의 결괏값, 점수 등을 반환해 준다.

뭐가 많은데.. 가장 눈에 띄는 harmless와 malicious를 보니 점수로 보인다.

7. 데이터를 가져오려면 

id 값을 가져왔던것 처럼 사전에 넣고 사전의 값을 지정하여 변수로 넣으면 된다

data.attributes.last_analysis_stats.harmless

data.attributes.last_analysis_stats.malicious

 

의심되는 URL을 잡는 것이 목표니 malicious 점수가 1점이라도 있다면 의심 URL로 보도록 구현했다.

8. 의심된다면 악성 URL로 의심된다고 시스템 알림을 울림

9. 0점인 경우 정상 URL로 판단하여 접속 유무를 물어보고 '예' 클릭 시 처음 스캔했던 set_URL 내용으로 URL 접속

실제 악성 URL 스캔 시도 결과물

 

공유된 단축어는 API Key 부분만 빠진 버전이다.

 

마무리 주의사항

바이러스 토탈에서 다음 포털 사이트 URL을 넣으면 1점이 찍히는데

모든 정상 URL이 정상으로 찍히는 것도 아닌 거 같다.

 

알려지지 않은 악성 URL의 경우 정상으로 찍히는 경우도 있어 정말 의심되는 경우 백신을 돌려보는 게 좋다.

 

정확도가 100%인것은 아니어서 참고용으로 사용하기 좋을 것 같다.

 

반응형