Статья Deep Exploit - Fully Automatic Pentest [Машинное обучение]

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

1529609303959.png


Машинное обучение — класс методов искусственного интеллекта, характерной чертой которых является не прямое решение задачи, а обучение в процессе применения решений множества сходных задач. Для построения таких методов используются средства математической статистики, численных методов, методов оптимизации, теории вероятностей, теории графов, различные техники работы с данными в цифровой форме.
Установку всех компонентов я буду производить на Kali Linux 2018.2 Full Update.

Deep Exploit - Полностью автоматический инструмент для проведения тестов на проникновение с использованием машинного обучения.

1529609336232.png


Он имеет два режима эксплуатации.
  • Интеллектуальный режим
Deep Exploit - идентифицирует статус всех открытых портов на целевом сервере и пытается подобрать эксплойты с помощью Machine Learning и базы эксплойтов Metasploit.
  • Режим грубой силы
Deep Exploit - выполняет множество действий, используя все комбинации «Exploit module», «Target» и «Payload» в Metasploit, соответствующие указанному названию сервиса, его версии продукта и номеру порта, на котором он размещен.
Основные функции Deep Exploit:
  • Самообучение.
Deep Exploit – может научится эффективному само применению. Используется reinforcement learning.
Обучение с подкреплением (reinforcement learning) — один из способов машинного обучения, в ходе которого испытуемая система (агент) обучается, взаимодействуя с некоторой средой. С точки зрения кибернетики, является одним из видов кибернетического эксперимента.
Не нуждается в том, чтобы человек подготавливал учебные данные.
  • Эффективное применение эксплоитов.
Deep Exploit - применяет эксплойты к цели на основе полученных в ходе своей работы данных.
  • Глубокое исследование цели и пост эксплуатация.
Если DeepExploit успешно использует эксплойт на целевом сервере, он дополнительно пытается применить его на других обнаруженных внутренних серверах.
  • Очень простое использование.
Единственное, что от вас требуется – ввести одну команду.
  • Очень быстрый процесс обучения.
Как правило, обучение занимает много времени. Но, подход Deep Exploit использует распределенное обучение на нескольких агентах.
К тому же используется усовершенствованная модель машинного обучения под названием A3C.
Способности «Deep Exploit».
  • Разведка и сбор данных.
  • Моделирование угроз.
  • Анализ уязвимостей.
  • Эксплуатация.
  • Пост-эксплуатация.
  • Составление отчетов.
Преимущества использования:
  • Для тестировщика на проникновение – возможность значительно повысить эффективность тестирования. Чем больше тестировщик использует DeepExploit, тем быстрее происходит его обучение, впоследствии, влияющее на качество и точность теста.
  • Для сотрудника информационной безопасности – возможность быстро выявлять уязвимости собственных серверов.
Поскольку методы атак на серверы развиваются изо дня в день, нет никакой гарантии, что вчерашние меры безопасности являются актуальными сегодня. Необходимо быстро найти уязвимости и принять контрмеры. DeepExploit внесет значительный вклад в обеспечение вашей безопасности.

Структура системы:

1529609382839.png


Deep Exploit - состоит из модели машинного обучения (A3C) и Metasploit.
A3C применяет эксплойты на целевые серверы через RPC API.
A3C – разработан Keras и Tensorflow, который является известной платформой ML на основе Python.
Он используется для самостоятельного изучения возможностей эксплойта, используя reinforcement learning. Результат самообучения хранится в так называемых, выученных данных, которые можно повторно использовать.
Metasploit - самый известный инструмент тестирования на проникновения в мире. Он используется для применения эксплоитов на целевых серверах на основе полученных инструкций от A3C.

Структура работы Deep Exploit в Интеллектуальном режиме:

1529609417318.png


Шаг 1. Сканирование портов на тренировочных серверах.

Deep Exploit собирает информацию, такую как тип ОС, номера открытых портов, версия ядра и так далее.
После сканирования портов он выполняет две команды Metasploit (hosts и services) через RPC API.
  • Результат выполнения команды – hosts.
Hosts
=====

