Изменение идентификации браузера

Противодействие хакерским угрозам

Модераторы: Olej, adminn, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 18 ноя 2019, 16:21

Olej писал(а):
18 ноя 2019, 15:09
Утверждается, что такое простейшее Java приложение указывает идентификацию:

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ cat ua.java 
import java.io.*;
import java.net.*;

public class ua {
   public static String getHTML( String urlToRead ) throws Exception {
      StringBuilder result = new StringBuilder();
      URL url = new URL( urlToRead );
      HttpURLConnection conn = (HttpURLConnection)url.openConnection();
      conn.setRequestMethod( "GET" );
      BufferedReader rd = new BufferedReader( new InputStreamReader( conn.getInputStream() ) );
      String line;
      while( ( line = rd.readLine() ) != null ) {
         result.append( line );
      }
      rd.close();
      return result.toString();
   }

   public static void main( String[] args ) throws Exception {
      System.out.println( getHTML( args[ 0 ] ) );
   }
}

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ javac ua.java

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ java ua https://httpbin.org/get
{  "args": {},   "headers": {    "Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2",     "Host": "httpbin.org",     "User-Agent": "Java/11.0.5"  },   "origin": "193.28.177.125, 193.28.177.125",   "url": "https://httpbin.org/get"}

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ java --version
openjdk 11.0.5 2019-10-15
OpenJDK Runtime Environment (build 11.0.5+10-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Debian-1deb10u1, mixed mode, sharing)
Вложения
ua.java
(706 байт) 98 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 18 ноя 2019, 16:40

Olej писал(а):
18 ноя 2019, 15:09
Утверждается, что такое простейшее Java приложение указывает идентификацию:
Теперь что там с Python:

Код: Выделить всё

olej@ACER:~$ python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> response = requests.get('https://httpbin.org/get')
>>> print(response.content)
b'{\n  "args": {}, \n  "headers": {\n    "Accept": "*/*", \n    "Accept-Encoding": "gzip, deflate", \n    "Host": "httpbin.org", \n    "User-Agent": "python-requests/2.21.0"\n  }, \n  "origin": "193.28.177.125, 193.28.177.125", \n  "url": "https://httpbin.org/get"\n}\n'
>>> response.json()
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.21.0'}, 'origin': '193.28.177.125, 193.28.177.125', 'url': 'https://httpbin.org/get'}
>>> response.headers
{'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json', 'Date': 'Mon, 18 Nov 2019 12:54:24 GMT', 'Referrer-Policy': 'no-referrer-when-downgrade', 'Server': 'nginx', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'Content-Length': '185', 'Connection': 'keep-alive'}
>>> response.json()
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.21.0'}, 'origin': '193.28.177.125, 193.28.177.125', 'url': 'https://httpbin.org/get'}
>>> response.json().get('headers')
{'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.21.0'}
>>> response.json().get('headers').get('User-Agent')
'python-requests/2.21.0'
Здесь User-Agent - это python-requests/2.21.0
2.21.0 - это версия как-раз установленного модуля requests:

Код: Выделить всё

olej@ACER:~$ pip3 list | grep requests
requests                2.21.0     
Или то же самое, но используя стандартный модуль Python:

Код: Выделить всё

>>> import urllib.request
>>> response = urllib.request.urlopen( 'https://httpbin.org/get' )
>>> print( response.getcode() )
200
>>> print( response.read() )
b'{\n  "args": {}, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Host": "httpbin.org", \n    "User-Agent": "Python-urllib/3.7"\n  }, \n  "origin": "193.28.177.125, 193.28.177.125", \n  "url": "https://httpbin.org/get"\n}\n'
Как легко видеть, здесь User-Agent - это Python-urllib/3.7 ... что радикально отличается от предыдущего случая.

Код: Выделить всё

olej@ACER:~$ python3 --version
Python 3.7.3

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 18 ноя 2019, 16:56

