Компьютерийн ертөнцийн талаар суралцаж буй оюутны тархи ямар чадвартай вэ?

Өдрийн төрөл.

Баш дээр өөр скрипт бичиж дуусгасны дараа би бүх зүйл тэс өөр байх ёстой гэдгийг ойлгосон, гэхдээ бүх зүйл үр дүнтэй болсон. Одоохондоо тэргэнцэр мэдлэггүй мөртлөө асуудлыг шийдэхийн тулд ямар садар самуун, суга таяг бичсэнээ харуулах гэсэн юм. Өөрөөр хэлбэл програмчлалын шог зураг.

Зорилго


Ямар нэг зүйл шаардлагатай болсон:

  • Дөрвөлжин тэмдэгтээс бусад үгийн олон шүлгийг харуулсан
  • Хоёр үгийн олон шүлгийг давсан

Юуны төлөө? За, тэгээд л боллоо - тэгээд л болоо.
Хэн мэдэхгүй, дөрвөлжин холбоц (нийтлэг хэллэгээр - дөрвөлжин) гэдэг нь үсгийн сүүлийн хоёр үсэг нь давхцдаг хоёр үг (ихэнхдээ энэ нь цорын ганц зүйл) тэднийг холбогч болгодог. Жишээлбэл, сарнай нь хүйтэн жавартай; дугуй - машин. Орчин үеийн хувилбарт дөрвөлжин ашиглах нь анхдагч байдлаасаа болж хүмүүс төдийлөн зөвшөөрөөгүй байна.

шийдвэр


Хамгийн энгийн шийдэл бол Bash хэл дээр аль хэдийн байгаа холбогч үүсгэгч - HOST-ыг ашигладаг скрипт бичих явдал юм шиг санагдаж байсан бөгөөд энэ нь үндсэндээ үсгийн алдаагаар биш харин гийгүүлэгчээр сонгодог. Ямар HOST вэ? Учир нь тухайн сайтын жинхэнэ нэрийг зааж өгвөл сурталчилгаа гэж хэлнэ. Яагаад үүнийг үргэлжлүүлэн ашиглаж болохгүй гэж? Нэгдүгээрт, гийгүүлэгч дээр тулгуурлан шүлэг сонгох давуу талтай ч тэрээр ихэвчлэн квадрат үүсгэдэг. Хоёрдугаарт, та хоёр үгэнд тохирсон холбоц олохын тулд тархиа бодож, таб хооронд шилжихэд цаг зарцуулж, жагсаалтаас давтагдсан үгсийг цээжлэх хэрэгтэй.

Хүчтэй шүлэг авах

Би юу мэдэх вэ? Хэрэглээний талаар би мэднэ wget, энэ нь заасан URL дээр хуудсыг татаж авдаг. За, хүсэлтийг биелүүлцгээе - бид холбогч үгээр нэрлэгдсэн файлд HTML хуудсыг авна. Жишээлбэл, "энд" гэсэн үгийг хайж үзье:

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

Гэхдээ надад зөвхөн үгийн жагсаалт л хэрэгтэй, бусад бүх зүйлээс яаж салах вэ? Үгсийн жагсаалт нь хэчнээн хачирхалтай байсан ч гэсэн жагсаалт хэлбэрээр форматлагдсан, үг нь шошгон дээр байгааг бид харж, харж байна. . За, бидэнд маш сайн хэрэгсэл байна. sed - үүнийг ингэж бичье:

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

Эхлээд word файлаас тагийг агуулсан мөрүүдийг сонгоно - бид олон тооны хоосон шошго, үгтэй мөрүүдийг авдаг. Бид шошгыг өөрөө болон түүний хаалтын хэсгийг устгадаг - энд ташуу зураасны оронд хувийн тэмдэглэгээг ашигладаг, учир нь шошго өөрөө аль хэдийн налуу зураас байна, яагаад? sed чамайг жаахан ойлгохгүй байна. Мөн хүүгийн хувьд бүх зүйл сайхан байна. Бид файлаас бүх зайг устгаж, хоосон мөрүүдийг арилгана. Voila - үгсийн бэлэн жагсаалт.

Сүүлийн үсгийг ашиглан холбосон үгсийг арилгахын тулд эх үгнээс сүүлийн хоёр үсгийг сонгоод жагсаалтыг арилгана уу.

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

