2. [snort] SQL Injection 공격에 대한 snort 규칙 예시
자체 제작한 사이트에 대한 웹 공격을 스노트 규칙을 통해 탐지방법을 작성하였다.
1. SQL Injection
자체 제작한 사이트이다.
id: xxxx' or '1'='1
pw: aaa' or '1'='1
을 입력하면 SQL 인젝션 공격이 된다.
해당 공격에 대한 스노트 규칙을 만들기 전에 어떤 식으로 규칙을 만들지 정하기 위해 tcpdump를 통해 해당 공격 패킷을 캡쳐해봤다.
sudo tcpdump -i enp0s3 -s 0 -w sql.pcap port 80
위 명령을 통해 enp0s3 인터페이스를 통해 80번 포트로 들어오는 패킷을 sql.pcap이라는 이름의 파일로 저장한다.
그 후, 자제 제작 사이트에 실제 SQL 인젝션 공격을 하고 pcap 파일을 열어본다.
sudo tcpdump -A -r sql.pcap
위 명렁을 통해 sql.pcap 파일을 읽어온다.
pcap 파일 중 일부 패킷에서 SQL 인젝션 때 넣었던 값이 있는 것을 확인하였다.
이제 이 값을 기준으로 스노트 규칙을 만들면 된다.
그러나, 너무 특정한 문자열에 집착하면 조금만 변경해도 우회가 가능하기에 최대한 일반적인 패턴을 사용해야 한다.
일단 기본적인 "or '1'='1" 문구로 시작하기로 했다.
alert tcp any any -> any 80 (msg : "SQL Injection"; sid:1000001; rev:1; content : "or '1'='1"; nocase;)
그러나 해당 규칙으로 공격을 잡지 못했다.
tcpdump를 통해 SQL 인젝션 공격 한 것을 pcap 파일로 만든 후 와이어샤크로 열어봤다.
알고 봤더니 내가 입력한 or '1'='1 문구가 or+'1'='1 로 입력되었고 URL 인코딩 까지 거쳐서 입력된 것이라고 판단했다.
alert tcp any any -> any 80 (msg : "SQL Injection1"; sid:1000010; rev:1; content : "or+%271%27%3d%271"; nocase;)
위와 같이 인코딩된 값을 content로 넣고 테스트를 해봤다.
실제로 공격을 탐지하는 것을 확인하였다.
그러나, http_uri나 http_client_body 를 통해서도 탐지를 할 수 있을 것 같아 여러 테스트를 해봤는데 같은 content 규칙이여도 http_uri나 http_client_body 옵션이 붙으면 탐지가 되지 않았다. 이건 좀 더 확인을 해봐야 할 것 같다.
alert tcp any any -> any 80 (msg : "SQL Injection1"; sid:1000010; rev:1; content : "or%2b%271%27%3d%271"; nocase;)
alert tcp any any -> any 80 (msg : "SQL Injection1_2"; sid:1000011; rev:1; content : "or%2b%271%27%3d%271"; nocase; http_uri;)
alert tcp any any -> any 80 (msg : "SQL Injection1_3"; sid:1000012; rev:1; content : "or%2b%271%27%3d%271"; nocase; http_client_body;)
alert tcp any any -> any 80 (msg : "SQL Injection1_4"; sid:1000013; rev:1; content : "or%2b%271%27%3d%271"; nocase; http_header;)
alert tcp any any -> any 80 (msg:"SQL Injection2"; sid:1000020; rev:1; content:"or+'1'='1"; nocase;)
alert tcp any any -> any 80 (msg:"SQL Injection2_2"; sid:1000021; rev:1; content:"or+'1'='1"; nocase; http_uri;)
alert tcp any any -> any 80 (msg:"SQL Injection2_3"; sid:1000022; rev:1; content:"or+'1'='1"; nocase; http_client_body;)
alert tcp any any -> any 80 (msg:"SQL Injection2_4"; sid:1000023; rev:1; content:"or+'1'='1"; nocase; http_header;)
위와 같은 규칙으로 여러 테스트를 해보고 있다.
위처럼 curl을 통해 전송하면
SQL Injection2 번 규칙이 탐지되고
URL 인코딩 된 값으로 전송하면
SQL Injection1 번 규칙이 탐지된다.
POST 방식 역시 SQL Injection 2번과 1번 규칙으로만 탐지되고 있다.
http_uri나 http_client_body 옵션에 대한 테스트가 더 필요한 상황이다.
https://ssjune.tistory.com/148
4. [snort] 파일 업로드 공격에 대한 snort 규칙 예시
자체 제작한 사이트에 대한 웹 공격을 스노트 규칙을 통해 탐지방법을 작성하였다. 영어한국어일본어중국어 (간체)중국어 (번체)베트남어인도네시아어태국어독일어러시아어스페인어이탈리
ssjune.tistory.com
파일 업로드에 대한 snort 규칙 테스트를 하다가 이유를 알게되었다.
프리프로세서 설정을 해야 했는데, 이 설정은 snort.conf에만 돼있었고 나는 local.rules 를 실행하면 자동으로 설정파일이 적용되는 줄 알았었다.
위 페이지에 나온대로 my_snort.conf 파일을 만들고 local.rules만 include 하게 했다.
alert tcp any any -> any 80 (msg : "SQL Injection1"; sid:1000010; rev:1; content : "or+%271%27%3d%271"; nocase;)
alert tcp any any -> any 80 (msg : "SQL Injection1_2"; sid:1000011; rev:1; content : "or+%271%27%3d%271"; http_uri; nocase;)
alert tcp any any -> any 80 (msg : "SQL Injection1_3"; sid:1000012; rev:1; content : "or+%271%27%3d%271"; http_client_body; nocase;)
alert tcp any any -> any 80 (msg : "SQL Injection1_4"; sid:1000013; rev:1; content : "or+%271%27%3d%271"; http_header; nocase;)
alert tcp any any -> any 80 (msg:"SQL Injection2"; sid:1000020; rev:1; content:"or+'1'='1"; nocase;)
alert tcp any any -> any 80 (msg:"SQL Injection2_2"; sid:1000021; rev:1; content:"or+'1'='1"; http_uri; nocase;)
alert tcp any any -> any 80 (msg:"SQL Injection2_3"; sid:1000022; rev:1; content:"or+'1'='1"; http_client_body; nocase;)
alert tcp any any -> any 80 (msg:"SQL Injection2_4"; sid:1000023; rev:1; content:"or+'1'='1"; http_header; nocase;)
내 local.rules는 위와 같이 수정하였다.
curl을 통해 시도하면...
위와 같이 탐지한다.
웹 사이트를 통해 시도하면....
위와 같이 탐지한다.
이렇게 http_client_body가 안되던 원인을 알게 되었다. (완벽하게 알려면 conf 파일에 대한 공부가 더 필요하겠지만)
아마 http_uri도 비슷하게 동작할 것이라고 생각된다.
본 블로그는 단순 예시를 위해 or '1'='1 문구를 다뤘지만, 실제로는 입력값에 포함될 필요가 없는 띄어쓰기나 특수문자 위주로 판별을 하면 되지 않을까 한다.
'보안공부 > snort 공부' 카테고리의 다른 글
4. [snort] 파일 업로드 공격에 대한 snort 규칙 예시 (0) | 2024.11.03 |
---|---|
3. [snort] XSS 공격에 대한 snort 규칙 예시 (0) | 2024.11.02 |
1. [snort] snort 설치 및 사용법 (0) | 2024.11.01 |