¿De qué es capaz el cerebro de un estudiante que aprende sobre el mundo de la informática?

Buen día.

Después de terminar de escribir otro script en Bash, me di cuenta de que todo debería ser completamente diferente, pero todo funcionó. Quiero mostrarles qué obscenidades y muletas escribí para resolver el problema, pero aún no tenía un carro de conocimientos. En otras palabras, una caricatura de la programación.

Tarea


Algo se hizo necesario para:

  • Mostró muchas rimas para la palabra, excepto cuadrados.
  • Cruzó las muchas rimas de dos palabras.

¿Para qué? Bueno, eso es todo, y eso es todo.
Quién no lo sabe, una rima cuadrada (en el lenguaje común, un cuadrado) son dos palabras cuyas dos últimas letras en la ortografía coinciden, lo que (a menudo, esto es lo único) las convierte en rima. Por ejemplo, las rosas son heladas; neumático - coche. El uso de cuadrados en la versificación moderna no es particularmente aprobado por la gente debido a su primitivismo.

Solución


Me pareció que la solución más sencilla era escribir un script en Bash que utiliza un generador de rimas ya existente: HOST, que las selecciona principalmente por consonancia y no por ortografía. ¿Qué tipo de ANFITRIÓN? Porque si indicas el nombre real del sitio dirán que es un anuncio. ¿Por qué no seguir usándolo? En primer lugar, a pesar de su ventaja de seleccionar rimas basadas en consonancias, todavía produce a menudo cuadrados. En segundo lugar, todavía tienes que pensar con tu cerebro, dedicar tiempo a cambiar de pestaña y energía a memorizar palabras repetidas en listas para encontrar una rima para dos palabras.

Obteniendo rimas fuertes

¿Que sé yo? Conozco la utilidad wget, que descarga la página en la URL especificada. Bien, ejecutemos la solicitud: obtenemos una página HTML en un archivo cuyo nombre tiene una palabra que rima. Por ejemplo, busquemos la palabra “aquí”:

wget https://HOST/rifma/здесь

Pero sólo necesito una lista de palabras, ¿cómo puedo deshacerme de todo lo demás? Miramos y vemos que la lista de palabras está formateada, por extraño que parezca, en forma de lista, y las palabras están en etiquetas. . Pues tenemos una gran utilidad. SED - escribámoslo así:

cat $word | grep '<li>' | sed -e "s%<li>%%" | sed -e "s%</li>%%" | sed -e "s/ //g" | sed -e "/^$/d" 1> $word

Primero, desde el archivo de Word, seleccione las líneas que contienen la etiqueta — obtenemos un montón de etiquetas vacías y líneas con palabras. Eliminamos la etiqueta en sí y la de cierre; aquí se usan símbolos de porcentaje en lugar de barras porque en la etiqueta misma ya hay una barra, ¿por qué? SED No te entiende ni un poco. Y todo está bien con intereses. Eliminamos todos los espacios del archivo, eliminamos las líneas vacías. Listo: una lista de palabras ya preparada.

Para eliminar palabras que riman usando las últimas letras, seleccione las dos últimas letras de la palabra original y borre la lista:

