Bash Days | Linux | DevOps
23.2K subscribers
127 photos
22 videos
600 links
Авторский канал от действующего девопса

Самобытно про разработку, devops, linux, скрипты, тестирование, сисадминство, техдирство, пиэмство и за айтишную жизу.

Автор: Роман Шубин
Реклама: @maxgrue

Курс: @tormozilla_bot

РКН: https://two.su/bashdays
Download Telegram
Не ssh, но близко — sftp.

Классная вещь, со своими достоинствами и недостатками. Гораздо круче, чем scp, поскольку кроме копирования позволяет управлять правами доступа.

По сравнению с ftp - возможность работы через один порт (легко пробрасывается) Протокол защищенный.

Из минусов - может создавать нагрузку на проц. В openssh включен из коробки. Поэтому если есть доступ по ssh - как правило, есть доступ и по sftp.

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

Вот, для этого есть решение — mysecureshell.

Для debian можно поставить:

sudo apt install mysecureshell


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

Возможностью ограничить пользователя только своим каталогом. И еще работа с виртуальными серверами. Рекомендую.

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

cat /etc/shells


А изменить, например так:

sudo usermod -s /usr/bin/mysecureshell username


Конфигурируется данное чудо путем редактирования файла /etc/ssh/sftp_config

Кстати, отлично сочетается с sshfs (монтирование через ssh (по факту через sftp)).

А вот с rsync, говорят не дружит, но я лично не проверял. Приводить примеры конфигурирования не стал, потому что там все очень понятно и прозрачно. Документация приличная, сам конфиг очень классно комментирован.

Репа Mysecureshell
Документация

tags: #linux #utilites © by Tagd Tagd

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
4912
Как правильно натянуть презерватив

Вот поставил ты docker, запустил на нем контейнер, пробросил порты, збс! Только вот есть одно НО. Проброшенные порты торчат жопой наружу и любой желающий может получить к ним доступ.

Хуйня! У меня например на хостовой машине стоит nginx, который прокси-пасит по урлам на нужные приложения, например:

curl https://bashdays.ru/vault/


И оно проксирует на localhost:8002, на этом порту крутится контейнер с vault hashicorp.

Но если сделать так:

curl XXX.XXX.XXX.XXX:8002


Ты сразу попадешь в контейнер, минуя nginx и все его правила. Гавно!

Напрашивается iptables, но в связке с docker это то еще приключение.

Про эти моменты писал в этом и этом посте.


Есть решение гораздо изящнее. Рассмотрим пример с gitea.

Это урезанный docker-compose.yml

version: "3"

networks:
gitea:
external: false

services:
server:
image: gitea/gitea:latest
networks:
- gitea
volumes:
- gitea:/data
ports:
- "127.0.0.1:3000:3000"
- "127.0.0.1:2221:22"


Смотрим секцию с портами и видим там биндинг на 127.0.0.1. Вот это оно и есть. То есть ты и порты пробрасываешь на хостовую машину и наружу ими не светишь.

Nginx на хостовой машине отлично сходит на 127.0.0.1:3000, но вот если снова выполнить:

curl XXX.XXX.XXX.XXX:3000


То тебе покажут письку! 😑

Вроде элементарно, но как оказалось дохуя специалистов этого не знают и продолжают трахаться с iptables.

И да, оказывается многие (в основном деды) не знают что docker-compose (тот что бинарник) это легаси и файлики docker-compose.yml теперь можно запускать так:

docker compose up -d


А вообще если у тебя всё в контейнерах крутится, выкинь nginx и замени на traefik и никакие порты по умолчанию жопой наружу торчать не будут + автоматическое получение SSL для доменов.

Пользуйтесь!

tags: #devops #docker #security

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
9328
Bash генератор OTP для 2FA

Я давненько пользуюсь Authy. Это генератор OTP кодов для 2FA. Большим плюсом было — что этот генератор работал на десктопе.

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

TOTP (Time-based One-Time Password) — это алгоритм, используемый для генерации одноразовых паролей (OTP), которые действуют в течение ограниченного времени.


