Code&Data Insights

[새싹 성동 2기] Splunk 설치 및 분석 실습 (+ security onion) 본문

Cyber Security/[새싹+SK쉴더스] 생성형 AI 활용 클라우드&보안 전문가 과정

[새싹 성동 2기] Splunk 설치 및 분석 실습 (+ security onion)

paka_corn 2024. 12. 15. 16:15

Splunk 설치 

1. Splunk 실행
dpkg -i packegname
cd /opt/splunk/bin
./splunk enable boot-start // q(quit) 후, 사용할 id, password 입력 
./splunk start // 실행 후 출력된 URL로 접속 가능

2. Forwarder 설치
// index 생성: 홈페이짖 상단 Settings > indexes, test로 생성
cd /opt/splunk/etc/system/local로 이동

3. inputs.conf 생성 및 설정
mousepad inputs.conf
[splinktcp:9997] // 서버 수신 대기 포트
disabled = false 설정 // (사용 O)

4. Splunk 재시작
./splunk restart 

5. Forwarder 설치 (우분투)
cd /home/kali/Desktop/splunkforwarder //forwarder설치 파일 존재하는 경로
python3 -m http.server 8080 
dpkg -i packegname //curl 설치 후 다시 설치
apt install curl -y

6. apache 설치 (우분투)
apt install apache2 -y
systemctl start apache2

7. forwarder 설정 (우분투) - inputs.conf / outputs.conf
cd /opt/splunkforwarder/etc/system/local
mousepad inputs.conf || mousepad outputs.conf
[monitor://var/log/apache2/access.log]
disabled = false
index = test //생성할 index 이름
sourcetype = access_apache // index에 저장될 그룹 이름

8. kali linux에서 우분투 apache 서버 접속

9. forwarder 실행 (우분투)
cd /opt/splunkforwarder/bin
./splunk start

칼리 linux ip 넣기

 

Splunk 접속 

DATA/ Indexes - 일종의 DB

-> 시스템 기본 index들은 disable, 삭제 불가능 

DATA/ Source Types - DB를 구성하는 테이블 정보

-> 이미 알려진 로그들의 필드 정보를 가지고 있음

KNOWLEDGE Fields - column

-> Field extractions 

 

[ Splunk search ] 

Search & Reporting

** 검색하는 시간 설정 중요 

- index="name"으로 기본 서치

earliest =0 을 붙임으로써 모든 시간 검색

특정시간은 오른쪽 시간정보에서 범위 지정 가능

분석 시, sourcetype and field가 핵심

중복 제거 후 table 출력

1. 소스타입은 내가 분석해야하는 데이터 유형을 볼 수 있음

ex) sysmon 로그, apache log, http proxy 로그 등

==> 소스타입을 분석함으로써 내가 위협데이터 분석에 활용할 수 있는 로그를 식별할 수 있음

필드에서 소스타입을 클릭하면 상위 10개만 출력되기 떄문에, 중복을 제거 후! 전체 출력할 필요가 있음

=> index="test" | dedup sourcetype | table sourcetype

(dedup: 중복제거, table: 출력)

2. 각각의 소스타입 별로 구성되는 필드를 확인해야함 

index ="test" sourcetype ="apache_access" 특정 소스타입 필터 후 확인 해야함d

3. 필드별 연관성 분석

출발지 ip, 목적지 ip, port, useragent, ID, command, ... 등이 중요

4. 쿼리를 만들어야함 (위협데이터 식별)

index="test" sourcetype="apache_access" s_ip="1.1.1.1" d_ip="2.2.2.2" agent="curl*"

 

Splunk 분석 실습

실습 - bots.data

cd /opt/splunk/etc/apps
cp -r /home/kali/Desktop/botsv1_data_set ./

(가져오는 이유: 500mb 이상일 경우, 수동으로 넣어줘야 함)

ealiest = 0 :모든 시간 검색

