얼마 전 잠시 테스트용도로 외부로 노출시켜놨던 서버에 악성 맬웨어가 감지되었다.
발견된 상황과 해결방법을 아래에 정리해놓았다.
1. 발견
어느 날, DB호출 속도가 조금 느려진것같아, 서버에 접속해 top명령어를 통해 서버 리소스 상황을 확인해보는데, 이상하게 CPU점유율이 높은것을 확인하였다. 확인해보니 busybox라는 프로세스가 매우 과하게 점유하고있었다. 여기서 아 맬웨어구나 라고 직감하게 되었고, 일단 모든 포트 접근을 차단 시킨후, 현재 내가 접속한 세션을 제외한 의심스러운 세션을 확인 한 후, 접속한 세션을 kill 시킨후 작업을 진행했다.
2. 시스템에 열려있는 파일 확인
sudo lsof / | grep 'busybox'
- lsof는 List Open Files 의 약자이다. 현재 시스템에서 열려있는 파일에 대한 정보를 출력해주는 명령이다.
해당 명령으를 통해 확인해보니, /usr/bin/busybox 라는 파일을 찾을 수 있었다. 하지만 확인 결과 이미 deleted된 상태였다.
참고로 리눅스에서는 사용중인 파일이 메모리 캐시에 올라가므로, 사용 중인 파일이 삭제되는게 금지되지않는다.
일단 임시방편으로 해당 파일이 더이상 생성되거나, 덮어쓰기, 실행될 수 없게 강제로 더미파일을 만들어 놓는다.
sudo touch /sr/bin/busybox
sudo chattr +i /usr/bin/busybox
위 설정은 파일의 "속성"을 설정하는 부분이다. 위와 같이 설정을 하면 아무리 root 권한으로 덮어쓰기, 삭제 요청을 하더라도 해당 속성을 무시하고 덮어쓰기나 삭제가 될수 없다. 따라서 스케쥴, cron등을 통해 해당 악성 파일이 주기적으로 재생성되는것을 임시로나마 막을 수 있다.
3. 파일 변경사항 감지
sudo find /bin -mtime -10
- /bin 하위에 있는 파일들 중, 10일전까지 변경사항이 있는 파일들을 감지
해당 명령어를 통해 의심스러운 파일을 발견했다.
/bin/
/bin/sysdr
/bin/crondr
/bin/initr
/bin/entpdate
/bin/lntpdate
/bin/busybox
해당 파일들의 내용을 확인해보니
/bin/bash -c 'cp -f -r -- /bin/sysdr /bin/busybox 2>/dev/null && /bin/busybox -c >/dev/null 2>&1 && rm -rf -- /bin/busybox 2>/dev/null'
해당 명령어를 수행하고 있엇다. 명령어를 분석해보니,
특정 파일을 복사 한후, 파일의 실행결과를 모든 출력에 /dev/null로 리다이렉트 한후, 해당 파일을 삭제하는 명령어이다. 해당 파일들도 동일하게 더미파일을 만들어 변경불가 상태로 만들어준다.
4. 악성 서비스 검색
sudo systemctl list-unit-files | grep enabled
- 자동시작이 설정된 서비스들을 확인한다.
확인해보니 몆몆 의심스러운 서비스들이 확인된다.
ntpdate.service enabled
crondr.service enabled
lntpdate.service enabled
해당 서비스의 내용들을 확인해보니, 기본적으로 2번에서 발견된 파일들을 복제하여 실행하는 명령어를 담고있는 서비스들이였다. 따라서 해당 패턴을 사용하는 모든 서비스들을 확인하였다.
grep --color -E '(rm )|(null)|(cp )' /etc/systemd/system/* /usr/lib/systemd/system/* 2>/dev/null
그 후, 해당서비스들을 모두 삭제시켜주었다.
5. 크론 작업 확인
리눅스에서는 서비스를 제외하고도, 크론기능이란게 있다. 시스템에서 주기적으로 파일이나 명령어를 실행시켜주는 도구이다. 해당 도구에도 감염되었을수도 있기에 확인해주었다.
grep '*' --color /etc/anacrontab /var/spool/cron/crontabs/* /var/spool/cron/* /etc/cron.hourly/* /etc/cron.daily/* /etc/cron.weekly/* /etc/cron.monthly/* /etc/cron.d/* /etc/init.d/down 2>/dev/null
- 해당 명령어는 모든 사용자의 Cron 작업 내용을 표시한다.
해당 명령어를 통해
/etc/cron.d/cron.hourly
/etc/cron.d/apache
/etc/cron.d/nginx
/var/spool/cron/root
의심스러운 크론파일들을 확인하였다. 해당 파일들도 삭제시켜주었다.
chattr -ia ~
rm -f ~
- 파일 삭제,변경 불가 속성이 부여되어있어, 해당 속성을 삭제 한 이후, 강제로 삭제시켜주었다.
6. 로그인시 실행되는 스크립트 제거
리눅스에서는 사용자별로 로그인시 실행되는 스크립트가 존재한다.
해당 스크립트는
/etc/profile
/etc/profile.d/*
~/.bash_profile
~/.bashrc
/etc/bagsdhrc
위 경로에 작성된다.
sudo grep --color '.*' /etc/profile /etc/profile.d/* /home/*/.bash_profile /home/*/.bashrc /etc/bashrc /root/.bash_profile /root/.bashrc
해당 명령어로 경로에 존재하는 모든 파일의 내용을 확인한다.
의심스러운 파일과 내용을 모두 제거해준다.
7. Reboot
위와 같은 작업들을 모두 진행시켜준뒤, 재부팅을 진행해, CPU 점유율, 파일들의 변경사항을 다시 한번 추적해주어 혹시모를 사항에 대비한다.
8. 발단
syslog,secure,postgresql.log등을 통해 접근경로를 확인해보았는데, 일단 기본적으로 임시로 외부방화벽을 잠시 해제시켜놓는것이 발단이 되었던것 같다. 외부 방화벽이 잠시 해제되자, PostgreSQL의 pg_cron 확장프로그램을 통해 침투한것으로 확인된다. 그 후, sudo 권한이 있는 계정을 탈취 한뒤 이와같은 일을 벌인것으로 추정된다.
다행히 위와 같은 작업이후, 다시 해당 프로세스가 재생성되는일은 없었다.
'개발 > DevOps' 카테고리의 다른 글
CI/CD 기본 개념과 Jenkins를 활용한 실습 (0) | 2024.05.20 |
---|---|
RDP(Remote Desktop) SSH 터널 인증방식 도입 (0) | 2024.04.19 |