De lo que es capaz el cerebro de un estudiante en el mundo de la informática

Buen dia

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 mostrarte qué blasfemias y muletas escribí para resolver el problema, pero hasta ahora sin un coche de conocimiento. En otras palabras, una caricatura de programación.

Desafío


Algo se hizo necesario para:
  • Impreso muchas rimas para una palabra, excepto los cuadrados
  • Crucé muchas rimas de dos palabras

Para que? Bueno, aquí está, y eso es todo.
Quién no sabe, una rima cuadrada (en lenguaje común: un cuadrado) son dos palabras que tienen las últimas dos letras en la ortografía, que (a menudo esto solo) las convierte en una rima. Por ejemplo, rosas - escarcha; El neumático es un auto. El uso de cuadrados en la versificación moderna no está particularmente aprobado por las personas, debido a su primitividad.

Solución


La solución más simple me pareció escribir un script en Bash, utilizando el generador de rimas ya existente - HOST, que primero los selecciona de acuerdo con las armonías, y no por ortografía. ¿Qué es un anfitrión? Porque si especifica el nombre real del sitio, dirán que la publicidad. ¿Por qué no seguir usándolo? En primer lugar, a pesar de su ventaja en la selección de rimas según las armonías, a menudo produce cuadrados. En segundo lugar, todavía tiene que pensar con sus cerebros, pasar el tiempo cambiando entre pestañas, el esfuerzo de recordar repetir palabras en listas para encontrar rimas para dos palabras.

Obteniendo rimas fuertes


Que se yo Sé sobre la utilidad wget , que descarga la página en la URL especificada. Bueno, cumplimos con la solicitud: obtenemos la página HTML en el archivo, que se llama palabra para rima. Por ejemplo, busque la palabra "aquí":

wget https://HOST/rifma/ 

Pero solo necesito una lista de palabras, ¿cómo deshacerme de todo lo demás? Observamos y vemos que la lista de palabras está organizada, por extraño que parezca, en forma de lista, y las palabras están en las etiquetas <li> </li>. Bueno, tenemos una maravillosa utilidad sed , y anótala:


 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 palabras , seleccione las líneas que contienen la etiqueta <li>; obtenemos un montón de etiquetas vacías y líneas con palabras. Eliminamos la etiqueta y su cierre; aquí se usan símbolos de porcentaje en lugar de barras porque la etiqueta </li> ya tiene una barra oblicua, por lo que sed no te entiende un poco. Y con interés, todo está bien. Eliminamos todos los espacios del archivo, eliminamos las líneas vacías. Voila: una lista completa de palabras.

Para eliminar palabras que riman debido a las últimas letras, seleccione las dos últimas letras de la palabra original y limpie la lista:

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

Miramos, intentamos, todo funciona ... así que, pero ¿dónde está la lista de la palabra "jugar"? ¿Y por la palabra "ya voy"? ¡El archivo está vacío! Y todo esto se debe a que estas palabras son verbos, y sabemos lo que hacen con aquellos que riman en verbos. La rima del verbo es incluso peor que la del cuadrado, para la mayoría de los verbos en el idioma ruso, e incluso todos con las mismas terminaciones, por lo que no aparecieron en el archivo final después de verificar las terminaciones.

Sin embargo, no tiene prisa. Para cada palabra no solo hay rimas, sino también asonancias, que a veces suenan mucho mejor que la rima, ya que también son asonancias (asonancia francesa, del assono latino, sueno bien).

Obtener asonancias


Aquí 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 decirle a wget 'que haga clic en un botón? Pero de cualquier manera. Es triste

Al notar que la URL en la línea todavía está cambiando de alguna manera, copié lo que estaba allí después de cambiar a asonancia y la pegué en una nueva pestaña del navegador: se abrieron rimas fuertes. No es eso

De hecho, pensé, al servidor no debería importarle si el script que envía la solicitud se ejecuta o si la persona lo escribe a mano. Entonces? Y quién sabe, vamos a ver.

A donde enviar Que enviar Una solicitud HTTP a la IP del servidor, hay algo como GET ... luego hay algo HTTP / 1.1 ... Necesitamos ver qué y dónde envía el navegador. Instale wireshark , mire 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. Que hacer ¿Organizar un ataque MITM contra ti mismo? Idealmente, la víctima misma nos ayudará.

