ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

12.11.2007, 21:22
|
|
Участник форума
Регистрация: 30.10.2006
Сообщений: 238
Провел на форуме: 966901
Репутация:
444
|
|
Список всех дата файлов
Как уже обсуждалось, имена дата файлов, создаваемых SYSTEM,
SYSAUX, TEMP и UNDO могут быть получены из контрольных файлов. Следующий запрос может быть применен, если любого из них не хватает
SQL> SELECT T.NAME AS "TABLESPACE", D.NAME AS "FILNAME" FROM
V$DATAFILE D, TS$ T WHERE T.TS#=D.TS#;
Любой файл, выведенный как часть tablespaces должен быть скопирован на сервер.
Список всех директорий
Директории используются Oracle для внешнего доступа к файлам. Запрос, указанный ниже покажет путь к файлу в данных директориях:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "DIRECTORY", D.OS_PATH AS
"PATH" FROM SYS.OBJ$ O, SYS.USER$ U, SYS.DIR$ D WHERE
U.USER#=O.OWNER# AND O.OBJ#=D.OBJ#;
Все файлы с этой директории должны быть скопированы на сервер
Список внешних таблиц
Они также используют директории Oracle. Их содержание должно быть скопировано и исследовано.
SQL> SELECT O.NAME, D.DEFAULT_DIR FROM SYS.OBJ$ O, SYS.EXTERNAL_TAB$
D WHERE D.OBJ# = O.OBJ#;
Системный монитор (SMON) MON_MOD$ Table
Таблица SMON MON_MOD$ table содержит информацию о
The System Monitor (SMON) MON_MOD$ Table о том, какие Действия DML были выполнены в какой таблице.
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "OBJECT", M.OBJ#, M.INSERTS,
M.UPDATES, M.DELETES, M.TIMESTAMP FROM SYS.MON_MODS$ M, SYS.USER$ U,
SYS.OBJ$ O WHERE O.OBJ#=M.OBJ# AND U.USER#=O.OWNER#;
Получение информации о триггерах
Триггеры могут быть используемые взломщиками по механизму бекдора или как логическая бомба, поэтому нуждаются в проверке, особенно те, которые выполняются при загрузке системы, выключении, входе в систему и т.д. Запрос ниже будет содержать список активных триггеров
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "ENABLED_TRIGGER_NAME",
DECODE(T.TYPE#, 0, 'BEFORE',2, 'AFTER','NOTSET') AS "WHEN" FROM
SYS.OBJ$ O, SYS.TRIGGER$ T, SYS.USER$ U WHERE O.OBJ#=T.OBJ# AND
O.OWNER# = U.USER# AND ENABLED=1;
Изменение “AND ENABLED=1” на “AND ENABLED=0” покажет не активные триггеры.
Поиск включенных триггеров, выполняющихся после запуска системы:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "ENABLED_TRIGGER_NAME" FROM
SYS.OBJ$ O, SYS.TRIGGER$ T, SYS.USER$ U WHERE O.OBJ#=T.OBJ# AND
O.OWNER# = U.USER# AND ENABLED=1 AND BITAND(T.SYS_EVTS,1) = 1;
Поиск включенных триггеров, выполняющихся перед запуском системы:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "ENABLED_TRIGGER_NAME" FROM
SYS.OBJ$ O, SYS.TRIGGER$ T, SYS.USER$ U WHERE O.OBJ#=T.OBJ# AND
O.OWNER# = U.USER# AND ENABLED=1 AND BITAND(T.SYS_EVTS,2) = 2;
Поиск включенных триггеров, выполняющихся после входа в систему:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "ENABLED_TRIGGER_NAME" FROM
SYS.OBJ$ O, SYS.TRIGGER$ T, SYS.USER$ U WHERE O.OBJ#=T.OBJ# AND
O.OWNER# = U.USER# AND ENABLED=1 AND BITAND(T.SYS_EVTS,8) = 8;
Поиск включенных триггеров, перед выходом из системы:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "ENABLED_TRIGGER_NAME" FROM
SYS.OBJ$ O, SYS.TRIGGER$ T, SYS.USER$ U WHERE O.OBJ#=T.OBJ# AND
O.OWNER# = U.USER# AND ENABLED=1 AND BITAND(T.SYS_EVTS,16) = 16;
Получить список всех триггеров
SQL> SET LONG 10000000
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "TRIGGER_NAME", T.ACTION# AS
"TEXT" FROM SYS.OBJ$ O, SYS.TRIGGER$ T, SYS.USER$ U WHERE
O.OBJ#=T.OBJ# AND O.OWNER# = U.USER#;
Получить сорс с помощью запроса в таблицу SOURCE$:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "PROCEDURE", S.SOURCE FROM
SYS.USER$ U, SYS.OBJ$ O, SYS.SOURCE$ S WHERE O.OBJ#=S.OBJ# AND
O.OWNER#=U.USER# AND O.TYPE#=12;
Проверка контрольной суммы триггера
Анонимный блок PL/SQL захеширует текст каждого триггера, поэтому данные хеши могут быть сравнены с списком известных. Так можно быстро узнать, какие были изменены:
Код:
DECLARE
TYPE C_TYPE IS REF CURSOR;
CV C_TYPE;
V_ONAME VARCHAR2(30);
V_OWNER VARCHAR2(30);
V_OBJID NUMBER:=52296;
V_HASH NUMBER:=0;
V_BUFFER LONG(32767);
CUR NUMBER;
RES NUMBER;
POS NUMBER;
LEN NUMBER;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
OPEN CV FOR 'SELECT U.NAME,O.NAME,O.OBJ# FROM SYS.OBJ$ O,
SYS.USER$ U WHERE U.USER# = O.OWNER# AND O.TYPE# = 12 ORDER BY
U.NAME';
LOOP
FETCH CV INTO V_OWNER,V_ONAME,V_OBJID;
EXIT WHEN CV%NOTFOUND;
CUR:=DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(CUR,'SELECT T.ACTION# FROM SYS.TRIGGER$ T
WHERE T.OBJ# = :1',DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(CUR, ':1', V_OBJID);
DBMS_SQL.DEFINE_COLUMN_LONG (CUR, 1);
RES := DBMS_SQL.EXECUTE_AND_FETCH (CUR);
IF RES > 0 THEN
POS:=0;
V_HASH:=0;
LOOP
DBMS_SQL.COLUMN_VALUE_LONG(
CUR,1,32767,POS,V_BUFFER,LEN);
EXIT WHEN LEN = 0;
V_HASH:= V_HASH + SYS.DBMS_UTILITY.GET_HASH_VALUE
(V_BUFFER,1,1073741824);
POS := POS + LEN;
END LOOP;
DBMS_SQL.CLOSE_CURSOR (CUR);
END IF;
DBMS_OUTPUT.PUT_LINE(V_OWNER||'.'||V_ONAME||':'||V_HASH);
V_BUFFER:=NULL;
END LOOP;
CLOSE CV;
END;
/
Получится что-то вроде
…
…
SYS.OLAPISTARTUPTRIGGER:443575894
SYS.OLAPISHUTDOWNTRIGGER:473426999
SYS.PREVENT_DDL:283296376
SYS.VANISH:797468158
SYSMAN.MGMT_METRIC_COLL_DEL:731772430
SYSMAN.MGMT_SQL_METRIC_TR:91156933
…
Получение информации о просмотрах Views
Views могут быть использованы атакующим для скрытия информации. Поэтому, текст всех
Views должен быть получен. Особое внимание стоит уделить начинающимся на DBA, особенно
DBA_VIEWS, DBA_USERS, DBA_ROLE_PRIVS, DBA_TAB_PRIVS и DBA_JOBS.
SQL> SET LONG 100000000
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "VIEW", V.TEXT FROM
SYS.VIEW$ V, SYS.OBJ$ O, SYS.USER$ U WHERE O.OBJ#=V.OBJ# AND
O.OWNER#=U.USER# ORDER BY U.NAME;
Проверка контрольной суммы view text
Анонимный блок PL/SQL хеширует view text поэтому, как и в предыдущем случае, хеши могут быть сравнены с списком известных. Таким образом, модифицированные будут определены
Код:
DECLARE
TYPE C_TYPE IS REF CURSOR;
CV C_TYPE;
V_ONAME VARCHAR2(30);
V_OWNER VARCHAR2(30);
V_OBJID NUMBER:=52296;
V_HASH NUMBER:=0;
V_BUFFER LONG(32767);
CUR NUMBER;
RES NUMBER;
POS NUMBER;
LEN NUMBER;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
OPEN CV FOR 'SELECT U.NAME,O.NAME,O.OBJ# FROM SYS.OBJ$ O,
SYS.USER$ U WHERE U.USER# = O.OWNER# AND O.TYPE# = 4 ORDER BY U.NAME,
O.NAME';
LOOP
FETCH CV INTO V_OWNER,V_ONAME,V_OBJID;
EXIT WHEN CV%NOTFOUND;
CUR:=DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(CUR,'SELECT V.TEXT FROM SYS.VIEW$ V WHERE
V.OBJ# = :1',DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(CUR, ':1', V_OBJID);
DBMS_SQL.DEFINE_COLUMN_LONG (CUR, 1);
RES := DBMS_SQL.EXECUTE_AND_FETCH (CUR);
IF RES > 0 THEN
POS:=0;
V_HASH:=0;
LOOP
DBMS_SQL.COLUMN_VALUE_LONG(
CUR,1,32767,POS,V_BUFFER,LEN);
EXIT WHEN LEN = 0;
V_HASH:= V_HASH + SYS.DBMS_UTILITY.GET_HASH_VALUE
(V_BUFFER,1,1073741824);
POS := POS + LEN;
END LOOP;
DBMS_SQL.CLOSE_CURSOR (CUR);
END IF;
DBMS_OUTPUT.PUT_LINE(V_OWNER||'.'||V_ONAME||':'||V_HASH);
V_BUFFER:=NULL;
END LOOP;
CLOSE CV;
END;
/
Результат будет похожим на
…
…
SYS.DBA_UNUSED_COL_TABS:215069642
SYS.DBA_UPDATABLE_COLUMNS:377298913
SYS.DBA_USERS:958803668
SYS.DBA_USTATS:203495787
SYS.DBA_VARRAYS:670521746
SYS.DBA_VIEWS:49730132
…
…
Получение информации обо всех библиотеках[/B]
Библиотеки могут быть использованы как механизм запуска произвольного кода, поэтому нуждаются в исследовании.
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "LIBRARY", L.FILESPEC AS
"PATH" FROM SYS.LIBRARY$ L, SYS.USER$ U, SYS.OBJ$ O WHERE
O.OBJ#=L.OBJ# AND O.OWNER#=U.USER#;
Все DLL, не являющиеся стандартными должны быть скопированы на сервер для исследования
Получение информации о database links
database links могут быть созданы взломщиком для соединения с другим сервером Oracle, Колонка CTIME обозначен когда он был создан
SQL> SELECT U.NAME AS "OWNER", L.NAME AS "LINK", L.HOST, L.USERID,
L.PASSWORDX, L.CTIME FROM SYS.LINK$ L, SYS.USER$ U WHERE
L.OWNER#=U.USER#;
Если хозяин обозначен как “PUBLIC”, link тоже является публичным и может быть использован кем угодно. .
Информация о synonyms.
Они могут быть использованы для влияния на выполнение PL/SQL и скрытия информации. Полный список может быть выведен таким образом:
SQL> SELECT U.NAME AS "OWNER", S.OWNER AS "REAL-OWNER", S.NAME AS
"OBJECT", O.NAME AS "SYNONYM" FROM SYS.USER$ U, SYS.OBJ$ O, SYS.SYN$
S WHERE S.OBJ#=O.OBJ# AND O.OWNER#=U.USER#;
Получение информации о database jobs
Они могут быть использованы для изменений в настройке времени и даты – даже когда атакующий на входил в систему. Также, был опубликован rootkits от Cesar Cerrudo, работающий по данному принципу.
SQL> SELECT JOB, LOWNER, POWNER, COWNER, LAST_DATE, NEXT_DATE, WHAT
FROM SYS.JOB$;
Oracle 10g выпустил the Job Scheduler, и база данных должна использовать ее функционал – информация о заданиях хранится в разных таблицах. Получение списка используемых заданий будет следующим:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "JOBNAME", J.PROGRAM_ACTION
FROM SYS.USER$ U, SYS.OBJ$ O, SYS.SCHEDULER$_JOB J WHERE
J.OBJ#=O.OBJ# AND O.OWNER#=U.USER#;
Даже если задание было удалено, информация о нем находится в логах, получить можно используя следующий запрос:
SQL> SELECT LOG_ID, LOG_DATE, NAME, OWNER, STATUS FROM
SYS.SCHEDULER$_EVENT_LOG ORDER BY LOG_ID;
Для списка программ(исполняемых, блока PL/SQL, сохраняемые процедуры) ассоциируемых с job scheduler выполняется следующий запрос:
Исполняемые:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "PROGRAM-EXECUTABLE",
P.ACTION FROM SYS.USER$ U, SYS.OBJ$ O, SYS.SCHEDULER$_PROGRAM P WHERE
O.OBJ#=P.OBJ# AND U.USER#=O.OWNER# AND BITAND(P.FLAGS,32)=32;
Stored Procedure: сохраняемые процедуры
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "PROGRAM-STORED-PROCEDURE",
P.ACTION FROM SYS.USER$ U, SYS.OBJ$ O, SYS.SCHEDULER$_PROGRAM P WHERE
O.OBJ#=P.OBJ# AND U.USER#=O.OWNER# AND BITAND(P.FLAGS,4)=4;
Блок PL/SQL
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "PROGRAM-PLSQL-BLOCK",
P.ACTION FROM SYS.USER$ U, SYS.OBJ$ O, SYS.SCHEDULER$_PROGRAM P WHERE
O.OBJ#=P.OBJ# AND U.USER#=O.OWNER# AND BITAND(P.FLAGS,2)=2;
Получения информации об объектах PL/SQL
Процедуры:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "PROCEDURE", S.SOURCE FROM
SYS.USER$ U, SYS.OBJ$ O, SYS.SOURCE$ S WHERE O.OBJ#=S.OBJ# AND
O.OWNER#=U.USER# AND O.TYPE#=7;
Функции:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "PROCEDURE", S.SOURCE FROM
SYS.USER$ U, SYS.OBJ$ O, SYS.SOURCE$ S WHERE O.OBJ#=S.OBJ# AND
O.OWNER#=U.USER# AND O.TYPE#=8;
Сборки:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "PACKAGE", S.SOURCE FROM
SYS.USER$ U, SYS.OBJ$ O, SYS.SOURCE$ S WHERE O.OBJ#=S.OBJ# AND
O.OWNER#=U.USER# AND O.TYPE#=9;
Package bodies:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "PACKAGE-BODY", S.SOURCE
FROM SYS.USER$ U, SYS.OBJ$ O, SYS.SOURCE$ S WHERE O.OBJ#=S.OBJ# AND
O.OWNER#=U.USER# AND O.TYPE#=11;
Триггеры:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "TRIGGER", S.SOURCE FROM
SYS.USER$ U, SYS.OBJ$ O, SYS.SOURCE$ S WHERE O.OBJ#=S.OBJ# AND
O.OWNER#=U.USER# AND O.TYPE#=12;
Типы:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "TYPE", S.SOURCE FROM
SYS.USER$ U, SYS.OBJ$ O, SYS.SOURCE$ S WHERE O.OBJ#=S.OBJ# AND
O.OWNER#=U.USER# AND O.TYPE#=13;
Type bodies:
SQL> SELECT U.NAME AS "OWNER", O.NAME AS "TYPE-BODY", S.SOURCE FROM
SYS.USER$ U, SYS.OBJ$ O, SYS.SOURCE$ S WHERE O.OBJ#=S.OBJ# AND
O.OWNER#=U.USER# AND O.TYPE#=14;
Получение информации о Java objects
Java код может быть загружен в класс как файл класса class file (bytecode), или как Java код, который может быть скопилирован. Код загружается в таблицу JOXFS, а bytecode – в IDL_UB1$.
Получение Java кода
SQL> SELECT U.NAME, O.NAME, S.JOXFTSRC FROM SYS.USER$ U, SYS.OBJ$ O,
X$JOXFS S WHERE O.OBJ# = S.JOXFTOBN AND O.OWNER# = U.USER#;
Контрольная сумма байткода
Атакующий может получить модификацию байткода. Чтобы получить контрольную сумму и сравнить со списком известных можно использовать следующий код:
Код:
DECLARE
TYPE C_TYPE IS REF CURSOR;
CV C_TYPE;
V_ONAME VARCHAR2(30);
V_OWNER VARCHAR2(30);
V_OBJID NUMBER:=52296;
V_HASH NUMBER:=0;
V_BUFFER RAW(32767);
CUR NUMBER;
RES NUMBER;
POS NUMBER;
LEN NUMBER;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
OPEN CV FOR 'SELECT U.NAME,O.NAME,O.OBJ# FROM SYS.OBJ$ O,
SYS.USER$ U WHERE U.USER# = O.OWNER# AND O.TYPE# = 29 ORDER BY
U.NAME';
LOOP
FETCH CV INTO V_OWNER,V_ONAME,V_OBJID;
EXIT WHEN CV%NOTFOUND;
CUR:=DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(CUR,'SELECT S.PIECE FROM SYS.IDL_UB1$ S
WHERE S.OBJ# = :1',DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(CUR, ':1', V_OBJID);
DBMS_SQL.DEFINE_COLUMN_RAW (CUR, 1, V_BUFFER, 32767);
RES := DBMS_SQL.EXECUTE_AND_FETCH (CUR);
IF RES > 0 THEN
POS:=0;
V_HASH:=0;
DBMS_SQL.COLUMN_VALUE_RAW(CUR,1,V_BUFFER);
V_HASH:= V_HASH + SYS.DBMS_UTILITY.GET_HASH_VALUE
(V_BUFFER,1,1073741824);
DBMS_SQL.CLOSE_CURSOR (CUR);
END IF;
DBMS_OUTPUT.PUT_LINE(V_OWNER||'.'||V_ONAME||':'||V_HASH);
V_BUFFER:=NULL;
END LOOP;
CLOSE CV;
END;
/
Результат будет таков:
…
…
SYS./bf8c3870_ConnectionStructHelp:52013415
SYS./f7546018_DatabaseInterface:766489862
SYS./ad32ba4d_DatabaseInterfaceHel:974677841
SYS./f0cd62e8_DatabaseInterfaceStu:202096582
SYS./d100f507_PropertySequenceHelp:222649136
SYS./809cbfa9_PropertyStruct:904769799
SYS./91352016_RemoteAuthentication:905079855
…
…
Также можно использовать этот запрос для того чтобы хешировать код других PL/SQL обьектов, также найденных в таблице IDL_UB1$.
Когда все запросы были выполнены, spool файл может быть закрыт, также как и sqlplus.
SQL> SPOOL OFF
SQL> QUIT
Disconnected from Oracle Database 10g Enterprise Edition Release
10.2.0.2.0 – Production With the Partitioning, OLAP and Data Mining
options
C:\oracle\product\10.2.0\db_1\BIN>
После отключения от сервера, нужно получить контрольную сумму md5 из spool file и записать её в присутствии свидетеля.
Заключение
После получения и сохранения всех данных Живого ответа, возможны несколько вариантов действий. Первое – отключить систему от сети и перейти к доказательства, конечно, если предполагается привлекать взломщика к юридической ответственности. Итак, аудитор системы должен найти, как взломщик пробрался в систему и дать рекомендации по безопасности.
Thanks to Neminem for help=)
Оригинал статьи: http://milw0rm.org/papers/158 (pdf)
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|