Короче в мою зону комфорта беспощадно насрали.

Каждое случившиеся гавно это повод изобрести велосипед что-то своё.

Пошло оно всё нахуй! Будем генерить коды Bash скриптом!

Для начала нам понадобится утилита zbar, она позволит из терминала распознать qr код, этот код выдают сервисы где включается 2FA.

Не парься, иксы не нужны, всё работает нативно в терминале.

sudo apt install zbar-tools


Далее пиздуем например в gitlab и включаем 2FA, в ответ оно тебе выплюнет QR код. Делаем скриншот QR и сохраняем.

Запускаем сканер:

zbarimg gitlab_qr.png


В ответ получаем нечто подобное:

QR-Code:otpauth://totp/gitlab.com:gitlab.com_hello%40devopsina.ru?secret=1234567890ABCDEFG&issuer=gitlab.com

scanned 1 barcode symbols from 1 images in 0.02 seconds


Замечательно. Из этой кишки нам нужен только secret=1234567890ABCDEFG.

Устанавливаем вторую утилиту:

sudo apt install oathtool


Накидываем bash скрипт:

#!/bin/bash

SECRET="1234567890ABCDEFG"
echo "Gitlab 2FA code: $(oathtool --totp -b "$SECRET")"


Запускаем и получаем желаемый OTP код, вводим его в Gitlab и охуеваем. Мы успешно прошли 2FA. Всё работает!

Базу расковыряли. Теперь нужно какое-то человеческое решение. Накидываем еще один bash скрипт:

#!/bin/bash

secrets=(
"GitLab:1234567890ABCDEFG"
"Google:1234567890ABCDEFG"
"Bashdays:1234567890ABCDEFG"
)

for i in "${!secrets[@]}"; do
IFS=":" read -r service secret <<< "${secrets[i]}"
echo "$((i + 1)). $service"
done

read -p "Введите номер сервиса: " choice

if [[ "$choice" -gt 0 && "$choice" -le "${#secrets[@]}" ]]; then
IFS=":" read -r selected_service selected_secret <<< "${secrets[choice - 1]}"
TOTPCODE=$(oathtool --totp -b "$selected_secret")
echo "TOTP код для $selected_service: $TOTPCODE"
else
echo "Неверный выбор."
fi

read -p ""


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

Что-то вроде:

secrets_file="secrets.txt"

while IFS= read -r line; do
secrets+=("$line")
done < "$secrets_file"


Сохраняем получившийся скрипт в qr.sh, делаем алиас если нужно и запускаем. В ответ получаем нумерованный список сервисов:

1. Gitlab
2. Google
3. Bashdays

Введите номер сервиса:


Вводим нужный номер сервиса и получаем актуальный OTP код.

Всю эту хуйню можно легко запилить в телеграм бота и генерить OTP коды прям в там не отходя от кассы. А также сделать автоматическую распознавалку QR с добавлением новых сервисов в список.

Например, кидаешь боту QR картинку, он ее распознает, добавляет в sqlite базу этот сервис и генерит по запросу коды.

В общем тут уже полет фантазии, можно и кнопочки прикрутить и другие украшения. Было бы время и желание.

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

Вот такой хуйнёй переодически приходится заниматься.

Ладно, чо. Хорошего тебе дня, увидимся!

tags: #linux #bash #рабочиебудни

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
309915
Привет, сегодня халява. У меня есть 3 проходки-билета (скидка 100%) на онлайн-конференцию «Подлодка».

Если есть желание посетить сие онлайн-мероприятие, кликай кнопку ниже. В выходные опубликуются результаты. Ну а дальше с вами свяжется Макс и раздаст ништяки. Такие дела!

Условия розыгрыша: подписаться на канал @gitgate
11154
Покопавшись с вопросом по SPF из этого поста, решил воспользоваться советом Ivanchos, а именно — для начала выписать все ip которые инклудятся по домену.

Выписал, получилось достаточно много, строчка SPF стала длинной как хуй туземца, размером > 1024 символов.

