환경 설정

7z x Brutus.zip

압축 풀기 삽질

unzip Brutus.zip

파일 압축 형태를 확인해 본 결과 unzip이 아니라 7z를 이용해서 압축을 풀었어야 했다.

wtmp 파일 만들기

압축을 풀자 3개의 파일이 나왔는데, 그중 Brutus python 스크립트를 확인해 본 결과 특정 바이너리 파일을 받아서 text 파일로 바꿔주는 스크립트였습니다. 여기서 utmp 파일의 경우 utmpdump라는 linux utility를 이용해서 바로 분석이 가능합니다. 하지만 저는 utmpdump가 아닌 해당 문제에서 제공하는 스크립트를 이용해서 풀었습니다.

python3 Brutus.py out -o wtmp_out

Task 1

  • 질문 : 무슨 IP 주소를 대상으로 공격자가 brute force 공격을 진행하고 있는지 auth.log파일을 통해 분석하라.

로그 파일을 살펴보다 보면 sshd로 다수의 요청이 들어오는 것을 볼 수 있습니다. 이것은 brute force 공격으로 예상됩니다.

로그 파일을 계속 분석하다 보면 65.2.161.68의 주소로 다수의 요청이 가는 것을 확인할 수 있었습니다.

Task 2

  • 질문 : brute force를 이용해 서버 접속과 종료에 사용된 사용자 이름은 무엇인가?

로그 파일을 살펴보면 root 유저로 로그인을 성공하고, 같은 2491 pid로 로그아웃하는 로그를 확인할 수 있습니다.

Task3

  • 질문 : 공격자가 서버에 수동으로 로그인하여 터미널 세션을 설정하고 목표를 달성한 시점의 UTC 타임스탬프를 찾으시오. 로그인 시간은 세션 시간과 다를 수 있으며, wtmp 아티팩트를 이용해 찾을 수 있습니다.

Task 4

  • 질문 : SSH 로그인 세션은 추적되며 로그인 시 세션 번호가 할당됩니다. 질문 2의 사용자 계정에 대해 공격자의 세션에 할당된 세션 번호는 무엇인가요?

Accepted password for root라는 SSH 로그를 통해 root로 접속에 성공한 것을 볼 수 있으며, 그 바로 밑에 New session 37 of user root라는 로그와 함께 공격자의 세션 할당 번호를 알 수 있었습니다.

Task 5

  • 질문 : 공격자는 지속적인 서버 접속을 위해 새로운 사용자 계정을 만들었습니다. 해당 사용자 계정의 이름이 무엇인가요?

제일 상단에 로그를 보시면 /etc/group에 새로운 cyberjunkie라는 사용자가 추가된 것을 볼 수 있습니다. 또한 아래에는 해당 사용자의 비밀번호가 바뀌었다는 로그까지 찍혀 있네요.

Task 6

  • 질문 : MITRE ATT&CK에서 해당 로그의 사용자 생성 공격의 sub-technique ID는 무엇인가요?

MITRE ATT&CK 사이트에 가서 질문과 같은 사용자 생성과 관련된 기술에 대한 정보를 찾았습니다.

문서를 들어가니 해당 기술에 대한 하위 sub-techniques라는 단어가 보였고, T1136.001, T1136.002, T1136.003 이렇게 3개가 존재했습니다.

그중 T1136.001이 로컬에서 시스템 장악을 유지하기 위한 계정 생성이어서 최종적으로 정답을 T1136.001로 적어서 보냈습니다.

Task 7

  • 질문 : 공격자의 첫 번째 SSH 세션은 auth.log에 따르면 언제 종료되었는가?

위 코드를 보시면 마지막 줄에 removed session 37이라고 해서 위에서 찾은 37번 session id를 가진 사용자가 종료하는 로그를 찾을 수 있습니다.

Task 8

  • 질문 : 공격자가 백도어 스크립트를 설치하기 위해서 사용한 관리자 권한으로 실행한 명령어는 무엇인가요?

해당 로그를 보면 사용자가 /usr/bin/bashcurl 명령어를 날려서 GitHub에 있는 특정 스크립트 파일을 다운로드받는 것을 알 수 있습니다.

wtmp 각 컬럼의 의미

  • type
    • 로그의 레코드 종류
      • BOOT_TIME : 서버가 시작된 시간
      • INIT : getty 프로세스 생성
      • LOGIN : 로그인 프롬프트 상태
      • USER : 실제 로그인 성공 상태
      • DEAD : 세션 종료 상태
      • RUN_LVL : 시스템 런레벨 종류
  • pid
    • 해당 세션/프로세스의 프로세스 ID
  • line
    • 접속한 터미널 (TTY)
  • id
    • tty를 식별하는 내부 ID
  • user
    • 로그인한 사용자 이름
  • host
    • 접속한 원격 IP 또는 hostname
  • term
    • 터미널 관련 플래그 (거의 사용 안 함)
  • exit
    • 세션 종료 상태 코드
  • session
    • 세션 ID
  • sec/usec
    • 로그 시간
  • addr
    • IP 주소 (host와 동일한 정보지만 다른 형식)

새로 배운 내용

CRON

  • 유닉스/리눅스 계열 운영체제에서 특정 시간 혹은 주기마다 명령어나 스크립트를 자동으로 실행하는 시간 기반 작업 스케줄링 기능을 제공하는 프로그램입니다. 따라서 Ctron 관련 파일의 접근권한 설정이 잘못되어 있을 경우 비인가자가 다양한 방법으로 사용자 환경을 변경하여 침해사고를 발생시킬 수 있습니다.
    • [분] [시] [일] [월] [요일] [명령어]
              • : 1분마다 실행
    • 0 0 * * * * : 매일 자정에 실행
    • 30 1 * * * : 매일 새벽 1시 30분에 실행
    • 0 0 * * 1 : 매주 월요일 0시 0분에 실행

리눅스 서버 취약점 보안

  • 취약한 조건 : cron의 접근제어 파일 소유자가 root가 아니며, 권한이 600 이하가 아닐 경우 취약할 수 있습니다.
# 현재 사용자를 root로 전환 
sudo su - 
 
# 모든 사용자의 crontab 목록 확인 
ls -al /var/spool/cron/crontabs/*
# crontab 파일 권한 설정 (소유자만 읽기/쓰기) 
chmod 600 /var/spool/cron/crontabs/<username> 
 
# 디렉토리 자체 권한 설정 
chmod 730 /var/spool/cron/crontabs/

utmp

  • utmp파일은 유닉스/리눅스 시스템에서 사용자 로그인 상태를 기록하는 이진 파일입니다. 별도의 확장자는 따로 없으며 /var/run/utmp 혹은 /var/log/utmp에 주로 존재합니다.
  • u, who, users등의 명령어롤 통해서 내용 조회가 가능합니다.

추가 활동 내용

utmp 동작 원리 분석