Как подойти к анализу сайта с точки зрения взломщика и выявить уязвимости?

Пентесты

В ходе пентестов мы ориентируемся на различные стандарты и методологии, такие как WSTG от OWASP для веба и на OSSTM для внутрянки и беспроводных сетей. Существуют также и другие стандарты по пентестам, обзорно рассмотрим их ниже. И, конечно же, мы пользуемся собственными наработками и шпаргалаками.

  1. WSTG

    Актуальная версия документа  4.2 доступна на сайте проекта. WSTG предоставляет пентестеру пошаговую инструкцию (читай шпаргалку) для анализа защищенности веб приложений. Включает в себя вопросы:

  1. Сбора информации;

  2. Тестирование конфигураций;

  3. Тестирование авторизации и аутентификации;

  4. Тестирование проверок пользовательского ввода;

  5. Тестирование бизнес-логики, криптографии, API и другое.

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

  1. OSSTM

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

  2. PTES

    Методология предлагает более общий и комплексный подход к формированию гайдлайна. Что примечательно, в тексте PTES указано довольно много векторов по сбору информации (Intelligence Gatheting), пост-эксплуатации (Post Exploation), хорошо сформулирована структура отчета (Reporting).

  3. NIST Technical Guide to Information Security Testing and Assessment

    Многим известный  национальный институт стандартов и технологий (NIST) также опубликовал технический документ по проведению пентестов. В тексте публикации описаны подходы и методы к проведению пентестов, в их числе сканирование сети на уязвимости (проводной/беспроводной), проведение социальной инженерии, приведены стадии тестирования на проникновения, и, конечно же, даны рекомендации по написанию отчетов.

  4. ГОСТ Р 58143-2018. Методы и средства обеспечения безопасности. Часть 2. Тестирование на проникновение

    Этот высокоуровневый документ основан на международном стандарте ISO/IEC TR 20004:2015 “Информационная технология. Методы и средства обеспечения безопасности.  Детализация анализа уязвимостей программного обеспечения в соответствии с  ИСО/МЭК 15408 и ИСО/МЭК 18045″ (ISO/IEC TR 20004:2015”.

    ГОСТ приводит рекомендации по стадиям тестирования на проникновение (планирование, разработка тестов, проведение тестировования,  разработка отчетности).

    Также представлен порядок действий по тестированию на проникновение в соответствии с различными потенциалами атакующего.

Outro

W3af — это действительно мощный фреймворк для тестирования безопасности веб-приложений. Рассказывать о нем можно долго, поэтому я ставил перед собой задачу показать его в действии

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

Кстати, как и любому свободному проекту, w3af нужны новые разработчики, тестировщики и просто активные пользователи. Кого это заинтересовало, добро пожаловать в соответствующий список рассылки (w3af.sourceforge.net) либо на IRC-канал #w3af в сети Freenode.

Утилита из состава w3af для сравнения HTTP-транзакций

sqlsus

Сайт:  sqlsus.sf.net
Платформа: Windows, Unix, Mac

Специальная утилита для реализации инъекций в базы данных MySQL. С помощью
sqlsus ты намного проще сможешь эксплуатировать найденный баг, получив
структуру базы, внедрив SQL запрос, скачав с сервера нужные файл, закачав бэкдор
и т.д. и т.п. Примечательно, что в качестве инструмента для хранения полученных
дампов используется база SQLite, что чрезвычайно удобно. Можно например сделать
копию базы, таблицы или колонки с уязвимого сервера себе в локальную SQLite базы
и полноценно работать с ней. Помимо этого, в sqlsus реализована несколько других
полезных фич. Если ты не можешь обратиться к базе information_schema, или если
ее не существует, тулза поможет пробрутфорсить название таблиц и колонок. В
арсенале sqlsus и инструменты для реализации Blind-инъекций. Впрочем, для
реализации этого вида атак лучше заюзать следующую утилиту.

Мобильные приложения

Все приложения под каждую из платформ являются классическими нативными приложениями.

Для исследования iOS и Android используются оба подхода: автоматизированный и ручной. Для Tizen — только ручной. Про автоматизированный — в снятии “низко висящих фруктов” здесь очень помогает MobSF.

Он позволяет автоматически собрать типичные проблемы, сделать ревью ресиверов, сервисов и т.п. вещей в Android и даже осуществляет некоторое подобие анализа исходного кода (после декомпиляции). Также проверяет флаги (Stack smashing protection, PIE …) при компиляции.

Ручной анализ — Android (+root), iOS + jailbreak (на данный момент мы используем последний доступный джейл для iOS 9.3.3).

А вот с Tizen не все так просто. Сам он очень странный и непривычный. Система является одним большим браузером с поддержкой HTML5, давно находится в разработке и тоже представляет интерес для исследователей безопасности, как что-то новое и неизученное.

Для начала вопрос — сколько вы вообще держали телефонов c TizenOS? Вот столько же статей и security-тулз для этой платформы. Мы пошли по developer way — скачали Tizen SDK, подключились к телефону и дебажили приложение. В этом режиме можно просмотреть файловую систему, получить debug console и делать другие вещи, позволяющие найти проблемы в безопасности. К сожалению, функционал достаточно ограничен, и нет прямого консольного доступа к OS.

Инструмент находится на официальном сайте Tizen. Можно использовать эмулятор, если есть желание познакомиться с этой операционной системой.

Сама платформа Tizen на данный момент имеет большое количество недостатков со стороны безопасности. Можно вспомнить недавнюю новость о сорока зеродеях в платформе и вот эту публикацию. Также о некоторых уязвимостях в SmartTV, где был затронут и TizenOS, рассказывал BeLove — презентация.

Настройки облачной среды

  • Проверьте, чтобы у всех облачных сервисов было открыто минимальное количество портов. Хотя обеспечение безопасности через сокрытие информации — это не защита, использование нестандартных портов усложнит жизнь тем, кто попытается атаковать вашу систему.
  • Держите базы данных и службы в виртуальных частных облаках (VPС, Virtual Private Cloud) к которым нет доступа извне. Будьте очень внимательны, конфигурируя группы безопасности AWS и настраивая пиринг между VPC, так как ошибки могут привести к тому, что внутренние сервисы будут видны извне.
  • Изолируйте логические сервисы в разных VPC и настройте пиринг между ними для обеспечения межсервисного взаимодействия.
  • Убедитесь в том, что все сервисы принимают данные только с минимально необходимого набора IP-адресов.
  • Ограничьте исходящий трафик по IP-адресам и портам для минимизации возможности целевых кибератак и атак ботов.
  • Всегда используйте роли AWS IAM, а не учётную запись суперпользователя.
  • Используйте минимальные привилегии доступа для тех, кто занимается обслуживанием системы, и для разработчиков.
  • Регулярно, по расписанию, выполняйте ротацию паролей и ключей доступа.

Схема расположения классов и интерфейсов в сборках Flexberry

Для предотвращения возникновения ситуации перекрёстных ссылок в проекте решено было разместить основные интерфейсы аудита в сборке ICSSoft.STORMNET.Business.dll, куда уже входят интерфейс сервисов данных IDataService и класс SQLDataService.

Класс ICSSoft.STORMNET.Business.Audit.Audit, реализующий интерфейс IAudit, содержит в себе логику работы со сведениями аудита.
Сервис аудита AuditWinService c wcf-сервисом AuditWcfServiceLibrary, поддерживающим интерфейс IAuditWcfServiceLibrary, являются контейнером для логики работы со сведениями аудита.

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

Примечание: реализация интерфейсов соответствует представленной схеме, однако в соответствии с планом на первый этап тестирование прошла только часть функционала

Планирование спринтов

Чтобы “бесшовно” встроиться в процесс разработки такого продукта, нам необходимо адаптироваться к его глобальным циклам планирования, в нашем случае — релизным циклам. Релиз новых версий «МойОфис» происходит каждые три месяца. Поэтому мы живем спринтами как раз по три месяца. Что же такое спринт в нашем понимании?

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

Естественно, мы понимаем, что планирование сроков в разработке, мягко говоря, получается очень плохо, потому ожидаем законного вопроса: “А если сроки едут, что делаете?”

Тут на помощь приходит старая игра детства — “пятнашки”. Помните, там была пустая ячейка, через которую можно было двигать другие фишки, и тем самым менять порядок, не выходя за рамки коробки? В нашем случае, коробка — это и есть такой “спринт”.

Количество пустых слотов решено было увеличить, поскольку есть разные “внеплановые” работы, ресерчи сторонних решений, используемых в разрабатываемых продуктах, а также иные работы, которые могут относиться к проекту. Тем самым, мы мобильны в планировании, а пустые слоты заполнить всегда можно.

Пример одного из спринтов (первое число — номер недели спринта):

  1. Веб-приложения компонентов (Почта, Контакты, Календарь)
  2. Веб-приложения компонентов (Почта, Контакты, Календарь)
  3. Нативные мобильные приложения для Android, iOS, Tizen
  4. Нативные мобильные приложения для Android, iOS, Tizen
  5. Сервер аутентификации; Бекенд веб-приложений
  6. Бекенд файлового сервера, Веб-панель и API администратора
  7. Веб-панель редактора документов, Бекенд редакторов
  8. Десктопный клиент для файлового сервера
  9. Десктопный клиента для почты, календаря, контактов, документов
  10. Мессенджеры для Web, MacOS, Win, Linux и их API
  11. Misc
  12. Misc
  13. Misc

Misc — это как раз те свободные слоты, их наличие очень важно. Как можно заметить, на некоторые, довольно большие части (как Веб, где проверяется и API-часть), мы закладываем больше времени (10 рабочих дней)

Также в Misc попадают дополнительные исследования и совместная проработка security-ориентированной архитектуры совместно со специалистами заказчика.

Пост-эксплуатация

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

Основные паттерны, по которым работают злоумышленники предполагают:

  • получить доступ на выполнение (желательно в реальном времени)
  • изучение данных, хранящихся на сервере
  • перехват данных, которых нет на системе сейчас, но они могут появиться в будущем
  • организация перманентного доступа к целевой системе

Злоумышленник может получать информацию о скомпрометированной системе, анализируя:

  • конфигурацию системы (логин и пароль к БД в исходных кодах)
  • конфигурацию веб-сервера (например httpd.conf, .htaccess)
  • исходные коды приложения (ищем уязвимости, анализируя логику приложения)
  • доступы к окружению (находясь внутри сети может быть проще попасть на соседние сервера)
  • базы данных (и аутентификационная информация,к другим системам, хранящаяся в них)

Получение паролей из хеша

Чаще всего пароли хранят в виде хешей. Но есть способы получить пароль, имея его хеш.

Один из самых известных онлайн-брутфорсеров паролей: John the Ripper.

Может быть использован, например, так:

Организация перманентного доступа

Самый простой способ — создать своего пользователя (желательно замаскировав его под системного).

Другой вариант — бинарные бекдоры, которые кладутся на систему и организуется их периодическое выпролнение (через cron или при каждом вызове любой частой команды, например ls).

Если удалось получить доступ под пользователем веб-сервера, можно сделать веб-бекдор, например положив куда-либо на вебсервере скрипт, позволяющий выполнять произвольные действия.

Самый жесткий вариант — патч ядра операционной системы, включение бекдора туда.

Burp Suite Pro

решение

Proxy — прокси-сервер, который перехватывает трафик, проходящий по протоколу HTTP(S), в режиме man-in-the-middle. Находясь между браузером и целевым веб-приложением, эта утилита позволяет перехватывать, изучать и изменять трафик, идущий в обоих направлениях.
Spider — веб-паук, который в автоматическом режиме собирает информацию о содержимом и функционале приложения (веб-ресурса).
Scanner (только в Burp Suite Pro) — сканер для автоматического поиска уязвимостей в веб-приложениях.
Intruder — гибкая утилита, позволяющая в автоматическом режиме производить атаки различного вида

Например, перебор идентификаторов, сбор важной информации и прочее.
Repeater — инструмент для ручного изменения и повторной отсылки отдельных HTTP-запросов, а также для анализа ответов приложения.
Sequencer — утилита для анализа случайных данных приложения на возможность предсказания алгоритма их генерации.
Decoder — утилита для ручного или автоматического кодирования и декодирования данных приложения.
Comparer — инструмент для поиска визуальных различий между двумя вариациями данных.
Extender — инструмент для добавления расширений в Burp Suite

php.testsparker.com premium.bgabank.com H: Cross-site scripting (reflected)M: SSL cookie without secure flag set
M: SSL certificate (not trusted or expired)
L: Cookie without HttpOnly flag set
L: Password field with autocomplete enabled
L: Strict transport security not enforced
Если для веб-пентеста вы часто используете Burp Suiteэта утилита отлично впишется в ваш арсенал

Задача 1

Сна­чала я при­веду код, с которым мы сей­час будем работать.

По сути, тут все­го три стро­ки кода. Казалось бы, где тут может зак­расть­ся уяз­вимость?

Что­бы это понять, давай раз­берем алго­ритм, который здесь реали­зован. Вооб­ще, при ауди­те кода сто­ит уметь читать его пос­троч­но. Тог­да про­ще понять, что имен­но может пой­ти не так.

  1. Сна­чала в перемен­ную помеща­ется параметр из URL-зап­роса. Если URL имел вид , то будет содер­жать .

  2. За­тем резуль­тат валиди­рует­ся. Это нуж­но, что­бы нель­зя было передать пос­ледова­тель­нос­ти вида и про­читать чужие фай­лы. Безопас­ность реали­зова­на регуляр­кой: в выход попадет все пос­ле пос­ледне­го сле­ша, то есть оста­нет­ся толь­ко , которо­го, конеч­но, в рабочей пап­ке не ока­жет­ся.

  3. В кон­це очи­щен­ное имя фай­ла под­став­ляет­ся в путь и заг­ружа­ется файл с этим име­нем. Ничего пло­хого.

Итак, что может пой­ти не по пла­ну?

Как ты уже, конеч­но, догадал­ся — проб­лема в фун­кции очис­тки вво­да (которая ). Давай обра­тим­ся к пер­вой попав­шей­ся шпар­галке по регуляр­ным выраже­ниям.

Шпар­галка

Тут пря­мо написан ответ, как обой­ти защиту (под­сказ­ка: ищи спра­ва).

Ви­дишь точ­ку? А шапоч­ку ()? Та стро­ка чита­ется как «если в начале стро­ки находит­ся любое количес­тво любых сим­волов, кро­ме перено­са стро­ки, и это закан­чива­ется сле­шем, уда­лить соот­ветс­тву­ющую часть стро­ки».

Клю­чевое тут «кро­ме перено­са стро­ки». Если в начале стро­ки будет перенос стро­ки — регуляр­ка не отра­бота­ет и вве­ден­ная стро­ка попадет в  без филь­тра­ции.

info

На самом деле нор­маль­ные PHP-шни­ки так фай­лы не под­гру­жают. Рас­смот­ренная задача — прос­то при­мер, хотя, по лич­ному опы­ту, даже такие без­надеж­но небезо­пас­ные прог­раммы до сих пор неред­ко встре­чают­ся. В край­нем слу­чае, мож­но поп­робовать най­ти под­домены вида или , на которых порой кру­тят­ся вер­сии сай­та десяти­лет­ней дав­ности с хрес­томатий­ными уяз­вимос­тями.

Собс­твен­но при­мер чте­ния фай­ла: .

Ре­зуль­тат 

Категории сканеров защищенности веб-сайтов

Сканеры защищенности веб-сайтов, в зависимости от их предназначения, можно разделить на следующие категории (типы):

  • Сетевые сканеры — данный тип сканеров раскрывает доступные сетевые сервисы, устанавливает их версии, определяет ОС и т. д.
  • Сканеры поиска уязвимостей в веб-скриптах — данный тип сканеров осуществляет поиск уязвимостей, таких как SQL inj, XSS, LFI/RFI и т. д., или ошибок (не удаленные временные файлы, индексация директорий и т. п.).
  • Средства поиска эксплойтов — данный тип сканеров предназначен для автоматизированного поиска эксплойтов в программном обеспечении и скриптах.
  • Средства автоматизации инъекций — утилиты, которые конкретно занимаются поиском и эксплуатацией инъекций.
  • Дебаггеры  — средства для исправления ошибок и оптимизации кода в веб-приложении.

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

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

  • Top 10 Web Vulnerability Scanners;
  • Web Application Security Scanner Evaluation Criteria;
  • OWASP Web Application Scanner Specification Project.

Уязвимости веб-приложений

Раскрытие служебных данных

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

Возможные данные:

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

Причины раскрытия данных:

  • ошибки приложения
  • ошибки конфигурации
  • системы контроля версий
  • html-код
  • «мусорные» файлы

Локальное включение файлов (LFI)

Локальное включение данных довольно часто используется веб-системами , представляет собой передачу через параметры имен локально существующих файлов и их  отображение пользователю.

Например, так:

Код такого рода часто используется для навигации по страницам сайта.

Зная структуру каталогов веб-сервера можно «попросить» его отобразить содержимое других файлов, например, содержащих пароли (/etc/password), примерно так:

Если кроме загрузки файла и отображения его содержимого происходит еще и их интерпретация, можно заставить сервер рекурсивно включать файл и посмотреть что из этого получится

 Если разработчик добавляет расширение к файлу, т.е. при вызове 

в коде будет добавлено расширение и отображено содержимое файла contacts.txt, то можно использовать null-byte — символ, обозначающий конец строки, чтобы обрезать расширение.

Инъекция команд

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

Пример:

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

В результате мы увидим не только результат команды ping, но и текущий каталог в системе.

Используя вертикальную черту, можно передавать stdout одной команды на stdin следующей команды, организуя «цепочку».

SQL инъекция

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

Примером может быть запрос такого типа:

Основные подходы:

  •  сворачивание условия WHERE к истиностному результату при любых значениях параметров (‘ OR 1=1).
  • присоединение к запросу результатов другого запроса (‘ UNION select …)
  • закомментирование части запроса (‘ —)

Команда аудиторов

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

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

Как это работает

Эксперты компании ITGLOBAL.COM оценивают реальный уровень безопасности веб-приложений и их устойчивости к хакерским атакам. Аудит помогает вам найти уязвимости и ошибки в конфигурации, оценить надежность защиты web-приложений и повысить общий уровень информационной безопасности.

Истории успеха наших клиентов

Подробнее

Что вы получаете

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

Зачем тестировать веб-приложения

Успешная атака на ваши веб-приложения может привести к двум проблемам — остановке работы компании и утечке пользовательских данных. Каждый час простоя — это клиенты, которых вы потеряли. Недоступный (даже ненадолго) сервис в сознании клиентов — это ненадежный сервис.

Утечка личных данных пользователей (ПДн) — это серьезный урон для вашей репутации, оправиться от которого не всегда просто. Проще заработать имидж компании, которая халатно относится к безопасности личных данных клиентов. Вдобавок утечка ПДн подразумевает нарушение 152-ФЗ, за которое предусмотрена административная ответственность, включая штрафы.

Как мы работаем

Эксперты ITGLOBAL.COM проверяют фронтэнд и бэкэнд (клиентская и серверная часть веб-приложений). Они тестируют конфигурацию ПО, бизнес-логику приложений, среды передачи данных, корректность обработки входной информации, настройки механизмов аутентификации и разграничения прав доступа. Анализируется бизнес-логика веб-приложений и дается оценка эффективности используемых средств защиты. В ходе работы используются разные методики тестирования, в зависимости от ваших задач.

  • White Boх. Здесь имитируется атака от злоумышленника, у которого есть полный доступ к веб-приложению и его исходному коду.
  • Grey Box. Аудитор имитирует атаку хакера, у которого уже есть доступ к веб-приложению и с определенными правами.
  • Black Box. Вид атаки, при котором у аудиторам известны только внешние IP-адреса и URL общедоступных сервисов: веб-сайтов и серверов.

Работа наших аудиторов отвечает требованиям общепринятых отраслевых стандартов: Open Web Application Security Project Testing Guide, Open Source Security Testing Methodology Manual, Web Application Security Consortium.

Зачем нужна услуга

Сервисы критически важны для работы вашей компании. Клиенты доверяют им свои персональные данные, совершают заказы или же работают с ними.

Рынок, на котором вы работаете высококонкурентный, клиенты постоянно нуждаются в ваших услугах и недоступность веб-приложений абсолютно недопустима.

Вы хотите добиться высокого уровня информационной безопасности в компании.

Почему ITGLOBAL.COM Security

Работаем с вами и во время проекта, и после его завершения

ITGLOBAL.COM — единый партнер по всем задачам информационной безопасности

Профессионально работаем в сфере аудита и ИБ более пяти лет

Серьезно относимся к озвученным обязательствам и срокам

Наши аудиторы — сертифицированные специалисты в области информационной безопасности, которые используют лучшие мировые практики

Используем лучшие мировые практики по обеспечению ИБ и охотно делимся опытом

Тестирование пользовательского интерфейса

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

Основные интерфейсы:

  • Интерфейсы веб-сервера и приложения.
  • Интерфейсы сервера базы данных и сервера приложения.

Если база данных или веб-сервер для какого-либо запроса, исходящего от сервера приложения, возвращает сообщение об ошибке, сервер приложения должен фиксировать его и отображать пользователю.

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

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Работатека
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: