Apa kemampuan otak seorang siswa yang mempelajari dunia komputer?

Selamat sore.

Setelah selesai menulis skrip lain di Bash, saya menyadari bahwa semuanya seharusnya benar-benar berbeda, tetapi semuanya berhasil. Saya ingin menunjukkan kepada Anda kata-kata kotor dan kruk apa yang saya tulis untuk menyelesaikan masalah, tetapi belum memiliki pengetahuan. Dengan kata lain, karikatur pemrograman.

Tugas


Sesuatu menjadi perlu untuk:

  • Ditampilkan banyak sajak untuk kata tersebut, kecuali kotak
  • Melewati banyak sajak dari dua kata

Untuk apa? Ya, itu saja - dan itu saja.
Siapa yang tidak tahu, sajak persegi (dalam bahasa umum - persegi) adalah dua kata yang dua huruf terakhirnya bertepatan dalam ejaan, yang (seringkali, ini satu-satunya) menjadikannya sebuah sajak. Misalnya, mawar sangat dingin; ban - mobil. Penggunaan kotak dalam versi modern tidak terlalu disetujui oleh orang-orang, karena sifatnya yang primitif.

keputusan


Bagi saya, solusi paling sederhana adalah dengan menulis skrip di Bash yang menggunakan generator sajak yang sudah ada - HOST, yang terutama memilihnya berdasarkan konsonan, dan bukan berdasarkan ejaan. TUAN RUMAH yang seperti apa? Karena jika Anda menyebutkan nama asli situs tersebut, mereka akan mengatakan bahwa itu adalah iklan. Mengapa tidak terus menggunakannya? Pertama, meski memiliki kelebihan dalam memilih rima berdasarkan konsonan, ia masih sering menghasilkan kotak. Kedua, Anda masih harus berpikir dengan otak, menghabiskan waktu berpindah antar tab, dan energi menghafal kata-kata yang berulang dalam daftar untuk menemukan sajak untuk dua kata.

Mendapatkan sajak yang kuat

Apa yang aku tahu? Saya tahu tentang utilitasnya wget, yang mengunduh halaman di URL yang ditentukan. Oke, mari kita jalankan permintaannya - kita mendapatkan halaman HTML dalam file yang diberi nama dengan kata berima. Misalnya, mari kita cari kata “di sini”:

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

Tapi saya hanya butuh daftar kata, bagaimana cara menghilangkan yang lainnya? Kami melihat dan melihat bahwa daftar kata diformat, betapapun anehnya, dalam bentuk daftar, dan kata-kata tersebut ada dalam tag . Ya, kami memiliki kegunaan yang hebat. sed - mari kita tuliskan seperti ini:

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

Pertama, dari file word, pilih baris yang berisi tag — kami mendapatkan banyak tag dan baris kosong dengan kata-kata. Kami menghapus tag itu sendiri dan tag penutupnya - di sini simbol persen digunakan sebagai pengganti garis miring karena dalam tag itu sendiri sudah ada garis miringnya, kenapa? sed tidak memahamimu sedikit pun. Dan semuanya baik-baik saja dengan minat. Kami menghapus semua spasi dari file, menghapus baris kosong. Voila - daftar kata yang sudah jadi.

Untuk menghapus kata-kata yang berima menggunakan huruf terakhir, pilih dua huruf terakhir dari kata aslinya dan kosongkan daftarnya:

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

Kami melihat, kami mencoba - semuanya berfungsi... jadi, di mana daftar kata "bermain"? Dan untuk kata “Aku pergi”? Filenya kosong! Dan ini semua karena kata-kata ini adalah kata kerja, dan kita tahu apa pengaruhnya terhadap mereka yang berima dengan kata kerja. Sajak kata kerja lebih buruk daripada sajak persegi, karena bahasa Rusia memiliki kata kerja paling banyak, dan semuanya memiliki akhiran yang sama, itulah sebabnya kata kerja tersebut tidak ada di file akhir setelah memeriksa bagian akhirnya.

Namun, kami tidak terburu-buru. Untuk setiap kata tidak hanya ada sajak, tetapi juga asonansi, yang terkadang terdengar jauh lebih baik daripada sajak - itulah mengapa mereka adalah asonansi (asonansi Prancis, dari bahasa Latin assono - saya terdengar selaras).

Kami mendapatkan asonansi

Di sinilah kesenangan dimulai: asonansi muncul di URL terpisah, dan di halaman yang sama, dengan menjalankan skrip, mengirimkan permintaan HTTP, dan menerima respons. Bagaimana saya bisa mengatakannya wget'Apakah kamu menekan tombolnya? Tapi tidak mungkin. Dengan sedih.

Memperhatikan bahwa URL di baris itu entah bagaimana berubah, saya menyalin apa yang ada di sana setelah beralih ke asonance dan menempelkannya di tab browser baru - sajak yang kuat terbuka. Tidak.

Pada dasarnya, menurut saya, tidak menjadi masalah bagi server apakah skrip yang mengirimkan permintaan tersebut dijalankan, atau apakah orang tersebut mengetiknya dengan tangan. Jadi? Siapa tahu, ayo kita periksa.

Dikirim kemana? Apa yang harus dikirim? Permintaan HTTP ke IP server, ada sesuatu seperti GET... lalu ada sesuatu HTTP/1.1... Kita perlu melihat apa yang dikirim browser dan ke mana. Install wireshark, lihat lalu lintas:

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... apa? Oh ya, kami memiliki HTTPS. Apa yang harus dilakukan? Luncurkan serangan MITM pada diri Anda sendiri? Idealnya, korban sendirilah yang akan membantu kita.

