Updated writeup
This commit is contained in:
parent
8ba4c651fb
commit
8bcf6af871
@ -1,11 +1,14 @@
|
|||||||
# Juniper Host Checker Linux MITM RCE
|
# Juniper Host Checker Linux MITM RCE
|
||||||
## Intro
|
## Intro
|
||||||
The Host Checker is a client side component that some Pulse Secure appliances may require in order to connect to the VPN. The Host Checker requests a policy from the server and perform basic checks on the client accordingly. Checks may include MAC Addresses, running process (ie: checking for an antivirus) and some others. While on Windows the plugin is an ActiveX component, in Linux, Solaris and OSX it is a Java Applet.
|
The Host Checker is a client side component that the [Pulse Connect Secure](https://www.pulsesecure.net/products/pulse-connect-secure/) appliance may require in order to connect to the VPN. The Host Checker requests a policy from the server and perform basic checks on the client accordingly. Checks may include MAC Addresses, running process (ie: checking for an antivirus) and some others. While on Windows the plugin is an ActiveX component, in Linux, Solaris and OSX it is a Java Applet.
|
||||||
Of course client checks can always be bypassed, and an open source (yet not well documented) implementation [do exist](https://raw.githubusercontent.com/russdill/juniper-vpn-py/master/tncc.py).
|
Of course client checks can always be bypassed, and an open source (yet not well documented) implementation [do exist](https://raw.githubusercontent.com/russdill/juniper-vpn-py/master/tncc.py).
|
||||||
## Sumamry
|
## Sumamry
|
||||||
Probably in order to still works with misconfigured instances, the Host Cheker does not check neither the validity of the server certificate nor its hostname. The server can set a malicious cookie, which can be used to exploit a command injection when the user is found not compliant. Note that a malicious server can force a user to be non compliant.
|
Probably in order to still work with misconfigured instances, the Host Cheker does not check neither the validity of the server certificate nor its hostname. The server can set a malicious cookie (or it can be done via DNS Rebinding), which can be used to exploit a command injection when the user is found not compliant. Note that a malicious server can force a user to be non compliant.
|
||||||
## Code
|
## Code
|
||||||
|
The client implement a custom protocol in order to talk to the server. For further reference, the [open source client](https://raw.githubusercontent.com/russdill/juniper-vpn-py/master/tncc.py) has reverse engineered and implemented the same protocol. The file ```tncc.jar``` is not obfuscated in any way and the originalk source code can be obtained with almost any Java decompiler.
|
||||||
|
|
||||||
### Certificate
|
### Certificate
|
||||||
|
Below are some extracts of code from the classes that handle the connection with the Pulse Connect Secure appliance.
|
||||||
In `net.juniper.tnc.client.HttpNAR.HttpNAR`:
|
In `net.juniper.tnc.client.HttpNAR.HttpNAR`:
|
||||||
```
|
```
|
||||||
private void trustAllCerts() throws Exception {
|
private void trustAllCerts() throws Exception {
|
||||||
@ -64,6 +67,7 @@ Both function gets executed when initializing the connection to a server. From t
|
|||||||
### Cookie
|
### Cookie
|
||||||
In order for the Host Checker to work two cookies are needed, `DSPREAUTH` and `DSSIGNIN`.
|
In order for the Host Checker to work two cookies are needed, `DSPREAUTH` and `DSSIGNIN`.
|
||||||
They can be either set by the server or from sending commands to a socket listening to all interfaces (but accepting connections only from localhost).
|
They can be either set by the server or from sending commands to a socket listening to all interfaces (but accepting connections only from localhost).
|
||||||
|
The following code updates the DSPREAUTH cookie when sending periodic updates to the server. Periodic updates may or may not be required depending on the policy configuration.
|
||||||
From `net.juniper.tnc.client.HttpNAR.HttpConnection`:
|
From `net.juniper.tnc.client.HttpNAR.HttpConnection`:
|
||||||
```
|
```
|
||||||
public int sendUpdate(final byte[] array, final ByteArrayOutputStream byteArrayOutputStream, final boolean b) throws Exception {
|
public int sendUpdate(final byte[] array, final ByteArrayOutputStream byteArrayOutputStream, final boolean b) throws Exception {
|
||||||
@ -100,6 +104,7 @@ From `net.juniper.tnc.client.HttpNAR.HttpConnection`:
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Command injection
|
### Command injection
|
||||||
|
When a client is found to be non compliant, remediation instructions have to be shown to the user in order to give him a chance to fix his problems.
|
||||||
In `net.juniper.tnc.client.HttpNAR.TNCHandshake`:
|
In `net.juniper.tnc.client.HttpNAR.TNCHandshake`:
|
||||||
```
|
```
|
||||||
public void doCustomRemediateInstructions() {
|
public void doCustomRemediateInstructions() {
|
||||||
|
Loading…
Reference in New Issue
Block a user