Бид харж байна, бид хичээж байна - бүх зүйл ажилладаг ... тэгвэл "тоглох" гэсэн үгийн жагсаалт хаана байна? "Би явлаа" гэдэг үгийн хувьд? Файл хоосон байна! Эдгээр үгс нь үйл үг бөгөөд үйл үгтэй холбогчдод юу хийдгийг бид мэднэ. Үйл үгийн холбогч нь дөрвөлжин холбогчоос ч дор, учир нь орос хэл хамгийн олон үйл үгтэй, бүгд ижил төгсгөлтэй байдаг тул төгсгөлийг шалгаад эцсийн файлд байгаагүй.

Гэсэн хэдий ч бид яарахгүй байна. Үг бүрийн хувьд зөвхөн холбогч биш, бас ассонанс байдаг бөгөөд энэ нь заримдаа холбоцоос хамаагүй дээр сонсогддог - тийм ч учраас эдгээр нь ассонанс юм (Францын ассонанс, Латин ассоно - Би зохицсон сонсогддог).

Бид ассонанс авдаг

Эндээс л хөгжилтэй эхэлдэг: скрипт ажиллуулж, HTTP хүсэлт илгээж, хариу хүлээн авснаар ассонансууд тусдаа URL дээр гарч ирдэг бөгөөд нэг хуудсан дээр гарч ирдэг. Би яаж хэлэх вэ wget'Чи товчлуурыг дардаг уу? Гэхдээ арга ч үгүй. Харамсалтай нь.

Мөр дэх URL ямар нэгэн байдлаар өөрчлөгдөж байгааг анзаарч, би ассонанс руу шилжсэний дараа тэнд байгаа зүйлийг хуулж, шинэ хөтчийн таб дээр буулгасан - хүчтэй rhymes нээгдэв. Тийм биш.

Үнэн хэрэгтээ, хүсэлтийг илгээж буй скриптийг гүйцэтгэсэн эсэх, эсвэл тухайн хүн гараар бичсэн эсэх нь серверт хамаагүй байх ёстой гэж би бодлоо. Тэгэхээр? Хэн мэдлээ, очиж шалгая.

Хаашаа явуулах вэ? Юу илгээх вэ? HTTP хүсэлт серверийн IP, GET гэх мэт зүйл байна ... дараа нь HTTP/1.1 ямар нэг зүйл байна ... Бид хөтөч юу илгээдэг, хаана байгааг харах хэрэгтэй. Суулгах wireshark, замын хөдөлгөөнийг харна уу:

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

Аан... юу? Тийм ээ, бидэнд HTTPS байна. Юу хийх вэ? Өөртөө MITM халдлага хийх үү? Хамгийн сайн нь хохирогч өөрөө бидэнд туслах болно.

Ерөнхийдөө хөтөч дээр аялахаар шийдсэний дараа би хүсэлтийг өөрөө болон хүлээн авагчийг олсон. Явах:

Терминалтай харилцах

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.

Хөөе. хэхэ. Үнэн хэрэгтээ, HTTPS порт руу нүцгэн HTTP хүсэлт илгээхдээ би үүнийг хүлээж байсан. Бид одоо шифрлэх ёстой юу? Энэ бүхэн RSA товчлуурууд, дараа нь SHA256-тай холбоотой. Яагаад, байдаг OpenSSL ийм зүйлийн төлөө. За, бид юу хийхээ аль хэдийн мэдэж байгаа, бид эхлээд Referer болон Cookie талбаруудыг устгах болно - Тэд асуудалд тийм ч их нөлөөлөхгүй гэж бодож байна:

Терминалтай харилцах

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

Компьютерийн ертөнцийн талаар суралцаж буй оюутны тархи ямар чадвартай вэ?

Энэ юу вэ, сервер дээр харааж байна уу? Ядаж л тэд надад 200 OK гэж хариулсан нь күүки болон лавлагаа нь юунд ч нөлөөлөхгүй гэсэн үг. Шахалт нь gzip боловч хуулах үед ASCII тэмдэгтүүдийг хуулдаг. Яг л та мөрийг арилгаж болно Зөвшөөрөх-кодлох. Бүх зүйл сайхан байна - бид HTML баримт бичгийг хүлээн авлаа. Гэхдээ энд хоёр асуулт байна: OpenSSL-г хэрхэн ажиллуулж, скрипт ашиглан өгөгдөл дамжуулах вэ? Хариултыг хүлээн авсны дараа бид OpenSSL "бүрхүүл" -тэй адил хэвээр байвал гаралтыг хэрхэн унших вэ? Хэрэв та хоёр дахь нь ямар нэг зүйлийг гаргаж чадвал эхнийх нь ...

