Dè as urrainn do eanchainn oileanach ionnsachadh mu shaoghal a’ choimpiutair?

Kind time of day.

An dèidh dhomh sgriobt eile a sgrìobhadh ann am Bash, thuig mi gum bu chòir a h-uile dad a bhith gu tur eadar-dhealaichte, ach dh’ obraich a h-uile càil. Tha mi airson sealltainn dhut dè na mì-mhisneachd agus na cnapan-starra a sgrìobh mi gus an duilgheadas fhuasgladh, ach nach eil carbad eòlais agam fhathast. Ann am faclan eile, caricature de phrògramadh.

Amas


Dh'fhàs rudeigin riatanach airson:

  • Nochd iomadh rann airson an fhacail, ach a-mhàin ceàrnagan
  • Chaidh e tarsainn air iomadach rann de dhà fhacal

Airson dè? Uill, sin agad e - agus sin e.
Cò aig nach eil fios, tha rann ceàrnagach (ann an co-theacsa cumanta - ceàrnag) dà fhacal aig a bheil an dà litir mu dheireadh san litreachadh a’ tighinn còmhla, a tha (gu tric, is e seo an aon rud) a’ toirt rann dhaibh. Mar eisimpleir, tha ròsan a 'reothadh; taidhir - car. Chan eil cleachdadh cheàrnagan ann an tionndadh an latha an-diugh air aontachadh gu sònraichte le daoine, air sgàth cho cudromach sa tha iad.

co-dhùnadh


Bha e coltach riumsa gur e am fuasgladh as sìmplidh sgriobt a sgrìobhadh ann am Bash a bhios a’ cleachdadh gineadair rann a th’ ann mar-thà - HOST, a bhios gu sònraichte gan taghadh le co-chòrdadh, agus chan ann le litreachadh. Dè an seòrsa HOST? Oir ma chomharraicheas tu fìor ainm na làraich, canaidh iad gur e sanas a th’ ann. Carson nach lean thu ga chleachdadh? An toiseach, a dh’aindeoin a’ bhuannachd a th’ aige ann a bhith a’ taghadh rannan stèidhichte air connragan, bidh e fhathast a’ dèanamh cheàrnagan gu tric. San dàrna h-àite, feumaidh tu fhathast smaoineachadh leis an eanchainn agad, ùine a chaitheamh ag atharrachadh eadar tabaichean, agus lùth a’ cuimhneachadh fhaclan a-rithist ann an liostaichean gus rann a lorg airson dà fhacal.

A' faighinn rannan làidir

Dè tha fios agam? Tha fios agam mun ghoireas s an Iar-, a luchdaicheas sìos an duilleag aig an URL ainmichte. Ceart gu leòr, leig leinn an t-iarrtas a chuir an gnìomh - gheibh sinn duilleag HTML ann am faidhle air a bheil ainm le facal rann. Mar eisimpleir, lorgaidh sinn am facal “an seo”:

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

Ach chan fheum mi ach liosta fhaclan, ciamar a gheibh mi cuidhteas a h-uile càil eile? Bidh sinn a’ coimhead agus a’ faicinn gu bheil liosta nam faclan ann an cruth, ge bith dè cho neònach sa dh’ fhaodadh e a bhith, ann an cruth liosta, agus tha na faclan ann an tagaichean . Uill, tha goireas fìor mhath againn. agus - sgrìobhamaid sìos e mar seo:

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

An toiseach, bhon fhaidhle facal, tagh na loidhnichean anns a bheil an taga - gheibh sinn dòrlach de thagaichean falamh agus loidhnichean le faclan. Bheir sinn air falbh an taga fhèin agus am fear dùnaidh aige - an seo thathas a’ cleachdadh sa cheud samhlaidhean an àite slashes oir anns an taga fhèin tha slash ann mu thràth, carson? agus chan eil e gad thuigsinn beagan. Agus tha a h-uile dad gu math le ùidh. Bidh sinn a 'toirt air falbh a h-uile àite bhon fhaidhle, a' toirt air falbh loidhnichean falamh. Voila - liosta fhaclan deiseil.

Gus faclan a tha rannan a thoirt air falbh a’ cleachdadh nan litrichean mu dheireadh, tagh an dà litir mu dheireadh bhon fhacal thùsail agus soilleir an liosta:

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

