Chì ci hè u cervellu di un studiente chì impara nantu à u mondu di l'informatica capace di?

Kind of time of day.

Dopu avè finitu di scrive un altru script in Bash, aghju capitu chì tuttu deve esse completamente diversu, ma tuttu hà travagliatu. Vogliu dimustrà chì obscenities è crutches aghju scrittu per risolve u prublema, ma ùn avè micca ancu un vagone di cunniscenza. In altri palori, una caricatura di prugrammazione.

Objettivu


Qualcosa hè diventatu necessariu per:

  • Mostra assai rime per a parolla, eccettu per i quadrati
  • Incruciate e parechje rime di duie parolle

Perchè? Ebbè, hè questu - è questu hè.
Quale ùn sà micca, una rima quadrata (in lingua cumuni - un quadru) hè duie parolle chì l'ultime duie lettere in l'ortografia coincidenu, chì (spessu, questu hè l'unicu) li face una rima. Per esempiu, i rosi sò frosty; pneumatici - vittura. L'usu di squadre in a versificazione muderna ùn hè micca particularmente appruvata da e persone, per via di a so primitività.

dicisioni


Mi pareva chì a suluzione più simplice era di scrive un script in Bash chì usa un generatore di rima già esistente - HOST, chì principarmenti li selezziunate per cunsonanza, è micca per ortografia. Chì tipu di HOST? Perchè se indicà u veru nome di u situ, diceranu chì hè una publicità. Perchè ùn cuntinuà à aduprà? Prima, malgradu u so vantaghju di selezziunà rime basate nantu à cunsunanza, sempre pruduce quadrati. Siconda, avete sempre à pensà cù u vostru cervellu, passanu u tempu di cambià trà e tabulazioni, è l'energia memorizendu e parolle ripetute in listi per truvà una rima per duie parolle.

Pigliate rime forti

Chì sò? So di l'utilità wget, chì scarica a pagina à l'URL specificatu. Va bè, eseguisce a dumanda - avemu una pagina HTML in un schedariu chjamatu cù una parola rima. Per esempiu, cerchemu a parolla "qui":

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

Ma solu bisognu di una lista di parolle, cumu possu sbarazzà di tuttu u restu? Fighjemu è vedemu chì a lista di e parolle hè furmatu, ùn importa quantu strana pò esse, in forma di lista, è e parolle sò in tag . Ebbè, avemu una grande utilità. sidu - scrivimu cusì cusì :

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

Prima, selezziunate e linee da u schedariu di parola chì cuntenenu l'etichetta - avemu un munzeddu di tags vacanti è linii cù parolle. Eliminate l'etichetta stessa è u so chjusu - quì i simboli per centu sò usati invece di slashes perchè l'etichetta stessu hà digià una slash, per quessa. sidu ùn ti capisce un pocu. È tuttu hè bè cù interessu. Eliminate tutti i spazii da u schedariu, sguassate e linee viote. Voila - una lista pronta di parolle.

Per sguassà e parolle chì rimanu cù l'ultime lettere, selezziunate l'ultime duie lettere da a parolla originale è sguassate a lista:

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

Fighjemu, pruvemu - tuttu funziona ... allora, induve hè a lista per a parolla "play"? È per a parolla "Vaiu"? U schedariu hè viotu! È questu hè tuttu perchè sti parolle sò verbi, è sapemu ciò chì facenu à quelli chì rimanu cù verbi. Verbu rima hè peggiu chè ancu a rima quadrata, perchè a lingua russa hà a maiò parte di verbi, è tutti anu a stessa terminazione, chì hè per quessa ch'elli ùn eranu micca in u schedariu finali dopu à cuntrollà i fini.

Tuttavia, ùn avemu micca fretta. Per ogni parolla ùn sò micca solu rimi, ma ancu assonanze, chì qualchì volta sonanu assai megliu cà rima - per quessa sò assonanze (assonance francese, da u latinu assono - sonu in armunia).

Avemu assonanze

Hè quì chì u divertimentu principia: l'assonanze appariscenu in un URL separatu, è in a stessa pagina, eseguendu un script, mandendu una dumanda HTTP è riceve una risposta. Cumu possu dì wget'Preme un buttone? Ma micca manera. Triste.

Nutendu chì l'URL in a linea era in qualchì modu cambiatu, aghju copiatu ciò chì ci era dopu avè cambiatu à l'assonanze è l'incollà in una nova tabulazione di u navigatore - rimi forti aperti. Micca chì.

Essenzialmente, aghju pensatu, ùn deve micca impurtanza à u servitore se u script chì manda a dumanda hè eseguita, o se a persona scrive a manu. Allora? Chi sà, andemu à verificà.

Induve mandà ? Cosa à mandà? A dumanda HTTP à u servitore IP, ci hè qualcosa cum'è GET ... allora ci hè qualcosa HTTP / 1.1 ... Avemu bisognu di vede ciò chì u navigatore manda è induve. Installa wireshark, fighjate u trafficu:

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

Ehm... chì ? Oh iè, avemu HTTPS. Chì fà ? Lanciari un attaccu MITM nantu à sè stessu? Ideale, a vittima stessu ci aiuterà.

In generale, avè decisu di navigà in u navigatore, aghju finalmente trovu a dumanda stessu è u destinatariu. Andà:

Dialogu cù u 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.

Ehi. Hehehe. Infatti, hè ciò chì m'aspittava quandu invià una dumanda HTTP nuda à un portu HTTPS. Avemu da criptà avà? Tuttu stu fuss cù e chjave RSA, dopu cù SHA256. Perchè, ci hè OpenSSL per tali cose. Ebbè, sapemu digià ciò chì deve fà, eliminemu solu i campi Referer è Cookie prima - Pensu chì ùn anu micca affettatu assai a materia:

Dialogu cù u 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

Chì ci hè u cervellu di un studiente chì impara nantu à u mondu di l'informatica capace di?

Chì ghjè questu, ghjurà nantu à u servitore? Ebbè, almenu m'hanu rispostu 200 OK, chì significa chì i cookies è u referrer ùn affettanu nunda. A cumpressione hè gzip, ma quandu si copia, i caratteri ASCII sò copiati. Esattamente, pudete sguassà a linea Accetta-codificazione. Tuttu hè bè - avemu un documentu HTML, avà cù assonanze. Ma quì sò duie dumande: cumu per eseguisce OpenSSL è trasfiriri dati à questu utilizendu un script? E cumu si leghje u risultatu se dopu avè ricivutu a risposta fermamu, per esse, in una "shell" OpenSSL? S'è vo pudete fà qualcosa cù u sicondu, ma cù u primu ...

Hè bè chì ci hè Habrinduve leghje nantu à l'utilità aspetta, chì automatizeghja u prucessu di interazzione cù i prugrammi chì aspettanu interazzione umana. Avè una squadra hè ancu più attrattiva aspetta automaticamente, generà aspetta script basatu nantu à e vostre azzioni. Ebbè, lanciamu, fate tuttu questu è quì hè u script finitu. Solu ellu hè assai grande, è tuttu perchè OpenSSL mostra certificati, chjave, è aspetta aspetta u risultatu di tuttu questu. Avemu bisognu di questu? Innò. Sguassemu tuttu u primu prompt, lascendu solu l'ultima linea 'r'. Eliminamu ancu i campi User-Agent è Accept da a nostra dumanda - ùn affettanu nunda. Allora, lanciamu. U script hè statu eseguitu, ma induve hè u documentu HTML tesoru? Aspetta manghjatu. Per fà u sputallu, avete bisognu di mette:

set results $expect_out(buffer)

prima di a fine di u script - questu hè cumu l'output di l'eseguibile serà scrittu aspetta'om cumanda è mustratu nant'à u screnu. In riassuntu, qualcosa cum'è questu:

aspetta un script

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

Ma ùn hè micca tuttu ! Comu pudete vede, in tutti l'esempii l'URL di a dumanda era staticu, ma hè l'URL chì hè rispunsevuli di quale parolla serà assuciata cù assonanze. È cusì risulta chì avemu da circà constantemente a parolla "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" in ASCII o "qui" in UTF-8. Chì fà ? Di sicuru, basta à generà un novu script ogni volta, amichi! Nun cchiù aspetta automaticamente'om, è cù l'aiutu eccu, perchè In u nostru novu, nunda cambia fora di a parolla. È viva u novu prublema: cumu si pò traduce in modu intelligente una parolla da u cirillicu in u formatu URL ? Ùn ci hè nunda di speciale per u terminal. Ebbè, va bè, pudemu fà, nò? Pò:

Fighjate ciò chì possu fà !

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

In tuttu, avemu un script chì cunverte una parolla in testu ASCII, generendu un altru script chì dumanda una pagina di u situ cù assonanze da u servitore via OpenSSL. E poi redirigemu l'output di l'ultimu script à un schedariu è, in u modu anticu, passanu "filtri" piazze extra è scrivite à u schedariu.

Intersezzione di parechji. In fondu

In fatti, questu hè esattamente ciò chì causa u minimu prublemi. Facemu e prucedure sopra per duie parolle, dopu da e duie liste paragunemu ogni parolla cù ognuna è se truvamu una partita, l'avemu in output. Avà avemu un script chì piglia duie parolle cum'è input è mostra una lista di parolle chì rimanu cù e duie, è ancu tenendu in contu l'assonanze, è tuttu questu senza cambià manualmente trà quattru tabulazioni è ricurdà e parolle "à l'ochju" - tuttu hè recullatu, cuntatu è scartatu automaticamente. Meravigliosa.

U scopu di sta publicazione era di dimustrà chì, se una persona hà bisognu di qualcosa, hà da fà in ogni modu. Moltu inefficace, stortu, creepy, ma hà da travaglià.

Source: www.habr.com

Add a comment