Česa so sposobni možgani študenta, ki spoznava računalniški svet?

Dober dan.

Ko sem končal pisanje drugega skripta v Bashu, sem ugotovil, da bi moralo biti vse popolnoma drugače, vendar je vse delovalo. Želim vam pokazati, kakšne nespodobnosti in bergle sem napisal, da bi rešil problem, pa še brez vagona znanja. Z drugimi besedami, karikatura programiranja.

Naloga


Nekaj ​​je postalo potrebno za:

  • Prikazano veliko rim za besedo, razen kvadratov
  • Prečkal številne rime dveh besed

Za kaj? No, to je to – in to je to.
Kdo ne ve, kvadratna rima (v običajnem jeziku - kvadrat) sta dve besedi, katerih zadnji dve črki v črkovanju sovpadata, kar (pogosto je to edino) naredi rimo. Na primer, vrtnice so zmrznjene; pnevmatika - avto. Uporabe kvadratov v sodobni verzifikaciji ljudje zaradi svoje primitivnosti ne odobravajo posebej.

odločitev


Zdelo se mi je, da je najenostavnejša rešitev napisati skript v Bashu, ki uporablja že obstoječi generator rim - HOST, ki jih izbira predvsem po sozvočju, in ne po črkovanju. Kakšen HOST? Kajti če navedete pravo ime strani, bodo rekli, da je to oglas. Zakaj ga ne bi uporabljali še naprej? Prvič, kljub njegovi prednosti, da izbira rime na podlagi sozvočij, še vedno pogosto ustvarja kvadratke. Drugič, še vedno morate razmišljati z možgani, porabiti čas za preklapljanje med zavihki in energijo zapomniti ponavljajoče se besede na seznamih, da bi našli rime za dve besedi.

Pridobivanje močnih rim

Kaj vem? Vem za pripomoček wget, ki prenese stran na podani URL. V redu, izvršimo zahtevo - dobimo stran HTML v datoteki, imenovani z besedo, ki se rima. Na primer, poiščimo besedo "tukaj":

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

Ampak potrebujem samo seznam besed, kako se lahko znebim vsega drugega? Pogledamo in vidimo, da je seznam besed oblikovan, ne glede na to, kako čudno je to, v obliki seznama, besede pa so v oznakah . No, imamo odličen pripomoček. žeja - zapišimo takole:

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

Najprej v besedni datoteki izberite vrstice, ki vsebujejo oznako — dobimo kup praznih oznak in vrstic z besedami. Odstranimo samo oznako in njeno zapiranje - tukaj se namesto poševnic uporabljajo simboli za odstotke, ker v sami oznaki že obstaja poševnica, zakaj? žeja malo te ne razume. In z obrestmi je vse v redu. Iz datoteke odstranimo vse presledke, odstranimo prazne vrstice. Voila - že pripravljen seznam besed.

Če želite odstraniti besede, ki se rimajo z uporabo zadnjih črk, izberite zadnji dve črki izvirne besede in počistite seznam:

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

Gledamo, poskušamo - vse deluje ... torej, kje je seznam za besedo "play"? In za besedo "grem"? Datoteka je prazna! In to je vse zato, ker so te besede glagoli in vemo, kaj naredijo tistim, ki se rimajo z glagoli. Glagolska rima je slabša od celo kvadratne rime, saj ima ruski jezik največ glagolov, vsi pa imajo enake končnice, zato jih po preverjanju končnic ni bilo v končni datoteki.

Vendar se nam nikamor ne mudi. Za vsako besedo ne obstajajo samo rime, ampak tudi asonance, ki včasih zvenijo veliko bolje kot rima - zato so asonance (francosko assonance, iz latinščine assono - zvenim v harmoniji).

Dobimo asonance

Tu se zabava začne: asonance se pojavijo na ločenem URL-ju in na isti strani z izvajanjem skripta, pošiljanjem zahteve HTTP in prejemom odgovora. Kako naj rečem wget'Ali pritisnete gumb? Ampak nikakor. Žalostno.

Ko sem opazil, da se URL v vrstici nekako spreminja, sem kopiral, kar je bilo tam po preklopu na asonance, in prilepil v nov zavihek brskalnika - odprle so se močne rime. Ne tisto.

Pravzaprav sem si mislil, da strežniku ne bi smelo biti pomembno, ali se izvrši skript, ki mu pošlje zahtevo, ali pa jo oseba vnese ročno. Torej? Kdo ve, gremo preverit.

Kam poslati? Kaj poslati? Zahteva HTTP za IP strežnika, tam je nekaj takega kot GET ... potem je tu nekaj HTTP/1.1 ... Videti moramo, kaj pošilja brskalnik in kam. Namestite Wireshark, poglej promet:

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... kaj? Oh ja, imamo HTTPS. Kaj storiti? Izvesti napad MITM vase? V idealnem primeru nam bo pomagala žrtev sama.

