소개
Nikto 는 인기 있는 오픈 소스 웹 서버 스캐너로, 6,700 개 이상의 잠재적으로 위험한 파일/프로그램, 1,250 개 이상의 서버에 대한 최신 버전 확인, 270 개 이상의 서버에 대한 버전별 문제 등 다양한 항목에 대해 웹 서버를 포괄적으로 테스트합니다.
보안 스캔을 수행할 때 침입 탐지 시스템 (IDS), 침입 방지 시스템 (IPS) 또는 웹 애플리케이션 방화벽 (WAF) 과 같은 보안 시스템에 탐지되지 않도록 하는 것이 바람직한 경우가 많습니다. 이러한 시스템은 악성 패턴에 대해 네트워크 트래픽을 모니터링합니다. Nikto 에는 스캔을 위장하고 이러한 시스템에 덜 눈에 띄게 만드는 데 도움이 되는 내장된 회피 기법이 포함되어 있습니다.
이 랩에서는 Nikto 의 -evasion 옵션을 사용하여 더 은밀한 스캔을 수행하는 방법을 배우게 됩니다.
-evasion 으로 사용 가능한 회피 기법 이해하기
이 단계에서는 Nikto 에서 사용 가능한 다양한 회피 기법을 나열하고 이해하는 방법을 배웁니다. -evasion 옵션 (또는 -e) 은 회피 기법을 지정하는 데 사용됩니다. 사용 가능한 모든 기법을 보려면 특정 기법 번호 없이 -evasion 옵션만 사용하여 Nikto 를 실행할 수 있습니다.
사용 가능한 기법을 나열해 보겠습니다. 터미널을 열고 다음 명령을 실행합니다.
nikto -evasion
각 기법에 대한 번호와 짧은 설명이 포함된 사용 가능한 기법 목록이 표시됩니다.
- Evasion options:
1 Random URI encoding (non-UTF8)
2 Directory self-reference (/./)
3 Premature URL ending
4 Prepend long random string to request
5 Fake parameter
6 GET instead of HEAD
7 Use a random User-Agent
8 Random case sensitivity
A Use a random IP for the Source-IP
B Obfuscate with TABs
C Use a carriage return (CR) as a line-ending
D Use a binary value as a line-ending
E Use a long false request to mis-direct an IDS
F Use Windows-style directory separators (\)
이 출력은 Nikto 가 탐지를 피하기 위해 요청을 변경하는 데 사용할 수 있는 다양한 방법을 보여줍니다. 다음 단계에서는 이러한 기법 중 일부를 사용하는 연습을 할 것입니다.
Random URI 인코딩을 위한 -evasion 1 을 사용하여 스캔 실행하기
이 단계에서는 첫 번째 회피 기법인 "Random URI encoding"을 사용합니다. 이 기법은 요청 URI 의 일부를 비표준 방식으로 인코딩합니다. 웹 서버는 일반적으로 이러한 인코딩을 이해하지만, 단순한 시그니처 기반 IDS 는 패턴을 일치시키지 못하여 탐지되지 않고 요청을 통과시킬 수 있습니다.
랩 설정에서 시작된 간단한 웹 서버를 대상으로 스캔을 실행할 것입니다. 이 서버는 http://127.0.0.1:8000에서 실행 중입니다.
기법 1을 사용하려면 -evasion 옵션에 숫자를 추가합니다. 터미널에서 다음 명령을 실행합니다.
nikto -h http://127.0.0.1:8000 -evasion 1
이제 Nikto 가 대상 스캔을 시작합니다. 스캔은 평소와 같이 진행되지만, 서버로 전송되는 요청의 URI 는 무작위로 인코딩됩니다.
다음은 볼 수 있는 출력의 샘플입니다.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.12
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type.
+ No CGI directories found (use '-C all' to force check all possible dirs)
+ Server leaks a possible file system path: /home/labex/project/test-site/. This may suggest the server is running on a Unix-like system.
+ Allowed HTTP Methods: GET, HEAD, OPTIONS
+ Public HTTP Methods: GET, HEAD, OPTIONS
+ OSVDB-3233: /: HTTP TRACE method is active, suggesting the host is vulnerable to XST
...
+ 15 requests: 0 error(s) and 7 item(s) reported on remote host
+ End Time: ... (15 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
스캔이 완료되고 결과를 제공하지만, 기본 요청은 더 회피적으로 수정되었음을 알 수 있습니다.
디렉토리 자체 참조를 위한 -evasion 2 를 사용하여 스캔 시도하기
이제 다른 기법을 시도해 보겠습니다. 회피 기법 2는 "Directory self-reference"를 사용합니다. 이 방법은 요청 URL 에 /./를 삽입합니다 (예: /cgi-bin/이 /./cgi-bin/이 됨). 대부분의 웹 서버는 이 경로를 정규화하여 일반 요청으로 처리하지만, 정확한 경로 일치를 찾는 일부 보안 필터를 혼란스럽게 할 수 있습니다.
동일한 대상을 대상으로 회피 기법 2를 사용하여 Nikto 스캔을 실행합니다.
nikto -h http://127.0.0.1:8000 -evasion 2
스캔이 다시 실행되지만 이번에는 디렉토리 자체 참조 트릭을 사용합니다. 서버가 수정된 요청에 올바르게 응답하므로 출력은 이전 스캔과 매우 유사할 것입니다.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.12
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type.
...
+ 15 requests: 0 error(s) and 7 item(s) reported on remote host
+ End Time: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
핵심은 보안 모니터링을 우회하는 데 도움이 되는 기법을 사용하면서도 여전히 유효한 스캔 결과를 얻고 있다는 것입니다.
긴 무작위 문자열을 앞에 붙이는 -evasion 4 사용하기
이 단계에서는 요청 앞에 긴 무작위 문자열을 붙이는 회피 기법 4를 살펴보겠습니다. 이 기법의 아이디어는 요청의 실제 악성 또는 흥미로운 부분을 일부 단순 IDS/IPS 장치의 버퍼 제한을 넘어서도록 하는 것입니다. IDS 가 요청의 첫 부분만 검사한다면 실제 페이로드를 놓칠 수 있습니다.
이 기법을 사용하여 스캔을 실행해 보겠습니다.
nikto -h http://127.0.0.1:8000 -evasion 4
다시 한번 Nikto 가 스캔을 수행하지만, 이번에는 각 요청 앞에 길고 무작위적인 문자열이 붙습니다. 웹 서버는 이 불필요한 데이터를 무시하지만, 패턴 매칭 보안 시스템을 속이는 효과적인 방법이 될 수 있습니다.
출력은 이전 스캔과 유사할 것이며, 이 기법이 대상 서버에 대한 스캔의 효과를 방해하지 않음을 보여줍니다.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.12
...
+ 15 requests: 0 error(s) and 7 item(s) reported on remote host
+ End Time: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
단일 스캔에서 여러 회피 기법 결합하기
Nikto 의 회피 기능 중 가장 강력한 기능 중 하나는 단일 스캔에서 여러 기법을 결합할 수 있다는 것입니다. 이는 더 복잡하고 다양한 요청을 생성하여 IDS 가 스캔을 탐지하기 더욱 어렵게 만듭니다.
기법을 결합하려면 사용하려는 기법의 번호를 순서대로 나열하면 됩니다. 예를 들어, 무작위 URI 인코딩 (1), 디렉토리 자체 참조 (2), 긴 무작위 문자열 앞에 붙이기 (4) 를 결합하려면 -evasion 124를 사용합니다.
이 세 가지 기법을 결합한 스캔을 실행해 보겠습니다.
nikto -h http://127.0.0.1:8000 -evasion 124
Nikto 는 이제 세 가지 기법 모두를 요청에 적용하여 매우 난독화된 스캔을 생성합니다. 이 계층적 접근 방식은 탐지를 우회할 가능성을 크게 높입니다.
출력은 다시 동일한 결과를 보여주며, 회피 기법의 조합이 스캔 기능에 영향을 미치지 않았음을 확인합니다.
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.12
+ The anti-clickjacking X-Frame-Options header is not present.
...
+ 15 requests: 0 error(s) and 7 item(s) reported on remote host
+ End Time: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
기법을 결합함으로써 예상되는 특정 방어에 맞춰 훨씬 더 강력하고 은밀한 스캔 전략을 만들 수 있습니다.
요약
이 실습에서는 Nikto 의 강력한 회피 기능을 사용하여 보다 은밀한 웹 취약점 스캔을 수행하는 방법을 배웠습니다. -evasion 옵션을 사용하여 사용 가능한 기법을 나열하는 것으로 시작했습니다. 그런 다음 무작위 URI 인코딩 (1), 디렉토리 자체 참조 (2), 긴 무작위 문자열 앞에 붙이기 (4) 를 포함한 개별 기법을 적용하는 연습을 했습니다.
마지막으로 이러한 기법을 결합하여 다층 회피 전략을 생성하는 방법을 배웠으며, 이는 침입 탐지 시스템이 스캔 활동을 식별하는 것을 훨씬 더 어렵게 만듭니다. 이러한 기술은 적극적인 모니터링이 이루어지는 환경에서 효과적이고 신중한 보안 평가를 수행하는 데 필수적입니다.


