Маленькі хитрощі твого мила, Інтернет і інші мережі, Security & Hack, статті

Кріс Касперски

Це тільки здається, що в Internet так легко загубитися, на самому

ж, будь-яке ваше дію лишає довго не замітає сліди

… Але що робити, якщо виникає необхідність відправити (або

отримати) лист і при цьому залишитися повністю анонімним? Ось

про це-то і розповідає ця стаття.

Короткий зміст:

Анонімна розсилка кореспонденції

Більшість серверів вихідної пошти визначають IP-адреса відправника

повідомлення і вставляють його в заголовок. Звичайно, IP-адресу це ще

не сам відправник (якого піди знайди), але іноді виникає

бажання залишитися повністю анонімним.

У Мережі існує безліч служб, що надають послуги подібного

роду (наприклад, proxy-сервери, анонімайзери), але багато анонімайзери

явно вказують на бажання відправника залишитися невідомим, а

з приводу анонімності деяких proxy-серверів мене терзають невиразні

сумніви.

Одне з можливих рішень проблеми полягає у використанні

програми, розробленої спеціально для анонімної розсилки листів,

яка виконувалася б не на комп’ютері відправника, а містилася

на віддалений сервер.

Врізка “для початківців”

Часто початківці шкідники не можуть придумати

нічого оригінальніше, ніж змушувати сервер за допомогою

скрипта отримувати найсвіжіший дістрібьютів бета-версії Windows

2000 і посилати його на ящик жертви в неміряна кількість.

Куди привабливіше виглядає спроба примусового

прилучення атакується до світу прекрасного, наприклад, ознайомлення

його з космічними дослідженнями NASA (для чого використовуються

фотографії, доступні на сайті www.nasa.gov

)

Мовою Perl така програма могла б виглядати приблизно

так (докладне пояснення її роботи виходить за рамки цієї статті,

проте, структура програми досить зростання, щоб у ній міг

розібратися навіть непідготовлений читач):

use Socket;

·

my($mailFrom) = ‘KPNC@APORT.RU’; ·

my($MailTo) = ‘KPNC@APORT.RU’;

socket(SMTP,

PF_INET(), SOCK_STREAM(), 6);

connect(SMTP,sockaddr_in(25,inet_aton(“mail.aport.ru”)));

recv(SMTP,

$buffer, 200, 0);

print “$buffer\n”;

send(SMTP, “HELO

kpnc\n”,0);

print “>HELO\n”;

my($buffer)

= @_;

recv(SMTP, $buffer, 200, 0);

print “$buffer\n”;

send(SMTP, “MAIL

FROM: <$mailFrom>\n”,0);

print “>MAIL FROM:<$mailFrom>\n”;

recv(SMTP, $buffer, 200, 0);

print “$buffer\n”;

send(SMTP, “RCPT

TO: <$MailTo>\n”,0);

print “>RCPT TO: <$MailTo>\n”;

recv(SMTP, $buffer, 200, 0);

print “$buffer\n”;

send(SMTP, “DATA\n”,0);

print “>DATA\n”;

recv(SMTP, $buffer, 200, 0);

print “$buffer\n”;

send(SMTP, “From:

Kris Kaspersky\n”, 0);

print “>From: Kris Kaspersky”;

print “\n\n”;

send(SMTP, “Subject: Test\n”, 0); ·

print “>Subject: Test\n”;

send(SMTP, “Hello,

KPNC!\n”, 0);

print “>Hello, KPNC!\n”;

send(SMTP, “\r\n.\r\n”,0);

print “\r\n.\r\n”;

recv(SMTP, $buffer, 200, 0);

print “$buffer\n”;

send(SMTP, “QUIT\n”,0);

print “>QUIT\n”;

recv(SMTP, $buffer, 200, 0);

print “$buffer\n”;

close(SMTP);

Наведений приклад дозволяє відіслати тільки один лист за вказаною

адресою. Насправді ж, якщо програма може відправити одного

лист, то зуміє і десять, варто тільки доповнити її циклом (Наприклад,

нескінченним :-).

Скрипт необхідно розмістити на сервері, який підтримує

віддалене виконання програм, дозволяє telnet-вхід, має в

наявність інтерпретатор Perl і допускає установку з’єднань з

іншими вузлами мережі. Зазначеним вимогам задовольняє,

наприклад, hobbiton.org і деякі інші безкоштовні сервера.

Для розміщення скрипта на сервері найкраще скористатися

ftp-протоколом (детальніше про те, як це зробити розказано в

статті “Десять уроків мережевого хака”), а запустити його з telnet-сесії

найпростіше так: “perl імяфайла.pl”.