address mac name os_name os_flavor os_sp purpose info
------- --- ---- ------- --------- ----- ------- ---- --------
192.168.0.108 00:0c:29:16:3a:ce Linux 2.6.X server


Deep Exploit определяет тип ОС, используя регулярное выражение из результата команды hosts.
В приведенном выше примере Deep Exploit определяет тип ОС как Linux.
  • Результат выполнения команды – services.
Services
========

host port proto info
---- ---- ----- ----
192.168.0.108 21 tcp vsftpd 2.3.4
192.168.0.108 22 tcp OpenSSH 4.7p1 Debian 8ubuntu1 protocol 2.0
192.168.0.108 23 tcp Linux telnetd.


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

Шаг 2. Обучение.

1529609671772.png


Deep Exploit учится эксплуатации уязвимостей с помощью использования современной модели машинного обучения под названием A3C.

A3C состоит из множества нейронных сетей.

Нейронные сети берут информацию из тренировочного сервера, собранную на шаге 1, как исходную, и на основе анализа, пытаются подобрать подходящую полезную нагрузку.
A3C применяет ее на тренировочном сервере с помощью Metasploit. В соответствии с результатом, (успехом / неудачей) применения эксплойта, A3C обновляет размер нейронной сети (параметр, относящийся к точности атаки). Выполняя описанную выше обработку (обучение) с комбинацией ввода различных исходных данных, постепенно определяется оптимальная полезная нагрузка для сервера.
Чтобы сократить время обучения, мы выполняем эту обработку в несколько потоков.
В качестве тренировочных серверов рекомендуется, как пример, использовать следующие:
  • metasploitable2
  • metasploitable3
Шаг 3. Тестирование.

Deep Exploit выполняет эксплойт на тестовом сервере, используя полученный результат из предыдущего шага.
На этом этапе используется точечное применение эксплойта (минимум 1 попытка).

Шаг 4. Пост-эксплуатация.

Если Deep Exploit, успешно применил эксплойт к тестовому серверу, и оказался внутри системы, он тут же, пробует провести атаки на внутренние сервера, если таковые сможет обнаружить.

Шаг 5. Создание отчета.

DeepExploit создает отчет, в котором суммируются уязвимости.
Тип отчета - html.

Режим Грубой Силы:

1529609761538.png


Шаг 1. Получение названий продуктов/сервисов

Deep Exploit получает эти данные от пользователя, названия разделяются знаком «@».

Пример:

Код:
wordpress@joomla@drupal@tikiwiki

Указанное имя продукта должно распознано командой поиска Metasploit.

Шаг 2. Эксплуатация.

Deep Exploit использует эксплоит-модули, информацию о цели, полезные нагрузки Metasploit, соответствующие указанным продуктам, и тщательно проверяет всевозможные их комбинации.

Шаг 3. Пост-эксплуатация.

Если Deep Exploit, успешно применил эксплойт к тестовому серверу, и оказался внутри системы, он тут же, пробует провести атаки на внутренние сервера, если таковые сможет обнаружить.

Шаг 4. Создание отчета.

DeepExploit создает отчет, в котором суммируются уязвимости.
Тип отчета – html.

Anaconda, Keras, TensorFlow.

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

Итак, как я уже упоминал в начале, я использую систему: Kali Linux 2018.2 Full Update.
Потому, эта инструкция актуальна, я полагаю и для аналогичных ей ОС.

Anaconda:

1529609896449.png



Для начала нам необходимо установить Python дистрибутив Anaconda, с первых минут использования, я проникся к нему нежностью, очень крутая штука.

Anaconda — это дистрибутив Python и R вместе с основными библиотеками для анализа данных и пакетным менеджером conda. С помощью последнего удобно устанавливать и удалять пакеты. Также сильным достоинством является установка без компилирования из исходного кода, что значительно ее ускоряет по сравнению с pip.

Conda - менеджер пакетов питона, позволяет устанавливать уже скомпилированные пакеты (может работать и в режиме компиляции пакетов перед установкой). Также Conda - менеджер окружений системы, позволяет создавать окружения с разными версиями чего угодно (библиотеки C, низкоуровневые библиотеки и т.д.).

