꿈을꾸는 파랑새

오늘은 국민건강보험 공단 피싱 사이트 인 sa1(.)f6pt(.)hair 에 대해 글을 적어 보겠습니다.

일단 예전에는 윈도우 환경에서 들어오면 해당 사이트를 국민건강보험으로 넘겨지고 사파리 부분도 장사는 안 하는지 애플 스마트폰 사용자(iOS)에 대해서도 영업을 안 하는 것 같습니다.

한마디로 오직 안드로이드 스마트폰을 사용하는 분들을 공격하기 위해서 만들어진 것 같습니다.
예전에는 KMI 한국의학연구소로 넘겨 버렸는데 이제는 진짜 국민건강보험공단으로 날려 버립니다.

https://www.nhis(.)or.kr

국민건강공단 피싱 사이트 302 코드
국민건강공단 피싱 사이트 302 코드

그리고 유포 방식을 다음과 같은 문자로 무작위로 유포하고 있습니다.

[Web발신] [국민건강보험]고객님 건강검사 통지서 발송완료.
상세보기
https://sal.f6pt(.)hair
[Web발신] [국민건강보험]고객님 건강검사 통지서 발송완료.
상세보기
https://sy4.i9uy(.)hair
[Web발신] [국민건강보험]고객님 건강검사 통지서 발송완료. 
상세보기
https://v01.n2tz(.)hair
[Web발신] [국민건강보험]고객님 건강검사 통지서 발송완료.
상세보기
http://sy4.i9uy(.)hair/

유포 사이트를 다시 정리하면 다음과 같습니다.

국민건강보험공단 피싱 사이트 메인화면
국민건강보험공단 피싱 사이트 메인화면

http://sa1.f6pt(.)hair/
http://sy4.i9uy(.)hair/
http://sy4.i9uy(.)hair/
https://v01.n2tz(.)hair (영업 안 함)

그리고 이번에는 정책이 변화가 있었습니다.

[소프트웨어 팁/보안 및 분석] - 국민건강보험 공단 피싱 사이트-r06 a9ij wtf(2023.04.17)

 

국민건강보험 공단 피싱 사이트-r06 a9ij wtf(2023.04.17)

오늘은 국민건강보험 공단 피싱 사이트 인 r06 a9ij wtf 에 대해 글을 적어 보겠습니다. 일단 해당 피싱 사이트 동작 방식은 간단합니다. 해당 링크를 클릭하면 일단 여기서 컴퓨터 환경 또는 스마

wezard4u.tistory.com

예전에는 웹에 php를 따로 두어서 코드를 확인할 수가 있었지만, 지금은 코드를 확인할 수가 없었으며 cloudflare 쪽을 이용을 하는것 같습니다. 지난 시간에 국민연금공단 피싱 사이트 하고 비교 해면 무엇인가 다르게 변한 것을 볼 수가 있습니다.

윈도우 애플 iOS Mac OS 식 작동하는 302 코드
윈도우 애플 iOS Mac OS 식 작동하는 302 코드

HTTP/1.1 302 Found
Date: Sat, 12 Aug 2023 14:19:07 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/7.2.20
Location: https://www.nhis.or(.)kr
CF-Cache-Status: DYNAMIC
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare(.)com\/report\
/v3?s=BNbLaEvAWVu9n3UgCuXCNkcnUBJTMEX9uc%2FNJxl3oJ%2Fe5ZiW5arleWo59qpft%2Fy2w
k2MWqp5%2F5n0aByqY33xle%2FmTc5WcEgvvKjJ%2F3aFth3Wq32w%2BYpvQmwQhPWn%2FB1P"}],
"group":"cf-nel","max_age":604800}
NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Server: cloudflare
CF-RAY: 7f5959fadee88a7b-NRT
alt-svc: h3=":443"; ma=86400

다음 다시 돌아와서 계속 분석을 하면 다음과 같습니다.
302 Found 상태 코드는 클라이언트(일반적으로 웹 브라우저)에게 요청한 페이지가 Location 헤더에 제공된 URL인 https://www.nhis(.)or.kr 로 일시적으로 이동되었음을 알림
Date: 응답이 생성된 날짜와 시간
Content-Type: 응답의 콘텐츠 유형을 나타냄 (이 경우에는 text/html)
Transfer-Encoding: 데이터를 인코딩하는 데 사용된 방법
Connection: 잠재적으로 미래 요청을 위해 연결을 유지
X-Powered-By: 서버가 PHP 버전 7.2.20으로 작동 중임
CF-Cache-Status: Cloudflare CDN의 캐시 상태
Report-To / NEL: Cloudflare에 정보를 보고하기 위한 것으로 관련 정보를 제공
Server: 사용 중인 웹 서버 소프트웨어를 나타냄(이 경우 Cloudflare)
CF-RAY:Cloudflare 요청과 관련된 고유한 식별자
alt-svc:클라이언트가 연결할 수 있는 대체 서비스를 나타냄

국민건강공장 피싱 사이트 웹소스 전화 번호 입력
국민건강공장 피싱 사이트 웹소스 전화 번호 입력

그리고 다음에는 전화번호 관련 코드가 있는 것을 확인할 수가 있습니다.

<script type="text/javascript">
function next_page() {
	var info1 = $("#info1").val();
	var info2 = $("#info2").val();
	var info3 = $("#info3").val();
	if(info1 == "" || info2 == "" || info3 == "") {
		alert("핸드폰 번호를 입력하시고 건강검진서를 확인해주세요");
		return;
	}
	$.LoadingOverlay("show", {
		background       : "rgba(0, 0, 0, 0.5)",
		// image            : "images/loading(.)gif",
		maxSize          : 60,
		// fontawesome      : "fa fa-spinner fa-cog fa-spin",
		// fontawesomeColor : "#FFFFFF",
	});
	var phone_num = info1 + info2 + info3;
	$.ajax({
		type: "POST",
		url: `xinde/check_phonenum.php`,
		dataType: 'json',
		data: { "phone_num": phone_num, "hostname": window.location.hostname },
		success: function(resp) {
			if(resp.success) {
				sessionStorage.setItem("page", 1);
				sessionStorage.setItem("id", resp.id);
				location.href='sub01(.)php';
			} else {
				alert(resp.message);
			}
		},
		error: function() {
		},
		complete: function() {
			$.LoadingOverlay("hide");
		}
	});
}

$(document).ready(function() {
	$("#info2").on('input',function(e) {
		if($("#info2").val().length == 4)
			$("#info3").focus();
	});
});
</script>

