====== Раскрытие внутреннего адреса CVE-2000-0649 ======
Описание уязвимости
* https://www.cvedetails.com/cve/CVE-2000-0649/
* https://www.securityfocus.com/bid/1499/info
* https://blog.qualys.com/product-tech/2018/01/08/pci-dss-v3-2-private-ip-address-disclosure
Что по этому поводу говорят в https://www.pcisecuritystandards.org/
{{:security:pci_dss_1.3.7.png?nolink|}}
[[https://www.youtube.com/watch?v=4W_SGDfw3UY|PCI DSS Requirement 1.3.7 на Youtube]]
TL;DR раскрытие внутренней адресации в вашей айти системе довольно опасно.
Нормальный ответ сервера выглядит так
HTTP/1.1 302 Moved Temporarily
...
Location: https://foobar.com/amazing/
Ответ сервера с раскрытием внутреннего адреса
HTTP/1.1 302 Moved Temporarily
...
Location: https://10.10.13.37/foobar/
Я скопировал для наглядности примеры request/response из статьи на [[https://www.linkedin.com/pulse/internal-ip-host-name-disclosure-server-redirects-utkarsh-tiwari|LinkedIn]]. Он всё ещё заблокирован на территории РФ, что несомненно сильно подрывает веру в адекватность людей причастных к законотворчеству.
Нормальный запрос
{{:security:cve-2000-0649_good_response.jpg?nolink|}}
Здесь мы видим внутренний IP
{{:security:cve-2000-0649_bad_response.jpg?nolink|}}
===== Как проверить =====
Проверка через curl
curl -v -I --http1.0 http[s]://foobar.com/index.php -k -H 'Host:'
Проверка через openssl
openssl s_client -host foobar.com -port 443
GET / HTTP/1.0
Проверка через telnet
telnet foobar.com 443
GET / HTTP/1.0
Проверка через nmap ([[https://nmap.org/nsedoc/scripts/http-internal-ip-disclosure.html|http-internal-ip-disclosure]])
nmap --script http-internal-ip-disclosure foobar.com
Проверка с помощью [[https://github.com/rafaelh/CVE-2000-0649|скрипта на python]] (см. ниже)
++++ Показать/Скрыть |
#!/usr/bin/env python3
# Written by Rafe Hart (@rafael_hart)
""" Test an IP address (port 443) for CVE-2000-0649 """
import ssl
import socket
import re
import sys
def main():
if len(sys.argv) == 1:
print("\nUsage: cve-2000-0643.py or \n")
sys.exit(1)
target = sys.argv[1]
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((target, 443))
s = ssl.wrap_socket(s, keyfile=None, certfile=None, server_side=False, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_SSLv23)
s.sendall(b'GET / HTTP/1.0\r\n\r\nConnection: close\r\n\r\n')
except socket.error as exc:
print("Did't work: %s" % exc)
while True:
new = s.recv(4096)
if not new:
s.close()
break
try:
response = new.decode()
pattern = re.compile(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')
if pattern.search(response):
print(target, "->", pattern.search(response).group())
except:
sys.exit(1)
if __name__ == '__main__':
main()
++++
===== Как исправить в nginx =====
[[http://nginx.org/ru/docs/http/ngx_http_core_module.html#server_name_in_redirect|Модуль ngx_http_core_module / server_name_in_redirect]]
Установить
server_name_in_redirect on
EOM
{{tag>linux debian безопасность pci_dss cve nginx}}