Conda бывает в двух версиях:
  • Анаконда - более 150 предустановленных пакетов (около 3 Гб) + более 250 пакетов, готовых к установке командой conda install package_name
  • Миниконда - более 400 пакетов, готовых к установке командой conda install package_name
Скачиваем ее с официального сайта и устанавливаем.

Код:
wget https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh
chmod +x Anaconda3-5.2.0-Linux-x86_64.sh
./ Anaconda3-5.2.0-Linux-x86_64.sh

1529610007975.png


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

Теперь важный момент, нам необходимо установить версию python 3.6 как версию по умолчанию, именно ту, что установила Anaconda, перечитываем конфигурационный файл, и убеждаемся, что все работает.

Код:
source .bashrc

1529610041802.png


Если версия Python осталась неизменной, то в .bashrc добавляем переменную окружения:
  • #added be Anaconda3 installer
  • export PATH=”/root/anaconda3/bin:$PATH”
1529610067216.png


Tensorflow:

1529610083878.png

TensorFlow – это нейронная сеть, которая учится решать задачи путем позитивного усиления и обрабатывает данные на различных уровнях (узлах), что помогает находить верный результат.
Открыв исходный код библиотеки машинного обучения TensorFlow, в Google упростили процесс построения и развертывания сложных нейронных сетей. TensorFlow не предоставляет каждому разработчику возможность воспользоваться плодами машинного обучения, но предлагает интерфейсы API для языков Python и C/C++, позволяющие подключаться к программе разработчика.

Установка Tensorflow:

Производя установку на Kali Linux, пользователь, возможно, столкнется с такой проблемой:

Код:
conda install tensorflow

1529610133975.png


Это решается установкой вручную всех пакетов и зависимостей, выполняем следующую команду, чтобы получить информацию о необходимых зависимостях и установить их вручную, используя conda:

Код:
conda info tensorflow

1529610162875.png


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

Код:
conda install _tflow_180_select

1529610193202.png


После установки всех зависимостей, можно установить сам TensorFlow:

Код:
conda install tensorflow

1529610226142.png


По окончании, проверяем версию и работоспособность:

Код:
python -c "import tensorflow; print(tensorflow.__version__)"

1529610259037.png


Keras:

1529610301949.png



Keras — открытая нейросетевая библиотека, написанная на языке Python. Она представляет собой надстройку над фреймворками Deeplearning4j, TensorFlow и Theano. Нацелена она на оперативную работу с сетями глубинного обучения, при этом спроектирована так, чтобы быть компактной, модульной и расширяемой.

Keras - устанавливается из файла с зависимостями Deep Exploit, и к этому мы вернемся чуть позже.

Установка Deep Exploit:

Код:
git clone https://github.com/13o-bbr-bbq/machine_learning_security
cd machine_learning_security/DeepExploit

Установка зависимостей, TensorFlow можно исключить из файла, закомментировав.

Код:
pip install –r requirements.txt

После успешной установки всех зависимостей убедимся в работоспособности Keras и Tensorflow.

1529610375556.png


И отредактируем файл /etc/proxychains.conf следующим образом:

1529610392214.png


Настраиваем Keras для работы с TensorFlow, в домашней директории находим папку .keras и правим файл keras.json.

Код:
nano keras.json

1529610421169.png


Следующим этапом будет инициализация базы Metasploit на удаленном сервере (В локальной сети была поднята виртуальная машина с Kali Linux) и запуск msfconsole там же:

Код:
msfdb init
msfconsole

Поднимаем там RPC-сервер:

Удалённый вызов процедур, реже Вызов удалённых процедур ( Remote Procedure Call, RPC) — класс технологий, позволяющих компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удалённых компьютерах). Обычно реализация RPC-технологии включает в себя два компонента: сетевой протокол для обмена в режиме клиент-сервер и язык сериализации объектов (или структур, для необъектных RPC).

Код:
msf> load msgrpc ServerHost=192.168.0.108 ServerPort=55553 User=test Pass=test1234

