Panchan의 채굴 장치: "안녕하세요!"라고 말하는 새로운 Golang P2P(Peer-to-Peer) 봇넷
작성자: 스티브 쿱치크(Stiv Kupchik)
Executive Summary
Akamai 보안 연구원들은 새로운 P2P 봇넷인 Panchan과 2022년 3월에 출현해 Linux 서버를 공격하고 있던 SSH 웜을 발견했습니다.
Panchan은 Golang으로 작성되었으며, 내장된 동시성 기능을 활용하여 전파력을 극대화하고 멀웨어 모듈을 실행합니다.
대부분의 웜에서 흔히 발생하는 "기본" SSH 사전 공격 외에도 이 멀웨어는 SSH 키를 회수하여 래터럴 무브먼트를 수행합니다.
Akamai 보안 연구자들은 멀웨어의 통신 프로토콜 및 관리 패널에 액세스하여 멀웨어의 감염 범위를 분석할 수 있었습니다.
Panchan에서 가장 많은 피해를 입은 분야(통신/VPS 다음)는 교육이었습니다. 여러 학술 기관 간의 협업으로 인해 네트워크에서 SSH 키가 공유될 수 있다고 가정해보면 이 분야가 주요 표적이 된 이유를 알 수 있습니다. Akamai 보안 연구자들은 각 피해자 IP와 관련된 악성 이메일을 발견했습니다.
감지를 피하고 추적 가능성을 줄이기 위해 멀웨어는 디스크 없이 메모리 매핑된 파일인 크립토마이너를 차단합니다. 또한 프로세스 모니터링이 감지되면 크립토마이너 프로세스를 중단합니다.
멀웨어의 활동 및 피해자의 위치 정보, 관리 패널 언어 및 공격자의 Discord 사용자 활동을 근거로 공격자가 일본인이라고 판단했습니다.
Akamai MFA는 SSH 키 수집으로 인한 리스크를 완화할 수 있습니다. 또한 확산에 아주 기초적인 기본 암호 목록이 사용되기 대문에 강력한 SSH 암호를 구성하면 멀웨어를 멈출 수 있습니다. 또한 감염 테스트에 사용할 수 있는 IOC, 쿼리, 서명 및 스크립트도 게시했습니다.
서론
Panchan의 채굴 장비는 다양한 기능을 갖춘 Golang 봇넷과 크립토재커입니다. 이 P2P 프로토콜은 TCP를 통한 평문이라 간단하게 사용할 수 있지만 봇넷을 분산시키기에는 충분히 효과적입니다. 또한 끈기와 인내심을 발휘해 회피를 모니터링할 수도 있습니다.
멀웨어에 포함된 “godmode”는 마이닝 구성을 편집할 수 있는 관리 패널이며, 이는 다른 피어로 분산됩니다. 원치 않는 변경을 방지하기 위해 godmode에 액세스하는 데는 비공개 키가 필요하며, 이 키는 마이닝 구성 서명에 사용됩니다. 멀웨어는 제공된 비공개 키를 검증하는 데 사용되는 공개 키를 포함합니다. 일본어로 작성된 관리 패널을 통해 작성자의 지리적 위치를 유추할 수 있습니다.
봇넷은 SSH 키를 수집함으로써 독특하면서도 새로운 래터럴 무브먼트 접근 방식을 도입합니다. 대부분의 봇넷처럼 무작위 IP 주소에 대해 무차별 암호 대입 또는 사전 공격을 사용하는 대신 멀웨어는 id_rsa and known_hosts 파일을 읽어 기존 자격 증명을 수집하며 이를 사용해 네트워크에서 래터럴 무브먼트를 수행합니다.
멀웨어는 Golang으로 작성되었으며, Golang의 동시성 기능을 동시 Go 루틴으로 실행하여 대부분의 주요 로직에 사용합니다. 공격자는 최신 Go 릴리스에 기반을 두고 있는데, 가장 처음 탐지된 멀웨어 버전(2022년 3월)은 Go 1.17.7(2022년 2월 출시)을 사용해 컴파일되었으며, 최근 샘플은 Go 1.18(2022년 3월 출시)로 컴파일되었습니다. 또한 Go 1.18은 내부 데이터 구조가 일부 변경되었으므로 온라인 도구나 IDA 디스어셈블러가 멀웨어를 올바르게 구문 분석하고 함수 이름과 함수 포인터를 일치시키는 작업을 수행할 수 없었습니다. 이 시리즈의 부록 A: Go 리버싱 개요에서는 이를 문제를 어떻게 극복했는지 설명합니다.
이 보고서에서는 멀웨어의 기능, 멀웨어를 감지한 방법 및 멀웨어를 설명하기 위해 진행한 프로세스를 자세히 알아봅니다.
IoC의 목록은 여기에서 Github 리포지토리를 확인하면 됩니다.
멀웨어 활동
Akamai 보안 연구팀은 글로벌 센서 네트워크에서 봇넷과 멀웨어 활동을 선제적으로 모니터링합니다. 이 팀에서는 2022년 3월 19일에 Panchan의 활동을 처음 발견했습니다. 멀웨어의 P2P 통신 및 감염성에 주목했으며, 추가 조사가 필요하다고 판단했습니다.
멀웨어를 리버스 엔지니어링하는 동안 봇넷 네트워크에 "튜닝"할 스크립트를 개발했으며, 이를 통해 이 팀에서는 감염된 시스템(봇넷 피어)의 전체 목록을 수집할 수 있었습니다. 209개 피어를 발견했으며, 이 중 40개는 현재도 활성 상태입니다.
목표물이 전 세계에 분산되어 있기는 하지만 아시아에 더 많이 집중되어 있는 것으로 보입니다.
나중에 자세히 설명하겠지만 공격자가 일본에 근거를 두었다는 추정을 통해 목표물의 많은 수가 아시아에 있다는 사실을 설명할 수 있습니다. 이 멀웨어에 배후 조직이 있는 것으로 판단되지 않는 것으로 보아 공격자가 가깝고 친숙한 대상을 고수했다는 설명은 타당해 보입니다.
피해자의 업종을 살펴보면 대부분의 대상 IP가 호스팅/VPS 플랫폼에 등록되어 있어 정보가 많지 않습니다. 모니터링 대상 피해자 중 가장 흔한 분야는 교육이었습니다. 이는 잘못된 암호 사용 때문이거나 도난된 SSH 키를 사용한 멀웨어 고유의 래터럴 무브먼트 기능과 관련이 있을 수 있습니다. 비즈니스 부문보다는 서로 다른 학술 기관의 연구자들의 협업이 더욱 빈번하게 이루어지며, 조직/네트워크 외부의 시스템에 대한 인증에는 자격 증명이 필요할 수 있습니다. 해당 가설을 강화한 근거로서 연루된 일부 대학이 같은 국가(예: 스페인)에 있거나 같은 지역(예: 타이완과 홍콩)에 있다는 사실을 확인했습니다.
멀웨어 기능의 살펴보기
감염 벡터 - SSH 웜
멀웨어는 SSH를 통해 자체적으로 확산될 수 있습니다. 표적 및 인증 세부 정보를 생성하는 방법으로는 다음과 같은 두 가지가 있습니다.
기존 SSH 키
멀웨어는 SSH 구성 및 키에 대해 실행 중인 사용자 홈 디렉토리를 살펴봅니다. 이는 ~HOME/.ssh/id_rsa 아래의 비공개 키를 읽고 이를 활용해 ~HOME/.ssh/known_hosts에서 찾은 IP 주소에 대해 인증을 시도합니다. 이것은 다른 멀웨어에서 사용되지 않은 새로운 자격 증명 수집 방법입니다.
무차별 인증정보 대입
이 멀웨어는 IP 주소를 무작위로 선택하고 미리 결정된 사용자 및 암호 목록을 사용하여 사전 공격을 시도할 수 있습니다. 무차별 대입 스프레더는 별도의 프로세스에서 여러 번 생성되며, 열려 있는 파일에 대한 OS의 설정 제한에 의해서만 제한됩니다. 사용자 이름과 암호는 매우 간단하며, "ubuntu," "root," "user," '‘debian," "pi," 같은 기본 문자열을 조합합니다.
표적에 대한 인증에 성공하면 멀웨어는 루트 디렉토리 / 아래에 임의의 이름으로 숨겨진 폴더를 만들고 sftp를 사용해 xinetd 이름으로 숨겨진 폴더에 자신을 복사합니다.
그런 다음 멀웨어는 표적 시스템에서 복사된 바이너리를 원격으로 실행 nohup사용)하고 명령줄을 통해 피어 목록을 전달합니다. 성공적으로 감염시킨 이후 멀웨어는 Discord 웹훅에 대한 HTTPS POST 작업을 개시하는데,이 웹훅은 피해자 모니터링에 사용되는 것으로 보입니다.
P2P 통신
이 봇넷의 P2P 프로토콜은 매우 단순합니다. 모든 것이 TCP 포트 1919를 통해 평문으로 전송됩니다. 모든 피어는 이 포트에서 수신 대기하며 iptable에서 허용하는 규칙을 생성합니다. 각 메시지는 pan-chan's mining rig hi!로 시작되고 finish로 끝납니다. 그 사이에 멀웨어는 줄바꿈으로 구분된 구성 명령을 전송합니다. 지금까지 확인된 구성 옵션은 sharepeer 및 sharerigconfig 두 가지만 있습니다.
sharepeer 는 매우 간단합니다. 뒤에 IP가 이어지며, 이 IP는 멀웨어의 내부 피어 목록에 추가됩니다.
sharerigconfig 는 뒤에 base64로 인코딩된 문자열이 오며, 이는 실제로 마이닝 구성을 인코딩하는 JSON 구조이자 해당 구성의 서명입니다.
서명은 진위를 보증하기 위해 내부적으로 저장된 공개 키를 사용하여 유효성이 확인됩니다. 통신 로직도 간단합니다. 피어에 연결하거나 피어에서 연결하면 멀웨어가 이전에 실행이 시작될 때 얻은 메모리 저장 구성을 구문 분석하고 메시지 문자열을 생성하여 전송합니다. 반대 측에서도 유사한 메시지를 수신하여 구문 분석합니다. 피어 목록에 새 피어가 추가되고, 최신 버전인 경우 구성이 덮어쓰여집니다.
업데이트를 확인하기 위해 멀웨어는 저장된 피어에 정기적으로 연결합니다.
Godmode
이는 아마도 멀웨어에서 가장 독특한 기능일 것입니다. 관리 패널이 멀웨어 바이너리에 바로 내장되어 있기 때문입니다. 이를 실행하려면 멀웨어에 godmode 문자열을 첫 번째 명령줄 인수(피어 목록이 이어짐)로 전달해야 합니다.
접속 확인
관리 패널이 멀웨어에 통합되어 있다고는 해도 누구나 액세스할 수 있는 것은 아닙니다. 패널에 대한 원치 않는 액세스를 방지하기 위해 멀웨어는 먼저 비공개 키를 요청하며, 유효성 검사 후에만 인터페이스에 액세스할 수 있습니다.
필요한 비공개 키가 없어 키 유효성 검사를 건너뛰고 제공된 비공개 키를 수락하도록 프로그램을 패치했습니다(단일 JZ-JMP 수정만 필요함).
관리 패널: stats
비공개 키를 제공하고 "로그인"하면 현재 구성에 대한 상태 화면이 나타납니다.
첫 번째 섹션은 피어 통계로, 멀웨어의 명령줄에 전달된 피어 목록을 기반으로 godmode를 실행하기 전에 연결됩니다(분석하는 동안 피어 목록을 제공하지 않으므로 0임).
두 번째 섹션은 크립토마이닝 구성입니다. 피어 간에 전송되는 마이닝 구성과 형식이 동일하지만 영어 대신 일본어 텍스트가 사용됩니다. 언어 차이는 프로그래밍이 쉽기 때문에 발생할 수 있습니다. 일본어 텍스트를 출력하는 것은 간단하지만 구문 분석이 더 어려우므로 멀웨어 작성자는 피어 간에 전송되는 구성에 영어를 사용했습니다.
마지막으로 다음 옵션이 포함된 메뉴가 제공됩니다.
상태 화면 새로 고침
활성 피어 목록 인쇄
마이너 설정 업데이트
종료
파일리스 마이너
이 멀웨어는 xmrig 및 nbhash의 두 가지 마이너를 배포합니다.. 두 마이너 바이너리는 모두 멀웨어 바이너리 자체 내부에서 base64로 인코딩되어 있으며 런타임 중에 추출되어 실행됩니다. 그러나 실행에 새로운 점도 있는데, 이는 마이너가 디스크에 전혀 추출되지 않기 때문입니다. 대신 멀웨어는 UNIX 함수인 memfd_create 를 사용하여 마이너 바이너리 콘텐츠가 포함된 메모리 매핑 파일을 생성하므로 추적 가능한 파일 시스템 경로 없이 메모리에서 직접 실행할 수 있습니다. 다양한 봇넷 피어에서 추출한 구성을 보면 멀웨어가 마이닝 풀과 지갑에 NiceHash 를 사용하는 것으로 보입니다. NiceHash 지갑은 블록 체인 지갑이아니므로 트랜젝션 및 마이닝 세부 정보를 확인해 실제 수익을 측정하기 할 수는 없습니다.
킬 방지
멀웨어는 전송된 Linux 종료 신호(구체적으로는 SIGTERM-0xF 및 SIGINT-0x2)를 포착하여 무시합니다. SIGKILL이 처리되지 않기 때문에 멀웨어를 종료하기가 더 어렵기는 하지만 불가능하지는 않습니다( POSIX standard, 313페이지에 따르면 처리가 불가능함).
모니터링 방지
이 모듈은 내부적으로 antitaskmanager라 불리지만 그 이름과는 달리 작업 관리자의 운영을 방해하지 않습니다. 대신 이 멀웨어는 프로세스 top 및 htop을 지속적으로 찾습니다. 검색이 완료되면 현재 실행 중인 마이너 프로세스를 종료합니다.
지속성
멀웨어는 자신을 /bin/systemd-worker 에 복사하고 같은 이름으로 systemd 서비스를 생성합니다. 이는 의심을 줄이고 조사를 피하기 위해 합법적인 시스템 서비스를 모방하는 방편일 수 있습니다.
속성
비공개 키의 유효성을 검증하는 동안 godmode 패널에 표시되는 추가 화면이 있습니다.
저작권 주장은 상당히 흥미롭습니다. 둘 다 Panchan을 언급하고 있으며 실제 Discord 서버를 가지고 있기 때문입니다. 이 링크를 통해 실제로 해당 서버에 연결할 수 있으며 Panchan이 사용하는 실제 Discord 사용자 이름도 확인할 수 있습니다. 이 서버가 SSH 연결이 성공한 후 멀웨어에서 보고하는 서버와 동일하다고 가정합니다.
우리는 공격자에 대한 정보를 찾고 멀웨어가 감염 흐름의 일부로 전송하는 Discord 알림을 확인하기 위해 서버에 접속했습니다. 그러나 아무 것도 찾을 수 없습니다. 3월에 올라온 다른 회원의 인사말을 제외하고는 기본 채팅에 아무런 내용이 없었습니다. 다른 채팅은 서버 권한이 더 높은 구성원만 사용할 수 있기 때문에 표시되지 않았습니다. 우리가 발견한 유일하게 유용한 정보는 서버가 2022년 3월 초에 생성되었다는 것이었으며, 이는 멀웨어에 대해 처음 관찰된 내용과 매우 가까운 시기였습니다.
해당 사용자의 다른 활동을 찾아보니 Privex(VPS 공급자)의 Discord 서버에서도 활성 상태인 것을 확인할 수 있습니다.
일반 VPS 외에도 Privex는 블록 체인 노드 소프트웨어가 사전 설치된 VM도 제공합니다. 이는 공격자가 자체 서버를 호스팅하는 데 이를 활용하거나 크립토재킹을 위해 VM을 적극적으로 겨냥하고 있다는 의미일 수도 있습니다.
탐지 및 방어
탐지를 지원하기 위해 감염 테스트에 사용할 수 있는 IOC와 Yara 및 Snort 서명으로 리포지토리 를 만들었습니다. 또한 VM에서 실행할 수 있는 bash 스크립트도 개발했습니다. 이를 통해 다음과 같은 지표를 찾습니다.
프로세스 systemd-worker
프로세스 xinetd, /bin 또는 /sbin이 아닌 다른 경로에서 실행되는 경우
TCP 포트 1919에서 수신 대기하는 프로세스
또한 TCP 포트 3380 및 3387을 통해 나가는 통신은 크립토마이닝 풀에 대한 트래픽을 나타낼 수 있습니다.
네트워크를 선제적으로 방어하려는 독자를 위한 권장 사항은 다음과 같습니다.
안전하고 복잡한 비밀번호를 사용합니다. 멀웨어는 어떤 프로덕션 시스템에서도 구성할 수 없는 매우 제한된 수의 기본 사용자 이름과 비밀번호 조합을 사용합니다. 강력한 암호를 만들면 멀웨어의 영향을 크게 줄일 수 있습니다.
가능한 경우 MFA를 구성합니다. MFA를 사용하면 무단 로그인 시도를 방지할 수 있습니다. Akamai MFA를 사용하면 SSH 키 수집으로부터 보호할 수 있습니다.
가능한 경우 네트워크를 분할합니다. SSH를 통해 시스템을 인터넷에 개방하는 것이 정당하더라도 인터넷에서 연결할 수 있는 사람과 네트워크 내부에서 연결할 수 있는 사람을 제어하는 것이 좋습니다. 이러한 액세스 제어를 구성하면 침해 당한 시스템이 네트워크에 미칠 수 있는 영향을 줄일 수 있을 뿐 아니라 전반적인 공격 표면도 줄일 수 있습니다.
VM의 리소스 활동을 모니터링합니다. 크립토재킹을 목표로 하는 이와 같은 봇넷은 컴퓨터의 리소스 사용량을 비정상적인 수준으로 끌어올릴 수 있습니다. 지속적으로 모니터링하면 의심스러운 활동을 알아차릴 수 있습니다. Panchan의 경우 리소스 사용량을 모니터링했다면 크립토마이닝을 완전히 끝낼 수 있었을 것입니다.
부록 A: Go 리버싱 개요
Go 실행 파일은 정적으로 컴파일됩니다. 즉, 모든 실행 파일의 종속성이 바이너리로 직접 컴파일됩니다. 이렇게 하면 많은 기능이 포함된 대용량 바이너리가 생성됩니다(참고로, 당사의 멀웨어에는 약 3,700개의 기능이 포함되어 있었고, 용량은 30MB였습니다).
스택 추적을 지원하기 위해 Go의 바이너리 내에는 함수 이름과 포인터를 일치시키는 pclntab 구조가 있습니다. 이는 스트립된 바이너리에도 존재하므로 함수 이름을 찾는 데 사용할 수 있습니다.
Go 1.18에서는 이 구조가 변경되었습니다. 이전에는 바이너리의 위치에 대한 포인터를 보유했는데 이제는 특정 위치의 오프셋을 대신 보유하는 경우 함수 포인터는 이제 첫 번째 Go 함수(위 그림에서 text_start로 주석 처리된 pcln 구조에서 가리키는 함수)의 오프셋이고, 이름 포인터는 함수 이름 어레이 시작 위치의 오프셋이며, 둘 다 오프셋에서 함수 데이터를 보유하는 다른 어레이에 대해 참조됩니다.