(글) : 안랩코코넛 서비스지원부 엄원상

 

조직에서 웹 사이트를 호스팅할 경우 서버 중 일부는 들어오는 HTTP 소통량을 수신합니다. 그러나 들어오는 소통량이 모두 적절한 것은 아닙니다. UrlScan은 들어오는 HTTP 패킷을 분석하는 ISAPI 필터로서, 의심스러운 소통량을 거부할 수 있습니다. UrlScan은 선택한 IIS 서비스 기능에 대한 HTTP 요청을 필터링 및 거부하여 공격으로부터 서버를 보호합니다. 기본적으로 UrlScan은 그래픽을 포함하여 정적 HTML 파일에 대한 요청만 받아 들이도록 구성됩니다.

UrlScan은 다음과 같은 역할을 하게 됩니다.
- ISAPI Filter(urlscan.dll)이 우선순위가 맨 위로 로드 되어 웹 서버에 요청되는 불특정 문자
  또는 URL 인코딩된 것을 분석하여 HTTP 리퀘스트를 반환시키는 역할을 합니다.
- HTTP request 분석
- 심각한 공격에 노출을 줄임
- 다음과 같은 기준으로 요청을 거부할 수 있도록 IIS설정 가능

A. 요청 방법 (verb)
B. 요청된 자원의 파일 확장자
C. 의심되는 URL 인코딩
D. URL내의 ASCII문자가 아닌 것이 존재할 때
E. URL내의 특정 문자 배열이 존재할 때
F. 응답에 특정 헤더가 존재할 때
또한 응답 헤더 부분의 Server:를 변경해주거나 삭제하는 옵션 제공
* UrlScan의 작동은 UrlScan.ini에 의해 제어됨
  UrlScan.ini은 UrlScan.dll과 같은 디렉터리 내에 존재해야 함
* UrlScan은 초기 동작 시 단지 ini파일만 읽어 들임(성능 저하)
- ini파일에 변경이 있기 전에 웹 서비스를 중지했다 재 시작하는 작업이 필요함
* UrlScan.dll내의 기본 설정은 해당 서버로의 모든 요청을 거부하도록 되어 있다.
* 서비스 요청을 넘길 있도록 UrlScan에 UrlScan.ini을 제공하도록 해야 함
* 예제 UrlScan.ini파일이 제공됨
* 잘 알려진 IIS공격을 막아내도록 설정

- URLScan을 설치하면 다음의 폴더에 복사가 됩니다.
  \Winnt\system32\inetsrv\urlscan 폴더 밑에 위치합니다.
  이 폴더 밑에는 반드시 urlscan.dll과 urlscan.ini가 같이 있어야 합니다.

인터넷 서비스 관리자로 Urlscan의 ISAPI필터 확인하는 법

 1) 시작 -> 프로그램 -> 관리도구 -> 인터넷 서비스 관리자를 실행합니다.
 2) 여기서 서버이름이 sanghoon으로 가정되어 있다고 봅니다. 좌측화면의 컴퓨터 이름에서
    마우스 우측버튼을 클릭하여 등록정보를 클릭합니다.
 3) 마스터 속성에서 WWW 서비스를 선택 후 우측에 있는 편집버튼을 클릭합니다.
 4) ISAPI 필터 탭을 선택하면 아래와 같이 Urlscan의 우선순위가 맨 위로 올라가 있는 것을 확인 할 수 있습니다. 그러면 정상적으로 Urlscan이 설치가 되었다는 것을 의미합니다.

  URLScan.ini 구성정보


사용자가 필요한 확장명을 가진 것을 웹 서비스에서 사용하려면 URLScan.ini안에 있는 [DenyExtentions] 섹션 밑에서 필요한 확장명을 주석으로 처리하면 해당된 파일을 사용하실 수 있습니다.

구체적인 정보는 \Winnt\system32\inetsrv\urlscan\urlscan.txt 파일을 참조하시면 각 섹션에 대한 정보를 보실 수 있습니다.