Байсан нь сайн хэрэг ХабрХэрэглээний талаар би уншсан хүлээж байна, энэ нь хүний ​​харилцан үйлчлэлийг хүлээж буй програмуудтай харилцах үйл явцыг автоматжуулдаг. Багтай байх нь бүр ч сэтгэл татам автоматаар хүлээлт, үүсгэх хүлээж байна таны үйлдэл дээр үндэслэсэн скрипт. За, бид үүнийг эхлүүлж, энэ бүгдийг хий, энд бэлэн скрипт байна. Зөвхөн тэр маш том бөгөөд бүх учир нь OpenSSL гэрчилгээ, түлхүүр, болон харуулна хүлээж байна энэ бүхний үр дүнг хүлээж байна. Энэ бидэнд хэрэгтэй юу? Үгүй Бид эхний мөрийг бүхэлд нь устгаж, зөвхөн сүүлчийн мөр таслах 'r' үлдээдэг. Бид мөн манай хүсэлтээс Хэрэглэгч-Агент болон Зөвшөөрөх талбаруудыг хасдаг - тэдгээр нь юунд ч нөлөөлөхгүй. За, эхлүүлцгээе. Скриптийг гүйцэтгэсэн, гэхдээ үнэт HTML баримт хаана байна? хүлээх идсэн. Түүнийг нулимахын тулд та дараахь зүйлийг хийх хэрэгтэй.

set results $expect_out(buffer)

скрипт дуусахаас өмнө - гүйцэтгэгдэх файлын гаралтыг ингэж бичнэ хүлээж байна'om командыг өгч дэлгэцэн дээр харуулна. Дүгнэж хэлэхэд иймэрхүү зүйл:

скрипт хүлээж байна

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

Гэхдээ энэ нь бүгд биш юм! Таны харж байгаагаар бүх жишээн дээр хүсэлтийн URL нь статик байсан боловч аль үг нь ассонанстай холбогдохыг хариуцдаг URL юм. Тиймээс бид ASCII дээр "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" эсвэл UTF-8 дээр "энд" гэсэн үгийг байнга хайж байх болно. Юу хийх вэ? Мэдээжийн хэрэг, зүгээр л нэг удаа шинэ скрипт үүсгэнэ үү, найзуудаа! Дахиж үгүй автоматаар хүлээлт'Өө, мөн тусламжтайгаар Echo, учир нь Манай шинэд үгнээс өөр юу ч өөрчлөгддөггүй. Мөн шинэ асуудал урт наслаарай: бид кириллээс үгийг URL формат руу хэрхэн ухаалгаар орчуулах вэ? Терминал дээр бас онцгой зүйл байхгүй. За, зүгээр, бид үүнийг хийж чадна, тийм үү? Чадна:

Би юу хийж чадахыг хараач!

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

Нийтдээ бид үгийг ASCII текст болгон хөрвүүлдэг скрипттэй бөгөөд OpenSSL-ээр дамжуулан серверээс ассонанс бүхий сайтын хуудсыг хүссэн өөр скрипт үүсгэдэг. Дараа нь бид сүүлчийн скриптийн гаралтыг файл руу дахин чиглүүлж, хуучин аргаар дамжуулдаг. "шүүлтүүрүүд" нэмэлт квадратуудыг авч файлд бичнэ үү.

Олон хүний ​​уулзвар. Доод шугам

Үнэндээ энэ бол хамгийн бага асуудал үүсгэдэг зүйл юм. Бид дээрх процедурыг хоёр үгээр хийж, дараа нь хоёр жагсаалтаас үг бүрийг тус бүртэй нь харьцуулж, тохирох нь олдвол гаргана. Одоо бид хоёр үгийг оролт болгон авч, хоёуланд нь тохирох үгсийн жагсаалтыг харуулдаг скрипттэй байна, тэр ч байтугай ассонансуудыг харгалзан үзсэн бөгөөд энэ бүгдийг гараар дөрвөн таб хооронд сэлгэхгүйгээр, "нүдээр" гэсэн үгсийг санахгүйгээр цуглуулсан. автоматаар тооцож, устгадаг. Гайхалтай.

Энэ нийтлэлийн зорилго нь хүнд ямар нэгэн зүйл хэрэгтэй бол тэр үүнийг хийх болно гэдгийг харуулах явдал байв. Маш үр дүнгүй, муруй, мөлхөгч, гэхдээ энэ нь ажиллах болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх