‘Hi’가 보이는 순간 즉시 감염되는 Mirai 기반의 NoaBot 등장
Executive Summary
Akamai 보안 연구원들은 2023년 초부터 활동해온 새로운 암호화폐 채굴 캠페인을 발견했습니다.
이 멀웨어는 공격자가 수정한 맞춤형 Mirai 봇넷을 사용해 SSH 프로토콜을 통해 확산됩니다.
새로운 봇넷인 NoaBot의 기능에는 웜 가능한 셀프스프레더와 추가 바이너리를 다운로드 및 실행하거나 새로운 피해자에게 자신을 전파할 수 있는 SSH 키 백도어가 포함되어 있습니다.
공격의 일부로 XMRig 채굴기의 수정된 버전이 드롭됩니다. 이 채굴기는 설정을 난독화하고 사용자 지정 채굴 풀을 사용해 채굴자가 사용하는 지갑 주소가 노출되지 않도록 합니다.
이 봇넷이 2023년 7월 Unit 42가 발견한 P2PInfect 웜과 연관되어 있다는 증거를 발견했습니다.
멀웨어 난독화와 사용자 지정 코드는 일반적으로 성숙한 공격자를 나타내는 높은 수준의 운영 보안을 보여주지만, 멀웨어의 바이너리 이름과 포함된 일부 문자열의 이름은 상당히 유치합니다. 이에 따라 특성이 복잡해집니다.
2023년에는 전 세계에 고르게 퍼져 있는 800개 이상의 다양한 공격 IP가 발견되었습니다.
Akamai는 감염 여부를 테스트하는 데 사용할 수 있는 IOC(Indicator Of Compromise), 쿼리, 시그니처, 스크립트를 게시했습니다 .
서론
NoaBot은 또 다른 Mirai기반의 봇넷입니다. Mirai 봇넷 은 Linux 기반 IoT(Internet of Things) 디바이스를 표적으로 삼는 자가 전파가 가능한 봇넷입니다. Mirai 봇넷은 분산 서비스 거부 (DDoS) 공격에 사용됩니다. 최초의 Mirai 봇넷은 2016년에 발견되었지만, 소스 코드가 공개되어현재 다양한 변종이 발견되고 있습니다.
Akamai는 2023년 초에 처음으로 NoaBot 캠페인을 탐지했습니다. 이후 두 차례의 멀웨어 진화를 목격했는데, 이는 추가 난독화 또는 C2(Command and Control) 및 채굴 풀 도메인의 변경으로 구성됩니다(그림 1). 또한 P2PInfect 웜의샘플을 드롭하는 인시던트가 여러 건 발견되었는데, 이는 두 캠페인이 서로 연관되어 있음을 암시합니다.
봇넷
NoaBot 봇넷은 스캐너 모듈과 공격자 모듈, 프로세스 이름 숨기기 등 오리지널 Mirai 봇넷의 기능을 대부분 가지고 있지만, Mirai의 원본 소스 코드와 많은 차이점이 보입니다. 가장 먼저, 이 멀웨어의 스프레더는 Mirai처럼 Telent을 기반으로 하지 않고 SSH를 기반으로 합니다.
SSH 스캐너는 맞춤형으로 제작된 것으로 보이며, 연결이 설정되면 봇넷은 단순히 ‘hi’라는 문자열을 전송하고 연결을 종료하는 매우 특이한 기능을 수행합니다(그림 2). 스캐너의 경우 연결이 존재하는지 확인하기 위해 연결을 열어둘 필요가 없기 때문에 빠르게 종료하는 것이 합리적입니다. 그런데 왜 굳이 ‘hi’를 보내는 것일까요? 그것은 미스터리입니다.
이 멀웨어의 또 다른 특징은 내장된 노래 가사입니다. 봇넷의 초기 샘플에는 Rat Boy와 IBDY의 노래 "Who's Ready for Tomorrow"의 가사가 포함되어 있었습니다(그림 3). Akamai가 아는 한 이 가사는 아무런 목적이 없었습니다. 이후 샘플에는 가사가 없었습니다.
이 봇넷은 SSH 스캐너에 다른 인증정보 사전을 사용하고, 새로운 SSH 권한 키를 백도어로 설치해 추가 바이너리를 다운로드 및 실행하거나 새로운 피해자로 확산하는 등 다양한 유출 후 기능을 포함하고 있다는 점이 Mirai와 다른 점입니다(그림 4).
또한 일반적으로 GCC로 컴파일되는 Mirai(적어도 소스 코드와 작성자 가이드에 따르면)와 달리 NoaBot은 uClibc로 컴파일되기 때문에, 안티바이러스 엔진이 멀웨어를 탐지하는 방식이 달라진 것으로 보입니다. 다른 Mirai 변종은 일반적으로 Mirai 시그니처로 탐지되는 반면, NoaBot의 안티바이러스 시그니처는 SSH 스캐너 또는 일반 트로이 목마로 탐지됩니다(그림 5).
이 멀웨어는 또한 정적으로 컴파일되고 기호가 제거된 상태로 제공됩니다. 비표준 컴파일이라는 점과 이러한 특징으로 인해 멀웨어의 리버스 엔지니어링이 훨씬 더 어려웠습니다.
또한 최신 봇넷 샘플은 문자열을 일반 텍스트로 저장하지 않고 난독화했습니다. 이로 인해 바이너리에서 세부 정보를 추출하거나 디스어셈블리의 일부를 탐색하기가 더 어려워졌지만 인코딩 자체는 정교하지 않고 리버스 엔지니어링이 간단했습니다.
또한 시간이 지남에 따라 명령줄 인수가 추가되었습니다. 가장 흥미로운 것은 ‘noa’ 플래그인데, 이 플래그는 봇넷이 재부팅 후 실행되는 크론탭 항목의 형태로 지속성 메소드를 설치하도록 만들었습니다.
공교롭게도 이 플래그는 봇넷 샘플에 대한 안티바이러스 탐지 결과 중 일부에 접두사 ‘Noa-’가 붙어 있어, 인터넷에서 상당히 많이 사용된 것으로 보입니다.
그림 4에서 볼 수 있는 유출 후 운영은 또 다른 진화입니다. 앞서 조사한 샘플에는 이러한 작업이 존재하지 않았습니다.
채굴기 그리고 지갑 주소를 찾을 수 없는 이유
채굴기 자체는 훨씬 덜 복잡합니다. 표준 XMRig 채굴기이지만 자체적으로 컴파일되었고, 공격자들은 채굴기 실행 전에 일부 코드를 추가해 채굴 설정을 명령줄을 통해 제공하거나 바이너리 내부에 일반 텍스트로 저장하는 대신 추출했습니다(그림 6).
XMRig 설정을 구축하기 위한 함수 호출 전에 몇 가지 다른 함수 호출이 있음을 알 수 있습니다. 실패하면 채굴기가 종료되지만 그렇지 않으면 표준 XMRig 채굴기 로직으로 이동합니다. (위의 디컴파일을 실제 XMRig 소스 코드와 비교할 수 있습니다.) 연구자로서 Akamai가 XMRig 설정에 관심을 갖는 이유는 무엇일까요? 일반적으로 여기에는 채굴기가 연결하는 채굴 풀에 대한 세부 정보와 채굴 대금을 받을 지갑 주소가 포함되어 있습니다. 지갑 주소를 얻고 이 지갑으로 지급된 대금을 추적하면(일반적으로 공개 풀에서 추적) 암호화폐 채굴 작업의 수익성을 추정할 수 있습니다.
하지만 이번에는 공격자들이 Akamai보다 앞서 있었습니다. 이제 설정 구축에 대해 좀 더 자세히 살펴보겠습니다. XMRig 오픈 소스 코드에서 채굴기는 명령줄 또는 환경 변수를 통해 두 가지 방법 중 하나로 설정을 수락할 수 있습니다. 여기서 공격자들은 XMRig 원 코드를 수정하지 않고 대신 주요 기능 앞에 코드를 추가했습니다. 공격자는 명령줄 인수의 필요성(IOC(Indicator of Compromise)를 표시하고 보안팀 직원에게 알릴 수 있음)을 회피하기 위해 채굴기가 자체 명령줄을 더 ‘의미 있는’ 인수로 대체(기술 용어로는 argv 대체)하도록 한 후 XMRig 코드에 제어권을 넘기도록 했습니다. 봇넷은 로그를 인쇄하도록 지시하는 인수를 하나만 사용해 채굴기를 실행합니다.
그러나 명령줄을 교체하기 전에 채굴기는 설정을 구축해야 합니다. 먼저, 세 개의 무작위 문자로 채굴기를 식별하는 rig-id 플래그, 스레드 플래그, 풀의 IP 주소를 나타내는 플레이스홀더 등 일반 텍스트로 저장된 기본 인수를 복사합니다(그림 7).
흥미롭게도 설정이 xmm 레지스터를 통해 로드되기 때문에 IDA는 실제로 처음 두 개의 로드된 인수, 즉 바이너리 이름과 풀 IP 플레이스홀더를 놓치게 됩니다.
다음으로 채굴기는 풀의 도메인 이름을 복호화합니다. 도메인 이름은 몇 개의 데이터 블록에 암호화되어 저장되며, 이 블록은 XOR 연산을 통해 복호화됩니다. XMRig는 도메인 이름으로 작업할 수 있지만, 공격자들은 추가 단계를 거치기로 결정하고 자체 DNS 확인 기능을 구축했습니다. 공격자들은 Google의 DNS 서버(8.8.8.8)와 직접 통신하고 그 응답을 구문 분석해 도메인 이름을 IP 주소로 확인합니다.
설정의 마지막 부분도 비슷한 방식으로 암호화되며, 채굴자가 풀에 연결하기 위한 패스키입니다. 전체적으로 채굴기의 총 설정은 다음과 같습니다.
<miner_binary_name> -o <pool_ip> --rig-id <random_id> --threads <cpus> –pass espana*tea |
빠진 게 있지 않나요? 네, 지갑 주소가 없습니다.
Akamai는 공격자가 공개 풀 대신 자체 프라이빗 풀을 운영하기로 선택했기 때문에 지갑(풀, 룰!)을 지정할 필요가 없다고 생각합니다. 하지만 샘플에서 채굴자의 도메인이 Google의 DNS로 확인되지 않는 것이 관찰되었기 때문에 Akamai의 가설을 증명하거나 풀에서 더 많은 데이터를 수집할 수 없습니다. 최근 채굴기를 삭제하는 인시던트가 발생하지 않았기 때문에 공격자가 더 나은 곳으로 떠나기로 결정했을 수도 있습니다.
Mirai가 너무 오래되어 Rust가 발생했습니다
가장 최근에 발생한 인시던트에서도 P2PInfect 의 샘플이 발견되었는데, 이는 Rust로 작성된 피어 투 피어 자가 복제 웜입니다. P2PInfect는 2023년 7월에 처음 발견되었지만, NoaBot의 활동은 2023년 1월부터 발견되었으므로 P2PInfect보다 약간 앞선 것으로 보입니다. Mirai에서 다른 것으로 바꾼 이유는 무엇일까요? 사용자 지정 코드일 수도 있을까요? 명확한 답은 없지만 몇 가지 추측이 가능합니다.
첫째, 사용자 지정 코드는 수정되기 때문에 용도가 변경된 코드보다 리버스 엔지니어링이 더 어렵습니다. 둘째, 공격자가 기술에 상당히 정통한 것처럼 보이기 때문에 호기심이나 지루함(또는 둘 다)으로 멀웨어 개발을 시도하고 있을 수 있습니다. 마지막으로, P2PInfect가 Redis 서버를 표적으로 삼는다는 점을 고려할 때, 단순히 다른 목적을 위해 다른 툴을 사용하는 경우일 수 있습니다.
단순한 협업이 아니라 동일한 공격자라는 것을 어떻게 알 수 있을까요? 100% 확신할 수는 없지만 거의 근접해 있습니다. 이 모든 것은 멀웨어의 기술적 전문성과 함께 채굴자 이름에 비속어를 삽입하고, 멀웨어 바이너리에 게임 팝송 가사를 삽입하고, 열린 포트를 검색하는 동안 ‘hi’를 보내는 등 내부 농담에 10대 수준의 성숙도가 결합되어 있기 때문입니다.
P2PInfect는 이러한 전통을 이어가고 있습니다. 정교한 툴처럼 보이지만, Unix 소켓을 사용하며 ‘NunzombiE’라는 이름을 사용합니다(그림 8). 실행 중에 난독화되고 디코딩되지만, 이 웜에는 실행 파일에 포함할 수 있는 완벽하게 정상적인 문자열인 ‘fast_vuln_file’ 및 ‘slow_vuln_file’에 대한 문자열도 내장되어 있습니다.
피해자 분석
2023년 한 해 동안 허니팟을 공격한 소스 IP는 849개입니다. 지리적 위치를 살펴보면 전 세계에 걸쳐 상당히 고르게 분포되어 있음을 알 수 있습니다. 이 멀웨어는 자가 전파가 가능해 모든 새로운 피해자가 스스로 공격자가 되기 때문에 이는 당연한 결과입니다. 하지만 눈에 띄는 활동의 핫스팟이 하나 있는데, 바로 중국입니다. 이는 2023년에 발생한 전체 공격의 거의 10%에 해당하는 수치로, 그림 9에서 가장 밝은 핫스팟입니다.
방어, 탐지, 에뮬레이션
멀웨어의 측면 이동 방식은 일반적이고 오래된 SSH 인증정보 사전 공격을 통해 이루어집니다.
네트워크에 대한 임의의 인터넷 SSH 접속을 제한하면 감염 리스크를 크게 줄일 수 있습니다. 또한 멀웨어는 추측 가능한 기본 비밀번호 목록을 사용하기 때문에, 기본 비밀번호나 무작위로 생성된 비밀번호가 아닌 강력한 비밀번호를 사용하면 네트워크 보안을 더욱 강화할 수 있습니다. Akamai는 멀웨어가 사용하는 인증정보 세트를 Github 리포지터리에 공유했습니다.
멀웨어의 바이너리 이름을 찾는 것 외에는 멀웨어 탐지에 대해 할 말이 많지 않습니다. 이 멀웨어는 /lib 아래에 무작위로 생성된 폴더에서 실행되므로 프로세스 이름을 사용하는 것이 좋습니다. 또한 크론 작업이 설치된 경우 이를 탐지할 수 있어야 합니다. 리포지터리에서는 IOC CSV 파일과 채굴에 대한 일부 YARA 시그니처도 제공됩니다.
봇넷의 SSH 스프레더에 대해 사용자 환경을 테스트하려는 경우를 고려해, 오픈 소스 공격자 에뮬레이션 플랫폼인 Infection Monkey용 설정 파일을 만들었습니다(부록에 Infection Monkey 사용 방법에 대한 간단한 설명이 포함되어 있습니다). 멀웨어는 매우 방대한 인증정보 세트를 사용하기 때문에 모든 인증정보를 테스트하는 것은 비현실적이라는 점에 유의하세요(멀웨어는 계산이나 시간 비용을 신경 쓰지 않지만, Akamai는 신경 씁니다). 대신, Akamai는 설정에 더 일반적인 인증정보만 포함하기로 했습니다. 더 많은 인증정보(또는 다른 인증정보)를 포함하려면 이 설정을 기반으로 여러분만의 수정 사항을 자유롭게 포함하세요.
이 Infection Monkey 설정은 또한 Monkey 에이전트 페이로드에서 YARA 시그니처가 트리거되도록 하는 가장 무도회 문자열을 추가하므로 해당 탐지를 테스트하는 데도 사용할 수 있습니다.
Infection Monkey가 사용자 환경 테스트를 완료하면 유출에 성공한 모든 머신에 대한 보고서를 생성합니다. 공격 시뮬레이션을 한 단계 더 발전시키고 더 강력한 인증정보를 테스트하려는 경우, 크립토재킹 플러그인을 사용할 수도 있습니다.
요약
NoaBot은 표면적으로 매우 정교한 캠페인은 아닙니다. 단지 Mirai 변종과 XMRig 크립토채굴기에 불과하며, 요즘에는 흔히 볼 수 있는 공격입니다. 하지만 멀웨어에 추가된 난독화 기능과 원본 소스 코드에 추가된 내용을 보면 공격자의 역량을 완전히 다르게 파악할 수 있습니다. 공격자의 기술력에도 불구하고, 그들은 서로 다른 멀웨어 샘플과 바이너리에서도 지속되는 몇 가지 미숙한 명명 규칙(예: ‘NunzombiE’라는 Unix 소켓)을 가지고 있는 것으로 보입니다. Akamai는 이 특성을 사용해 NoaBot을 P2PInfect와 연관시켰으며, 이 탐지 단서가 향후 멀웨어 캠페인에서도 유효할 것으로 보입니다.
NoaBot을 에뮬레이션할 설정 파일을 가져옵니다.