Secara umum, setelah memutuskan untuk menjelajahi browser, saya akhirnya menemukan permintaan itu sendiri dan penerimanya. Pergi:

Dialog dengan 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.

Hai. Hehehe. Memang, itulah yang saya harapkan ketika mengirim permintaan HTTP ke port HTTPS. Haruskah kita mengenkripsi sekarang? Semua keributan ini dengan kunci RSA, lalu dengan SHA256. Ya, ada OpenSSL untuk hal-hal seperti itu. Ya, kita sudah tahu apa yang harus dilakukan, kita hapus saja kolom Referer dan Cookie terlebih dahulu - menurut saya hal tersebut tidak akan terlalu memengaruhi masalah ini:

Dialog dengan 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

Apa kemampuan otak seorang siswa yang mempelajari dunia komputer?

Apa ini, bersumpah pada server? Setidaknya mereka menjawab saya 200 OK, yang berarti cookie dan perujuk tidak mempengaruhi apa pun. Kompresinya adalah gzip, tetapi saat menyalin, karakter ASCII disalin. Tepatnya, Anda dapat menghapus garis tersebut Terima-enkode. Semuanya baik-baik saja - kami mendapatkan dokumen HTML, sekarang dengan asonansi. Namun ada dua pertanyaan di sini: bagaimana cara menjalankan OpenSSL dan mentransfer data ke dalamnya menggunakan skrip? Dan bagaimana cara membaca outputnya jika setelah menerima respons kita seolah-olah tetap berada dalam "shell" OpenSSL? Jika Anda dapat menemukan sesuatu dengan yang kedua, tetapi dengan yang pertama...

Bagus kalau ada Habrdi mana saya membaca tentang utilitas mengharapkan, yang mengotomatiskan proses interaksi dengan program yang mengharapkan interaksi manusia. Memiliki tim bahkan lebih menarik harapkan otomatis, menghasilkan mengharapkan skrip berdasarkan tindakan Anda. Baiklah, kami meluncurkannya, lakukan semua ini dan inilah skrip yang sudah selesai. Hanya dia yang sangat besar, dan semua itu karena OpenSSL menampilkan sertifikat, kunci, dan mengharapkan menunggu hasil dari semua ini. Apakah kita membutuhkan ini? TIDAK. Kami menghapus seluruh prompt pertama, hanya menyisakan baris terakhir 'r'. Kami juga menghapus bidang Agen Pengguna dan Terima dari permintaan kami - keduanya tidak memengaruhi apa pun. Jadi, mari kita luncurkan. Skrip telah dijalankan, tetapi di manakah dokumen HTML yang berharga itu? Mengharapkan makan itu. Untuk membuatnya meludah, Anda perlu memasukkan:

set results $expect_out(buffer)

sebelum akhir skrip - ini adalah bagaimana output dari executable akan ditulis mengharapkanperintah 'om dan ditampilkan di layar. Singkatnya, kira-kira seperti ini:

mengharapkan sebuah naskah

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

Tapi bukan itu saja! Seperti yang Anda lihat, dalam semua contoh, URL permintaan bersifat statis, tetapi URL-lah yang bertanggung jawab untuk kata mana yang akan menampilkan asonansi. Dan ternyata kita akan terus mencari kata “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” dalam ASCII atau “di sini” dalam UTF-8. Apa yang harus dilakukan? Tentu saja, cukup buat skrip baru setiap saat, teman-teman! Tidak lagi harapkan otomatis'oh, dan dengan bantuan gema, Karena Di kami yang baru, tidak ada yang berubah kecuali kata. Dan masalah baru akan bertahan lama: bagaimana kita bisa dengan cerdas menerjemahkan kata dari Sirilik ke dalam format URL? Tidak ada yang istimewa untuk terminalnya juga. Tidak apa-apa, kita bisa melakukannya, bukan? Bisa:

Lihat apa yang bisa saya lakukan!

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

Secara total, kami memiliki skrip yang mengubah kata menjadi teks ASCII, menghasilkan skrip lain yang meminta halaman situs dengan asonansi dari server melalui OpenSSL. Dan kemudian kita mengarahkan output dari skrip terakhir ke sebuah file dan, dengan cara lama, meneruskannya "filter" kotak ekstra dan tulis ke file.

Persimpangan banyak. Intinya

Sebenarnya, inilah yang menyebabkan paling sedikit masalah. Prosedur di atas kita lakukan untuk dua kata, lalu dari dua daftar tersebut kita bandingkan masing-masing kata dan jika ditemukan kecocokan, kita keluarkan. Sekarang kami memiliki skrip yang mengambil dua kata sebagai masukan dan menampilkan daftar kata yang berima dengan keduanya, dan bahkan memperhitungkan asonansi, dan semua ini tanpa beralih secara manual di antara empat tab dan mengingat kata-kata "dengan mata" - semuanya dikumpulkan, diperhitungkan dan dibuang secara otomatis. Luar biasa.

Tujuan dari publikasi ini adalah untuk menunjukkan bahwa jika seseorang membutuhkan sesuatu, dia akan tetap melakukannya. Sangat tidak efektif, bengkok, menyeramkan, tetapi akan berhasil.

Sumber: www.habr.com

Tambah komentar