Подтвердить что ты не робот

Расшифровка .ASPXAUTH Cookie с защитой = проверка

В какой-то момент я пытался расшифровать файл cookie ASP.ASPXAUTH и расшифровать его с помощью PHP. Мои причины огромны, и мне нужно это сделать, альтернативы нет. В PHP до сих пор мне удалось прочитать данные из этого файла cookie, но я не могу это сделать, пока он зашифрован. Во всяком случае, вот оно...

Сначала вам нужно изменить файл сервера Web.config(защита должна быть настроена на проверку):

    <authentication mode="None">
        <forms name=".ASPXAUTH" protection="Validation" cookieless="UseCookies" timeout="10080" enableCrossAppRedirects="true"/>
    </authentication>

Затем в PHP script в том же домене вы можете сделать следующее, чтобы прочитать данные, это очень простой пример, но является доказательством:

$authCookie = $_COOKIE['_ASPXAUTH'];
echo 'ASPXAUTH: '.$authCookie.'<br />'."\n";//This outputs your plaintext hex cookie
$packed = pack("H*",$authCookie);
$packed_exp = explode("\0",$packed);//This will separate your data using NULL
$random_bytes = array_shift($packed_exp);//This will shift off the random bytes
echo print_r($packed_exp,TRUE); //This will return your cookies data without the random bytes

Это разбивает файл cookie или, по крайней мере, незашифрованные данные:

http://i.stack.imgur.com/stisu.jpg

Теперь, когда я знаю, что могу получить данные, я удалил строку 'protection = "validation" "из моего Web.config, и я попытался расшифровать ее с помощью PHP mcrypt. Я пробовал бесчисленные методы, но вот многообещающий пример (который терпит неудачу)...

define('ASP_DECRYPT_KEY','0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8');//This is a decryption key found in my Machine.config file (please note this is forged for example)
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, ASP_DECRYPT_KEY, $authCookie, MCRYPT_MODE_CBC, $iv);//$authCookie is the pack()'d cookie data

Однако это не удается. Я пробовал варианты IV со всеми нулями @16 байт. Я пробовал разные размеры Rijndael (128 против 256). Я пробовал base64_decode(), ничего не работает. Я нашел этот qaru.site/info/440047/... и начал использовать вариации ключа /iv, которые были сделаны с помощью sha256, но это тоже не работает.

Кто-нибудь знает, что я должен делать?

4b9b3361

Ответ 1

Я не знаю, как шифрование выполняется в .NET AuthCookies, но я могу попытаться ответить.

Предполагая, что шифрование происходит в режиме AES CBC-IV, со случайным образом генерируемым IVs, вам нужно сначала узнать, где находится IV.

Показанный фрагмент кода не может работать, поскольку вы генерируете случайный IV (который будет неправильным). При этом, даже если вы ошиблись, в режиме CBC у вас будут только первые 16 байт вашего расшифрованного зашифрованного текста "искажены", а остальные будут дешифровать правильно - вы можете использовать это как тест, чтобы узнать, делая остальное правильно. На практике при использовании случайных ИВ очень вероятно, что он предшествует зашифрованному тексту. Чтобы проверить, правильно ли это, вы можете проверить, является ли len (ciphertext) = len (plaintext) + 16. Это будет означать, что, скорее всего, первые 16 байтов являются вашим IV (и поэтому его следует удалить из зашифрованного текста, прежде чем пытаться расшифровать его).

Также в вашем фрагменте кода кажется, что вы используете ключ как ascii-строку, тогда как он должен быть массивом байтов. Попробуйте:

define('ASP_DECRYPT_KEY',hex2bin('0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8'));

Кроме того, это похоже на 32-байтовый ключ, поэтому вам нужно использовать AES-256. Я не знаю, как выглядит authcookie, но если он кодируется base64, вам также необходимо сначала его декодировать.

Надеюсь, это поможет!

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

Ответ 2

Я понимаю, что это возможно не было возможным для OP, но для других людей, направляющихся по этому маршруту, это простая альтернатива.

  • Создайте веб-службу .net с помощью метода, например:

    public FormsAuthenticationTicket DecryptFormsAuthCookie (строковый билет)
          {
              return FormsAuthentication.Decrypt(билет);
          }

  • Передача cookie веб-сервису с PHP:

    $authCookie = $_COOKIE ['. ASPXAUTH'];
    $ soapClient = новый SoapClient ( "http://localhost/Service1.svc?wsdl" );
    $ params = array (
       "билет" = > $authCookie
      );
    $ result = $soapClient- > DecryptFormsAuthCookie ($ params);

Ответ 3

Я знаю, какая боль расшифровывает в PHP что-то зашифрованное в .NET и наоборот.

Мне пришлось закончить кодирование себя алгоритмом Rijndael (перевести его с другого языка).

Вот ссылка на исходный код алгоритма: http://pastebin.com/EnCJBLSY

В конце исходного кода есть пример использования.

Но на .NET вы должны использовать нулевое дополнение при шифровании. Также проверьте его в режиме ECB, я не уверен, работает ли CBC.

Удачи и надеюсь, что это поможет

edit: алгоритм возвращает шестнадцатеричную строку при шифровании, а также ожидает шестнадцатеричную строку при расшифровке.