- (Ubuntu) FWSnort 리눅스에 설치하고 탐지/차단식 전환하기2024년 06월 27일 15시 00분 27초에 업로드 된 글입니다.작성자: 방세연
FWSnort란?
IDS(Snort)와 IPS(IPtalbes)를 결합해 스노트 탐지식을 IPTables 방화벽에서 적용하는 기능을 사용할 수 있다.
FWSnort 도구에 대한 자세한 설명
https://www.cipherdyne.org/fwsnort/
✒️ 1.설치 과정
설치를 위해서는 snort가 설치되어 있는 상태여야 한다.
cat /etc/snort/rules/local.rules 해당 명령어를 통해 snort rules에 나타나있는 sid:1341을 확인할 수 있다.
이를 FWSnort 설치를 통해 차단식으로 변환할 수 있을까?vi /etc/snort/snort.conf FWSnort 설치를 위해서는 명령어를 통해 snort.conf RULE_PATH의 모든 부분의 주석을 해제 해줘야 한다.
다음과 같이 Step #7, Step #8, Step #9의 모든 부분을 주석 해제한다.cat /etc/snort/snort.conf -n | grep "include $RULE_PATH" snort.conf에서 "RULE_PATH"의 내용을 확인해 주석이 해제되었는지 확인한다.
모든 주석 include ~ 에 # 표시가 없는 상태여야 한다.
apt-get install fwsnort fwsnort를 설치한다.
설치가 완료되었다는 문구를 확인하기 위해서는 fwsnort -h 명령어를 입력한다.
fwsnort의 버전이 v1.6.8이라는 것을 확인할 수 있다.
cat /etc/fwsnort/fwsnort.conf -n fwsnort.conf 파일에서 가장 중요한 부분은 ### fwsnort filesystem paths (파일 시스템 경로) 부분이다.
log 파일, conf 파일, Rules dir 파일이 연결되고있는 경로 현황을 확인할 수 있다.
✒️ 2. FWSnort에 Snort 기본 탐지식 복사하기
이제 Snort 규칙을 전환하기 위해 Snort 기본 탐지식을 FWSnort로 복사해주겠다.
cp /etc/snort/rules/* /etc/fwsnort/snort_rules
참고로 snort의 rules 디렉토리에 있는 rules 파일들은 다음과 같다.
이 주석 해제한 rules를 모두 복사해서, fwsnort에서 전환하는 작업을 바로 뒤에 실행한다.fwsnort 이제야 fwsnort 도구를 작동해주는 명령어를 사용할 수 있겠다. 내용을 확인해보면 총 3680개의 탐지식 중 1794개만 전환에 성공했다는 것을 알게 되었다. 즉, 모든 규칙이 전환에 성공하는 것은 아니라는 점을 파악할 필요가 있다.
/var/lib/fwsnort/fwsnort.sh 해당 명령어를 통해 iptables 방화벽에서도 전환한 차단식을 사용할 수 있도록 해주는 작업까지 완료해 전환을 마무리해준다.
그렇다면 내가 찾던 특정 rules가 FWSnort 전환에 성공했는지 알 수 있는 방법은 무엇일까?
✒️ 3. 전환된 규칙을 FWSnort에서 확인하기
cat /var/lib/fwsnort/fwsnort_iptcmds.sh | more fwsnort_iptcmds.sh 파일에서 전환된 모든 탐지식의 규칙을 확인해볼 수 있다.
하지만 내용이 굉장히 방대하다. 스크롤을 내려도 끝이 없을 것이다.
cat /var/lib/fwsnort/fwsnort_iptcmds.sh | egrep " " 해당 egrep 명령어를 통해 특정 부분을 검색할 수 있다.
sid:1341이 차단식으로 전환되었는지 확인할 수 있을까? 궁금해 해당 내용을 검색해보았다.
다음 내용은 sid:1341에 대한 규칙에 대한 것이다.
fwsnort를 통해 자동으로 전환된 규칙 정보
역할: /usr/bin/gcc 명령어 시도를 감지하는 웹 애플리케이션 공격 탐지
서명 ID: sid:1341
FWSnort 변환: Snort 서명을 IPTables 규칙으로 변환하여 방화벽 규칙으로 활용
적용: 웹 애플리케이션 공격으로 간주되는 활동에 대한 감지 및 로깅
SID:1341 구조 자세히 확인해보기
더보기1.Snort 서명 (sid:1341)
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB-ATTACKS /usr/bin/gcc command attempt"; flow:to_server,established; content:"/usr/bin/gcc"; nocase; classtype:web-application-attack; sid:1341; rev:5;) snort 서명에 대한 부분이다. 외부 네트워크에서 HTTP 서버로 향하는 트래픽에서 /usr/bin/gcc 명령어를 포함하는 내용을 감지하려고 한다는 점을 알 수 있었다.
- 동작 (alert): 패킷이 일치할 때 경고를 생성.
- 프로토콜 (tcp): TCP 트래픽을 분석.
- 출발지 IP ($EXTERNAL_NET): 외부 네트워크의 IP.
- 출발지 포트 (any): 모든 포트.
- 목적지 IP ($HOME_NET): 내부 네트워크의 IP.
- 목적지 포트 (80): HTTP 트래픽.
- 옵션: 트래픽 분석 및 경고 메시지 포함.
2. FWSnort 규칙
$IPTABLES -A FWSNORT_FORWARD_ESTAB -p tcp -m tcp --dport 80 -m string --hex-string "|2f7573722f62696e2f676363|" --algo bm --icase -m comment --comment "sid:1341; msg:WEB-ATTACKS /usr/bin/gcc command attempt; classtype:web-application-attack; rev:5; FWS:1:6.8;" -j LOG --log-ip-options --log-tcp-options --log-prefix "[850] SID1341 ESTAB " FWSnort 규칙에 대한 부분이다. Hex로 표현된 /usr/bin/gcc 문자열 매칭과 web-application-attack 주석 표현, TCP 프로토콜 및 포트 80(HTTP)를 필터링한다는 내용을 확인할 수 있다.
- -A FWSNORT_FORWARD_ESTAB: 체인 이름.
- -p tcp -m tcp --dport 80: TCP 프로토콜 및 포트 80 (HTTP) 필터링.
- -m string --hex-string "|2f7573722f62696e2f676363|": 문자열 매칭 (hex로 표현된 /usr/bin/gcc).
- --algo bm --icase: Boyer-Moore 알고리즘을 사용하여 대소문자 구분 없이 문자열 매칭.
- -m comment --comment "sid:1341; msg:WEB-ATTACKS /usr/bin/gcc command attempt; classtype:web-application-attack; rev:5; FWS:1:6.8;": 주석 추가.
- -j LOG --log-ip-options --log-tcp-options --log-prefix "[850] SID1341 ESTAB ": 일치할 경우 로그에 기록.
3. IPTables 규칙
$IPTABLES -A FWSNORT_INPUT_ESTAB -p tcp -m tcp --dport 80 -m string --hex-string "|2f7573722f62696e2f676363|" --algo bm --icase -m comment --comment "sid:1341; msg:WEB-ATTACKS /usr/bin/gcc command attempt; classtype:web-application-attack; rev:5; FWS:1:6.8;" -j LOG --log-ip-options --log-tcp-options --log-prefix "[728] SID1341 ESTAB " IPTables 규칙에 관련된 부분이다. 이 규칙 또한 FWSnort 규칙 부분과 구성이 비슷하며 /usr/bin/gcc를 탐지한다는 점을 알 수 있었다.
✒️4. 수동으로 iptables에 차단 규칙 추가해주기
1. 로깅/탐지 규칙
iptables -A FWSNORT_INPUT_ESTAB -p tcp -m tcp --dport 139 -m string --hex-string "|780070005f007000720069006e007400730074006100740065006d0065006e0074007300|" --algo bm --from 96 --icase -m comment --comment "sid:690; msg:MS-SQL/SMB xp_printstatements possible buffer overflow; classtype:attempted-user; reference:bugtraq,2041; rev:9; FWS:1.6.5;" -j LOG --log-ip-options --log-tcp-options --log-prefix "[658] SID690 ESTAB "2. 차단 규칙
iptables -A FWSNORT_INPUT_ESTAB -p tcp -m tcp --dport 139 -m string --hex-string "|780070005f007000720069006e007400730074006100740065006d0065006e0074007300|" --algo bm --from 96 --icase -m comment --comment "sid:690; msg:MS-SQL/SMB xp_printstatements possible buffer overflow; classtype:attempted-user; reference:bugtraq,2041; rev:9; FWS:1.6.5;" -j REJECT물론 필요한 규칙을 발견하지 못했거나 추가적인 부분을 설정해주고 싶다면 수동으로 설정해주는 방법도 있다.
1. 로깅/탐지 규칙
다음의 첫 번째 식은 sid:690을 iptables 방화벽에 수동으로 식을 설정해준 결과이다. 먼저 탐지할 수 있는 규칙을 작성해주었다. 구조는 xp_printstatements에서 발생할 수 있는 버퍼 오버플로우에 대한 메시지를 적어주고, TCP 프로토콜을 필터링한다는 내용과 hex로 표현된 xp_printstatements 값을 적어준 것이다. 시드 690이 MS-SQL/SMB에서 발생할 수 있다는 점을 주석을 통해 표현해주었다. 마지막으로 -j LOG ~ 내용을 통해 로깅을 해준다는 내용을 명시하였다.
2. 차단 규칙
두 번째 식에는 시드 690에서 공격이 발생했을 때 이를 차단할 수 있는 규칙을 적어주었다. 이는 첫 번째 규칙과 거의 동일하지만 -j REJECT라는 명령어를 통해 탐지된 일치하는 패킷을 거부(차단)한다는 내용을 명시해주었다.
iptables --list iptables --list 명령어를 통해 iptables에 직접 추가해준 탐지/차단식이 규칙에 추가되었는지 확인해준다.
LOG, REJECT 부분에 해당 내용이 있음을 확인하였다.
규칙을 설정해줬으니 이제 다음 게시글에서는 가상머신에 공격을 진행해보려고 한다.
과연 차단이 잘 될까?
실습 참고 도서
https://www.yes24.com/Product/Goods/60742058
다음글이 없습니다.이전글이 없습니다.댓글