Bom dia
Depois de terminar de escrever outro script no Bash, percebi que tudo deveria ser completamente diferente, mas tudo funcionou. Quero mostrar-lhe que palavrões e muletas que escrevi para resolver o problema, mas até agora sem um carro de conhecimento. Em outras palavras, uma caricatura de programação.
Desafio
Algo se tornou necessário para:
- Imprimiu muitas rimas para uma palavra, exceto quadrados
- Cruzou muitas rimas de duas palavras
Para que? Bem, aqui está - e é isso.
Quem não sabe, uma rima quadrada (na linguagem comum - um quadrado) são duas palavras que têm as duas últimas letras na ortografia, as quais (geralmente apenas isso) as tornam uma rima. Por exemplo, rosas - geada; o pneu é um carro. O uso de quadrados na versificação moderna não é particularmente aprovado pelas pessoas, devido à sua primitividade.
Solução
A solução mais simples pareceu-me escrever um script no Bash, usando o gerador de rima já existente - HOST, que antes de tudo os seleciona de acordo com as harmonias, e não com a ortografia. O que é um HOST? Porque se você especificar o nome real do site - eles dirão que a publicidade. Por que não continuar usando? Em primeiro lugar, apesar de sua vantagem na seleção de rimas de acordo com as harmonias, geralmente produz quadrados. Em segundo lugar, você ainda tem que pensar com o cérebro, passar um tempo alternando entre guias, o esforço para lembrar de repetir palavras nas listas para encontrar rimas para duas palavras.
Obtendo rimas fortes
O que eu sei? Eu sei sobre o utilitário
wget , que baixa a página no URL especificado. Bem, atendemos à solicitação - obtemos a página HTML no arquivo, que é chamada de palavra para rima. Por exemplo, procure a palavra "aqui":
wget https://HOST/rifma/
Mas eu só preciso de uma lista de palavras, como me livrar de todo o resto? Observamos e vemos que a lista de palavras está organizada, por mais estranha que seja, na forma de uma lista, e as palavras estão nas tags <li> </li>. Bem, temos um maravilhoso utilitário
sed - e escreva-o:
cat $word | grep '<li>' | sed -e "s%<li>%%" | sed -e "s%</li>%%" | sed -e "s/ //g" | sed -e "/^$/d" 1> $word
Primeiro, no arquivo de
palavras , selecione as linhas que contêm a tag <li> - obtemos várias tags e linhas vazias com palavras. Removemos a própria tag e a sua fechando - aqui os símbolos de porcentagem são usados em vez de barras porque a tag </li> já possui uma barra, e é por isso que
sed não o entende um pouco. E com interesse, está tudo bem. Removemos todos os espaços do arquivo, excluímos linhas vazias. Voila - uma lista completa de palavras.
Para remover palavras que rimam devido às últimas letras, selecione as duas últimas letras da palavra original e limpe a lista:
squad=${word:((${#word}-2)):2} cat $word | sed -e "/.$squad$/d" 1> $word
Olhamos, tentamos - tudo funciona ... então, mas onde está a lista da palavra "brincar"? E para a palavra "eu vou"? O arquivo está vazio! E isso é tudo porque essas palavras são verbos, e sabemos o que eles fazem com aqueles que rimam em verbos. O verbo rima é ainda pior que o quadrado, para a maioria dos verbos no idioma russo, e até todos com os mesmos finais, e é por isso que eles não apareceram no arquivo final depois de verificar os finais.
No entanto, não com pressa. Para cada palavra, existem não apenas rimas, mas também assonâncias, que às vezes soam muito melhores do que rimas - pois também são assonâncias (assonância francesa, do latim assono - eu pareço bom).
Obter Assonâncias
Aqui começa a diversão: as assonâncias aparecem em um URL separado e na mesma página, executando um script, enviando uma solicitação HTTP e recebendo uma resposta. Como dizer ao
wget 'para clicar em um botão? Mas de qualquer maneira. Isso é triste
Percebendo que o URL na string ainda está mudando de alguma forma, copiei o que havia depois de mudar para assonâncias e colei em uma nova guia do navegador - rimas fortes foram abertas. Não é isso.
Na verdade, pensei, o servidor não deveria se importar se o script que envia a solicitação é executado ou se a pessoa digita manualmente. Então E quem sabe, vamos conferir.
Para onde enviar? O que enviar? Uma solicitação HTTP para o IP do servidor, existe algo como GET ... então existe algo HTTP / 1.1 ... Precisamos ver o que e para onde o navegador envia. Instale o
wireshark , veja o tráfego:
0040 37 5d a3 84 27 e7 fb 13 6d 93 ed cd 56 04 9d 82 7]£.'çû.m.íÍV...
0050 32 7c fb 67 46 71 dd 36 4d 42 3d f3 62 1b e0 ad 2|ûgFqÝ6MB=ób.à.
0060 ef 87 be 05 6a f9 e1 01 41 fc 25 5b c0 77 d3 94 ï.¾.jùá.Aü%[ÀwÓ.
Hum ... o que? Ah, sim, nós temos HTTPS. O que fazer Organizar um ataque MITM em si mesmo? Idealmente, a própria vítima nos ajudará.
Em geral, pensando em subir no navegador, eu ainda encontrei a solicitação em si e o destinatário. Vamos lá:
Diálogo com o terminal telnet IP PORT Trying IP... Connected to IP. Escape character is '^]'. GET /rifma/%D0%BC%D0%B0%D1%82%D1%8C?mode=block&type=asn HTTP/1.1 Host: HOST Accept-Language: en-US,en;q=0.5 X-Requested-With: XMLHttpRequest Connection: close HTTP/1.1 400 Bad Request Server: nginx/1.8.0 Date: Sun, 03 Nov 2019 20:06:59 GMT Content-Type: text/html; charset=utf-8 Content-Length: 270 Connection: close <html> <head><title>400 The plain HTTP request was sent to HTTPS port</title></head> <body bgcolor="white"> <center><h1>400 Bad Request</h1></center> <center>The plain HTTP request was sent to HTTPS port</center> <hr><center>nginx/1.8.0</center> </body> </html> Connection closed by foreign host.
Huh. Ei, ei. Na verdade, o que eu esperava enviando uma solicitação HTTP simples para uma porta HTTPS. Está criptografado agora? Todo esse barulho com as chaves RSA e depois com o SHA256. E por que, existe o
OpenSSL para tais assuntos. Bem, já sabemos o que fazer, basta remover os campos Referer e Cookie - acho que eles não afetarão muito o assunto:
Diálogo com o terminal openssl s_client -connect IP:PORT { , } GET /rifma/%D0%B7%D0%B4%D0%B5%D1%81%D1%8C?mode=block&type=asn HTTP/1.1 Host: HOST User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0 Accept: text/javascript,text/html,application/xml,text/xml,*/* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br X-Requested-With: XMLHttpRequest Connection: keep-alive HTTP/1.1 200 OK Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding Status: 200 OK Date: Sun, 03 Nov 2019 20:34:33 GMT Set-Cookie: COOKIE X-Powered-By: Phusion Passenger 5.0.16 Server: nginx/1.8.0 + Phusion Passenger 5.0.16 Expires: Thu, 01 Jan 1970 00:00:01 GMT Cache-Control: no-cache Strict-Transport-Security: max-age=31536000 Content-Security-Policy: block-all-mixed-content Content-Encoding: gzip

Este é um xeque-mate no servidor? Bem, pelo menos 200 OK me responderam, o que significa que cookies e referenciadores não afetam nada. Compactação Gzip, mas caracteres ASCII são copiados ao copiar. Da mesma forma, você pode remover a
linha de codificação Accept . Está tudo bem - temos um documento HTML, agora com assonâncias. Mas aqui estão duas perguntas: como executar o OpenSSL e passar dados para ele com um script? E como ler a saída, se depois de receber a resposta permanecermos como se estivesse no "shell" do OpenSSL? Se você pode pensar em algo com o segundo, mas com o primeiro ...
É bom que exista um
Habr , onde li sobre o utilitário
expect , que automatiza o processo de interação com programas que aguardam interação humana. Ainda mais atraente é a presença do
comando autoexpect que gera um script de
expectativa para suas ações. Bem, corra, faça tudo e aqui está o script finalizado. Só que é muito grande, e tudo porque o
OpenSSL exibe certificados, chaves e
espera esperar exibir tudo isso. Nós precisamos disso? Não. Nós demolimos o primeiro prompt, deixando apenas a última quebra de linha '\ r'. Também removemos os campos User-Agent e Accept de nossa solicitação - eles não afetam nada. Então, vamos começar. O script é executado, mas onde está o documento HTML cobiçado?
Espere comeu. Para fazê-lo cuspir, você precisa colocar:
set results $expect_out(buffer)
antes do final do script - é assim que a saída do
comando expect executado será gravada e exibida. Em resumo, algo como isto:
Mas isso não é tudo! Como você pode ver, em todos os exemplos o URL da solicitação era estático, no entanto, é ele quem é responsável por qual palavra as assonâncias serão exibidas. E, assim, verifica-se que procuraremos constantemente pela palavra "% d0% b7% d0% b4% d0% b5% d1% 81% d1% 8c" em ASCII ou "aqui" em UTF-8. O que fazer Claro, simplesmente sempre que gerar um novo script, amigos! Só não
espere automaticamente ohm, mas com
eco , porque em nosso país, nada muda, exceto a palavra. E viva o novo problema: como, de alguma forma, traduziríamos de forma inteligente uma palavra do cirílico para um formato de URL? Algo para o terminal também não é nada de especial. Bem, nada, podemos? Nós podemos:
Olha o que eu posso! function furl { furl=$(echo "$word" | sed 's::%d0%90:g;s::%d0%91:g;s::%d0%92:g;s::%d0%93:g;s::%d0%94:g;s::%d0%95:g;s::%d0%96:g;s::%d0%97:g;s::%d0%98:g;s::%d0%99:g;s::%d0%9a:g;s::%d0%9b:g;s::%d0%9c:g;s::%d0%9d:g;s::%d0%9e:g;s::%d0%9f:g;s::%d0%a0:g;s::%d0%a1:g;s::%d0%a2:g;s::%d0%a3:g;s::%d0%a4:g;s::%d0%a5:g;s::%d0%a6:g;s::%d0%a7:g;s::%d0%a8:g;s::%d0%a9:g;s::%d0%aa:g;s::%d0%ab:g;s::%d0%ac:g;s::%d0%ad:g;s::%d0%ae:g;s::%d0%af:g;s::%d0%b0:g;s::%d0%b1:g;s::%d0%b2:g;s::%d0%b3:g;s::%d0%b4:g;s::%d0%b5:g;s::%d0%b6:g;s::%d0%b7:g;s::%d0%b8:g;s::%d0%b9:g;s::%d0%ba:g;s::%d0%bb:g;s::%d0%bc:g;s::%d0%bd:g;s::%d0%be:g;s::%d0%bf:g;s::%d1%80:g;s::%d1%81:g;s::%d1%82:g;s::%d1%83:g;s::%d1%84:g;s::%d1%85:g;s::%d1%86:g;s::%d1%87:g;s::%d1%88:g;s::%d1%89:g;s::%d1%8a:g;s::%d1%8b:g;s::%d1%8c:g;s::%d1%8d:g;s::%d1%8e:g;s::%d1%8f:g;s::%d1%91:g;s::%d0%81:g')}
No total, temos um script que converte a palavra em texto ASCII, gerando outro script que solicita através da página do servidor OpenSSL do site com as assonâncias. E então redirecionamos a saída do último script para o arquivo e, à moda antiga, passamos pelos
"filtros" dos excessos, quadrados e os adicionamos ao arquivo.
Interseção de conjuntos. Sumário
Na verdade, é exatamente isso que causa menos problemas. Executamos os procedimentos acima para duas palavras e, em duas listas, comparamos cada palavra com cada uma e, se uma correspondência for encontrada, a exibimos. Agora, temos um script que leva duas palavras para a entrada e exibe uma lista de palavras que rimam com ambas, levando em consideração as assonâncias, e tudo isso sem alternar manualmente entre as quatro guias e lembrar as palavras "a olho" - isso é tudo coletados, gravados e descartados automaticamente. Ótimo.
O objetivo desta publicação era mostrar que, se uma pessoa precisa de algo, ela o fará de qualquer maneira. Muito ineficiente, torto, assustador, mas isso vai funcionar.