보안

2024.06.18.보안 day51

202401to07 2024. 6. 18. 09:26

iptables(IPS)와 snort(IDS)

 

[ 기본 환경 설정 ]

iptable 192.168.10.10

web 10.10.10.10

mini 10.10.10.100

칼리 20.20.20.20

 

[ vi /etc/sysconfig/iptables ]

# Generated by iptables-save v1.4.21 on Thu Jun 13 16:41:18 2024
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -d 192.168.10.100/32 -p tcp --dport 80 -j DNAT --to-destination 10.10.10.10:80
-A PREROUTING -d 192.168.10.100/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.10.10.10:443
-A PREROUTING -d 192.168.10.200/32 -p udp -m udp --dport 53  -j DNAT --to-destination 10.10.10.10:53
-A POSTROUTING -o ens33 -j MASQUERADE
COMMIT
# Completed on Thu Jun 13 16:41:18 2024
# Generated by iptables-save v1.4.21 on Thu Jun 13 16:41:18 2024
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [24:2576]
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A FORWARD -i ens34 -j ACCEPT
-A FORWARD -o ens34 -p udp -m udp --sport 53 -j ACCEPT
-A FORWARD -o ens34 -p tcp -m tcp --sport 80 -j ACCEPT
-A FORWARD -o ens34 -p tcp -m tcp --sport 443 -j ACCEPT

-A FORWARD -i ens32 -j ACCEPT
-A FORWARD -o ens32 -p udp -m udp --sport 53 -j ACCEPT
-A FORWARD -o ens32 -p tcp -m tcp --sport 80 -j ACCEPT
-A FORWARD -o ens32 -p tcp -m tcp --sport 443 -j ACCEPT

-A FORWARD -o ens32 -p tcp -m tcp --dport 443 -j ACCEPT
-A FORWARD -o ens32 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -o ens32 -p udp -m udp --dport 53 -j ACCEPT
-A FORWARD -o ens32 -p tcp -m tcp --dport 22 -j ACCEPT

COMMIT
# Completed on Thu Jun 13 16:41:18 2024

service iptables restart

service iptables save

 

ping 8.8.8.8 안되나 서로 내부 통신은 가능 

 




[action]   [protocol]  [src_ip] [src_port]  -> [Dst_ip] [Dst_port] [option]

액션 action  : alert , pass ,drop , reject ,log 
프로토콜 protocol  : TCP,UDP , IP , ICMP
출발지IP Src_ip      :  any , 10.10.10.10 , 10.10.10.0/24   !
출발지port src_port : any , 22, 80 ,......   !  , : (1:1000)
패킷흐름방향 -> :  -> , <>
도착지IP Dst_ip :  any , 10.10.10.10 , 10.10.10.0/24 
도착지port Dst_port : any , 22, 80 ,......
침입탐지옵션 option : msg  ,content ,flow , rev......

============================================
**msg : 메세지 내용 출력
**sid  : 규칙 식별자
rev  : 규칙 수정버전
classtype : 유형별 정의
priority : 우선순위
reference : url 로 정책 정의\
==========================================
글자 및 데이타 탐지 정책
**content   패킷내에 문자열 바이트를 읽어냄 (아스키 코드 읽어냄)
**nocase : 대소문자 구별 X 
offset => 매칭 시작 문자열 위치  0으로 설정시 1부터 검색
depth =>  문자열 범위를 지정   0으로 설정시 1부터 검색
distance 옵션 값이후 탐색 위치 지정 
within  옵션값 이후 탐색 범위 지정  
pcre      문자열 ( URL검사)

============================================
** 페이로드 **
==========================
옵션재료 (  <>  양방향    -> 단방향  <-
  content:  글자를 잡아낸다    ex) content:"sevas";
          msg:      로그 코멘트 문자를 남긴다.  ex) msg:"메롱"; 
          nocase :  대소문자를 구분하지 않는다  ex) nocase;
          sid:      정책 순서를 정한다        ex) dis:50005;
       )


=======================[간격 DOS&NMAP 탐지]=======================
threshold   (이벤트 탐지 옵션)

type threshold : 발생하는 이벤트 수마다 탐지 
type limit     : 시간동안 발생하는 이벤트 수까지 탐지
type both      : 시간동안 발생하는 이벤트수중 1번만 탐지 ***
track by_src   : 출발지 기준
track by_dst   : 목적지 기준
count          : 횟수
seconds        : 시간
itype          : 0 = reply   8 =request


10.10.10.10)

yum install nc

nc -l 8080

 

 

더보기

칼리에서 nc 를 통해     10.10.10.20:8080 으로 Test를 보내서 패킷로그가 남도록 해보세요


정책내용 :  10.10.10.20:8080 으로 보내는 Test문자를 잡아내서 snort 로그를 남기세요.

옵션재료 (  <>  양방향    -> 단방향  <-
  content:  글자를 잡아낸다    ex) content:"sevas";
          msg:      로그 코멘트 문자를 남긴다.  ex) msg:"메롱"; 
          nocase :  대소문자를 구분하지 않는다  ex) nocase;
          sid:      정책 순서를 정한다        ex) dis:50005;
       )

클라에서는 nc -l 8080 쳐놓고

칼리에서 nc 10.10.10.20 8080 
그다음 아무거나 쓰고 엔터치면 클라에서 보임

alert tcp any any ->  10.10.10.10 8080 (msg:"NC Contest Test"; content:"Test"; sid:50003;)    
[대소문자구분]
alert tcp any any -> 10.10.10.10 8080 (msg:"aaa"; content:"|616161|"; sid:50004;)
[데이터 HEX로 잡기 (aaa)]
alert tcp any any ->  10.10.10.10 8080 (msg:"NC Contest Test"; content:"Test";nocase; sid:50005;) 
[대소문자구분X]

alert tcp 는 
nc 10.10.10.10 8080 로 검사 
alert icmp 는
ping 10.10.10.10 로 검사 

304161

6597

https://ko.calc-site.com/bases/ascii

 

ASCII 코드 변환 - 진수 변환 - 계산 사이트

입력된 ASCII 코드를 쉽게 변환할 수 있습니다. 2진수, 10진수, 16진수에서 문자로 변환하거나 문자를 2진수, 10진수, 16진수로 변환할 수 있습니다. 텍스트에서 ASCII 변환 변환 전은 “텍스트”을 선

ko.calc-site.com


실습 

 

alert tcp !10.10.10.100 any -> 10.10.10.10 8080 (msg:"Script Contest"; content:"|736372697074|"; nocase; sid:50004;)

-------------------------------------------------------

 

iptables)                                                                                 
-A PREROUTING -d 192.168.10.100/32 -p tcp --dport 80 -j DNAT --to-destination 10.10.10.10:80                    : HTTP

DNAT : 네트워크 주소 변환 / pre 라우팅

10.10.10.100) 

[ vi local ]



alert tcp any any ->  10.10.10.10 80 (msg:"XSS_ATTACK(http)"; content:"|253343736372697074253345|"; nocase; sid:50005;)

 


offset

depth

alert tcp 20.20.20.20 any ->  10.10.10.10 80 (msg:"depth_TEST"; content:"123";offset:4; depth:7; sid:50005;)

ㄴ 확인 방법 

10.10.10.100 )  snort -i ens33 -c local      켜놓기 

10.10.10.10 ) nc -l 8080                           켜놓기 

20.20.20.20 ) nc 10.10.10.10 8080           켜놓기    

문자 입력해보기 

123이 포함 된경우 

10.10.10.100 )  tail -f alert  에서 탐지 가능   ===> IDS 


distance 

alert tcp 20.20.20.20 any ->  10.10.10.10 8080 (msg:"distance_TEST"; content:"abc"; content :"test"; distance:10;  sid:50005;)
 snort -i ens33 -c local
 nc -l 8080
tail -f alert

결과 : 

┌──(root㉿sevaskali)-[~]
└─# nc 10.10.10.10 8080
sevasabc1234567890test  ======> 뜸 
^[[A 
sevasabd123456789test    ==============> 안뜸


within 

within 사용하는 이유 : 부화율 / 검색 속도와 정확도 / 오탐 미탐

오탐 : 잘못 탐지 ==> IPS가 중요 

미탐 : 못 탐지 ==> IDS가 중요 


롴키 추가 10.10.10.200 vm1


alert tcp 10.10.10.0/24 any ->  any 443 (msg:"SNS_ACCESS";pcre:"/facebook.com|instagram.com/"; sid:50005;)

 

 


telnet

 

sid 50006 으로 해서   10.10.10.10 에 telnet 으로 접속시
접속 성공시 Telnet OK  , 접속  실패시  Telnet Fali 출력

 

10.10.10.10) 

  280  yum install telnet-server
  281  service telnet.socket restart

 

10.10.10.100) 

[ vi /etc/snort/local ]

alert tcp 10.10.10.10 23 -> any any (msg:"Telnet OK";content:"|4c617374206c6f67696e|"; nocase; sid:50005;)
alert tcp 10.10.10.10 23 -> any any (msg:"Telnet FAIL";content:"|4c6f67696e20696e636f7272656374|"; nocase; sid:50006;)


threshold  이벤트 탐지 옵션

: 간격 DOS&NMAP 탐지


type threshold : 발생하는 이벤트 수마다 탐지 
type limit     : 시간동안 발생하는 이벤트 수까지 탐지
type both      : 시간동안 발생하는 이벤트수중 1번만 탐지 ***
track by_src   : 출발지 기준
track by_dst   : 목적지 기준
count          : 횟수
seconds        : 시간
itype          : 0 = reply   8 =request