해당 코드의 설명은 다음과 같습니다.
해당 스크립트는 JavaScript와 jQuery를 사용하여 웹 페이지의 동작을 제어하는 역할
1. next_page() 함수: 해당 함수는 다음 페이지로 이동하는 역할 입력된 핸드폰 번호를 확인하고 필요한 정보를 서버로 전송한 다음 성공 시 sub01.php 로 이동
info1, info2, info3:핸드폰 번호의 세 부분을 입력받는 필드 값
if(info1 == "" || info2 == "" || info3 == ""):핸드폰 번호가 하나라도 비어 있으면 경고 메시지를 띄우고 함수를 종료
$.LoadingOverlay("show", { ... });:화면에 로딩 오버레이를 보여주는 동작을 수행
var phone_num = info1 + info2 + info3;: 입력된 핸드폰 번호를 하나로 합침
$.ajax({ ... });:AJAX를 사용하여 서버로 핸드폰 번호와 호스트 이름을 전송하고 응답을 처리
type`: 요청의 HTTP 메서드를 지정(POST)
URL: 요청을 보낼 URL을 지정.
dataType:서버로부터 받을 데이터의 형식을 지정(JSON).
data:전송할 데이터를 설정
success:요청이 성공했을 때 호출되는 콜백 함수
error:요청이 실패했을 때 호출되는 콜백 함수
complete:요청 완료 후 실행되는 콜백 함수.
$(document).ready(function() { ... });:문서가 로드되었을 때 실행되는 코드 블록
$("#info2").on('input', function(e) { ... });:info2 필드에 입력된 값의 길이를 체크하여 자동으로 다음 필드로 이동하도록 설정
해당 스크립트는 jQuery를 사용하여 웹 페이지에서 사용자 입력을 처리하고 서버와 통신하는 부분을 담당하고 있으며 next_page() 함수는 핸드폰 번호의 입력 여부를 확인하고 서버로 정보를 전송하고, 성공 시 다음 페이지로 이동하는 동작을 수행을 진행합니다.
$(document).ready() 함수는 문서가 로드되었을 때 실행되는 초기화 코드를 담당

Progress Telerik Fiddler Classic 로 본 피싱사이트 전화 번호 전송
Progress Telerik Fiddler Classic 로 본 피싱사이트 전화 번호 전송

http://sa1.f6pt(.)hair/xinde/check_phonenum(.)php

에 서버에 전화번호가 전송되는 진짜 번호와 가짜 번호를 입력해도 전화번호가 맞지 않는다는 메시지를 출력합니다.
보면 유니코드가 있는 것을 확인할 수가 있습니다.

CyberChef 유니코드 변환 작업
CyberChef 유니코드 변환 작업

\uc804\ud654\ubc88\ud638\uac00 \ub9de\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4

그러며 해당 부분인 유니코드는 전화번호가 맞지 않습니다.라고 되어 있는 것을 확인을 할 수가 있습니다.

피싱 사이트 전화 번호 전송 Raw 값
피싱 사이트 전화 번호 전송 Raw 값

해당 부분을 해당 사이트의 Raw를 보면 다음과 같습니다. 

POST /xinde/check_phonenum(.)php HTTP/1.1
Host: sa1.f6pt(.)hair
User-Agent: Mozilla/5.0 (Linux; Android 13; SM-A037U) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36  uacq
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Prefer: safe
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 44
Origin: http://sa1.f6pt(.)hair
DNT: 1
Connection: keep-alive
Referer: http://sa1.f6pt(.)hair/
sec-ch-ua-platform: "Android"
sec-ch-ua: "Google Chrome";v="112", "Chromium";v="112", "Not=A?Brand";v="24"
sec-ch-ua-mobile: ?1

설명을 하면 다음과 같습니다.
1. 요청의 주요 헤더 정보는 다음과 같습니다:
POST /xinde/check_phonenum.php HTTP/1.1**: POST 요청을 http://sa1.f6pt(.)hair/xinde/check_phonenum.php 경로로 보냄
2. Host: 호스트 헤더는 요청을 받을 서버의 도메인 이름을 나타내며 여기서는 sa1.f6pt(.)hair로 설정되어 있음
3. User-Agent: 사용자 에이전트는 클라이언트(브라우저나 앱)가 어떤 소프트웨어를 사용하여 요청을 보내는지 식별하는 정보
해당 경우 사용자는 안드로이드 운영 체제를 사용하며 Google Chrome 브라우저 버전 112를 사용
4.Accept: 클라이언트가 서버로부터 받아들일 수 있는 미디어 타입을 지정
JSON 및 텍스트 형식의 응답을 받아들일 수 있음
5. Accept-Language: 클라이언트의 언어 선호도를 나타냅니다. 여기서는 한국어와 영어를 받아들일 수 있음
6. Accept-Encoding: 클라이언트가 받아들일 수 있는 콘텐츠 인코딩 방식을 나타내며 여기서는 gzip 및 deflate 인코딩을 받아들일 수 있음을 나타냄
7. Prefer: 요청에 대한 클라이언트의 선호도를 나타내며 여기서는 safe이라는 값을 가지며, 안전한 요청을 선호함을 나타냄
8. Content-Type: 헤더는 요청 본문의 데이터 타입을 지정
여기서는 application/x-www-form-urlencoded 로 설정되어 있으며 폼 데이터를 인코딩하여 전송할 것임을 나타냄
9.X-Requested-With:헤더는 XMLHttpRequest에 의해 요청이 보내졌음을 나타냄 이는 주로 AJAX 요청을 식별하는 데 사용
10. Content-Length: 헤더는 요청 본문의 길이를 나타내고 있으며 여기서는 44바이트인 데이터가 요청 본문에 포함되어 있음
11.Origin:해당 헤더는 요청이 어디에서 시작되었는지를 나타내고 여기서는 http://sa1.f6pt(.)hair 에서 시작된 요청임을 나타냄
12.DNT:Do Not Track 신호를 나타내며 여기서는 사용자가 추적을 원하지 않음을 나타냄
13.Connection:커넥션을 유지하고 재사용할 수 있도록 지시
14.Referer:헤더는 요청을 보내는 웹 페이지의 주소를 나타내며 여기서는 http://sa1.f6pt(.)hair/ 에서 요청이 시작되었음을 나타냄
15.sec-ch-ua-platform,sec-ch-ua,sec-ch-ua-mobile: 헤더들은 브라우저의 User-Agent 정보와 관련된 보안 및 개인 정보 보호를 위한 정보를 제공 여기서는 안드로이드 운영 체제에서 Google Chrome을 사용
해당 요청은 check_phonenum(.)php 스크립트로 핸드폰 번호와 호스트 명을 POST 방식으로 보내려는 것으로 이에 대한 서버 응답은 JSON 형식의 데이터

2023-08-12 13:43:20 UTC 기준으로 바이러스토탈(VirusTotal) 에서는 탐지하는 보안 업체들은 없습니다. 그래서 그냥 Avira,Emsisoft,Google Safebrowsing,ESET(이셋),Symantec Sitereview,마이크로소프트 스마트스크린(Microsoft Defender SmartScreen)에 신고했으며
일단 신고 접수 후 보안 업체 관계자들이 분석하고 적용을 하는데 시간에 걸린 것이며 이런 피싱,스팸 이메일을 막으려면 기본적으로 아웃룩, 선더버드, 네이버, 다음에서도 스팸 차단 서비스를 차단을 지원하고 있으니 해당 기능을 활성화해서 사용을 해야 하며 그리고 백신앱들을 설치를 해두면 접속을 했을 때 사용자가 실수가 악성코드 및 접속을 하는 것을 차단하는 데 도움이 될 것이며 부가 기능들도 활용하는 것도 추천합니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band