Статья посвящается любителям CLI в знак солидарности лучшего терминала на OS Android, который испытывает «кошмарную» монополию Google.
Termux — это Android приложение под свободной GPL3+ лицензией: эмулятор терминала для среды GNU/Linux, которое работает напрямую без необходимости рутирования. Минимальный базовый функционал устанавливается автоматически, расширенные возможности подтягиваются с помощью менеджера пакетов и установкой стороннего ПО с git, а продвинутая деятельность на телефоне достигается за счёт рут-прав пользователя и установкой proot дистрибутивов GNU/Linux.
Сам Termux весит ~100 Мб (расширяется на Гб) работает на OS Android v7-11.
Termux-среда — киберпанковские разработки и некоторые пакеты содержат кучу ошибок, исправлением которых при случае занимается сам пользователь или сообщество, что является (по шкале красноглазия) нормой в open source среде (стандартные пакеты так же как и приложение распространяются под свободными, но разными лицензиями — это требования сопровождающих packages). В целом, качество и популярность приложения поддерживается на достаточно высоком уровне в мировом масштабе (звёзды на Github-е; рейтинг/отзывы на GP). В настоящее время технические политики GP vs Termux конфликтуют между собой в результате чего у пользователей новичков может ничего не получаться в CLI с минимальным базовым функционалом из коробки. RTFM и ещё раз RTFM. На Github-е с рекурсией на документацию частые проблемы и их решения достаточно технически-просто расписаны сообществом, по этому стоит лишний раз заглянуть в местную wiki перед постингом своей проблемы на профильном форуме.
Опыт использования Termux
Я уже не помню точно когда и каким образом Termux стал инструментом моей души, но изучать и юзать это чудо стал со времён Android 6. Накопился личный опыт, которым я хотел бы поделиться с читателями и по возможности самому освоить что-то новое (пишите в комментах ваш уникальный опыт использования этого терминала).
В данной работе вербализация пойдет о нижеизложенном со всеми остановками:
управлять серверами через ssh;
скачивать ролики/отрывки с YouTube;
нарезать видео, создавать gif;
воспроизводить музыку/радио прямо в CLI;
нарезать mp3-бигфайлы (аналогов приложений на Android попросту нет);
редактировать документы;
проверять орфографию: как txt-документов, так и различных статей по url, например, проверка орфографии статей на Habr-e;
генерировать словари различной сложности;
создавать блок-схемы; графики и даже 3d-визуализацию;
тестировать интернет соединение/интерфейс (требуется частично Root);
снифить/сканировать сети (требуется частично Root);
запускать и управлять TOR-сетью;
управлять приложениями и процессами в ОС Android (требуется Root);
защищать любые данные от случайного редактирования/уничтожения;
автоматически бэкапить/шифровать по ночам любые данные в своё облако;
проводить аудит безопасности (об опасности сердить скрипт-кидди с их любимыми: «снифить, парсить, брутить, дампить, сканить, фишить»);
работать с электропочтой;
изучать unix/shell;
программировать на Android (на выбор пользователя. В Termux портированы несколько интерпретируемых и компилируемых языков программирования);
запускать python/php/npm скрипты;
работать с криптографией; стеганографией и цифровыми подписями;
парсить данные;
и даже запускать GNU-gui-софт из CLI.
Дисклеймер
Любые действия и техники исполнения, связанные с рассматриваемыми инструментами в данной статье, являются исключительно ответственностью читателей. Злоупотребление набором инструментов и/или недопонимание может привести к ответственности соответствующих лиц. Автор не несёт ответственность в случае предъявления каких-либо обвинений против каких-либо лиц, злоупотребляющих инструментами/информацией для правонарушений; или сдачи читателями на запчасти своих испорченных гаджетов. Инструменты, упомянутые в этой статье, связанные с бэкапом/пентестом/шифрованием могут нанести ущерб или быть опасными, ознакомьтесь с законами вашей страны/округа и технической информацией. Если вы что-то собираетесь использовать, то используете это на свой страх и риск. Короче, автор ни к чему не призывает, а лишь демонстрирует возможности ПО в ознакомительных целях, что не является руководством к неправомерным действиям или обучающим материалом для сокрытия правонарушений.
Установка и настройка среды Termux
1. Скачиваем и устанавливаем приложение Termux из магазина приложений F-droid (Termux в магазине приложений GP больше не поддерживается и не обновляется с осени 2020 года, вся разработка продолжает осуществляется на Github, но релизы выкладываются в F-droid/Github). Причины с рекурсией описаны здесь.
2. $ termux-setup-storage
Этой командой пользователь предоставляет Termux разрешение на «доступ к хранилищу» (обязательный шаг). После предоставления разрешения приложению у пользователя появится доступ из Termux к диску/общедоступным каталогам Android через ~/storage/shared/* и флэш накопителю ~/storage/external-1/. На Android 11 существуют проблемы с правами: требуется повторно отозвать/дать права «доступ к хранилищу»:
* «настройки android» -> «приложения» -> «termux» -> «разрешения»;
* отозвать разрешение на хранение;
* предоставьте разрешение на хранение еще раз.
А на Android 12 Termux не способен в принципе нормально работать.
3. Установка ПО из менеджера пакетов
$ pkg list-all
#посмотреть стандартные пакеты в менеджере (альтернатива apt/dpkg). Портированных пакетов >1000, не заблудитесь.$ pkg update && pkg install python wget curl nano git tsu tor cronie grep htop printf
#установить необходимый минимум утилит, другие пакеты выбирать и ставить по мере необходимости.
У Termux имеется приятная особенность угадывания: если пользователь запускает какую-либо утилиту (в т.ч. с опечаткой), которая у него не установлена, но присутствует в репозитории, то юзер получает уведомление «угадывания» в терминале: что похожего имеется в репо и что пользователю нужно доставить.$ sqget
#ввод ошибочной команды$ pkg show «оно ли это»
#получить мета-информацию о пакете
Пример решения проблем с обновлением/установкой пакетов
Если пользователь Termux сталкивается с ошибкой при 'pkg update' обновлении пакетов из коробки (как повезёт), например из-за цензуры в стране, и/или из-за того, что Termux давно не обновлялся на устройстве пользователя (или того хуже имеется проблема с подписями: Termux ранее был установлен с GP и обновлён/переустановлен с F-droid); из-за компрометации ключей разработчиков, то удаление/установка Termux-приложения не поможет (обязательно нужно вычищать с устройства и все установленные termux-сервисы (termux api; termux boot; termux style), а так же очищать кэш и данные приложения перед удалением версии Termux GP). После же обычного удаления приложения часть данных остаётся на устройстве пользователяв, в таком случае проблем не избежать.
$ termux-change-repo
Выбрать получение обновлений (для всех репо, их может быть больше одного) с другого хостинга, которое не цензурируется вашим провайдером (на мой взгляд самое стабильное зеркало репозитория в РФ — это зеркало Termux/Github). Эта проблема и ее решение описана в документации, но как видите некоторые юзеры об этом и не догадываются и регулярно задают одни и те же одинаковые вопросы на профильных форумах (обычно такие пользователи вычисляются по количеству минусов над своим вопросом).
4. Кастомизация Termux (необязательно)
4.1. Стиль
Благодаря Fan-сообществу в Termux имеется множество готовых цветовых тем, а не только белый шрифт на чёрном фоне. Для выбора темы пользователю необходимо скачать с F-droid дополнение к Termux: Termux-Styling. После установки аддона при длительном нажатии на экран в области CLI появится пункт: more --> style. Можно выбирать/сменять из списка любую, приятную для глаз цветовую тему.
4.2. Настройка приветствия и приглашающей строки (необязательно)
Для настройки кастомной, приглашающей строки пользователю необходимо описать переменную «PS1» в файле домашнего каталога ~/.bashrc
$ nano ~/.bashrc -$
#ключ «-$» заставляет nano визуально переносить текст на новую строку
HISTSIZE=20000 #сохранять историю команд
HISTFILESIZE=1000 #размер истории в текущей сессии
export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S' #отображать дату введённой команды в истории (проверка даты --> $ history)
PS1="\[\033[1;34m\]┌──\[\033[0m\]\[\033[1;31m\]boss\[\033[0m\]\[\033[;34m\]──[\[\033[0m\]\[\033[1;35m\]\w\[\033[0m\]\[\033[;34m\]]\[\033[0m\]\n\[\033[1;34m\]└─❕\[\033[0m\]" #настройка переменной приглашающей строки как у автора.
export EDITOR=nano #сделать nano — редактором по умолчанию.
#«ctrl + o» сохранить; «ctrl + x» выход; $ bash
Для настройки приветствия пользователю необходимо отредактировать файл "/data/data/com.termux/files/usr/etc/motd".
Если у пользователя имеются рут-права, то редактирование файла «motd» из-за общего доступа очень простое, например, с помощью Total Commander в связке с QuickEdit. Если же рута нет, то$ nano ../usr/etc/motd
#две точки означают подняться на каталог выше из текущей директории.
Всё что пользователь набросает в "motd" каждый раз будет отображаться при запуске Termux. В моём случае с помощью утилиты figlet сгенерировал текст «Код Доступа Рай», добавив строкой ниже смайлики цветных кружков и всё это записал в файл «motd».
4.3. Настройка размера отображения вывода в CLI
По умолчанию Termux отображает 2000 строк, что является невероятно низким значением рендеринга по отношению к мощностям гаджетов. Например, пользователь сильно ограничен при просмотре баз данных, словарей, работой с html/текстами и т.д. Что бы проще было понять проблему её нужно воспроизвести.
Код:$ seq 2100
#генерация числовых строк от 1..2100 и вывод их на печать. Попробуйте прокрутить CLI до самого верха и вы остановитесь на числе/строке 100 (всё что сгенерировано до числа 100 пользователь не увидит, а увидит строки чисел от 100..2100, вот оно ограничения в 2к строк).
В прошлом году я обратился к разработчикам Termux с предложением расширить ограничения терминала с 2к строк до 5-50к. строк. Проведя тесты, разработчики поддержали предложение и в Termux с v0.114+ доступна пользовательская настройка на рендеринг строк в termux-конфиге.
Код:$ nano -$ .termux/termux.properties
#конфиг, в котором настраиваются некоторые вещи: например, рендеринг строк, клавиши виртуальной клавиатуры, кликабельность ссылок в CLI
terminal-transcript-rows=10000 #отображать в CLI 10к строк вместо 2к (доступно с v0.114+)
terminal-onclick-url-open=true #понимать url(s) в CLI (доступно с v0.118+).
Парсинг данных
«Лошадью ходи, лошадью!»
Однажды по пути в командировку мне на глаза попалась свежая chess-news: во время девятой, зимней, недавно завершившейся, партии за звание ЧМ по шахматам среди мужчин 2021г. наш «декабрист» допустил грубейшую ошибку (на уровне «любителя»), повлиявшую и на окончательный итог турнира не в его пользу. Поискав в сети саму партию в чистом виде для импорта/анализа в шахматном движке на своём Android — столкнулся с проблемой: всякие, разные, шахматные сайты/базы требовали регистрацию/авторизацию что бы поработать с данными. Например, на одном таком, русскоязычном, шахматном сайте партия отображалась, но без аккаунта — скачать её было «невозможно». Расшарив ссылку на 9-партию, её все ещё «невозможно» было скопипастить подручными средствами для анализа. Самому же «играть в шахматы, угодя в цейтнот», против сайтов по их правилам я не спешил. Расставив черные и белые фигуры на доске кликнув по тёмно-белому значку Termux на рабочем столе и набрав несколько команд, черным по белому отобразился результат. Беспристрастно проанализировав партию в скором времени движок подытожил: «драма» за доской разыгралась в жарком декабре Дубая на 27 ходу.
curl https://share.chessbase.com/SharedGames/game/?p=GGcui1RiwlsMXUUn49qJYW2loW1DrYRbproL+VX5mtFrtma1XhYxiFD4U+vvB+7P | grep "WCh 2021" -A 12 #чекаю ссылку с помощью curl, ищу данные партии, вывожу 12 строк (охват партии)
Загружаю её в open source Android приложение droidfish и включаю анализ.
И забавная реакция чемпиона мира, против которого так «дерзко» было сыграно:
К слову, в Termux имеется возможность играть в шахматы прямо в CLI. Пакет для установки: «gnuchess».
$ pkg install gnuchess
$ gnuchess
спойлер gnuchess
Музыкальный пауза
Являясь поклонником литературного аудио сериала Этногенез (ИМХО, одни из лучших аудиокниг в проекте — цикл про хакеров [1, 2]) намеревался получить всю коллекцию этногенез-музыки, а потом ещё и слушать её прямо в CLI. Сами саундтреки бесплатные и свободно доступны на официальном сайте для скачивания в разделе музыка.
82 музыкальных трека, из которых некоторые просто не качают не вау, а некоторые почему-то повторяются, тем не менее присутствует более насущная и техническая проблема: отсутствует возможность/кнопка «скачать весь проект». Классика: выбор композиции и скачивание по одному файлу, как по итогу — лишних восемьдесят пальцедвижений помноженное на прокрутку и выбор явно повлечёт за собой переутомление и потерю темпа.
Карманный CLI спешит на помощь...
Чтобы проверить с чем именно придется иметь дело, сurl-ом и grep-ом проверяю web-страницу проекта Этногенеза. Разметка страницы простая, набрасываю рабочий bash-код в одну строку для скачивания всех аудиотреков за один присест. Жизнь движение, ставлю «музыкальный поток» на автоскачивание и ухожу на тренировку.
Код:
#Создаю общедоступный каталог «этногенез», в который собираюсь загрузить все аудиотреки:$ mkdir storage/shared/Download/этногенез
$ cd storage/shared/Download/этногенез
Curl-ом получаю html-страницы, grep-ом ищу все отношения к «mp3»:
curl http://www.etnogenez.ru/music/ | grep '<span><a href="/paid-audio/0/pgg/episode'
Исходя из проанализированных данных полный код на скачку музыки следующий:
mkdir storage/shared/Download/этногенез
cd storage/shared/Download/этногенез
curl http://www.etnogenez.ru/music/ | grep '<span><a href="/paid-audio/0/pgg/episode' | awk '{print $2}' | sed 's/href="/http:\/\/www.etnogenez.ru/' | sed s/\"//g | wget -i -
# а так получить общий размер всех аудиотреков перед загрузкой = 849.09 Мб
curl http://www.etnogenez.ru/music/ | grep '<span><a href="/paid-audio/0/pgg/episode' | awk '{print $5}' | sed s/~//g | awk 'length( $0 ) < 9 {sum += $0} END {print sum}'
Описание bash-кода.
Curl-ом получаю страницу; grep-ом ищу все отношения к «.mp3»; вижу, что все нужные данные по разделителю «пробел» находятся во втором «столбце», использую awk забирая 2-й столбец; с помощью sed восстанавливаю валидный префикс url-ов всех mp3-треков и отбрасываю кавычки; готовые url(s) саундтреков поочередно отправляются на вход утилите для скачивания wget.
Однако, если пользователь не так причудлив чтобы искусно владеть bash-оболочкой, а может всё с точностью наоборот, то задачу с извлечением url(s)/mp3-треков со страницы можно повторить, например, на Python.
Код:$ pip install beautifulsoup4 html5lib
$ nano parsing_mp3.py
import requests
from bs4 import BeautifulSoup
r = requests.get("http://www.etnogenez.ru/music/").text
soup = BeautifulSoup(r, 'html.parser')
## Парсинг url(s) аудиотреков
for link in soup.find_all(class_="play ga_track"):
if ".mp3" in link.get('href'):
print(f"http://www.etnogenez.ru/{link.get('href')}")
## Предварительный размер аудиотреков
sum_ = 0
for i in soup.find_all("div", class_="inner_content episode_size"):
try:
sum_ += float(i.string.split()[0])
except:
pass
print(f"\n{sum_} Мб") #получаем общий размер всей будущей музыки
Спарсим данные.$ python parsing_mp3.py > url && wget -i url
#с помощью python извлекаю с web-сайта все url(s) относящиеся к mp3 и сохраняю в файл "url", с помощью wget закачиваю всё что указано в файле "url"
Кроме того, с помощью wget (в случаях отсутствия ограничений) можно, например, выкачать весь сайт; отдельный web-каталог или спарсить все изображения, чем не может похвастать какое-либо Android приложение.
wget -U="Mozilla/5.0 (X11; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0" -r -k -p -E -nc url #выкачать ресурс
wget -U="Mozilla/5.0 (X11; Linux x86_64; rv:97.0) Gecko/20100101 Firefox/97.0" -r -l=1 -nd -nc -A jpeg,jpg,bmp,gif,png url #спарсить/выкачать все изображения, глубина рекурсии задается ключом -l=цифра
Автоматизация процесса: бэкап, шифрование данных с последующей синхронизацией в облако по расписанию
Rclone & 7-zip & crontab
Rclone
Данные, которые я постоянно выгружаю (вернее написать: данные которые автосинхронизируются) в облако со своего Android устройства — это зашифрованные бэкапы кэш/приложения.
Бэкап приложений и их данных по расписанию осуществляет приложение OandBackuPX/TB (требуется root). Остальная логика завязана на Termux.
Синхронизация/шифрование берёт на себя «rclone». Автозапуск скрипта по расписанию осуществляется с помощью «cron» в Termux.
Установка и настройка rclone на примере Яндекс.Диска.
Код:$ pkg install rclone
$ rclone config
Настройка rclone простая: выбор в стиле POSIX:: [y/n/enter/digit] ответив на вопросы (выбирать все действия рекомендую значениями по умолчанию).
Цифрами выбрать Yandex Disk (это может быть любая другая цифра в любой/обновленной версии ПО, например сегодня это цифра - 32). Откроется браузер. Ввести данные авторизации яндекс-аккаунта и вернуться в терминал, где автоподставится ключ. Облако настроено и готово к синхронизации в обе стороны, но такое положение вещей нас не устраивает, нам нужно защищать свои данные в любом случае (примечание — если пользователю не нужно шифровать данные, для последующей выгрузки на диск, то Я.Диск на этом шаге уже настроен и готов к работе).
Чтобы создать отдельный зашифрованный каталог в облаке, необходимо донастроить созданный ранее контейнер: обеспечить шифрование/дешифрование данных на лету.
Код:$ rclone config
#настраиваем простейший конфиг
Настройка конфига
#--> n --> вводим имя (сопоставление шифрованного каталога), если у меня ранее контейнер назывался «yad», этот я назову: yenc (первая буква облака, суффикс от сокращения «encrypt», стоить иметь ввиду на будущее, что короткие имена удобней использовать в этой утилите). Выбрать «Encrypt/Decrypt a remote» --> 10, далее ввести имя и шифрованный каталог (имя до двоеточия обязательно должно = имени создаваемого ранее контейнера: yad) yad:crypt выбрать режим шифрования, их 3 (в зависимости от работы в параноидальных условиях).
1. Encrypt the filenames see the docs for the details.
2. Very simple filename obfuscation."obfuscate".
3. Don't encrypt the file names. Adds a ".bin" extension only."off".
Использую 3-й вариант, который добавляет к шифрованным файлам лишь расширение «.bin» (остальные варианты обфусцируют имена файлов).
Далее, directory_name_encryption --> «2» (false), далее Password or pass phrase for encryption --> «y» (напечатать пароль, он не будет отображаться в CLI — это не баг, а стандартная защита), далее No leave this optional password blank --> «n», далее Edit advanced config? --> «n». После чего увидите свою конфигурацию (подтвердите её нажав «y»):
[yenc]
remote = yad:cryptfilename_encryption = offdirectory_name_encryption = falsepassword = *** ENCRYPTED ***
На сколько «сложным» бы не казался rclone его конфиг настройки простой, в затруднительном положении (выбирать все пункты по «default») в крайне затруднительном — RTFM.
Вот пара команд, которые нам потребуются «sync» и «copy».
Обратите внимание, чтобы получить зашифрованные данные с Я.Диска и расшифровать, их нужно указывать просто как «yenc:» (а не «yenc:crypt»):$ rclone copy yenc: ~home/test
#скопирует/расшифрует все данные с облака в каталог test (если в папке «test» имелись какие-либо сторонние данные, с ними ничего не произойдет)$ rclone sync yenc: ~home/test
#аналогично, но уничтожит все сторонние данные в папке «test» (то есть полная синхронизация каталогов). Как всё просто. Да, так просто потерять всё. Пользователю необходимо соблюдать осторожность и внимательность, чтобы случайно не уничтожить сторонние данные. Например, ошибочный ввод:$ rclone sync yenc: ~home/
#уничтожит все пользовательские данные Termux, синхронизировав зашифрованный «crypt» каталог в облаке c «home» на гаджете нерадивого пользователя
Синхронизация, но в обратную сторону (гаджет --> облако):$ rclone sunc источник :приемник/каталог
#полная синхронизация$ rclone copy источник :приемник/каталог
#синхронизация только выбранных данных
Существуют векторы атак, при которых пользовательская цитадель может не устоять (проблема хранения облачного пароля в открытом виде в конфигурации rclone). Плюсом rclone является то, что он легко настраивается для работы в параноидальных обстоятельствах (зашифровав конфиг/открытый пароль, но потребуется вводить каждый раз пароль разблокировки при синхронизации данных). Из минусов, бэкап-данные дублируются перед шифрованием в облако, излишне нагружая дисковое пространство на устройстве пользователя.
В rclone имеется второстепенно-полезная hash-функция, которая умеет проверять рекурсивно заданный хэш у файлов во всех подкаталогах без «| трубы» и циклов (алогичная утилита hashdeep).
7-zip
Если пользователь не желает шифровать данные в облаке с помощью rclone, например, если он находится в обстоятельствах, где нет возможности быстро развернуть rclone (а установить и настроить его нет времени), а данные с Я.Диска нужно получить в расшифрованном виде как можно скорее, то на помощь приходит криптостойкий/кроссплатформенный архиватор «7-zip».
Код:$ pkg install p7zip
$ cd storage/shared/Download
$ 7z u test.7z -pCodeby -mx9 'test'
#ключ «u» сообщает, что в архив добавлять/создавать только новые/обновлённые файлы; пароль «Codeby» (шифрование криптостойкое, т.е хэш из разряда медленных, придерживаясь парольной доктрины хэш не растрескать); «mx9» максимальное сжатие; архивирование каталога «test»
Эта 7z-команда выше удобна, если пользователь настроил автобэкап архива «test.7z» в облако.
В ином случае (ручной бэкап архивов в облако).
Код:$ 7z u test.7z -pCodeby -mx9 'test' && mv 'test.7z' $(date +"%d-%m-%Y_%Hч_%Mм")_android.7z
#разница в том, что архив после сжатия будет переименован с новым дата-префиксом: «13-02-2022_10ч_25м_android.7z»
Из плюсов, наглядно видно по имени файла: когда был сделан/обновлён бэкап. Из минусов, с таким именем возникнут сложности с автобэкапом; такие архивы множатся (вместо быстрой дозаписи одного единственного архива создаются новые копии).
Автовыполнение скриптов по расписанию
В Termux нет полноценной системы инициализации, но кое-что и кое-как работает и позволяет запускать скрипты на автомате:
A) при автозагрузке гаджета;
Б) либо запускать скрипты строго по расписанию, даже когда Termux не в трее.
Для выполнения скриптов при автозагрузке гаджета необходимо установить addon Termux boot, настроив простой boot-конфиг. Для другой задачи: автовыполнение скриптов по расписанию у Termux в репозитории имеется пакет «cronie» (местный crontab), который нужно установить и немного подкрутить по причине того, что подчёркнуто выше.
Код:$ pkg install cronie termux-services
#ребут Termux$ sv-enable crond
#достаточно этот шаг сделать один раз и пользователь в деле$ crontab -e
#настроить выполнение скриптов по расписанию по классике. Например, в исполняемом "скрипт.sh" первой строкой достаточно указать сокращенный путь: "#!/bin/bash" и не забывайте про раздачу прав: "chmod +x скрипт.sh"
Быстрая проверка, работает ли "демон"$ pidof crond
Пользователям с агрессивным энергосбережением стоит добавить все приложения Termux в исключение: «ограничения работы в фоновом режиме» в настройках своего Android.
Быстрый check автоматизации процесса
Код:$ nano -$ срипт.sh
#!bin/bash
mkdir storage/downloads/Habr #создать пустой каталог в общедоступном месте
$ chmod + x срипт.sh
#разрешаем выполнение скрипта$ crontab -e
#создаём задание: каждую минуту автоматически создавать папку «Habr» в общедоступном каталоге «Downloads»
*/1 * * * * bash /data/data/com.termux/files/home/скрипт.sh #«ctrl + o» сохранить; «ctrl + x» выход из nano; «ctrl + d» выход из Termux
Любым файловым менеджером проверяем общедоступный каталог «Downloads» и ищем папку «Habr», удаляем её, но в течение минуты она снова появится, что сигнализирует о том, что скрипт работает на автомате, а значит можно приступать к написанию сценариев реальных задач.
Если пользователь не скачивал termux-boot, если у пользователя агрессивное энергосбережение, то в шторке Android/Termux есть функция «wakelock» (пытаться запрещать переходить гаджету в глубокий сон).
Бэкап Termux
В лучшем случае будет обидно установить и настроить Termux/пакеты под себя, но при развёртывании копи на другом устройстве и/или при любом инциденте потерпеть фиаско.
Проверка сколько места занимает настроенная Termux-среда. Код:$ cd ../../ && du -sh
#подняться на два каталога выше и измерить пользовательские и системные пакеты Termux
>>>4.1G
$ pkg list-install | wc -l
#количество установленных пакетов
>>> 307
Если у пользователя отсутствуют root-права, то авто/бэкап всей среды делается по мануалу.
Программирование на Android
Уметь ловко писать сценарии на bash хороший навык, но ограниченный. В Termux репозитории имеются пакеты языков программирования (ЯП), например, python, php, perl, ruby, а так же scala, elixir, java, go, rust, brainfuck. Давайте напишем нашу однофункциональную программу на всех вышеперечисленных языках, которая поприветствует пользователей Хабра.
Код:$ pkg install python golang elixir php rust perl ruby scala brainfuck
#установка ЯП, bash/java уже предустановленные среды
Хорошие новости: можно обучаться и практиковать/поддерживать навыки владения ЯП прямо с гаджета, например, проходя курсы программирования по Python на Stepik, решая задачи где бы ты не находился.
В реальности же имеются технические ограничения. Например, на Python «нельзя» писать и запускать ПО, требующего многопроцессорного параллельного вычисления напрямую в Termux (параллельные вычисления на нескольких ядрах CPU, не путать с многопоточностью (и не касается, например СИ-программ)). Скрипты, которые размашисто потребляют ОЗУ, несмотря на избыточно-свободную память могут аномально снижать скорость вплоть до замирания. Простой пример воспроизведения проблемы на Python с распараллеливанием кода на CPU(s).
Код:$ python
import concurrent.futures as pool
e = pool.ProcessPoolExecutor(max_workers=2, mp_context=None, initializer=None, initargs=())
#Приведёт к следующей ошибке:
#>>>raise ImportError("This platform lacks a functioning sem_open" + ImportError:
#This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.
По той же причине не встанет, например, и библиотека NumPy и импортирующее её ПО:$ pip install numpy
#установка не завершится и приведёт к ошибке
Но если очень надо....
Вмешаемся в сам интерпретатор Python, заменив многопроцессорные параллельные вычисления на многопоточные.
Код:$ nano ../usr/lib/python3.10/multiprocessing/synchronize.py
заменяем ~28 строку:
from _multiprocessing import SemLock, sem_unlink
на
from threading import Lock
В таком случае можно запускать параллельные вычисления в потоках, а не процессах.
Proot-distro
Компромисс. Если пользователь располагает достаточно свободным дисковым пространством (±10 Гб) на своем гаджете, то он может установить в Termux один из дистрибутивов GNU/Linux (например, termux-ubuntu и п.д.).
И запускать не только скрипты, требующие распараллеливания кода на CPU(s), но и юзать GUI-софт, например, Gimp.
Proot-distro, метафорично выражаясь — это сила Temux и ни NetHunter-у и ни Andrax далеко им всем сейчас. Вся Termux-стихия заключена в 4-х строчках ниже, но обойдя одни ограничения, обязательно натыкаешься на другие (overkill abstractions).
Код:$ pkg install proot-distro
$ proot-distro list
$ proot-distro install ubuntu
$ proot-distro login ubuntu
Сравнение пакетов
mutt & smtplib
Для работы с электропочтой в Termux имеется пакет: mutt.
Код:$ pkg install mutt
$ nano ../usr/etc/Muttrc
#редактирование конфига в CLI/nano для тех у кого не рут прав$ mutt
#запуск
Работа с email требуется, например тогда, когда произошло какое-либо событие, и в случае успеха или ошибки автоматическая отправка репорта на email. Я не могу похвалить или раскритиковать mutt не предвзято т.к. пользуюсь в подобных скрипто-делах Python с библиотекой smtplib, которая работает стабильно и без нареканий.
Сравнение пакетов: html2tetx* vs links
А вот пример, когда сторонний софт перспективнее местного. В Termux имеется в наличии пакет «html2text», который позволяет выводить очищенные от тегов web-страницы в CLI. У данного пакета имеются нюансы с автовыбором кодировки: например, русскоязычные символы отображаются кракозяброй и на мой взгляд не самое лучшее форматирование текста. В Python имеется альтернативный пакет с тем же названием и аналогичным функционалом, но ИМХО, разработкой на порядок выше. Сравним эти два пакета от разных разработчиков, написанных на разных языках, но выполняющих одну и ту же функцию (примечание — html2text популярные утилиты и представлены на многих ЯП, не только на Python и Perl).
Код:$ pkg install html2text
#установка из репозитория Termux
#тесты$ pip install html2text
#установка из репозитория (каталог ПО Python)
#тесты
Запуск разных html2text-пакетов на примере обработки одной и той же русскоязычной статьи:$ curl https://habr.com/en/post/488432/ | html2text
Альтернативный, возможно даже более удобный, способ получить текстовую версию web-страницы очищенную от тегов — это использовать cli-браузер, например, links.
Код:$ pkg install links
$ links # «g» открыть url --> файл --> Сохранить форм. документ
Преимущество cli-браузера перед curl/html2text-пакетами — это гарантия корректного форматирования текста. В links можно сохранить масштабируемый/форматированный текст по любой/заданной ширине, используя легкий жест двумя пальцами по cli-экрану.
Для общего развития просто сравните выхлоп команд на смартфоне, а не на планшете и покажите мне в комментариях. Код:$ links wttr.in/kolomna && curl wttr.in/kolomna
«Ожидание...»
Yaspeller
Как было выше написано: сторонний cli-git-софт — это не только python-скрипты. Например, установим в Termux полезный для авторов-редакторов npm-пакет yaspeller, написанный на JS русскоязычным разработчиком, который позволяет проверять ru-en орфографию локальных txt-данных, так и данных по url в два касания.
Код:$ pkg install nodejs
$ npm install yaspeller -g
$ yaspeller https://habr.com/ru/post/647267/
#указываем любой url для проверки ошибок
Обычно материалы на портале Хабр считаются в рунете достаточно грамотными и качественными: авторы текстов заботятся о своей репутации, в т.ч. модераторы постоянно следят за статьями. Но иногда там можно встретить и такую жалость, как на скрине. Орфографический анализ yaspeller информирует в целом и о низкой квалификации автора, статью которого, впрочем, сообщество оценило по достоинству: загнав в глубокий минус автора и его материалы.
В моём топ-списке пакетов этот инструмент, возможно, самый популярный (нет, не для того чтобы устроить кому-либо очередную IT-порку, а для поддержания качества собственных материалов).
Снифить, парсить, брутить, дампить, сканить, фишить
В одной жизни Вы - Томас Андерсон, программист в крупной уважаемой компании. У Вас есть медицинская страховка, Вы платите налоги и еще - помогаете консьержке выносить мусор. Другая Ваша жизнь - в компьютерах. И тут Вы известны как хакер Нео. Вы виновны практически во всех уголовно наказуемых компьютерных преступлениях. У первого - Томаса - есть будущее. У Нео - нет.
Pipal
Следующий инструмент, о котором не стыдно публично сообщить написан на ruby. Вы находите утечки, он рассказывает вам интересные истории.
Возможно, читатели не раз встречали в сети новости о том, что в интернет выложена очередная утечка паролей: «дамп из некоего диджекорп». И разные издания из рук в руки перепечатывали анализ и выводы экспертов не вникая в суть деталей. Давайте немного побудем экспертом и сами проанализируем одну из публичных утечек паролей с помощью Pipal.
Итак, что делает Pipal? Самый простой способ объяснить — выборочно показать вывод, полученный при разборе списка утекших паролей. Я нагуглил список паролей из утечки «...», которую я взял «...» (многоточия проставлены по этическим причинам).
Код:$ pkg install ruby
$ git clone https://github.com/digininja/pipal && cd pipal
$ ./pipal.rb dump.txt
#dump.txt — утечка/словарь содержащий пароли
Из работы pipal видим, что утечка данных внушительная: содержит ~426K утекших паролей и из них ~78% уникальных паролей. По классике самым популярным паролем является пароль «123456», но и встречается он довольно редко менее чем 0,5% от общего дампа. Популярная длина паролей от 6-10 символов и пользователи в основном очень любят использовать простой буквенный пароль в нижнем регистре (33%). На скрине видно и топ 10 базовых слов (это частые слова что-то вроде корней, без префикса и суффикса если такие встречаются чаще остальных). Внешний список (external list) - что-то вроде базовых слов, только их задает сам пользователь на основе мета-информации об утечке БД. Предварительный вывод: высока вероятность реальной утечки данных, а не вброса.
Описательная статистика прежде всего интересна тем шифропанкам, кто работает со словарями и занимается обогащением баз данных.
Продолжая темпу пентеста было бы нечестно не затронуть инструменты и на родном bash.
Фишинг
Почему пользователям стоит обращать внимание на подозрительные ссылки и по возможности их избегать покажу на примере инструмента zphisher.
Код:$ git clone git://github.com/htr-tech/zphisher.git
$ cd zphisher
$ bash zphisher.sh
$ git pull #обновление
Инструмент примечателен тем, что атакующий может отказаться от «ngrock» и не вникать в связанные с ним ограничения чтобы туннелировать фишинговую ссылку.
Использование фишинга на примере Instagram. Ключи команд отсутствуют, атакующий выбирает все действия цифрами: что именно он будет использовать. Выбрав в качестве примера Instagram, а в качестве инициализации туннельный клиент cloudflared, а не ngrock получил на выбор две рандомные, но рабочие фишинг-ссылки. Открыв, например, обфусцированную ссылку на своём устройстве жертва предоставляет атакующему свой ip-адрес. Дизайн страницы Instagram реалистичный (жертве стоило бы обратить внимание на url). И если атакуемый, поддавшись манипуляции и коварству социальной инженерии, введёт свои данные (или рандомные), они тут же будут перехвачены атакующим, а фишинговая страница перенаправит скомпрометированного пользователя на официальный сайт Instagram для авторизации (создав ложное впечатление о том, что юзер просто ошибся при вводе логина/пароля, а повторный ввод логина/пароля авторизует нерадивого пользователя, усилив его предположение об ошибке).
Собираем легендарный инструмент аудит паролей, в основном написанный на Cи — John The Ripper
John The Ripper (далее JTR) — это софт для аудита паролей.
JTR хорош по отношению к любому подобному ПО тем (часть wiki опубликована мной), что он может самостоятельно извлекать хэш любого формата с помощью внутренних скриптов *2john. Например, нужно восстановить пароль от своей забытой keepass БД — для извлечения хэша используем keepass2john и т.д.. В Hashcat, например, на большинстве форматов пользователю необходимо уже иметь готовый хэш на руках, а где его брать, или чем извлекать пользователю киберпанкам из Hashcat не интересно, но в сети встречаются дискуссии: когда таких пользователей Hashcat-овцы отсылают за хэшем к JTR. Кроме того, функционал JTR предназначен в т.ч. и для генерации словарей любой сложности со скоростью Си, а само JTR-ядро made in Russia.
JTR компилируется с оглядкой на предустановленные пакеты пользователя, например, если у пользователя установлен пакет «libz/libbz2/libpcap», то он сможет брутить гораздо больше хэшей. Кроме того, для извлечения некоторых хэшей требуется сторонние ЯП, например, python/perl.
Код:$ git clone https://github.com/openwall/john && cd john/src && ./configure && make -s clean && make -sj4
Несколько нюансов о ПО:
то что JTR компилируется и запускается на Android устройствах уже хорошо (годами ранее — это было невозможно, да и сейчас поддержка гаджетов заявлена только для оф. Android-приложения JTR-HSD (кубинская разработка) с ограниченным набором в 14-хэшей);
при работе JTR нагружает все ядра CPU на 100% (потому что, например, опция контроль утилизации ресурсов «--fork=2»не отработает на Android как заявлено на GNU/Linux и всё равно будет грузить все ядра CPU на всю катушку), а при таком раскладе на длинной дистанции можно получить вместо пароля любые проблемы/ущерб, т.к. JTR-у плевать на температурный контроль вашей батареи, (ниже я покажу обходное решение этой проблемы);
скорость брутфорса для некоторых хэшей не оптимизирована для нашей среды.
Проведем тестирование на скорость/криптостойкость, например, двух разных архив-форматов: rar vs zip в JTR и разберём предварительные результаты.
Код:$ ~/john/run/john --test --format=rar5 && ~/john/run/john --test --format=zip
1. Оба архив-формата поддерживаются JTR на Android девайсах (то есть можно проводить брутфорс атаку).
2. Оба архив-формата поддерживают параллельные вычисления на всех ядрах CPU. Параметр «с/s real» отображает реальное положение вещей (на моём гаджете 8 ядер): скорость при брутфорсе будет составлять ~150 паролей/с. для rar и 10,6к паролей/с. для zip форматов. Параметр «c/s virtual» отображает скорость брутфорс атаки на одном ядре CPU . Если на каком-либо хэше с/s real = c/s virtual, то это означает, что параллельные вычисления на CPU для данного формата не поддерживается JTR-ом, и брутфорс такого рода хэшей будет задействовать лишь одно ядро CPU.
3. Из скрина JTR-1 видим, что rar-архив криптостойкий по сравнению с zip-архивом. В целом хэш из разряда медленных и растрескивать его целесообразно, разве что на коротких цифровых паролях, или обладая достаточно-большой мета-информацией о пароле: сведя к минимуму всевозможные комбинации.
Простая математика брутфорса.
Например, гарантированное время восстановления пароля для rar архива с паролем «6948» ~= (10^4/150) = 67c. А что если мы обладаем меньшей мета-информацией о пароле, например, мы предполагаем, что пароль цифровой, но может иметь длину не строго 4 знака, а от 1-4 цифр в таком случае, гарантированное время восстановления увеличится на 10% ~= (10^4/150) +(10^3/150) +(10^2/150) + (10^1/150) = 74с. Время выросло, но с такими подобными/предварительными данными мы просто «обязаны» атаковать подобные криптостойкие форматы. А вот, например, буквенно-цифровой пароль длиной от 1-4 символов в нижнем регистре мы сможем сбрутить лишь в диапазоне до 3.5ч. (36^4/150) +(36^3/150) +(36^2/150) + (36^1/150).
Расчет: 26 букв + 10 цифр = 36, степень - длина пароля, 150 - перебор хэшей в сек. на всех 8 ядрах CPU. Для батареи гаджета такое время работы CPU на всю катушку явно критическое. Но, как обычно, в подобных делах можно проявить хитрость и «упорство». Возможно, некоторые читатели сразу подумали об искусственном охлаждении девайса на подзарядке в холодильнике, но финиш можно растянуть, контролируя нагрев батареи с прерыванием и последующим возобновлением атаки, и JTR поддерживает данную функцию («ctrl + c» прервать атаку, «john -restore» - продолжить атаку с места прерывания).
Кроме того, в GNU/Linux имеется пользовательская поддержка: настройка ограничений загрузки процессора для любых операций (OMP_NUM_THREADS и taskset).
Код:$ OMP_NUM_THREADS=3 ~/john/run/john hash
#данная команда разрешает использовать JTR на все 100% только 3 ядра из 8, что в перспективе снизит нагрузку на батарею, но замедлит растрескивание хэша
Аналогична и манипуляция:$ taskset -c 0,2,7 ~/john/run/john hash
#данная команда заставляет JTR использовать CPU 3/8 ядер (первое; третье и восьмое ядра, т.е. контроль утилизации ресурсов предоставлен на выбор пользователя)
Давайте наконец-то сбрутим наш пароль, подтвердив, вышеизложенные, теоретические расчёты на практике.
Код:$ ~/john/run/rar2john storage/shared/Download/test.rar > hashrar
#извлекаем хэш$ ~/john/run/john --incremental=Digits -max-len=4 hashrar
#брутим хэш rar архива «test.rar» (сообщаем JTR, что пароль исключительно цифровой от 1 до 4 символов)
Из скрина JTR-2 видим, что JTR разогнался и показал свою ярость, перебирая пароли ~ на 7% быстрее чем в тестах, а пароль «6948» был восстановлен за 38с. то есть в рамках (теоретически рассчитанного выше) гарантированного диапазона расчётного времени: 74с.
Но пользователь человек с интеллектом, а не алгоритм машины, заученные шаги ему не помогут, если неизменно полагаться исключительно на тесты JTR, хотя мы и видим как они важны. На скрине JTR-1 в тестах кроме архивов видим и хэш «telegram» (примечание: добавил Tg для сравнения, формат telegram в JTR - это local code telegram, защитный pin/pass на Android; Windows и GNU/Linux desktop программах). Судя по скрину тест JTR информирует нас о том, что хэш telegram из разряда медленных/криптостойких (скорость перебора 417 паролей/с.). Это не совсем так. Хэш telegram-a криптостойкий лишь для Telegram-программ на OS Windows и GNU/Linux, а на Android-е local code — это «пустышка» и его реальная скорость перебора ~составляет не (417 паролей/с., а космические 1.11млн. паролей/с.).
Давайте восстановим цифровой и буквенный «pin/pass пустышки» на Android-Telegram, оценив энергозатраты и сравним с тестами.
Код:
# Пользователю необходимо задать pin/pass в Telegram на своем рутированном Android-устройстве, далее:$ ~/john/run/telegram2john.py userconfig.xml > hashtelegram
#извлекаем хэш из «/data/data/org.telegram.messenger/shared_prefs/userconfing.xml»$ ~/john/run/john hashtelegram --mask=?d?d?d?d
#запускаем брутфорс атаку
Команды аналогичны и для pass local code, изменяя маску/словарь.
Из скрина JTR-3 видим, что любой pin (в данном примере pin «7596») восстанавливается мгновенно, а буквенный пароль в нижнем регистре на примере пароля «codeby» восстановлен за 2м.13с., что соответствует гарантированному времени восстановления пароля при брутфорсе (и в тоже время противоречит JTR-тестам).Р асчет диапазона гарантированного времени восстановления пароля составлял: (26^6/1_100_000/60) ~= 4.5мин.
Для сравнения, если бы ваши данные хранились не в Tg, а в любом другом защищенном контейнере, например в rar, то на брутфорс пароля «codeby» при прочих равных обстоятельствах потребовалось бы гарантированное время восстановления ~24суток.
Обратите внимание, что хэш local code telegram для брутфорса на Android доступен пользователям с рут-правами по пути:
"/dat/data/org.telegram.messenger/shared_prefs/userconfing.xml", а JTR попросит доставить крипто-python-пакет.
Пример из жизни: однажды мне в лс написал читатель с просьбой о помощи восстановить свой local code telegram, доказав в суде свою непричастность.
На сколько целесообразно и актуально проводить брутфорс на гаджете, надеюсь для читателей стало чуть более очевидным.
Хотя, стоп, стоп, стоп! А как же без скрипт-кидди классики: вардрайвинга? Совершенно верно — никак.
Рассмотрим вторую из двух частей атаки, которая отработает на любом гаджете: сравнив брутфорс wifi-рукопожатия с помощью JTR и с помощью aircrack-ng.
Восстановление wifi-пароля с помощью JTR
Никаких чисток захваченного рукопожатия, якобы ускоряющих атаку, не проводим. Эту чушь, которую новички продолжают черпать с одного источника — не актуальна. Кроме того, нет необходимости в конвертации стандартного cap-формата рукопожатия в индивидуальные форматы (извлечение хэша засчитываем, как стандартную операцию, а не конвертирование).
Код:$ ~/john/run/wpapcap2john storage/shared/Download/test/test_wifi.cap > hand_wifi
#извлечение хэша$ ~/john/run/john -w=storage/shared/Download/test/word.txt hand_wifi
#атака по словарю на извлеченный хэш
Восстановление wifi-пароля с помощью aircrack
Aircrack в репозитории багный и если не запускается после установки, то нужно пролечить: переименовать "/data/data/com.termux/files/usr/lib/libaircrack-ce-wpa-1.6.0.so" > "libaircrack-ce-wpa.so".
Код:$ pkg install aircrack-ng
#предполагается, что у пользователя установлен root-repo и имеются рут права.$ head -n 15000 storage/shared/Download/test/word.txt | aircrack-ng -w - -e Ragnar storage/shared/Download/test/test_wifi.cap
Я трижды, дважды, десять не рекомендую пользоваться в принципе aircrack-ng из-за его багов, которые представлены сообществу как фичи. А много ли хэш-форматов поддерживает JtR? Много:$ ~/john/run/john --list=formats | wc -l
>>> 506 formats (149 dynamic formats shown as just "dynamic_n" here).
Но, как написал выше о хэшах для JTR: некоторые не оптимизированы, некоторые с багами, некоторые требуют perl-настроек подобного. По итогу, JTR — это лучшее, что есть на Android устройствах в своей области для растрескивания хэшей.
OSINT в Termux
Читая комментарии на Хабре, я обратил внимание на активность «подозрительных аккаунтов»: эти аккаунты объединяла, некая на мой взгляд, закономерность:: во-первых, они имели сходные nickname(s) (k30; k32...), во-вторых, были подписаны на топики «сделай сам». Я решил проверить популярность k-аккаунтов над другими подобными аккаунтами, например, b-аккаунтами на дистанции в 111 учёток т.е k0, k1..k99. Для этого использовал инструмент разведки по нику — Snoop Project.
pkg install python libcrypt libxml2 libxslt git
pip install --upgrade pip
git clone https://github.com/snooppr/snoop -b snoop_termux
cd ~/snoop
python -m pip install -r requirements.txt && cd
john/run/john -min-len=1 -max-len=3 --mask=k?d?d --stdout | sort -n -t "k" -k2 > k-аккаунты #выше я писал, что JTR в т.ч. умеет генерировать словари (альтернатива crunch). Генерирую словарь из 111 к-аккаунтов (почему не 100, первые 10 аккаунтов имеют вид k1 и k01...)
john/run/john -min-len=1 -max-len=3 --mask=b?d?d --stdout | sort -n -t "b" -k2 > b-аккаунты# прошу snoop прочекать все 111-аккаунтов на порталах «Habr» и «Codeby»
python snoop.py -s habr -u k-аккаунты
python snoop.py -s habr -u b-аккаунты
python snoop.py -s codeby -u k-аккаунты
Metasploit
Иди за белым кроликом...
Одним из самых популярных true_инструментов у безопасников является Metasploit, но в местном репозитории он всё: false (кстати, как и sqlmap).
Вот скрин с избитой Termux-wiki страницы посвященной инструменту.
Нет, это не wiki-вандализм, вот официальная позиция лиц сопровождающих репозиторий, цитирую переводом:
Не обслуживаем функции взлома, фишинга, рассылки спама, шпионажа и DDoS.Мы не принимаем пакеты, которые служат исключительно деструктивным целям или целям нарушения конфиденциальности, включая, помимо прочего, пентестинг, фишинг, брутфорс, sms/звонки, DdoS-атаки, OSINT.
Немного обидно и за OSINT, вспыхнула в памяти фраза главного судьи по делу pgp в далёкие времена, когда криптография приравнивалась к оружию, а шифропанки испытывали давление:
«Двери сарая открыты и свиньи сбежали».
Установка Metasploit:
$ wget https://raw.githubusercontent.com/gushmazuko/metasploit_in_termux/master/metasploit.sh && chmod +x metasploit.sh && ./metasploit.sh && msfconsole
Dirb
Dirb — это простой, но чертовски популярный сканер, который почему-то ещё не изгнан из стандартного репозитория Termux. Dirb брутфорсит web-каталоги/файлы на true/false указанного ресурса по словарю, что найдёт то и выведет или сохранит в файл. Автор старой школы разработал инструмент для единомышленников почти 20 лет назад, сам же не замечен в проявлении своей онлайн публичности/активности.
Код:$ pkg install dirb
#установка сканера$ dirb --help
#изучить справку по функциям$ dirb url
#самый простой вариант натравить сканер на какой-либо ресурс
Steghide
Поиграть в CTF со стеганографией в Termux на Android-устройствах пользователю поможет ПО Steghide, которое по качеству выше аналогичного GUI-приложения: отстойного Pixelknot (стеганография которого детектируется со 100% вероятностью).
Код:$ pkg install steghide
$ steghide embed -cf ./musor/1.jpg -p pass123 -ef ./musor/secret.txt
#зашифровать файл secret.txt паролем «pass123» и спрятать текстовый документ в фотографии без намёка на его существование$ steghide extract -sf ./musor/1.jpg
#извлечь секрет из фото
Бесследная проверка существования email
Давайте ощутим азартные эмоции нетсталкеров/владыки OSINT-a: проверив за 50 секунд существует ли у Habr-a почта, например, на Яндексе и Protonmail без отправки писем и лишних следов активности (относительно Habr-a).
Для анализа разведданных нам понадобятся два инструмента: Dig в связке с Netcat, которые присутствуют в репозитории Termux.
Код:$ pkg install dig netcat-openbsd
$ dig protonmail.com MX
<<>> DiG 9.16.11 <<>> protonmail.com MX;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35040;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;protonmail.com. IN MX;; ANSWER SECTION:
protonmail.com. 315 IN MX 10 mailsec.protonmail.ch.protonmail.com. 315 IN MX 5 mail.protonmail.ch.
Нас интересует ANSWER SECTION с наименьшим (желательно) MX (5): «mail.protonmail.ch».
Подключаемся к Protonmail для отправки писем, по факту устанавливаем соединение только ради завладения метаинформацией о почте:$ nc mail.protonmail.ch 25
#сервер вернул статус кода 200+, всё хорошо$ HELO aria.ru
#откуда$ mail from:<termuxsupersoft@aria.ru>
#и кто мы такие
#сервер вернул статусы кодов 200+, всё хорошо
#запрашиваем информацию об интересующих нас email(s)
$rcpt to:snoopproject@protonmail.com
$rcpt to:habr@protonmail.com
$rcpt to:hosebarero@protonmail.com
Сервер возвращает статусы:
«200+» почта существует
«500+» почта не существует
Аналогично проверяем и почту на Яндексе без жертв и выкрутасов.
OpenSSH
В Termux имеется полноценный ssh-клиент. Установим соединение со своим сервером во Франкфурте-на-Майне.
Код:$ pkg install openssh
$ alias connectsserver='ssh -i 'key.pem' login@ip -p 4001'
#создадим alias, чтобы не вводить длинную команду каждый раз на подключение к серверу, все алиасы хранятся в «~./bashrc»$ bash
#чтобы alias сразу стал активным без перезапуска приложения$ connectsserver
#подключаемся и производим любые операции на сервере
Обратите внимание: в качестве первой линии обороны у меня на сервере изменён стандартный 22-й порт на 4001, но боты всё равно ежедневно пытаются взломать защиту и ворваться в мою цитадель.
Давайте проверим наш 4001 порт в легендарном nmap сканере, который занимает своё достойное место среди остальных пакетов Termux.
Код:$ pkg install nmap
$ nmap -p 4001 IP -Pn -A
#сканирую IP/порт 4001 и пытаюсь определить, что на нём крутится$ nmap 192.168.0.1/24 -sP
#заодно и быстро проверю свою локальную сеть на подключенные устройства
Из скриншота (частично закрашенного для пущей важности ) видим, что портированный nmap сканер в Termux рабочий и информирует нас о том, что на сервере на открытом 4001 порту крутится ssh, а в локальной сети присутствует 5 устройств. Всё честно, продолжаем...
PDFTK
Этот пакет позволяет работать с документами в pdf-формате (обрезка, удаление страниц, склейка, что для хацкера — заурядно). Выделяющаяся функция в pdftk — это сброс пароля на права у pdf-файла: разрешение на печать; копи-паста текста; редактирование.
Код:$ pkg install pdftk
$ pdftk protec_doc.pdf input_pw output defen_doc.pdf
#пароль на редактирование сброшен (не путать с паролем на открытие файла)
Из минусов, размер пакета pdftk тянет зависимость cups под 300Мб, что как бы неприемлемо много. Это не единственный софт, который «не уважает» старозападную защиту PDF-формата. Например, в OS GNU/Linux стандартный просмотрщик Evince просто игнорирует защиту прав на pdf документах, позволяя пользователю скопировать текст/распечатать документ, как-будто он и не был защищён.
Визуализация данных
Povray — это непростой для работы пакет: cli-программа трассировки лучей, проще говоря, создание графики на основе данных. Созидать Огни святого Эльма мне не по плечу, но кое-чему я всё же научился: единственное применение povray-волшебства — это обработка gps/локации. На соревнованиях в которых участвую — оживляю ландшафт.
Код:$ pkg install povray
$ povray data.pov
#data pov конфиг/данные, которые содержат gps-координаты; координаты затенения/осветления; srtm-высоты и другие параметры
Povray «оживил» osm-ландшафт (3d): низменности и высоты теперь видны на основе реальных srtm-данных, зеленным наложен gps-маршрут (старт и финиш), синим контрольные точки (пункты питания на соревнованиях). А уж как потрясно петлять gps-треком среди 3d-гор воодушевляет автора на созидание отдельной статьи для спорт-сообщества.
Gnuplot
Одним из любимых инструментов у аналитиков для работы с графиками, который не требует навыков программирования, является ПО gnuplot.
Код:$ pkg install gnuplot $ gnuplot
#откроем среду$ set terminal png size 1440, 720
#настроим будущее разрешение графика под смартфон$ set output "storage/downloads/graph.png"
#сохраним будущий график в общедоступном каталоге$ plot sin(x)
#простейший пример построения графика
В каталоге «Download» появится картинка синус: graph.png.
Plantuml
В начале статьи я приложил блок-схему «Код Доступа Termux» и написал, что она была создана в Termux. Приложенная блок-схема была создана в Plantuml.
Код:$ pkg install plantuml
$ nano storage/shared/Download/plan
Код блок-схемы
# Habr
@startmindmap
scale 1480*740
title Создано в Termux
*[#lightgreen] **Termux**
** Мультимедиа
***_ mp3splt
***_ cmus
***_ cava
***_ ffmpeg
***_ <s>youtubedr</s> => yt-dlp
***_ cava
** Парсинг данных
***_ curl..wget
***_ примеры
** Автобэкап данных
***_ rclone
***_ 7-zip
***_ cronie
** Работа с письмами
***_ mutt
** OSINT
***_ check_emails(s)
***_ check_account(s)
left side
** Программирование на Android
***_ python..brainfuck
** Сравнение пакетов
***_ html2texl*
***_ links
** Пентест
***_ снифинг
***_ скан
***_ брутфорс
***_ дамп
***_ фишинг
** Системное администрирование
***_ chattr..nethogs
** Пользовательское ПО
***_ yaspeller
***_ povray
***_ gnuplot
***_ plantuml
***_ steghide
***_ gpg
***_ tor
** <&people>Установка и настройка среды
***_ pkg...proot-distro
@endmindmap
$ plantuml storage/shared/Download/plan
#в каталоге “загрузки” появится наша блок-схема
Руководство Plantuml на RU.
Проверка цифровых gpg/pgp подписей в CLI
Для проверки цифровых подписей пользователю необходимо иметь установленный gnupg пакет; data (данные, которые требуется проверить); data.sig (подпись data-данных) и публичный ключ того, чьи данные мы проверяем.
pkg install gpgv gnupg
curl -s https://raw.githubusercontent.com/snooppr/snoop/master/PublicKey.asc | gpg --import - #импортируем публичный ключ «PublicKey»
gpg --output .gnupg/test-key --export 076DB9A00B583FFB606964322F1154A0203EAE9D #сохраняем ключ по отпечатку именно в каталог «.gnupg», это особенность Termux ссылаться на ключи в этом месте
gpgv --keyring test-key storage/downloads/file.sig storage/downloads/file #проверяем подписанные данные, сначала указываем ключ, далее подпись и данные
Защита данных от случайного и явного удаления или редактирования (требуется root)
Видел на различных форумах, как пользователи часто жаловались на проблему: когда сеть вдруг переставала работать в Parrot и пд. дистрибутивах. Проблема иногда заключается в перезаписи динамического файла: "/etc/resolv.conf" после перезагрузки ПК. Чтобы решить эту проблему достаточно повесить бит неизменяемости на resolv.conf и файл больше не будет никем перезаписан до снятия бита. Так как Android — это часть Linux, то попробуем повесить бит из Termux на данные которыми мы дорожим, например, фотки/кэш приложения/любая_data чтобы случайно их не удалить, например, в ходе автоочистки каким-нибудь ПО/скриптом/экспериментом.
Код:$ tsu
$ chattr +i storage/downloads/test/Прослушка.\ Перехват\ информации.pdf
#повесил защитный бит на pdf-документ
Пробуем удалить pdf-документ.
Снять защитный бит:$ chattr -i storage/downloads/test/Прослушка.\ Перехват\ информации.pdf
#после этой операции файл может быть удален/перемещён
"Сhattr" поддерживает рекурсию и можно защищать целые каталоги с вложениями. Я нахожу эту фишку одной из самых полезных в Termux и активно её использую.
Скачивание видеороликов с YouTube
Для скачивания видеороликов с самого популярного видеохостинга у Termux имеется пакет «youtubedr».
Код:$ pkg install youtubedr
#установка пакета$ mkdir storage/downloads/ролики
#создание каталога «ролики»$ cd storage/downloads/ролики
# переход в каталог, куда будет скачан ролик$ youtubedr download url_ролика
#закачать ролик
Под конец 2021 года скорость закачки youtube-dl и производных форков обрезана до 70 Кб/с. Популярнейший проект кажется заброшен самим разработчиком. Проблема объединяющая форки описана здесь. Кратко — разработчик наконец-то занялся своими бытовыми делами. Киберпанки не любят мериться с потерями (особенно с тем свободным ПО, которое являлось резонансным) и создают рабочие форки. Следуем за тенденциями: форк yt-dlp с которым на сегодняшний день всё в полном порядке.
Код для Termux немного отличен от кода установки на Github:$ wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O ../usr/bin/yt-dlp
#скачиваем скрипт$ chmod a+rx ../usr/bin/yt-dlp
#разрешаем его исполнение$ bash $ yt-dlp url_ролика #скачивание ролика в самом лучшем качестве
Преимущество Yt-dlp: например, можно скачать (несколько Мб) фрагмент ролика в любом качестве с определённой метки времени до заданной его длины без необходимости полной, предварительной загрузки многочасовго видео на своё дисковое пространство (в Гб/сотни Мб).
Пруф
yt-dlp --downloader ffmpeg --downloader-args "ffmpeg_i:-ss 01:09:57.00 -to 01:11:37.0" "https://www.youtube.com/watch?v=RRo3e-M2XO8" -f "134+139" #скачать за пару сек. отрывок с ютуба в ~5Мб/360p с отметки времени, когда АБВГАТ ругается по делу
yt-dlp url_ролика -F #проверить все доступные форматы ауудио/видео для загрузки
Из-за авторских прав прикладываю не сам отрывок, а ссылку с таймингом на метку времени:
Для такой хитрой операции требуется "ffmpeg" см.ниже.
Создание gif в Termux
В статье читатели видели GIF созданные в Termux. Вот как легко создавать анимацию в CLI.
pkg install ffmpeg #установка популярнейшей кроссплатформенной библиотеки для редактирования/работы с аудиовизуальными данными
ffmpeg -i "/storage/emulated/0/Movies/chess.mp4" -r 15 -vf scale=480:-1 "/storage/emulated/0/Movies/chess.gif" #указываем входной видео-файл, выбираем качество 15 кадров/с, понижаем разрешение по ширине до 480p, а по вертикали автоподгон, сохраняем в gif. chess.gif — gif из второй части данной статьи
Нарезка mp3
Меня до сих пор непритворно удивляет ситуация с отсутствием нужного миру приложения для OS Android: на всех OS кроме Android имеются GUI-инструменты для того чтобы нарезать один большой mp3-файл на множество мелких с заданными параметрами (например частями по 20 мин. или, например, на 9 частей). Такие big-файлы встречаются всюду, например, аудиокниги в TG одним файлом, лекции и т.д. Я не смог найти ни одного приложения на Android решающих эту простейшую задачу, но нашёл и использовал ту же кроссплатформенную библиотеку на Termux, которая всё может: «mp3splt».
pkg install mp3splt
mp3splt -S +20 -o +@n storage/downloads/Семинар\ rt.mp3 #нарезка многочасового «Семинар tr.mp3» на 20 частей (можно, например, нарезать не на 20 частей, а нарезать по времени, например, каждую часть по 10мин, а последнюю с остатком)
Аудиомания в Termux
В Termux иногда люблю послушать радиоспектакли/аудио рассказы (онлайн).
Для прослушки музыки/радио в CLI необходимо установить два пакета и графический эквалайзер (необязательный пакет).
Код:$ pkg install pulseaudio cmus cava
$ cmus
#запуск cli-аудиоплеера
Для добавления музыки/радиостанций в библиотеку код:$ :add sdcard/music_path
#разовая операция добавления треков в библиотеку$ :add url_потока_radio
#приятная особенность плеера он умеет воспроизводить онлайн радио потоки (https Вещание)$ :clear
#если что-то пошло не так, например, музыка была удалена или перемещена из music_path, то очищаем библиотеку
Управляется cmus стрелками и клавишей «Tab», один из главных неприятных нюансов у плеера — это проигрывание одного трека и остановка (без автовоспроизведения следующей композиции). Настроить автовоспроизведение на плеере — нажать латинскую заглавную букву «С», удалить радиостанцию — «D».
Для пафосного воспроизведения музыки как на скрине: экран разделён по горизонтали, в верхний его части — плеер, в нижней — пульсирующий эквалайзер код:$ pkg install screen
#установка мультиплексирующего физического терминала между несколькими процессами (аналог Tmux)$ screen
$ cmus
#запуск плеера
"ctrl+a+S" #разделить экран по горизонтали"
"ctrl+a+tab"; "ctrl+a+с" #перейти в нижний экран и активировать его (дальнейшие переключения между верхним и нижним CLI "ctrl+a+tab")$ cava
#запуск эквалайзера
Для обычного воспроизведения аудио код:$ cmus
Системное администрирование
На Android 9+ разработчики транснациональной корпорации добавили новую функцию: «персональный dns-сервер» (настойки --> сеть и интернет --> дополнительно --> персональный dns-сервер) усилив защиту пользователя. Вот пример, как работает Android по умолчанию без активации «персонального dns».
Код:$ pkg install tcpdump dnstop
#для установки этих пакетов требуется root$ tsu
$ tcpdump -pni wlan0 53
#снифим запросы dns$ dnstop wlan0 --> 2
#снифим запросы dns, но более компактно
Настройка персонального dns-сервера: настройки --> сеть и интернет --> дополнительно --> персональный dns сервер --> имя хоста поставщика «dns.google».
Настроив персональный dns-сервер на 53 порту будет чисто, то есть снифить трафик уже не получится. Проэкспериментируем это утверждение.
Вся защищенная DNS-движуха отображается уже не на 53 порту, а на 853 порту, что говорит нам об использовании пользователем DoT.
Надеюсь вы поняли о чём речь и настроили свой персональный dns-сервер.
Наблюдаем какие приложения активнее всех потребляют трафик
Эй, тореро, жизнь как миг,
Опять звучит трубы призывный зов...
$ pkg install nethogs
#требуется root$ tsu
$ nethogs
В нижнем правом углу играет клип с YouTube, поэтому видим и активность антирекламного YouTube-приложения vanced; параллельно сёрфю в DDG-браузере, ну и в фоне TG высаживает батарею. Такая слабая активность приложений обусловлена тем, что ради экономии заряда батареи я приручил ПО на своём смартфоне (мне помогли root-права + свободная прошивка). Из минусов, в качестве расплаты по классике — куча багов OS, к которым просто подстраиваешься.
Техническая информация о текущем соединении
Код:$ pkg install wavemon
#требуется root$ wavemon
Запускаем и управляем TOR-сетью
Не так давно я создал подробное видео по настройке и управлению TOR-сетью.
Код:$ pkg install tor proxychains-ng python && pip install nyx
Расшарить (удалить символ '#') ControlPort 9051 в "/data/data/com.termux/files/usr/etc/tor/torrc"
Пакет tor — служит для запуска соединения пользователя с сетью Tor, пакет nyx - управляет соединением Tor, пакет proxychains направляет выбранные утилиты через сеть Tor. Подробнее что на видео (см. тайм коды под описанием ролика на самом YouTube).
Управляем OS Android на уровне процессов
Завершает обзор данной статьи хедлайнер-пакет: Htop (требует root).
$ pkg install htop
$ tsu
$ htop
Htop — это системный cli-монитор, позволяющий в т.ч. мониторить, выявлять, уничтожать любые подозрительные и непослушные дочерние/процессы в парку касаний. Из минусов, htop не поддерживает мониторинг нагрузки дисковой подсистемы (iotop), что является одним из важных параметров наблюдения в системе.
Остальные утилиты Termux, которыми я пользуюсь, но не требуют, с моей точки зрения, ревью: nslookup; route; diff; whois; traceroute; file; silversearcher-ag.
Некоторые полезности
Создание alias иным способом, отличным от вышеописанного способа.
printf "alias his='history | grep -i '" >>.bashrc
printf "alias ipls='curl ipinfo.io/ip'" >>.bashrc
Bash && alias #проверка всех alias в среде
По команде "ipls" пользователь узнает свой внешний ip-адрес, а по команде "his ключ.слово" пользователь узреет все команды которые он вводил в терминал.
$ am start --user 0 -a android.intent.action.VIEW -d content://com.android.externalstorage.documents/document/primary%3Aкаталог%2Fкатлог%2Fфайл%2F
#откроет из Termux стандартное приложение просмотрщик файлов перейдя в каталог. Аналогично можно из Termux запускать браузер с переходом по ссылке и п.д...
$ ctrl + d
#выход из терминала
Кроме всего вышеописанного, Termux популизирует GNU/Linux среду т.к. в нём немало unix-утилит, что является хорошей тренировочной базой для изучения GNU/Linux пользователями новичками со своего Android девайса. Если после прочтения статьи читатели больше не считают Termux лишь жалкой обвязкой над busybox, то мой план по лоббированию Termux в массы — сработал.
Статью первоначально написал и опубликовал для портала Codeby (ч1, ч2, ч3, ч4, ч5) под свободной лицензией.
Комментарии (24)
Aquahawk
21.02.2022 10:48+1Спасибо, много интресного, использую термукс для youtube-dl, ssh. Из забавного, проброс портов через ssh отлично работает и системный браузер нормально ходит. За бекап софт спасибо. Могу только посоветовать клавиатуру на которой много кнопочек есть: Hacker's Keyboard https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard&hl=en&gl=US
ne555 Автор
21.02.2022 11:43посоветовать клавиатуру на которой много кнопочек есть: Hacker's Keyboard
Да, она у меня стоит дублёром. Хорошая клавиатура, я на нее переключаюсь тогда, когда "ctrl + enter" на Хабре кому-нибудь отправить нужно.
А у той клавы, что на скринах, имеется особенность (я таких нигде не встречал): настраиваемые свайпы на "пробел & X". Например, свайп на пробеле влево — перемещает курсор влево, свайп вправо — перемещает курсор вправо и тд.
utya
21.02.2022 13:49+1а вот не могу понять зачем youtude-dl юзать в термукс если есть библиотека под android
Aquahawk
21.02.2022 13:50Какая библиотека? Если бы было нормальное гут приложение, юзал бы его
utya
21.02.2022 14:43https://github.com/yausername/youtubedl-android
всунул эту библиотеку себе в приложение и нормально
ilmarinnen
21.02.2022 11:46Однозначно в мемориз. Хочется взять и изучить)
Эта статья прям ещё один веский довод в пользу того, что будущее за смартфонами а не ноутбуками в качестве персонального рабочего места.
tchkEn
21.02.2022 16:08+1Я пробовал, без физической клавиатуры скорость работы крайне мала(по сравнению с ноутбуком). Вместо смартфона лучше взять себе для работы планшет с диагональю 8-9 дюймов и беспроводную периферию (клава+мышь).
iShrimp
21.02.2022 19:45Жаль, что сейчас нет вот таких клавиатур для смартфонов (на сайте амазона currently unavailable, а ведь когда-то она реально выпускалась...)
Те лопаты, что продаются на aliexpress, даже в руки брать не хочется.
utya
21.02.2022 13:52+1Спасибо за статью, много прикольных класнных штук. Но вот чёто сижу и думаю а как это все юзать то.
Да вроде есть некое api к temux и можно из apk вызывать termux штуки.
Но остаётся вопрос как это реально всё юзать в сочетании с apk да даже без apk, если есть dozemode, и нет wakelock нормального
tchkEn
21.02.2022 16:05+2Душевно написано, приятно читать такие статьи. Несколько лет назад оказался в казалось бы безвыходной ситуации, - из-за урагана оборвало провода, вся техника обесточена и нет вроде бы никаких вариантов продолжить работу. Но Termux спешит на помощь, - подключился к удаленному серверу, по сравнению с компьютером было адски не удобно, однако главное что подключился.
Kirikekeks
21.02.2022 22:23+1Спасибо, половину надо изучать, перенимать. Очень полезно.
Если можно, то чуть дополню из того, что мне нравится
mutt уже почти не подходит для чтения почты html, но поиск по регулярным выражениям , например когда надо найти почту за 2006 год, - просто незаменим. И для чистки, найти всю почту по паттерну и удалить, - равных нет.
Про неудалять - здорово. Есть проблема с удалять, тоже решаю termux
find /sdcard/external/emulated/0/data/data/Whatsap/ -size +9M -delete
для ssh удобнее всего добавленный в .ssh/config
Host av
Hostname 1.1.1.1
Port 4001
User ZaChtoTyDalMneEtotNic
После чего достаточно ssh av. Здесь же можно указать доступ через цепочку хостов к недоступному напрямую, с этого хоста.
Помимо проблем с русским, у меня еще и с английским проблемы. А потому
sdcv + словари (необязательно английские) и для пролистывания больших объяснений на маленьком экране добавить в .bashrc
function ssdcv (){
sdcv "$@" | less
}Стырить Вашу замечательную статью для дальнейшего изучения в телефон
elinks --dump "https://habr.com/ru/post/652633/" > kruto.txt
Фоточки. imagemagik convert или mogrify.
Например удалить все метаданные, сжать и сделать гифку, или "копию всех страниц паспорта, со всех сторон" в > passport.pdf Утиллиты сложные, тема - бесконечная :-).
Просто файлы. Не могу привыкнуть к FilesGo. Любой двухпанельник в режиме с одной панелью гораздо удобнее. mc или в моём случае vifm.
Vendettarasha
22.02.2022 03:49+1Да прикольная статья, у меня когда то не было ноута и хотел учиться программировать, я на термуксе разворачивал фронтэнд приложения, обычные типо create-react-app или просто на webpack и потом открывал доступ к файлам и через acode учился фронтэнду, написал 2 больших проекта учебных от металамп, потом запускал докер, создавал серверные простые приложения и только после этого купил свой ноут и устроился на работу, так что с термуксом я не растовался пол года каждый день и он мне помог многому научится, но если писать подробнее то тоже наверное будет большая статья
viteralex
22.02.2022 11:48+2Пришлось и мне познакомиться с Termux.
Задача была такая: есть сеть детских спортивных клубов. В связи с карантинными мерами нужно ограничить присутствие родителей в клубе на время тренировки ребёнка. Но родителям хочется посмотреть тренировку. Решили вещать в Youtube с камер. И до сего времени это делалось скриптом bat, который администратор клуба должен был запускать у себя на ПК. Скрипт примерно такого вида:
@echo off REM Заголовок окна по имени файла title %~n0 REM Адрес потока, откуда забираем изображение set rtsp_url="rtsp_url" REM Ключ трансляции set stream_key=stream_key ffmpeg -rtsp_transport tcp -i %rtsp_url% -tune zerolatency -t 24:00:00 -pix_fmt + -r 30 -c:v copy -c:a aac -filter:a "volume=2.0" -strict normal -f flv rtmp://a.rtmp.youtube.com/live2/%stream_key% echo %errorlevel%
И всё это неудобно. Залов два, ноутбуки у администраторов далеко не самые мощные, тянуть две трансляции и при этом полноценно работать получалось с трудом.
А в каждом клубе есть телевизоры с ТВ приставками TOX1 или X96
И мне пришла в голову идея использовать эти приставки как веб-серверы. Стал искать инфу, наткнулся на Termux и за пару недель вечеров сделал веб-сайт для управления трансляциями. Для администратор это выглядит так:
а для настройки тех. специалистом так:
Bootstrap+php+js. На двух каналах в FullHD загрузка такая:
Асинхронный запуск потоков реализовал с помощью собственных termux-services
DarkNoys
Вопрос, а зачем все ссылки перенаправляют через некий codeby.net ?
ne555 Автор
Сорри, щас поправлю 10 мин. Статью писал же изначально для Codeby перенеслись (в конце указано).
kush07
Только вчера прочитал все 5 частей на Codeby ))))))