시나리오 - 대기업 조직인 Wayne Enterprises 는 최근 사이버 공격에 직면하여 공격자가 네트워크에 침입하여 웹 서버에 접근하고 웹사이트 http://www.imreallynotbatman.com 을 성공적으로 손상시켰습니다 . 그들의 웹사이트는 이제   아래와 같이 귀하의 사이트 가 손상되었습니다.라는 메시지와 함께 공격자의 상표를 표시하고 있습니다.

그들은 " US "에 보안 분석가 로 합류하여   이 사이버 공격을 조사하고 네트워크 내에서 근본 원인과 모든 공격자의 활동을 찾는 데 도움을 줄 것을 요청했습니다.

좋은 점은 Splunk가 이미 설치되어 있어 공격자의 활동과 관련된 모든 이벤트 로그를 캡처했다는 것입니다. 우리는 기록을 탐색하고 공격이 어떻게 그들의 네트워크에 들어갔고 그들이 어떤 행동을 취했는지 찾아야 합니다.

소스타입 출력 

사용해야 할 정보

stream:http - web 접속 로그 추정

sysmon - sysmon 로그

fgt_utm - 포티게이트 방화벽 로그

stream:dns - dns 쿼리 로그

stream:tcp - tcp 통신 로그 수집

stream:tcp suricata - IDS/IPS 탐지 로그


시나리오 문제 
1. 하나의 suricata 경보는 공격 시도와 관련된 CVE 값을 강조 표시했습니다. CVE 값은?

Query 1) 필드 분석을 위한 전체 쿼리 출력 : index="botsv1" earliest=0 | dedup sourcetype | table sourcetype

Query 2) 필드 추가 - selected_fileds에 #alert_action, #alert_category 추가

Query 3) alert_category에서 Web application attack 선택

Query 4) index="botsv1" earliest=0 sourcetype="suricata" cve-* ==>  alert_signature가 cve 번호를 포함하고 있음

Answer) 3개의 cve

 

2. 우리 웹 서버가 사용 하는 CMS(콘텐츠 관리 시스템) 는 무엇입니까 ?

-> URI에 같이 노출되므로 tcp or http확인이 필요함

Query 1) 필드 체크 -> tcp가 아닌 http 확인이 필요함을 확인

Query 2) http - request나 URI 분석이 필요! 

Query 3) index="botsv1" earliest=0 sourcetype="stream:http" | dedup uri | table uri => uri 분석 

ANS) joomla가 가장 많이 접속했음을 확인 -> 구글 검색후 CMS임을 확인 


3. 공격자가 스캐닝 시도를 수행하는 데 사용한 웹 스캐너는 무엇입니까?

=> 포트 스캐너가 아니라, WEB 스캐너를 찾아야함

=> http에서 확인 가능, User_Agent 항목에 도구명이 기록됨

Query 1) index="botsv1" earliest=0 sourcetype="stream:http" => http_user_agent 필드 체크 

=> 100건 미만은 정상으로 취급 

Query 2) index="botsv1" earliest=0 sourcetype="stream:http" http_user_agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21"

data_content, data_header | src_content, src_content, src_headers 체크 

ANS) Acunetix Vulnerability Scanner가 사용되었음을 확인 


4. imreallynotbatman.com 서버의 IP 주소는 무엇입니까?

Query) index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com

==> http에 imreallynotbatman.com 키워드 추가 후 dest_ip 필드 확인 

ANS) 여러개 있을 경우, 가장 많은 IP(192.168.250.70)가 해당됨 

5. imreallynotbatman.com 에 대해 무차별 암호 대입 공격을 시도할 가능성이 있는 IP 주소는 무엇입니까 ?

1) 특정 주소에서 특정 아이디를 대상으로 비밀번호가 바뀌는 경우

2) 소스코드 기반으로 시도하는 경우 -> agent에 프로그래밍언어가 기록됨

=> python 

Query 1) index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com login

==> 최소 못해도 100번 이상이 발생해야함 

=> src_header(Request Header)  && src_content(Request Body) 확인 필요

무차별 대입 암호

- 로그인은 POST 기반으로 동작하기 때문에, 사이트가 매우 취약하지 않는 한 보통 body 영역에 구조가 생성됨

POST/login http1.1 >> header

login=admin&password=1234$submit=submit > body

Query 2) login 이외의 다른 keyword도 시도 (path, pass 등등)

=> 출력 x, 무차별 대입 공격이 발생했음을 확인 

ANS) 23.22.63.114 

6. 무차별 대입 시도가 여러 번 발생한 URI 는 무엇입니까?

Query) src_ip 확인

23.22.63.114 (python)

Query) index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com  acunetix

src_ip 확인

40.80.148.42

uri 필드 확인

ANS) joomla/administrator/index.html

 

7. 어떤 사용자 이름에 대해 무차별 대입 시도가 이루어졌습니까?

Query) index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com src_content="*user*"

Query 2) 중복제거 

ANS) admin

8. imreallynotbatman.com 을 실행하는 콘텐츠 관리 시스템에 대한 관리자 액세스의 올바른 비밀번호는 무엇입니까 ?

==> python method X, web 기반에서 흔적을 찾아야 함!

POST Method, username = admin

Query) index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com src_content="*user*" POST http_user_agent="Mo*" | dedup http_user_agent | table src_content, _time,  src_ip, dest_ip

공격자 IP => src_ip, dest_ip

ANS)


9. 무차별 대입 시도에서 얼마나 많은 고유 암호가 시도되었습니까?

Query 1) 전체 공격 시도 조회 index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com src_content="*user*pass*" POST http_user_agent="py*"

Query 2) 올바른 패스워드 출력index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com src_content="*user*passwd=batman*" POST http_user_agent="py*"

ANS) 무차별 공격 시도 전체 Total = 412, Fail = 411


10. 올바른 비밀번호를 찾은 후 공격자가 관리자 패널에 로그인하는 데 사용한 IP는 무엇입니까?

Query) index="botsv1" earliest=0 sourcetype="stream:http" imreallynotbatman.com src_content="*user*passwd=batman*" POST http_user_agent="Mo*" | dedup http_user_agent | table src_content, _time, src_ip, dest_ip

ANS) 40.80.148.42


11. Sysmon은 생성되는 프로세스의 Hash 값도 수집합니다. 프로그램 3791.exe의 MD5 HASH는 무엇입니까?

Sysmon - splunk에서 기본적으로 지원 X (plugIn 필요 - addon-sysmon) => Apps에서 추가 (Manage app > Install app> Upload)

Query)  index="botsv1" earliest=0 | dedup sourcetype | table sourcetype => 소스타입 조회 후, sysmon 관련 로그 검색

Query 2) index="botsv1" earliest=0  sourcetype=xmlwineventlog 

Query 3) index="botsv1" earliest=0  sourcetype=xmlwineventlog 3791.exe

=> 27만 개에서 69개로 줄어들은 events 결과를 볼 수 있음! 

**Sysmon 기능**

- 현재 프로세스와 상위 프로세스 모두에 대한 전체 명령줄을 사용하여, 프로세스 생성을 기록

- 원본 프로세스, IP주소, 포트번호, 호스트 이름 및 포트 이름을 포함하여 네트워크 연결을 기록 

- 정상 프로세스도 기록이 같이 됨 

- sysmon 로그에서 ParentCommandLine가 포함되어야 실제 실행되고 있는 것임! 

Query 4) index="botsv1" earliest=0  sourcetype=xmlwineventlog "ParentCommandLine'>3791.exe" 실제 실행되고 있는 (2개의) 프로세스로 압축됨

SHA1=F5CFD4070EA7D2B40A29F21F9E29AF23341C59EC

5) virustotal.com에 해시값 넣어봄 => search F5CFD4070EA7D2B40A29F21F9E29AF23341C59EC

==> Cmd 값, 잘못 찾음

Query 6) index="botsv1" earliest=0  sourcetype=xmlwineventlog "3791.exe" "ParentCommandLine"

ANS) MD5=59A1D4FACD7B333F76C4142CD42D3ABA


12. 바이러스 토탈에서 해시를 검색하십시오. 이 파일 3791.exe와 관련된 다른 이름은 무엇입니까?

Names - 현재 보고된 악성코드들 

ANS) ab.exe, ec... 


13. imreallynotbatman.com 웹사이트를 훼손한 파일의 이름은 무엇입니까?

웹사이트 훼손 = 악성 파일이 업로드 되었다 or import(Link) 되었다 

(1) 업로드: POST, BoardName upload ==> 공격자가 권한이 없을떄의 업로드 방식

(2) 관리자 권한이 있을 때, 기존 업로드 파일 바꿔치기 방식이 존재

Query1 ) index="botsv1" earliest=0 sourcetype="stream:http" POST upload

>> 34 events 

Query 2) index="botsv1" earliest=0 sourcetype="stream:http" POST upload 40.80.148.42

==> 공격자 IP를 넣어도, 34 events로 동일 = 업로드 관련 공격은 모두 공격자가 수행했음을 알 수 있음 

Query 3) DNS 질의를 통해 악성 도메인 여부를 확인 

1) index="botsv1" earliest=0 sourcetype="stream:dns" 40.80.148.42 >> 0 event 

2)  index="botsv1" earliest=0 sourcetype="stream:dns" 23.22.63.113 >> 1 event

Query 3) index="botsv1" earliest=0 sourcetype="stream:http" prankglassinebracket.jumpingcrab.com

Exif: 사진 파일을 있음을 알 수 있음 => 악성파일이 있는 파일을 link 걸어 놓음 .jpg

ANS) 


14. Fortigate Firewall 'fortigate_utm'이 공격자의 IP 40.80.148.42에서 SQL 시도를 감지했습니다. SQL 주입 시도 중에 트리거된 규칙의 이름은 무엇입니까?

Query) index="botsv1" earliest=0 sourcetype="fgt_utm" 40.80.148.42 SQL

ANS) 

 

15. 이 공격은 동적 DNS를 사용하여 악성 IP를 확인합니다. 이 공격과 관련된 FQDN(정규화된 도메인 이름)은 무엇입니까?

Query) index="botsv1" earliest=0 sourcetype="stream:dns" 23.22.63.114

ANS) 13번에서 찾은 주소 => prankglassinebracket.jumpingcrab.com

 

security onion

: 트래픽 분석 및 로그분석을 위한 플래폼 (pcap)

=> Blue Team(SoC) Security Onion, SIFT WorkStation

ELK , Sguil, Snort, Suricata ...

RedTeam : kali

 

security onion 관련 정리된 github

https://github.com/Muneer44/Security-Onion-Traffic-Analysis

Access Security Onion via SSH

ssh <security-onion-username>@<security-onion-ip>

 

Create Firewall Rule in Security Onion

Download and Import PCAP for Malware Traffic Analysis

- wget <Malware-Traffic-PCAP-Link_address>
- unzip <PCAP-filename>   #You can use 'ls' command to list the files
- sudo so-import-pcap <PCAP-filename>


SIEM

- 위협캄지, 응답 시간, 조사 

- 로그간의 체인

 

룰 만들고 테스트 해볼 때, 활용 할 수 있는 웹 사이트

https://malware-traffic-analysis.net/index.html

Suricata - 멀티에 최적

Zeek - 악성 트래픽 분석 도구

admin@admin.kr

password

security onion 명령어는 다 so로 시작함 

패킷 분석 관련 docs

https://docs.securityonion.net/en/2.4/pcap.html

 

sguil

https://mdin1.tistory.com/159

+ sguil packet git 

 

 

reference

https://github.com/Muneer44/Security-Onion-Traffic-Analysis

https://malware-traffic-analysis.net/index.html

온프레미스와 클라우드 환경의 보안 관제 실무 - 이별 강사님

Comments