En general, adivinando para subir al navegador, todavía encontré la solicitud en sí y el destinatario. Vamos:

Diálogo con el 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 Hey hey De hecho, lo que esperaba al enviar una solicitud HTTP desnuda a un puerto HTTPS. ¿Está encriptado ahora? Todo este alboroto con claves RSA, luego con SHA256. Y por qué, hay OpenSSL para tales asuntos. Bueno, ya sabemos qué hacer, simplemente elimine los campos Referer y Cookie; creo que no afectarán en gran medida el asunto:

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



¿Es este un jaque mate en el servidor? Bueno, al menos 200 OK me respondieron, lo que significa que las cookies y la referencia no afectan nada. Compresión Gzip, pero los caracteres ASCII se copian al copiar. Del mismo modo, puede eliminar la línea de codificación de aceptación . Todo está bien: obtenemos un documento HTML, ahora con asonancias. Pero aquí hay dos preguntas: ¿cómo ejecutar OpenSSL y pasarle datos con un script? ¿Y cómo leer la salida, si después de recibir la respuesta permanecemos como en el "shell" de OpenSSL? Si puedes pensar en algo con el segundo, pero con el primero ...

Es bueno que haya un Habr , donde leí sobre la utilidad de esperar , que automatiza el proceso de interacción con los programas que esperan la interacción humana. Aún más atractivo es la presencia del comando autoexpect que genera un script de espera para sus acciones. Bueno, corre, hazlo todo y aquí está el guión terminado. Solo que es muy grande, y todo porque OpenSSL muestra certificados, claves, y espera mostrar todo esto. ¿Necesitamos esto? No Demolamos el primer aviso, dejando solo el último salto de línea '\ r'. También eliminamos los campos Agente de usuario y Aceptar de nuestra solicitud; no afectan nada. Entonces, comencemos. El script se ejecuta, pero ¿dónde está el codiciado documento HTML? Espera comérselo. Para hacerlo escupir, debes poner:

 set results $expect_out(buffer) 

antes del final de la secuencia de comandos: así es como se escribirá y mostrará la salida del comando de espera ejecutado. En resumen, algo como esto:

Esperar 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.1\rHost: HOST\rAccept-Language: en-US,en;q=0.5\rX-Requested-With: XMLHttpRequest\rConnection: close" expect -exact "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1\r Host: HOST\r Accept-Language: en-US,en;q=0.5\r X-Requested-With: XMLHttpRequest\r 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, sin embargo, es él quien es responsable de la palabra a la que se mostrarán las asonancias. Y resulta que buscaremos constantemente por la palabra "% d0% b7% d0% b4% d0% b5% d1% 81% d1% 8c" en ASCII o "aquí" en UTF-8. Que hacer Por supuesto, ¡simplemente cada vez que generes un nuevo script, amigos! Solo que no se espera automáticamente 'ohm, sino con eco , porque En nuestro país, nada cambia excepto la palabra. Y viva el nuevo problema: ¿cómo podríamos traducir de manera inteligente una palabra del cirílico a un formato de URL? Algo para la terminal tampoco es nada especial. Bueno, nada, ¿podemos? Podemos:

Mira lo que puedo!
 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 la palabra en texto ASCII, generando otro script que solicita a través de la página del servidor OpenSSL del sitio con las asonancias. Y luego redirigimos la salida del último script al archivo y, a la antigua usanza, lo pasamos a través de los "filtros" del exceso, los cuadrados y los agregamos al archivo.

Intersección de conjuntos. Resumen


En realidad, esto es exactamente lo que causa menos problemas. Realizamos los procedimientos anteriores para dos palabras, luego de dos listas comparamos cada palabra con cada una y, si se encuentra una coincidencia, la mostramos. Ahora tenemos un script que lleva dos palabras a la entrada y muestra una lista de palabras que riman con ambas, teniendo en cuenta las asonancias, y todo esto sin cambiar manualmente entre las cuatro pestañas y recordar las palabras "a simple vista", eso es todo recogido, grabado y descartado automáticamente. Genial

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

Source: https://habr.com/ru/post/474448/


All Articles