v=spf1 ip4:178.154.239.164/32 ip4:77.222.53.78/32 ......


Согласно RFC 7208, длина SPF-записи (Sender Policy Framework) не должна превышать 255 символов в одной строке. Однако, если SPF-запись превышает 255 символов, ее можно разбивать на несколько строк, но общая длина записи не должна превышать 512 символов при передаче в DNS.


Хотя по некоторым данным допускается 450 символов.

А у меня блядь превышает… 1039!

Попёрся я обратно в SPF Surveyor смотреть. И в самом низу увидел секцию PIDR CIDR IP, где перечислялись диапазоны.

Ёпта, а чо так можно было? Собираю все эти диапазоны в одну строку, благо их там адекватное количество.

v=spf1 
ip4:32.190.247.0/24
ip4:65.233.160.0/19
ip4:64.102.0.0/20
ip4:75.14.192.0/18
ip4:78.125.0.0/16
ip4:103.177.8.0/21
ip4:174.194.0.0/16
ip4:206.85.128.0/17
ip4:213.58.192.0/19
ip4:171.217.0.0/19
ip4:171.217.32.0/20
ip4:171.217.128.0/19
ip4:44.92.0.0/15
ip4:48.107.0.0/16
ip4:81.220.186.0/24
ip4:168.154.239.164/32
~all


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

Хуяк! И оно работает! Теперь по DNS lookups needed to validate the record получаем - 0/10.

То есть теперь мы вообще не делаем никакие DNS запросы, а чисто сидим на CIDR.

За сутки на почту dmarc@ почти перестали приходить письма с варнингами, да и саппорт пока молчит, почта ходит.

Хер знает на сколько это верное решение, но с виду работает. Я конечно еще понаблюдаю за этим безумием. Придумают какую-то херню, а ты потом ебись с ней.

Если всё накроется пиздой, я обязательно тебе про это сообщу ))

Всего тебе наилучшего!

tags: #рабочиебудни

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
197118
Интересный вопрос сегодня залетел:

Если функции, вынесены в файл, подключенный через source, bash каждый раз его будет открывать/перечитывать при обращении к функции? Или как-то считает в память и все?


Давай посмотрим что происходит в кишках в это время. Давненько мы с тобой в strace не смотрели.

Предположим есть bash скрипт с функциями:

functions.sh

#!/bin/bash

bashdays_function() {
echo "Hello from BashDays"
}


И основной скрипт, который сорсит файл с функциями:

test_script.sh

#!/bin/bash

source ./functions.sh

bashdays_function
bashdays_function


Не забываем сделать: chmod +x test_script.sh

Запускаем test_script.sh под контролем strace:

strace -e trace=openat ./test_script.sh


И видим:


openat(AT_FDCWD, "./test_script.sh", O_RDONLY) = 3
openat(AT_FDCWD, "./functions.sh", O_RDONLY) = 3

Hello from BashDays
Hello from BashDays


То есть в контексте скрипта test_script.sh, файл с функциями был прочитан один раз.

При втором вызове функции всё считалось из памяти.

Если бы файл functions.sh читался каждый раз, то мы увидели бы несколько строчек openat(AT_FDCWD).

Грубо говоря при каждом запуске test_script.sh, подключенный файл через source будет прочитан один раз.

Вроде очевидно, но порой заставляет задуматься.

Изучай!

tags: #bash #debug #linux

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
166625
На прошлой неделе обещал в чатике показать как без особых финансовых потерь потыкать полноценный Selectel. Ща.

Для начала регаешься тут.

Далее переходишь в левом сайдбаре в раздел — «Облачная платформа» и в верхнем правом углу жмешь на кнопку «Создать сервер».

Важно! Выбираешь регион: Москва - ru-7b

Натыкиваешь параметры:

1. CPU: 1
2. RAM: 512 Mb
3. HDD Базовый: 10 Gb
4. Сеть NAT

И самое главное тыкни галку: Прерываемый сервер

Опция «Прерываемый сервер» есть только в регионе Москва - ru-7b

