Преминете към съдържанието

МЕУ организира кампания за пентестове в държавната администрация

Целта на кампанията е да подобри киберсигурността в държавната администрация, като участието в нея е доброволно и не се обвързва с възнаграждение.
Прочети повече за програмата

Добре дошли в Хакинг.БГ! 

Всеки един от нас стои на раменете на гигантите, споделили знанията и опита си с нас.

Този форум е нашият начин да върнем жеста за бъдещите и текущите кадри в киберсигурността.

Стремим се да предоставим платформа, където членовете могат да развиват своите умения, като се дава приоритет на етиката, сигурността и поверителността!

Баш Скриптинг - Фундаменти


Препоръчан пост


  • Група:  [Администратор]
  • Последователи:  15
  • Брой мнения:  135
  • Репутация:   87
  • Спечелени дни:  37
  • Регистриран на:  11.04.2023
  • Статус:  Оффлайн
  • Система/OS::  Windows

Това са малко фундаменти в баш скриптинга.

Баш скриптинга представлява текстов файл, който съдържа команди, които се екзекутират сякаш са били написани в терминала ръчно.

Имат файлово разширение .sh . 

Следното е 'hello world' баш скрипт:

kali@kali:~$ cat hello-world.sh

#!/bin/bash

# Hello World Bash Script

echo "hello world!"

Нека го анализираме... На първа линия започваме с #! - това е известно под формата на 'shebang' (wiki) и се игнорира от баш интерпретатора. /bin/bash е абсолютния път към интерпретатора, който се използва да екзекутира скрипта.

Втората линия започва с хаштаг, което кара скрипта да игнорира всичко след него на същият ред - коментар.

третата линия използва командата 'еко', която принтира на терминалния екран последвалия стринг 'хело уърълд'.

За да пуснем скрипта трябва да го направим във формат за екзекутиране:

chmod +x hello-world.sh

./hello-world.sh

chmod - change mode 

./ - текущата директория и името на файла, понеже скрипта вероятно не се намира в path environment, затова използваме релативния път.

Променливи

Променливите са имена, които използваме, за да държим някаква информация в тях. Подобно на псевдонимите в терминала.

Можем да ги декларираме директно в терминала, но декларираните променливи са безполезни, ако не можем да ги 'викаме':

kali@kali$ ip=1.1.1.1
kali@kali$ echo $ip
1.1.1.1

Добрата практира повелява да създаваме променливи с описателни имена, които да ни дават ясна представа в кода за какво се използват.

Баш интерпретира някои символи и букви по определен начин, например:

kali@kali$ city=Stara Zagora

Горния пример е проблемен, защото неправилно декларираме стойностите на променливата. Защо? - Защото има пространство, което кара баш да интерпретира 'Загора', като втора команда, а не като част от стойността на променливата.

Правилното деклариране на тази променлива би било следното:

kali@kali$ city="Stara Zagora"

или

kali@kali$ city='Stara Zagora'

В баш има разлика между " и ' . Интерпретират се по различен начин и се използват в различни случаи.

Всичко в ' ' се интерпретира буквално. Всичко в " " се интерпретира буквално освен $ ` \ 

Например:

kali@kali:~$ city='Stara Zagora'
kali@kali:~$ echo $city
Stara Zagora

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

kali@kali:~$ city='Stara Zagora'
kali@kali:~$ echo $city
Stara Zagora
kali@kali:~$ city2="Nova $city"
kali@kali:~$ echo $city2
Nova Stara Zagora

Можем също да зададем стойността на променливата от резултата на команда или програма, това се нарича command substitution или в буквален превод заместване на команда. Например:

kali@kali:~$ user=$(whoami)

В горното запазваме аутпута на командата 'whoami' в променливата 'user'.

kali@kali:~$ user=$(whoami)
kali@kali:~$ echo $user
kali

За заместване на команда можем да използваме и обратен тик символ ` , но реално е стар метод, и не се насърчава в днешно време използването му по този начин, поради разлики в начина по който двата метода за заместване на команди се държат.

kali@kali:~$ user=`whoami`
kali@kali:~$ echo $user
kali

Като допълнителна информация: заместването на команди се случва в така наречения 'съб-шел' или 'подобвивка' и промяната на променливите се случва именно в този съб-шел, което НЕ променя променливите в главния (мастър) процес. Например:

Shell scripts run in their own subshell

Shell скриптовете се изпълняват в подобвивка (по подразбиране).
Защо? Защото, когато стартирате скрипт, той работи в своя собствен шел, дъщерен на главния. Тъй като този шел произхожда от друг (където задавате променливата и където изпълнявате скрипта), тя се нарича съб-шел.

Shell скриптът не можа да види стойността на променливата, защото беше локална променлива,
и не беше известно на новосъздадената обвивка. Ако искате променливата да бъде достъпна от нейните подобвивки, ще трябва да използвате командата за експортиране и да я превърнете в глобална променлива.

----

Както и да е, темата за събшеловете е интересна и полезна - повече информация можете да откриете в този блог пост.

Аргументи

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

В линукс терминала почти всяка команда си има аргументи. Например:

image.png.fc781e6e6f8de0dd7a5f7906fb757352.png

Горе изпълняваме командата 'ls' - всички последващи символи и букви се наричат аргументи (-l -a .).

При баш скриптинга не е по-различно. Например:

image.png.00a16e7a58531d253c87dff53726338b.png

$1 и $2 са първия и втория аргумент, които са дадени на скрипта, като аргументи. Също забелязваме използването на наклонена черта наобратно - използваме я, за да кажем на интерпретатора, че последвалия символ (:) трябва да се интерпретира буквално, а не като код.

image.png.495e606fb56f43cad4eebd8972e3b565.png

Има доста разновидности на специални баш променливи, които трябва да се научат в последствие, като например:

image.png.6614045e6864fad5f7fe198152a69cee.png

Това визуализира изходния статус на последния процес в бинарен вид. Следващия пример генерира неочаквана (рандом) стойност.

image.png.06210520e53e658f6d41dbc1169b03a8.png

Описание на някои от специалните променливи:
$0 Името на файла на текущия скрипт.
$1-$9 Съхранява имената на първите 9 аргумента или може да се използва като позиции на аргументите.
$$ ID на процеса на текущия шел.
$# Броят на аргументите, предоставени на скрипта.
$* Съхранява всички аргументи на командния ред, като ги обединява.
$@ Съхранява списъка с аргументи като масив.
$? Указва състоянието на изход на последната команда или най-скорошния процес на изпълнение.
$! Показва идентификатора на последната команда във фонов режим.
$- Показва набора от опции, използван в текущия bash shell.

И други интересни, които ще откриете в последствие сами.

Прихващане на User Input

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

Например:

image.png.4d66911154d841228b851aa709febbfc.png

image.png.c4cd3b31b9716306ca021b3818410589.png

В горния скрипт, това което написахме се запамети в променливата 'answer'.

Ако искаме да пишем креденции поради някаква причина, бихме искали те да не са видими на терминала можем да използваме -p декларира промпт, а -s (silent):

image.png.af0f27804b0ade857d9fdeeab5fcf318.png

image.png.d0770a1193101037d3acdaaebbf86e78.png

IF / ELSE Statements

Тези стейтмънти се използват, като условия. Например следния код:

if [ <някакъв тест> ]
then
  <нещо се случва>
fi

 В случая можем да разберем следното: Ако теста върне статус 'вярно' (1) или 'true', тогава скрипта ще извърши действието описано между 'then' и 'fi'.

Нека видим по-конкретен пример:

image.png.7451268bf3f69ea7e30787b9ef65c9da.png

-lt може да се подразбере, че е аргумент 'less than', тоест $аge < 16. Следователно ако променливата дадена от юзър инпут-а е по-малко от 16, ще се екзекутира еко командата между then и fi.

image.png.ff82b92030a80b4d831a10d817135b7a.png

До тук разбрахме какво се случва ако има статус '1' в резултат на условието. Можем да напишем код, който да реагира и ако имаме статус '0' от резултата на условието.

image.png.b86029a4b08a4a0d824f8dee019a0cdb.png

image.png.c100a7b6f27dc894c4f3f491c6f48ac9.png

Можем да 'нестваме'  иф-ове, ако искаме да има повече от 1 условие, използвайки elif:

image.png.99977f815afb2b57b9acfea3d632b637.png

image.png.cdb403e519fdf45e71a9e0489dc277be.png

Булеви (boolean) логически операции

Тук Аватара ще ме бие ако кажа някоя глупост, затова ще се придържам към най-фундаменталните концепции 😜

Оператор Действие
== равно
!= различно
> по-голямо
< по-малко
>= по-голямо или равно
<= по-малко или равно

 

Тип на данните Логически израз Резултат
(int) Целочислен 5 == (7 – 2) true
(int) Целочислен 5 != (2 + 2) true
(int) Целочислен 5 > (2 + 3) false
(int) Целочислен 5 >= (2 + 3) true
(double) С плаваща запетая 5.0 > Math.PI true
(double) С плаваща запетая 5.5 == (11 / 2) false *
(string) Символен низ "Alpha" == "Alpha" true **

Логическите оператори приемат булеви стойности и връщат булев резултат. Изглежда първоначално странно и сложно, но е наистина елементарно, когато видите концепцията.

Първо нека анализираме операторите, които ще използваме в терминала.

Логически оператор Стилизиран запис Наименование
&& AND И
|| OR ИЛИ
! NOT Логическо отрицание
^ XOR Изключващо ИЛИ

Следната таблица по която да се ориентирате е таблица на вярността.

А Б А && Б А || Б А^ Б
true true false true true false
true false false false true true
false true true false true true
false false true false false false

За да попълните ръчно тази таблица и да разберете логиката на това, което следва трябва да разберете следните принципи. 0 = невярно или няма сигнал, 1 = вярно или има сигнал. Таблицата се попълва, докато се изчерпат вариантите на възможните комбинации от стойностите на А и Б.

A B
0 0
0 1
1 0
1 1

След това трябва да оцените всеки от изразите за всеки ред от таблицата на истината, като използвате стойностите на A и B за този ред. Например за първия ред, където A=0 и B=0, бихте изчислили изразите, както следва:

A B !A !B A && B A || B A ^ B
0 0 1 1 0 0 0

Повторяме този процес за всичките четири реда на таблицата на истината, като попълните стойностите на изразите за всеки ред:

A B !A !B A && B A || B A ^ B
0 0 1 1 0 0 0
0 1 1 0 0 1 1
1 0 0 1 0 1 1
1 1 0 0 1 1 0

Честито, току що разбрахте как работи компютърната система. Да се върнем на темата обаче. След като разбрахме комбинациите и коя с коя води до какъв резултат, нека погледнем в терминала как това има значение:

 1 и 1 = 1

image.png.288844e1630c2437a80d392ea6daab9d.png

0 и 1 = 0

image.png.6b7a16e2b7769123226a04378e3fc52f.png

1 или 1 = 1

image.png.68ede08f64844f0ab6a7c6dc83721a5a.png

В баш скриптинг може да се представи по следния начин:

image.png.5bec1f8c050aa202b92ece63f036c398.png

image.png.7f4a7642abdae46943bdd836ed14961c.png

Loops - Цикли

For цикли са добре известни, би трябвало да сте ги разбрали досега, но ако не сте - фор циклите се използват, за да се изпълни даден сет от команди за всеки един елемент в списък, файл, листа итн. Това е най-често използвания цикъл в баш, защото е лесно да се пишат oneliner-и с него.

for <variable name> in <list>
do
  <action to perform>
done

например за променлива ip в списък с поредни номера между 1 и 10, направи echo на 1.1.1.1-10 и когато приключи, излез.

image.png.d8e067914b88b9295195c9fcbd9aaeaf.png

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

While циклите са малко по-различни:

while <some boolean test>
do
  <action to perform>
done

image.png.3ca8ff412282df1b613854ce1665625a.png

имаме брояч (cnt), който започва от 1 и цикъл, който гледа дали брояча е по-малък от 10. Ако е по-малък, значин има 'вярно' условие, следователно ще екзекутира кода между do и done. Виждаме също, че добавяме +1 бройка за всяко минаване през цикъла, за да увеличим бройката му с 1 и така до 10.

image.png.1d6403e67ad342ee6767d1c9fec87038.png

Важно е да се отбележи, че стига до 9, а не до 10, защото 10 не е по-малко от 10, следователно не екзекутира кода между do и done.

Функции

Функциите са нещо, като скрипт в скрипта. Това е удобно, когато искаме да екзекутираме същия код много пъти. Вместо да преписваме същия код отново и отново, можем да го напишем веднъж като функция и да я викаме, когато ни е нужна.

function function_name
   {
команди...
}

image.png.032ef8cb9f2f3f1312af928545da3131.png

image.png.7944de63aa69eb84d869a115b4e0998c.png

Имаме функция, която сме написали. После я викаме в края на кода с името й "print_me" и се екзекутира кода между { }

Можем да даваме променливи като инпут за функциите, за да ги използват от кода в { }.

image.png.caf512be1ddb9964b1c20add67b3696c.png

image.png.4335a14c23c78b4edab96b39cf000999.png

Спомняте ли си специалните баш символи от по-рано?

$? - Указва състоянието на изход на последната команда или най-скорошния процес на изпълнение:

image.png.7ac0e30e384f1b110e23e2c118f050da.png

image.png.d9b1ea230311db44ec0601af40ead251.png

Можем да използваме функциите, за да променяме променливи, които са извън функцията, която викаме. Например:

image.png.8a10da2483768cea2ca643d337b33d1a.png

image.png.c3c698798320a7305e9b444176fb3d89.png

Първо направихме две глобални променливи (глобалните са за целия код), после създадохме функцията, която извлича юзър инпут и го фийдва в променливите, след това при екзекуция на този скрипт виждаме, че се екзекутира първото echo, което показва първоначалните стойности преди промените да са настъпили, после идват промените зададени от юзъра и отново echo но този път с новите промени.

Няма да давам пример, но по същата логика може да има функция, която има вътрешни/ локални променливи например:

func () {
	local color="red"
}

image.png.fe1260e83e95ebbd680fcf687eb98703.png

image.png.8fee82050044c4d35a279669db4e79a4.png

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

Link to comment
Сподели другаде

Join the conversation

Можете да публикувате сега и да се регистрирате по-късно. If you have an account, sign in now to post with your account.

Гост
Отговори на тази тема

×   Поставено като форматиран текст.   Вместо това поставете като обикновен текст

  Разрешени са само 75 емотикони.

×   Вашата връзка е вградена автоматично.   Вместо това се показва като връзка

×   Вашето предишно съдържание е възстановено.   Изчистване на редактора

×   Не можете да качите директно снимка. Качете или добавете изображението от линк (URL)

  • Регистрирайте се

    Регистрирайте се за да използвате пълната функционалност на форума 🙂

HACKING.BG Партньори

transparent1.png.c15979e1dc997cdd3a9941e342368a9b.png2.png.3e2592eadc660ecc831f1fdd569e8eb4.pngLogonobackground.thumb.png.546f31037e975b6fd85c69e35f300db6.png600_489534840.png.72981fb02b90f1986dd7ade4d561e6d0.pngcyberclub-logo-text.png.6e9d11752e2eade43d40337d83365e48.png

×
×
  • Създай ново...

Важна информация!

Политика за сигурност и условия на ползване Privacy Policy