보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

커맨드 로그 강화와 활용 방법

2020.02.04

6,164



 

 

 

1. 개요


SIEM을 구축하고 활용할 때 사용자의 커맨드 로그(history)는 꼭 수집해야 하는 대상이다. 리눅스 서버는 커맨드 명령을 날려야 액션을 하게 되므로 접근 로그와 커맨드 로그만 제대로 수집해도 로그 분석이 가능하다고 말할 수 있다. 이번 글에서 커맨드 로그 강화 방법에 대해서 알아보자.

 


[표 1] Linux/Unix 로그

 

 

 

 

2. History 로그 강화 방법


기본적으로 사용자가 입력한 커맨드는 ~$HOME/.bash_history 파일에 저장된다. 하지만 history로그 파일을 읽는 모듈을 사용해 ~$HOME/.bash_history 파일을 그대로 SIEM에 수집할 경우 [그림 1]과 같이 연관성 분석과 시계열 분석에 활용하기가 어렵다.

 



[그림 4-1] history 로그 

history로그는 터미널이 종료되는 시점에 ~$HOME/.bash_history 파일에 저장 되는 특징을 가진다. 이러한 특징 때문에 터미널이 종료되는 시간이 일괄적으로 [그림 4-1]와 같이 SIEM에 수집될 수밖에 없다. 또한, 접속한 IP, 사용자, 커맨드를 실행한 디렉터리, 커맨드 성공 여부 등을 남기지 않는다. 
다음은 공격자 관점에서 생각해 보자. 공격자들은 로그인 후 커맨드 로그를 남기지 않기 위해 kill -9 $$ 등의 명령어를 사용해 Shell 자체를 강제로 비정상 종료 함으로써 history 로그 파일에 저장하지 않는 방법을 사용할 수 있다. 또는 history –c 옵션으로 삭제할 수도 있다. 이외도 다양하게 ln –s /dev/null .bash_history 명령어를 사용해 .bash_history를 /dev/null로 링크하거나 아예 ~$HOME/.bash_history 디렉터리를 생성하여 파일이 생성되지 않게 할 수도 있다. 자, 그러면 이런 history 로그의 단점을 보완하기 위해 간단히 설정해보자.

 

1) 설정방법


/etc/profile 하단에 [그림 2]와 같이 설정을 추가하도록 한다. 

 


[그림 2] /etc/profile 설정

 

PROMPT_COMMAND를 활용하면 프롬프트를 표시하기 바로 직전에, PROMPT_COMMAND 변수 안의 내용이 실행된다. 즉, 실시간으로 사용자의 커맨드 로그를 원하는 형태로 파일로 저장할 수 있다.

여기에서 readonly를 추가해 준 것은 사용자가 임의로 PROMPT_COMMAND를 재정의나 설정해제를 불가능 하게 하기 위함이다.

다음으로는 syslog 설정 파일 하단에 [그림 4-3]와 같이 설정을 추가 후 syslog 데몬을 재시작한다.

 


[그림 3] SYSLOG 설정

최종적으로  [그림 4]와 같은 커맨드 로그를 실시간으로 저장할 수 있다. 로그 형식은 다음과 같다. * 시간 호스트 이름 접속 계정: 커맨드 실행 계정 접속 IP [Shell PID] [실행 결과 ( 0:성공 0 이외 실패 ) [명령어 실행 경로]: 실행 커맨드

 


[그림 4] 커맨드 로그 형식

 

 

3. SIEM에서 커맨드 로그 활용

 

위에서 커맨드 로그 강화 설정을 통해서 history 로그의 많은 단점을 해결할 수 있다.

 

1. 커맨드 로그를 실시간으로 SIEM에서 수집 및 활용할 수 있다.

2. 모든 계정의 커맨드 로그를 실시간으로 수집 및 활용할 수 있다. 

3. 접속 계정과 커맨드 실행 계정을 통해 su(substitute user)을 알 수 있다.

4. 커맨드의 실행 성공 여부를 알 수 있다.

5. history 로그의 삭제 여부를 알 수 있다.

6. 접속 IP를 통해 상호 연관성 분석을 할 수 있다.

 

커맨드 로그를 강화함으로써 [검색어] (s_ip:공격자 IP) 검색을 통해 [그림 5] 경계 보안 장비(FW, IPS)부터 엔드 포인트 서버까지 공격자의 행위를 헌팅 할 수 있다. 최초 방화벽 외부로부터 내부 DMZ를 통해 192.168.1.103 번 서버 SSH 포트에 Putty를 통해 root 권한으로 접근 후 /etc/password 파일을 조회 후 igloosec 계정으로 su 하는 것까지 확인 할 수 있다. 

 


[그림 5] 공격자 로그 검색​​

 

 로그 검색을 통해 헌팅 된 결과에서 로그 추적 분석을 실행하면 엔드 포인트까지 공격 경로, 공격 대상, 공격 흐름을 보다 시각적으로 확인할 수 있다.

 


[그림 6] 공격자 로그추적분석

 

 

 

4. SIEM에서 커맨드 로그 경보 활용


SIEM에 수집된 커맨드 로그를 통해서 우리는 다양한 시나리오를 가지고 경보를 걸어볼 수 있다. 주말, 공휴일, 퇴근 이후 야간 시간에 커맨드 로그가 발생하면 경보를 발생시키는 이상 행위 경보, CTI를 연계해 커맨드 로그 접속 IP에 대한 탐지 경보, 외주 직원 전용 IP에서 mount 등 특정 명령어 실행 감사 경보 등이 있다.


많은 관제 센터가 경계 보안 장비 중심의 경보를 발생시키고 분석하지만, 기존의 경계 보안 장비 중심 (FW, IPS, WAF)로는 공격자의 내부망 이동(Lateral Movement)을 잡아내기 힘들다. 이번에 소개할 경보는 공격자의 내부망 이동(Lateral Movement)에 대한 내용이다. 공격자가 history 로그를 지우는 행위가 과거에는 특별한 행위였다면 최근에는 대부분 공격자가 공격 후 history 로그를 삭제한다. 공격자가 호스트 공격 시 내부망 이동(Lateral Movement) 시마다 하는 행위가 history 로그 삭제인 만큼 history 로그 삭제에 대한 모니터링만 수행해도 공격자가 타겟 공격에서 최종 목적을 달성하기 전에 식별이 가능하다.

 

1) 내부망 이동 (History 로그 삭제) 단일 룰 상세 설정 