1529610491440.png


В папке с Deep Exploit редактируем файл config.ini:

Код:
nano config.ini

1529610520388.png


Меняем, так как показано на скриншоте, это данные удаленного сервера с поднятым Metasploit и RPC, это нужно для успешной связки с Deep Exploit.

На этом подготовка почти закончена, не хватает тренировочного сервера, я взял Metasploitable2 и поднял его в своей локальной сети.

В общем, структура выглядит так:

1529610550665.png


Запускаем Deep Exploit в тренировочном интеллектуальном режиме против Metasploitable2.

Код:
python DeepExploit.py -t 192.168.0.109 -m train

1529610580323.png


Остается немного подождать, поглядывая на консоль Metasploit на удаленном сервере, где спустя некоторое время начинают появляться результаты:

1529610592552.png


После, того, как Deep Exploit закончил свою работу, нужно ознакомиться с отчетом, который, он заботливо для нас создал:

1529610604635.png


Я все-таки надеялся на просмотр отчета в формате html, но видимо это или недоработка, или я что-то упустил из виду при настройке (да, упустил, об этом в следующей статье), но отчеты мне удалось найти только в формате CSV, разбитые на несколько файлов.

Исходная информация от автора находится здесь - 13o-bbr-bbq/machine_learning_security

Там можно найти несколько видео, и инструкцию по работе в режиме Грубой Силы.

Спасибо за внимание. Специально для Codeby.net
 

Vander

CodebyTeam
Gold Team
16.01.2016
1 420
4 353
BIT
2
Я ж не знаю в какой ты системе, погугли там, все такое))
 
T

The ROOT

2008R2 без обновлений уже года 2)
И подскажите ещё, он у вас то же перебирал всю базу (10000) эксплойтов?

Как уже сказали это в самом начале так, когда обучится, будет уже бить точечно

pip install –r requirements.txt
Invalid requirement: '–r'
Traceback (most recent call last):
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py", line 93, in __init__
req = REQUIREMENT.parseString(requirement_string)
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1632, in parseString
raise exc
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1622, in parseString
loc, tokens = self._parse( instring, 0 )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1379, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 3395, in parseImpl
loc, exprtokens = e._parse( instring, loc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1379, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 3717, in parseImpl
return self.expr._parse( instring, loc, doActions, callPreParse=False )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1379, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 3378, in parseImpl
loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1383, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 2689, in parseImpl
raise ParseException(instring, loc, self.errmsg, self)
pip._vendor.pyparsing.ParseException: Expected W:(abcd...) (at char 0), (line:1, col:1)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/anaconda3/lib/python3.6/site-packages/pip/_internal/req/req_install.py", line 252, in from_line
req = Requirement(req)
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py", line 97, in __init__
requirement_string[e.loc:e.loc + 8]))
pip._vendor.packaging.requirements.InvalidRequirement: Invalid requirement, parse error at "'–r'"


может не вникнул... жара. Подскажите что не так
Обнови PIP до последней версии и перезагрузись
Код:
pip install --upgrade pip
reboot

Потом установи зависимости
Код:
pip install -r /root/machine_learning_security/DeepExploit/requirements.txt

И всё должно заработать
██████████████████████████████████
У меня другой вопрос, почему сервер разрывает соединение? Дня 3 назад ставил, всё работало хорошо, сегодня накатил на чистый Kali Linux Xfce 2018.2 и начались проблемы
1530652506062.png
 

u7u

Green Team
13.09.2017
77
32
BIT
0
pip install –r requirements.txt
Invalid requirement: '–r'
Traceback (most recent call last):
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py", line 93, in __init__
req = REQUIREMENT.parseString(requirement_string)
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1632, in parseString
raise exc
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1622, in parseString
loc, tokens = self._parse( instring, 0 )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1379, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 3395, in parseImpl
loc, exprtokens = e._parse( instring, loc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1379, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 3717, in parseImpl
return self.expr._parse( instring, loc, doActions, callPreParse=False )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1379, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 3378, in parseImpl
loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1383, in _parseNoCache
loc,tokens = self.parseImpl( instring, preloc, doActions )
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 2689, in parseImpl
raise ParseException(instring, loc, self.errmsg, self)
pip._vendor.pyparsing.ParseException: Expected W:(abcd...) (at char 0), (line:1, col:1)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/anaconda3/lib/python3.6/site-packages/pip/_internal/req/req_install.py", line 252, in from_line
req = Requirement(req)
File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py", line 97, in __init__
requirement_string[e.loc:e.loc + 8]))
pip._vendor.packaging.requirements.InvalidRequirement: Invalid requirement, parse error at "'–r'"


может не вникнул... жара. Подскажите что не так
Как сказал ранее жара... проблема невнимательности с моей стороны. При копипасте часто возникает проблема с дифисом...
"pip install r requirements.txt" ставим короткий -
всем добра

Была ещё ошибка: distributed 1.21.8 requires msgpack, which is not installed.
доставил вручную: pip install msgpack
Не сочтите за флуд, токма пользы ради.
 

woolf1514

Green Team
06.03.2017
181
191
BIT
4
Я все-таки надеялся на просмотр отчета в формате html, но видимо это или недоработка, или я что-то упустил из виду при настройке (да, упустил, об этом в следующей статье)

В чем в итоге загвоздка? В том, что БД для метасплоита надо готовить так, как в следующей статье?
 

woolf1514

Green Team
06.03.2017
181
191
BIT
4
Deep Exploit достаточно умный для того, чтоб в msf запустить слушателя, или это надо предварительно сделать самому?))
 

Iskus

Green Team
13.11.2017
287
468
BIT
0
  • #added be Anaconda3 installer

  • export PATH=”/root/anaconda3/bin:$PATH”
У кого не Kali, они от своего юзера ставят, в .bashrc добавляйте
Bash:
#added be Anaconda3 installer
export PATH=$HOME/anaconda3/bin:$PATH

А вообще вот ман из 4 частей по установке
там посложнее и софта побольше.

Код:
pip install –r requirements.txt
Invalid requirement: '–r'
Traceback (most recent call last):
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py", line 93, in __init__
    req = REQUIREMENT.parseString(requirement_string)
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1632, in parseString
    raise exc
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1622, in parseString
    loc, tokens = self._parse( instring, 0 )
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1379, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 3395, in parseImpl
    loc, exprtokens = e._parse( instring, loc, doActions )
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1379, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 3717, in parseImpl
    return self.expr._parse( instring, loc, doActions, callPreParse=False )
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1379, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 3378, in parseImpl
    loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 1383, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/pyparsing.py", line 2689, in parseImpl
    raise ParseException(instring, loc, self.errmsg, self)
pip._vendor.pyparsing.ParseException: Expected W:(abcd...) (at char 0), (line:1, col:1)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_internal/req/req_install.py", line 252, in from_line
    req = Requirement(req)
  File "/root/anaconda3/lib/python3.6/site-packages/pip/_vendor/packaging/requirements.py", line 97, in __init__
    requirement_string[e.loc:e.loc + 8]))
pip._vendor.packaging.requirements.InvalidRequirement: Invalid requirement, parse error at "'–r'"
может не вникнул... жара. Подскажите что не так
-r и –r разные вещи, удали дефис перед r и поставь минус))
 

RNR

Member
03.02.2019
12
0
BIT
0
Хочу извиниться за глупый вопрос, можно продробнее про этап добавления переменной в .bashrc?
 

RNR

Member
03.02.2019
12
0
BIT
0
Верно ?
 

Вложения

  • Снимок экрана от 2019-02-05 11-29-51.png
    Снимок экрана от 2019-02-05 11-29-51.png
    206,3 КБ · Просмотры: 374

RNR

Member
03.02.2019
12
0
BIT
0
И вот что в итоге, где я ошибся ?
 

Вложения

  • Снимок экрана от 2019-02-05 11-41-46.png
    Снимок экрана от 2019-02-05 11-41-46.png
    260,4 КБ · Просмотры: 257
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!