Bidh sinn a’ coimhead, bidh sinn a’ feuchainn - tha a h-uile càil ag obair... mar sin, càite a bheil an liosta airson an fhacail “cluich”? Agus airson an fhacail "Tha mi a 'dol"? Tha am faidhle falamh! Agus tha seo uile air sgàth gur e gnìomhairean a th’ anns na faclan seo, agus tha fios againn dè a nì iad dhaibhsan a bhios a’ rannan le gnìomhairean. Tha rann gnìomhair nas miosa na eadhon rann ceàrnagach, oir tha an àireamh as motha de ghnìomhairean aig a’ chànan Ruiseanach, agus tha na h-aon crìochnachaidhean aca uile, agus is e sin as coireach nach robh iad anns an fhaidhle mu dheireadh às deidh sgrùdadh a dhèanamh air na crìochnachaidhean.

Ach, chan eil sinn ann an cabhag. Airson gach facal tha chan e a-mhàin rannan, ach cuideachd assonances, a tha uaireannan a 'fuaimneachadh mòran nas fheàrr na rann - is e sin as coireach gu bheil iad nan assonances (assonance Frangach, bhon Laideann assono - tha mi a' fuaimneachadh ann an co-sheirm).

Bidh sinn a 'faighinn co-dhùnaidhean

Seo far a bheil an spòrs a’ tòiseachadh: nochdaidh assonances aig URL air leth, agus air an aon duilleag, le bhith a’ cur an gnìomh sgriobt, a’ cur iarrtas HTTP agus a’ faighinn freagairt. Ciamar as urrainn dhomh a ràdh s an Iar-‘Am brùth thu am putan? Ach chan eil dòigh. Gu muladach.

A’ mothachadh gu robh an URL san loidhne ag atharrachadh dòigh air choireigin, rinn mi leth-bhreac de na bha ann às deidh dhomh atharrachadh gu assonances agus chuir mi a-steach e ann an taba brobhsair ùr - dh’ fhosgail rannan làidir. Chan e sin.

Gu bunaiteach, shaoil ​​​​mi, cha bu chòir gum biodh e gu diofar don t-seirbheisiche a bheil an sgriobt a chuir an t-iarrtas air a chuir gu bàs, no a bheil an neach ga sheòrsa le làimh. Mar sin? Cò aig tha fios, leig dhuinn sùil a thoirt air.

Càite an cuir thu? Dè a chur? Iarrtas HTTP gu IP an fhrithealaiche, tha rudeigin mar GET ... an uairsin tha rudeigin HTTP / 1.1... Feumaidh sinn faicinn dè tha am brabhsair a 'cur agus càite. Stàladh uèirichean, thoir sùil air an trafaic:

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... dè? O tha, tha HTTPS againn. Dè a nì thu? Cuir air bhog ionnsaigh MITM ort fhèin? Mas fheàrr, cuidichidh an neach-fulang fhèin sinn.

San fharsaingeachd, an dèidh co-dhùnadh a bhith a 'surfadh air a' bhrabhsair, lorg mi mu dheireadh an t-iarrtas fhèin agus an neach-seòlaidh. Rach:

Còmhradh leis an 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.

Hi. Hehehe. Gu dearbh, is e sin a bha mi an dùil nuair a chuir mi iarrtas HTTP lom gu port HTTPS. Am bu chòir dhuinn crioptachadh a-nis? A h-uile càil seo le iuchraichean RSA, an uairsin le SHA256. Carson, tha OpenSSL airson rudan mar sin. Uill, tha fios againn mu thràth dè a nì sinn, bheir sinn air falbh na raointean Referer and Cookie an-toiseach - tha mi a ’smaoineachadh nach toir iad mòran buaidh air a’ chùis:

Còmhradh leis an 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

Dè as urrainn do eanchainn oileanach ionnsachadh mu shaoghal a’ choimpiutair?

Dè tha seo, a 'mionnachadh air an fhrithealaiche? Uill, co-dhiù fhreagair iad mi 200 OK, a tha a 'ciallachadh nach eil briosgaidean agus an neach-iomraidh a' toirt buaidh air rud sam bith. Is e gzip a th’ ann an teannachadh, ach nuair a thathar a’ dèanamh lethbhreac, thèid caractaran ASCII a chopaigeadh. Gu dearbh, faodaidh tu an loidhne a thoirt air falbh Glac-còdachadh. Tha a h-uile dad gu math - gheibh sinn sgrìobhainn HTML, a-nis le dearbhaidhean. Ach seo dà cheist: mar a ruitheas tu OpenSSL agus a ghluaiseas tu dàta thuige a’ cleachdadh sgriobt? Agus ciamar a leughas tu an toradh ma tha sinn an dèidh dhuinn am freagairt fhaighinn, mar gum biodh, ann an “slige” OpenSSL? Mas urrainn dhut rudeigin a chruthachadh leis an dàrna fear, ach leis a’ chiad fhear ...

