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

봇넷과의 우연한 충돌

Larry Cashdollar

에 의해 작성

Larry Cashdollar

November 30, 2022

Larry Cashdollar

에 의해 작성

Larry Cashdollar

래리 W. 캐시달러(Larry W. Cashdollar)는 보안 분야에서 18년 이상 취약점 연구원으로 활동해 왔으며 현재 Akamai Technologies의 보안 사고 대응 팀의 일원입니다. 래리는 서던 메인 대학교에서 컴퓨터 공학을 전공했습니다. 래리는 150개 이상의 CVE를 문서화했으며 BSides Boston, OWASP Rhode Island, Defcon에서 자신의 연구 내용에 대한 프레젠테이션을 진행했습니다. 그는 여가 시간에 야외를 즐기고 미니 자전거 엔진을 재조립합니다.

Akamai 연구원들은 암호화폐 채굴 봇넷인 KmsdBot에 대한 연구를 계속해 현재 버전을 비활성화하는 방법을 찾아냈습니다.

핵심 요약

  • Akamai 연구원들은 암호화폐 채굴 봇넷인 KmsdBot에 대한 리서치 중 작성자들이 우연히 봇넷과 충돌한 것을 목격했습니다.

  • 통제된 환경에서 Akamai는 봇에 명령을 보내 봇의 기능과 공격 시그니처를 테스트할 수 있었습니다.

  • 분석 중 신택스 오류가 발생하면서 봇이 명령 전송을 중지했고, 봇넷이 멈추었습니다.

  • 이 특정 봇넷은 시스템에 대한 지속성을 구하는 것이 아니기 때문에 시스템을 재감염시키는 경우에만 임무를 계속 수행할 수 있습니다.

서론

이달 초 Akamai 보안 연구팀은 KmsdBot에 대한 블로그 게시물을 릴리스했습니다. KmsdBot는 SSH와 취약한 인증정보를 통해 피해자를 감염시킨 암호화폐 채굴 봇넷입니다. KmsdBot가 Akamai의 허니팟을 감염시키자 즉시 분석하고 보고서를 발표했습니다.

Akamai는 그 후에도 KmsdBot을 계속 모니터링하여 KmsdBot 무력화한 것을 비롯해 새로운 소식을 공유했습니다. 이 게시물에서는 KmsdBot을 검사하기 위해 취했던 단계를 설명하고 어떻게 명령을 실행해 KmsdBot을 몰락시켰는지 소개합니다.

C2를 C2하기

악성 개체의 가장 치명적인 요소는 명령 및 제어(C2)를 얻을 수 있는 능력입니다. KmsdBot은 C2 기능을 가지고 있었기 때문에 Akamai는 이와 관련된 다양한 시나리오를 테스트하고자 했습니다. 테스트 중에는 RFC 1918 주소 공간에서 IP 주소와 통신할 수 있도록 KmsdBot의 최근 샘플을 수정하는 것이 있었습니다.

이를 통해 통제된 환경에서 작업할 수 있었고, 그 결과 봇의 기능과 공격 신호를 테스트하는 명령을 봇에 전송할 수 있게 되었습니다. 재미있게도 봇은 잘못 포맷된 명령 하나를 받은 후 명령 전송을 중단했습니다. Akamai는 이 지점에서 자연스럽게 조사를 시작하게 되었습니다. 공격자가 자신이 직접 만든 봇넷과 충돌하는 것을 목격하는 경우는 흔하지 않습니다. 

Akamai가 발견한 방법

먼저, 봇넷 코드가 C2를 위해 IP 주소와 포트를 저장한 곳을 찾아야 했습니다. sys.main.connect() 함수를 검사하고 분해 내용을 출력해 확인할 수 있습니다(그림 1).
그림 1: sys.main.connect() 함수의 분해

그림 1: sys.main.connect() 함수의 분해

문자열 조각이 메모리 위치 0x00632f19에 저장되어 있음을 알 수 있습니다. 해당 이진수 주소로 이동하고 콘텐츠가 RFC 1918 공간의 네트워크 주소, 즉 Akamai가 제어하는 192.168.0.0/24의 어느 위치를 가리키도록 수정할 수 있었습니다.

이렇게 하면 C2처럼 행동하고, 샘플 공격 명령을 보내, 네트워크 트래픽을 기록할 수 있는 대상으로 공격 트래픽을 보낼 수 있습니다.

그림 2: 엔디언(endianness)으로 인해 16진수 주소 .861.291을 역으로 씀

그림 2: 엔디언(endianness)으로 인해 16진수 주소 .861.291을 역으로 씀

따라서 새로운 C2는 포트 57388의 192.168.0.31입니다(그림 2). C2는 명료한 텍스트로 통신하므로 Netcat을 사용해 멀웨어 명령을 보낼 수 있습니다. 그런 다음 두 개의 가상 머신을 설정했습니다. 하나는 멀웨어를 폭파하는 것이고, 다른 하나는 C2로 사용했습니다.

테스트 중 봇넷은 잘못 포맷된 명령 하나를 받은 후 공격 명령 전송을 중단했습니다. 그 명령은 다음과 같습니다.

!bigdata www.bitcoin.com443 / 30 3 3 100 

예리하게 관찰하면 대상 웹사이트와 포트 사이의 공간이 부족하다는 것을 알아차릴 수 있습니다. 봇에는 명령이 제대로 포맷되었는지 확인하기 위한 오류 검사 기능이 코드에 내장되어 있지 않습니다.

따라서 잘못 포맷된 명령으로 인해 Go 바이너리가 스택 추적과 충돌해 '범위를 벗어난 인덱스(index out of range)' 오류가 나타납니다. 잘못된 인수 개수가 제공됐기 때문입니다. Akamai는 C2와 봇 설정을 통해 이 이론을 테스트했습니다(그림 3).

그림 3: C2를 에뮬레이션하고 전송되는 잘못 포맷된 명령을 재현

그림 3: C2를 에뮬레이션하고 전송되는 잘못 포맷된 명령을 재현

그림 4: 잘못된 인수 개수가 제공되어 충돌한 봇

그림 4: 잘못된 인수 개수가 제공되어 충돌한 봇

잘못 포맷된 명령은 감염된 머신에서 실행되며 C2와 통신하고 있는 모든 봇넷 코드와 충돌했을 가능성이 높습니다. 즉 봇넷을 죽인 것입니다. 봇은 감염된 머신에서 지속성을 확보하는 기능이 없기 때문에 복구하는 유일한 방법은 봇넷을 처음부터 다시 감염시키고 재구축하는 것입니다.

결론

보안 분야에서 이런 사례는 흔히 접할 수 있는 것은 아닙니다. 제로데이 및 번아웃의 시대에서 오탈자 같은 코딩으로 위협을 방어할 수 있다는 것을 확인할 수 있는 것은 행운입니다. 이 봇넷은 대형 명품 브랜드와 게임사를 노리고 있었지만, 하나의 명령 실패로 더이상 작동하지 못하게 됐습니다. 기술의 변덕스러운 성질과 심지어 공격자도 자신이 만든 봇넷에 의해 악용될 수 있다는 것을 보여주는 강력한 예입니다. 

Akamai 보안 연구팀의 목표는 새로 발견한 사례를 추적, 탐지, 기록, 발표하고, Akamai와 Akamai 고객, 인터넷 전반의 보안과 안정성을 지켜내는 것입니다. Akamai는 공격을 계속 모니터링하고 그 결과를 블로그에 업데이트할 예정입니다. 실시간 보안 리서치를 확인하려면 Twitter에서 팔로우하세요.



Larry Cashdollar

에 의해 작성

Larry Cashdollar

November 30, 2022

Larry Cashdollar

에 의해 작성

Larry Cashdollar

래리 W. 캐시달러(Larry W. Cashdollar)는 보안 분야에서 18년 이상 취약점 연구원으로 활동해 왔으며 현재 Akamai Technologies의 보안 사고 대응 팀의 일원입니다. 래리는 서던 메인 대학교에서 컴퓨터 공학을 전공했습니다. 래리는 150개 이상의 CVE를 문서화했으며 BSides Boston, OWASP Rhode Island, Defcon에서 자신의 연구 내용에 대한 프레젠테이션을 진행했습니다. 그는 여가 시간에 야외를 즐기고 미니 자전거 엔진을 재조립합니다.