Привет отдыхающим. Хош не хош, а постом вас нужно порадовать и желательно интересным. Вот сейчас и порадую, самое время.
Сегодня будем дебажить и багфиксить. Узнаем что такое core файлы в Linux и как с ними взаимодействовать.
Иногда в Linux появляются какие-то странные файлы, с названием
А этот высер можно либо отключить, либо залезть в него рукой и поковырять. На самом деле все эти «Корки», очень полезный материал для изучения и отладки падающих приложений.
✔️ Что такое «Корки»
Нет это не порода собаки. Всё просто, это файл, который содержит дамп памяти процесса в моменте, когда он уебался. То есть произошел segmentation fault.
Имея этот файл на руках, можно запатчить, забагфиксить либо понять откуда растут ноги у ошибки.
Как включить core файлы.
Хуй знает. Обычно это делается через файл
Либо из консоли брякнуть:
В этом случае, если процесс/программа уебалась, то в папке с этим приложением появится файл
Важно! Выполняем:
Если вернуло 0, то хуй те, а не «корка». Чтобы все сработало, выполняем команду:
Так. У нас всё готово, по идее «корки» теперь будут создаваться. Если не создаются, то ты что-то сделал не так, либо в твоем дистрибутиве это делается иначе. Но я думаю это везде одинаково. Пробуй.
Пишем простой код на СИськах
Компилируем:
Ключ -g включает отладочную информацию. Без этого ключа хуй мы чо отдебажим.
Сложно? Забей, нам важно понять как работать с «корками» и дебажить.
Так. Запускаем бинарник.
Хуяк и словили
Запускаем отладчик:
``
Происходит магия. Чето там бежит и льется. Без паники! Смотрим несколько последних строчек:
Тааак… и видим из-за чего была вызвана ошибка. Даже строчку показывает, которая справедлива для исходника, хотя мы смотрим бинарник.
Проверяем указатель ptr, вводим в отладчике:
И видим что указатель ptr имеет значение
Теперь когда у нас есть эта инфа, мы знаем, что проблема заключается в попытке доступа к памяти по-нулевому указателю и можно это забагфиксить.
Самое простое решение, это добавить проверку и убедиться, что указатель ptr указывает на допустимую область памяти. Прежде чем разыменовывать его. Выделяем память для ptr с помощью функции malloc().
Вот и забагфиксили, компилируем, запускаем.
Ошибка сегментации исчезла. Улыбаемся и в очередной раз гордимся - какие же мы охуительные.
Но не достаточно! Чтобы прям вообще преисполниться, нужно запатчить бинарник через hex редактор.
Как это сделать, покажу совсем скоро, а то пост пиздец толстый получился.
У меня всё. Изучай.
tags: #linux #debug
@ВАSНDАYS | BАSHDАYS.CОM
Сегодня будем дебажить и багфиксить. Узнаем что такое core файлы в Linux и как с ними взаимодействовать.
Иногда в Linux появляются какие-то странные файлы, с названием
core.xxx, порой их бывает прям дохуя. Обычно их все сносят и не задумываются чо это за высер такой.А этот высер можно либо отключить, либо залезть в него рукой и поковырять. На самом деле все эти «Корки», очень полезный материал для изучения и отладки падающих приложений.
Нет это не порода собаки. Всё просто, это файл, который содержит дамп памяти процесса в моменте, когда он уебался. То есть произошел segmentation fault.
Имея этот файл на руках, можно запатчить, забагфиксить либо понять откуда растут ноги у ошибки.
Как включить core файлы.
Хуй знает. Обычно это делается через файл
/etc/sysctl.conf, добавляем:kernel.core_pattern=core
Либо из консоли брякнуть:
sysctl -w kernel.core_pattern=core
В этом случае, если процесс/программа уебалась, то в папке с этим приложением появится файл
core.xxx.Важно! Выполняем:
ulimit -c
Если вернуло 0, то хуй те, а не «корка». Чтобы все сработало, выполняем команду:
ulimit -c unlimited
Так. У нас всё готово, по идее «корки» теперь будут создаваться. Если не создаются, то ты что-то сделал не так, либо в твоем дистрибутиве это делается иначе. Но я думаю это везде одинаково. Пробуй.
Пишем простой код на СИськах
#include <stdio.h>
int main() {
int *ptr = NULL;
*ptr = 10;
return 0;
}
Компилируем:
gcc -g -o bashdays bashdays.c
Ключ -g включает отладочную информацию. Без этого ключа хуй мы чо отдебажим.
В коде выше, я пытаюсь присвоить значение 10 по адресу, на который указывает указатель ptr, но ptr не инициализирован и содержит значение NULL. В попытке разыменования указателя на NULL мы получим segmentation fault.
Сложно? Забей, нам важно понять как работать с «корками» и дебажить.
Так. Запускаем бинарник.
./bashdays
Хуяк и словили
Segmentation fault (core dumped). Видишь в скобках core dumped? ВОТ ОНО! Рядом с бинарником появился файл core.1302. Полезли копаться в этом высере!Запускаем отладчик:
gdb ./bashdays core.1302
``
Происходит магия. Чето там бежит и льется. Без паники! Смотрим несколько последних строчек:
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000563ebf37f13d in main () at coretest.c:5
5 *ptr = 10;
Тааак… и видим из-за чего была вызвана ошибка. Даже строчку показывает, которая справедлива для исходника, хотя мы смотрим бинарник.
Проверяем указатель ptr, вводим в отладчике:
(gdb) print ptr
$1 = (int *) 0x0
И видим что указатель ptr имеет значение
NULL (0x0). Это и вызвало ошибку сегментации при попытке разыменования.Теперь когда у нас есть эта инфа, мы знаем, что проблема заключается в попытке доступа к памяти по-нулевому указателю и можно это забагфиксить.
Самое простое решение, это добавить проверку и убедиться, что указатель ptr указывает на допустимую область памяти. Прежде чем разыменовывать его. Выделяем память для ptr с помощью функции malloc().
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = malloc(sizeof(int)); // выделяем память для указателя
if (ptr != NULL) { // если память выделена, присваиваем значение
*ptr = 10;
free(ptr); // освобождаем память
} else {
printf("Алярма! Память не выделяется\n");
}
return 0;
}
Вот и забагфиксили, компилируем, запускаем.
Ошибка сегментации исчезла. Улыбаемся и в очередной раз гордимся - какие же мы охуительные.
Но не достаточно! Чтобы прям вообще преисполниться, нужно запатчить бинарник через hex редактор.
Как это сделать, покажу совсем скоро, а то пост пиздец толстый получился.
У меня всё. Изучай.
tags: #linux #debug
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, этот пост должен был выйти вчера, но тупоголовые боты видимо прислушались к моему совету и решили устроить себе выходной.
Если ты не уверен, что сегодня выходной, этот Bash скрипт тебе поможет:
Вот прям сейчас возьми и встрой это во все свои поделки на проде. И ни один крон не заставит их работать по выходным.
✔️ Скрипты тоже должны отдыхать!
С праздниками посложнее будет, но если добавить и их в логику, привязать например к производственному календарю, тогда тебя точно на ретроспективе похвалят и дадутпизды премию. Правда посмертную.
А если ты живешь в жопе мира, например в племенах Масаи и спишь под кустом, естественно скрипт нужно немного адаптировать. Ведь у тебя выходные дни будут выпадать на другие дни недели. Учти это!
Ну красота же! Прям рубрика «Вредные советы» получилась. Экспериментируй.
tags: #linux #bash
@ВАSНDАYS | BАSHDАYS.CОM
Если ты не уверен, что сегодня выходной, этот Bash скрипт тебе поможет:
if [[ $(date +%u) -gt 5 ]]; then
echo 'А вот и нет! У меня выходной!'
exit 0
fi
Вот прям сейчас возьми и встрой это во все свои поделки на проде. И ни один крон не заставит их работать по выходным.
С праздниками посложнее будет, но если добавить и их в логику, привязать например к производственному календарю, тогда тебя точно на ретроспективе похвалят и дадут
А если ты живешь в жопе мира, например в племенах Масаи и спишь под кустом, естественно скрипт нужно немного адаптировать. Ведь у тебя выходные дни будут выпадать на другие дни недели. Учти это!
Ну красота же! Прям рубрика «Вредные советы» получилась. Экспериментируй.
tags: #linux #bash
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Флюгегехаймен
Ну а что тут ответить, живи теперь с этим. С вас 50 тыщ рублей! В психологи что ли пойти. У меня прям получается🫥
Чем круче контора, тем больше будет хуйни на собесах. «Канализационные люки» и «Дом для семьи жирафов на луне» никто не отменял.
Прикинь если на собесах такую дичь спрашивают, какого тебе будет работать в такой компании?
Будешь пилить задачи в стол которые не имеют смысла. Такого ты себе желаешь? Конечно нет!
Голову не грей, в 99% случаев все эти собесы сделаны так, чтобы посмотреть — как быстро ты психанешь и убежишь в слезах.
Ну любят эти черти HRы своё ЭГО потешить и ЧСВ лишний раз размять.
Обычно после этого, оффер у меня всегда был в кармане. Ну любят они кандидатов с яйцами. Не все правда, но большинство.
Диктуй свои правила, не нужно бояться этих рекрутеров, рви имжопы шаблоны, ходи на собесы с холодной головой, делай одолжения.
✔️ Они как собаки, чувствуют страх. Испугался — тебе песда!
Не взяли, ну и хер с ними. Значит эта компания — не твоё! В любом случае у тебя копится ценный опыт, со временем обрастаешь кожей, перестанешь на весь этот цирк обращать внимание.
Ты же в айти крутишься, тут и не такое бывает.
А самое главное, чем раньше начнешь копить финансовую подушку, тем увереннее будешь чувствовать себя на собесах.
Хоть по 500 рублей в неделю откладывай. Потому что, тебе будет похер, пройдешь ты его или нет. На новые носки и дошик с сосисками хватит.
Не сегодня, так завтра найдешь ты свой дримтим. Дело времени. Никто не говорил что будет легко.
Всегда иди туда, где страшно!
Ну и челендж — сможешь написать Bash скрипт на поиск Акронимов и устроиться в Яндекс? Кидай в комментарии, будет интересно!
tags: #рабочиебудни
@ВАSНDАYS | BАSHDАYS.CОM
Ну а что тут ответить, живи теперь с этим. С вас 50 тыщ рублей! В психологи что ли пойти. У меня прям получается
Чем круче контора, тем больше будет хуйни на собесах. «Канализационные люки» и «Дом для семьи жирафов на луне» никто не отменял.
Прикинь если на собесах такую дичь спрашивают, какого тебе будет работать в такой компании?
Будешь пилить задачи в стол которые не имеют смысла. Такого ты себе желаешь? Конечно нет!
Голову не грей, в 99% случаев все эти собесы сделаны так, чтобы посмотреть — как быстро ты психанешь и убежишь в слезах.
Ну любят эти черти HRы своё ЭГО потешить и ЧСВ лишний раз размять.
Когда мне давали подобные задачи, я честно говорил — я не буду это делать, потому что я ебал! Не я себя продаю, а вы пришли ко мне и позвали на собес.
Поэтому не несите хуйню и давайте задачу связанную с моей будущей ролью. А если нет таких задач, извините, я пошел дальше мультики смотреть.
Обычно после этого, оффер у меня всегда был в кармане. Ну любят они кандидатов с яйцами. Не все правда, но большинство.
Диктуй свои правила, не нужно бояться этих рекрутеров, рви им
Не взяли, ну и хер с ними. Значит эта компания — не твоё! В любом случае у тебя копится ценный опыт, со временем обрастаешь кожей, перестанешь на весь этот цирк обращать внимание.
Ты же в айти крутишься, тут и не такое бывает.
А самое главное, чем раньше начнешь копить финансовую подушку, тем увереннее будешь чувствовать себя на собесах.
Хоть по 500 рублей в неделю откладывай. Потому что, тебе будет похер, пройдешь ты его или нет. На новые носки и дошик с сосисками хватит.
Не сегодня, так завтра найдешь ты свой дримтим. Дело времени. Никто не говорил что будет легко.
Всегда иди туда, где страшно!
Ну и челендж — сможешь написать Bash скрипт на поиск Акронимов и устроиться в Яндекс? Кидай в комментарии, будет интересно!
tags: #рабочиебудни
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ 14-летний школьник из Москвы сошел с ума собирая KDE из исходников
Сижу в потоке, правлю
Запускаюпохерены отсутствуют.
Почесываю свою лысую кабину. Ага, значит какой-нибудь puppet агент тут крутится или ансибл.
Смотрю процессы, паппета нет, смотрю логи auth на момент подключения ансибла. Да блядь. Пусто! Смотрю логи крона и сам крон, ничо нет. В логах нет — нихуя!
Списываю всё на глюки симуляции этого мира и магнитные бури. Добавляю еще раз локейшены, перезапускаю nginx, сука! Локейшенов нет ))
Курю, бегаю по каталогам, размеренно думаю. Ииии замечаю забавнейшую вещь. В корне каталога etc есть директория .git!!! Вот и сложился пазл. Картина маслом.
Как я и думал, здесь установлен ETCKeeper.
Эта такая херабора, которая отслеживает изменения в каталоге etc. Если что-то изменилось, оно это откатывает из git репозитория.
А чтобы поправить nginx конфиг, предварительно нужно запушить в репу актуальные правки иии только потом оно останется на сервере.
Штука довольно интересная, в своё время я ее втыкал где только можно. Очень полезна от криворуких разработчиков/тестировщиков с рутом. Которые ломают и потом утверждают, что они ничего не делали.
А ты просто смотришь диффы в git и тыкаешь их носом как нагадивших в макбук котяток.
Ставится эта штука очень просто, через apt, ну а дальше почти из коробки работает, достаточно сказать с каким репозиторием ей взаимодействовать и по желанию добавить всякие конфиденциальные файлы в .gitignore.
Давай позабавимся:
В git репе в разделе Deploy Keys, добавляем public root ключик с галочкой Allow write access.
А затем применяем бест практику и пушим в мастер:
Всё Initial Commit почти со всем содержимым, запушен в репу. Красотища!
✔️ Но перед пушем не забываем поправить файлик .gitignore и добавить в него например всякие shadows и т.п.
Ну а теперь пробуем отредактировать какой-нибудь fstab и добавить новую строчку. Добавил? Ок, запускай!
Всё! Правки в git репе. Ну и по желанию всё это дело можно откатить, либо пачкой, либо один файл.
Делается так, смотрим список коммитов:
Теперь откатываем правленый fstab:
Ееее! Откатилось. Ну и не забываем, что после отката нужно зафиксировать все изменения.
Вот и всё! Функционал etckeeper намного шире, я рассказал про основное и саму концепцию. А если будет интересно думаю ты и сам найдешь всю нужную информацию в гугле.
Вообще можно и через Bash скрипт такое размутить, не устанавливая никакой софт, но иногда проще сделать
Отслеживать изменения можно через incron и автоматически коммитить:
Incron запускает таски не по временным меткам, а по событиям.
Добавить больше нечего. Хорошего тебе дня!
tags: #linux #utils
@ВАSНDАYS | BАSHDАYS.CОM
Сижу в потоке, правлю
nginx.conf, птички поют, коты ебутся, весна! Запускаю
nginx reload, хм, ничего не изменилось… Лезу в nginx.conf, а в нем все мои локейшены, которые я добавил — Почесываю свою лысую кабину. Ага, значит какой-нибудь puppet агент тут крутится или ансибл.
Смотрю процессы, паппета нет, смотрю логи auth на момент подключения ансибла. Да блядь. Пусто! Смотрю логи крона и сам крон, ничо нет. В логах нет — нихуя!
Списываю всё на глюки симуляции этого мира и магнитные бури. Добавляю еще раз локейшены, перезапускаю nginx, сука! Локейшенов нет ))
Курю, бегаю по каталогам, размеренно думаю. Ииии замечаю забавнейшую вещь. В корне каталога etc есть директория .git!!! Вот и сложился пазл. Картина маслом.
Как я и думал, здесь установлен ETCKeeper.
Эта такая херабора, которая отслеживает изменения в каталоге etc. Если что-то изменилось, оно это откатывает из git репозитория.
А чтобы поправить nginx конфиг, предварительно нужно запушить в репу актуальные правки иии только потом оно останется на сервере.
Штука довольно интересная, в своё время я ее втыкал где только можно. Очень полезна от криворуких разработчиков/тестировщиков с рутом. Которые ломают и потом утверждают, что они ничего не делали.
А ты просто смотришь диффы в git и тыкаешь их носом как нагадивших в макбук котяток.
Ставится эта штука очень просто, через apt, ну а дальше почти из коробки работает, достаточно сказать с каким репозиторием ей взаимодействовать и по желанию добавить всякие конфиденциальные файлы в .gitignore.
Давай позабавимся:
apt install etckeeper git
cd /etc
git remote add origin [email protected]:bashdays/etc.git
В git репе в разделе Deploy Keys, добавляем public root ключик с галочкой Allow write access.
А затем применяем бест практику и пушим в мастер:
git push -u origin master
Всё Initial Commit почти со всем содержимым, запушен в репу. Красотища!
Я этой хуйнёй не занимаюсь, ну спиздят у меня хеши паролей, да ради бога. Репа приватная. Да и на серваке у меня вход по паролям всегда отключен, только ключи.
Ну а теперь пробуем отредактировать какой-нибудь fstab и добавить новую строчку. Добавил? Ок, запускай!
etckeeper commit "поправил fstab" && git push
Всё! Правки в git репе. Ну и по желанию всё это дело можно откатить, либо пачкой, либо один файл.
Делается так, смотрим список коммитов:
etckeeper vcs log --pretty=oneline
e36f279 (HEAD -> master, origin/master)
9c24a66 поправил fstab
c1ee020 Initial commit
Теперь откатываем правленый fstab:
etckeeper vcs checkout 9c24a66 /etc/fstab
Ееее! Откатилось. Ну и не забываем, что после отката нужно зафиксировать все изменения.
etckeeper commit "вернул как было"
git push
Вот и всё! Функционал etckeeper намного шире, я рассказал про основное и саму концепцию. А если будет интересно думаю ты и сам найдешь всю нужную информацию в гугле.
Вообще можно и через Bash скрипт такое размутить, не устанавливая никакой софт, но иногда проще сделать
apt install чем отлаживать баги в своем коде.Я как-то на коленке изобретал нечто подобное для nginx, писал в этом посте.
Отслеживать изменения можно через incron и автоматически коммитить:
incrontab -e
/etc IN_MODIFY /usr/bin/etckeeper commit "modified $@/$#"
Incron запускает таски не по временным меткам, а по событиям.
Добавить больше нечего. Хорошего тебе дня!
tags: #linux #utils
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
А ты узнаешь!
Тыж всяко в курсе, что планировать регулярные таски в Linux можно не только через cron и его форки, а еще и через systemd + таймеры.
Каждый уважающий себя админ, пытается навязать мне эти таймеры. Мол, Роман ты заебал, нужно использовать таймеры, зачем тебе этот легаси cron. На дворе 2024 год, нужно идти в ногу со временем.
Справедливо? Неа!
Чтобы добавить таску в крон, мне потребуется секунд 15, а то и меньше. А чтобы провернуть это с таймерами, придется знатно упороться.
Давай сделаем простой таймер. Для начала создадим сервис, который будет запускать bash скрипт.
Создаем файл
/etc/systemd/system/bashdays.service[Unit]
Description=Bashday service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/bashdays.sh
[Install]
WantedBy=multi-user.target
Тип сервиса = камшот, сервис будет запущен один раз и завершится после выполнения задачи.
ExecStart = какой внешний Bash скрипт будем передёргивать.
WantedBy = не обращай внимания, это базовый таргет.
Теперь сам скрипт
bashdays.sh 👇#!/bin/bash
unix_time=$(date +%s)
> /tmp/$unix_time
Скрипт будет создавать в папке tmp файл с именем равным Unixtime.
Проверяем:
systemctl daemon-reload
systemctl start bashdays
systemctl status bashdays
Всё, видим что все успешно отработало. А в папке tmp появился файл с именем
1713409747 (у тебя будет другое).Так. Теперь нужно сделать таймер, чтобы запускать сервис в нужные промежутки.
Уже начинаешь понимать в какой блуд заводят таймеры?
Создаем файл
/etc/systemd/system/bashdays.timer[Unit]
Description=Bashdays timer
[Timer]
OnCalendar=*:*:00
[Install]
WantedBy=timers.target
Срабатывает каждую минуту. Запускаем:
systemctl start bashdays.timer
systemctl status bashdays.timer
Видим: Active: running + Triggers: bashdays.service
Поздравляю, ты добавил одну таску в «крон» через таймеры. Теперь в папке tmp каждую минуту будут появляться файлы.
Но это еще не всё. Нужно добавить таймер в автозагрузку:
systemctl enable bashdays.timer
А вот теперь всё, можно перезагрузить сервер и файлы в tmp продолжат создаваться.
Теперь смотри, в одном большом Интернет магазине, у клиента в кроне подвешено около 150 скриптов. Ладно, не скриптов, дергается консольная ларавелька с нужными php параметрами. Не суть.
Ну дак вот! Ты будешь создавать 150 сервисов + 150 таймеров?
Да это ЕБОБО! 300 файлов! И все это никак не группируется. Извините, но проще через нативный cron сделать.
Понятно дело, если у тебя 2 таски, то можно повыебываться с таймерами. Но для масштабных приключений, увы.
Тут либо автоматизацию пилить, либо ручками страдать.
journalctl -u bashdays.service.Но в большинстве случаев они избыточны.
Я остаюсь преданным крону, но таймеры выбрасывать на помойку не буду, авось когда-нибудь пригодятся.
Тему таймеров я затрагивал ранее в этом посте, в нем мы разбирали как с помощью sshfs надежно замонтировать сетевые диски, чтобы они не отваливались.
А ты используешь таймеры? Чо думаешь?
tags: #linux #bash
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Как говорится: «Дай человеку рыбу — он будет сыт целый день. Научи его пользоваться Linux и он будет сыт этим дерьмом всю оставшуюся жизнь»
Привет друзья. Давай разберем очередную башболячку, с которой многие сталкиваются. Нет, это не условные хреновины
Есть Bash скрипт:
Что непонятного в этом скрипте? Правильно, где-то используется конструкция «;&», где-то «;;» а еще может быть «;;&».
✔️ Ватафак? Поехали разбираться.
Все эти конструкции влияют на логику работы оператора
И, как обычно, этот синтаксис вводит в заблуждение, а порой даже разрывает жопы у бывалых инженеров. Но на самом деле все просто.
Запускаем скрипт с параметрами:
Получаем:
Понял что произошло? Скрипт нашел тройку в параметре и отработал до символа «;;», выведя на экран все 3 кейса. То есть получается символ «;&» отработал как «ДАВАЙ ДАЛЬШЕ», а символ «;;» как BREAK.
Аналогично если запустим так:
То получим второй кусок кейса, который выведет:
Просто? Просто! Погнали дальше.
Если забитьхуй в параметре например «двойку», то получим такое:
Уровень 3 уже пролетает как фанера над Парижем.
С этими кейсами нужно быть особо аккуратным, так как это тонкий лед и нужно не запутаться в логике. Есть еще «;;&» но он почти идентичен «;&», про него чуть ниже.
Получается так:
;; - Обозначение конца блока для текущего случая case. Когда интерпретатор bash встречает «;;» он завершает выполнение текущего блока и переходит к следующему ветвлению (если оно есть).
;& - Обозначение «проваливания» (fallthrough) в case операторе. Когда интерпретатор bash встречает «;&», он продолжает выполнение следующего блока кода без остановки, даже если условие не соответствует.
;;& - аналогично «;&», за исключением того, что после выполнения кода текущего случая, интерпретатор также завершает текущий блок кода и продолжает выполнение следующего случая.
;) а это просто подмигивающий смайлик.
Можно кстати еще аналог wildcard использовать в case:
Так, чисто для развития, мож пригодится когда-нибудь.
С пятницей, всем хороших предстоящих выходных, берегите себя!
tags: #linux #bash
@ВАSНDАYS | BАSHDАYS.CОM
Привет друзья. Давай разберем очередную башболячку, с которой многие сталкиваются. Нет, это не условные хреновины
eq/gt, но очень похожи.Есть Bash скрипт:
#!/bin/bash
case $1 in
3)
echo "Уровень 3"
;&
2)
echo "Уровень 2"
;&
1)
echo "Уровень 1"
;;
a)
echo "Уровень A"
;&
b)
echo "Уровень B"
;&
c)
echo "Уровень C"
;;
esac
Что непонятного в этом скрипте? Правильно, где-то используется конструкция «;&», где-то «;;» а еще может быть «;;&».
Все эти конструкции влияют на логику работы оператора
case. И, как обычно, этот синтаксис вводит в заблуждение, а порой даже разрывает жопы у бывалых инженеров. Но на самом деле все просто.
Запускаем скрипт с параметрами:
./bashdays.sh 3
Получаем:
Уровень 3
Уровень 2
Уровень 1
Понял что произошло? Скрипт нашел тройку в параметре и отработал до символа «;;», выведя на экран все 3 кейса. То есть получается символ «;&» отработал как «ДАВАЙ ДАЛЬШЕ», а символ «;;» как BREAK.
Аналогично если запустим так:
./bashdays.sh a
То получим второй кусок кейса, который выведет:
Уровень A
Уровень B
Уровень C
Просто? Просто! Погнали дальше.
Если забить
Уровень 2
Уровень 1
Уровень 3 уже пролетает как фанера над Парижем.
С этими кейсами нужно быть особо аккуратным, так как это тонкий лед и нужно не запутаться в логике. Есть еще «;;&» но он почти идентичен «;&», про него чуть ниже.
У меня с этим вечная проблема, но я нашел годный лайкфак — сначала рисую логику на бумажке и потом по ней уже пишу скрипт. Работает кстати хорошо и для всяких ИФов.
Получается так:
;; - Обозначение конца блока для текущего случая case. Когда интерпретатор bash встречает «;;» он завершает выполнение текущего блока и переходит к следующему ветвлению (если оно есть).
;& - Обозначение «проваливания» (fallthrough) в case операторе. Когда интерпретатор bash встречает «;&», он продолжает выполнение следующего блока кода без остановки, даже если условие не соответствует.
;;& - аналогично «;&», за исключением того, что после выполнения кода текущего случая, интерпретатор также завершает текущий блок кода и продолжает выполнение следующего случая.
;) а это просто подмигивающий смайлик.
Можно кстати еще аналог wildcard использовать в case:
case $1 in
ba*)
echo "все что начинается на ba"
;&
Так, чисто для развития, мож пригодится когда-нибудь.
С пятницей, всем хороших предстоящих выходных, берегите себя!
tags: #linux #bash
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Linux всем надоел?
Привет. Сегодня поговорим про полезную утилиту, которой я лично пользуюсь для поиска всякого говна на Linux серверах.
В контексте говна выступает всё то, что не должно быть на серваке. К примеру собранные их исходников древние артефакты и т.п.
Короче софтина ищет все файлы, которые попали на сервак в обход пакетного менеджера. Ну и которые были установлены из левых источников, либо созданные самими пользователями.
✔️ Называется Сruft, ставится через апт, или чего там у тебя.
А дальше запускаем. НО из коробки она будет въедливо и долго шуршать. Поэтому заранее сообщаем ей, какие директории нужно проигнорировать.
Например, я знаю что установлен docker и мне в отчете это видеть не обязательно. Справедливо и для всяких mysql и т.п.
Тем самым ты уменьшишь свой отчет и потратишь меньше времени на анализ.
Отчет выглядит примерно так:
В отчете ты найдешь ОЧЕНЬ много интересного, особенно если это сервак клиента или ты устроился на новую работу и нужно въехать в инфраструктуру. А может найдешь какую-нибудь хитро запрятанную малварю.
Из отчета выше я вижу какой-то Bash скрипт
Короче очень удобно искать подобные вещи, о которых ты не подозреваешь или забыл.
У утилиты достаточно много ключей, но я ими не пользуюсь, максимум загоняю в игнор жирные пользовательские папки, докеры и подобную хероту.
Советую присмотреться, ни раз мою жопу выручал во время миграций со старых серваков на новые.
Давай! Не смею больше отвлекать🥳
tags: #linux #utils
@ВАSНDАYS | BАSHDАYS.CОM
Привет. Сегодня поговорим про полезную утилиту, которой я лично пользуюсь для поиска всякого говна на Linux серверах.
В контексте говна выступает всё то, что не должно быть на серваке. К примеру собранные их исходников древние артефакты и т.п.
Короче софтина ищет все файлы, которые попали на сервак в обход пакетного менеджера. Ну и которые были установлены из левых источников, либо созданные самими пользователями.
apt install cruft
cruft - Check the filesystem for cruft (missing and unexplained files)
А дальше запускаем. НО из коробки она будет въедливо и долго шуршать. Поэтому заранее сообщаем ей, какие директории нужно проигнорировать.
Например, я знаю что установлен docker и мне в отчете это видеть не обязательно. Справедливо и для всяких mysql и т.п.
cruft --ignore /boot --ignore /sys --ignore /home --ignore /var/lib/docker -r ~/bashdays-report.txt
Тем самым ты уменьшишь свой отчет и потратишь меньше времени на анализ.
Отчет выглядит примерно так:
cruft report: Fri Apr 19 10:00:07 UTC 2024
---- unexplained: / ----
/usr/local/sbin/fuck.sh
/usr/local/sbin/growroot
/usr/local/sbin/ttyd
/usr/local/sbin/validator
/usr/local/share/fonts/.uuid
В отчете ты найдешь ОЧЕНЬ много интересного, особенно если это сервак клиента или ты устроился на новую работу и нужно въехать в инфраструктуру. А может найдешь какую-нибудь хитро запрятанную малварю.
Из отчета выше я вижу какой-то Bash скрипт
/usr/local/sbin/fuck.sh о котором не знал. А оказывается я его писал очень давно и совсем про него забыл. Опа. А если я бы похерил сервер, то и скрипт бы похерился. Обидно. А еще вон какой-то validator затесался, явно тоже самописная приблудина.Короче очень удобно искать подобные вещи, о которых ты не подозреваешь или забыл.
У утилиты достаточно много ключей, но я ими не пользуюсь, максимум загоняю в игнор жирные пользовательские папки, докеры и подобную хероту.
Советую присмотреться, ни раз мою жопу выручал во время миграций со старых серваков на новые.
Давай! Не смею больше отвлекать
tags: #linux #utils
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему 99% девопсов жирные?
Ну ясно понятно, из-за стресса, а не из-за того, что много жрут и ведут сидячий образ жизни.
Далеко ходить не будем. Вчера мы с тобой тёрли за cruft, поэтому делюсь еще одной штукой, которую также применяю.
✔️ Утилита называется — debsums
Она предназначена для проверки целостности файлов, которые установлены пакетным менеджером. Вроде хуйня, а НЕТ! Инструмент — мастхэв.
Из названия уже понятно, что проверка целостности пакетов будет проходить на основе контрольных хэш сумм.
Откуда берутся эталонные хэши?
При установке пакетов и т.п. все эталонные, контрольные суммы попадают в «базу данных», которая находится тут:
В ней содержатся файлы с данными, которые и использует debsums для проверки.
Например,
Ну дак вот. Debsums либо идет сразу в коробке, либо ставится через пакетный менеджер.
У меня в Селектел на убунте 22 уже была предустановлена, хотя локально её не было. Имей это ввиду.
Запускаем так
В этом случае, будут проверяться все хэш суммы, всех файлов. Это дохуя долго, но иногда полезно если разбираешься с сервером, на который через php залили крипто-майнер или нечто подобное.
Если нужно проверить только измененные:
Опять же очень полезно при миграциях с сервера на сервер.
А для проверки только конфигов:
Например, я в душе не ебал что файл php.ini кто-то правил, а debsum мне это подсказал. И я не зафакапил.
После отработки команды, имеем список измененных файлов:
Ну а дальше включаем в себе подозрительного аналитика и разбираемся с полученной информацией. Также можно быстро визуально понять, какой софт устанавливался и какими внешними пакетами напичкан сервер.
Указав ключ -x весь её высер можно сразу выгрузить в файл. В отчет попадут только измененные файлы.
Из минусов — пиздец долго всё ищет (при полной проверке). Запускаем и идем пить кофе/смотреть мультики. Но это приятное ожидание, плюсы покрывают минусы.
Рекомендую взять на вооружение, утилита довольно пиздатая и достойна твоего внимания.
Подобных утилит много, из тех что я знаю: AIDE, Tripwire, rkhunter, chkrootkit, ossec, Lynis. Присмотрись и к ним, возможно найдешь среди них что-то интересное под свои задачи.
Ну вот и всё. Пойдука я чайку хапну. Хорошего тебе дня!
tags: #linux #utils
@ВАSНDАYS | BАSHDАYS.CОM
Ну ясно понятно, из-за стресса, а не из-за того, что много жрут и ведут сидячий образ жизни.
Далеко ходить не будем. Вчера мы с тобой тёрли за cruft, поэтому делюсь еще одной штукой, которую также применяю.
Она предназначена для проверки целостности файлов, которые установлены пакетным менеджером. Вроде хуйня, а НЕТ! Инструмент — мастхэв.
Из названия уже понятно, что проверка целостности пакетов будет проходить на основе контрольных хэш сумм.
Откуда берутся эталонные хэши?
При установке пакетов и т.п. все эталонные, контрольные суммы попадают в «базу данных», которая находится тут:
/var/lib/dpkg/info.В ней содержатся файлы с данными, которые и использует debsums для проверки.
Например,
nginx-common.md5sumsdba41b system/nginx.service
17d6d7 package-hooks/source_nginx.py
9e33ba nginx-common/NEWS.Debian.gz
6c278a nginx-common/README.Debian
Ну дак вот. Debsums либо идет сразу в коробке, либо ставится через пакетный менеджер.
У меня в Селектел на убунте 22 уже была предустановлена, хотя локально её не было. Имей это ввиду.
Запускаем так
debsums -a
В этом случае, будут проверяться все хэш суммы, всех файлов. Это дохуя долго, но иногда полезно если разбираешься с сервером, на который через php залили крипто-майнер или нечто подобное.
Если нужно проверить только измененные:
debsums -ac
Опять же очень полезно при миграциях с сервера на сервер.
А для проверки только конфигов:
debsums -ae
Например, я в душе не ебал что файл php.ini кто-то правил, а debsum мне это подсказал. И я не зафакапил.
После отработки команды, имеем список измененных файлов:
/etc/crontab
/sbin/start-stop-daemon
/etc/modprobe.d/blacklist.conf
/etc/nginx/sites-available/default
/etc/php/8.1/fpm/pool.d/www.conf
/etc/sysctl.conf
/etc/sudoers
/etc/pam.d/sudo
/etc/systemd/zram-generator.conf
Ну а дальше включаем в себе подозрительного аналитика и разбираемся с полученной информацией. Также можно быстро визуально понять, какой софт устанавливался и какими внешними пакетами напичкан сервер.
Указав ключ -x весь её высер можно сразу выгрузить в файл. В отчет попадут только измененные файлы.
Из минусов — пиздец долго всё ищет (при полной проверке). Запускаем и идем пить кофе/смотреть мультики. Но это приятное ожидание, плюсы покрывают минусы.
Рекомендую взять на вооружение, утилита довольно пиздатая и достойна твоего внимания.
Подобных утилит много, из тех что я знаю: AIDE, Tripwire, rkhunter, chkrootkit, ossec, Lynis. Присмотрись и к ним, возможно найдешь среди них что-то интересное под свои задачи.
Ну вот и всё. Пойдука я чайку хапну. Хорошего тебе дня!
tags: #linux #utils
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет друзья. Готовы поработать в субботу и потом отдохнуть 4 дня?
Жаль что подобные графики справедливы для рядовых айтишников. А нам инженерам приходится держать оборону 24/7/365. Но в этом есть и свои плюсы.
Теперь по делу. Иногда клиент очень хочет оставить авторизацию на Linux сервера по ssh по паролю.
Я таких никогда не уговариваю использовать ключи, ну хочет человек, ради бога.
Возможно когда его забрутфорсят, мозги встанут на место.
Ладно. Как жить с паролями? Обычно! Я выполняю 3 действия:
1. При первом логине запрашиваем смену пароля
2. Пароль должен отвечать заданному шаблону
3. Ну и естественно втыкаю fail2ban
Давай теперь по каждому пункту.
Чтобы при первом логине был запрос на смену пароля, делаем так:
Сначала заводим пользователя, а потом ставим на него черную метку. Через ключ -d говорим через сколько дней запросить смену пароля. У меня это 0, то есть поменять при первом логине.
В chage есть еще много гибких штук для накладывая ограничений. Ознакомься на досуге с его хелпом. Иногда бывает полезно нарулить запретов и насовать палок в ноздри.
Теперь как сделать шаблон пароля.
Шаблон это штука, которая запретит использовать пароли если они не соответствуют ожидаемому результату. Потребует от тебя ввести спецсимволы и прочие непотребности.
Тут посложнее. Будем использовать модуль libpam-pwquality.
Открываем файл
Длина пароля, маленькие и большие буковки, спецсимволы и т.п.
Да, нужно включить этот модуль в файле
Теперь при смене паролей, будут ошибки:
Пока пароль не будет соответствовать заданному шаблону.
Ну а дальше настраиваешь fail2ban по мануалам из гугла или ютуба и радуешься.
Но вообще не рекомендую подобной херней заниматься и делать сразу всё на ключах + по возможности настраивать iptables.
✔️ Стоит ли менять 22 порт на другой?
А зачем? Если у тебя логин по ключам и fail2ban, да ради бога, пусть стучатся головой об стенку. Единственное забьюся логи, да похер, логи надо сразу в лог сервер заворачивать.
Как отключить логи я писал в этом посте.
Ну и для прикола можешь Port knocking настроить, если уж совсем делать нехуй.
Всем котиков и бородатых мужиков!🥳 😲
tags: #linux
@ВАSНDАYS | BАSHDАYS.CОM
Жаль что подобные графики справедливы для рядовых айтишников. А нам инженерам приходится держать оборону 24/7/365. Но в этом есть и свои плюсы.
Теперь по делу. Иногда клиент очень хочет оставить авторизацию на Linux сервера по ssh по паролю.
Я таких никогда не уговариваю использовать ключи, ну хочет человек, ради бога.
Возможно когда его забрутфорсят, мозги встанут на место.
Ладно. Как жить с паролями? Обычно! Я выполняю 3 действия:
1. При первом логине запрашиваем смену пароля
2. Пароль должен отвечать заданному шаблону
3. Ну и естественно втыкаю fail2ban
Давай теперь по каждому пункту.
Чтобы при первом логине был запрос на смену пароля, делаем так:
adduser newuser
chage -d0 newuser
Сначала заводим пользователя, а потом ставим на него черную метку. Через ключ -d говорим через сколько дней запросить смену пароля. У меня это 0, то есть поменять при первом логине.
В chage есть еще много гибких штук для накладывая ограничений. Ознакомься на досуге с его хелпом. Иногда бывает полезно нарулить запретов и насовать палок в ноздри.
Теперь как сделать шаблон пароля.
Шаблон это штука, которая запретит использовать пароли если они не соответствуют ожидаемому результату. Потребует от тебя ввести спецсимволы и прочие непотребности.
Тут посложнее. Будем использовать модуль libpam-pwquality.
apt install libpam-pwquality
Открываем файл
/etc/security/pwquality.conf и настраиваем под свои хотелки:minlen = 16
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
Длина пароля, маленькие и большие буковки, спецсимволы и т.п.
Да, нужно включить этот модуль в файле
/etc/pam.d/common-passwordpassword requisite pam_pwquality.so retry=3
Теперь при смене паролей, будут ошибки:
The password contains less than 1 uppercase letters
The password contains less than 1 non-alphanumeric characters
The password is shorter than 16 characters
Пока пароль не будет соответствовать заданному шаблону.
Ну а дальше настраиваешь fail2ban по мануалам из гугла или ютуба и радуешься.
Но вообще не рекомендую подобной херней заниматься и делать сразу всё на ключах + по возможности настраивать iptables.
А зачем? Если у тебя логин по ключам и fail2ban, да ради бога, пусть стучатся головой об стенку. Единственное забьюся логи, да похер, логи надо сразу в лог сервер заворачивать.
Как отключить логи я писал в этом посте.
А вообще всегда помни, если твою инфраструктуру захотят поиметь, а еще и денег за это кому-то заплатят, то ничего не поможет. Максимум можешь перевести свой сервер в оффлайн и то не факт что это как-то тебя защитит. Лично знаю много подобных случаев, да и ты всяко про такое слышал.
Ну и для прикола можешь Port knocking настроить, если уж совсем делать нехуй.
Всем котиков и бородатых мужиков!
tags: #linux
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Про вербальный секс
Здрасти. Вот вам еще одна задачка из моего загашника, которую я скидываю на собесах, размять так сказать мозги кандидату.
Хм, а ты думал они ни СИська пишут? Нет конечно, там чистый Bash!
Ладно, это пена, задача основана на реальных кейсах.
Сейчас будет что-то из оперы Javascript, но касаемо Bash. Устраиваемся поудобнее, наливаем чаёк/кофеёк. Поехали!
Первый блок возвращает 0, второй соответственно 1. А что вернет третий? Очевидно 0? А вот и хуй там плавал! Вернет 1.
Знаешь почему? Потому что ты мыслишь шаблонами, да
Операция == внутри
True и False обрабатываются как переменные, но этим переменным не присвоены никакие значения. Поэтому они интерпретируются как 0.
В обоих случаях ты получишь 0. Получается так:
Оба числа равны, возвращается истина, то есть та самая единица.
✔️ А как сделать правильно?
Ну например так:
Теперь всё встало на свои места. Мы объявили переменные и задали им значения. А потом уже сравниваем СТАТУСЫ и не РАВЕНСТВО двух чисел.
Такие дела. Вроде безобидная штука, а на логику пиздец как влияет.
Ладно, не болей, увидимся!
tags: #bash
@ВАSНDАYS | BАSHDАYS.CОM
Здрасти. Вот вам еще одна задачка из моего загашника, которую я скидываю на собесах, размять так сказать мозги кандидату.
Задачка придумана инженерами NASA, специально для будущих разработчиков. Которым в будущем предстоит писать прошивки для их невзъебенных спейс шаттлов и AI гавноходов.
Хм, а ты думал они ни СИська пишут? Нет конечно, там чистый Bash!
Ладно, это пена, задача основана на реальных кейсах.
Сейчас будет что-то из оперы Javascript, но касаемо Bash. Устраиваемся поудобнее, наливаем чаёк/кофеёк. Поехали!
true
echo $?
false
echo $?
echo $((true == false))
Первый блок возвращает 0, второй соответственно 1. А что вернет третий? Очевидно 0? А вот и хуй там плавал! Вернет 1.
Знаешь почему? Потому что ты мыслишь шаблонами, да
true = 0, false = 1, но ты упустил саму суть.Операция == внутри
$(()) не является равенством возвращаемых СТАТУСОВ в Bash. Она выполняет проверку равенства двух чисел.True и False обрабатываются как переменные, но этим переменным не присвоены никакие значения. Поэтому они интерпретируются как 0.
echo $((true))
echo $((false))
В обоих случаях ты получишь 0. Получается так:
echo $((0 == 0))
Оба числа равны, возвращается истина, то есть та самая единица.
Ну например так:
true
TRUE=$?
false
FALSE=$?
if (( $TRUE == $FALSE )); then echo TRUE; else echo FALSE; fi
Теперь всё встало на свои места. Мы объявили переменные и задали им значения. А потом уже сравниваем СТАТУСЫ и не РАВЕНСТВО двух чисел.
Такие дела. Вроде безобидная штука, а на логику пиздец как влияет.
Поэтому всегда будь внимателен. И заранее проверяй такие штуки перед деплоем в продакшен. Хотя совет дурацкий, согласен. Проще раздеплоиться и потом уже на проде пофиксить. Бест практики ёпта!
Ладно, не болей, увидимся!
tags: #bash
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Возможно ты когда-нибудь замечал, что при вводе команды history, иногда рядом с командой отображается какая-то звездочка. Выглядит это примерно так:
Смущает? Неа! Но доебаться стоит, откуда она вообще взялась и что она означает. Не просто же так она там появилась.
Вводим в терминале:
Видим такое:
✔️ Делаем финт ушами:
1. Жмем в консоли
2. Вводим команду bashdays
3. Нажимаем стрелку вверх
4. Отображается предыдущая команда
5. Удаляем через backspace команду
6. Нажимаем стрелку вниз
7. Видим появилась строка bashdays
8. Выполняем
Видим что команда
Если backspace заменить и не стирать
Тут нагляднее получилось, видно, что реально было редактирование команды
Хуй знает как это можно применить, тут больше интерес к этой звездочке, что это такое и при каком кейсе она появляется в history.
А еще есть хак. Если нажать
Я проверил, воспроизвести не получилось. История команд обновляется, только после того как сессия закрыта.
В официальной документации по Bash по этому поводу есть лишь такое упоминание: Lines prefixed with a * have been modified. Скудненько.
Такие дела.
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
1990 htop
1991* ls -la
1992 uptime
Смущает? Неа! Но доебаться стоит, откуда она вообще взялась и что она означает. Не просто же так она там появилась.
Вводим в терминале:
gavno
free
bashdays
history
Видим такое:
1997 gavno
1998 free
1999 bashdays
2000 history
1. Жмем в консоли
ctrl+r2. Вводим команду bashdays
3. Нажимаем стрелку вверх
4. Отображается предыдущая команда
free5. Удаляем через backspace команду
free6. Нажимаем стрелку вниз
7. Видим появилась строка bashdays
8. Выполняем
history1997 gavno
1998*
1999 bashdays
2000 history
Видим что команда
free пропала и вместо нее появилась какая-то всратая звездочка. Это всё потому что мы отредактировали команду free через backspace. Если backspace заменить и не стирать
free, а добавить несколько букв: freezer, то выхлоп будет таким:1997 gavno
1998* freezer
1999 bashdays
2000 history
Тут нагляднее получилось, видно, что реально было редактирование команды
free.Хуй знает как это можно применить, тут больше интерес к этой звездочке, что это такое и при каком кейсе она появляется в history.
А еще есть хак. Если нажать
ctrl + r, ввести команду, которая помечена звездочкой, а затем нажать ctrl + shift + -. То редактирование откатится и звездочка пропадёт.Еще есть легенда, что звездочка может появляться при запуске команд из другого сеанса. То есть если открыть 2 терминала и в одном вводить команды, то в другом терминале в history эти команды будут со звездочками.
Я проверил, воспроизвести не получилось. История команд обновляется, только после того как сессия закрыта.
В официальной документации по Bash по этому поводу есть лишь такое упоминание: Lines prefixed with a * have been modified. Скудненько.
Такие дела.
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Алиасы штука удобная, со временем они становятся зоной комфорта, экономят время, особенно на локальной машине. Но как использовать готовые алиасы в своих bash скриптах?
Сегодня про это и поговорим. Смотри, есть у тебя алиас в .bashrc:
Тут понятно, вводим glist а оно по умолчанию интерпретируется как ls -la. А теперь напишем простой bash скрипт:
И вот незадача. Получаем ошибку: glist: command not found
Ну оно и ежу понятно. Алиасы тут никаким боком к скрипту не привязаны.
Команда alias по идее должна была вывести все алиасы, которые прописаны, но она этого не сделала.
И как быть?
Городить в самом скрипте всё необходимое? Ну можно и так, но есть способ изящнее.
Изменяем скрипт:
Добавился ключик -i, с помощью него мы запускаем оболочку bash в интерактивном режиме. Само собой подтягиваются всякие bashrc и т.п. как при обычно логине.
✔️ Теперь при запуске скрипта:
1. Выведется список всех алиасов
2. Выведется строка из echo
3. Отработает алиас glist == ls -la
Можно конечно еще и через
Если же нет возможности поправить скрипт, как вариант, прописываем в bashrc такую строчку:
Теперь даже без ключа -i функция glist будет работать в любом скрипте без вмешательства в него.
Короче везде свои нюансы. Но вообще как совет — не нужно привязываться к алиасам, если нужно сделать ls -la, так и пиши в скрипте, нахер эти спагетти, оставь их для ансибла.
Чем меньше привязок, тем меньше багов и стабильнее твой скрипт. Пусть он будет самодостаточный и независимый от всякой хуйни. Изучай.
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
Сегодня про это и поговорим. Смотри, есть у тебя алиас в .bashrc:
alias glist="ls -la"
Тут понятно, вводим glist а оно по умолчанию интерпретируется как ls -la. А теперь напишем простой bash скрипт:
#!/bin/bash
alias
echo "hello bashdays"
glist
И вот незадача. Получаем ошибку: glist: command not found
Ну оно и ежу понятно. Алиасы тут никаким боком к скрипту не привязаны.
Команда alias по идее должна была вывести все алиасы, которые прописаны, но она этого не сделала.
И как быть?
Городить в самом скрипте всё необходимое? Ну можно и так, но есть способ изящнее.
Изменяем скрипт:
#!/bin/bash -i
alias
echo "hello bashdays"
glist
Добавился ключик -i, с помощью него мы запускаем оболочку bash в интерактивном режиме. Само собой подтягиваются всякие bashrc и т.п. как при обычно логине.
1. Выведется список всех алиасов
2. Выведется строка из echo
3. Отработает алиас glist == ls -la
Можно конечно еще и через
source, shopt -s expand_aliases и прочие велосипеды подобное сделать, но через ключик -i более нативнее что-ли получается.Если же нет возможности поправить скрипт, как вариант, прописываем в bashrc такую строчку:
function glist () { command ls -la "$@"; }; export -f glistТеперь даже без ключа -i функция glist будет работать в любом скрипте без вмешательства в него.
Короче везде свои нюансы. Но вообще как совет — не нужно привязываться к алиасам, если нужно сделать ls -la, так и пиши в скрипте, нахер эти спагетти, оставь их для ансибла.
Чем меньше привязок, тем меньше багов и стабильнее твой скрипт. Пусть он будет самодостаточный и независимый от всякой хуйни. Изучай.
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Linux умер! Все из вас хоть раз в жизни запускали fork бомбу. Но если ты, тот единственный и неповторимый, то советую взять и прям сейчас это сделать. Это как впервые поссать в море.
Открывай консоль и запускай:
:(){ :|:& };:После запуска, перезагружай свой компьютер и продолжай читать этот пост.
Концепция, лежащая в основе форк-бомбы — процессы постоянно воспроизводят сами себя, потенциально вызывая отказ в обслуживании.
Ну да, похожа на язык брейнфака. Давай теперь эту непонятную строчку, сделаем более понятной.
forkbomb()
{
forkbomb | forkbomb &
};
forkbomb
Опа, теперь всё на своих местах. Все наглядно и прозрачно. Каждый экземпляр запускает два новых экземпляра и так до бесконечности.
От этой заразы можно защитится с помощью ulimit, ограничив количество запускаемых процессов. Делается так:
ulimit -u 30
Ну либо прописать эти ограничения
/etc/security/limits.conf* hard nproc 30
hard = максимальное количество процессов nproc
* = для всех пользователей равным 30
Жесткое ограничение позволяет зафиксировать лимиты, чтобы пользователи ненароком через ulimit их не сняли.
Еще был вопрос: а почему вместо | не использовать && ? Ну логично же, && выполняет команды последовательно. А вертикальная палка выполняет команды одновременно, при этом дескрипторы файлов перенаправляются в канал.
Вот бы с регулярками так, развернул их и наглядно стало понятно, что они делают и как. Но увы.
Ладно, чо, вроде пятница, а организм уже бунтует против субботнего рабочего дня. Ну ничего, зато потом 4 дня можно будет отдохнуть. Давай, увидимся!
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Как в 20 выглядеть на 40?
Правильно! Установить Linux!
Я всегда обходил стороной команду find, наверное потому что я никогда не умел ее готовить. Мне всегда было проще находить нужное в midnight commander.
Но для bash скриптов mc это не панацея, поэтому изредка приходилось гуглить про find и что-то лепить.
Сегодня затрём как раз про find. Но не за Базу, а за его скорость и бест-практики.
С помощью find мы ищем по разным паттернам и условиям. Порой необходимо совершить какие-то действия с найденными результатами. И find не может нас этим порадовать. Приходится передавать данные внешним утилитам.
У find есть пару опций:
exec = запускает утилиту и передает в неё аргументы
execdir = перед запуском утилиты, переходит в каталог с найденным
Синтаксис этих штук такой:
команда = утилита, которую запускаем
{} = развернется в найденные файлы
; = суффикс, на каждый файл запускается команда
+ = суффикс, команда запускается с группой файлов
Хорош с теорией, погнали в практику:
Эта команда будет искать обычные файлы в домашнем каталоге пользователя. Утилитой для обработки, у нас будет интерпретатор, который выведет на экран идентификатор процесса. Интерпретатор используем чисто в лабораторных целях.
По итогу на экран я получил 100500 строчек такого вида:
Это список процессов, которые были задействованы в результате поиска. Чёто прям дохуя. Если надоело ждать результата, жми CTRL+C.
✔️ А теперь давай оптимизируем!
По итогу я получаю одну цифру
Но что произошло? Ща объясню. В оптимизированном варианте, имена файлов разбиваются на максимально большие группы и затем передаются в утилиту. Вот в этом и есть разница.
Ведь, чтобы запустить внешнюю утилиту, нужно совершить кучу лишний телодвижений. Если запускать на каждый найденный файл отдельный процесс, то тратится куча ресурсов, причем зря. Естественно это прилично влияет на скорость.
Проще ведь сразу скормить утилите группу найденных файлов и никому не ебать мозги.
Стопэ. Это еще не всё, можно еще больше разогнать 👇
Включаем режим оверклоакинга!
Будем использовать утилиту xargs, она как раз входит в пакет с find. Утилита xargs запускает процессы параллельно. Уже понимаешь чо щас будет?
Xargs читает стандартный ввод и разбивает его на группы аргументов. А после этого запускает команду с данной группой аргументов.
По ключам:
0 = аргументы разделяются символами NUL ASCII. А спецсимволы косой черты
n = максимально количество аргументов переданных за один раз
P = максимально количество процессов запущенных одновременно. Если указать 0, запустится как можно больше таких процессов.
команда = внешняя команда которая будет запущена. Если ничего не указывать, на экран выведутся группы аргументов, удобная фича для отладки.
А еще если во время работы xargs, ей послать сигнал SIGUSR1 (kill), то количество одновременно запускаемых процессов будет увеличено. А для SIGUSR2, будет уменьшено.
Это базовая команда для правильной работы find + xargs:
Но учти, если command у тебя будет оболочкой sh/bash, тогда нужно правильно обработать аргументы и учесть всякие splitting, globbing и т.п.
Ладно чо. Всем хорошего отдыха и заебатых шашлычков. На 01.05 я возьму отгул, а там дальше уже всё по плану: за кишочки подергаем, да на страусе (strace) покатаемся. Будет охуенно!
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
Правильно! Установить Linux!
Я всегда обходил стороной команду find, наверное потому что я никогда не умел ее готовить. Мне всегда было проще находить нужное в midnight commander.
У меня кстати даже постов про find не было в этом канале.
Но для bash скриптов mc это не панацея, поэтому изредка приходилось гуглить про find и что-то лепить.
Сегодня затрём как раз про find. Но не за Базу, а за его скорость и бест-практики.
С помощью find мы ищем по разным паттернам и условиям. Порой необходимо совершить какие-то действия с найденными результатами. И find не может нас этим порадовать. Приходится передавать данные внешним утилитам.
У find есть пару опций:
exec = запускает утилиту и передает в неё аргументы
execdir = перед запуском утилиты, переходит в каталог с найденным
Синтаксис этих штук такой:
-exec команда {} суффикскоманда = утилита, которую запускаем
{} = развернется в найденные файлы
; = суффикс, на каждый файл запускается команда
+ = суффикс, команда запускается с группой файлов
Символ ; обязательно нужно экранировать либо поместить в кавычки.
Хорош с теорией, погнали в практику:
find ~/ -type f -exec sh -c 'echo $$' {} \;Эта команда будет искать обычные файлы в домашнем каталоге пользователя. Утилитой для обработки, у нас будет интерпретатор, который выведет на экран идентификатор процесса. Интерпретатор используем чисто в лабораторных целях.
По итогу на экран я получил 100500 строчек такого вида:
26719
26720
26721
Это список процессов, которые были задействованы в результате поиска. Чёто прям дохуя. Если надоело ждать результата, жми CTRL+C.
find ~/ -type f -exec sh -c 'echo $$' {} +По итогу я получаю одну цифру
27413, один идентификатор процесса, в отличие от предыдущего варианта. Круто? Да охуеть не встать!Но что произошло? Ща объясню. В оптимизированном варианте, имена файлов разбиваются на максимально большие группы и затем передаются в утилиту. Вот в этом и есть разница.
Ведь, чтобы запустить внешнюю утилиту, нужно совершить кучу лишний телодвижений. Если запускать на каждый найденный файл отдельный процесс, то тратится куча ресурсов, причем зря. Естественно это прилично влияет на скорость.
Проще ведь сразу скормить утилите группу найденных файлов и никому не ебать мозги.
Стопэ. Это еще не всё, можно еще больше разогнать 👇
Включаем режим оверклоакинга!
Будем использовать утилиту xargs, она как раз входит в пакет с find. Утилита xargs запускает процессы параллельно. Уже понимаешь чо щас будет?
find ~/ -type f -print0 | xargs -0 -n4 -P2 команда
Xargs читает стандартный ввод и разбивает его на группы аргументов. А после этого запускает команду с данной группой аргументов.
По ключам:
0 = аргументы разделяются символами NUL ASCII. А спецсимволы косой черты
\ и кавычками, воспринимаются как обычные.n = максимально количество аргументов переданных за один раз
P = максимально количество процессов запущенных одновременно. Если указать 0, запустится как можно больше таких процессов.
команда = внешняя команда которая будет запущена. Если ничего не указывать, на экран выведутся группы аргументов, удобная фича для отладки.
А еще если во время работы xargs, ей послать сигнал SIGUSR1 (kill), то количество одновременно запускаемых процессов будет увеличено. А для SIGUSR2, будет уменьшено.
SIGUSR1 и SIGUSR2 могут быть использованы программой для произвольных нужд, например для межпроцессной (или межпоточной) синхронизации, управления фоновыми процессами (демонами) и т. п. По умолчанию, сигналы SIGUSR1 и SIGUSR2 завершают выполнение процесса.
Это базовая команда для правильной работы find + xargs:
find -print0 | xargs -0 command
Но учти, если command у тебя будет оболочкой sh/bash, тогда нужно правильно обработать аргументы и учесть всякие splitting, globbing и т.п.
Ладно чо. Всем хорошего отдыха и заебатых шашлычков. На 01.05 я возьму отгул, а там дальше уже всё по плану: за кишочки подергаем, да на страусе (strace) покатаемся. Будет охуенно!
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет. Сегодня шифруем пиксели!
Если кратко, берем png картинку и шифруем ее с помощью парольной фразы.
Но самое главное, картинка останется в png формате и не превратится в какой-то бесполезный бинарник. А дальше её можно будет открыть и визуально посмотреть через любой просмотрщик файлов.
А поможет нам в этом старый и добрый ImageMagic
Для начала мне понадобится изображение, в котором я буду шифровать пиксели. Давай его сгенерим:
Эта команда создаст изображение bashdays.png с волшебником, который хуячит живопись. Выглядит это так: bashdays.png
Хорошо. Теперь нужно зашифровать это изображение. Выполняем команду:
Получаем файл hidden.png с пикселями. Файл прекрасно открывается, но волшебника мы уже не видим. Лишь какой-то цветной шум. Выглядит это так.
Шифрование делаем через опцию encipher, в качестве аргумента эта опция принимает имя файла с парольной фразой. Дефис после encipher означает - стандартный ввод, который в данном случае указывает на канал «|».
Ну и дешифровка:
Если проебал пароль или ввел неправильно, получишь тот же набор цветных пикселей. Пароль восстановить увы не получится. Так что запиши на бумажку и повесь на монитор, как в лучших практиках ИБ.
Еще есть прикол, что изображение можно зашифровать с помощью ключа, например другого изображения.
В этом примере, key.gif это ключ для шифрования. Без этого файла расшифровать изображение уже не получится. Заебись? Заебись!
✔️ А какие нюансы?
Да, они есть. Некоторые форматы изображений, не поддерживают зашифрованные пиксели, например jpeg или gif. Поэтому прежде чем что-то шифровать, проверь что это получится расшифровать.
ImageMagick зашифровывает только пиксели, метаданные изображения остаются нетронутыми и читабельными для любых пользователей. Поэтому если что-то скрываешь, подчищай метаданные.
Шифрование идет через AES в режиме счетчика. Первая половина парольной фразы это одноразовый номер, вторая половина это ключ шифрования.
Где можно применить?
Каждый сам решает зачем ему это нужно. Но знаю реальный случай, когда блекхэты публиковали в twitter подобные изображения.
Эти изображения можно было найти в поиске по-специальному тэгу. С помощью этих картинок, осуществлялась координация кибер-атак по всему миру.
По мне так, данный способ уматно использовать в каких-нибудь онлайн квестах, где нужно найти парольную фразу, а потом расшифровать изображение. Больше на ум (из легального) ничего и не приходит.
Изучай!
tags: #security
@ВАSНDАYS | BАSHDАYS.CОM
Если кратко, берем png картинку и шифруем ее с помощью парольной фразы.
Но самое главное, картинка останется в png формате и не превратится в какой-то бесполезный бинарник. А дальше её можно будет открыть и визуально посмотреть через любой просмотрщик файлов.
Правда в зашифрованном виде, но это не проблема если у тебя есть парольная фраза или файл-ключ.
А поможет нам в этом старый и добрый ImageMagic
Для начала мне понадобится изображение, в котором я буду шифровать пиксели. Давай его сгенерим:
convert wizard: bashdays.png
Эта команда создаст изображение bashdays.png с волшебником, который хуячит живопись. Выглядит это так: bashdays.png
Хорошо. Теперь нужно зашифровать это изображение. Выполняем команду:
echo 'пароль' | convert bashdays.png -encipher - -depth 8 png24:hidden.png
Получаем файл hidden.png с пикселями. Файл прекрасно открывается, но волшебника мы уже не видим. Лишь какой-то цветной шум. Выглядит это так.
Шифрование делаем через опцию encipher, в качестве аргумента эта опция принимает имя файла с парольной фразой. Дефис после encipher означает - стандартный ввод, который в данном случае указывает на канал «|».
Ну и дешифровка:
echo 'пароль' | convert hidden.png -decipher - restored.png
Если проебал пароль или ввел неправильно, получишь тот же набор цветных пикселей. Пароль восстановить увы не получится. Так что запиши на бумажку и повесь на монитор, как в лучших практиках ИБ.
Еще есть прикол, что изображение можно зашифровать с помощью ключа, например другого изображения.
convert bashdays.png -encipher key.gif result.png
В этом примере, key.gif это ключ для шифрования. Без этого файла расшифровать изображение уже не получится. Заебись? Заебись!
Да, они есть. Некоторые форматы изображений, не поддерживают зашифрованные пиксели, например jpeg или gif. Поэтому прежде чем что-то шифровать, проверь что это получится расшифровать.
ImageMagick зашифровывает только пиксели, метаданные изображения остаются нетронутыми и читабельными для любых пользователей. Поэтому если что-то скрываешь, подчищай метаданные.
Шифрование идет через AES в режиме счетчика. Первая половина парольной фразы это одноразовый номер, вторая половина это ключ шифрования.
Если далёк от криптографии, то забей хуй, работает да и ладно.
Где можно применить?
Каждый сам решает зачем ему это нужно. Но знаю реальный случай, когда блекхэты публиковали в twitter подобные изображения.
Эти изображения можно было найти в поиске по-специальному тэгу. С помощью этих картинок, осуществлялась координация кибер-атак по всему миру.
По мне так, данный способ уматно использовать в каких-нибудь онлайн квестах, где нужно найти парольную фразу, а потом расшифровать изображение. Больше на ум (из легального) ничего и не приходит.
Изучай!
tags: #security
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня про RANDOM и револьвер
В бородатые 2000е была такая консольная игруля «Русская рулетка», состояла она из одной строчки:
Для начала давай сделаем её более безопасной:
Суть такая: Если деление по модулю псевдослучайного числа переменной RANDOM вернёт - 0, значит тебе песда и пистолет выстрелил. Соответственно если > 0, то ты пока еще жив и тебе повезло.
А теперь давай посмотрим на условия, при которых «пистолет выстрелит» сразу.
Число отличное от 0, указанное в качестве переменной RANDOM используется как seed (семя) для генератора псевдослучайных чисел.
Если посеять число 2, то при первом обращении к переменной RANDOM получим значение, которое делится на 6 без остатка.
Этот посев даст нужное в разных версиях интерпретатора. Все дело в том, что в версии bash 5.1 были внесены изменения связанные с этим. Короче если у тебя версия баша > 5.0, то можно изменить поведение генератора с помощью переменной BASH_COMPAT.
Так, давай теперь это проверим:
Получаем значение: 20814
А тут уже другое: 20034
Если мы задаем 0 в переменную RANDOM, тогда семя (seed) инициализируется жестко заданным значением. При котором генерируется требуемое число, то есть делится на 6 без остатка.
Тут пистолет гарантированно выстрелит. Аналогично предыдущему примеру, если начало строки не число:
Снова получим 100% выстрел.
✔️ Как работает генератор:
- Начальное значение seed, оболочка получает совершая манипуляции над значениями pid, ppid, uid + текущие время (секунды, микросекунды).
- Далее полученное значение пропускается через алгоритм, а результат сохраняется. При следующих обращениях также пропускается через алгоритм.
- Потом полученное число усекается. В документации указано максимальное возможное значение 32367.
Как я писал выше, руки у нас развязаны и мы можем влиять на начальное значение генератора через переменную RANDOM.
Такие дела, исследуйте!
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
В бородатые 2000е была такая консольная игруля «Русская рулетка», состояла она из одной строчки:
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo "You live"
Для начала давай сделаем её более безопасной:
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'
Суть такая: Если деление по модулю псевдослучайного числа переменной RANDOM вернёт - 0, значит тебе песда и пистолет выстрелил. Соответственно если > 0, то ты пока еще жив и тебе повезло.
А теперь давай посмотрим на условия, при которых «пистолет выстрелит» сразу.
Число отличное от 0, указанное в качестве переменной RANDOM используется как seed (семя) для генератора псевдослучайных чисел.
Если посеять число 2, то при первом обращении к переменной RANDOM получим значение, которое делится на 6 без остатка.
RANDOM=2
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'
Этот посев даст нужное в разных версиях интерпретатора. Все дело в том, что в версии bash 5.1 были внесены изменения связанные с этим. Короче если у тебя версия баша > 5.0, то можно изменить поведение генератора с помощью переменной BASH_COMPAT.
Переменная BASH_COMPAT в оболочке Bash используется для указания совместимости с предыдущими версиями Bash. Если установить ее на определенное значение, это может изменить поведение Bash так, чтобы оно соответствовало определенной версии.
Например, если вы установите BASH_COMPAT=3.2, то это означает, что текущая оболочка Bash будет работать совместимо с версией 3.2. Это может быть полезно, если у вас есть скрипты, которые были написаны для старых версий Bash и вы хотите, чтобы они продолжали работать в новых версиях без изменений поведения.
Так, давай теперь это проверим:
( BASH_COMPAT=51 ; RANDOM=0 ; echo $RANDOM )
Получаем значение: 20814
( BASH_COMPAT=50 ; RANDOM=0 ; echo $RANDOM )
А тут уже другое: 20034
Если мы задаем 0 в переменную RANDOM, тогда семя (seed) инициализируется жестко заданным значением. При котором генерируется требуемое число, то есть делится на 6 без остатка.
RANDOM=0
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'
Тут пистолет гарантированно выстрелит. Аналогично предыдущему примеру, если начало строки не число:
RANDOM='bashdays'
[ $[ $RANDOM % 6 ] == 0 ] && echo 'You died' || echo 'You live'
Снова получим 100% выстрел.
- Начальное значение seed, оболочка получает совершая манипуляции над значениями pid, ppid, uid + текущие время (секунды, микросекунды).
- Далее полученное значение пропускается через алгоритм, а результат сохраняется. При следующих обращениях также пропускается через алгоритм.
- Потом полученное число усекается. В документации указано максимальное возможное значение 32367.
Как я писал выше, руки у нас развязаны и мы можем влиять на начальное значение генератора через переменную RANDOM.
Такие дела, исследуйте!
tags: #bash #linux
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
shopt -s extglob; : "${PS1@P}"; : "${_//$'\x01'+([^$'\x02'])$'\x02'}"; : "${#_}"; printf '%b' "\e#8\e[$(((LINES-1)/2));$(((COLUMNS-_)/2))H"tags: #bash
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет. Записал сегодня пилотный выпуск на ютубину, изредка буду заходить с подобным контентом. Над звуком еще поработаем, есть нюансы. Завтра отдельным постом продолжу эту тему, так сказать вывернем наизнанку.
Поддержи подпиской и лайком! Спасибо!👇
https://youtu.be/gTwpoAaB_dY
Поддержи подпиской и лайком! Спасибо!👇
https://youtu.be/gTwpoAaB_dY
YouTube
Как получить root на любом Linux сервере
Сегодня расскажу как пентестеры и черношляпы повышают привелегии на Linux машинах и получают root доступ. Без уязвимостей и эксплоитов.
Media is too big
VIEW IN TELEGRAM
Привет отдыхающим. Продолжим тему с повышением прав. Искать suid биты через find конечно мастхев, но есть пиздатый инструмент под названием LinPEAS.
Изобрел его некий пентестер - Карлсон (Carlson P), который держит проект HackTricks, возможно ты про него когда-нибудь слышал.
Короче штука написана на sh. Чувствуешь уровень? То есть будет работать хоть на чайнике.
При запуске LinPEAS сканирует Linux машину, на всякие дырки и криворукость админов.
Один из тестов, как раз показывает файлы с suid битами, которые можно использовать для повышения привилегий.
Скрипт заточен как раз под поиск всякой хуйни, которая может помочь злоумышленникам надругаться над твоим серваком.
Работает самодостаточно, не нужен root, ничего не пишет на диск, не требует каких-то библиотек, запустил и получил на экране отчет. Заплакал, сделал выводы, закрыл дырки/оставил как есть.
Запускается одной командой и не требует установки:
Но можно и через змеюку:
Поддерживает различные ключи запуска и всякие навороты, тут уже читай мануал. Мне обычно хватает запуска по дефолту.
Да, утилита раньше входила в состав Kali Linux, сейчас хз, не проверял, но скорее всего там и осталась.
Короче достойная пепяка! Рекомендую потыкать, по крайней мере на своих сервачках с пет проектами. Найдешь много интересного.
🌐 Страница проекта на github
tags: #linux #security #utils
@ВАSНDАYS | BАSHDАYS.CОM
LinPEAS - Linux Privilege Escalation Awesome Script
Изобрел его некий пентестер - Карлсон (Carlson P), который держит проект HackTricks, возможно ты про него когда-нибудь слышал.
Короче штука написана на sh. Чувствуешь уровень? То есть будет работать хоть на чайнике.
При запуске LinPEAS сканирует Linux машину, на всякие дырки и криворукость админов.
Один из тестов, как раз показывает файлы с suid битами, которые можно использовать для повышения привилегий.
Скрипт заточен как раз под поиск всякой хуйни, которая может помочь злоумышленникам надругаться над твоим серваком.
Работает самодостаточно, не нужен root, ничего не пишет на диск, не требует каких-то библиотек, запустил и получил на экране отчет. Заплакал, сделал выводы, закрыл дырки/оставил как есть.
Запускается одной командой и не требует установки:
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh
Но можно и через змеюку:
python -c "import urllib.request; urllib.request.urlretrieve('https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh', 'linpeas.sh')"
python3 -c "import urllib.request; urllib.request.urlretrieve('https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh', 'linpeas.sh')"Поддерживает различные ключи запуска и всякие навороты, тут уже читай мануал. Мне обычно хватает запуска по дефолту.
Да, утилита раньше входила в состав Kali Linux, сейчас хз, не проверял, но скорее всего там и осталась.
Короче достойная пепяка! Рекомендую потыкать, по крайней мере на своих сервачках с пет проектами. Найдешь много интересного.
tags: #linux #security #utils
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM
✨ Ты — caмый счaстливый чeловек нa плaнeте!
Почему? Потому, что сейчас узнаешь про ONLY.
Частенько возникала необходимость разрешить пользователю запускать только определенные команды по ssh. То есть явно указать ему белый список таких команд.
Городили мы конечно знатные велосипеды с помощью костылей, rbash, симлинков, chroot и т.п.
Все эти костыли были неудобные и какие-то пиздец сложно поддерживаемые. Но решение было найдено и вполне элегантное. Всё ужеукрадено придумано за нас.
Для затравки:
Думаю идею ты понял. Пользователь подключается по ssh и может выполнить только 3 команды rsync, ls, cat.
И тут большой плюс - пользователь не получает интерактивную оболочку, то есть всё сводится к выполнению подобной конструкции:
Команда ls находится в белом списке и успешно отработает при подключении по ssh, а дальше сессия завершится.
Нехер ему на сервере делать. Есть список команд, вот пусть ими и довольствуется без интерактива.
✔️ Теперь подробности
ONLY это НЕ какая-то встроенная команда в Linux, это Bash скрипт, который аккуратно лежит в
1. Берем only из репы
2. Кидаем его в
3. Ставим chmod +x чтобы запускался
4. Делаем пару ключей для работы
P = пустая парольная фраза
f = задаем имя ключа
Содержимое ключа only pub добавляем в authorized_keys нужному пользователю, а private key отдаем, тому кто будет подключаться к серверу.
Да, файл authorized_keys у меня выглядит примерно так:
То есть запрещаем всякую лишнюю хуйню. Ну и добавляем в белый список команды, которые будем позволять запускать этому пользователю.
Важная штука, потребуется файл с правилами, называется .onlyrules. Забирай тут.
Этот файл нужно также скопировать в папку, того пользователя, которого ограничиваем, например в
Правила нужны, чтобы еще сильнее ограничить пользователя на ввод команд, этакие лимиты на регулярках и sed.
Короче это фильтры на аргументы, ключи и т.п. Можно не заморачиваться и просто обернуть нужные команды между
Все файлы из этого поста можешь взять в нашей репе. А историю создания этой пепяки и мельчайшие подробности, можешь почитать тут кстати очень занятно чтиво, правда на английском, да и похер.
Лично мне эта штука понравилась, раздал тестировщикам ключики, теперь они сами могут своих вонючих демонов перезапускать, без блуждания по серверу и фраз — да блядь, я что-то нажал и всё сломалось!
Такие дела. Увидимся!
tags: #bash #linux #utils
@ВАSНDАYS | BАSHDАYS.CОM
Почему? Потому, что сейчас узнаешь про ONLY.
Частенько возникала необходимость разрешить пользователю запускать только определенные команды по ssh. То есть явно указать ему белый список таких команд.
Городили мы конечно знатные велосипеды с помощью костылей, rbash, симлинков, chroot и т.п.
Кстати про chroot писал в этом посте, почитай на досуге, мож где применишь.
Все эти костыли были неудобные и какие-то пиздец сложно поддерживаемые. Но решение было найдено и вполне элегантное. Всё уже
Для затравки:
/home/user/.ssh/authorized_keys command="only rsync ls cat" ssh-rsa AAAAB3Nza
Думаю идею ты понял. Пользователь подключается по ssh и может выполнить только 3 команды rsync, ls, cat.
И тут большой плюс - пользователь не получает интерактивную оболочку, то есть всё сводится к выполнению подобной конструкции:
ssh [email protected] ls /home/user/
Команда ls находится в белом списке и успешно отработает при подключении по ssh, а дальше сессия завершится.
Нехер ему на сервере делать. Есть список команд, вот пусть ими и довольствуется без интерактива.
ONLY это НЕ какая-то встроенная команда в Linux, это Bash скрипт, который аккуратно лежит в
/usr/local/sbin, положить его туда ты должен самостоятельно.1. Берем only из репы
2. Кидаем его в
/usr/local/sbin/only3. Ставим chmod +x чтобы запускался
4. Делаем пару ключей для работы
ssh-keygen -P "" -f only
P = пустая парольная фраза
f = задаем имя ключа
Содержимое ключа only pub добавляем в authorized_keys нужному пользователю, а private key отдаем, тому кто будет подключаться к серверу.
Да, файл authorized_keys у меня выглядит примерно так:
command="only rsync cat ls", no-agent-forwarding, no-port-forwarding, no-pty, no-user-rc, no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA
То есть запрещаем всякую лишнюю хуйню. Ну и добавляем в белый список команды, которые будем позволять запускать этому пользователю.
Важная штука, потребуется файл с правилами, называется .onlyrules. Забирай тут.
Этот файл нужно также скопировать в папку, того пользователя, которого ограничиваем, например в
/home/user/.onlyrulesПравила нужны, чтобы еще сильнее ограничить пользователя на ввод команд, этакие лимиты на регулярках и sed.
\:^ls$:{p;q}
\:^who$:{p;q}Короче это фильтры на аргументы, ключи и т.п. Можно не заморачиваться и просто обернуть нужные команды между
\:^ и $:{p;q}.Бонусом, в папке пользователя можешь разместить файл .onlyrc и затюнить всякие информационные сообщения. Но автор не рекомендует этого делать и использовать only без этого файла.
Все файлы из этого поста можешь взять в нашей репе. А историю создания этой пепяки и мельчайшие подробности, можешь почитать тут кстати очень занятно чтиво, правда на английском, да и похер.
Лично мне эта штука понравилась, раздал тестировщикам ключики, теперь они сами могут своих вонючих демонов перезапускать, без блуждания по серверу и фраз — да блядь, я что-то нажал и всё сломалось!
Такие дела. Увидимся!
tags: #bash #linux #utils
@ВАSНDАYS | BАSHDАYS.CОM
Please open Telegram to view this post
VIEW IN TELEGRAM