Wozu ist das Gehirn eines Studenten fähig, der etwas über die Computerwelt lernt?

Guten Tag.

Nachdem ich mit dem Schreiben eines weiteren Skripts in Bash fertig war, wurde mir klar, dass alles völlig anders sein sollte, aber alles funktionierte. Ich möchte Ihnen zeigen, welche Obszönitäten und Krücken ich geschrieben habe, um das Problem zu lösen, obwohl ich noch nicht über den nötigen Wissensschatz verfüge. Mit anderen Worten: eine Karikatur der Programmierung.

Aufgabe


Etwas wurde notwendig, um:

  • Es wurden viele Reime für das Wort angezeigt, mit Ausnahme von Quadraten
  • Ich habe die vielen Reime zweier Wörter gekreuzt

Wofür? Nun, das ist es – und das ist es.
Wer weiß es nicht, ein quadratischer Reim (im Volksmund „ein Quadrat“) besteht aus zwei Wörtern, deren letzte beiden Buchstaben in der Schreibweise übereinstimmen, was sie (oftmals ist das das Einzige) zu einem Reim macht. Rosen sind zum Beispiel frostig; Reifen - Auto. Die Verwendung von Quadraten in modernen Versen findet aufgrund ihrer Primitivität bei den Menschen keine besondere Zustimmung.

Lösung


Die einfachste Lösung schien mir darin zu bestehen, ein Skript in Bash zu schreiben, das einen bereits vorhandenen Reimgenerator – HOST – verwendet, der sie hauptsächlich nach Konsonanz und nicht nach Rechtschreibung auswählt. Was für ein GASTGEBER? Denn wenn Sie den echten Namen der Website angeben, heißt es, dass es sich um Werbung handelt. Warum nicht weiter verwenden? Erstens produziert er trotz seines Vorteils, Reime auf der Grundlage von Konsonanzen auszuwählen, immer noch häufig Quadrate. Zweitens müssen Sie immer noch mit Ihrem Gehirn denken, Zeit damit verbringen, zwischen Tabs zu wechseln, und Energie darauf verwenden, sich wiederholte Wörter in Listen zu merken, um einen Reim für zwei Wörter zu finden.

Starke Reime bekommen

Was weiß ich? Ich kenne das Dienstprogramm wget, wodurch die Seite unter der angegebenen URL heruntergeladen wird. Okay, führen wir die Anfrage aus – wir erhalten eine HTML-Seite in einer Datei, die mit einem Reimwort benannt ist. Suchen wir zum Beispiel nach dem Wort „hier“:

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

Aber ich brauche nur eine Liste mit Wörtern, wie kann ich alles andere loswerden? Wir schauen und sehen, dass die Liste der Wörter, egal wie seltsam sie auch sein mag, in Form einer Liste formatiert ist und die Wörter in Tags enthalten sind . Nun, wir haben ein großartiges Dienstprogramm. Durst - Schreiben wir es so auf:

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

Wählen Sie zunächst aus der Word-Datei die Zeilen aus, die das Tag enthalten – Wir erhalten eine Menge leerer Tags und Zeilen mit Wörtern. Wir entfernen das Tag selbst und sein Schlusswort – hier werden Prozentzeichen anstelle von Schrägstrichen verwendet, da sie im Tag selbst enthalten sind Da ist schon ein Schrägstrich, warum? Durst versteht dich kein bisschen. Und mit Interesse ist alles in Ordnung. Wir entfernen alle Leerzeichen aus der Datei, entfernen leere Zeilen. Voila – eine vorgefertigte Wortliste.

Um Wörter zu entfernen, die sich mit den letzten Buchstaben reimen, wählen Sie die letzten beiden Buchstaben des Originalworts aus und leeren Sie die Liste:

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

Wir schauen, wir versuchen – alles funktioniert... Also, wo ist die Liste für das Wort „spielen“? Und für das Wort „Ich gehe“? Die Datei ist leer! Und das liegt alles daran, dass diese Wörter Verben sind und wir wissen, was sie mit denen machen, die sich mit Verben reimen. Der Verbreim ist schlimmer als sogar der Quadratreim, weil es in der russischen Sprache die meisten Verben gibt und alle die gleichen Endungen haben, weshalb sie nach Überprüfung der Endungen nicht in der endgültigen Datei enthalten waren.

Allerdings haben wir es nicht eilig. Für jedes Wort gibt es nicht nur Reime, sondern auch Assonanzen, die manchmal viel besser klingen als Reime – deshalb sind sie Assonanzen (französische Assonanz, von lateinisch assono – ich klinge im Einklang).

Wir bekommen Assonanzen

Hier beginnt der Spaß: Assonanzen erscheinen unter einer separaten URL und auf derselben Seite, indem ein Skript ausgeführt, eine HTTP-Anfrage gesendet und eine Antwort empfangen wird. Wie soll ich es sagen wget„Drückst du den Knopf? Aber auf keinen Fall. Leider.

Als ich bemerkte, dass sich die URL in der Zeile irgendwie änderte, kopierte ich den Inhalt nach dem Wechsel zu Assonanzen und fügte ihn in einen neuen Browser-Tab ein – es öffneten sich starke Reime. Nicht das.

Im Wesentlichen dachte ich, dass es für den Server keine Rolle spielen sollte, ob das Skript, das ihm die Anfrage sendet, ausgeführt wird oder ob die Person es von Hand eingibt. Also? Wer weiß, schauen wir uns das mal an.

Wohin senden? Was senden? HTTP-Anfrage an die Server-IP, es gibt so etwas wie GET... dann gibt es etwas HTTP/1.1... Wir müssen sehen, was der Browser wohin sendet. Installieren wireshark, schau dir den Verkehr an:

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

Ähm... was? Oh ja, wir haben HTTPS. Was zu tun ist? Einen MITM-Angriff auf sich selbst starten? Im Idealfall hilft uns das Opfer selbst.

Nachdem ich mich entschieden hatte, im Browser zu surfen, fand ich im Allgemeinen endlich die Anfrage selbst und den Adressaten. Gehen:

Dialog mit dem 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.

Hey. Hehehe. Das ist es tatsächlich, was ich erwartet habe, als ich eine reine HTTP-Anfrage an einen HTTPS-Port gesendet habe. Sollen wir jetzt verschlüsseln? Der ganze Aufwand mit RSA-Schlüsseln und dann mit SHA256. Warum, es gibt OpenSSL für solche Dinge. Nun, wir wissen bereits, was zu tun ist. Wir werden zunächst nur die Felder „Referer“ und „Cookie“ entfernen. Ich denke, dass sie keinen großen Einfluss auf die Sache haben werden:

Dialog mit dem 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

Wozu ist das Gehirn eines Studenten fähig, der etwas über die Computerwelt lernt?

Was ist das, auf dem Server zu fluchen? Nun, zumindest haben sie mir mit 200 OK geantwortet, was bedeutet, dass Cookies und der Referrer keinen Einfluss haben. Die Komprimierung erfolgt mit gzip, beim Kopieren werden jedoch ASCII-Zeichen kopiert. Genau, Sie können die Zeile entfernen Akzeptieren-Kodierung. Alles ist in Ordnung – wir erhalten ein HTML-Dokument, jetzt mit Assonanzen. Hier stellen sich jedoch zwei Fragen: Wie kann ich OpenSSL ausführen und mithilfe eines Skripts Daten darauf übertragen? Und wie liest man die Ausgabe, wenn wir nach Erhalt der Antwort sozusagen in einer OpenSSL-„Shell“ bleiben? Wenn man sich mit dem zweiten etwas einfallen lassen kann, aber mit dem ersten...

Es ist gut, dass es das gibt Habrwo ich über das Dienstprogramm gelesen habe erwarten, das den Prozess der Interaktion mit Programmen automatisiert, die menschliche Interaktion erwarten. Noch attraktiver ist es, ein Team zu haben automatisch erwarten, Erstellen erwarten Skript basierend auf Ihren Aktionen. Nun, wir starten es, machen das alles und hier ist das fertige Skript. Nur ist er sehr groß, und das alles nur deshalb OpenSSL Zeigt Zertifikate, Schlüssel usw. an erwarten wartet auf die Ausgabe all dessen. Brauchen wir das? Nein. Wir entfernen die gesamte erste Eingabeaufforderung und lassen nur den letzten Zeilenumbruch „r“ übrig. Wir entfernen auch die Felder „User-Agent“ und „Akzeptieren“ aus unserer Anfrage – sie haben keinerlei Auswirkungen. Also, lasst uns starten. Das Skript wurde ausgeführt, aber wo ist das geschätzte HTML-Dokument? Erwarten habe es gegessen. Damit er es ausspuckt, müssen Sie Folgendes sagen:

set results $expect_out(buffer)

vor dem Ende des Skripts – so wird die Ausgabe der ausführbaren Datei geschrieben erwarten'om Befehl und wird auf dem Bildschirm angezeigt. Zusammenfassend etwa so:

Erwarte ein Drehbuch

#!/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

Aber das ist nicht alles! Wie Sie sehen können, war die Anfrage-URL in allen Beispielen statisch, aber es ist die URL, die dafür verantwortlich ist, welches Wort mit Assonanzen verknüpft wird. Und so stellt sich heraus, dass wir ständig nach dem Wort „%d0%b7%d0%b4%d0%b5%d1%81%d1%8c“ in ASCII oder „hier“ in UTF-8 suchen. Was zu tun ist? Natürlich, einfach jedes Mal ein neues Skript erstellen, Freunde! Nicht länger automatisch erwarten„Oh, und mit der Hilfe.“ Echo, Weil In unserem neuen ändert sich nichts außer dem Wort. Und es lebe das neue Problem: Wie können wir ein Wort intelligent aus dem Kyrillischen in das URL-Format übersetzen? Auch für das Terminal gibt es nichts Besonderes. Nun, es ist okay, wir können es schaffen, oder? Dürfen:

Guck mal was ích kann!

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

Insgesamt haben wir ein Skript, das ein Wort in ASCII-Text umwandelt und so ein weiteres Skript generiert, das über OpenSSL eine Site-Seite mit Assonanzen vom Server anfordert. Und dann leiten wir die Ausgabe des letzten Skripts in eine Datei um und leiten sie auf altmodische Weise weiter „Filter“ zusätzliche Quadrate und schreiben Sie sie in die Datei.

Schnittpunkt von vielen. Endeffekt

Eigentlich ist es genau das, was die geringsten Probleme verursacht. Wir führen die obigen Prozeduren für zwei Wörter durch, vergleichen dann jedes Wort aus den beiden Listen mit jedem und geben es aus, wenn eine Übereinstimmung gefunden wird. Jetzt haben wir ein Skript, das zwei Wörter als Eingabe verwendet und eine Liste von Wörtern anzeigt, die sich auf beide reimen, und sogar Assonanzen berücksichtigt, und das alles, ohne manuell zwischen vier Registerkarten zu wechseln und sich Wörter „nach Augenmaß“ zu merken – alles gesammelt, abgerechnet automatisch gelöscht und verworfen. Wunderbar.

Der Zweck dieser Veröffentlichung bestand darin, zu zeigen, dass jemand, der etwas braucht, es trotzdem tun wird. Sehr ineffektiv, schief, gruselig, aber es wird funktionieren.

Source: habr.com

Kommentar hinzufügen