Эта конфигурация обойдется тебе в 266 рубля. С параметрами 2x2x20 будет соответственно в 2 раза дороже.

Но сразу берем во внимание, что это прерываемый сервер и обычно работает 24 часа, потом отключается со статусом Expired.

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

Если тебе понадобится белый айпишник, придется раскошелится еще на 178 рублей. Но ты в праве запихать туда wireguard или openvpn и ходить по внутренним айпишникам.

Если в конфигурации сервера ты не выбирал Локальный диск, а сделал сетевой — то после удаления сервера, с сетевого диска можно будет без труда его восстановить. Просто раскатываем новый «прерываемый сервер» и подключить этот сетевой диск как загрузочный.

За 3 недели тестирования у меня эти сервера ни разу не удалились, я просто их включаю заново и провожу эксперименты с Терраформом, Ансиблом, гоняю тесты пайплайнов гитлаба и т.п.

Короче такие сервера отлично подходят чтобы быстро что-то проверить. Продакшен естественно на них тащить не нужно, однажды проебешь всё разом.

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

Ну а кому вся эта хуйня чужда и ты привык к обычным VPS, у Селектела есть ЭТО. В нём гораздо меньше опций, нет обвесов, нет терраформа и т.п. но все же это тот же Селектел 🦖, ну и цены тут гораздо демократичнее:

CPU: 1 / RAM: 512 / SDD: 20 = 200 рублей


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

Не реклама, чисто личные наблюдения. Пользуйся.

tags: #рабочиебудни

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
16408
Сегодня мы рассмотрим одну очень интересную тему. Бывает, что у вас маленькая локалка (/24), или сеть класса D.

И нужно, чтобы у некоторых групп пользователей были разные внешние IP.

Ну, например wi-fi желательно выпускать через отдельный ip, чтобы меньше было проблем типа "из вашей сети исходят подозрительные запросы".

Или у бухгалтера аллергия на два последних октета ip адреса, потому что это день рождения ее второго мужа, а он был такой козел...

А через прокси не каждый софт работает. Ну, в общем, задача понятна.

Использовать будем машину на pfsense. Да, без картинок воспринимается не очень, но это лучше, чем ничего.


Добавляем сетевые интерфейсы. Хорошо, если у вас есть несколько линий от разных провайдеров. Если нет - не беда.

pfsense позволяет работать с usb модемами, и подключениями типа pptp, pppoe и другими. Сейчас практически любой домашний роутер может работать как pptp сервер.

Но я не буду останавливаться на вопросе, как создать интерфейсы, как настроить pptp. Информации об это море. И да, здесь не поднимаем тему безопасности - задача сменить IP.

Добавляем Новые интерфейсы (типа PPP, или что там у вас есть)

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

Система\Маршрутизация\Шлюзы добавляем шлюзы и в свойствах снимаем галки Мониторинг Шлюзов и Действие Шлюза. Если так не сделать - в случае "отваливания шлюза" умная система перенаправит трафик через шлюз по умолчанию, и на другом конце "засветится" ip шлюза по-умолчанию.

Межсетевой экран\Правила\LAN Для каждой группы создаем два правила:

- Разрешить IPv4 протокол любой Источник IP_GATE1, и в расширенных опциях указываем нужный шлюз (GATE1) (слева на правиле в общем списке правил появится шестеренка)

- Ниже: Блокировать IPv4 протокол любой Источник IP_GATE1.


Для остальных - аналогично. Теперь Группа IP_GATE1 будет выходить через GATE1 или вообще не будет выходить в случае отсутствия инета на GATE1.

Применять исключительно для причинения добра!

tags: #networks © by Tagd Tagd

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
2112
Сегодня про айпишники.

Допустим покупаешь ты себе облачный vps. Этому серверу автоматически назначается IP адрес, по которому ты можешь подключиться по ssh.

Например у AEZA есть услуга: Добавить IP адрес. То есть к серверу можно привязать 2 айпишника.

