Laba diena.
Pabeidzis rakstÄ«t kÄrtÄjo skriptu BaÅ”Ä, sapratu, ka visam vajadzÄtu bÅ«t pavisam savÄdÄk, bet viss izdevÄs. Es vÄlos jums parÄdÄ«t, kÄdas neÄ·Ä«trÄ«bas un kruÄ·us es rakstÄ«ju, lai atrisinÄtu problÄmu, bet vÄl nav zinÄÅ”anu vagona. Citiem vÄrdiem sakot, programmÄÅ”anas karikatÅ«ra.
Uzdevums
Kaut kas kļuva nepiecieŔams, lai:
- VÄrdam tika rÄdÄ«ti daudzi atskaÅas, izÅemot kvadrÄtus
- Å Ä·Ärsoja daudzos divu vÄrdu atskaÅas
Par ko? Nu tas tÄ ā un viss.
Kas nezina, kvadrÄtveida atskaÅa (parastÄ valodÄ - kvadrÄts) ir divi vÄrdi, kuru pÄdÄjie divi burti pareizrakstÄ«bÄ sakrÄ«t, kas (bieži vien tas ir vienÄ«gais) padara tos par atskaÅu. PiemÄram, rozes ir salnas; riepa - auto. KvadrÄtu izmantoÅ”anu mÅ«sdienu versifikÄcijÄ cilvÄki to primitivitÄtes dÄļ Ä«paÅ”i neapstiprina.
Å Ä·Ä«dums
Man Ŕķita, ka vienkÄrÅ”Äkais risinÄjums ir uzrakstÄ«t skriptu Bash valodÄ, kas izmanto jau esoÅ”u atskaÅu Ä£eneratoru - HOST, kas tos galvenokÄrt atlasa pÄc lÄ«dzskaÅas, nevis pÄc pareizrakstÄ«bas. KÄda veida HOST? Jo, ja jÅ«s norÄdÄ«siet vietnes Ä«sto nosaukumu, viÅi teiks, ka tÄ ir reklÄma. KÄpÄc ne turpinÄt to lietot? PirmkÄrt, neskatoties uz viÅa priekÅ”rocÄ«bÄm, izvÄloties atskaÅas, pamatojoties uz lÄ«dzskaÅÄm, viÅÅ” joprojÄm bieži veido kvadrÄtus. OtrkÄrt, jums joprojÄm ir jÄdomÄ ar savÄm smadzenÄm, jÄpavada laiks, pÄrslÄdzoties starp cilnÄm, un jÄtÄrÄ laiks, lai iegaumÄtu atkÄrtotus vÄrdus sarakstos, lai atrastu atskaÅu diviem vÄrdiem.
SpÄcÄ«gu atskaÅu iegÅ«Å”ana
Ko es zinu? Es zinu par lietderÄ«bu wget, kas lejupielÄdÄ lapu norÄdÄ«tajÄ URL. Labi, izpildÄ«sim pieprasÄ«jumu ā mÄs iegÅ«stam HTML lapu failÄ, kas nosaukts ar atskaÅu vÄrdu. PiemÄram, meklÄsim vÄrdu āÅ”eitā:
wget https://HOST/rifma/Š·Š“ŠµŃŃ
Bet man vajag tikai vÄrdu sarakstu, kÄ es varu atbrÄ«voties no visa pÄrÄjÄ? MÄs skatÄmies un redzam, ka vÄrdu saraksts ir noformÄts, lai cik dÄ«vaini tas nebÅ«tu, saraksta formÄ un vÄrdi ir tagos . Nu, mums ir lieliska lietderÄ«ba. slÄpes - pierakstÄ«sim Å”Ädi:
cat $word | grep '<li>' | sed -e "s%<li>%%" | sed -e "s%</li>%%" | sed -e "s/ //g" | sed -e "/^$/d" 1> $word
Vispirms Word failÄ atlasiet rindas, kurÄs ir tags ā iegÅ«stam kaudzi tukÅ”u birku un rindiÅu ar vÄrdiem. MÄs noÅemam paÅ”u tagu un tÄ noslÄdzoÅ”o ā Å”eit slÄ«psvÄ«tru vietÄ tiek izmantoti procentu simboli, jo paÅ”Ä tagÄ tur jau ir slÄ«psvÄ«tra, kÄpÄc? slÄpes tevi mazliet nesaprot. Un ar procentiem viss kÄrtÄ«bÄ. MÄs noÅemam no faila visas atstarpes, noÅemam tukÅ”as rindas. Voila - gatavs vÄrdu saraksts.
Lai noÅemtu vÄrdus, kas atskaÅo, izmantojot pÄdÄjos burtus, atlasiet oriÄ£inÄlÄ vÄrda pÄdÄjos divus burtus un notÄ«riet sarakstu:
squad=${word:((${#word}-2)):2}
cat $word | sed -e "/.$squad$/d" 1> $word
SkatÄmies, cenÅ”amies - viss strÄdÄ... nu, kur ir saraksts ar vÄrdu āspÄlÄtā? Un par vÄrdu "es ieÅ”u"? Fails ir tukÅ”s! Un tas viss ir tÄpÄc, ka Å”ie vÄrdi ir darbÄ«bas vÄrdi, un mÄs zinÄm, ko tie dara tiem, kas atskaÅo ar darbÄ«bas vÄrdiem. DarbÄ«bas vÄrdu atskaÅa ir sliktÄka par pat kvadrÄtveida atskaÅu, jo krievu valodÄ ir visvairÄk darbÄ«bas vÄrdu, turklÄt tiem visiem ir vienÄdas galotnes, tÄpÄc pÄc galotÅu pÄrbaudes tie galÄ«gajÄ failÄ nebija.
TomÄr mÄs nesteidzamies. Katram vÄrdam ir ne tikai atskaÅas, bet arÄ« asonanses, kas dažreiz izklausÄs daudz labÄk nekÄ atskaÅa - tÄpÄc tÄs ir asonanses (franÄu assonanse, no latÄ«Åu valodas assono - es skanu melodijÄ).
MÄs iegÅ«stam asonanses
Å eit sÄkas jautrÄ«ba: asonanses parÄdÄs atseviÅ”Ä·Ä URL un tajÄ paÅ”Ä lapÄ, izpildot skriptu, nosÅ«tot HTTP pieprasÄ«jumu un saÅemot atbildi. KÄ es varu teikt wget'Vai tu nospied pogu? Bet nekÄdÄ gadÄ«jumÄ. DiemžÄl.
Pamanot, ka URL rindÄ kaut kÄ mainÄs, nokopÄju tur esoÅ”o pÄc pÄrejas uz asonancÄm un ielÄ«mÄju jaunÄ pÄrlÅ«kprogrammas cilnÄ - pavÄrÄs spÄcÄ«gi atskaÅas. Ne tÄ.
BÅ«tÄ«bÄ, es domÄju, serverim nevajadzÄtu bÅ«t svarÄ«giem, vai skripts, kas tam nosÅ«ta pieprasÄ«jumu, tiek izpildÄ«ts, vai arÄ« persona to ieraksta ar roku. TÄtad? Kas zina, iesim to pÄrbaudÄ«t.
Kur sÅ«tÄ«t? Ko sÅ«tÄ«t? HTTP pieprasÄ«jums uz servera IP, ir kaut kas lÄ«dzÄ«gs GET... tad ir kaut kas HTTP/1.1... JÄskatÄs, ko pÄrlÅ«kprogramma sÅ«ta un kur. UzstÄdÄ«t Wireshark, paskatieties uz satiksmi:
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... ko? Ak, jÄ, mums ir HTTPS. Ko darÄ«t? SÄkt MITM uzbrukumu sev? IdeÄlÄ gadÄ«jumÄ mums palÄ«dzÄs pati cietuÅ”Ä.
KopumÄ, nolÄmusi sÄrfot pÄrlÅ«kprogrammÄ, es beidzot atradu paÅ”u pieprasÄ«jumu un adresÄtu. Iet:
Dialogs ar terminÄli
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.
Äau. Hehehe. PatieÅ”Äm, tas ir tas, ko es gaidÄ«ju, nosÅ«tot tukÅ”u HTTP pieprasÄ«jumu uz HTTPS portu. Vai mums tagad vajadzÄtu Å”ifrÄt? Visa Ŕī kÅada ar RSA taustiÅiem, pÄc tam ar SHA256. KÄpÄc, ir OpenSSL par tÄdÄm lietÄm. MÄs jau zinÄm, kÄ rÄ«koties, vispirms noÅemsim laukus Referer un Cookie ā es domÄju, ka tie Å”o lietu Ä«paÅ”i neietekmÄs:
Dialogs ar terminÄli
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
Kas tas par zvÄrestu serverÄ«? Nu vismaz man atbildÄja 200 OK, kas nozÄ«mÄ, ka sÄ«kdatnes un novirzÄ«tÄjs neko neietekmÄ. SaspieÅ”ana ir gzip, bet, kopÄjot, tiek kopÄtas ASCII rakstzÄ«mes. TieÅ”i tÄ, jÅ«s varat noÅemt lÄ«niju PieÅemt-kodÄjums. Viss kÄrtÄ«bÄ ā iegÅ«stam HTML dokumentu, tagad ar asonancÄm. Bet Å”eit ir divi jautÄjumi: kÄ palaist OpenSSL un pÄrsÅ«tÄ«t datus uz to, izmantojot skriptu? Un kÄ nolasÄ«t izvadi, ja pÄc atbildes saÅemÅ”anas mÄs it kÄ paliekam OpenSSL āÄaulÄā? Ja ar otro var kaut ko izdomÄt, bet ar pirmo...
Labi, ka ir Habrkur es lasÄ«ju par lietderÄ«bu gaidÄ«t, kas automatizÄ mijiedarbÄ«bas procesu ar programmÄm, kas sagaida cilvÄka mijiedarbÄ«bu. Komandas izveide ir vÄl pievilcÄ«gÄka automÄtiski gaidÄ«t, Ä£enerÄjot gaidÄ«t skripts, pamatojoties uz jÅ«su darbÄ«bÄm. Nu, mÄs to palaižam, darÄm to visu, un Å”eit ir gatavais skripts. Tikai viÅÅ” ir ļoti milzÄ«gs, un viss tÄpÄc OpenSSL parÄda sertifikÄtus, atslÄgas un gaidÄ«t gaida Ŕī visa iznÄkumu. Vai mums tas ir vajadzÄ«gs? NÄ. MÄs noÅemam visu pirmo uzvedni, atstÄjot tikai pÄdÄjo rindiÅas pÄrtraukumu ārā. MÄs arÄ« noÅemam no pieprasÄ«juma laukus User-Agent un Accept ā tie neko neietekmÄ. TÄtad, sÄksim. Skripts tika izpildÄ«ts, bet kur ir vÄrtÄ«gais HTML dokuments? GaidÄ«t Äda to. Lai viÅÅ” to izspļautu, jums jÄievieto:
set results $expect_out(buffer)
pirms skripta beigÄm - Å”Ädi tiks rakstÄ«ta izpildÄmÄ faila izvade gaidÄ«t'om komandu un tiek parÄdÄ«ts ekrÄnÄ. RezumÄjot, kaut kas lÄ«dzÄ«gs Å”im:
gaidīt skriptu
#!/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
Bet tas vÄl nav viss! KÄ redzat, visos piemÄros pieprasÄ«juma URL bija statisks, taÄu tas ir vietrÄdis URL, kas ir atbildÄ«gs par to, kurÅ” vÄrds tiks saistÄ«ts ar asonansÄm. Un tÄ izrÄdÄs, ka mÄs pastÄvÄ«gi meklÄsim vÄrdu ā%d0%b7%d0%b4%d0%b5%d1%81%d1%8cā ASCII vai āÅ”eitā UTF-8. Ko darÄ«t? Protams, vienkÄrÅ”i katru reizi Ä£enerÄjiet jaunu skriptu, draugi! Vairs ne automÄtiski gaidÄ«tAk, un ar palÄ«dzÄ«bu palaist garÄm, jo MÅ«su jaunajÄ nekas nemainÄs, izÅemot vÄrdu. Un lai dzÄ«vo jaunÄ problÄma: kÄ mÄs varam gudri pÄrtulkot vÄrdu no kirilicas URL formÄtÄ? ArÄ« terminÄlim nekas Ä«paÅ”s nav. Nu labi, mÄs to varam, vai ne? Var:
Paskaties, ko es varu darīt!
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')}
KopumÄ mums ir skripts, kas pÄrvÄrÅ” vÄrdu ASCII tekstÄ, Ä£enerÄjot citu skriptu, kas pieprasa vietnes lapu ar asonancÄm no servera, izmantojot OpenSSL. Un tad mÄs novirzÄm pÄdÄjÄ skripta izvadi uz failu un vecmodÄ«gÄ veidÄ izlaižam to cauri
Daudzu krustojums. ApakÅ”ÄjÄ lÄ«nija
PatiesÄ«bÄ tas ir tas, kas rada vismazÄkÄs problÄmas. MÄs veicam iepriekÅ” minÄtÄs procedÅ«ras diviem vÄrdiem, pÄc tam no diviem sarakstiem salÄ«dzinÄm katru vÄrdu ar katru un, ja tiek atrasta atbilstÄ«ba, mÄs to izvadÄm. Tagad mums ir skripts, kas izmanto divus vÄrdus kÄ ievadi un parÄda sarakstu ar vÄrdiem, kas sasaucas ar abiem, pat Åemot vÄrÄ asonanses, un tas viss, manuÄli nepÄrslÄdzoties starp ÄetrÄm cilnÄm un neatceroties vÄrdus āar aciā ā visi ir savÄkti, uzskaitÄ«ti. par un automÄtiski izmests. BrÄ«niŔķīgi.
Å Ä«s publikÄcijas mÄrÄ·is bija parÄdÄ«t, ka, ja cilvÄkam kaut ko vajag, viÅÅ” to tik un tÄ izdarÄ«s. Ä»oti neefektÄ«vi, greizi, rÄpojoÅ”i, bet derÄs.
Avots: www.habr.com