소개
Nikto 는 인기 있는 오픈 소스 웹 서버 스캐너로, 6,700 개 이상의 잠재적으로 위험한 파일/프로그램, 1,250 개 이상의 서버의 오래된 버전 확인, 270 개 이상의 서버에 대한 버전별 문제 등 다양한 항목에 대해 웹 서버를 포괄적으로 테스트합니다.
이 맥락에서 프록시는 도구 (Nikto) 와 대상 서버 사이에 위치하는 중개 서버입니다. Burp Suite, OWASP ZAP 또는 mitmproxy와 같은 도구가 일반적으로 사용됩니다. Nikto 의 트래픽을 프록시를 통해 라우팅하는 것은 보안 전문가에게 강력한 기술입니다. 이를 통해 스캐너가 보내는 요청과 수신하는 응답을 정확하게 확인할 수 있습니다. 이는 스캔 디버깅, 스캐너 동작 이해, 심지어 보안 조치를 우회하기 위해 트래픽을 실시간으로 수정하는 데 매우 유용합니다.
이 랩에서는 로컬 프록시를 설정하고, Nikto 를 구성하여 이를 사용하고, 스캔을 실행하고, 가로챈 트래픽을 분석하는 방법을 배웁니다. 프록시로는 mitmproxy를 사용하고 대상으로는 간단한 로컬 Python 웹 서버를 사용합니다.
Burp Suite 또는 OWASP ZAP 와 같은 로컬 프록시 설정
이 단계에서는 스캔 대상 역할을 할 간단한 웹 서버를 시작하고, 트래픽을 가로챌 경량 명령줄 프록시인 mitmproxy를 시작합니다. 모든 작업은 터미널에서 수행됩니다.
먼저 기본 Python 웹 서버를 시작합니다. 이 서버는 현재 디렉토리인 ~/project의 간단한 index.html 파일을 호스팅합니다. 동일한 터미널을 계속 사용할 수 있도록 백그라운드에서 포트 8000에서 실행합니다.
다음 명령을 실행합니다.
python3 -m http.server 8000 &
명령 끝에 있는 &는 프로세스를 백그라운드에서 실행합니다. 프로세스 ID 를 나타내는 출력이 표시됩니다.
다음으로 프록시를 시작합니다. mitmproxy의 웹 기반 인터페이스인 mitmweb을 사용합니다. 이를 통해 캡처된 트래픽을 사용자 친화적인 방식으로 볼 수 있습니다. 기본적으로 포트 8080에서 프록시 트래픽을 수신하고 포트 8081에서 웹 인터페이스를 제공합니다.
백그라운드에서 mitmweb을 시작하려면 다음 명령을 실행합니다.
mitmweb --web-host 0.0.0.0 &
mitmweb이 시작되면서 일부 출력이 표시됩니다. 이제 포트 8000에서 실행되는 대상 서버와 포트 8080에서 실행되는 프록시가 있습니다. 랩 환경에서 브라우저를 열고 http://127.0.0.1:8081로 이동하여 프록시의 트래픽을 볼 수 있습니다. 현재는 비어 있습니다.
Nikto 에 -useproxy 를 사용하여 프록시 사용 구성
이 단계에서는 방금 시작한 mitmproxy 인스턴스를 통해 Nikto 가 트래픽을 보내도록 지시하는 방법을 배웁니다. Nikto 는 이 목적을 위해 전용 명령줄 옵션인 -useproxy를 가지고 있습니다.
이 옵션의 구문은 -useproxy http://<proxy_host>:<proxy_port>입니다. mitmproxy는 포트 8080에서 로컬 머신 (127.0.0.1) 에서 실행되므로 올바른 URL 은 http://127.0.0.1:8080입니다.
전체 스캔을 실행하기 전에, Nikto 가 프록시를 통해 대상 서버에 연결할 수 있는지 확인하기 위해 간단한 테스트를 수행합니다. -Plugins '@@NONE' 옵션을 사용할 것입니다. 이 옵션은 Nikto 에게 서버 배너를 연결하고 출력하도록 지시하지만 취약점 테스트는 실행하지 않습니다. 이는 프록시 구성을 확인하는 빠르고 효과적인 방법입니다.
터미널에서 다음 명령을 실행합니다.
nikto -h 127.0.0.1 -p 8000 -useproxy http://127.0.0.1:8080 -Plugins '@@NONE'
Nikto 의 배너와 대상 서버에 대한 정보가 표시되는 다음과 유사한 출력이 표시되어야 합니다.
- Nikto v2.x.x
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.6
+ END TIME: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
이제 브라우저에서 http://127.0.0.1:8081로 mitmweb 인터페이스를 확인하면 Nikto 에서 캡처된 첫 번째 요청을 볼 수 있습니다. 이는 프록시 구성이 올바르게 작동하고 있음을 확인합니다.
구성된 프록시를 통해 스캔 실행
이 단계에서는 프록시 구성을 확인했으므로 Nikto 로 실제 취약점 스캔을 수행합니다. 이렇게 하면 상당한 양의 트래픽이 생성되며, 이 모든 트래픽은 mitmproxy를 통해 라우팅되고 로깅됩니다.
이 랩의 스캔 시간을 합리적으로 유지하기 위해 -Tuning 1 옵션을 사용합니다. Nikto 의 튜닝 옵션은 수행되는 테스트 유형을 제어합니다. -Tuning 1은 "흥미로운 파일 / 로그에서 발견됨" 검사에 중점을 두며, 이는 좋은 시작점입니다.
스캔을 시작하려면 다음 명령을 실행합니다.
nikto -h 127.0.0.1 -p 8000 -useproxy http://127.0.0.1:8080 -Tuning 1
이제 Nikto 가 대상 서버 스캔을 시작합니다. 진행 상황과 발견된 내용은 터미널에서 직접 볼 수 있습니다. 출력은 발견된 내용에 따라 다음과 유사할 수 있습니다.
- Nikto v2.x.x
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 8000
+ Start Time: ...
---------------------------------------------------------------------------
+ Server: SimpleHTTP/0.6 Python/3.10.6
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ 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
...
+ /: The server returns the following message when a request for a non-existent page is made: b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"\n "http://www.w3.org/TR/html4/strict.dtd">\n<html>\n <head>\n <meta http-equiv="Content-Type" content="text/html;charset=utf-8">\n <title>Error response</title>\n </head>\n <body>\n <h1>Error response</h1>\n <p>Error code: 404.</p>\n <p>Message: File not found.</p>\n <p>Error code explanation: 404 - Nothing matches the given URI.</p>\n </body>\n</html>'
...
+ END TIME: ...
---------------------------------------------------------------------------
+ 1 host(s) tested
스캔이 진행되는 동안 mitmweb 브라우저 탭으로 전환하여 요청이 실시간으로 나타나는 것을 볼 수 있습니다.
프록시의 HTTP 기록에서 Nikto 트래픽 관찰
이 단계에서는 mitmproxy가 캡처한 트래픽을 분석하는 데 집중합니다. 여기서 프록시 사용의 진정한 가치가 명확해집니다. 이 단계에 필요한 새로운 명령은 없으며, 브라우저에서 mitmweb 인터페이스를 사용하게 됩니다.
http://127.0.0.1:8081에서 실행 중인 mitmweb 브라우저 탭으로 이동합니다. 긴 웹 요청 목록이 표시되어야 합니다. 이 목록의 각 항목은 Nikto 가 대상 서버에 대해 수행한 특정 테스트입니다.
왼쪽 목록에서 요청 중 하나를 클릭합니다. 오른쪽 패널이 해당 특정 요청과 해당 응답의 세부 정보를 표시하도록 업데이트됩니다.
인터페이스를 탐색합니다.
- Request Tab: 여기서는 Nikto 가 보낸 정확한 HTTP 요청을 볼 수 있습니다. 다음 사항에 주의하십시오.
- 요청 라인 (예:
GET /some/test/file.html HTTP/1.1). - 대상 서버를 가리키는
Host헤더. - 클라이언트를
Nikto로 식별하는User-Agent헤더.
- 요청 라인 (예:
- Response Tab: 이 탭은 서버의 전체 응답을 보여줍니다. HTTP 상태 코드 (예:
200 OK또는404 Not Found), 응답 헤더 및 응답 본문을 볼 수 있습니다.
몇 분 동안 다른 요청을 클릭해 보세요. Nikto 가 일반적인 관리 디렉토리 (예: /admin/) 에 액세스하려고 시도하고, 백업 파일 (예: /index.html.bak) 을 확인하고, 기타 표준 검사를 수행하는 것을 볼 수 있습니다. 이 트래픽을 관찰함으로써 취약점 스캐너가 어떻게 작동하는지에 대한 깊은 이해를 얻을 수 있습니다.
프록시가 스캔 결과에 미치는 영향 분석
이 단계에서는 프록시 사용이 스캔에 잠재적으로 어떤 영향을 미치는지 분석합니다. 이를 위해 비교 기준이 필요합니다. 동일한 Nikto 스캔을 다시 실행하지만 이번에는 프록시 없이 실행합니다.
3 단계와 동일한 스캔 명령을 실행하지만 -useproxy 옵션은 생략합니다.
nikto -h 127.0.0.1 -p 8000 -Tuning 1
터미널에서 출력을 관찰합니다. 이제 이 스캔 결과와 3 단계의 프록시 스캔 결과를 비교합니다. 방화벽이나 기타 보안 시스템이 없는 간단한 랩 환경에서는 결과가 동일해야 합니다.
그렇다면 프록시의 목적은 무엇일까요?
- 가시성 (디버깅): 이전 단계에서 보았듯이 주요 이점은 가시성입니다. 스캔이 실패하거나 예상치 못한 결과를 생성하는 경우, 문제가 무엇인지 이해하기 위해 프록시를 가장 먼저 확인해야 합니다. 문제 해결에 필수적인 원시 요청 및 응답을 볼 수 있습니다.
- 성능: 프록시는 네트워크 트래픽에 추가적인 "홉"을 추가하여 약간의 지연 시간을 유발할 수 있습니다. 매우 큰 스캔의 경우 총 스캔 시간이 약간 늘어날 수 있습니다.
- 수정 (고급): 고급 프록시는 트래픽을 수정하도록 구성할 수 있습니다. 예를 들어,
User-Agent를 "Nikto"에서 일반 브라우저 문자열로 자동 변경하는 규칙을 설정할 수 있습니다. 이는 Nikto 사용자 에이전트를 기반으로 요청을 차단하는 간단한 웹 애플리케이션 방화벽 (WAF) 을 우회하는 데 사용될 수 있습니다. 이 랩에서는 수정을 수행하지 않지만, 이 기능에 대한 이해는 중요합니다.
요약하자면, 이 랩에서 프록시의 주요 효과는 스캔 프로세스에 대한 "중간자" 보기를 제공하는 것이었으며, 이는 보안 테스트의 기본 기술입니다.
요약
이 랩에서는 Nikto 를 사용하여 웹 취약점 스캔을 수행하는 동안 프록시를 활용하는 방법을 성공적으로 배웠습니다.
먼저 대상으로서 간단한 Python 웹 서버와 중간 프록시로서 mitmproxy를 포함하여 필요한 환경을 설정했습니다. 그런 다음 Nikto 의 -useproxy 명령줄 옵션을 사용하여 모든 스캔 트래픽을 프록시를 통해 라우팅하는 방법을 배웠습니다.
스캔을 실행하고 mitmweb 인터페이스에서 트래픽을 관찰함으로써 Nikto 가 보내는 요청 유형과 수신하는 응답에 대한 직접적인 통찰력을 얻었습니다. 마지막으로 프록시 없이 비교 스캔을 실행하여 프록시가 스캔에 어떻게 영향을 미칠 수 있는지 분석했으며, 이 맥락에서 프록시의 주요 역할은 분석 및 디버깅을 위한 중요한 가시성을 제공하는 것이라고 결론지었습니다. 이는 보안 전문가가 테스트 도구를 더 잘 이해하고 제어하기 위해 사용하는 기본적인 기술입니다.