Tha e math gu bheil Habrfar an do leugh mi mun ghoireas sùileachadh, a nì fèin-ghluasad air a’ phròiseas eadar-obrachadh le prògraman a tha an dùil eadar-obrachadh daonna. Tha e eadhon nas tarraingiche sgioba a bhith agad fèin-dùil, gineadh sùileachadh sgriobt stèidhichte air na gnìomhan agad. Uill, bidh sinn ga chuir air bhog, dèan seo uile agus seo an sgriobt crìochnaichte. A-mhàin tha e glè mhòr, agus a h-uile sgàth OpenSSL a’ taisbeanadh theisteanasan, iuchraichean, agus sùileachadh a’ feitheamh ri toradh seo uile. A bheil feum againn air seo? Chan eil. Bidh sinn a’ toirt air falbh a’ chiad sgiobalta gu lèir, a’ fàgail dìreach a’ bhriseadh loidhne mu dheireadh ‘r’. Bidh sinn cuideachd a’ toirt air falbh na raointean Cleachdaiche-Agent and Accept bhon iarrtas againn - chan eil iad a’ toirt buaidh air rud sam bith. Mar sin, leig dhuinn a chuir air bhog. Chaidh an sgriobt a chur gu bàs, ach càite a bheil an sgrìobhainn HTML luachmhor? A 'dùileachadh dh'ith e. Gus toirt air a spionadh a-mach, feumaidh tu a chuir:

set results $expect_out(buffer)

ro dheireadh an sgriobt - seo mar a thèid toradh an gnìomh a sgrìobhadh sùileachadh'om command agus air a thaisbeanadh air an sgrion. Ann an geàrr-chunntas, rudeigin mar seo:

an dùil ri sgriobt

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

Ach chan e sin uile! Mar a chì thu, anns a h-uile eisimpleir bha URL an iarrtais statach, ach is e an URL a tha an urra ris an fhacal a bhios co-cheangailte ri assonances. Agus mar sin tha e a’ tionndadh a-mach gum bi sinn an-còmhnaidh a’ lorg an fhacail “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” ann an ASCII no “an seo” ann an UTF-8. Dè a nì thu? Gu dearbh, dìreach cruthaich sgriobt ùr a h-uile uair, a charaidean! Chan eil tuilleadh fèin-dùil' oh, agus le còmhnadh echo, oir Anns an ùr againn, chan eil dad ag atharrachadh ach am facal. Agus fada beò an duilgheadas ùr: ciamar as urrainn dhuinn facal eadar-theangachadh bho Cyrillic gu cruth URL? Chan eil dad sònraichte ann airson an inneal-crìochnachaidh nas motha. Uill, tha e ceart gu leòr, is urrainn dhuinn a dhèanamh, ceart? An urrainn:

Seall dè as urrainn dhomh a dhèanamh!

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

Gu h-iomlan, tha sgriobt againn a dh ’atharraicheas facal gu teacsa ASCII, a’ gineadh sgriobt eile a dh ’iarras duilleag làrach le fiosan bhon fhrithealaiche tro OpenSSL. Agus an uairsin bidh sinn ag ath-stiùireadh toradh an sgriobt mu dheireadh gu faidhle agus, san t-seann dòigh, ga thoirt troimhe «фильтры» ceàrnagan a bharrachd agus sgrìobh iad chun fhaidhle.

Eadar-ghearradh de mhòran. Bun-loidhne

Gu dearbh, is e seo dìreach a tha ag adhbhrachadh na duilgheadasan as lugha. Bidh sinn a’ coileanadh na modhan gu h-àrd airson dà fhacal, an uairsin bhon dà liosta bidh sinn a’ dèanamh coimeas eadar gach facal le gach fear agus ma lorgar maids, bidh sinn ga chuir a-mach. A-nis tha sgriobt againn a bheir dà fhacal mar chur-a-steach agus a tha a’ taisbeanadh liosta fhaclan a tha a’ rannan leis an dà chuid, agus eadhon a’ toirt aire do cho-aontaran, agus seo uile gun a bhith ag atharrachadh le làimh eadar ceithir tabaichean agus a’ cuimhneachadh faclan “le sùil” - uile air an cruinneachadh, air an cunntadh. airson agus air a thilgeil air falbh gu fèin-ghluasadach. Gu h-iongantach.

B’ e adhbhar an fhoillseachaidh seo sealltainn ma tha feum aig duine air rudeigin, gun dèan e co-dhiù. Gu math neo-èifeachdach, cam, cianail, ach obraichidh e.

Source: www.habr.com

Cuir beachd ann