Olej писал(а):
18 ноя 2019, 15:09
Утверждается, что такое простейшее Java приложение указывает идентификацию:
Теперь язык Go...

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ cat ua.go
package main
import (
    "fmt"
    "net/http"
    "io"
    "os"
)
func main() { 
   client := http.Client{} 
   resp, err := client.Get( "https://httpbin.org/get" ) 
   if err != nil { 
         fmt.Println( err ) 
         return
   } 
   defer resp.Body.Close() 
   io.Copy( os.Stdout, resp.Body )
}
Компилятор GoLang:

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ go build ua.go 

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ./ua
{
  "args": {}, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/1.1"
  }, 
  "origin": "193.28.177.125, 193.28.177.125", 
  "url": "https://httpbin.org/get"
}

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ls -l ua
-rwxr-xr-x 1 olej olej 6143867 ноя 18 15:46 ua

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ldd ua
	linux-vdso.so.1 (0x00007ffc9f77d000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdd70ab0000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd708ef000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fdd70b09000)
Компилятор GCC Go:

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ gccgo ua.go -o ua.gcc

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ./ua.gcc 
{
  "args": {}, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/1.1"
  }, 
  "origin": "193.28.177.125, 193.28.177.125", 
  "url": "https://httpbin.org/get"
}

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ls -l ua.gcc
-rwxr-xr-x 1 olej olej 51800 ноя 18 15:48 ua.gcc

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ldd ua.gcc
	linux-vdso.so.1 (0x00007ffe1cf18000)
	libgo.so.13 => /lib/x86_64-linux-gnu/libgo.so.13 (0x00007f67a27f2000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f67a266f000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f67a2655000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f67a2494000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f67a4039000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f67a2276000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f67a2255000)
Вложения
ua.go
(304 байт) 103 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 18 ноя 2019, 22:14

Olej писал(а):
18 ноя 2019, 16:21

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ java ua https://httpbin.org/get
{  "args": {},   "headers": {    "Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2",     "Host": "httpbin.org",     "User-Agent": "Java/11.0.5"  },   "origin": "193.28.177.125, 193.28.177.125",   "url": "https://httpbin.org/get"}
Но вот в точности то же самое в защищённой системе Astra Linux SE:

Код: Выделить всё

olej@astra:~/WORK/java$ java ua https://httpbin.org/get
Exception in thread "main" javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1964)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1921)
        at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1904)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1420)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
        at ua.getHTML(ua.java:10)
        at ua.main(ua.java:20)
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:91)
        at sun.security.validator.Validator.getInstance(Validator.java:181)
        at sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:312)
        at sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(X509TrustManagerImpl.java:171)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:184)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1615)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1052)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:987)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
        ... 8 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)
        at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:120)
        at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:104)
        at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:89)
        ... 20 more
В чём разница 2-х ОС?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 18 ноя 2019, 22:23

Olej писал(а):
18 ноя 2019, 22:14
Но вот в точности то же самое в защищённой системе Astra Linux SE:
Но! ... всего лишь поменяю URL сервера:

Код: Выделить всё

