자동 펜 테스트를 위해 ZAP CLI 사용

이전 글에서는 Zed 공격 에이전트(ZAP)를 통해 자동 침투 테스트를 수행하는 법을 배웠습니다.이번에는 CI/CD 파이핑에 테스트를 추가할 수 있도록 명령줄 인터페이스(CLI)를 통해 테스트를 수행하는 방법을 학습합니다.

1. 머리말


previous post에서 자동 침투 테스트를 어떻게 집행하는지 서로 다른 절차를 설명했다.테스트 중인 응용 프로그램은 WebGoat입니다. 이것은 OWASP에서 개발한 공격받기 쉬운 응용 프로그램으로 보안 빈틈을 파악하는 데 사용됩니다.이 프로그램도 본문에 사용될 것입니다.ZAP를 사용하여 침투 테스트를 수행하려면 다음과 같이 하십시오.
  • 상하문과 세션을 설정한다(특히 응용 프로그램의 일부분이 로그인한 후의 로그인 증빙서류).
  • 응용 프로그램의 모든 부분을 수동으로 탐색하기;
  • 신청 제출;
  • 자동 스캐닝 실행하기;
  • 검사 결과.
  • 자동 스캔은 모든 빈틈을 발견하지 못함을 주의하세요!항상 수동 침투 테스트를 실행해야 한다.그러나 자동 스캔은 프로그램의 안전 상태를 잘 나타낼 수 있다.
    본고에서 사용한 파일은 GitHub 디렉터리zap-cli에서 찾을 수 있습니다.

    2.ZAP CLI


    ZAP에는 ZAP를 제어하는 API가 있습니다.ZAP CLI 도구는 명령줄을 통해 명령을 수행할 수 있도록 API를 포장하는 도구입니다.이 절에서는 기본적으로 이전 글과 같거나 비슷한 동작을 실행할 것입니다. 단, 이번에는 ZAP 데스크톱을 사용하지 않을 것입니다.ZAP CLI 명령의 전체 목록은 GitHub 웹 사이트에서 찾을 수 있습니다.

    2.1 설치 및 준비


    먼저 ZAP를 설치해야 합니다.ZAP 옆에는 매우 간단한 ZAP CLI를 설치해야 합니다.다음 명령만 실행하면 됩니다.
    $ pip install --upgrade zapcli
    
    계속하기 전에 다음 환경 변수를 설정하는 것이 중요합니다.
    export ZAP_PORT=8090
    export ZAP_PATH=/usr/local/bin/zap.sh
    export ZAP_API_KEY=<your API key>
    
    ZAP API 키는 ZAP Desktop에서 찾을 수 있습니다.따라서 ZAP Desktop을 시작하고 메뉴에서 도구 - 옵션을 선택합니다.API 섹션에는 환경 변수에 사용해야 하는 API 키가 표시되지만 다음 섹션에서 환경 변수를 설정하기 전에 환경 변수를 설정하지 마십시오.키 사용을 비활성화할 수도 있지만 권장하지 않습니다.

    먼저 계속하기 전에 ZAP 바탕 화면 도구를 닫습니다.ZAP를 시작하려고 하면 어떻게 되는지 살펴보겠습니다.
    $ zap-cli start
    [INFO]            Starting ZAP daemon
    Traceback (most recent call last):
      File "/home/<user>/.local/bin/zap-cli", line 8, in <module>
        sys.exit(cli())
      File "/home/<user>/.local/lib/python3.8/site-packages/click/core.py", line 829, in __call__
        return self.main(*args, **kwargs)
      File "/home/<user>/.local/lib/python3.8/site-packages/click/core.py", line 782, in main
        rv = self.invoke(ctx)
      File "/home/<user>/.local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/home/<user>/.local/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/home/<user>/.local/lib/python3.8/site-packages/click/core.py", line 610, in invoke
        return callback(*args, **kwargs)
      File "/home/<user>/.local/lib/python3.8/site-packages/click/decorators.py", line 33, in new_func
        return f(get_current_context().obj, *args, **kwargs)
      File "/home/<user>/.local/lib/python3.8/site-packages/zapcli/cli.py", line 58, in start_zap_daemon
        zap_helper.start(options=start_options)
      File "/home/<user>/.local/lib/python3.8/site-packages/zapcli/zap_helper.py", line 88, in start
        with open(log_path, 'w+') as log_file:
    PermissionError: [Errno 13] Permission denied: '/usr/local/bin/zap.log'
    
    당신은 편지를 쓸 충분한 권한이 없는 것 같습니다 zap.log.몇 가지 해결 방안이 있지만, 가장 간단한 방법은 로그 경로를 충분한 권한이 있는 디렉터리로 설정하는 것입니다.이 디렉토리로 이동하여 다음 명령을 실행합니다.
    $ zap-cli --log-path . start
    [INFO]            Starting ZAP daemon
    
    ZAP 데몬이 시작된 것 같습니다.검증해 보겠습니다.
    $ zap-cli status
    [INFO]            ZAP is running
    
    됐어, ZAP가 도망갔어.ZAP 데몬을 닫으려면 다음과 같이 하십시오.
    $ zap-cli shutdown
    [INFO]            Shutting down ZAP daemon
    ...
        raise ProxyError(e, request=request)
    requests.exceptions.ProxyError: HTTPConnectionPool(host='127.0.0.1', port=8090): Max retries exceeded with url: http://zap/JSON/core/action/shutdown/?apikey= (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))
    
    왜 이게 효과가 없어요?이 이상은 '에이전트에 연결할 수 없음' 과 '원격에서 연결을 닫으면 응답이 없음' 을 언급했기 때문에 매우 모호합니다.그런데 왜요?정답은 이전 URLhttp://zap/JSON/core/action/shutdown/?apikey=에 표시됩니다.보시다시피 인자 apikey 가 비어 있습니다.인터넷에는 이 예외에 관한 문제가 매우 많지만, 답을 줄 수 있는 사람은 매우 적다.해결책은 ZAP API KEY 환경 변수를 설정하는 것입니다.
    $ export ZAP_API_KEY=<your API key>
    $ zap-cli . shutdown
    [INFO]            Shutting down ZAP daemon
    
    이제 ZAP 데몬을 닫을 수 있습니다.각 API 호출에 대해 API 키를 사용할 필요는 없을 것 같지만 환경 변수를 설정할 때는 걱정할 필요가 없습니다.

    2.2 배경 준비


    상하문과 수동으로 사이트를 방문할 때 사용자 자격 증명을 설정하는 것이 중요하다는 것을 기억하세요.이 문서에서는 이러한 정보를 다시 사용하여 ZAP CLI에 제공합니다.
    파일에서 이전에 저장된 세션 열기 - 세션 열기... 및 파일에서 컨텍스트 내보내기 - 컨텍스트 내보내기... 컨텍스트 및 저장할 경로를 선택하고 저장 버튼을 클릭합니다.

    응용 프로그램의 수동 찾아보기 URL도 세션에 나타납니다.이러한 URL은 ZAP CLI에 필요합니다.http://localhost:8080/의 사이트 섹션을 마우스 오른쪽 버튼으로 클릭하고 선택한 URL을 파일로 내보내기...를 선택하고 파일 이름을 webgoat-exported-urls.txt로 지정합니다.다음 단락에서 이 서류가 필요합니다.
    ZAP 바탕 화면을 닫습니다.

    2.3 검색 시 ZAP CLI 사용


    이제 ZAP CLI를 사용하여 애플리케이션을 검색하기 위해 필요한 모든 준비가 완료되었습니다.에서는 ZAP 데스크톱 스캔과 같은 단계를 수행하지만 이번에는 ZAP CLI를 통해 이전 기사에서 작성한 컨텍스트와 내보낸 URL을 사용합니다.
    계속하기 전에 WebGoat 애플리케이션이 실행 중인지 확인하십시오.그렇지 않으면, 지금은 프로그램을 시작하기에 좋은 시기이다.
    $ docker start goatandwolf
    
    ZAP 데몬을 시작합니다.
    $ zap-cli --log-path . start
    [INFO]            Starting ZAP daemon
    
    컨텍스트를 가져옵니다.파일에 전체 경로가 있는지 확인합니다.
    $ zap-cli -v context import /<path>/Webgoat.context 
    [INFO]            Imported context from /<path>/Webgoat.context
    
    상하문을 열거할 때, 목록이 비어 있는 것 같지만, 그렇지 않습니다. 이름이 올바르게 표시되지 않은 것은 오류일 수 있습니다.
    $ zap-cli context list
    [INFO]            Available contexts: []
    
    다음 단계는 웹 사이트를 탐색하는 것입니다. 이전 부분에서 만든 내보내기 URL 파일을 사용할 것입니다.이 파일의 각 URL을 zap-cli open-url 명령으로 엽니다.이를 위해 다음 내용을 포함하는 bash 스크립트 open-urls.sh 를 만듭니다.
    #!/bin/bash
    input="webgoat-exported-urls.txt"
    while IFS= read -r line
    do
      zap-cli open-url "$line"
    done < "$input"
    
    bash 스크립트에 실행 가능한 권한을 부여합니다.
    $ chmod +x open-urls.sh
    
    bash 스크립트를 실행하려면 텍스트 파일의 URL에 따라 시간이 좀 걸릴 수 있습니다.
    $ ./open-urls.sh
    [INFO]            Accessing URL http://localhost:8080
    [INFO]            Accessing URL http://localhost:8080/WebGoat
    ...
    
    거미를 쫓아내다.상하문과 응용 프로그램에 로그인할 수 있는 사용자mydeveloperplanet가 제공되어 있음을 주의하십시오.
    $ zap-cli -v spider -c Webgoat -u mydeveloperplanet "http://localhost:8080/WebGoat"
    [INFO]            Running spider...
    [DEBUG]           Spidering target http://localhost:8080/WebGoat...
    [DEBUG]           Running spider in context 1 as user 2230
    [DEBUG]           Started spider with ID 0...
    [DEBUG]           Spider progress %: 0
    [DEBUG]           Spider #0 completed
    
    AJAX spider를 실행하지 마십시오.주의해야 할 것은 파라미터--help를 통해 이 명령에 사용할 수 있는 명령 파라미터를 볼 수 있다는 것이다.
    $ zap-cli ajax-spider --help
    Usage: zap-cli ajax-spider [OPTIONS] URL
    
      Run the AJAX Spider against a URL.
    
    Options:
      --help  Show this message and exit.
    
    보시다시피 URL만 매개 변수로 사용할 수 있습니다.데스크톱 버전에서 상하문과 사용자를 제공할 수 있기 때문에 이상하다.그것도 최종 결과에 부정적인 영향을 미칠 것 같다.따라서 AJAX spider를 실행하지 마십시오.
    활성 검색을 시작합니다.시간이 좀 걸립니다. (약 10분에서 15분 정도 걸립니다.)
    $ zap-cli -v active-scan --recursive -c Webgoat -u mydeveloperplanet "http://localhost:8080/WebGoat"
    [INFO]            Running an active scan...
    [DEBUG]           Scanning target http://localhost:8080/WebGoat...
    [DEBUG]           Scanning in context 1 as user 2230
    [DEBUG]           Started scan with ID 0...
    [DEBUG]           Scan progress %: 0
    [DEBUG]           Scan progress %: 1
    [DEBUG]           Scan progress %: 3
    ...
    [DEBUG]           Scan progress %: 97
    [DEBUG]           Scan progress %: 99
    [DEBUG]           Scan #0 completed
    
    보고서를 생성합니다.
    $ zap-cli -v report -o /<path>/report-zap-cli-first-scan.html -f html
    [DEBUG]           Generating HTML report
    [INFO]            Report saved to "/<path>/report-zap-cli-first-scan.html"
    
    세션을 저장합니다.예를 들어, 이렇게 하면 ZAP Desktop에서 열 수 있습니다.
    $ zap-cli -v session save /<path>/webgoat-20210410-active-scan.session
    [DEBUG]           Saving the session to "/<path>/webgoat-20210410-active-scan.session"
    
    ZAP 데몬을 닫습니다.
    $ zap-cli -v shutdown
    [INFO]            Shutting down ZAP daemon
    [DEBUG]           Shutting down ZAP.
    [DEBUG]           ZAP shutdown successfully.
    

    3. 결론


    ZAP CLI 를 사용하면 명령줄을 통해 자동 침투 테스트를 수행할 수 있습니다.CI/CD 파이프에 포함할 수도 있습니다.응용 프로그램의 안전성만 알려주고 완전한 침투 테스트를 대체하지 않습니다.또 주의해야 할 것은 결과가 전 문장의 결과와 결코 같지 않다는 것이다.그러나 ZAP Desktop에서 깨끗한 세션에서 본문의 같은 절차를 시작할 때 결과는 매우 비슷할 것이다.이 같은 차이는 AJAX spider의 실행이나 ZAP Desktop에서 웹 사이트를 수동으로 찾아보기 때문일 수 있습니다.

    좋은 웹페이지 즐겨찾기