그중에서 [Options] 섹션은 IIS 서버가 유효한 웹 요청과 유효하지 않은 웹 요청을 처리하는 방법을 정의합니다. 정의할 수 있는 옵션은 다음과 같습니다

UseAllowVerbs허용되는 값은 0 또는 1입니다. 기본값인 1로 설정할 경우 UrlScan은 UrlScan.ini의 AllowVerbs 섹션을 읽고 명시적으로 나열되지 않은 HTTP 동사가 포함된 요청을 거부합니다. AllowVerbs 섹션은 대/소문자를 구분합니다. 0으로 설정되면 UrlScan은 UrlScan.ini의 DenyVerbs 섹션을 읽고 나열된 HTTP 동사가 포함된 요청을 거부합니다. DenyVerbs 섹션은 대/소문자를 구분하지 않습니다.

UseAllowExtensions허용되는 값은 0 또는 1입니다. 1로 설정할 경우 UrlScan은 UrlScan.ini의 AllowExtensions 섹션을 읽고 URL과 관련된 파일 확장명이 명시적으로 나열되지 않은 요청을 거부합니다. 기본값인 0으로 설정되면 UrlScan은 UrlScan.ini의 DenyExtensions 섹션을 읽고 요청과 관련된 파일 확장명이 나열된 요청을 거부합니다. AllowExtensions과 DenyExtensions 섹션은 모두 대/소문자를 구분하지 않습니다.

NormalizeUrlBeforeScan 허용되는 값은 0 또는 1입니다. 기본값인 1로 설정할 경우 UrlScan은 먼저 IIS가 디코딩하고 표준화한 다음에 요청 URL을 모두 분석합니다. 0으로 설정되면 UrlScan은 클라이언트가 보낸 원시 URL을 모두 분석합니다. URL 분석에 대해 잘 알고 있는 고급 관리자만 이 옵션을 0으로 설정해야 합니다. 그렇지 않으면 IIS 서버가 URL 확장명의 정확한 분석을 무시하는 정형화(canonicalization) 공격에 노출될 수 있습니다.

VerifyNormalization허용되는 값은 0 또는 1입니다. 기본값인 1로 설정할 경우 UrlScan은 URL의 표준화를 확인합니다. 이 동작은 URL에 이중 인코딩된 문자열이 들어 있을 때 정형화 공격을 방어합니다. 예를 들어, %252e 문자열은 이중 인코딩된 '.' 문자로, %25는 '%' 문자로 디코딩됩니다. %252e의 첫 번째 디코딩은 결국 %2e가 되고 두 번째에 '.'로 디코딩될 수 있습니다. 0으로 설정되면 이 확인이 수행되지 않습니다.

AllowHighBitCharacters허용되는 값은 0 또는 1입니다. 1로 설정할 경우 UrlScan은 URL에 있는 바이트를 허용합니다. 기본값인 0으로 설정되면 UrlScan은 URL에 ASCII 문자 집합 이외의 문자가 포함된 요청을 거부합니다. 이 기능은 유니코드 또는 UTF-8 기반 공격을 방어할 수 있지만 ASCII가 아닌 코드 페이지를 사용하는 IIS 서버에 대한 정당한 요청을 거부하기도 합니다.

AllowDotInPath허용되는 값은 0 또는 1입니다. 기본값인 0으로 설정할 경우 UrlScan은 점(.) 문자 인스턴스가 여러 개인 요청을 거부합니다. 1로 설정되면 UrlScan은 이 테스트를 수행하지 않습니다. UrlScan은 아직 IIS가 URL을 분석하지 않은 수준에서 작동하기 때문에 어떤 경우에도 점 문자가 확장명을 나타내는지 또는 URL의 디렉터리 경로나 파일 이름의 일부인지를 판단할 수 없습니다. 확장명을 분석하기 위해 UrlScan은 항상 확장명이 URL의 일부라고 가정합니다. 이 때 URL은 문자열의 마지막 점 뒤에서 시작하고 점이나 문자열 끝 뒤의 첫 번째로 오는 물음표나 슬래시 문자로 끝납니다. AllowDotInPath를 0으로 설정하면 공격자가 경로 정보를 사용해서 요청의 진짜 확장명(예: /path/TrueURL.asp/BogusPart.htm)을 숨길 경우에 방어할 수 있습니다.
참고:AllowDotInPath를 0으로 설정하면 UrlScan이 디렉터리 이름에 점이 포함된 요청도 거부할 수 있습니다.

RemoveServerHeader허용되는 값은 0 또는 1입니다. 1로 설정할 경우 UrlScan은 모든 응답에서 서버 헤더를 제거합니다. 기본값인 0으로 설정하면 UrlScan은 이 동작을 수행하지 않습니다. 이 기능은 UrlScan이 IIS 4.0 이상에 설치되어 있어야 사용할 수 있습니다.

EnableLogging허용되는 값은 0 또는 1입니다. 기본값인 1로 설정할 경우 UrlScan은 해당 동작을 UrlScan.dll과 같은 디렉터리에 만들어지는 UrlScan.log 파일에 해당 동작을 로깅합니다. 0으로 설정하면 로깅이 수행되지 않습니다.

PerProcessLogging허용되는 값은 0 또는 1입니다. 1로 설정할 경우 UrlScan은 UrlScan.dll을 호스팅하는 IIS 프로세스의 프로세스 ID를 로그 파일 이름(예: UrlScan.1234.log)에 추가합니다. 이 기능은 여러 프로세스에서 동시에 필터를 호스팅할 수 있는 IIS 버전에 유용합니다. 기본값인 0으로 설정하면 UrlScan.log가 로그 파일이 됩니다.

AlternateServerName허용되는 값은 문자열이며 기본값은 빈 문자열입니다. 이 옵션의 값이 설정되고(빈 문자열이 아님) RemoveServerHeader가 0으로 설정할 경우 IIS는 모든 응답의 기본 헤더를 이 문자열로 바꿉니다. RemoveServerHeader가 1로 설정되면 AlternateServerName에 의미가 없습니다. 이 기능은 UrlScan이 IIS 4.0 이상에 설치되어 있어야 사용할 수 있습니다.

AllowLateScanning 허용되는 값은 0 또는 1입니다. 1로 설정할 경우 UrlScan은 낮은 우선 순위 필터로 자동 등록됩니다. 그렇게 되면 UrlScan이 분석을 수행하기 전에 다른 필터가 URL을 수정할 수 있습니다. 이 스위치 외에도 UrlScan은 필터 목록에서 서버의 MMC ISAPI 필터 속성 시트의 높은 우선 순위 필터보다 낮은 위치에 있어야 합니다. 기본값인 0으로 설정되면 UrlScan은 높은 우선 순위 필터로 실행됩니다. Front Page Server Extensions에서는 이 설정이 1이어야 하고 UrlScan은 필터 로드 순서 목록에서 낮은 쪽(가장 낮은 경우가 좋음)에 있어야 합니다.

PerDayLogging허용되는 값은 0 또는 1입니다. 기본값인 1로 설정할 경우 UrlScan은 매일 새 로그 파일을 만들고 로그 파일 이름에 날짜를 추가합니다(예: UrlScan.101501.log). PerDayLogging=1과 PerProcessLogging=1이 모두 설정되면 로그 파일 이름에 날짜와 프로세스 ID가 포함됩니다(예: UrlScan.101501.123.log). PerDayLogging을 사용하면 해당 날짜에 첫 번째 로그 항목이 기록될 때 오늘 날짜에 대한 로그가 만들어지고 이전 날짜의 로그는 닫힙니다. UrlScan 동작이 발생하지 않는 날에 대해서는 로그가 만들어지지 않습니다. 이 값을 0으로 설정하면 UrlScan은 UrlScan.log파일을 엽니다. PerProcessLogging=1인 경우에는 UrlScan.xxx.log(xxx는 프로세스 ID) 파일이 열립니다.

