* iptables를 이용한 애플리케이션 계층 문자열 매칭

 모든 IDS가 가지는 가장 중요한 기능 중 하나는 애플리케이션 계층 데이터에서 악의적인 바이트를 암시라는 바이트 나열을 검색하는 것이다. 그러나 일반적으로 애플리케이션의 구조는 네트워크나 전송 계층 프로토콜보다 훨씬 덜 엄격하게 정의되기 때문에 침입 탐지 시스템은 애플리케이션 계층 데이터를 조사할 때 융통성을 가져야 한다.

 네트워크 트래픽에서 애플리케이션 부분 전체에 대해 문자열 매칭을 수행하는 것은 좋은 출발점이며, iptables 의 문자열 매칭 확장이 이를 제공한다.

 – 문자열 매칭 확장의 동작
 다음의 규칙은 TCP 포트 5001에서 대기 중인 Netcat 서버로 문자열 “tester”가 전송될 때 syslog 메시지를 생성하기 위해 iptables LOG 타겟을 사용한다

 #iptables -I INPUT 1 -p tcp –dport 5001 -m string –string “tester” –algo bm -m state –state ESTABLISHED -j LOG –log-prefix “tester”

 # iptables -I INPUT 2 -p tcp –dport 5001 -j ACCEPT

  명령어의 –algo bm 인자에 주목하자. 문자열 매칭 확장은 리눅스 커널의 텍스트 검색 기능 위에서 구현된다. 리눅스 커널의 텍스트 검색 기능은 보이어-무어 문자열 검색 알고리즘(위의 bm)과 크누스-모리스-프랫 문자열 검색 알고리즘(kmp) 등과 같이 다양한 알고리즘을 지원한다.

 * 애플리케이션 계층 공격 정의
 
 애플리케이션 계층 공격은 애플리케이션, 애플리케이션 사용자, 애플리케이션이 관리하는 데이터를 애플리케이션 소유자나 관리자가 허용하는 것 이외의 목적으로 전복하려는 시도로 정의한다.

 애플리케이션 계층 공격은 다음의 세 가지로 분류할 수 있다.

 — 프로그래밍 버그에 대한 공격 : 애플리케이션 개발은 복잡한 과정이며 프로그래밍 오류는 반드시 존재한다. 어떤 경우에는 이런 버그가 네트워크를 통해 원격으로 접근 가능한 심각한 취약점을 유발할 수 있다. 좋은 예로 안전하지 않은 C 라이브러리 함수의 사용으로부터 야기되는 버퍼 오버플로우 취약점, 부적절한 질의를 제대로 제거하지 않고 후단 데이터베이스로 넘기거나(SQL 인젝션 공격으로 이어질 수 있다), 사용자가 입력한 필터링되지 않은 내용을 사이트에 세재하는(크로스 사이트 스크립팅이나 XSS 공격을 야기할 수 있다) 웹서버와 같이 웹 중심 취약점이 있다.

 — 신뢰 관계에 대한 공격 : 어떤 공격은 애플리케이션 프로그래밍 버그 대신 신뢰 관계를 공격한다. 이러한 공격은 애플리케이션 그 자체와의 연동만 고려하면 완전하게 정당한 것처럼 보인다. 하지만 공격은 해당 애플리케이션의 사용자들이 가지는 신뢰를 대상으로 삼는다. 피싱 공격이 대표적이다. 피싱의 목표는 웹 애플리케이션이나 메일 서버가 아니라 피싱 웹사이트나 메일 메시지를 해석하는 사람이다.

 — 자원 소진 : 네트워크나 전송 계층 DoS 공격과 같이 애플리케이션도 때때로 다량의 데이터 입력을 받을 수 있다. 이러한 공격은 모든 사용자가 애플리케이션을 사용할 수 없게 한다.

 * 애플리케이션 계층 악용

 일반적인 네트워크와 전송 계층 프로토콜의 구현이 RFC에 정의된 사항을 거의 따르는 반면 특정 CGI 애플리케이션이 웹서버를 통해 사용자 입력을 처리하는 방법을 제어하거나 애플리케이션이 자동 경계 검사나 메모리 관리를 수행하지 않는 프로그래밍 언어(C 등)로 작성됐는지 제어하는 표준은 없다.

 – 스노트 서명
 애플리케이션 계층 공격을 이해하는 가장 좋은 방법의 하나는 스노트 서명 집합을 살펴보는 것이다. 최근의 스노트 서명은 스노트 소스 코드와 함께 배포되지 않지만 블리딩 스노트(Bleeding Snort) 프로젝트에서 최신 공격에 대한 서명을 스노트 형식으로 생성하고 있다(http://www.bleedingsnort.com 참조)

 – 버퍼 오버플로우 공격
 버퍼 오버플로우 공격은 애플리케이션 소스 코드에서 버퍼에 복사되는 데이터의 양을 충당하기에 버퍼의 크기가 충분하지 않은 부분에서 발생하는 프로그래밍 오류를 이용하는 공격이다. 그러므로 오버플로우라는 용어는 인접한 메모리 위치가 덮어쓰일 때 사용된다. 스택 기반 버퍼 오버플로우의 경우 성공적인 공격은 함수의 복귀 주소(스택에 존재)가 공격자의 코드를 가리키게 덮어 쓴다. 이를 통해 공격자는 그때부터 쭉 프로세스의 실행을 제어할 수 있다. 또 다른 분류의 버퍼 오버플로우 공격은 힙으로부터 동적으로 할당되는 메모리 영역에 적용된다.

 – SQL 인젝션 공격
 SQL 인젝션 공격은 사용자 입력이 데이터베이스 질의에 포함되기 전에 이것이 올바른지 확인하거나 필터링하지 않는 애플리케이션을 공격한다. 영악한 공격자는 새로운 질의를 생성해서 잠재적으로 데이터베이스의 정보를 수정하거나 추출하기 위해 SQL 언어의 충첩(nesting) 기능을 사용할 수 있다. SQL 인젝션 공격의 일반적인 목표는 웹서버를 통해 실행되며, 후단 데이터베이스로의 인터페이스를 제공하는 CGI 애플리케이션이다.

 – 그레이 매터 해킹(Gray Metter Hacking)
 오늘날 인터넷에서 가장 문제가 되는 공격의 일부는 직접 사람들이 사용하는 애플리케이션을 통해서 사람들을 목표로 하는 공격이다. 강력한 시스템, 애플리케이션, 암호화 기법의 취약점을 찾는 것보다 사람을 공격하는 것이 때로는 쉽다.

 — 피싱(Phishing)
 피싱(Phishing)은 사용자가 은행과 같은 온라인 계좌에 대한 인증 정보를 신뢰할 수 없는 곳에 제공하게 속이는 공격이다. 이 공격은 주로 공식적인 것처럼 보이는 메일을 사용자게 전송해서 이뤄지는데, 메일의 내용은 사용자가 온라인 계좌에 접속해서 보안상 “긴급한” 작업(예를 들어 암호 변경)을 수행해야 한다는 것이다. 정상적인 것처럼 보이는 웹 링크가 제공되지만 이는 원래의 웹사이트를 비슷하게 흉내낸 공격자 제어하의 웹사이트로 사용자를 유도하는 교묘한 링크다. 일단 피싱 공격을 당하는 사용자가 사이트에 방문해서 자신의 계정 정보를 입력하는 공격자는 재빨리 계정 정보를 가로챈다.

 — 백도어와 키보드 입력 로깅
 백도어(backdoor)란 공격자는 사용할 수 있지만 정당한 사용자는 사용할 수 없는 기능을 포함하는 실행 파일이다.  예를 들어 Sdbot 트로이목마는 공격자의 명령어 전송을 기자리는 IRC 채널로 연결하기 위해 특정 IRC 클라이언트를 사용해서 백도어를 연다. 하지만 백도어는 어떤 동작도 취하기 전에 공격자가 유효한 암호를 입력하게 만든 프로그램이다. 이는 백도어 통신의 인증 수준을 높여주며, 시스템에 성공적으로 침투한 공격자만이 그 시스템을 제어할 수 있게 해준다.

 * 암호호와 애플리케이션 인코딩

 애플리케이션 계층 공격을 탐지하기 어렵게 만드는 요소로 암호화와 애플리케이션 인코딩 기법의 두 가지를 곱을 수 있다. 암호화는 암호 키가 없는 한 암호를 평문화하는 것이 현실적으로 불가능하게 설계되며, 보통의 IDS, IPS 방화벽 장치는 이러한 키에 접근할 수 없기 때문에 특히 문제가 된다.

 그러나 일부 애플리케이션 계층 공격의 경우에는 성공을 위해 암호화가 필요가 없다. 예를 들어 SSH 서버에 대한 특정 공격을 탐지하는 스노트 서명(“평문 상태”에서 동작해야 함)이 있다. 이러한 서명이 사용되면 스노트는 SSH 암호화 키에 접근하지 않고 페이로드 데이터를 검색한다. 이러한 서명의 존재는 암호화만으로는 완벽한 방어를 할 수 없다는 것을 의미하며, 때때로 공격자는 통상적으로 요구되는 암호화 계층이 어떤 차이도 만들어내지 못하는 애플리케이션 취약점을 공격할 수 있다. 즉, 암호화되지 않은 수단을 통해 접근 가능한 함수 내부에 취약점이 존재할 수도 있다.

 인코딩 기술 역시 IDS가 다루기 어려울 수 있다. 예를 들어 보통 느린 네트워크로 압축하지 않은 데이터를 전송하는 것보다 빠른 CPU로 데이터를 압축하거나 압축 해제하는 것이 빠르기 때문에 많은 웹 브라우저가 네트워크를 통해 전송되는 데이터의 크기를 줄이기 위해 gzip 인코딩을 지원한다. 공격자가 약간의 무작위 데이터를 섞은 후 gzip으로 압축하면 IDS는 공격을 탐지하기 위해 이 데이터가 네트워크로 전송될 때 해당 데이터의 압축을 해제해야 한다. 무작위 데이터는 압축된 공격이 매번 달라 보이게 한다. 이러한 무작위화를 거치지 않으면 IDS는 공격을 식별하기 위해 압축 문자열 자체를 검색할 수 있다. 분주한 네트워크에는 악의적이지 않은 대용량 압축 파일을 다운로드 하는 웹 세션이 매우 많기 때문에 모든 웹 세션을 시시간으로 압축 해제하는 것은 계산상 비현실적이다.

 – IDS가 모든 애플리케이션 인코딩을 디코딩할 수 없는 것은 아니다. 예를 들어 웹 세션에서 URL 인코딩된 데이터는 스노트 서명 언어의 uricontent 키워드를 이용해서 스노트 HTTP 전처리기에 의해 실시간으로 디코딩된다. 이는 URL 인코딩이 16진수 코드와 % 기호를 사용하는 단순한 치환 연산을 통해 수행되기 때문에 가능하다. 예를 들어 A는 %41이 되며, 이는 동일한 방식으로 쉽게 복원할 수 있다. 이러한 인코딩 기법은 많은 계산을 필요로 하지 않는다.

 * 애플리케이션 계층 응답

 기술적으로 애플리케이션 계층 공격에 대한 순수한 애플리케이션 계층 응답은 애플리케이션 계층에 존재하는 구성소만을 포함해야 한다. 예를 들어 사용자가 애플리케이션을 악용하고 있다면 단순히 해당 계정을 비활성해야 되며, 공격자가 웹서버에서 실행되는 CGI 애플리케이션을 통해 SQL 인젝션을 시도한다면 질의를 무시하고 클라이언트로 HTTP 오류 코드를 반환해야 한다. 이러한 응답은 애플리케이션 계층 아래에 존재하는 패킷 헤더 정보의 변경을 필요로 하지 않는다.

 그러나 엄격한 애플리케이션 계층 응답은 방화벽과 네트워크 침입 방지 시스템에 적합하지 않다. 이는 방화벽과 네트워크 침입 방지 시스템이 보통 애플리케이션 자체와 긴밀히 통합돼 있지 않기 때문이다. 더욱이(양방향 통신을 필요로 하는) TCP 세션상에서 특정 IP 주소로부터 매우 악의적인 공격이 발견됐다면 그때부터는 공격자 IP 주소로부터의 모든 통신을 차단하는 것이 좀 더 유용할 수 있다. 이는 애플리케이션 계층 공격에 대한 네트워크 계층 응답이다.

Tags:

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.