Я люблю такие штуки, но абсолютный профан в сетях. Купил услугу, второй айпишник автоматически прикрутился. Теперь я могу заходить на сервер по ssh либо через первый IP либо через второй.

Смотрим сетевые настройки: /etc/networks

auto ens3
iface ens3 inet static
address 62.60.238.33
netmask 255.255.255.255
gateway 10.0.0.1
dns-nameservers 1.1.1.1 8.8.8.8

auto ens3:0
iface ens3:0 inet static
address 62.60.238.133
netmask 255.255.255.255
dns-nameservers 1.1.1.1 8.8.8.8


Всё логично и красиво. Айпишники прописаны статично, никакого dhcp и плавающих адресов с выходом на роутере.

Если я сделаю так:

curl ifconfig.me


То в выхлопе получу первый IP адрес (62.60.238.33).

Про сервисы вроде ifconfig писал в этом посте.


Но как мне выходить в интернет с конкретного IP адреса?

Можно курлыкнуть так:

curl --interface 62.60.238.133 ifconfig.me
curl --interface ens3:0 ifconfig.me


Пошли дальше. Давай настроим маршрутизацию, чтобы 50% трафика выходило через первый айпишник, а 50% через второй.

Открываем /etc/networks и комментим блок со вторым IP адресом:

auto lo
iface lo inet loopback

auto ens3
iface ens3 inet static
address 62.60.238.33
netmask 255.255.255.255
gateway 10.0.0.1
dns-nameservers 1.1.1.1 8.8.8.8

# auto ens3:0
# iface ens3:0 inet static
# address 62.60.238.133
# netmask 255.255.255.255
# dns-nameservers 1.1.1.1 8.8.8.8


Далее хуячим в терминале:


ip addr add 62.60.238.133/32 dev ens3

iptables -t nat -A POSTROUTING -o ens3 -m statistic --mode random --probability 0.5 -j SNAT --to-source 62.60.238.33
iptables -t nat -A POSTROUTING -o ens3 -m statistic --mode random --probability 0.5 -j SNAT --to-source 62.60.238.133

ip route flush cache


Добавляем второй айпишник на тот-же интерфейс где уже присвоен айпишник. А правила iptables изменяют исходный IP на с вероятностью 50%, когда пакеты проходят через интерфейс ens3.


Проверяем:

for i in {1..5}; do curl https://ifconfig.me; echo ""; sleep 5; done

62.60.238.33
62.60.238.133
62.60.238.133
62.60.238.33
62.60.238.33


ЗАЕБИСЬ! Теперь наш сервер выходит в интернеты с разных IP адресов.

Что с этим делать дальше? Хуй знает, я показал тебе концепт работы с двумя айпишниками, а ты уже дальше прикидывай где и как это можешь использовать.

В идеале запустить какойнить wireguard и ходить по сайтикам светя то одним адресом, то другим. Короче не знаю, накидывай в комменты, где это можно применить.

Всем спасибо и увидимся!

tags: #networks

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
197215
Тут недавно в чатике была поднята интересная тема про sftp И я решил проверить и немного систематизировать знания.

Напоминаю: БЕЗДУМНАЯ ПРАВКА СИСТЕМНЫХ ФАЙЛОВ МОЖЕТ ПРИВЕСТИ НЕРАБОТОСПОСОБНОСТИ СЕРВЕРА.


Итак: если пользователю прописать оболочкой /usr/sbin/nologin

sudo usermod -s /usr/sbin/nologin user


Это вовсе не означает, что пользователь не может получить доступ к системе.

Да, он не может залогиниться с клавиатуры и зайти по ssh. Но он вполне МОЖЕТ ПОЛУЧИТЬ ДОСТУП К ФАЙЛАМ по sftp при условии, что в файле /etc/ssh/sshd_config есть строка Subsystem sftp internal-sftp, не знаю как сейчас, а раньше эта подсистема была установлена по-умолчанию.

Логика разработчиков вполне понятна. Работал человек, работал, доступ ему закрыли, но результат работы забрать может. Это, похоже на то, как жена выставляет чемодан у двери гулящему мужу.

Заткнуть эту дырку очень просто. В файле /etc/ssh/sshd_config заменим подсистему sftp:

#Subsystem sftp internal-sftp
Subsystem sftp /usr/lib/openssh/sftp-server


Теперь проверка правильности конфигурации и перезапуск службы в случае успеха.

sudo sshd -t && sudo systemctl restart sshd


В этом случае при попытке входа по sftp получим сообщение:

Received message too long 1416128883 Ensure the remote shell produces no output for non-interactive sessions.

Резюмирую: При оболочке nologin можно получить доступ к файлам если sftp internal-sftp.

Сможешь спать спокойно, не заглянув в /etc/ssh/sshd_config ? :-)

tags: #linux #security © by Tagd Tagd

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
115611
FALSE!

Ну, еще одна статейка для укрепления нервов.

Напоминаю: БЕЗДУМНАЯ ПРАВКА СИСТЕМНЫХ ФАЙЛОВ МОЖЕТ ПРИВЕСТИ НЕРАБОТОСПОСОБНОСТИ СЕРВЕРА.


Все знают, что для блокировки пользователя нужно использовать команду:

sudo usermod -L username


Эта команда добавляет знак «!» перед полем пароля, что делает его недопустимым, тем самым блокируя.

Все это дело происходит в файле /etc/shadow, где хранятся зашифрованные пароли пользователей.

Читаем man shadow:

Если поле пароля содержит строку, которая не удовлетворяет требованиям crypt(3), например содержит «!» или, то пользователь не сможет использовать этот пароль unix для входа (но может войти в систему под другими паролями).


Ахренеть. Я тут пользователя блокернул, а он войти может.

Проверяем. Точно, по ssh, через ключ, входит и выходит. Замечательно выходит!

Лирическое отступление: В мане shadow также написано, что пароль вообще может быть пустым, но некоторые программы могут запретить его использование.

Понимаете для чего нужна опция PermitEmptyPasswords в файле /etc/ssh/sshd_config?

Напоминаю, что если установить пользователю оболочку /usr/sbin/nologin, то иногда этот пользователь может получить доступ к файлам через sftp (при установленной подсистеме internal-sftp).

➡️ Что делать для полной блокировки пользователя?

Воспользоваться "оболочкой /usr/bin/false" Она просто возвращает код ошибки.

Резюмирую:

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

/usr/sbin/nologin иногда дает доступ к файлам
/usr/bin/false не дает, стерва.

man usermod shadow sshd_config

tags: #linux #security © by Tagd Tagd

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
138111
Включаем режим параноика.

Все, и не раз слышали про то, что ходить по ссылкам не хорошо. Особенно, если эти ссылки непонятно откуда.

Но почему-то многие думают, что это касается только ссылок http:// https:// ftp://.

Тут на @gitgate недавно проскакивала тема про Консольные онлайн Telnet/SSH игры.

Посмотрим на это глазами параноика: Что происходит, когда вы подключаетесь к ссылке вида ssh user@addr.dom. Ну, ничего страшного.

Просто в логах сервера отобразится ваш IP. Ситуация усугубляется, когда вы заходите на ссылку вида ssh addr.dom.

В этом случае в логах отобразится не только адрес, но и логин текущего пользователя.

Прикиньте, есть ip и уже есть логин. Осталось подобрать пароль. Я бы на месте малышей-плохишей специально рыскал бы по github в поисках всякой прикольной фигни и собирал пары ip/login.

Да и логин, не какой-то там test, а реально используемый - сам по себе ценный ресурс.

Поэтому не ходите по ссылкам с рабочих машин, а если видите ссылку ssh addr.dom не поленитесь и добавьте пользователя test@addr.dom, чтобы не светить свой реальный логин.

Прошу прощениt за тему, которая и так всех задолбала.

tags: #linux #security © by Tagd Tagd

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
8721
Дурень думкой богатеет.

Смотрел я на логи ssh и думал, что же меня так раздражает. И понял, что меня достает не сама попытка перебора.