실습)  칼리20.20.20.20에서 10.10.10.10  icmp 를 보내면서  request와 reply를 구분하세요. (itype)

0 = reply   8 =request

alert icmp 20.20.20.20 any -> 10.10.10.10 any (msg:"REQUEST_ICMP"; itype:8; sid:50007;)
alert icmp 10.10.10.10 any -> 20.20.20.20 any (msg:"REPLY_ICMP"; itype:0; sid:50008;)


[ DOS&NMAP 탐지 ]

threshold :  5개마다 탐지 / 10초동안 5번이상의 패킷에 대해서 5개마다 1번 탐지
alert icmp any any -> 10.10.10.10 any (msg:"THRESHOLD";threshold:type threshold,track by_src,count 5,seconds 10; sid:50009;)

limit :  5까지 탐지 /0초동안 5번이상의 패킷에 대해서 5개만 탐지
alert icmp any any -> 10.10.10.10 any (msg:"LIMIT"; threshold:type limit,track by_src,count 5,seconds 10; sid:50010;)

both  : 1개만 탐지 /10초동안 5번이상의 패킷에 대해서 1개만탐지 
alert icmp any any -> 10.10.10.10 any (msg:"BOTH"; threshold:type both,track by_src,count 5,seconds 10; sid:50011;) 캌칼리) hping3 --icmp 10.10.10.10 --flood

 


TCP 플래그 6개

  SYN 연결

  ACK 응답

  PSH 우선순위 

  RST 재시작 (강제종료)

  FIN 종료 

  URG 긴급 * 무조건 첫번째 


flags : S R A P U F
flagsbits = More fragments : R D M    ( R:예약 / D:분할X /  M:분할 )

                                              R (Reserved) /  D (Do not fragment) / M (More fragments)
sameip  :  출발지와 도착지 IP가 같을 경우 탐지    ====> Land attack


 

hping3 10.10.10.10  : TCP STN 패킷 보내기

hping3 -1 10.10.10.10 : ICMP ping 보내기

-d 4000 : 데이터 크기 4000바이트

-a : 출발지 

track by_src   : 출발지 기준
track by_dst   : 목적지 기준

 

1.  #ping of death 탐지  [ 단편화가 되면서 파일이 일정시간 이상 들어올때 차단 ] 

칼리) hping3 -1 -d 4000 10.10.10.10 --flood

10.10.10.100)

[vi /etc/snort/local ]

alert  ip any any -> 10.10.10.10 any (msg:"PING_OF_DEATH";threshold:type both,track by_src,count 50, seconds 10; fragbits:M;sid:50012;)

snort -i ens33 -c local

tail -f alert

단편화 확인은 M


2. #Land attack   [출발지와 도착지 IP가 같은 경우 탐지 ]   

칼리 ) hping3 -1 -a 10.10.10.10  10.10.10.10 --flood
alert icmp any any -> 10.10.10.10 any (\
sid:50013; msg:"LAND attack";sameip;threshold:type both,track by_src,count 20,seconds 10;)

더보기

cd /proc/sys/net/ipv4/conf/
echo "0" > all/rp_filter
echo "0" > ens32/rp_filter
echo "0" > ens33/rp_filter
echo "0" > ens34/rp_filter


3. #smuf_attack   

hping3 -1 -a 30.30.30.30  10.10.10.255 --flood 

iptables 끄고 gns 켜서 

라우터 에서   ip direct broadcast   

10.10.10.10 ) 

[root@www html]# cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
1
[root@www html]# echo "0" >  /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
[root@www html]# cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
0     => 강제로 보안 내리기 

 

alert icmp any any  -> 255.255.255.255 any (msg:"Smuf attack";itype:8; threshold:type both,track by_dst,count 20,seconds 10; sid 50014;)

                                                                                                                                                                                              
R1(config)#int fa1/0
R1(config-if)#ip di
R1(config-if)#ip directed-broadcast


3_nmap(scan).txt
0.01MB
dos공격 (1).txt
0.01MB

0


#TCP_SYN_FLOODING
alert tcp  any any -> 10.10.10.10 80 (\
sid:50015; msg:"TCP_SYN_FLOODING"; flags:S; threshold:type both,track by_dst,count 20,seconds 10;)
hping3 --rand-source 10.10.10.10 -p 80 -S --flood 

#TCP__Connect_FOODING
alert tcp  any any -> 10.10.10.10 80 (\
sid:50016; msg:"TCP_Connect_FLOODING"; flags:A; threshold:type both,track by_dst,count 20,seconds 10;)
nping --tcp-connect -p 80 -rate=90000 -c 90000 -q 10.10.10.10

#UDP_FOODING
alert udp  !10.10.10.100 any -> 10.10.10.10 any (\
sid:50017; msg:"UDP_FLOODING"; threshold:type both,track by_src,count 20,seconds 10;)
hping3 -2 10.10.10.10 --flood