squad=${word:((${#word}-2)):2}
cat $word | sed -e "/.$squad$/d" 1> $word

Miramos, intentamos, todo funciona... entonces, ¿dónde está la lista de la palabra "jugar"? ¿Y por la palabra “me voy”? ¡El archivo está vacío! Y todo esto se debe a que estas palabras son verbos, y sabemos lo que les hacen a quienes riman con verbos. La rima verbal es peor que incluso la rima cuadrada, porque el idioma ruso tiene la mayor cantidad de verbos y todos tienen las mismas terminaciones, razón por la cual no estaban en el archivo final después de verificar las terminaciones.

Sin embargo, no tenemos prisa. Para cada palabra no sólo hay rimas, sino también asonancias, que a veces suenan mucho mejor que la rima; por eso son asonancias (asonancia francesa, del latín assono - sueno afinado).

Obtenemos asonancias

Aquí es donde comienza la diversión: las asonancias aparecen en una URL separada y en la misma página, al ejecutar un script, enviar una solicitud HTTP y recibir una respuesta. Cómo puedo decir wget'¿Presionas el botón? Pero de ninguna manera. Desafortunadamente.

Al darme cuenta de que la URL en la línea estaba cambiando de alguna manera, copié lo que había allí después de cambiar a asonancias y lo pegué en una nueva pestaña del navegador; se abrieron rimas fuertes. Eso no.

Básicamente, pensé, al servidor no debería importarle si se ejecuta el script que le envía la solicitud o si la persona lo escribe a mano. ¿Entonces? Quién sabe, vamos a comprobarlo.

¿Donde enviar? ¿Qué enviar? Solicitud HTTP a la IP del servidor, hay algo como GET... luego hay algo HTTP/1.1... Necesitamos ver qué envía el navegador y dónde. Instalar Wireshark, mira el tráfico:

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Ó.

¿Um que? Oh, sí, tenemos HTTPS. ¿Qué hacer? ¿Lanzar un ataque MITM contra ti mismo? Lo ideal es que la propia víctima nos ayude.

En general, después de haber decidido navegar por el navegador, finalmente encontré la solicitud y el destinatario. Ir:

Diálogo con la 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.

Ey. Jejeje. De hecho, eso es lo que esperaba al enviar una solicitud HTTP simple a un puerto HTTPS. ¿Deberíamos cifrar ahora? Todo este alboroto con las claves RSA y luego con SHA256. ¿Por qué hay OpenSSL para tales cosas. Bueno, ya sabemos qué hacer, simplemente eliminaremos los campos Referer y Cookie primero; creo que no afectarán mucho el asunto:

Diálogo con la 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

¿De qué es capaz el cerebro de un estudiante que aprende sobre el mundo de la informática?

¿Qué es esto, maldecir al servidor? Bueno, al menos me respondieron 200 OK, lo que significa que las cookies y el referente no afectan nada. La compresión es gzip, pero al copiar se copian los caracteres ASCII. Exacto, puedes eliminar la línea. Aceptar codificación. Todo está bien: obtenemos un documento HTML, ahora con asonancias. Pero aquí hay dos preguntas: ¿cómo ejecutar OpenSSL y transferirle datos mediante un script? ¿Y cómo leer el resultado si después de recibir la respuesta nos quedamos, por así decirlo, en un “shell” de OpenSSL? Si se te ocurre algo con el segundo, pero con el primero...

es bueno que haya Habrdonde leí sobre la utilidad esperar, que automatiza el proceso de interacción con programas que esperan interacción humana. Tener un equipo es aún más atractivo esperar automáticamente, generando esperar guión basado en tus acciones. Bueno, lo lanzamos, hacemos todo esto y aquí está el script terminado. Solo él es muy grande, y todo porque. OpenSSL muestra certificados, claves y esperar espera el resultado de todo esto. ¿Necesitamos esto? No. Eliminamos todo el primer mensaje, dejando solo el último salto de línea 'r'. También eliminamos los campos Usuario-Agente y Aceptar de nuestra solicitud; no afectan nada. Entonces, lancemos. El script fue ejecutado, pero ¿dónde está el preciado documento HTML? Esperar se lo comió. Para que lo escupa, debes poner:

set results $expect_out(buffer)

antes del final del script: así es como se escribirá la salida del ejecutable esperar'om comando y se muestra en la pantalla. En resumen, algo como esto:

espera un guión

#!/usr/bin/expect -f

set timeout -1
spawn openssl s_client -connect IP:PORT
match_max 100000
expect -exact "
---r
"
send -- "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1rHost: HOSTrAccept-Language: en-US,en;q=0.5rX-Requested-With: XMLHttpRequestrConnection: close"
expect -exact "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1r
Host: HOSTr
Accept-Language: en-US,en;q=0.5r
X-Requested-With: XMLHttpRequestr
Connection: close"
send -- "r"
set results $expect_out(buffer)
expect -exact "r
"
send -- "r"
expect eof

¡Pero eso no es todo! Como puede ver, en todos los ejemplos la URL de solicitud era estática, pero es la URL la responsable de qué palabra se asociará con las asonancias. Y resulta que buscaremos constantemente la palabra “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” en ASCII o “aquí” en UTF-8. ¿Qué hacer? Por supuesto, ¡simplemente generen un nuevo script cada vez, amigos! Ya no esperar automáticamente'oh, y con la ayuda echo, porque En nuestro nuevo, nada cambia excepto la palabra. Y viva el nuevo problema: ¿cómo podemos traducir inteligentemente una palabra del cirílico al formato URL? Tampoco hay nada especial para el terminal. Bueno, está bien, podemos hacerlo, ¿verdad? Poder:

¡Mira lo que puedo hacer!

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')}

En total, tenemos un script que convierte una palabra en texto ASCII, generando otro script que solicita una página del sitio con asonancias del servidor vía OpenSSL. Y luego redirigimos la salida del último script a un archivo y, a la antigua usanza, lo pasamos "filtros" cuadrados adicionales y escríbalos en el archivo.

Intersección de muchos. Línea de fondo

En realidad, esto es exactamente lo que causa menos problemas. Llevamos a cabo los procedimientos anteriores para dos palabras, luego de las dos listas comparamos cada palabra con cada una y, si encontramos una coincidencia, la generamos. Ahora tenemos un script que toma dos palabras como entrada y muestra una lista de palabras que riman con ambas, e incluso teniendo en cuenta las asonancias, y todo esto sin cambiar manualmente entre cuatro pestañas y recordar las palabras "a ojo", todo recopilado, contabilizado. y se descarta automáticamente. Maravilloso.

El propósito de esta publicación fue mostrar que si una persona necesita algo, lo hará de todos modos. Muy ineficaz, torcido, espeluznante, pero funcionará.

Fuente: habr.com

Añadir un comentario