Na splošno, ko sem se odločil brskati po brskalniku, sem končno našel samo zahtevo in naslovnika. Pojdi:

Dialog s terminalom

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.

Zdravo. Hehehe. Dejansko sem to pričakoval pri pošiljanju gole zahteve HTTP na vrata HTTPS. Naj zdaj šifriramo? Vsa ta razburjanost s ključi RSA, nato s SHA256. Zakaj, obstaja OpenSSL za take stvari. No, že vemo, kaj storiti, le polji Referer in Cookie bomo najprej odstranili - mislim, da ne bosta kaj dosti vplivala na zadevo:

Dialog s terminalom

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

Česa so sposobni možgani študenta, ki spoznava računalniški svet?

Kaj je to, kletvica na strežniku? No, vsaj meni so odgovorili 200 OK, kar pomeni, da piškotki in referer ne vplivajo na nič. Stiskanje je gzip, vendar se pri kopiranju kopirajo znaki ASCII. Točno, črto lahko odstranite Sprejmi kodiranje. Vse je v redu - dobimo dokument HTML, zdaj z asonancami. Tu pa sta dve vprašanji: kako zagnati OpenSSL in vanj prenesti podatke s pomočjo skripta? In kako brati izhod, če po prejemu odgovora ostanemo tako rekoč v »lupini« OpenSSL? Če se z drugim kaj domisliš, pa s prvim...

Še dobro, da obstaja Habrkjer sem prebral o pripomočku pričakovati, ki avtomatizira proces interakcije s programi, ki pričakujejo človeško interakcijo. Imeti ekipo je še bolj privlačno autoexpect, ustvarjanje pričakovati scenarij na podlagi vaših dejanj. No, zaženemo ga, naredimo vse to in tukaj je končan skript. Samo on je zelo ogromen in vse zato OpenSSL prikaže potrdila, ključe in pričakovati čaka na rezultat vsega tega. Ali potrebujemo to? št. Odstranimo celoten prvi poziv, pustimo samo zadnji prelom vrstice 'r'. Iz naše zahteve odstranimo tudi polji User-Agent in Accept – ne vplivata na nič. Torej, začnimo. Skript je bil izveden, toda kje je dragocen dokument HTML? Pričakujte pojedel. Da bi ga izpljunil, morate dati:

set results $expect_out(buffer)

pred koncem skripta - tako bo zapisan izhod izvršljive datoteke pričakovati'om in se prikaže na zaslonu. Če povzamem, nekaj takega:

pričakuj scenarij

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

A to še ni vse! Kot lahko vidite, je bil v vseh primerih URL zahteve statičen, vendar je URL odgovoren za to, katera beseda bo povezana z asonancami. In tako se izkaže, da bomo nenehno iskali besedo »%d0%b7%d0%b4%d0%b5%d1%81%d1%8c« v ASCII ali »tukaj« v UTF-8. Kaj storiti? Seveda preprosto vsakič ustvarite nov skript, prijatelji! Ne več autoexpect'oh, in s pomočjo echo, Ker V našem novem se ne spremeni nič razen besede. In naj živi nova težava: kako lahko pametno prevedemo besedo iz cirilice v obliko URL? Tudi za terminal ni nič posebnega. No, v redu je, zmoremo, kajne? Lahko:

Poglej, kaj lahko naredim!

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

Skupaj imamo skript, ki pretvori besedo v besedilo ASCII in ustvari drug skript, ki od strežnika prek OpenSSL zahteva stran spletnega mesta z asonancami. Nato preusmerimo izhod zadnjega skripta v datoteko in jo na staromoden način posredujemo skozi "filtri" dodatne kvadratke in jih zapišite v datoteko.

Presečišče mnogih. Spodnja črta

Pravzaprav je to tisto, kar povzroča najmanj težav. Zgornje postopke izvedemo za dve besedi, nato iz obeh seznamov vsako besedo primerjamo z vsako in če najdemo ujemanje, ga izpišemo. Zdaj imamo skript, ki kot vnos sprejme dve besedi in prikaže seznam besed, ki se rimajo z obema, in celo upošteva asonance, in vse to brez ročnega preklapljanja med štirimi zavihki in pomnjenja besed "na oko" - to je vse zbrano, obračunajo in samodejno zavržejo. čudovito

Namen te objave je bil pokazati, da če človek nekaj potrebuje, bo to vseeno naredil. Zelo neučinkovito, ukrivljeno, grozljivo, vendar bo delovalo.

Vir: www.habr.com

Dodaj komentar