Электронная библиотека » Коллектив Авторов » » онлайн чтение - страница 18


  • Текст добавлен: 9 ноября 2013, 23:45


Автор книги: Коллектив Авторов


Жанр: Зарубежная компьютерная литература, Зарубежная литература


сообщить о неприемлемом содержимом

Текущая страница: 18 (всего у книги 69 страниц) [доступный отрывок для чтения: 22 страниц]

Шрифт:
- 100% +
Резюме

В этой главе приведена краткая историческая справка о развитии криптографии, описан известный шифр Цезаря, а также подробно рассказано о значении криптографии в наши дни. Современная криптография представлена симметричными и асимметричными криптосистемами, известными также как криптография с секретным и открытым ключами.

В настоящее время широко используются симметричные криптографические алгоритмы DES, AES и IDEA. В главе было рассказано о приложенных NIST усилиях по замене DES, который постепенно сдавал свои позиции, на современный алгоритм, о том, как алгоритм Rijndael был отобран из пяти финалистов конкурса и был признан стандартом AES. Было сказано несколько слов о стартовавшей с начала 1990-х годов истории создания перспективного Европейского стандарта криптографического алгоритма IDEA и показаны его преимущества по сравнению с DES.

Впервые об асимметричных алгоритмах заговорили с середины 1970-х годов, когда Диффи и Хеллман опубликовали названный в их честь алгоритм обмена ключами (алгоритм Диффи-Хеллмана, или DH-алгоритм), предназначенный для безопасного обмена ключами в сетях общего пользования. Вслед за алгоритмом Диффи-Хеллмана появился алгоритм RSA, который провозгласил начало новой эры криптографии с открытым ключом. Алгоритмы и методы криптографии с открытым ключом впоследствии были реализованы в популярной криптосистеме PGP. Фундаментальное отличие криптосистем с открытым ключом от симметричных систем основано на проблеме факторизации (разложении на сомножители) очень больших целых чисел.

Метод «грубой силы» эффективен для взлома большинства криптографических алгоритмов, если в распоряжении исследователя достаточно времени для перебора всех ключей из ключевого пространства. На перебор ключей может потребоваться от нескольких минут до миллиарда лет. Наиболее часто этот метод используется для вскрытия паролей. Для подобных целей широко используются программы LOphtcrack и John the Ri pper.

Ошибки в реализации криптостойких алгоритмов или не предусмотренные разработчиками алгоритмов способы их использования способствуют повышенной уязвимости построенных на их основе криптографических систем. Так, для алгоритма Диффи-Хеллмана опасны атаки «злоумышленник посередине» (man-in-the-middle-type attacks). Сравнительно легко могут быть раскрыты пароли в формате кэш-величин LanManager (LANMAN), зашифрованные с помощью DES. К малоприятным результатам приводит использование легко вскрываемых паролей или ключевых фраз в симметричных криптосистемах. А неверное хранение секретного или личного паролей может вообще сделать бессмысленным шифрование сообщений.

Иногда для хранения информации в тайне используются обратимые или недостаточно криптостойкие алгоритмы. В главе было рассказано об уязвимости недостаточно криптостойких шифров к частотному анализу (frequency analysis), при котором для расшифровки сообщений используются частотные характеристики языка. Известны атаки, основанные на анализе длин открытого и зашифрованного текстов (ciphertext relative lengthanalysis) или анализе сходства зашифрованного и открытого текстов (similar plaintext analysis). Были рассмотрены примеры, когда разработчик пытался сохранить данные в тайне при помощи операций XOR или алгоритма кодирования Base64, и приведены простые примеры программ обратимого кодирования, основанные на этих принципах. Попутно было рассказано об алгоритмах сжатия данных как средства их защиты.

Конспект
Концепции криптографии

· Незашифрованные данные называются открытым (незашифрованным) текстом (plaintext), а зашифрованные – зашифрованным текстом (ciphertext).

· Криптографические системы могут быть симметричными и асимметричными. В симметричных криптосистемах используется один секретный ключ, в то время как у асимметричных – два: открытый и секретный (личный).

· Криптография с открытым ключом была изобретена Уитфилдом Диффи (Whitfield Diffie) и Мартином Хеллманом (Martin Hellman) как безопасный метод обмена секретными ключами.

Стандарты алгоритмов шифрования

· Причина использования в наши дни большого количества криптографических алгоритмов заключается в том, что каждый алгоритм хорош по-своему. Каждый из них можно охарактеризовать скоростью обработки данных, удобством использования и безопасностью. Для обоснованного выбора наиболее подходящего в конкретной ситуации алгоритма следует досконально знать их возможности.

· Стандарт шифрования данных DES (Data Encryption Standard) – наиболее известный алгоритм шифрования, используемый до сих пор на практике. Но в силу его древности следует избегать применения DES в новых разработках или для защиты особо важных данных.

· Для замены DES был разработан продвинутый стандарт шифрования AES (Advanced Encryption Standard), в котором предусмотрено использование ключей различной длины.

· Принципы работы асимметричных криптосистем отличаются от принципов работы симметричных. Если в симметричных криптосистемах применяется единственный ключ в циклах обработки сообщения, то асимметричный алгоритм основан на факторизации двух больших целых чисел (разложении двух больших целых чисел на сомножители).

· Алгоритмы RSA и Диффи-Хеллмана (Diffie-Hellman) – два наиболее широко используемых асимметричных алгоритма в настоящее время.

«Грубая сила»

· При наличии времени единственная обреченная на успех атака на симметричную криптографическую систему – это атака «грубой силы». Следует позаботиться о том, чтобы необходимое для успешной атаки время составляло годы, десятки лет или еще более длинный период времени.

· Зачастую возможностей одного компьютера для организации атаки «грубой силы» недостаточно. Но если в атаку будут волечены несколько параллельно работающих компьютеров, то шансы на ее успех резко возрастают.

· Наиболее часто атака «грубой силы» используется для вскрытия паролей.

Неверное использование алгоритмов шифрования

· Алгоритм Диффи-Хеллмана обмена ключами уязвим к атакам типа «злоумышленник посередине» (man-in-the-middle attacks).

· По возможности следует избегать использования паролей в формате кэш-величин LANMAN, потому что реализация этого протокола способствует относительно легкому вскрытию паролей.

· Следует особенно внимательно подходить к хранению ключей, поскольку в случае компрометации секретного или личного ключа компрометируются защищаемые ими данные.

Любительская криптография

· Любой недостаточно криптостойкий алгоритм шифрования (подобно алгоритму, основанному на операции XOR) может быть взломан с минимальными усилиями.

· Частотный анализ (frequency analysis) – мощное средство расшифровки сообщений разумного размера, не защищенных современными криптографическими алгоритмами.

· Иногда производители пытаются сохранить информацию в тайне при помощи простых небезопасных криптоалгоритмов (как, например, Base64) или алгоритмов сжатия.

Часто задаваемые вопросы

Вопрос: Существуют ли криптографические алгоритмы, гарантирующие 100 %-ую безопасность?

Ответ: Да, существуют. OTP (One Time Pad) – единственный алгоритм, гарантирующий абсолютную безопасность при безупречной реализации. Алгоритм OTP – это фактически шифр Вернама (Vernam), который был изобретен в компании AT&T в далеком 1917 году. Шифр Вернама (Vernam) представляет класс так называемых потоковых шифров, которые непрерывно, побитно шифруют поток данных вместо шифрования одного блока данных за другим в блочных шифрах. У алгоритма OTP два существенных недостатка. Во-первых, для его использования необходимо сгенерировать последовательность действительно случайных чисел. Во-вторых, количество случайных чисел в последовательности должно совпадать с числом бит в шифруемом сообщении. Для работы алгоритма нужно обеспечить раздельную передачу сообщения и ключа, гарантирующую сохранность ключа в тайне. Никогда один ключ не используется дважды для шифрования другого сообщения. Если будут перехвачены два сообщения, зашифрованные одним и тем же ключом, то восстановить ключ и расшифровать сообщение очень просто. Причина, по которой алгоритм OTP не получил широкого распространения, заключается в сложности построения датчика действительно случайных чисел (как уже об этом упоминалось) и сложности обеспечения безопасности распределенного ключа.


Вопрос: Как долго еще будет использоваться DES?

