Apa yang mampu dimiliki otak seorang siswa di dunia komputer

Hari yang baik

Setelah selesai menulis skrip lain di Bash, saya menyadari bahwa semuanya harus benar-benar berbeda, tetapi semuanya berhasil. Saya ingin menunjukkan kepada Anda apa yang tidak senonoh dan kruk yang saya tulis untuk menyelesaikan masalah, tetapi sejauh ini tanpa mobil pengetahuan. Dengan kata lain, karikatur pemrograman.

Tantangan


Sesuatu menjadi perlu untuk:
  • Mencetak banyak sajak untuk sebuah kata, kecuali untuk kotak
  • Melintasi banyak sajak dua kata

Untuk apa? Nah ini dia - dan itu dia.
Siapa yang tidak tahu, sajak persegi (dalam bahasa umum - kuadrat) adalah dua kata yang memiliki dua huruf terakhir dalam ejaan, yang (seringkali hanya ini saja) menjadikannya sajak. Misalnya, mawar - embun beku; ban adalah mobil. Penggunaan kotak dalam versifikasi modern tidak secara khusus disetujui oleh orang-orang, karena sifat primitifnya.

Solusi


Solusi paling sederhana bagi saya adalah menulis skrip pada Bash, menggunakan generator rima yang sudah ada - HOST, yang pertama-tama memilihnya sesuai dengan harmoni, dan bukan dengan mengeja. Apa itu HOST? Karena jika Anda menentukan nama asli situs - mereka akan mengatakan iklan itu. Kenapa tidak terus menggunakannya? Pertama, terlepas dari keuntungannya dalam memilih sajak sesuai dengan harmoni, sering menghasilkan kotak. Kedua, Anda masih harus berpikir dengan otak Anda, menghabiskan waktu untuk beralih di antara tab, upaya untuk mengingat kata-kata berulang dalam daftar untuk menemukan sajak untuk dua kata.

Mendapatkan Sajak yang Kuat


Apa yang aku tahu Saya tahu tentang utilitas wget , yang mengunduh halaman di URL yang ditentukan. Yah, kami memenuhi permintaan - kami mendapatkan halaman HTML dalam file, yang disebut kata untuk sajak. Misalnya, cari kata "di sini":

wget https://HOST/rifma/ 

Tapi saya hanya perlu daftar kata-kata, bagaimana cara menyingkirkan yang lain? Kami melihat dan melihat bahwa daftar kata-kata disusun, betapapun anehnya, dalam bentuk daftar, dan kata-katanya ada di tag <li> </li>. Nah, kami memiliki utilitas sed yang bagus - dan tuliskan:


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

Pertama, dari file kata , pilih baris yang berisi tag <li> - kami mendapatkan banyak tag kosong dan baris dengan kata-kata. Kami menghapus tag itu sendiri dan tag penutupnya - di sini simbol persen digunakan alih-alih garis miring karena tag </li> sudah memiliki garis miring, itulah sebabnya mengapa tidak sedikit memahami Anda. Dan dengan minat, semuanya baik-baik saja. Kami menghapus semua spasi dari file, menghapus baris kosong. Voila - daftar kata lengkap.

Untuk menghapus kata yang berima karena huruf terakhir, pilih dua huruf terakhir dari kata aslinya dan bersihkan daftar:

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

Kami melihat, mencoba - semuanya berfungsi ... jadi, tetapi di mana daftar kata "play"? Dan untuk kata "Aku datang"? File itu kosong! Dan ini semua karena kata-kata ini adalah kata kerja, dan kita tahu apa yang mereka lakukan dengan mereka yang berima menjadi kata kerja. Sajak kata kerjanya bahkan lebih buruk daripada yang berbentuk bujur sangkar, untuk kata kerja yang paling banyak dalam bahasa Rusia, dan bahkan semuanya dengan akhiran yang sama, itulah sebabnya mereka tidak muncul dalam file terakhir setelah memeriksa akhirnya.

Namun, tidak terburu-buru. Untuk setiap kata tidak hanya ada sajak, tetapi juga assonance, yang kadang-kadang terdengar jauh lebih baik daripada sajak - untuk itu mereka juga assonance (assonance Prancis, dari Latin assono - saya terdengar bagus).

Dapatkan Asonansi


Di sini kesenangan dimulai: assonance muncul di URL terpisah, dan di halaman yang sama, dengan mengeksekusi skrip, mengirim permintaan HTTP dan menerima respons. Bagaimana cara memberitahu wget 'untuk mengklik tombol? Namun dengan cara apa pun. Menyedihkan.

Memperhatikan bahwa URL dalam string masih berubah, saya menyalin apa yang ada di sana setelah beralih ke assonances, dan menempel di tab browser baru - sajak kuat dibuka. Bukan itu.

Bahkan, saya pikir, server tidak perlu peduli jika skrip yang mengirim permintaan dieksekusi, atau apakah orang mengetiknya dengan tangan. Jadi? Dan siapa tahu, mari kita periksa.

Ke mana harus mengirim? Apa yang harus dikirim? Permintaan HTTP ke IP server, ada sesuatu seperti MENDAPATKAN ... maka ada sesuatu HTTP / 1.1 ... Kita perlu melihat apa dan di mana browser mengirim. Instal 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 Atur serangan MITM pada diri sendiri? Idealnya, korban sendiri akan membantu kami.

Secara umum, menebak naik browser, saya masih menemukan permintaan itu sendiri, dan penerima. Ayo 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. 
Hah. Hei, hei. Memang, apa yang saya harapkan dengan mengirimkan permintaan HTTP kosong ke port HTTPS. Apakah ini mengenkripsi sekarang? Semua ini diributkan dengan kunci RSA, lalu dengan SHA256. Dan mengapa, ada OpenSSL untuk hal-hal seperti itu. Yah, kita sudah tahu apa yang harus dilakukan, pertama-tama hapus bidang Referer dan Cookie - saya pikir itu tidak akan sangat mempengaruhi 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 



Apakah ini skakmat di server? Yah, setidaknya 200 OK menjawab saya, yang berarti cookie dan pengarah tidak mempengaruhi apa pun. Kompresi Gzip, tetapi karakter ASCII disalin saat menyalin. Demikian pula, Anda dapat menghapus garis Terima-penyandian . Semuanya baik-baik saja - kami mendapatkan dokumen HTML, sekarang dengan assonances. Tetapi di sini ada dua pertanyaan: bagaimana menjalankan OpenSSL dan meneruskan data ke sana dengan sebuah skrip? Dan bagaimana cara membaca output, jika setelah menerima jawaban kita tetap seolah-olah dalam "shell" OpenSSL? Jika Anda dapat memikirkan sesuatu dengan yang kedua, tetapi dengan yang pertama ...

Bagus sekali ada Habr , tempat saya membaca tentang utilitas yang diharapkan , yang mengotomatiskan proses berinteraksi dengan program yang sedang menunggu interaksi manusia. Yang lebih menarik adalah kehadiran perintah autoexpect yang menghasilkan skrip ekspektasi untuk tindakan Anda. Nah, jalankan, lakukan semuanya dan inilah skrip yang sudah selesai. Hanya itu sangat besar, dan semuanya karena OpenSSL menampilkan sertifikat, kunci, dan berharap untuk menampilkan semua ini. Apakah kita memerlukan ini? Tidak. Kami menghancurkan prompt pertama, hanya menyisakan baris terakhir '' r '. Kami juga menghapus bidang User-Agent dan Accept dari permintaan kami - mereka tidak memengaruhi apa pun. Jadi, mari kita mulai. Script dieksekusi, tetapi di mana dokumen HTML yang didambakan? Harapkan memakannya. Untuk membuatnya memuntahkannya, Anda harus memasukkan:

 set results $expect_out(buffer) 

sebelum akhir skrip - ini adalah bagaimana output dari perintah yang diharapkan dieksekusi akan ditulis dan ditampilkan. Singkatnya, kira-kira seperti ini:

Skrip yang diharapkan
 #!/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.1\rHost: HOST\rAccept-Language: en-US,en;q=0.5\rX-Requested-With: XMLHttpRequest\rConnection: close" expect -exact "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1\r Host: HOST\r Accept-Language: en-US,en;q=0.5\r X-Requested-With: XMLHttpRequest\r 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 itu statis, namun dialah yang bertanggung jawab atas kata apa yang akan ditampilkan oleh asonance. Dan ternyata kita akan terus mencari dengan kata "% d0% b7% d0% b4% d0% b5% d1% 81% d1% 8c" di ASCII atau "di sini" di UTF-8. Apa yang harus dilakukan Tentu saja, cukup setiap kali menghasilkan skrip baru, teman-teman! Hanya tidak mengharapkan ohm, tetapi dengan gema , karena di negara kita, tidak ada yang berubah kecuali kata. Dan tahan lama masalah baru: bagaimana kita bisa dengan cerdas menerjemahkan kata dari Cyrillic ke dalam format URL? Sesuatu untuk terminal juga tidak istimewa. Yah, tidak ada yang bisa kita lakukan? Kita dapat:

Lihat apa yang aku bisa!
 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 melalui halaman server OpenSSL situs dengan assonances. Dan kemudian kita mengarahkan output dari skrip terakhir ke file dan dengan cara lama kita menyebarkannya melalui "filter" dari kelebihan, kuadrat dan menambahkannya ke file.

Persimpangan set. Ringkasan


Sebenarnya inilah yang menyebabkan paling sedikit masalah. Kami melakukan prosedur di atas untuk dua kata, lalu dari dua daftar kami membandingkan setiap kata dengan masing-masing kata dan jika kecocokan ditemukan, kami menampilkannya. Sekarang kita memiliki skrip yang mengambil dua kata untuk input dan menampilkan daftar kata-kata yang berima dengan keduanya, dengan mempertimbangkan assonance, dan semua ini tanpa beralih secara manual antara empat tab dan mengingat kata-kata "dengan mata" - itu saja dikumpulkan, direkam, dan dibuang secara otomatis. Bagus

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

Source: https://habr.com/ru/post/id474448/


All Articles