Do czego zdolny jest mózg ucznia poznającego komputerowy świat?

Dzień dobry.

Po skończeniu pisania kolejnego skryptu w Bashu zdałem sobie sprawę, że wszystko powinno wyglądać zupełnie inaczej, ale wszystko zadziałało. Chcę Wam pokazać jakie wulgaryzmy i kule napisałem, żeby rozwiązać problem, nie mając jeszcze wozu wiedzy. Inaczej mówiąc karykatura programowania.

Zadanie


Coś stało się konieczne:

  • Wyświetlano wiele rymów dla tego słowa, z wyjątkiem kwadratów
  • Przekroczyłem wiele rymów dwóch słów

Po co? Cóż, to wszystko – i tyle.
Kto nie wie, rym kwadratowy (w potocznym języku - kwadrat) to dwa słowa, których dwie ostatnie litery w pisowni pokrywają się, co (często to jedyne) czyni je rymami. Na przykład róże są mroźne; opona - samochód. Użycie kwadratów we współczesnej wersyfikacji nie jest szczególnie akceptowane przez ludzi ze względu na ich prymitywność.

decyzja


Wydawało mi się, że najprostszym rozwiązaniem będzie napisanie skryptu w języku Bash wykorzystującego już istniejący generator rymów – HOST, który dobiera je przede wszystkim po współbrzmieniu, a nie po ortografii. Jaki GOSPODAR? Bo jeśli podasz prawdziwą nazwę strony, powiedzą, że to reklama. Dlaczego nie używać go dalej? Po pierwsze, pomimo przewagi w doborze rymów opartych na współbrzmieniach, nadal często tworzy kwadraty. Po drugie, nadal musisz myśleć mózgiem, spędzać czas na przełączaniu się między zakładkami i energię na zapamiętywanie powtarzających się słów na listach, aby znaleźć rym dla dwóch słów.

Uzyskanie mocnych rymów

Co ja wiem? Wiem o użyteczności wget, który pobiera stronę pod określonym adresem URL. OK, wykonajmy żądanie - otrzymamy stronę HTML w pliku o nazwie zawierającej rymujące się słowo. Na przykład wyszukajmy słowo „tutaj”:

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

Ale potrzebuję tylko listy słów. Jak mogę pozbyć się wszystkiego innego? Patrzymy i widzimy, że lista słów jest sformatowana, niezależnie od tego, jak dziwne może to być, w formie listy, a słowa są w tagach . Cóż, mamy świetne narzędzie. sed - zapiszmy to tak:

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

Najpierw z pliku Word wybierz linie zawierające znacznik — dostajemy masę pustych tagów i linii ze słowami. Usuwamy sam tag i jego zamykający - tutaj zamiast ukośników zastosowano symbole procentów, ponieważ w samym tagu jest już ukośnik, dlaczego? sed trochę cię nie rozumie. I wszystko w porządku z odsetkami. Usuwamy wszystkie spacje z pliku, usuwamy puste linie. Voila - gotowa lista słów.

Aby usunąć słowa, które rymują się ostatnimi literami, zaznacz dwie ostatnie litery oryginalnego słowa i wyczyść listę:

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

Patrzymy, próbujemy – wszystko działa… więc gdzie jest lista słowa „bawić się”? A za słowo „idę”? Plik jest pusty! A to wszystko dlatego, że te słowa są czasownikami i wiemy, co robią z tymi, którzy rymują się z czasownikami. Rym czasownikowy jest gorszy od nawet rymu kwadratowego, bo w języku rosyjskim jest najwięcej czasowników, a wszystkie mają takie same końcówki, dlatego po sprawdzeniu końcówek nie znalazły się w pliku finalnym.

Jednak nam się nie spieszy. Do każdego słowa przypisane są nie tylko rymy, ale także asonanse, które czasami brzmią znacznie lepiej niż rym – dlatego są to asonanse (asonans francuski, od łac. assono – brzmię zgodnie).

Dostajemy asonanse

Tutaj zaczyna się zabawa: asonanse pojawiają się pod osobnym adresem URL i na tej samej stronie, poprzez wykonanie skryptu, wysłanie żądania HTTP i otrzymanie odpowiedzi. Jak mogę powiedzieć wget'Czy ​​naciskasz przycisk? Ale nie ma mowy. Niestety.

Zauważając, że adres URL w wierszu w jakiś sposób się zmieniał, skopiowałem to, co tam było po przejściu na asonanse i wkleiłem to w nowej karcie przeglądarki - otworzyły się mocne rymy. Nie to.

Zasadniczo, pomyślałem, dla serwera nie powinno mieć znaczenia, czy skrypt wysyłający żądanie zostanie wykonany, czy też osoba wpisze je ręcznie. Więc? Kto wie, chodźmy to sprawdzić.

Dokąd wysłać? Co wysłać? Żądanie HTTP do adresu IP serwera, jest coś takiego jak GET... potem jest coś HTTP/1.1... Musimy zobaczyć, co i gdzie wysyła przeglądarka. zainstalować Wireshark, spójrz na ruch:

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

