꿈을꾸는 파랑새

오늘은 Kimsuky(김수키) 이력서를 악용한 Rokrat 악성코드인 이력서(박X민).lnk 에 대해서 글을 적어보겠습니다.
파일명:이력서(박X민).lnk
사이즈:1 MB
MD5:1f378c0efc13669dada1fe340c6837bd
SHA-1:215343916d101c6bbe287871816e063c78103dd1
SHA-256:a4f72ce8b5736fe3ca2083cfe21bd51697f12e900e307c357cb8523b8f86e3ec

악성코드 분석

악성코드 내부 모습
악성코드 내부 모습

악성코드는 사용자 정의 인코딩
1.숫자 문자열 준비
파일 초반에 아주 긴 숫자 문자열이 보일것입니다.
그냥 숫자 목록이 아니라 공격자가 숨겨 놓은 인코딩된 바이트
보통은:평문 문자열,Base64,외부 파일/리소스
내부에 Invoke-WebRequest,FromBase64String,http, DownloadString 같은 악성 행위를 암시하는 문자열이 있으면 보안 제품이 잡기 쉬운데 숫자만 잔뜩 있으면 바로 의미를 파악하기 어렵게 하는 방식을 사용하고 있음
2.비효율적으로 숫자 파싱
스크립트는 이 숫자 문자열을 .Split으로 쉽게 자르지 않고 문자 하나씩 읽으면서 공백이 나올 때마다 숫자를 완성
코드는 의미상 다음과 같음
숫자 문자열을 앞에서부터 한 글자씩 읽음
공백을 만나기 전까지 임시 문자열에 누적
공백이 나오면 지금까지 쌓은 숫자를 byte로 변환

17.vbs 내용
17.vbs 내용

리스트에 추가
다시 다음 숫자를 읽음
난독화
3.복호화 키 설정
다음으로 키 문자열이 나옴
해당 부분은 키 Kdt&^%bgek 를 UTF-8 바이트 배열로 바뀜
4.실제 복원 로직
키 바이트를 하나 선택
그 값에 103을 더함
현재 인코딩된 숫자와 비교
키+103 >= 현재 값이면 키+103 - 현재 값
아니면 그냥 현재값을 그대로 사용
키는 끝까지 가면 처음부터 반복
그냥 공격자가 만든 커스텀 바이트 변형 규칙
해당 복호화 로직이 이상한 이유
즉 어떤 바이트는 변환되고, 어떤 바이트는 아예 그대로 통과
이게 의미하는 건 두 가지 가능성
일부 문자는 의도적으로 원본 그대로 두기
예를 들어 공백, 줄 바꿈, 특정 ASCII 범위 문자를 보존해서 결과 문자열이 망가지지 않도록 했을 수 있음
복원 결과가 완전한 암호문 해제가 아니라 부분 복원
특정 바이트만 건드리고 나머지는 유지해서 사람이 보기 어렵고 탐지도 어려운 상태로 만드는 방식
키를 반복해서 쓰는 방식
$j가 증가하다가 키 길이에 도달하면 0으로 돌아간다.
Kdt&^%bgek 라는 키를 계속 반복
이런 구조는 일종의 반복 키 기반 난독화 라고 볼 수 있다.
5.복원된 바이트를 문자열로 변환
지금까지 만든 바이트 배열을 UTF-8 문자열로 변환
즉 $qqpvm 안에는 사람이 읽을 수 있는 또는 PowerShell이 실행할 수 있는 실제 2차 스크립트 내용이 들어감
6. 사용자 하드 디스크에 파일로 저장
여기서 복원된 코드를 %APPDATA%\firefox.ps1에 사용
%APPDATA%를 사용하는 이유
일반 사용자 권한으로도 쓰기 쉬움
사용자 프로필 아래라서 눈에 잘 안 띔
악성코드가 자주 사용하는 위치
firefox.ps1 같은 이름을 사용해서 사용자가 보면 브라우저 관련 파일로 오해할 수 있는 동시에 보안 분석 시 한눈에 이상함이 안 보이게 함
7.숨김 실행
방금 만든 firefox.ps1를 바로 실행
각 옵션 의미는:
-windowstyle hidden:PowerShell 창을 숨긴다.
-ExecutionPolicy Bypass:기본 실행 정책을 우회
기업 환경이나 일반 Windows 설정에서는 서명되지 않은 스크립트 실행이 제한될 수 있는데 해당 옵션으로 그 제한을 무시하려는 것

17.vbs 분석

Chr(숫자) 함수가 사용
WScript.Shell 이나 Bypass 같은 위험 키워드를 스캔하지 못하도록 숫자로 숨겨놓은 것임
실행 대상:c:\PerfLog\www(.)ps1
PerfLog 폴더는 시스템 성능 로그가 저장되는 곳이라 일반 사용자는 관심 없는 곳임
여기에 악성 스크립트(www(.)ps1)를 숨겨둠
Bypass 옵션을 통해 시스템에 설정된 PowerShell 실행 제한 정책을 완전히 무시하고 강제로 실행
은밀한 실행 (Hidden)
여기서 가장 중요한 부분은 숫자 0
0:창 숨김(Hidden) 즉 사용자 화면에는 검은색 커맨드 창이 전혀 나타나지 않으며 백그라운드에서만 동작하게 하기 위해서임
True:해당 스크립트가 종료될 때까지 대기

sch_ha.db 분석

실행 주기 (Repetition): PT17M (17분마다)
17분이라는 매우 짧은 간격으로 악성 스크립트를 지속성 확보
/b 옵션: 배치 모드로 실행하여 스크립트 오류나 프롬프트를 사용자에게 보여주지 않음
앞서 언급된 C:\PerfLog 경로의 VBS 파일을 호출
실행 조건
WakeToRun:컴퓨터가 절전 상태일 때도 깨워서 실행
RunOnlyIfNetworkAvailable:네트워크가 연결되어 있을 때만 실행(공격자가 통신을 하기 위함)
DisallowStartIfOnBatteries false (노트북이 배터리 모드일 때도 실행)

악성코드 작업스케줄러에 예약
악성코드 작업스케줄러에 예약

www(.)ps1 분석

1.시스템 식별자 생성
함수는 해시 전체를 쓰지 않고 앞 8바이트만 잘라서 16자리 hex 문자열 비슷한 형태로 만듬
현재 연결 중인 NIC의 MAC 주소 가져옴
그 MAC 주소를 MD5 해시
앞 8바이트만 써서 피해자 식별자 생성
즉 $iid는 감염 호스트를 구분하기 위한 bot ID 같은 역할
2.Dropbox OAuth 자격 증명 내장
API 호출이 아니라 공격자가 이미 소유한 Dropbox 앱 자격 증명을 스크립트 안에 넣어둔것
refresh token
client_id
client_secret
을 사용을 해서 새 access token을 받아 오는 것이 특징
3. 감염 호스트 정보 수집
수집 정보
OS 버전
외부 공인 IP
도메인, 사용자이름
현재 실행 중인 프로세스 목록
그리고 내용을 임시 파일에 저장
4.Dropbox 토큰 발급
Dropbox API로 access token을 발급받는 정상 API 형식이지만 여기서는 악성코드 실행을 하기 위함
하드코딩된 refresh token으로
런타임 access token 생성
이후 Dropbox API 호출에 사용
5. 피해자별 폴더 생성/확인

www(.)ps1
www(.)ps1

예를 들면 이런 경로가 된다.
/Zzz02_A1B2C3D4E5F6 방식 감염 호스트마다 Dropbox 안에 개별 폴더를 만듬
hxxps://api(.)dropboxapi(.)com/2/files/get_metadata
hxxps://api(.)dropboxapi(.)com/2/files/create_folder_v2
를 사용을 해서 
폴더가 있으면 그대로 사용
없으면 새로 생성
6.감염 정보 업로드
생성한 임시 파일을 Dropbox에 업로드
파일명은:YYYY_MM_DD__HH_MM_info(.)ini 형식을 사용함
7.원격 명령 파일 경로 준비
공격자는 Dropbox에 저 이름의 파일을 만들어 두면 감염 호스트가 그걸 가져가게 됨
8.BAT 파일 다운로드
임시 BAT 경로를 만들고 Dropbox의 _ToKo 파일을 TEMP 아래 랜덤 BAT 이름으로 저장
9.다운로드 성공 여부
파일이 없으면 조용히 끝나고 있으면 다음 단계로 이동
10.명령 파일 처리 후 이름 변경
다운로드 후 Dropbox 안의 원본 파일을:
_ToKo->_ToKo_set 으로 변경
11.BAT 숨김 실행
쉽게 이야기하면 
네트워크 어댑터 MAC 주소 획득
MAC 주소를 MD5 해시해서 8바이트짜리 식별자 생성
사용자,OS,프로세스,IP 수집
Dropbox OAuth 토큰 갱신
Dropbox 경로 /Zzz02_<식별자> 확인 또는 생성
수집 정보 파일을 ..._info(.)ini 이름으로 업로드
같은 Dropbox 폴더에서 _ToKo 파일 다운로드 시도
받으면 이름을 _set으로 바꾸고 받은 BAT 파일을 cmd.exe /c로 숨김 실행
디코이는 늦게 실행을 해서 확보를 하지 못함

공유하기

facebook twitter kakaoTalk kakaostory naver band