Для полегшення розуміння цей приклад не має жодних змінюваних

настоянок і всі дані прописані безпосередньо в тілі програми.

Заголовок листа, відправленого з її допомогою на ящик “kpnc@aport.ru”

(Або за будь-якого іншого адресою) повинен виглядати приблизно

так:

From kpnc@aport.ru

Mon Jun 05 11:51:53 2000

Received: from hobbiton.org ([216.161.239.42] helo=kpnc)

by hearst.mail.ru with smtp (Exim 3.14 #3)

id 12yrfs-000KGD-00

for KPNC@APORT.RU; Mon, 05 Jun 2000 11:51:53 +0400

From: Kris Kaspersky

Subject: Test

Message-Id: < E12yrfs-000KGD-00@hearst.mail.ru >

Date: Mon, 05 Jun 2000 11:51:53 +0400

У заголовку міститься IP-адреса сервера, який виконав

скрипт (він виділений жирним шрифтом), але немає ніякої інформації

про справжнє відправника цього повідомлення (за винятком

даних, які він побажав залишити сам). Трохи вдосконаливши

запропоновану програму, можна побудувати власний анонімайзер,

дозволяє його творцеві (а, можливо, і іншим користувачам)

розсилати анонімні повідомлення і при цьому гарантовано залишатися

анонімом.

Однак технічно можливо фіксувати IP-адреси всіх користувачів,

підключилися до hobbiton.org (так, так, власне, і відбувається,

– Цей сервер веде протоколи всіх дій користувача) і запустили

скрипт розсилки на виконання. Тому, відправнику, які прагнуть

залишитися абсолютно невідомим, необхідно знайти такий сервер,

який би не вів ніяких протоколів. Інше рішення полягає

у використанні кількох десятків вузлів, послідовно пересилають

скрипт (або команду на його виконання) один одному. Якщо хоча б

один з вузлів цього ланцюжка не реєструє всіх підключень, то

встановити відправника виявиться неможливо.

Крім приховування анонімності відправника, скрипт може використовуватися

для фальсифікації (або знищення) заголовків листів. Наприклад,

можна створити видимість, що сервер, що відправив лист, всього

лише транзитний вузол пересилання, а “справжній” занесений

зовсім – зовсім в іншому місці.

Для цього досить вставити в заголовок одне (або декілька)

полів “Received”, наприклад, так “Received: from mail.pets.ja”

(Звичайно, це дуже груба підробка, але як приклад цілком

зійде). Модифікований варіант скрипта відрізняється від оригінальної

програми такими рядками:

send(SMTP, “Received:

from mail.pets.ja\n”, 0);

print “>Received: from mail.pets.ja”;

Заголовок листа, відправленого за його допомогою, має виглядати

приблизно так:

From kpnc@aport.ru

Thu Apr 06 10:57:30 2000

Received: from [209.143.154.93] (helo=kpnc)

by camel.mail.ru with smtp (Exim 3.02 #107)

id 12d6EL-000NmZ-00

for KPNC@APORT.RU; Thu, 06 Apr 2000 10:57:30 +0400

Received: from mail.pets.ja

From: Kris Kaspersky

Subject: Test

Message-Id: < E12d6EL-000NmZ-00@camel.mail.ru >

Bcc:

Date: Thu, 06 Apr 2000 10:57:30 +0400

Проаналізувавши рядок, виділений жирним шрифтом, одержувач,

швидше за все, вирішить, що лист прийшов з сервера mail.pets.ja,

і навряд чи зверне увагу на ретранслятори, що знаходяться вище.

Виявлення справжнього одержувача можна значно утруднити, якщо

не класти листа безпосередньо в поштову скриньку клієнта, а пересилати

його через кілька транзитних серверів. Якщо задіяти кілька

десятків вузлів і вкласти в лист декілька десятків підроблених

рядків “Received”, то встановити справжнього відправника повідомлення

стане практично неможливо, вірніше сказати, недоцільно.

Проте груба підробка заголовка полегшує виявлення фальсифікованих

полів. Основні помилки, за якими легко впізнається підроблення, наступні:

зазначених адрес серверів взагалі не існує в природі; стиль

заповнення сервером поля “Received” відрізняється від використовуваного

зловмисником; реальний час пересилання листів сервером на порядок

нижче (або вище), ніж це випливає з заголовка листа.

Тому, мало мати зразки заповнення “Received” кожним з вузлів

– Необхідно з’ясувати середні затримки в доставці повідомлень. Ще

більш складно розібратися з алгоритмом генерації ідентифікаторів,

додаються більшістю транзитних серверів до заголовку листа

для уникнення його зациклення. Такий ідентифікатор унікальний для

кожного сервера і не може представляти абсолютно випадкове значення,

оскільки, в тоді б існувала можливість повторної видачі

одного і того ж ідентифікатора, що неприпустимо.

Забезпечити унікальність допомагає прив’язка до часу пересилання

письма. Деякі алгоритми генерації ідентифікатора дозволяють

його звернути і дізнатися час, коли він був виданий. Це дозволяє

виявити підроблені ідентифікатори, а разом з ними і підроблені

поля в заголовку листа.

Причому за “зовнішнім виглядом” ідентифікатора важко (неможливо)

сказати яким чином він був отриманий. Для цього необхідно вивчити

вихідні тексти сервера (якщо вони доступні) або дизасемблювати

машинний код (якщо вихідні тексти поза досяжністю). У наступному

заголовку наведені приклади двох ідентифікаторів. Зрозуміло,

візуально нічого не можна сказати про те, як вони були отримані:

From owner-sf-news@securityfocus.com

Wed Sep 06 03:00:03 2000

Received: from lists.securityfocus.com ([207.126.127.68])

          by

hearst.mail.ru with esmtp (Exim 3.14 #4)

          id

13WRh6-000LBx-00; Wed, 06 Sep 2000 02:59:57 +0400

Received: from lists.securityfocus.com (lists.securityfocus.com

[207.126.127.68])

          by

lists.securityfocus.com (Postfix) with ESMTP

          id

E62DC1EF74; Tue, 5 Sep 2000 15:58:34 -0700 (PDT)

Received: from LISTS.SECURITYFOCUS.COM by LISTS.SECURITYFOCUS.COM

             (LISTSERV-TCP/IP

release 1.8d) with spool id 13121453 for

             SF-NEWS@LISTS.SECURITYFOCUS.COM;

Tue, 5 Sep 2000 15:58:31 -0700

Approved-By: se@SECURITYFOCUS.COM

Втім, малоймовірно, щоб одержувач мав кваліфікацією,

достатньою для проведення аналізу подібного рівня. І більшість

користувачів можна ввести в оману навіть грубою підробкою

заголовка.

Анонімне отримання кореспонденції

При отриманні пошти звичайним способом сервер визначає (а деяких

випадках і запам’ятовує) IP-адреса підключився клієнта. Але іноді

одержувачу небажано розкривати свою адресу, навіть якщо він динамічний.

Провайдер, виділяючи абоненту IP, запам’ятовує (може запам’ятовувати)

час, в який він був виданий і ім’я користувача, якому він

був виданий. Тому, існує теоретична можливість встановити

особу одержувача листа.

Для збереження повної анонімності можна скористатися спеціально

розробленим скриптом, який читає кореспонденцію і викладає

її на який-небудь анонімний ftp-сервер. Це дозволяє вбити відразу

двох зайців – приховати власну адресу і обійти один з недоліків

POP3 протоколу – відсутність докачки.

Справді, якщо в скриньці лежить повідомлення величезних розмірів,

а зв’язок раз у раз рветься, може знадобитися чималу кількість

спроб, поки, нарешті, лист не потрапить на локальний комп’ютер.

Навпаки, скрипт, що виконується на сервері з швидким каналом,

виконає ту ж операцію за значно менший час, і, виклавши

повідомлення на ftp, значно полегшить клієнтові отримання листа,

оскільки, тепер відпаде необхідність починати процес перекачування

з самого початку після кожного розриву з’єднання.

У наведеному нижче прикладі як альтернативи Perl використаний

мову Python, основні переваги якого – простота й величезна

кількість всіляких бібліотек, що поставляються разом з мовою.

Нижче буде продемонстровано використання однієї з них.

Бібліотека poplib приховує від користувача механізми взаємодії

клієнта з POP3-сервером, і значно спрощує процес програмування.

Мінімально функціональна програма, що читає всі листи, що надійшли

до цього моменту в поштову скриньку, може виглядати так:

#!/usr/local/bin/python

import poplib

print “Python’s Mail client”

print “Connecting…”

M = poplib.POP3(“mail.ru”)

print “Login…”

M.user(“MyLogin”)

print “Password….”

M.pass_(“MyUnpublishedPassword”)

print “Get List of message”

numMessages = len(M.list()[1])

print “Numers of message : “,numMessages

for i in range(numMessages):

for j in M.retr(i+1)[1]:

print j

Ймовірно, єдиною проблемою виявиться пошук сервера з встановленим

інтерпретатором Python. На худий кінець, можна спробувати умастити

вашого адміністратора і вмовити його встановити пітончіка в системі.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*