Co? O tak, mamy HTTPS. Co robić? Przeprowadzić na siebie atak MITM? Idealnie byłoby, gdyby sama ofiara nam pomogła.

Ogólnie rzecz biorąc, decydując się na surfowanie po przeglądarce, w końcu znalazłem samo żądanie i adresata. Iść:

Dialog z terminalem

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.

Hej. Hehehe. Rzeczywiście tego się spodziewałem, wysyłając samo żądanie HTTP do portu HTTPS. Czy powinniśmy teraz szyfrować? Całe to zamieszanie z kluczami RSA, a potem z SHA256. Dlaczego? OpenSSL na takie rzeczy. No cóż, już wiemy co zrobić, po prostu usuniemy najpierw pola Referer i Cookie - myślę, że nie będą one miały większego wpływu na sprawę:

Dialog z terminalem

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

Do czego zdolny jest mózg ucznia poznającego komputerowy świat?

Co to jest, przeklinanie na serwerze? No cóż, przynajmniej odpowiedzieli mi 200 OK, co oznacza, że ​​pliki cookie i strona odsyłająca na nic nie wpływają. Kompresja to gzip, ale podczas kopiowania kopiowane są znaki ASCII. Dokładnie, możesz usunąć linię Akceptuj-kodowanie. Wszystko jest w porządku - otrzymujemy dokument HTML, teraz z asonansami. Ale tu są dwa pytania: jak uruchomić OpenSSL i przesłać do niego dane za pomocą skryptu? A jak odczytać wynik, jeśli po otrzymaniu odpowiedzi pozostajemy niejako w „powłoce” OpenSSL? Jeśli możesz wymyślić coś z drugim, ale z pierwszym...

Dobrze, że jest Habrgdzie przeczytałem o użyteczności oczekiwać, który automatyzuje proces interakcji z programami oczekującymi interakcji człowieka. Posiadanie zespołu jest jeszcze bardziej atrakcyjne autooczekiwanie, generując oczekiwać skrypt oparty na Twoich działaniach. Cóż, uruchamiamy to, robimy to wszystko i oto gotowy skrypt. Tylko on jest bardzo ogromny i to wszystko dlatego OpenSSL wyświetla certyfikaty, klucze i oczekiwać czeka na wynik tego wszystkiego. Czy tego potrzebujemy? NIE. Usuwamy cały pierwszy znak zachęty, pozostawiając jedynie ostatnie zakończenie wiersza „r”. Usuwamy również pola User-Agent i Accept z naszego żądania – nie mają one na nic wpływu. Więc uruchommy. Skrypt został wykonany, ale gdzie jest cenny dokument HTML? Oczekiwać zjadłam to. Aby go wypluć, musisz umieścić:

set results $expect_out(buffer)

przed końcem skryptu - w ten sposób zostanie zapisane wyjście pliku wykonywalnego oczekiwać'om i wyświetlone na ekranie. W skrócie coś takiego:

oczekuj skryptu

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

Ale to nie wszystko! Jak widać we wszystkich przykładach adres URL żądania był statyczny, ale to właśnie adres URL odpowiada za to, które słowo będzie skojarzone z asonansami. I tak okazuje się, że ciągle będziemy szukać słowa „%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” w kodzie ASCII lub „tutaj” w UTF-8. Co robić? Oczywiście, po prostu za każdym razem generujcie nowy skrypt, przyjaciele! Nigdy więcej autooczekiwanie- Och, i z pomocą przegapić, ponieważ W naszym nowym nie zmienia się nic oprócz słowa. I niech żyje nowy problem: jak inteligentnie przetłumaczyć słowo z cyrylicy na format URL? Terminal też nie ma nic specjalnego. Cóż, nie ma problemu, damy radę, prawda? Móc:

Zobacz, co potrafię!

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

W sumie mamy skrypt, który konwertuje słowo na tekst ASCII, generując kolejny skrypt, który żąda strony witryny z asonansami z serwera poprzez OpenSSL. Następnie przekierowujemy wyjście ostatniego skryptu do pliku i w staromodny sposób przekazujemy go dalej „filtry” dodatkowe kwadraty i zapisz je do pliku.

Przecięcie wielu. Konkluzja

Właściwie to właśnie sprawia najmniej problemów. Powyższe procedury wykonujemy dla dwóch słów, następnie z dwóch list porównujemy każde słowo z każdym i jeśli zostanie znalezione dopasowanie, wypisujemy je. Teraz mamy skrypt, który pobiera dwa słowa jako dane wejściowe i wyświetla listę słów rymujących się z obydwoma, a nawet biorąc pod uwagę asonanse, a wszystko to bez ręcznego przełączania między czterema zakładkami i zapamiętywania słów „na oko” - wszystko zebrane, rozliczone i automatycznie odrzucane. Wspaniały.

Celem tej publikacji było pokazanie, że jeśli ktoś czegoś potrzebuje, to i tak to zrobi. Bardzo nieskuteczne, krzywe, przerażające, ale zadziała.

Źródło: www.habr.com

Dodaj komentarz