Eu recomendaria wget
ou curl
, você pode ter um ou ambos já disponíveis:
wget --secure-protocol=SSLv3 https://zmap.io/
curl --sslv3 https://zmap.io/
ou de outra forma socat
:
socat stdio openssl-connect:zmap.io:443,method=sslv3
socat
requer libssl e libcrypto do OpenSSL para suporte SSL, wget
e curl
requerem OpenSSL ou GnuTLS. zmap.io é um site relacionado à segurança que possui o SSLv3 desativado,
Caso contrário, em uma pitada você pode fazer isso com bash
(e uma pequena suspensão de descrença).
Tome um mínimo de "cliente hello" do SSlv3 e grave-o em binário em um arquivo:
( echo 16 03 00 00 49
echo 01 00 00 45 03 00 54 46 2c 8b a0 70 ac c5 9f 96
echo 60 b9 d0 97 af a5 95 c4 41 3b fa 49 dc cd eb 63
echo df df cf 66 95 29 00 00 1e 00 39 00 38 00 35 00
echo 16 00 13 00 0a 00 33 00 32 00 2f 00 05 00 04 00
echo 15 00 12 00 09 00 ff 01 00 ) | xxd -r -p > ssl3.bin
Então é tão simples (!) quanto:
$ exec 4<> /dev/tcp/zmap.io/443
$ cat ssl3.bin >&4
$ hexdump -C <&4
00000000 15 03 00 00 02 02 28 |......(|
Os bytes importantes aqui são os principais 0x15 (registro de alerta SSL) e 0x28, falha de handshake. Se a conexão funcionou, você deve retornar um primeiro byte de 0x16 (registro SSL Handshake) e um grande pedaço contendo um certificado, e mais. Você pode usar qualquer nome de host ou endereço IP aqui, por exemplo, /dev/tcp/hostname/port/
.
Você pode criar seu próprio handshake usando o seguinte método de outra máquina com s_client
do OpenSSL.
echo Q | openssl s_client -ssl3 -msg -debug -cipher 'DEFAULT:!EXPORT' \
-connect www.google.com:443 >debug.log
O principal requisito é que você use connect
para um host que aceitará uma conexão. Não há SNI aqui, então a carga que capturamos pode ser usada para testar qualquer servidor (embora um servidor possa rejeitar a conexão se o SNI estrito foi imposto, o SNI não está definido para SSlv3).
$ head -15 debug.log
CONNECTED(00000003)
write to 0x80c6ed0 [0x80d0c88] (78 bytes => 78 (0x4E))
0000 - 16 03 00 00 49 01 00 00-45 03 00 54 46 2c 8b a0 ....I...E..TF,..
[...]
>>> SSL 3.0 Handshake [length 0049], ClientHello
01 00 00 45 03 00 54 46 2c 8b a0 70 ac c5 9f 96
60 b9 d0 97 af a5 95 c4 41 3b fa 49 dc cd eb 63
df df cf 66 95 29 00 00 1e 00 39 00 38 00 35 00
16 00 13 00 0a 00 33 00 32 00 2f 00 05 00 04 00
15 00 12 00 09 00 ff 01 00
read from 0x80c6ed0 [0x80cc478] (5 bytes => 5 (0x5))
(A saída com -msg
em vez de -debug
é mais limpa, mas omite o byte de 5 bytes do registro SSL e -debug
inutilmente corta os 0 bytes finais, portanto, precisamos usar os dois.)
Pegue os 5 bytes iniciais do hex na linha começando com 0000 (este é o cabeçalho do registro SSL que o próximo bloco hex omite), e então pegue o inteiro hex após a linha "SSL 3.0 Handshake", e converta o lote para um arquivo binário usando xxd
como acima.
A única variável aqui é que os 4 bytes iniciais do random (octetos 11-14 do registro) serão o timestamp do cliente. Isso pode ser detectado por um servidor suficientemente paranoico, mas no SSLv3 o relógio do cliente não precisa estar correto (nem mesmo nas versões até e incluindo o TLS 1.2).
Você pode ler mais sobre formato de registro SSL aqui e aqui para o cifras registradas .