커맨드 강화 설정을 통해 수집된 커맨드 로그는 ~$HOME/.bash_history 로그가 지워졌었으면 msg 필드에 아무 값도 남지 않는 (null) 값이 된다. 이러 한 로그의 특징을 가지고 [그림 7]과 같이 단일 경보 룰을 설정할 수 있다.

 


[그림 7] 단일 경보 룰 설정

2) 탐지결과


공격자가 kill -9 $$, history –c 등 명령어를 통해 단발성으로 history로그를 지웠다면, [그림 8]과 같이 

1회 성으로 경보가 발생할 것이다. 하지만, ln –s /dev/null .bash_history 명령어를 사용해 .bash_history를 /dev/null로 링크하거나 아예 ~$HOME/.bash_history 디렉터리를 생성하여 파일이 생성되지 않게 했다면, 사용자가 로그인 할 때마다 경보는 발생할 것이다. 

 


[그림 8] 탐지 결과 상세 분석​​

5. Snoopy Logger를 활용한 커맨드 로그 강화​  


앞에서 커맨드 로그를 강화하는 방법을 설명하긴 했지만, 저 방식에도 한계가 존재한다. csh이나 다른 쉘로 변경하거나, ssh 계정@IP (커맨드) 원격 커맨드 실행, 리버스 쉘, 웹쉘을 통한 커맨드 등은 로그를 남기지 않는다. 이런 서버 내 스크립트 부터 모든 커맨드를 로그로 남길 수 있는 도구가 있다. Snoopy Logger가 그 도구이다. KISA>자료실 > 가이드 및 매뉴얼 > 한눈에 보는 로그설정 노트에도 소개되어 있다. https://github.com/a2o/snoopy에서 다운 가능하며, [그림 9]과 같이 참고해 설치와 설정을 하면 된다.

 


[그림 9] Snoopy Logger 설치 및 설정 방법 출처:KISA 한눈에 보는 로그설정 노트(응용프로그램)​  


1) 설정 방법

 

Snoopy Logger는 /etc/snoopy.ini 파일에 로그 포맷을 지정해 주어야 한다. 로그 포맷으로 사용할 수 있는 것은 [그림 10]과 같다.  

 


[그림 10] Snoopy Logger 로그 소스​​ ​  ​

[그림 10] 설정을 참고하거나 좀 더 자세한 로그를 남기기 위해선 [그림 11]를 참고해 /etc/snoopy.ini 파일을 수정해 snoopy-enable 명령어를 통해 snoopy 로깅을 활성화해준다.

 


[그림 11] Snoopy Logger 로그 소스​​ 

2) Webshell 및 Command Injection 로그​ 

 

[그림 12]와 같이 웹쉘을 통해 커맨드를 입력 시 [그림 13]과 같이 일반적인 로그인이 아닌 apache 권한으로 /var/www/html/webshell 디렉터리에서 whoami 명령어가 실행된 것을 확인할 수 있다. Webshell 커맨드 뿐만 아니라, Command Injection 로그 모두 apache 권한으로 로그를 남기게 된다.​   

 


[그림 12] C99Shell 웹쉘​ ​​


[그림 13] Webshell 커맨드 로그​​

웹 로그에서 공격자의 특징은 http_method에 POST가 있다. 하지만 POST로그에서 웹쉘, Command Injection을 탐지하기는 쉽지 않다. 그러나 Snoopy Logger를 사용해 모든 커맨드 로그를 저장하고 활용하면, 웹쉘이나 Command Injection이 apache 권한으로 커맨드를 실행한다는 특징을 활용해 더욱 쉽게 Command Injection과 웹쉘을 탐지할 수 있다. 

 

 

 

 

5. 결론


보안 전략이 외부와의 경계방어에서 선제적 탐지와 대응으로 확장되면서 내부에서 발생하는 위협을 찾아내고 대응하는데 많은 관심이 쏠리고 있다. 복잡한 IT 환경에서 위협을 찾아내고 대응하는데 기본이 되는 기준은 로그이다. 로그마다 한계점이 존재하지만, 그런 한계점을 극복하기 위해 방어자는 적극적으로 로그를 개선해 위협을 탐지하고 대응해야 한다.

 ​