Ответ: Скорее всего, из-за широкого распространения систем на основе DES алгоритм будет активно использоваться еще лет 5-10. Особенно в тех приложениях, где обеспечение безопасности зашифрованных данных не стоит на первом месте. Считается, что для некоторых приложений DES вполне достаточно, потому что средний хакер пока не обладает достаточными ресурсами для эффективного взлома алгоритма. Предполагается, что DES может использоваться как средство, затрудняющее прослушивание трафика, по крайней мере до широкого распространения протокола IPv6. DES гораздо быстрее алгоритма 3-DES и лучше приспособлен к условиям работы в виртуальных частных сетях (VPN) первых поколений, которые могут быть несовместимы снизу вверх с новым стандартом AES. В редких случаях, для обеспечения совместимости, в правительственных учреждениях будут устанавливаться новые криптосистемы, основанные на DES.


Вопрос: После нападений террористов 11 сентября на США особое значение приобрел вопрос использования террористами средств криптографии. Появились высказывания о предоставлении правительственным органам возможности расшифровки зашифрованных сообщений при помощи «потайной калитки», встроенной во все криптосистемы. Почему так нельзя сделать?

Ответ: Наличие «потайной калитки» в криптографических алгоритмах, при помощи которой любой может расшифровать сообщение, – головная боль для всех пользователей криптографии. Вероятнее всего, ключи от «потайной калитки» будут храниться в одном месте, на которое тут же нацелятся хакеры. Как только хранилище ключей будет скомпрометировано, а рано или поздно это произойдет, все данные можно считать скомпрометированными. Кроме того, необходимо будет создать новую бюрократическую машину, управляющую доступом через «потайную калитку». Возможно, она будет создана по образу и подобию нынешней организации подключения подслушивающих устройств. Потребуется также создание групп надзора, следящих за соблюдением законности. Дополнительно потребовалось бы дооснастить все эксплуатируемые криптосистемы «потайной калиткой», возможно, в виде комбинации открытого ключа и ключа доверия. Реализация новых программ шифрования потребовала бы месяцы на разработку и годы на внедрение. В этих условиях усилия хакеров сосредоточатся на взломе криптографических алгоритмов при помощи ключа доверия, в лучшем случае поставив под вопрос безопасность криптосистем.


Вопрос: Почему оказалось легко взломать CSS, технологию шифрования, используемую для защиты DVD-дисков от неавторизованного корирования?

Ответ: Защита от копирования DVD-дисков была легко взломана в основном из-за того, что Xing Technologies хранило свой ключ в открытом виде. Ранее уже говорилось о недопустимости этого. Данные, записываемые на DVD-Video-диск, шифровались алгоритмом CSS (Content Scrambling System – система скремблирования содержания) с использованием 40-битного ключа. Зная 40-битный ключ Xing Technologies, одни хакеры смогли атакой «грубой силы» быстро взломать ключи еще на 170 лицензий. Таким способом джинн был выпущен из бутылки, если можно так выразиться, потому что шифр внутреннего формата многих производителей оказался раскрытым. Располагая таким большим количеством ключей, другие хакеры смогли написать программу DeCSS, которая позволяла копировать с DVD-диска зашифрованные данные на другой носитель в расшифрованном виде. В конечном счете схема CSS была обречена на провал. Нельзя полагать, что никто не сможет прочитать ключ, если он размещен в миллионах DVD-проигрывателей.

Глава 7
Непредвиденные входные данные

В этой главе обсуждаются следующие темы:

Опасность непредвиденных входных данных

Поиск обусловненных непредвиденными входными данными уязвимостей

Методы поиска и устранения уязвимостей, обусловленных непредвиденными входными данными

Использование средств безопасности языков программирования для обработки непредвиденных данных

Инструментарий обработки непредвиденных данных

· Резюме

· Конспект

· Часто задаваемые вопросы

Введение

Интернет состоит из приложений, каждое из которых является операционной системой или программой ввода, обработки и передачи информации. Каждый день появляются новые приложения. Полезное пользователю приложение должно взаимодействовать с ним, реагируя на введенные пользователем данные. Работа всех приложений, будь это клиент интерактивной переписки в сети, Web-сайт электронной коммерции, системная утилита с интерфейсом командной строки или компьютерная игра, выполняющаяся в оперативном режиме, зависит от входных данных приложения. Программа расчета бесполезна, если она не воспринимает входные данные. Не принимающая заказы система электронной коммерции противоречит своему назначению.