RejectResponseUrl 허용되는 값은 문자열입니다. 기본값은 /입니다. 이 문자열은 /path/file_name.ext 형식의 URL입니다. UrlScan이 요청을 거부할 경우 UrlScan은 분석할 요청에 대하여 웹 사이트의 로컬이 될 지정된 URL을 실행합니다. 지정된 URL은 거부된 URL과 같은 확장명(예: .asp)을 가질 수 있습니다.

UseFastPathReject허용되는 값은 0 또는 1입니다. 1로 설정할 경우 UrlScan은 RejectResponseUrl을 무시하며, 요청을 무시할 경우에는 클라이언트로 짧은 404 응답을 반환합니다. 이 옵션은 RejectResponseUrl을 모두 처리하는 것보다 빠르지만 이 옵션이 사용되면 IIS가 사용자 정의 404 응답을 반환하거나 요청의 여러 부분을 IIS 로그에 기록할 수 없습니다. UrlScan 로그 파일에는 거부된 요청에 대한 모든 정보가 그대로 들어 있습니다. 기본값은 UseFastPathReject를 사용하지 않는 것입니다.

[AllowVerbs] 섹션에는 HTTP 동사(방법) 목록이 있습니다. UseAllowVerbs가 [Options] 섹션에서 1로 설정할 경우 UrlScan은 여기에 명시적으로 나열하지 않은 동사가 포함된 요청을 거부합니다. 이 섹션의 항목은 대/소문자를 구분합니다.

[DenyVerbs] 섹션에는 HTTP 동사(메서드)의 목록이 있습니다. UseAllowVerbs가 [Options] 섹션에서 0으로 설정할 경우 UrlScan은 여기에 나열된 동사가 포함된 요청을 거부합니다. 이 섹션의 항목은 대/소문자를 구분하지 않습니다.

[DenyHeaders] 섹션에는 받은 요청에 포함된 경우 거부될 요청 헤더의 목록이 있습니다. 이 섹션의 항목은 대/소문자를 구분하지 않습니다.

[AllowExtensions] 섹션에는 파일 확장명 목록이 있습니다. UseAllowExtensions이 [Options] 섹션에서 1로 설정될 경우 여기에 명시적으로 나열되지 않은 확장명을 가진 URL이 포함된 모든 요청이 거부됩니다. 이 섹션의 항목은 대/소문자를 구분하지 않습니다.
참고:뒤에 따르는 문자 없이 점만 사용하여 빈 확장명을 추가하면 확장명 없는 요청(예: 기본 페이지나 디렉터리 목록에 대한 요청)을 지정할 수 있습니다.

[DenyExtensions]섹션에는 파일 확장명 목록이 있습니다. UseAllowExtensions이 [Options] 섹션에서 0으로 설정되면 여기에 나열된 확장명을 가진 URL이 포함된 모든 요청이 거부됩니다. 이 섹션의 항목은 대/소문자를 구분하지 않습니다.
참고: UrlScan.ini 파일을 변경할 경우에는 ISA PROXY3 서비스를 다시 시작하여 ISAPI 필터를 다시 로드해야 합니다.

- Urlscan의 로그파일이 생성되는 위치: \Winnt\system32\inetsrv\urlscan\ 의 폴더 밑에 urlscan.log라는 로그파일이 생성이 됩니다. 그리고 지난 날짜의 로그파일은 자동적으로 urlscan.122701.log와 같이 생성이 됩니다.

- 현재 Urlscan의 로그파일의 위치를 변경하는 옵션이 없기 때문에 저장공간에 대해서 고려를 해야 합니다.

 

From 안랩 코코넛

+ Recent posts