使用保护=验证解密.ASPXAUTH Cookie

The*_*ack 12 php asp.net encryption mcrypt rijndael

很长一段时间以来,我一直在尝试破解ASP .ASPXAUTH cookie并使用PHP解密它.我的理由是巨大的,我需要这样做,没有其他选择.到目前为止,在PHP中我成功地设法从这个cookie中读取数据,但是在加密时我似乎无法做到这一点.无论如何,这里......

首先,您需要更改服务器Web.config文件(保护需要设置为Validation):

    <authentication mode="None">
        <forms name=".ASPXAUTH" protection="Validation" cookieless="UseCookies" timeout="10080" enableCrossAppRedirects="true"/>
    </authentication>
Run Code Online (Sandbox Code Playgroud)

然后在同一个域的PHP脚本中,您可以执行以下操作来读取数据,这是一个非常基本的示例,但是证明:

$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
Run Code Online (Sandbox Code Playgroud)

这会分解cookie,或者至少是未加密的数据:

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

既然我知道我可以获取数据,我从Web.config中删除了'protection ="validation"'字符串,我尝试使用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
Run Code Online (Sandbox Code Playgroud)

然而,这失败了.我已尝试使用全部为零的16字节的IV变体.我尝试过不同的Rijndael尺寸(128 vs 256).我试过base64_decode()ing,似乎没什么用.我在这里找到了这个stackoverflow帖子,并开始使用sha256制作的键/ iv的变体,但这也不是真的有效.

有人知道我该怎么办?

add*_*lbx 5

我不知道如何在.NET AuthCookies中进行加密,但我可以尝试回答.

假设加密发生在AES CBC-IV模式下,随机生成的IV,您需要首先找出IV的位置.

您显示的代码段不起作用,因为您生成随机IV(这将是不正确的).话虽这么说,即使你得到IV错误,在CBC模式下你只会让你解密的密文的前16个字节"乱码",其余的将正确解密 - 你可以用它作为测试来知道你是不是正确地做其余的事情.在使用随机IV时,实际上它很可能是在密文之前.要检查这是否正确,您可以尝试检查len(密文)= len(明文)+ 16.这意味着前16个字节很可能是您的IV(因此在尝试之前应将其从密文中删除)解密它).

同样在您的代码片段中,您似乎使用密钥作为ascii-string,而它应该是一个字节数组.尝试:

define('ASP_DECRYPT_KEY',hex2bin('0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8'));
Run Code Online (Sandbox Code Playgroud)

此外,这似乎是一个32字节的密钥,所以你需要使用AES-256.我不知道authcookie是怎么样的,但是如果它是base64编码的,你还需要先解码它.

希望这可以帮助!

注意:我不建议对重要的生产代码执行此操作 - 但是,如果您尝试实现自己的解密例程,那么有许多事情可能会出错.特别是,我猜想在尝试解密之前你必须检查某个MAC标签,但是还有很多其他的东西可能会在实现你自己的加密时出错.