책을 쓰고 나서 가끔 강의 요청을 받는다. 처음엔 좀 무서웠다. 원래 숫기도 별로 없고, 학교 다닐 때 발표같은 것도 싫어했었다. 말이 많은 편도, 잘 하는 편도 아니어서 사람들 앞에서 뭔가를 떠들어야 하는 상황이 낯설었다. 그런데 점점 그런 상황을 반기고 있는 나를 보게 된다.
일단 책을 쓴 이유는 말을 하고 싶어서였다. 현업에서 잘 들어주지 않는 말, 하기 힘든 말, 할 기회가 없었던 말을 하고 싶었다. 말주변은 없고, 말은 하고 싶고, 그래서 책을 썼나 보다.
하고 싶은 말을 다 하고 나면, 책을 쓰고 나면 속이 좀 후련해지지 않을까? 그런데 책을 쓰고 나서 말을 하고 싶다는 욕망이 오히려 더 커졌음을 느낀다. 직접 만나 눈을 마주치면서 내 생각을 얘기하고 상대방의 생각도 들어보고 싶어진 것.
지난 글에서 DNS Cache Poisoning 또는 DNS 증폭 DDoS 공격의 가능성을 알려주는 룰에 대해서 살펴봤는데, 탐지로그 대부분이 PTR 질의에 대한 NXDOMAIN 응답이었다. 도메인의 IP 질의(A 레코드 질의)에 대한 응답은 몇 개나 될까? 확인해보니 하나밖에 없다.
alert udp $HOME_NET 53 -> $EXTERNAL_NET any (msg:"DNS excessive outbound NXDOMAIN replies - possible spoof of domain run by local DNS servers"; byte_test:1,&,2,3;
시간 참 빠르다. 작년 추석이 엊그제 같은데. 대충 생각해보니 직장 생활을 시작하면서부터 시간이 참 빠르다는 생각을 하게 된 듯 하다. 어디서 들었는데 쳇바퀴 돌 듯 반복되는 일상이 굳어지면, 새로운 경험보다 익숙한 경험이 반복되면 시간이 빨리 가는 것처럼 느끼게 된다고.
나이 먹을수록 명절에 대한 감회도 달라지는 것 같다. 어렸을 땐 두둑해질(?) 주머니 생각에 마냥 좋기만 하던 명절이 이젠 그닥이다. 부모님은 며칠 전부터 언제 내려오냐, 집에 와서 푹 쉬었다 가라는 말씀을 번갈아가며 하시지만, 사실 이제 부모님 집에 가면 별로 편하게 쉰다는 생각이 안 든다.
먹고 살아보겠다고 10여 년 이상 타지생활을 하면서, 이제 부모님 집엔 내 방 없어진지도 꽤 됐고 (집 수리 하면서 거실에 흡수됨 -_-) 보던 책이며 쓰던 물건들도 다 옮겨서 30여 년을 살았던 집인데도 뭔가 어색하다. 전이나 부치는 것 말고는 별로 할 일도 없다.
소시적 50만원 넘는 주차위반 과태료를 내본 적은 있지만 비교적 착하게 살고 있다고 자부하는 나를 Snort는 왜 웹서버 공격자로 판단했을까?
그때 생각하니까 또 빡치네
내가 뭘 했길래? 트래픽의 성격을 파악해보자. 어디에서(Referer), 어디로(Host), 어떤 도구(User-Agent)를 이용해서, 어떤 정보(URI)를 전송했는지 알 수 있는 로그는 웹 요청 형식을 갖춘, 즉 '485454502f312e' 패턴을 포함하고 있는 387개.
2회에 걸쳐 'DELETED WEB-IIS header field buffer overflow attempt' 룰에 대해 분석을 해봤다. 그런데 샘플만 분석을 했기 때문에 과연 그 결과가 전체 발생 로그와 일치하는지에 대해 궁금한 사람이 있을 것 같다. 전체 로그를 분석해보자.
이제 본격적으로 분석을 해보자. 해당 룰은 헤더 필드의 구분자 조작 여부를 탐지하는 게 목적. 분석의 편의를 위해서는 헤더 영역만 추출할 필요가 있다. 어떻게?
웹 요청 트래픽은 'Request-Line(URI) + Header + Body' 구조로 이루어져 있으며, 그 중 Header 영역은 '\r\n(Carriage Return과 Line Feed, 0D0A)'으로 각 필드를 구분하는 여러 지시자(Directive)들로 구성되어 있다.
지난 글에서 Snort가 버린 룰들을 재활용하는 과정을 소개했었는데, 특정 로그가 얼씨구나 발생하기 시작했다. 해당 로그를 발생시킨 룰의 상세 내역은 다음과 같다.
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"DELETED WEB-IIS header field buffer overflow attempt"; flow:to_server,established; content:"|3A|"; content:"|0A|"; content:"|00|"; reference:bugtraq,4476; reference:cve,2002-0150; classtype:web-application-attack; sid:1768; rev:8;) 관련 취약점 정보들이 있지만 공격의 특징을 알기에는 좀 부실한 듯하다. 예전엔 snort.org에서 룰 추가 정보를 검색할 수 있었는데, cisco 인수 이후로 mysql 직접 연동도 안되고 이래저래 불편.
문자열 패턴만 분석하니 지겨운 듯 해서 다른 걸 좀 해볼까 한다. Snort 룰은 크게 문자열 패턴 검사와 패킷 발생량 검사, 두가지로 나눌 수 있다.
그중 패턴 검사는 (아무나 읽지 못하게 하는) 기밀성과 (아무나 쓰지 못하게 하는) 무결성 침해 행위를, 발생량 검사는 (자원의 정상적 사용 가능 정도인) 가용성 침해 행위를 탐지한다.
출퇴근 시간 도로에서 가용성 침해 사례를 쉽게 경험할 수 있다. 아무리 넓은 도로도 이용 차량이 늘어나면 교통체증에 시달리기 마련인데, 바로 가용성에 침해를 받는 경우. 그렇기 때문에 차량 이용량은 교통체증의 경중, 즉 도로 가용성의 수준을 파악할 수 있는 중요한 척도가 된다.
지난 글에서 'WEB-MISC weblogic/tomcat .jsp view source attempt' 룰에 의해 발생한 로그의 오탐 근거를 찾고, 룰 개선을 시도했었다. 하지만 데이터베이스 저장 오류(2개의 패킷이 하나로 저장?)로 인해 로그 분석이 여의치 않았었다.
상용 보안장비에서는 경험하기 힘든 오류라 당황스럽긴 하지만 그렇다고 분석을 안할 수는 없는 노릇. 방법을 찾아야 한다. 다행히 Snort는 로그를 발생시킨 원인 패킷을 같이 저장한다.
Wireshark를 이용해서 해당 패킷을 분석할 수 있다는 얘기. 하지만 아무래도 로그 분석은 결국 텍스트 분석이다 보니 특정 패턴이 포함된 패킷을 알려줄 뿐, 해당 패턴의 위치를 표시해주지 못하는 Wireshark로는 정확한 분석이 힘들 수 밖에 없다. 가장 좋은 방법은 패킷에서 텍스트를 추출하는 것.
IDS를 운영하다 보면 룰 관리 자체가 골치덩이가 되는 경우가 종종 있다. 특히 운영 초기부터 누가, 언제, 왜 만들었는지에 대한 이력 관리, 룰 간 유사성이나 중복 여부 관리, 룰이 목적에 맞게 운영되고 있는지에 대한 사후 (정확도) 관리를 하지 않으면 나중에는 쉽게 손을 댈 수 없는 지경에 이르게 된다.
이력 관리
룰 운영이 곧 보안장비 운영이기 때문에 룰 이력 관리는 매우 중요하다. 어떤 필요에 의해 생성, 수정, 삭제가 이루어지고 있는지에 대한 현황이 관리되지 않으면, 조직이나 네트워크의 목적 및 특성과 맞지 않는 룰이 운영될 가능성이 높아지며, 이로 인해 룰 관리가 점점 더 복잡해질 가능성 역시 높아진다.
지난 글에서 'WEB-CLIENT Malformed PNG detected sRGB overflow attempt' 룰에 의해 발생한 로그의 오탐 근거를 찾아냈었지만, 룰 개선으로 이어지지는 못했다. 룰을 개선해서 오탐을 줄이는 방법을 찾아보도록 하자. 일단 관련 로그 발생 현황.
1980년대 이후 컴퓨터 보안사고가 증가하면서 로그 분석의 필요성이 증가하기 시작했다. 그런데 로그가 너무 많더라는 문제 발생. 그래서 사람들은 사전에 정의해놓은, 공격으로 알려진 패턴을 이용해서 일반로그를 필터링하기 시작했다. 패턴 필터링, 분석의 범위를 좁혀주는 패턴매칭은 이렇게 시작됐다. 그런데 이 패턴매칭은 아주 커다란 문제점을 가지고 있다.
패턴매칭의 기원은 도청. 도청이 성공하기 위한 필수 조건은 정확한 타겟 선정이다. 그런데 대부분의 정보보안 환경에서는 타겟을 특정할 수 없다. 도대체 누가 해커란 말인가? 시작부터 망함
사태의 심각성을 떠나서 '성공불융자금'이란 단어에 눈길이 갔다. 1984년에 도입된, 민간 기업이 해외 자원개발 등 고위험, 고수익 사업에 뛰어들 수 있도록 정부가 기업에 자금을 빌려주되 실패하면 융자금을 감면해주고 성공하면 원리금에 부담금을 얹어 반환하도록 한 제도라고 한다.
한 번의 실패도 용납이 어려운 한국 사회에서 이미 30여 년 전부터 실패하면 갚지 않아도 되는 융자 제도가 있어왔다는 게 참 신기하다. 장기적인 국익을 위해 필요한 제도임이 분명하다. 뚝딱뚝딱 5년안에 승부를 보려고만 할 게 아니라 국익에 도움이 될 가능성이 높다면 100년을 내다보는 정책도 필요하지 않은가?