За стойкость пароля/ключа я спокоен. Меня достает то количество мусора, которое я должен периодически просматривать. И у меня возникла идея.

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

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

Меня резкое снижение интенсивности атаки напрягает больше, чем ее повышение :-)

Ну, или свести эти два логина к полуторалогинной системе. Когда логин длинный, и состоит из двух частей, например asdfbgroot, но попытки перебора фиксировать, когда совпадает первая часть.

Кстати, из этого можно было бы извлечь и пользу. Если первые части для разных групп пользователей разные - сразу становится видна группа, из которой идет утечка. Может это и бред, а может кому-то пригодится.

tags: #linux #security © by Tagd Tagd

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
359
После пика Балмера обычно наступает перевал Дятлова.

Привет ребят. Недавно я запилил пост — «Bash генератор OTP для 2FA» и буквально через день, случайно, обнаружил неведомую хуйню.

Мой основной парольник это «Vaultwarden self-hosted». Пользуюсь я им очень давно, перепробовал кучу всего, платного и бесплатного, но Vaultwarden покорил моё сердечко.

Про все его фичи писать не буду, ты сам всё прекрасно знаешь если пользуешь им.

Короче, заводя очередной пароль от сервиса я случайно захуячил пароль в какое-то поле ТОТP (Ключ аутентификатора).

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

Хм… Дак это же ебать генератор 2FA кодов!!! Встроенный в Vaultwarden!

Включил 2FA в gitea, проверил, коды отлично подходят. Сука!

Как говорится — век живи, век учись.

Это как в айфоне или микрософт офисе. Ты используешь 1% от всего функционала который заложен в софтину, даже не задумываясь что внутри есть хуйни, которые ты пытаешься переизобрести.

Пользуйтесь, если кто не знал…

ps: по секрету, сегодня залетит очередная пицца, не проеби!


tags: #utilites #security #рабочиебудни

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
172911
Хелоу! А какую команду ты запускаешь первой, когда поднял linux сервак/десктоп (vps/vds, виртулка, бареметал и т.п.)?

У меня руки на автомате вбивают: apt update && apt upgrade && apt install mc.

Но несколько раз видел как люди первым делом отключали selinux и отправляли машину в ребут. А потом уже всё остальное.

А как делаешь ты? Камон в комменты обсудим, интересно на твои паттерны посмотреть.

tags: #linux #рабочиебудни

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
103408
Здрасти. Как-то я писал про strace и как применять инъекции. Если пропустил, то читай тут и тут.

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

#!/usr/bin/perl

use strict;
use warnings;

