Wat is it brein fan in studint dy't leart oer de kompjûterwrâld yn steat?

Kening tiid fan 'e dei.

Nei it skriuwen fan in oar skript yn Bash, realisearre ik dat alles folslein oars moast, mar alles wurke. Ik wol dy sjen litte hokker obsceniteiten en krukken ik skreau om it probleem op te lossen, mar noch net in wein fan kennis hawwe. Mei oare wurden, in karikatuer fan programmearring.

Objective


Der waard wat nedich om:

  • In protte rymkes werjûn foar it wurd, útsein fjouwerkanten
  • Kruste de protte rymkes fan twa wurden

Foar wat? No, dat is it - en dat is it.
Wa wit it net, in fjouwerkant rym (yn gewoane taal - in fjouwerkant) is twa wurden wêrfan de lêste twa letters yn 'e stavering gearfalle, wat (faak is dit it iennichste) fan har in rym makket. Bygelyks, roazen binne froast; tire - auto. It brûken fan fjouwerkanten yn moderne fersifikaasje wurdt net bysûnder goedkard troch minsken, fanwege harren primityf.

beslút


It like my ta dat de ienfâldichste oplossing wie om in skript te skriuwen yn Bash dat in al besteande rymgenerator brûkt - HOST, dy't se primêr selekteart troch konsonânsje, en net troch stavering. Hokker soarte HOST? Want as jo de echte namme fan de side oanjaan, sille se sizze dat it in advertinsje is. Wêrom net trochgean mei it brûken? Foarste plak, nettsjinsteande syn foardiel fan it selektearjen fan rymkes basearre op konsonânsjes, produsearret er noch faak fjouwerkanten. Twads moatte jo noch mei jo harsens tinke, tiid besteegje oan it wikseljen tusken ljeppers, en enerzjy ûnthâlden fan werhelle wurden yn listen om in rym foar twa wurden te finen.

Sterke rymkes krije

Wat wit ik? Ik wit oer it nut wget, dy't de side downloade op de opjûne URL. Okee, litte wy it fersyk útfiere - wy krije in HTML-side yn in bestân neamd mei in rymwurd. Litte wy bygelyks sykje nei it wurd "hjir":

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

Mar ik hoech mar in list mei wurden, hoe kin ik kwyt fan al it oare? Wy sjogge en sjogge dat de list mei wurden opmakke is, hoe frjemd it ek wêze kin, yn 'e foarm fan in list, en de wurden binne yn tags . No, wy hawwe in geweldich nut. sed - litte wy it sa opskriuwe:

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

Selektearje earst út it wurdbestân de rigels dy't de tag befetsje - wy krije in bulte lege tags en rigels mei wurden. Wy ferwiderje de tag sels en de slutende - hjir wurde persintaazjesymboalen brûkt ynstee fan slashes, om't yn 'e tag sels der is al in slash, wêrom? sed begrypt dy net in bytsje. En alles is goed mei rinte. Wy fuortsmite alle spaasjes út de triem, fuortsmite lege rigels. Voila - in klearebare list mei wurden.

Om wurden te ferwiderjen dy't rymje mei de lêste letters, selektearje de lêste twa letters út it orizjinele wurd en wiskje de list:

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

Wy sjogge, wy besykje - alles wurket ... dus, wêr is de list foar it wurd "spielje"? En foar it wurd "Ik gean"? De triem is leech! En dit alles is om't dizze wurden tiidwurden binne, en wy witte wat se dogge mei dyjingen dy't rymje op tiidwurden. Tiidwurdrym is slimmer as sels fjouwerkantrym, om't de Russyske taal de measte tiidwurden hat, en se hawwe allegear deselde útgongen, wêrtroch't se nei it kontrolearjen fan de útgongen net yn 'e lêste triem stiene.

Wy hawwe lykwols gjin haast. Foar elk wurd binne der net allinnich rymkes, mar ek assonânsjes, dy't soms folle better klinke as rym - dêrom binne it assonânsjes (Frânsk assonânsje, fan it Latynske assono - ik klink yn harmony).

Wy krije assonânsjes

Dit is wêr't de wille begjint: assonânsjes ferskine op in aparte URL, en op deselde side, troch in skript út te fieren, in HTTP-fersyk te ferstjoeren en in antwurd te ûntfangen. Hoe kin ik sizze wget‘Druksto op de knop? Mar gjin manier. Spitich.

Ik merkte dat de URL yn 'e rigel op ien of oare manier feroaret, kopieare ik wat der wie nei't ik oerstapte nei assonânsjes en plakke it yn in nije blêderljepper - sterke rymkes iepene. Dat net.

Yn essinsje, tocht ik, soe it net skele moatte foar de tsjinner oft it skript dat it fersyk ferstjoert wurdt útfierd, of oft de persoan it mei de hân typt. Sa? Wa wit, lit ús it ris sjen.

Wêr te stjoeren? Wat te stjoeren? HTTP-fersyk nei de tsjinner IP, der is wat as GET ... dan is der wat HTTP/1.1 ... Wy moatte sjen wat de browser stjoert en wêr. Ynstallearje wireshark, sjoch nei it ferkear:

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... wat? Oh ja, wy hawwe HTTPS. Wat te dwaan? In MITM-oanfal op josels lansearje? Ideal sil it slachtoffer sels ús helpe.

Yn 't algemien, nei't ik besletten om de browser te surfen, fûn ik úteinlik it fersyk sels en de geadresseerde. Gean:

Dialooch mei de 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.

Hee. Hehehe. Ja, dat is wat ik ferwachte doe't ik in bleat HTTP-fersyk ferstjoere nei in HTTPS-poarte. Moatte wy no fersiferje? Al dit gedoe mei RSA-kaaien, dan mei SHA256. Wêrom, der is OpenSSL foar sokke dingen. No, wy witte al wat te dwaan, wy sille earst de Referer- en Cookie-fjilden fuortsmite - ik tink dat se de saak net folle beynfloedzje:

Dialooch mei de 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

Wat is it brein fan in studint dy't leart oer de kompjûterwrâld yn steat?

Wat is dit, swarren op de tsjinner? No, se antwurden my teminsten 200 OK, wat betsjut dat cookies en de ferwizer neat beynfloedzje. Kompresje is gzip, mar by it kopiearjen wurde ASCII-tekens kopiearre. Krekt, kinne jo fuortsmite de line Akseptearje-kodearring. Alles is goed - wy krije in HTML-dokumint, no mei assonânsjes. Mar hjir binne twa fragen: hoe kinne jo OpenSSL útfiere en gegevens nei it oerdrage mei in skript? En hoe de útfier te lêzen as wy nei it ûntfangen fan it antwurd, as it wiene, bliuwe yn in OpenSSL "shell"? As jo ​​mei de twadde wat betinke kinne, mar mei de earste ...

It is goed dat der is Habrdêr't ik lês oer it nut ferwachtsje, dy't it proses fan ynteraksje mei programma's automatisearret dy't minsklike ynteraksje ferwachtsje. In team hawwe is noch oantrekliker autoferwachting, generearjen ferwachtsje skript basearre op jo aksjes. No, wy lansearje it, dogge dit alles en hjir is it ôfmakke skript. Allinnich hy is heul grut, en alles om't OpenSSL toant sertifikaten, kaaien, en ferwachtsje wachtet de útfier fan dit alles. Binne wy ​​dit nedich? Nee. Wy fuortsmite de hiele earste prompt, litte allinnich de lêste rigel break 'r'. Wy ferwiderje ek de fjilden User-Agent en Akseptearje út ús oanfraach - se hawwe gjin ynfloed op neat. Dus, litte wy begjinne. It skript waard útfierd, mar wêr is it dierbere HTML-dokumint? Ferwachtsje iet it. Om him it út te spuien, moatte jo sette:

set results $expect_out(buffer)

foar it ein fan it skript - dit is hoe't de útfier fan it útfierbere skreaun wurde sil ferwachtsje'om kommando en werjûn op it skerm. Gearfetsjend, sokssawat as dit:

ferwachtsje in skript

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

Mar dat is net alles! Sa't jo sjen kinne, yn alle foarbylden de fersyk URL wie statysk, mar it is de URL dy't ferantwurdlik is foar hokker wurd wurdt assosjearre mei assonances. En sa docht bliken dat wy hieltyd sykje nei it wurd "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" yn ASCII of "hjir" yn UTF-8. Wat te dwaan? Fansels generearje gewoan elke kear in nij skript, freonen! Net mear autoferwachting'Och, en mei help echo, omdat Yn ús nije feroaret neat útsein it wurd. En lang libje it nije probleem: hoe kinne wy ​​in wurd fan it Syrillysk yntelligint oersette yn URL-formaat? D'r is ek neat spesjaal foar de terminal. No, it is goed, wy kinne it dwaan, krekt? Kinne:

Sjoch wat ik dwaan kin!

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

Yn totaal hawwe wy in skript dat konvertearret in wurd yn ASCII tekst, generearje in oar skript dat freget in side side mei assonânsjes fan de tsjinner fia OpenSSL. En dan ferwize wy de útfier fan it lêste skript nei in bestân en stjoere it op 'e âlderwetske manier troch "filters" ekstra fjouwerkanten en skriuw se nei de triem.

Krúspunt fan in protte. Haadsaak

Eins is dit krekt wat de minste problemen feroarsaket. Wy fiere de boppesteande prosedueres út foar twa wurden, dan fergelykje wy út 'e twa listen elk wurd mei elk en as in oerienkomst fûn wurdt, jouwe wy it út. No hawwe wy in skript dat twa wurden as ynfier nimt en in list mei wurden toant dy't op beide rymje, en sels rekken hâldend mei assonânsjes, en dit alles sûnder manuell te wikseljen tusken fjouwer ljeppers en wurden "mei it each" te ûnthâlden - allegear sammele, rekkene foar en fersmiten automatysk. Prachtich.

It doel fan dizze publikaasje wie om sjen te litten dat as in persoan wat nedich hat, hy it dochs dwaan sil. Hiel net effektyf, krom, griezelig, mar it sil wurkje.

Boarne: www.habr.com

Add a comment