Admin
Администратор
2 часть. Находим API; Swagger; OpenAPI endpoints и точки эксплуатации.[PART: 1]
Отсортировав их получается список целей которые теперь нас интересуют с т.з. получения внутренней информации или маппинга API.Поскольку часто swagger и openapi доки скрыты за логином мы будем искать подсказки где находится то что нам надо.
Содержание
- Список кандидатов
- TLS реверс
- Апгрейд словаря
- Парсинг значений ендпоинт директорий
- DevTools и поиск apibase
- Анализ данных для эксплуатации
Предыдущая статья содержала в конце целевой список url кандидатов.
В этой хочется расширить список ендпоинтов и потому будем добавлять вариации.
Проявляем изобретательность и копаем глубже.
Сначала зададим для команд наш файл с уже найдеными wayback директориям-
Bash:
FILE=/home/kali/candidates/ffuf_hits.txt
Bash:
while read -r u; do
echo -n "$u , "
curl -skI -L --max-redirs 3 -m 8 "$u" | awk 'BEGIN{sc="000";ct="";} /HTTP/{if($2) sc=$2} /Content-Type/ {ct=$2} END{print sc" , "ct}'
done < "$FILE" > /home/kali/report.txt
Полученный репорт в текстовом виде позволит отделить кандидатов с application/json | yaml.
Продолжим работу с этим списком.
TLS реверс
Поскольку ответы пришли ‘000’ то стоит проверить в целом валидность найденного енжпоинта swagger / openapi-
Bash:
curl -vkI https://hub.param.com.tr/api/openapi.json
Это покажет подробный TLS/HTTP обмен запросами без проверки серта.
Сохраняем swaggerui.html для поиска оставленных линков или хедеров-
Bash:
curl -k -sL 'https://hub.param.com.tr/api/swagger-ui' -o /home/kali/swaggerui.html
Bash:
egrep -o 'https?://[^"'"'"' >]*?(openapi|swagger|api-docs|openapi.json|swagger.json)[^"'"'"' >]*' /home/kali/swaggerui.html | sort -u
Bash:
grep -E '"(get|post|put|delete)"' swaggerui.html | head -n 20
Bash:
grep -oP '{[^}]*"openapi"[^}]*}' swaggerui.html
Теперь стоит на основании уже имеющегося списка сделать шаг в сторону добавления параметров для фаззинга в словарь apiwl.txt из первой части-
Bash:
cat <<'EOF' > /home/kali/apiwl2.txt
openapi.json
swagger.json
openapi.yaml
swagger.yaml
api-docs
v2/api-docs
swagger-ui
docs
redoc
openapi/v1.json
r.php/api/openapi.json
r.php/api-docs
EOF
Теперь советую создать файл для списка доп. Ендпоинтов.
Bash:
mkdir -p /home/kali/ffufout2
Будет много результатов и лучше хранить их в одном месте.
Используем fuff для фаззинга с дополненным словарем и используем список субдоменов цели-
Bash:
while IFS= read -r sub; do
[ -z "$sub" ] && continue
echo "FFUF -> $sub"
/usr/bin/ffuf -u "https://$sub/FUZZ" -w /home/kali/apiwl2.txt -mc 200,301,302 -t 20 \
-o "/home/kali/ffuf_out/${sub}_specs.json" -of json || true
done < /home/kali/targsub.txt
По резульатам фаззинга выделились 3 субдомена
akbank.param.com.tr;
hub.param.com.tr;
isube.param.com.tr;
Особенно приглянулся домен hub.param.com.tr т.к. именно он ответил статусом ‘200’ с интересующими нас параметрами директорий и файлов-
JSON:
openapi/v1.json [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 493ms]
swagger.yaml [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 457ms]
swagger.json [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 475ms]
api-docs [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 474ms]
openapi.yaml [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 485ms]
openapi.json [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 483ms]
docs [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 445ms]
swagger-ui [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 388ms]
v2/api-docs [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 452ms]
redoc [Status: 200, Size: 33955, Words: 4214, Lines: 457, Duration: 484ms]
Результаты сохранились в /ffuf_out.
Парсинг ендпоинт директорий
Используем подобный скрипт-
Bash:
mkdir -p /home/kali/candidates2
out_raw=/home/kali/candidates2/ffufraw2.txt
out_final=/home/kali/candidates2/ffuftargs2.txt
rm -f "$out_raw" "$out_final"
find /home/kali/ffuf_out /home/kali/ffufout2 -type f -name '*.json' -size +0 -print0 2>/dev/null \
| xargs -0 -n1 -I{} bash -lc '
echo "PROCESSING: {}"
/usr/bin/jq -r ".results[]?.url" "{}" 2>/tmp/jq_err.$$ >> "'"$out_raw"'" || { echo "jq error on {}: $(head -n 5 /tmp/jq_err.$$)"; }
'
if [ -f "$out_raw" ]; then
sort -u "$out_raw" > "$out_final"
echo "WROTE $out_final (lines: $(wc -l < "$out_final"))"
echo "SAMPLE:"
head -n 30 "$out_final"
else
echo "No raw hits file created — there were no readable .json files under /home/kali/ffuf_out or /home/kali/ffufout2"
fi
Что тут вообще происходит
- Мы создаем директорию для нового списка кандидатов для дедупликации
- Парсим все .json которые имеют значения внутри
- Экспортируем urls через jq
- Сохраняет raw xargs если таковые найдены
- Выдает значение ошибки если не было найдено raw params
Bash:
~/go/bin/httpx -l /home/kali/candidates2/ffuftargs2.txt \ -status-code -content-type -title -no-color -silent \ -o /home/kali/candidates2/httpx_out.txt
Bash:
while read -r u; do
echo -n "$u -> "
ctype=$(curl -k -s -o /dev/null -D - "$u" | grep -i '^content-type:')
echo "$ctype"
done < /home/kali/candidates2/ffuftargs2.txt
Теперь маленький лайвхак - сохраним swagger-ui страницу в формате .html-