선릉역 1번 출구
[adventofcyber2023] - Day_7_Log analysis ‘Tis the season for log chopping! 본문
[adventofcyber2023] - Day_7_Log analysis ‘Tis the season for log chopping!
choideu 2023. 12. 9. 11:47Story: 인수 과정에서 자신을 지역 관리자로 강등시킨 회사에 대한 복수를 위해 Tracy McGreedy는 다크 웹에서 다운로드한 악성코드인 CrypTOYminer를 모든 워크스테이션과 서버에 설치함. McGreedy에게 알려지지 않은 사실은 해당 악성코드에는 데이터 도용 기능이 포함되어 있어 악성코드작성자가 데이터를 갈취할 수 있다는 것임. 악성코드가 실행되어 비정상적인 트래픽이 발생하는 지금, 대규모의 데이터 대역폭이 네트워크를 움직이는 것으로 관찰되는데...
목표: 로그 파일과 그 중요성을 다시 살펴보기, 프록시가 무엇인지 이해하고 프록시 로그의 내용을 분석하기, 로그 항목을 수동으로 구문 분석하는 Linux 명령주 ㄹ기술 구축하기, 일반적인 사용 사레를 기반으로 프록시 로그 분석하기
1. Log primer
- 로그 파일이란 무엇일까?
- 컴퓨터나 소프트웨어 응용 프로그램의 뒤에서 일어나는 일에 대한 디지털 흔적과 같음
- 중요한 이벤트, 작업, 오류 또는 정보가 발생하는 대로 기록됨
- 문제 진단
- 성능 모니터링
- 프로그램이나 응용 프로그램이 수행하는 작업 기록
아파치 로그 예시
158.32.51.188 - - [25/Oct/2023:09:11:14 +0000] "GET /robots.txt HTTP/1.1" 200 11173 "-" "curl/7.68.0"
| 필드 | 값 | 설명 |
| Source IP | 158.32.51.188 | HTTP 요청을 시작한 컴퓨터 |
| Timestamp | [25/Oct/2023:09:11:14 +0000] | 이벤트가 발생한 날짜와 시간 |
| HTTP request | GET /robots.txt HTTP/1.1 | 요청 방법, URI 경로, HTTP 버전을 포함한 실제 HTTP 요청 |
| status code | 200 | 웹 애플리케이션의 응답 |
| user agent | curl/7.68.0 | Request Source에서 사용하는 User agent |
*로그 항목을 해석할 수 있으면, 디버깅 목적이든 잠재적인 위협 활동 추적이든 관계없이 상황에 맞는 이벤트 분석이 가능
2. Proxy Server란?
- 프록시 서버란 컴퓨터나 장치와 인터넷 사이 중개자임
- 정보를 요청하거나 웹 페이지에 액세스하면 장치는 대상 서버에 직접 연결하는 대신 프록시 서버에 연결됨
- 프록시 서버는 내 request를 인터넷으로 전달하고 응답을 받아 다시 내 device로 forwarding 해줌

- 프록시 서버는 모든 웹 요청과 응답을 기록하므로, 네트워크 트래픽과 사용자 활동에 대한 향상된 가시성을 제공함
- 시스템 관리자와 보안 분석가는 사용자가 어떤 웹사이트에 액세스하는지, 언제, 얼마나 많은 대역폭이 사용되는지 모니터링할 수 있음
- 관리자는 정책을 시행하고 특정 웹사이트나 콘텐츠 카테고리를 차단할 수 있음
Malicious Activies exmaple
| 공격 기법 | Potential Indicator |
| 악성 바이너리 다운로드 시도 | 알려진 악성 URL 바이너리에 대한 연결 |
| 데이터 유출 | 파일 업로드로 인한 높은 아웃바운드 대역폭 ex: OneDrive에 대한 아웃바운드 연결 |
| 지속적인 C2 서버 연결 | 정기적으로 단일 도메인에 대한 아웃바운드 연결 수가 많음 ex: 단일 도메인에 5분마다 연결 |
3. Linux command
| Command | 설명 |
| cat | - con cat enate의 줄임말로, 여러 파일의 내용을 결함하고 표시할 수 있음 - 단일 파일에 대해 실행 시 해당 파일 내역 출력 - 그러나 cat 명령어는 모든 내용을 덤프해 파일 끝이 렌더링 된 후 중지돼서 가시성이 좋지 않음 |
| less | - 한 번에 한 페이지씩 파일 내용 확인 가능 - pageup/pagedown을 통해 한 페이지씩 이동 가능 - q로 exit |
| head | - 파일의 상단 내용 확인 가능 - 처음 10개 항목이 default 값이며, -n 옵션을 통해 표시할 줄의 개수를 설정 가능 |
| tail | - head와 달리 파일의 끝을 쉽게 확인 가능함 - n 옵션을 통해 표시할 줄의 개수 설정 가능 |
| wc | - wc 명령은 단어의 수를 나타냄 - 텍스트 파일의 줄, 단어 및 문자 수를 계산하는 명령줄 도구임 - l 옵션을 통해 줄 수 만 표시하도록 설정 가능 |
| nl | - nl 명령은 수직선을 나타냄 - 파일의 내용을 번호가 매겨진 줄 형식으로 렌더링함 |


4. 프록시 로그 잘라내기
- 다음과 같은 로그 형식을 사용하는 Squid 프록시 서버를 구성
timestamp - source_ip - domain:port - http_method - http_uri - status_code - response_size - user_agent
- 로그 예시
[2023/10/25:16:17:14] 10.10.140.96 storage.live.com:443 GET / 400 630 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
- 형식에 맞게 분류 가능
| 필드 | 값 |
| timestamp | [2023/10/25:16:17:14] |
| source ip | 10.10.140.96 |
| domain:port | storage.live.com:443 |
| http_method | GET |
| http_uri | / |
| status_code | 400 |
| response_size | 630 |
| user_agent | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" |
- 리눅스 명령어를 사용해 열별로 로그 항목 분할하기
- cut : 구분 기호를 기준으로 행을 열로 절단하고, 표시할 열을 선택해 파일이나 입력 스트림에서 행의 특정 섹션(열)을 추출할 수 있음
- -d : 구분 기호용
- -f : 위치용
cut -d ' ' -f1 access.log
- 공백을 기준으로 열 1만 표기함
cut -d ' ' -f1,3,6 access.log
- 공백을 기준으로 열 1, 3, 6을 표기(여러 열 선택 가능함)
5. 리눅스 파이프 명령을 사용한 유의미한 정보 출력
- 10.10.140.96에 의해 만들어진 처음 5개의 연결 가져오기
grep 10.10.140.96 access.log // grep 명령어로 찾고 싶은 텍스트 검색하기
grep 10.10.140.96 access.log | head -5 //표시 항목을 5개로 제한하기
- 모든 워크스테이션에서 액세스하는 고유 도메인 목록 가져오기
cut -d ' ' -f3 access.log // 도메인 목록 가져오기
cut -d ' ' -f3 access.log | cut -d ':' -f1 | sort //그 결과를 기준으로 도메인과 포트 분리 후 오름차순 정렬
cut -d ' ' -f3 access.log | cut -d ':' -f1 | sort | uniq //그 결과를 기준으로 고유 값만 필터링
- uniq -c 옵션 : 각 값 별로 counting한 개수
- sort -n 옵션 : 도메인 개수를 기준으로 출력
6. 악성 트래픽 추적
1) 의심스러운 트래픽 찾기 : 도메인 연결 수 기준 상위 TOP 10 나열
cut -d ' ' -f3 access.log | cut -d ':' -f1 | sort | uniq -c | sort -n | tail -n 10

- 의심스러운 도메인 확인
2) 해당 도메인 기준 액세스 확인
grep frostlings.bigbadstash.thm access.log | head -n 5

3) 요청 uri 기준으로 goodies 매개변수의 값만 가져오기
grep frostlings.bigbadstash.thm access.log | head -n 5 | cut -d ' ' -f5 | cut -d '=' -f2

4) base64 decoding 진행

- 민감정보 유출 확인
+ challenge
1) 프록시 서버에 연결된 고유 IP 개수 확인 : IP 기준으로 자르고, 정렬 후 고유값 추출 및 nl 로 행 개수 구한 후 마지막 값 확인

2) flag 획득하기 : base64 디코딩된 값 기준으로 { 문자 찾기
