deepce, web_service_finder: cacti, small fixes
This commit is contained in:
		
							parent
							
								
									7cd75f1022
								
							
						
					
					
						commit
						c3212ad115
					
				
							
								
								
									
										107
									
								
								deepce.sh
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										107
									
								
								deepce.sh
									
									
									
									
									
								
							| @ -57,14 +57,14 @@ Usage: ${0##*/} [OPTIONS...] | |||||||
| 
 | 
 | ||||||
|   --install              Install useful packages before running script, this will maximise enumeration and exploitation potential |   --install              Install useful packages before running script, this will maximise enumeration and exploitation potential | ||||||
| 
 | 
 | ||||||
|   -doc, --delete-on-complete Script will delete itself on completion |   -doc, --delete         Script will delete itself on completion | ||||||
| 
 | 
 | ||||||
|   ${DG}[Exploits]$NC |   ${DG}[Exploits]$NC | ||||||
|   -e, --exploit          Use one of the following exploits (eg. -e SOCK) |   -e, --exploit          Use one of the following exploits (eg. -e SOCK) | ||||||
| 
 | 
 | ||||||
|     DOCKER         use docker command to create new contains and mount root partition to priv esc |     DOCKER               use docker command to create new contains and mount root partition to priv esc | ||||||
|     PRIVILEGED     exploit a container with privileged mode to run commands on the host |     PRIVILEGED           exploit a container with privileged mode to run commands on the host | ||||||
|     SOCK           use an exposed docker sock to create a new container and mount root partition to priv esc |     SOCK                 use an exposed docker sock to create a new container and mount root partition to priv esc | ||||||
|     CVE-2019-5746 |     CVE-2019-5746 | ||||||
|     CVE-2019-5021 |     CVE-2019-5021 | ||||||
| 
 | 
 | ||||||
| @ -119,12 +119,14 @@ See ${UNDERLINED}https://stealthcopter.github.io/deepce/guides/docker-group.md${ | |||||||
| TIP_DOCKER_CMD="If we have permission to create new docker containers we can mount the host's root partition and chroot into it and execute commands on the host OS." | TIP_DOCKER_CMD="If we have permission to create new docker containers we can mount the host's root partition and chroot into it and execute commands on the host OS." | ||||||
| TIP_PRIVILEGED_MODE="The container appears to be running in privilege mode, we should be able to access the raw disks and mount the hosts root partition in order to gain code execution. | TIP_PRIVILEGED_MODE="The container appears to be running in privilege mode, we should be able to access the raw disks and mount the hosts root partition in order to gain code execution. | ||||||
| See ${UNDERLINED}https://stealthcopter.github.io/deepce/guides/docker-privileged.md${NC}" | See ${UNDERLINED}https://stealthcopter.github.io/deepce/guides/docker-privileged.md${NC}" | ||||||
|  | TIP_DOCKER_ROOTLESS="In rootless mode privilege escalation to root will not be possible." | ||||||
| 
 | 
 | ||||||
| TIP_CVE_2019_5021="Alpine linux version 3.3.x-3.5.x accidentally allow users to login as root with a blank password, if we have command execution in the container we can become root using su root" | TIP_CVE_2019_5021="Alpine linux version 3.3.x-3.5.x accidentally allow users to login as root with a blank password, if we have command execution in the container we can become root using su root" | ||||||
| TIP_CVE_2019_13139="Docker versions before 18.09.4 are vulnerable to a command execution vulnerability when parsing URLs" | TIP_CVE_2019_13139="Docker versions before 18.09.4 are vulnerable to a command execution vulnerability when parsing URLs" | ||||||
| TIP_CVE_2019_5736="Docker versions before 18.09.2 are vulnerable to a container escape by overwriting the runC binary" | TIP_CVE_2019_5736="Docker versions before 18.09.2 are vulnerable to a container escape by overwriting the runC binary" | ||||||
| 
 | 
 | ||||||
| DANGEROUS_GROUPS="docker\|lxd\|root\|sudo\|wheel" | DANGEROUS_GROUPS="docker\|lxd\|root\|sudo\|wheel" | ||||||
|  | DANGEROUS_CAPABILITIES="cap_sys_admin\|cap_sys_ptrace\|cap_sys_module\|dac_read_search\|dac_override" | ||||||
| 
 | 
 | ||||||
| CONTAINER_CMDS="docker lxc rkt kubectl podman" | CONTAINER_CMDS="docker lxc rkt kubectl podman" | ||||||
| USEFUL_CMDS="curl wget gcc nc netcat ncat jq nslookup host hostname dig python python2 python3 nmap" | USEFUL_CMDS="curl wget gcc nc netcat ncat jq nslookup host hostname dig python python2 python3 nmap" | ||||||
| @ -136,7 +138,7 @@ USEFUL_CMDS="curl wget gcc nc netcat ncat jq nslookup host hostname dig python p | |||||||
| # Convert version numbers into a regular number so we can do simple comparisons (use floats because sh can interpret 0 prefix numbers incorrectly otherwise). | # Convert version numbers into a regular number so we can do simple comparisons (use floats because sh can interpret 0 prefix numbers incorrectly otherwise). | ||||||
| # shellcheck disable=SC2046 | # shellcheck disable=SC2046 | ||||||
| # shellcheck disable=SC2183 # word splitting here is on purpose | # shellcheck disable=SC2183 # word splitting here is on purpose | ||||||
| ver() { printf "%03.0f%03.0f%03.0f" $(echo "$1" | tr '.' ' '); } | ver() { printf "%03.0f%03.0f%03.0f" $(echo "$1" | tr '.' ' ' | cut -d '-' -f1); } | ||||||
| 
 | 
 | ||||||
| ########################################### | ########################################### | ||||||
| #--------------) Printing (---------------# | #--------------) Printing (---------------# | ||||||
| @ -272,7 +274,7 @@ installPackages() { | |||||||
|         return |         return | ||||||
|     fi |     fi | ||||||
| 
 | 
 | ||||||
|     if apt install --no-install-recommends --force-yes -y dnsutils curl nmap iputils-ping >/dev/null 2>&1; then |     if apt install --no-install-recommends --force-yes -y dnsutils curl nmap iputils-ping libcap2-bin >/dev/null 2>&1; then | ||||||
|         printSuccess "Success" |         printSuccess "Success" | ||||||
|     else |     else | ||||||
|         printError "Failed" |         printError "Failed" | ||||||
| @ -280,13 +282,13 @@ installPackages() { | |||||||
| 
 | 
 | ||||||
|   elif [ -x "$(command -v apk)" ]; then |   elif [ -x "$(command -v apk)" ]; then | ||||||
|     # Alpine |     # Alpine | ||||||
|     apk add bind-tools curl nmap |     apk add bind-tools curl nmap libcap | ||||||
|   elif [ -x "$(command -v yum)" ]; then |   elif [ -x "$(command -v yum)" ]; then | ||||||
|     # CentOS / Fedora |     # CentOS / Fedora | ||||||
|     yum install bind-utils curl nmap |     yum install bind-utils curl nmap libcap | ||||||
|   elif [ -x "$(command -v apt-get)" ]; then |   elif [ -x "$(command -v apt-get)" ]; then | ||||||
|     # Old Debian |     # Old Debian | ||||||
|     apt-get install -y dnsutils curl nmap |     apt-get install -y dnsutils curl nmap inetutils-ping libcap2-bin | ||||||
|   fi |   fi | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -389,40 +391,38 @@ dockerSockCheck() { | |||||||
|   if [ "$dockerSockPath" ]; then |   if [ "$dockerSockPath" ]; then | ||||||
| 
 | 
 | ||||||
|     printInfo "$(ls -lah $dockerSockPath)" |     printInfo "$(ls -lah $dockerSockPath)" | ||||||
|     nl |  | ||||||
| 
 | 
 | ||||||
|     # Is docker sock writable |     # Is docker sock writable | ||||||
|     printQuestion "Sock is writable ........" |     printQuestion "Sock is writable ........" | ||||||
|     if test -r "$dockerSockPath"; then |     if test -r "$dockerSockPath"; then | ||||||
|       printYesEx |       printYesEx | ||||||
|       printTip "$TIP_WRITABLE_SOCK" |       printTip "$TIP_WRITABLE_SOCK" | ||||||
|  |       if [ -x "$(command -v curl)" ]; then | ||||||
|  |         sockInfoCmd="curl -s --unix-socket $dockerSockPath http://localhost/info" | ||||||
|  |         sockInfoRepsonse="$($sockInfoCmd)" | ||||||
|  | 
 | ||||||
|  |         printTip "To see full info from the docker sock output run the following" | ||||||
|  |         printStatus "$sockInfoCmd" | ||||||
|  |         nl | ||||||
|  | 
 | ||||||
|  |         # Docker version unknown lets get it from the sock | ||||||
|  |         if [ -z "$dockerVersion" ]; then | ||||||
|  |           # IF jq... | ||||||
|  |           #dockerVersion=`$sockInfoCmd | jq -r '.ServerVersion'` | ||||||
|  |           dockerVersion=$(echo "$sockInfoRepsonse" | tr ',' '\n' | grep 'ServerVersion' | cut -d'"' -f 4) | ||||||
|  |         fi | ||||||
|  | 
 | ||||||
|  |         # Get info from sock | ||||||
|  |         info=$(echo "$sockInfoRepsonse" | tr ',' '\n' | grep "$GREP_SOCK_INFOS" | grep -v "$GREP_SOCK_INFOS_IGNORE" | tr -d '"') | ||||||
|  | 
 | ||||||
|  |         printInfo "$info" | ||||||
|  |       else | ||||||
|  |         printError "Could not interact with the docker sock, as curl is not installed" | ||||||
|  |         printInstallAdvice "curl" | ||||||
|  |       fi | ||||||
|     else |     else | ||||||
|       printNo |       printNo | ||||||
|     fi |     fi | ||||||
| 
 |  | ||||||
|     if [ -x "$(command -v curl)" ]; then |  | ||||||
|       sockInfoCmd="curl -s --unix-socket $dockerSockPath http://localhost/info" |  | ||||||
|       sockInfoRepsonse="$($sockInfoCmd)" |  | ||||||
| 
 |  | ||||||
|       printTip "To see full info from the docker sock output run the following" |  | ||||||
|       printStatus "$sockInfoCmd" |  | ||||||
|       nl |  | ||||||
| 
 |  | ||||||
|       # Docker version unknown lets get it from the sock |  | ||||||
|       if [ -z "$dockerVersion" ]; then |  | ||||||
|         # IF jq... |  | ||||||
|         #dockerVersion=`$sockInfoCmd | jq -r '.ServerVersion'` |  | ||||||
|         dockerVersion=$(echo "$sockInfoRepsonse" | tr ',' '\n' | grep 'ServerVersion' | cut -d'"' -f 4) |  | ||||||
|       fi |  | ||||||
| 
 |  | ||||||
|       # Get info from sock |  | ||||||
|       info=$(echo "$sockInfoRepsonse" | tr ',' '\n' | grep "$GREP_SOCK_INFOS" | grep -v "$GREP_SOCK_INFOS_IGNORE" | tr -d '"') |  | ||||||
| 
 |  | ||||||
|       printInfo "$info" |  | ||||||
|     else |  | ||||||
|       printError "Could not interact with the docker sock, as curl is not installed" |  | ||||||
|       printInstallAdvice "curl" |  | ||||||
|     fi |  | ||||||
|   fi |   fi | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -432,6 +432,7 @@ enumerateContainer() { | |||||||
|   containerName |   containerName | ||||||
|   containerIPs |   containerIPs | ||||||
|   getContainerInformation |   getContainerInformation | ||||||
|  |   containerCapabilities | ||||||
|   containerServices |   containerServices | ||||||
|   containerPrivileges |   containerPrivileges | ||||||
|   containerExploits |   containerExploits | ||||||
| @ -546,6 +547,21 @@ getContainerInformation() { | |||||||
|   printResultLong "Useful tools installed .." "$(echo $tools | tr ' ' '\n')" |   printResultLong "Useful tools installed .." "$(echo $tools | tr ' ' '\n')" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | containerCapabilities() { | ||||||
|  |   printQuestion "Dangerous Capabilities .." | ||||||
|  |   if [ -x "$(command -v capsh)" ]; then | ||||||
|  |     if capsh --print| grep -q "$DANGEROUS_CAPABILITIES"; then | ||||||
|  |         caps=$(capsh --print |grep 'cap_' | sed "s/\($DANGEROUS_CAPABILITIES\)/${LG}${EX}&${NC}${DG}/g") | ||||||
|  |         printYes | ||||||
|  |         printStatus "$caps" | ||||||
|  |     else | ||||||
|  |         printNo | ||||||
|  |     fi | ||||||
|  |   else | ||||||
|  |     printError "Unknown (capsh not installed)" | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
| containerServices() { | containerServices() { | ||||||
|   # SSHD |   # SSHD | ||||||
| 
 | 
 | ||||||
| @ -572,7 +588,6 @@ containerServices() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| containerPrivileges() { | containerPrivileges() { | ||||||
| 
 |  | ||||||
|   printQuestion "Privileged Mode ........." |   printQuestion "Privileged Mode ........." | ||||||
|   if [ -x "$(command -v fdisk)" ]; then |   if [ -x "$(command -v fdisk)" ]; then | ||||||
|     if [ "$(fdisk -l 2>/dev/null | wc -l)" -gt 0 ]; then |     if [ "$(fdisk -l 2>/dev/null | wc -l)" -gt 0 ]; then | ||||||
| @ -584,7 +599,6 @@ containerPrivileges() { | |||||||
|   else |   else | ||||||
|     printError "Unknown" |     printError "Unknown" | ||||||
|   fi |   fi | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| containerExploits() { | containerExploits() { | ||||||
| @ -756,7 +770,7 @@ findInterestingFiles() { | |||||||
|   printStatus "$boringVars" |   printStatus "$boringVars" | ||||||
| 
 | 
 | ||||||
|   # Any common entrypoint files etc? |   # Any common entrypoint files etc? | ||||||
|   entrypoint=$(ls -lah /entrypoint.sh /deploy 2>/dev/null) |   entrypoint=$(ls -lah /*.sh /*entrypoint* /**/entrypoint* /**/*.sh /deploy* 2>/dev/null) | ||||||
|   printResultLong "Any common entrypoint files ........." "$entrypoint" |   printResultLong "Any common entrypoint files ........." "$entrypoint" | ||||||
| 
 | 
 | ||||||
|   # Any files in root dir |   # Any files in root dir | ||||||
| @ -791,7 +805,7 @@ findInterestingFiles() { | |||||||
|     printStatus "$hashes" |     printStatus "$hashes" | ||||||
|   elif test -r /etc/shadow; then |   elif test -r /etc/shadow; then | ||||||
|     # Cannot check... |     # Cannot check... | ||||||
|     printFail "No permission" |     printFail "No permissions" | ||||||
|   else |   else | ||||||
|     printNo |     printNo | ||||||
|   fi |   fi | ||||||
| @ -809,15 +823,28 @@ findInterestingFiles() { | |||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | checkDockerRootless() { | ||||||
|  |   printQuestion "Rootless ................" | ||||||
|  |   if docker info 2>/dev/null|grep -q rootless; then | ||||||
|  |     printYes | ||||||
|  |     printTip "$TIP_DOCKER_ROOTLESS" | ||||||
|  |   else | ||||||
|  |     printNo | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
| getDockerVersion() { | getDockerVersion() { | ||||||
|   printQuestion "Docker Executable ......." |   printQuestion "Docker Executable ......." | ||||||
|   if [ "$(command -v docker)" ]; then |   if [ "$(command -v docker)" ]; then | ||||||
|     dockerCommand="$(command -v docker)" |     dockerCommand="$(command -v docker)" | ||||||
|     dockerVersion="$(docker -v | cut -d',' -f1 | cut -d' ' -f3)" |     dockerVersion="$(docker -v | cut -d',' -f1 | cut -d' ' -f3)" | ||||||
|  | 
 | ||||||
|     printSuccess "$dockerCommand" |     printSuccess "$dockerCommand" | ||||||
|     printQuestion "Docker version .........." |     printQuestion "Docker version .........." | ||||||
|     printSuccess "$dockerVersion" |     printSuccess "$dockerVersion" | ||||||
| 
 | 
 | ||||||
|  |     checkDockerRootless | ||||||
|  | 
 | ||||||
|     printQuestion "User in Docker group ...." |     printQuestion "User in Docker group ...." | ||||||
|     if groups | grep -q '\bdocker\b'; then |     if groups | grep -q '\bdocker\b'; then | ||||||
|       printYesEx |       printYesEx | ||||||
| @ -832,7 +859,7 @@ getDockerVersion() { | |||||||
| 
 | 
 | ||||||
| checkDockerVersionExploits() { | checkDockerVersionExploits() { | ||||||
|   # Check version for known exploits |   # Check version for known exploits | ||||||
|   printResult "Docker Exploits ........." "$dockerVersion" "Version Unknown" |   printResult "Docker Version .........." "$dockerVersion" "Version Unknown" | ||||||
|   if ! [ "$dockerVersion" ]; then |   if ! [ "$dockerVersion" ]; then | ||||||
|     return |     return | ||||||
|   fi |   fi | ||||||
| @ -950,6 +977,8 @@ exploitDocker() { | |||||||
|     exit |     exit | ||||||
|   fi |   fi | ||||||
| 
 | 
 | ||||||
|  |   checkDockerRootless | ||||||
|  | 
 | ||||||
|   prepareExploit |   prepareExploit | ||||||
|   printQuestion "Exploiting" |   printQuestion "Exploiting" | ||||||
|   nl |   nl | ||||||
|  | |||||||
| @ -2,12 +2,13 @@ | |||||||
| 
 | 
 | ||||||
| from hackingscripts import util | from hackingscripts import util | ||||||
| from http.server import BaseHTTPRequestHandler, HTTPServer | from http.server import BaseHTTPRequestHandler, HTTPServer | ||||||
|  | from . import xss_handler | ||||||
| import threading | import threading | ||||||
| import requests | import requests | ||||||
| import sys | import sys | ||||||
| import os | import os | ||||||
| import ssl | import ssl | ||||||
| import xss_handler | # import xss_handler | ||||||
| 
 | 
 | ||||||
| class FileServerRequestHandler(BaseHTTPRequestHandler): | class FileServerRequestHandler(BaseHTTPRequestHandler): | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| import socket | import socket | ||||||
| import sys | import sys | ||||||
| import util | from . import util | ||||||
| import pty | import pty | ||||||
| 
 | 
 | ||||||
| def generatePayload(type, local_address, port): | def generatePayload(type, local_address, port): | ||||||
|  | |||||||
| @ -153,7 +153,6 @@ class WebServiceFinder: | |||||||
|             if generator.has_attr("version"): |             if generator.has_attr("version"): | ||||||
|                 print("[+] Found XML Generator version:", generator["version"]) |                 print("[+] Found XML Generator version:", generator["version"]) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     def analyseHtml(self, res): |     def analyseHtml(self, res): | ||||||
|         soup = BeautifulSoup(res.text, "html.parser") |         soup = BeautifulSoup(res.text, "html.parser") | ||||||
| 
 | 
 | ||||||
| @ -177,6 +176,14 @@ class WebServiceFinder: | |||||||
|             self.printMatch("Gogs", gogs_pattern.search(content), 2) |             self.printMatch("Gogs", gogs_pattern.search(content), 2) | ||||||
|             self.printMatch("Go", go_pattern.search(content), 2) |             self.printMatch("Go", go_pattern.search(content), 2) | ||||||
| 
 | 
 | ||||||
|  |         versionInfo = soup.find("div", {"class": "versionInfo"}) | ||||||
|  |         if versionInfo: | ||||||
|  |             content = versionInfo.text.strip() | ||||||
|  | 
 | ||||||
|  |             cacti_pattern = re.compile(r"Version ([0-9.]*) .* The Cacti Group") | ||||||
|  |             self.printMatch("Cacti", cacti_pattern.search(content), 1) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         moodle_pattern_1 = re.compile(r"^https://download.moodle.org/mobile\?version=(\d+)(&|$)") |         moodle_pattern_1 = re.compile(r"^https://download.moodle.org/mobile\?version=(\d+)(&|$)") | ||||||
|         moodle_pattern_2 = re.compile(r"^https://docs.moodle.org/(\d+)/") |         moodle_pattern_2 = re.compile(r"^https://docs.moodle.org/(\d+)/") | ||||||
|         litecart_pattern = re.compile(r"^https://www.litecart.net") |         litecart_pattern = re.compile(r"^https://www.litecart.net") | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user