Все Интернет-приложения должны быть доступны удаленным пользователям сети. Недостатки в программировании приложения из-за отсутствия опыта, ошибок или какой-либо неучтенной аномалии могут сделать его небезопасным. Сложные приложения часто разрабатываются поэтапно, небольшими модулями. При объединении модулей в единый проект возможные несогласованности в алгоритмах их работы влияют на уязвимость приложения в целом.

Служба компьютерной безопасности предупреждает!

Противостояние между разработчиками прикладных программ и администраторами сети всегда было, есть и будет. Очень трудно заставить разработчиков, не отвечающих за вопросы безопасности, внести изменения в их программы без документально оформленной политики безопасности, имеющей статус первоочередного требования. Большинство разработчиков не осознают, что их программы – такая же составная часть системы безопасности компании, как и средства межсетевой защиты.

Уязвимость приложения сильно увеличивается, если в нем не предусмотрена защита от неверных входных данных. Список уязвимостей можно найти в описании любого сканера CGI (cgichk, whisker и т. д.). (CGI (Common Gateway Interface) – общий шлюзовой интерфейс. Разработанный NCSA сетевой стандарт, предназначенный для создания серверных приложений HTTP.) Большинство известных сканеров CGI уязвимы к атакам, основанным на вводе входных данных в непредусмотренном формате.

Опасность непредвиденных входных данных

Для взаимодействия с пользователем приложение должно обрабатывать входные данные. Входные данные могут быть представлены в простой форме, например щелчком мышки в заданной позиции монитора, или одним введенным символом, или в форме сложно отформатированного потока данных большого размера. В любом случае пользователь, осознанно или нет, может ввести данные в непредвиденном для приложения формате. Иногда это никак не скажется на работе приложения, а иногда может изменить результаты его работы. Например, может привести к предоставлению пользователю информации, к которой он не был бы допущен в обычной ситуации, или повлиять на работу других приложений.

Три класса атак основаны на непредвиденных входных данных.

1. Переполнение буфера. Когда злоумышленник вводит больше данных, чем предусмотрено разработчиком, то приложение может неправильно обработать избыточные данные. Языки С и С++ являются примером языков программирования, написанные на которых программы никак не отреагируют на избыточные данные, если программист не предусмотрел их обработку. Языки программирования Perl и PHP автоматически справляются с избыточностью данных, увеличивая размер области для хранения переменных. (Дополнительные сведения по переполнению буфера приведены в главе 8.)

2. Вызов системных функций. Введенные в приложение данные могут использоваться для вызова системных функций взаимодействия с ресурсом, который явным образом в приложении не описан, или изменить логику их работы. Системные функции позволяют запустить другое приложение, получить доступ к файлу и т. п.

3. Изменение логики работы приложения. Иногда входные данные представляются в формате, способно изменить логику работы приложения. Например, в результате представления данных в особом формате может быть нарушена работа алгоритмов аутентификации, изменены запросы языка структурированных запросов SQL (Structured Query Language – международный стандартный язык для определения реляционных баз данных и доступа к ним), а также получен доступ туда, куда обычно злоумышленник получить доступ не может.

Следует отметить, что четкой границы между этими классами атак нет. Поэтому некоторые атаки могут одновременно принадлежать нескольким классам одновременно.

На практике встречается большое количество случаев вариантов представления входных данных, обработка которых в программе разработчиком не предусмотрена. Основанная на непредвиденных входных данных атака может быть очень простой. Например, она может заключаться во вводе в программу неприметного значения, изменяющего логику ее выполнения, например ввод имени дополнительного входного файла. Для организации подобной атаки особых знаний не требуется.

Известны более изощренные атаки, которые основаны на включении во входные данные специальных метасимволов, имеющих особый смысл для приложения или операционной системы. В ядре базы данных Microsoft Jet была выявлена уязвимость: включение в SQL-запрос вертикальных линий (I) позволяло злоумышленнику выполнить в коде VBA (Visual BasicforApplications) системные команды. Этот же механизм лежит в основе популярной службы удаленных данных RDS (Remote Data Services), которая, как доказано практикой, является широко распространенной проблемой информационного сервера Интернет IIS (Internet Information Server) Windows NT.

Поиск обусловленных непредвиденными входными данными уязвимостей

Обычно приложения обрабатывают данные все время – как никак, именно для этого компьютеры и предназначены. Когда же непредвиденные входные данные приводят к уязвимости? Вообще, это может произойти в любой момент при взаимодействии приложения с пользователем или другим (непроверенным) приложением. Но известны наиболее общие ситуации, которые рассмотрим подробнее.

Локальные приложения и утилиты

Под управлением операционной системы на компьютере выполняются различные приложения, по мере необходимости запущенные пользователем или самой системой. Многие из этих приложений взаимодействуют с пользователем, предоставляя злоумышленнику шанс ввести в программу непредусмотренные разработчиком данные. Например, злоумышленник может нажать необычную последовательность клавиш, введя тем самым большой массив данных или определив неверные величины.

Обычно такие шалости не доставляют больших хлопот. Если пользователь сделал что-то не так, то приложение аварийно завершается, и всё. Но в мире систем UNIX, включая очень похожую на UNIX BSD операционную систему Macintosh OS X, у некоторых из приложений установлены специальные разрешения suid (set user ID – установленный идентификатор пользователя) и sgid (set group ID – установленный идентификатор группы), позволяющие им выполняться с повышенными привилегиями относительно привилегий обычного пользователя. Если манипуляции с обычным приложением не принесут злоумышленнику выгоды, то взятие под свой контроль приложения с установленными suid или sgid может предоставить злоумышленнику привилегии администратора. Далее будут рассмотрены некоторые типичные способы похищения прав приложений.

Протокол HTTP и язык разметки HTML

В приложениях Интернет много ошибок, основанных на неверных предположениях о работе сети. Часть из них обусловлена дезинформацией, но большинство – ошибками программирования из-за недостаточного знания программистами принципов работы протокола передачи гипертекстовых файлов HTTP (Hypertext Transfer Protocol). (HTTP – протокол уровня приложений для распределенных информационных систем гипермедиа, позволяющий общаться системам с различной архитектурой. Используется при передаче HTML-файлов по сети страниц WWW и языка гипертекстовой разметки HTML (HyperText Markup Language). Язык HTML – стандартный язык, используемый для создания страниц WWW).

Самая большая ошибка, которую допускают программисты, – необоснованное доверие заголовкам запроса в HTTP-запросе и вера в них как в средство обеспечения безопасности. Заголовок запроса ссылки Referer в HTTP-запросе содержит адрес страницы, на которой находилась ссылка на запрашиваемый документ. Заголовок запроса Referer поддерживается клиентом в клиентских настройках. Так как он создается клиентом, то его можно легко фальсифицировать. Например, при Telnet-обращении к 80 порту (HTTP-порт) Web-сервера можно набрать следующее:


GET / HTTP/1.0

User-Agent: Spoofed-Agent/1.0

Referer: http://www.wiretrip.net/spoofed/referer/


Видно, что в заголовке указана фальсифицированная ссылка и подложный агент пользователя. (В сетях агент пользователя (user agent) – прикладной процесс OSI, представляющий пользователя или организацию, который создает, передает и обеспечивает доставку сообщений для пользователя.) Единственно, чему можно доверять из переданной пользователем информации, – это IP-адресу клиента. (Хотя и он может быть фальсифицирован. Подробнее об этом сказано в главе 12.)

Другой недостаток HTTP – зависимость от ограничений представления информации средствами HTML. Зная это, многие разработчики предлагают пользователям выбирать данные из списка (например, из трех элементов). Конечно, совсем не обязательно ограничивать пользователя списком данных, заданным разработчиком. Однажды автор наблюдал достаточно ироничную ситуацию, когда сотрудник Microsoft предлагал использовать списки как эффективный метод борьбы с непредвиденными данными пользователя. Это предлагал человек из группы разработчиков SQL Server, не входивший в группу обеспечения безопасности или разработки Web-решений. От него нельзя требовать больше, чем знание внутренней логики работы SQL-сервера.

Рассмотрим пример HTML-формы, подготовленной приложением:


<FORM ACTION=”process.cgi” METHOD=”GET”>

<SELECT NAME=”author”>

<OPTION VALUE=” Ryan Russell”>Ryan Russell

<OPTION VALUE=” Hal Flynn”> Hal Flynn

<OPTION VALUE=” Ryan Permeah”> Ryan Permeah

<OPTION VALUE=” Dan Kaminsky”> Dan Kaminsky

</SELECT>

<INPUT TYPE=”Submit”>

</FORM>


В HTML-форме описан список, составленный из имен некоторых авторов. Получив HTML-форму, клиентское приложение разрывает соединение, анализирует полученную HTML-форму и предъявляет ее пользователю. После выбора из списка автора клиентское приложение посылает отдельный запрос на Web-сервер с приведенным ниже URL (Uniform Resource Locator – унифицированный указатель информационного ресурса. Стандартизованная строка символов, указывающая местонахождение документа в сети Интернет):


process.cgi?author=Ryan Russell


Все очень просто. Но нет никаких причин, препятствующих посылке другого URL:


process.cgi?author=Rain Forest Puppy


Так обходится предполагаемое «ограничение» HTML-формы. Более того, можно ввести URL, не запрашивая HTML-форму. Для этого следует обратиться к 80 порту Web-сервера по Telnet и сделать запрос вручную. При этом совсем не обязательно обращаться к основной форме. Не следует считать, что полученные на запрос данные – это обязательно результат обработки предыдущей HTML-формы.

Одно из заблуждений, которое автор любит опровергать, – это использование фильтра данных в клиентской части. Многие включают в HTML-формы небольшие сценарии на JavaScript или VBScript, которые контролируют заполнение всех элементов формы. Некоторые предусматривают в сценариях контроль введенных данных: введенные числовые значения действительно числовые и т. д. После такого контроля приложение работает, исходя из предположения об отсутствии ошибок в данных, введенных пользователем, и, следовательно, может сразу передать их системной функции.

На самом деле клиентская часть должна сообщать о проведенных проверках введенных данных. Если читатель не знает, как можно обойти контролирующие ввод пользователя сценарии, то задумайтесь над имеющейся даже у технически непросвещенных людей возможности отключения поддержки сценариев. Например, некоторые корпоративные межсетевые экраны отфильтровывают сценарии HTML-формы. Или злоумышленник может использовать браузеры, не поддерживающие сценарии (например, Lynx).

Следует особенно отметить, что использования параметра size HTML-формы, который описывает размер входного поля, недостаточно для предотвращения переполнения буфера. Значение параметра size клиент может установить сам, если в этом есть необходимость (или если он понимает значение этого параметра).

Если бы в протоколе HTTP придумали что-нибудь в интересах безопасности, это обязательно затронуло бы файлы cookies (небольшой фрагмент данных о предыстории обращений пользователя к WWW-серверу, автоматически создаваемый сервером на машине пользователя). Похоже, что никто еще до конца не понял, что это такое и как им правильно пользоваться. Пресса объявила их самой большой угрозой персональной безопасности в Интернет. Некоторые используют их для хранения важных данных аутентификации. Плохо, что никто из них не прав.

Механизм cookies является эффективным методом передачи данных клиентам с возвратом. Является ли это нарушением безопасности? Единственные данные, возвращаемые клиентами на сервер, – это ранее переданные им данные. Существует возможность ограничить cookies так, что клиент будет только отсылать их обратно на сервер. Предназначен cookies для обеспечения сохранения информации состояния во время многочисленных запросов, поскольку HTTP – протокол без сохранения состояния, то есть каждый запрос, выполненный индивидуальным клиентом, независимый и анонимный.

Поскольку cookies – составляющая часть HTTP, любая передаваемая c их помощью информация – это текст. Обмануть cookies не так уж и сложно. Рассмотрим обращение Telnet к 80 порту Web-сервера:


GET / HTTP/1.0

User-Agent: HaveACookie/1.0

Cookie: MyCookie=SecretCookieData


Только что был отправлен файл cookie «MyCookie» вместе с хранящимися в нем данными «SecretCookieData».

Другой интересный факт о cookies: они обычно хранятся в текстовом файле клиента. Поэтому при сохранении важной информации в cookie всегда есть вероятность неавторизованного доступа к ним.


Страницы книги >> Предыдущая | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Следующая
  • 4.6 Оценок: 5

Правообладателям!

Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.

Читателям!

Оплатили, но не знаете что делать дальше?


Популярные книги за неделю


Рекомендации