my %numbs;
select STDERR;
while(<STDIN>) {
if( /^[0-9]++\s++([a-z0-9_]++(?=\())/ ) {
my $t = ++$numbs{$1};
s/\s+/ \e[31m$t\e[m /;
die $! if( keys %numbs == 1000 );
}
print;
}
exit(0);


Сохраняем это безобразие в файл num_syscalls и делаем chmod +x, ну а дальше запускаем в связке с strace:

strace -o'|./num_syscalls' -yf sh -c 'ls|cat'


Теперь получаем такой выхлоп:

456107 48 close(3</usr/) = 0
456107 52 rt_sigreturn({mask=[]})
456107 63 openat(AT_FDCWD</usr/local/sbin>)
456107 53 newfstatat(3)
456107 64 openat(AT_FDCWD</usr/local/sbin>)


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

Например, возьмем системный вызов openat, видим 63, 64. Это значит что openat был вызван 64 раза. А newfstatat 53.

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

Тема крутая, не нужно ебаться и считать руками.

Весь вывод strace отправляется в stderr, чтобы иметь возможность разделять вывод трассировки и вывод исследуемой программы.

А чтобы получить только трассировку, можно сделать так:

strace -o'|./num_syscalls' -yf ls > /dev/null


Если бесит подсветка, выпили из перловского скрипта управляющий символ «\e[31m\[em».

Такие дела, изучай!

tags: #linux #debug

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
113415
Я уже как-то говорил, что считаю awk недооцененным. Большинство примеров сводится к тому, чтобы убрать лишние колонки из отчета.

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

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

Решать будем методом перебора. Ну, не полного перебора, немного включим голову.

Напомню, ферзь бъет по вертикали, горизонтали, диагонали. Поэтому для начала расставим каждого ферзя на свою вертикаль и будем двигать, проверяя условия боя.

Таких будет два - горизонталь и диагональ. Для удобства клеточки буду нумеровать с 0.

Итого - получаем 10 вложенных циклов (8 двигают ферзей, 2 - проверка условий боя) ха, тут всего-то 8^8=16777216 вариантов.

#!/bin/bash
#8 ферзей

awk 'BEGIN{
for(c[0]=8;c[0]--;){
for(c[1]=8;c[1]--;){
for(c[2]=8;c[2]--;){
for(c[3]=8;c[3]--;){
for(c[4]=8;c[4]--;){
for(c[5]=8;c[5]--;){
for(c[6]=8;c[6]--;){
for(c[7]=8;c[7]--;){
b=1
for(i=0;i<7 && b;i++){
for(j=i+1;j<8;j++){
if(c[i]==c[j]){b=0;break}
a=c[i]-c[j];n=j-i
if(a==n || a==-n){b=0;break}}}
if(b){print c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7] }
}}}}}}}}
}'


Пояснения:

c[i]==c[j])
- проверка на горизонталь.

a=c[i]-c[j];n=j-i - проверка на диагональ.

Вообщето-то тут должен быть abs(c[i]-c[j]), но в awk нет модуля, поэтому if(a==n || a==-n)

Да, и в awk оператор break выходит из одного цикла, поэтому пришлось немного извращаться. (&& b), но задача решена.

Примечание я знаю про алгоритмы пермутаций, но тут лобовое решение.

Вариантов всего 92.

Приведу последний: 04752613 Время выполнения на моем дохлом ноуте ~1.5 минуты.

Продолжение следует...

tags: #bash © by Tagd Tagd

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
104712
там чет телега с комментами намутила и у последнего поста про ферзей кнопку не сделала, кто хотел высказаться, можете это сделать по кнопке ниже 👇
168
Задача та же. 8 ферзей.

Предыдущая часть здесь: Воспользуемся тонкостями языка. На шахматной доске 8 клеток (тут может круто подойти восьмеричная система.) Таким образом заменяем 8 вложенных циклов всего одним!!!, с преобразованием числа в восьмеричное.

Каждая цифра - отдельный столбец.

Значение - номер строки.

#!/bin/bash
#8 ферзей

awk 'BEGIN{
i=8^8
while(i--){
c=sprintf("%08o",i)
j=8
while(index(c,--j)){}
if(j<0){
j=8
while(j--){q[j]=substr(c,j+1,1)}
b=1
for(m=0;m<7 && b;m++){
for(j=m+1;j<8;j++){
a=q[m]-q[j];sub(/-/,"",a)
if(a==(j-m)){b=0;break}}}
if(b){print c}
}}}'
#---


while(index(c,--j)){} - чисел всего 8(0-7), если index=0 (нет цифры j в числе с из 8 цифр, значит каких-то цифр 2).

Обратите внимание тело цикла пустое! Если цикл прошел полностью - дублей нет. Вау.

Алгоритм пермутаций без повторений методом перебора. (проверка на горизонталь).

while(j--){q[j]=substr(c,j+1,1)} - преобразовали число c в массив цифр q[]

Дальше аналогично предыдущей программе, кроме sub(/-/,"",a) - еще один аналог модуля.

Просто отбрасываем "-". Как конструкция по скорости не знаю, не проверял.

Программа отработала примерно за 41с.

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

Кто там хотел изучать bash?

Слабо реализовать на чистом bash?

Интересно было бы и время выполнения сравнить.

tags: #bash © by Tagd Tagd

🔔 @bashdays➡️ @gitgate
Please open Telegram to view this post
VIEW IN TELEGRAM
10269