Доброго времени, к0мрады...
преследуя филоХсофию "этичности" и соблюдая балланс добра со злом (а по анализу топикоФФ, большинство тут "тёмнокепковых" aka blackhat) буду описывать путь Инь (или Янь, можем на монетке разыграть ), тоесть путь не "вскрытия" а... защиты, посему надеюсь на лояльность местных гуру, их пособничество в созидании кода для последующей експлуатации и сотворения (спешл фо rdot.com) соотв. софтин...
итак, меньше текста... больше POC-а...
Задача:
0. иередача с сервера_0 на сервер_1 закриптованного метода\файла, с последующей его эксплуатацией (а-ля ioncub || zend...) но на чистопыхе...
имеем:
0.сервер_0 - серверная часть с обращением вида API (широковещательно)
1.сервер_1,2,3...*n - клиентская часть, принимающая агрументы от сервер_0
2.honey.php - "приёмо-передатчик" находиться на > сервер_1
3.алгоритм "triple helix" [c0der©]
4.гуглопедия
5.пряморукость
6.моск
___
исходник honey.php
PHP код:
<?php
/* universal adapter ID [triple helix by c0der]
* $_POST = @param from serv. side emulate as local
* SCRIPT_ID = unique server_N private key for API init
*/
define('SCRIPT_ID', '12345678');
function decrypt($text, $key) {
if ($text = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($text), MCRYPT_MODE_CBC, md5(md5($key))), "\0")) {
return $text;
} else {
return false;
}
}
function encrypt($text, $key) {
$text = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $text, MCRYPT_MODE_CBC, md5(md5($key))));
return $text;
}
function magic($text, $key) {
$len = strlen($text);
$key = md5($key) . substr(md5(strrev($key)), 0, strlen($key));
for ($i = 0; $i < $len; $i++) {
$key .= $text[$i];
$text[$i] = chr((ord($text[$i]) + ord($key[$i])) % 256);
}
return base64_encode($text);
}
$secret_code = 'WzLZ7Y2rbHeyRvviaPcRioXkPHkmKKQCEqf2jy0IMr1zu4sO949Dybf5C94diLRieiWNO6qEzFZKtzLa9Yf/pk+w9c5MIBcUKRe53miZ8Fsm3H4ODywH8PLIKyt2DMH4o8luxZt5QBDCAxEpBJPunMHv5Y8rrwqnmDj271V/kYdYSE0QBKPwckJRSEVoPSs8SB0iNyJ3isEBag71FFYvTHttFFUIkyI0D11X9x/uWZmyT4qGm/0QCG2StDmK8/Y97H2GRMFmydlcVyCvdS15qwyNEgJ4ZqOG2fsEYBlM/wUIt8WxJ8xv/o97uOrK4UphHIC/rZxQTBuWkFR4Pz4Ldg==';
//Секретная функция проверки пинкода
$POST_code_2 = 'rpbPnaRZqaSqpJhdUXKioY+UYQ==';
//Зашифрованный текст или исходник [ ]
$data = '$text = base64_decode($text);
$len = strlen($text);
$key = md5($key).substr(MD5(strrev($key)), 0, strlen($key));
for($i=0;$i<$len;$i++){
$text[$i]=chr(( ord($text[$i])-ord($key[$i]))%256);
$key.=$text[$i];
}
return $text;';
$very_secret_post_curl_key = encrypt('123', SCRIPT_ID);
$hash = base64_encode(hash_hmac('sha256', '123', SCRIPT_ID), true);
print_r($hash);
$data_for_decode_client_side = encrypt($data, $hash);
//тут пример зашифровывания текста||функции ($_POST['decode']) с помощью пинкода ($_POST['pincode'])
if (isset($_POST['decode']) && !empty($_POST['decode'])) {
if (isset($_POST['pincode'])) {
$pin_text = magic($_POST['decode'], $_POST['pincode']);
} else {
$pin_text = magic($_POST['decode'], '123');
}
//Function body, как описано для create_function (секретный код для create_function('$text,$key'
} else {
$pin_text = magic('echo "Hello Bro...";', '123');
//тот же пример зашифровывания функции но без "поста", тоесть по дефолту, для проверочки...
print_r('Just do it, bro... [echo \'Hello Bro *)\';]');
//$pin_text = 'xRe+lgV1vXnoif2itxNnW7XvYrGvAZTpcO+yB6WGCgQ='; //Закодированная строка магически (хуй забрутиш)
}
if ($very_secret_post_curl_key) {
//First helix...
$pin_code = decrypt($very_secret_post_curl_key, SCRIPT_ID); //post pincode decode
//Second helix...
$super_key = base64_encode(hash_hmac('sha256', '123', SCRIPT_ID, true)); //Hash of STORE_ID && user_id
if (isset($super_key) && is_numeric($pin_code)) {
print_r('pin:'.$pin_code);
print_r('sk:'.$super_key);
print_r('edata:'.$data_for_decode_client_side);
$matrix = create_function('$text,$key', decrypt($data_for_decode_client_side, $super_key));
//Получаем результат сложения по закодированной функции magic. //Third helix...
$matrix($pin_text, $pin_code);
//Выполнение произвольной лямбда функции $_POST['decode']
} else {
print_r('Not correct pincode, bro...');
}
} else {
echo 'Have a secret code ?';
}
?>
<form method="post" action=""><input type="text" name="pincode" value=""/><br/><input type="text" name="decode" value=""/><input type="submit" value=">"/></form>
как видим, "вскрыть" 2,3 спираль можно, но трудновато... если передавать в качестве параметра pincode = one_time_password, получаемый от сервера_0 в качестве аргумента, каждый раз, по типу "pin-pong", то получается криптостойкость на уровне...
вопрос к знатокам:
"Уважаемые гуру, раскритикуйте\подправьте\у совершенствуйте логику, которая позволила бы отправлять\принимать данные между серверами, без возможности вскрытия передаваемых функций..."
p.s. самошифрование вдохновило от ув. profexer-а с его немалоизвестным P.A.S.-ом...
жду конструктива, уточнений, кирпичей...