Nous écrivons un proxy socks5 inverse en PowerShell. Partie 1.

Une histoire de recherche et de dĂ©veloppement en 3 parties. Partie 1 — recherche.
Il y a beaucoup de livres — il y a encore plus d'avantages.

Définition du problÚme

Lors de la rĂ©alisation de tests de pĂ©nĂ©tration et de campagnes RedTeam, il n'est pas toujours possible d'utiliser les outils standards des clients, tels que VPN, RDP, Citrix, etc., comme point d'accĂšs au rĂ©seau interne. Dans certains cas, le VPN standard fonctionne avec MFA et utilise un token matĂ©riel comme second facteur, dans d'autres, il est fortement surveillĂ© et notre accĂšs via VPN devient immĂ©diatement visible, pour ainsi dire — avec toutes les consĂ©quences qui en dĂ©coulent, et dans certains cas, de tels moyens sont tout simplement absents.

Dans de tels cas, il est souvent nĂ©cessaire de crĂ©er ce que l'on appelle des « tunnels inversĂ©s » — des connexions du rĂ©seau interne vers un ressource externe ou un serveur que nous contrĂŽlons. À l'intĂ©rieur de ce tunnel, nous pouvons dĂ©jĂ  travailler avec les ressources internes des clients.

Il existe plusieurs types de tels tunnels inversés. Le plus connu d'entre eux est bien sûr Meterpreter. Les tunnels SSH avec redirection de port inverse sont également trÚs demandés dans les masses de hackers. Il existe de nombreux moyens de réaliser le tunneling inverse, et beaucoup d'entre eux sont bien étudiés et documentés.
Bien entendu, les développeurs de solutions de sécurité ne restent pas les bras croisés et détectent activement de telles actions.
Par exemple, les sessions MSF sont efficacement dĂ©tectĂ©es par les IPS modernes de Cisco ou Positive Tech, et un tunnel SSH inversĂ© peut ĂȘtre dĂ©tectĂ© par pratiquement n'importe quel pare-feu normal.

Par consĂ©quent, pour rester inaperçu dans une bonne campagne RedTeam — nous devons construire un tunnel inversĂ© avec des moyens non conventionnels et nous adapter au mieux au mode de travail rĂ©el du rĂ©seau.

Essayons de trouver ou d'inventer quelque chose de similaire.

Avant d'inventer quoi que ce soit, il est nécessaire de comprendre quel résultat nous voulons atteindre, quelles fonctions notre développement doit remplir. Quelles seront les exigences du tunnel pour que nous puissions travailler dans un mode de maximum de discrétion ?

Il est évident que ces exigences peuvent varier considérablement d'un cas à l'autre, mais d'aprÚs l'expérience, on peut en dégager quelques-unes principales :

  • fonctionnement sur Windows 7-10. Étant donnĂ© que Windows est utilisĂ© dans la plupart des rĂ©seaux d'entreprise.
  • Le client se connecte au serveur via SSL pour Ă©viter l'Ă©coute passive par des moyens IPS.
  • Lors de la connexion, le client doit ĂȘtre capable de travailler Ă  travers un serveur proxy avec authentification, car dans de nombreuses entreprises, l'accĂšs Ă  Internet se fait via un proxy. En rĂ©alitĂ©, la machine cliente peut mĂȘme ne rien savoir, le proxy Ă©tant utilisĂ© en mode transparent. Mais cette fonctionnalitĂ© doit ĂȘtre intĂ©grĂ©e.
  • La partie cliente doit ĂȘtre concise et portable.
    Il est clair que pour fonctionner au sein du rĂ©seau du Client, on peut installer OpenVPN sur la machine cliente et Ă©tablir un tunnel complet vers son serveur (d'autant plus que les clients OpenVPN savent travailler Ă  travers des proxy). Cependant, d'une part, cela ne sera pas toujours possible car nous ne sommes pas nĂ©cessairement des administrateurs locaux, et d'autre part, cela crĂ©era tellement de bruit qu'un systĂšme SIEM ou HIPS de qualitĂ© nous signalera immĂ©diatement. IdĂ©alement, notre client devrait ĂȘtre ce qu'on appelle une commande en ligne, comme c'est le cas pour beaucoup de shells bash, et s'exĂ©cuter via la ligne de commande, par exemple en exĂ©cutant des commandes Ă  partir d'un macro Word.
  • Notre tunnel doit ĂȘtre multithreadĂ© et supporter plusieurs connexions simultanĂ©ment.
  • La connexion client-serveur doit avoir une forme d'authentification, afin que le tunnel ne soit Ă©tabli que pour notre client et non pour tous ceux qui viendraient sur notre serveur Ă  l'adresse et au port spĂ©cifiĂ©s. IdĂ©alement, pour les « utilisateurs externes », une page de destination avec des animaux mignons ou un contenu professionnel en rapport avec le domaine d'origine devrait s'ouvrir.
    Par exemple, si le Client est une organisation médicale, lorsque l'administrateur de la sécurité des informations cherche à vérifier la ressource à laquelle un employé de la clinique a accédé, une page avec des produits pharmaceutiques, un article Wikipedia décrivant le diagnostic ou un blog du docteur Komarovsky devrait s'ouvrir, etc.

Analyse des outils existants

Avant d'inventer notre propre vélo, il est nécessaire d'analyser les vélos existants et de comprendre si cela nous est vraiment nécessaire, et il est probable que nous ne soyons pas les seuls à envisager la nécessité d'un tel vélo fonctionnel.

Une recherche sur Internet (nous recherchons apparemment normalement), ainsi qu'une recherche sur GitHub avec les mots-clĂ©s « reverse socks » n'a pas donnĂ© beaucoup de rĂ©sultats. En gros, tout se rĂ©sume Ă  la crĂ©ation de tunnels SSH avec redirection de ports inversĂ©e et tout ce qui y est liĂ©. En plus des tunnels SSH, plusieurs solutions peuvent ĂȘtre mises en avant :

github.com/klsecservices/rpivot
Une ancienne implementation du tunnel inversĂ© par l'Ă©quipe de Kaspersky Lab. Le nom indique clairement l'objectif de ce script. RĂ©alisĂ© en Python 2.7, le tunnel fonctionne en mode cleartext (comme on aime Ă  dire aujourd'hui — salut Ă  la RKN)

github.com/tonyseek/rsocks
Une autre implementation en Python, Ă©galement en cleartext, mais avec plus de fonctionnalitĂ©s. Écrit sous forme de module et il existe une API pour intĂ©grer la solution dans vos projets.

github.com/llkat/rsockstun
github.com/mis-team/rsockstun
Le premier lien est la version originale de l'implémentation de reverse socks en Golang (non maintenue par le développeur).
Le deuxiĂšme lien est notre amĂ©lioration avec des fonctionnalitĂ©s supplĂ©mentaires, Ă©galement en Golang. Dans notre version, nous avons intĂ©grĂ© SSL, un fonctionnement via proxy avec authentification NTLM, une authentification cĂŽtĂ© client, une page de destination en cas de mot de passe incorrect (plutĂŽt un redirection vers la page de destination), un mode multi-threadĂ© (c'est-Ă -dire que plusieurs personnes peuvent utiliser le tunnel en mĂȘme temps), un systĂšme de ping du client pour vĂ©rifier s'il est vivant ou non.

github.com/jun7th/tsocks
Une implĂ©mentation de reverse socks de nos « amis chinois » en Python. Pour les paresseux et les « immortels », un binaire prĂȘt Ă  l'emploi (exe), assemblĂ© par les Chinois et prĂȘt Ă  l'utilisation, est Ă©galement disponible. Ici, seul un dieu chinois sait ce que ce binaire peut contenir d'autre en plus de la fonctionnalitĂ© principale, alors utilisez-le Ă  vos risques et pĂ©rils.

github.com/securesocketfunneling/ssf
Un projet plutÎt intéressant en C++ pour l'implémentation de reverse socks et plus encore. En plus du tunnel inversé, il peut faire du transfert de ports, créer un shell commandé, etc.

MSF meterpreter
Ici, comme on dit, sans commentaire. Tous les hackers un peu cultivés connaissent parfaitement cet outil et comprennent à quel point il est facile à détecter par les systÚmes de sécurité.

Tous les outils décrits ci-dessus fonctionnent sur une technologie similaire : un module binaire exécutable préparé à l'avance est lancé sur la machine au sein du réseau, établissant une connexion avec un serveur externe. Un serveur SOCKS4/5 est ensuite lancé sur le serveur, acceptant les connexions et les transmettant au client.

Le principal inconvĂ©nient de tous ces outils est que soit Python ou Golang doit ĂȘtre installĂ© sur la machine cliente (Ă  quelle frĂ©quence avez-vous rencontrĂ© Python installĂ© sur les machines, par exemple, d'un directeur ou d'un employĂ© de bureau ?), soit il faut transporter un binaire dĂ©jĂ  compilĂ© sur cette machine (en fait, python et le script dans un seul fichier) et exĂ©cuter ce binaire lĂ -bas. TĂ©lĂ©charger un exe puis le lancer constitue Ă©galement une signature pour l'antivirus local ou le HIPS.

En gros, la conclusion s'impose d'elle-mĂȘme : nous avons besoin d'une solution en PowerShell. À ce moment-lĂ , on va nous jeter des tomates — parce que PowerShell est dĂ©jĂ  usĂ©, surveillĂ©, bloquĂ©, etc. En rĂ©alitĂ©, ce n'est pas le cas partout. Nous affirmons cela avec responsabilitĂ©. D'ailleurs, il existe une multitude de moyens pour contourner les blocages (ici encore une phrase Ă  la mode sur le salut au RKN 🙂 ), allant de la simple renommage de powershell.exe en cmdd.exe jusqu'Ă  powerdll, etc.

Commençons à inventer

Évidemment, nous allons d'abord consulter Google et
 ne trouver absolument rien sur ce sujet (si quelqu'un a trouvĂ© quelque chose, envoyez les liens dans les commentaires). Il n'y a que implĂ©mentation Socks5 en PowerShell, mais c'est un SOCKS « direct » classique, avec un certain nombre de ses inconvĂ©nients (nous en parlerons plus tard). Bien sĂ»r, on peut le transformer en inverse d'un simple geste, mais cela ne donnera qu'un SOCKS Ă  un seul thread, ce qui n'est pas tout Ă  fait ce qu'il nous faut.

Donc, nous n'avons rien trouvĂ© de prĂȘt Ă  l'emploi, nous allons devoir inventer notre propre vĂ©lo. Pour la base de notre vĂ©lo, nous allons prendre notre dĂ©veloppement d'un SOCKS inverse en Golang, et nous rĂ©aliserons le client pour cela en PowerShell.

RSocksTun
Alors, comment fonctionne rsockstun ?

Au cƓur du fonctionnement de RsocksTun (dĂ©sormais dans le texte — rs) se trouvent deux composants logiciels : Yamux et le serveur Socks5. Le serveur Socks5 est un SOCKS5 local classique, il est lancĂ© sur le client. Le multiplexage des connexions vers celui-ci (rappelez-vous la multithreading ?) est assurĂ© grĂące Ă  yamux (yet another multiplexer). Ce schĂ©ma permet de lancer plusieurs serveurs socks5 clients et de distribuer les connexions externes Ă  ceux-ci, en les acheminant Ă  travers une seule connexion TCP (presque comme dans meterpreter) du client au serveur, rĂ©alisant ainsi un mode multithread, sans lequel nous ne pourrions tout simplement pas fonctionner pleinement dans le rĂ©seau interne.

Le principe de fonctionnement de yamux rĂ©side dans le fait qu'il introduit un niveau de rĂ©seau supplĂ©mentaire de flux, le rĂ©alisant sous la forme d'un en-tĂȘte de 12 octets pour chaque paquet. (Ici, nous utilisons intentionnellement le mot « flux », et non « stream », pour ne pas confondre le lecteur avec le concept de « thread » — ce terme sera Ă©galement utilisĂ© dans cet article). L'en-tĂȘte yamux contient le numĂ©ro de flux, des indicateurs pour Ă©tablir/terminer le flux, la quantitĂ© d'octets transmis, et la taille de la fenĂȘtre de transmission.

Nous écrivons un proxy socks5 inverse en PowerShell. Partie 1.

En plus de l'Ă©tablissement/termination du flux, yamux a mis en Ɠuvre un mĂ©canisme keepalive, permettant de suivre l'Ă©tat du canal de communication Ă©tabli. Le fonctionnement du mĂ©canisme de messages keepalive est configurĂ© lors de la crĂ©ation de la session Yamux. En fait, il n'y a que deux paramĂštres dans les rĂ©glages : activer/dĂ©sactiver et la frĂ©quence d'envoi des paquets en secondes. Les messages keepalive peuvent ĂȘtre envoyĂ©s soit par le serveur yamux, soit par le client yamux. Lors de la rĂ©ception d'un message keepalive, la partie distante est tenue d'y rĂ©pondre avec l'envoi d'un identifiant de message exactement identique (en fait, un nombre) Ă  celui qu'elle a reçu. En gros, un keepalive — c'est comme un ping, mais pour yamux.

Tous les détails du fonctionnement du multiplexeur : types de paquets, indicateurs d'établissement et de terminaison des connexions, mécanisme de transmission des données sont décrits dans la spécification le yamux.

Conclusion de la premiĂšre partie

Ainsi, dans la premiĂšre partie de l'article, nous avons dĂ©couvert quelques outils pour organiser des tunnels inversĂ©s, examinĂ© leurs avantages et inconvĂ©nients, Ă©tudiĂ© le mĂ©canisme de fonctionnement du multiplexeur Yamux et dĂ©crit les exigences principales pour le nouveau module powershell Ă  crĂ©er. Dans la prochaine partie, nous nous attacherons Ă  dĂ©velopper le module lui-mĂȘme, pratiquement, depuis le dĂ©but. La suite suit. Restez connectĂ©s 🙂

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster