Проблема:
Я не могу перехватить HTTPS-трафик для некоторых веб-сайтов, использующих OWASP ZAP.
У меня есть разрешение от операторов сайтов, о которых идет речь, на «очистку» этих сайтов с целью загрузки данных с порталов заказа и обмена информацией.
Для целей разработки / отладки я ранее использовал OWASP ZAP в качестве прокси-сервера отладки, но я подозреваю, что обновления TLS на этих сайтах мешают мне сделать это сейчас.
Пример URL:
Примером URL-адреса HTTPS, который я ранее мог загрузить через ZAP, но больше не могу загрузить, является клиентский портал NBN Co.
(Это не предназначено для широкой публики, но вам не нужно входить в систему, чтобы воспроизвести проблему, поэтому я чувствую себя нормально, сообщая об этом здесь.)
Чтобы было ясно, мой очищающий код все еще может нормально подключаться к сайтам, но браузер (такой как firefox) через OWASP ZAP не может этого сделать.
Сообщение об ошибке:
ZAP Error [javax.net.ssl.SSLException]: Received fatal alert: close_notify
Stack Trace:
javax.net.ssl.SSLException: Received fatal alert: close_notify
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2011)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1113)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375)
at org.parosproxy.paros.network.SSLConnector.createSocket(Unknown Source)
at org.apache.commons.httpclient.HttpConnection.open(Unknown Source)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(Unknown Source)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(Unknown Source)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.parosproxy.paros.network.HttpSender.executeMethod(Unknown Source)
at org.parosproxy.paros.network.HttpSender.runMethod(Unknown Source)
at org.parosproxy.paros.network.HttpSender.send(Unknown Source)
at org.parosproxy.paros.network.HttpSender.sendAuthenticated(Unknown Source)
at org.parosproxy.paros.network.HttpSender.sendAndReceive(Unknown Source)
at org.parosproxy.paros.network.HttpSender.sendAndReceive(Unknown Source)
at org.parosproxy.paros.core.proxy.ProxyThread.processHttp(Unknown Source)
at org.parosproxy.paros.core.proxy.ProxyThread.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Ошибка для примера сайта, который я привел выше, упоминается в нескольких местах в Интернете и проявляется как ответ 502 Bad Gateway
с веб-сайта, но возвращается как ответ 200 Ok
текстового / простого текста от ZAP в браузер. Однако в самом сообщении упоминается ZAP, так что это явно не тот сайт, который генерирует 502.
При поиске ошибки в большинстве статей предлагается настроить протоколы и шифры Java или ZAP TLS и / или обновить Java или OWAZP ZAP.
На некоторых других сайтах мне ранее удавалось настроить параметры прокси-сервера TLS для прокси-настройки некоторых более современных конфигураций сайта TLS (например: в ZAP: отключить старые протоколы через Tools
> Option
> Local proxy
)
Мне не повезло с моим примером сайта выше.
Действия по воспроизведению:
- Создать и запустить новый пустой профиль Firefox
firefox --no-remote -ProfileManager
Создайте новый пустой профиль с именем "proxy", повторно выберите профиль по умолчанию (для следующего запуска) и затем выйдите.
firefox --no-remote -P proxy &
- Установите последнюю версию OWASP ZAP с Java 8
Я буду использовать Docker, чтобы помочь в воспроизведении проблемы.
Dockerfile:
FROM java:8
ENV ZAP_VERSION 2.5.0
RUN apt-get update && apt-get clean
RUN apt-get install -q -y wget && apt-get clean
RUN mkdir /zap
RUN cd /zap && wget https://github.com/zaproxy/zaproxy/releases/download/${ZAP_VERSION}/ZAP_${ZAP_VERSION}_Linux.tar.gz
RUN cd /zap && tar zxvf ZAP_${ZAP_VERSION}_Linux.tar.gz
RUN apt-get install -q -y sudo xauth libxrender1 libxtst6 libxi6 net-tools less && apt-get clean
RUN export uid=1000 gid=1000 && \
mkdir -p /home/developer && \
echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
echo "developer:x:${uid}:" >> /etc/group && \
echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
chmod 0440 /etc/sudoers.d/developer && \
chown ${uid}:${gid} -R /home/developer && \
chown -R 1000 /home/developer/ && \
chmod -R u+rw /home/developer/
USER developer
ENV JAVA_HOME /opt/java
ENV PATH $JAVA_HOME/bin:/zap/ZAP_${ZAP_VERSION}/:$PATH
ENV HOME /home/developer
EXPOSE 8080
CMD /zap/ZAP_${ZAP_VERSION}/zap.sh -host 0.0.0.0 -port 8080 -newsession `date --iso-8601=s`
Построить как:
docker build -t zaproxy:2.5.0 .
Беги как:
mkdir -p $HOME/.ZAP
docker run \
--rm \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/.ZAP:/home/developer/.ZAP \
-p 8080:8080 \
zaproxy:2.5.0 &
- Создать и сохранить OWASP корневой CA
В zaproxy Tools
> Options
> Dynamic SSL Certificates
Generate
(если он еще не создан), скопировать в текстовый файл, доступный для Firefox.
- Установите сохраненный корневой CA OWASP в Firefox
Preferences
> Advanced
> Cerfificates
> View Certificates
> Authorities
Import
> Выберите сохраненный сертификат> Open
- Прокси все сетевые протоколы Firefox через OWASP ZAP
Preferences
> Advanced
> Network
> Settings
> Manual proxy configuration
Настроить как:
HTTP Proxy
: 127.0.0.1Port
: 8080Use this proxy server for all protocols
Затем нажмите Ok
- Посетите
https://google.com
чтобы проверить, что прокси работает
Вы должны увидеть перехваченные HTTPS-запросы в нижней панели OWASP ZAP.
- Посетите неработающий URL, чтобы продемонстрировать ошибку.