olej@astra:~/WORK/java$ java ua http://example.org
<!doctype html><html><head>    <title>Example Domain</title>    <meta charset="utf-8" />    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />    <meta name="viewport" content="width=device-width, initial-scale=1" />    <style type="text/css">    body {        background-color: #f0f0f2;        margin: 0;        padding: 0;        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;            }    div {        width: 600px;        margin: 5em auto;        padding: 2em;        background-color: #fdfdff;        border-radius: 0.5em;        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);    }    a:link, a:visited {        color: #38488f;        text-decoration: none;    }    @media (max-width: 700px) {        div {            margin: 0 auto;            width: auto;        }    }    </style>    </head><body><div>    <h1>Example Domain</h1>    <p>This domain is for use in illustrative examples in documents. You may use this    domain in literature without prior coordination or asking for permission.</p>    <p><a href="https://www.iana.org/domains/example">More information...</a></p></div></body></html>
А Exception, как я могу только очень предварительно предположить, возникает на формате ответа от нового URL.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 18 ноя 2019, 22:28

Olej писал(а):
18 ноя 2019, 22:23
Но! ... всего лишь поменяю URL сервера:
Вот оно! То же самое, что в предыдущем сообщении, но сменим в URL протокол: HTTP -> HTTPS

Код: Выделить всё

olej@astra:~/WORK/java$ java ua https://example.org
Exception in thread "main" javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1964)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1921)
        at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1904)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1420)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
        at ua.getHTML(ua.java:10)
        at ua.main(ua.java:20)
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:91)
        at sun.security.validator.Validator.getInstance(Validator.java:181)
        at sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:312)
        at sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(X509TrustManagerImpl.java:171)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:184)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1615)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1052)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:987)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
        ... 8 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
        at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)
        at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:120)
        at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:104)
        at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:89)
        ... 20 more

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 18 ноя 2019, 22:33

Olej писал(а):
18 ноя 2019, 22:28
Вот оно! То же самое, что в предыдущем сообщении, но сменим в URL протокол: HTTP -> HTTPS
Всё это не имеет никакого отношения к идентификации User-Agent (как предполагалось ранее), а имеет отношение к реализации SSLSocket!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 19 ноя 2019, 00:06

Olej писал(а):
18 ноя 2019, 16:40
Теперь что там с Python:
Или так:

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ cat ua.py 
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import urllib.request

response = urllib.request.urlopen( sys.argv[ 1 ] )
dict=eval( response.read() )
print( dict.get( 'headers' ).get( 'User-Agent' ) )

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ./ua.py http://httpbin.org/get
Python-urllib/3.7

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/User-Agent$ ./ua.py https://httpbin.org/get
Python-urllib/3.7
Вложения
ua.py
(162 байт) 97 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 19 ноя 2019, 16:33

Olej писал(а):
18 ноя 2019, 15:09
Интересное замечание о идентификации сетевого клиента из приложения Java: Доступ к внешним ресурсам из java приложения.
Утверждается, что такое простейшее Java приложение указывает идентификацию:
User-Agent имеет вид типа Java [Version]
Идентификацию User-Agent действительно устанавливается так ... что мы и видели выше на тестах.
Olej писал(а):
18 ноя 2019, 15:09
И это может создавать проблемы с сетевым доступом!
Но вот описываемые автором публикации эффекты - не наблюдаются, это дезинформация.

Тем не менее, эти разборки указались уместными, чтобы разобраться как различные сетевые клиенты могут устанавливать свою идентификацию.
И какие конкретные значения User-Agent устанавливают приложения на тех или иных языках программирования.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Изменение идентификации браузера

Непрочитанное сообщение Olej » 20 ноя 2019, 15:17

И по этому URL: https://httpbin.org/get вы можете контролировать "в обратку" те заголовки, которые ваш код отсылает в GET запросе. Можете тот же URL посмотреть в браузере и наблюдать что-то типа:

Код: Выделить всё

{
  "args": {}, 
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7", 
    "Dnt": "1", 
    "Host": "httpbin.org", 
    "Sec-Fetch-Mode": "navigate", 
    "Sec-Fetch-Site": "none", 
    "Sec-Fetch-User": "?1", 
    "Upgrade-Insecure-Requests": "1", 
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36 OPR/65.0.3467.42"
  }, 
  "origin": "193.28.177.125, 193.28.177.125", 
  "url": "https://httpbin.org/get"
}
ua2.png
Или URL в форме https://httpbin.org/user-agent возвратит нам именно интересующее значение User-Agent, переданное в запросе к серверу:

Код: Выделить всё

{
  "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36 OPR/65.0.3467.42"
}

Ответить

Вернуться в «Безопасность»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей