如何使用Ruby构建和发送HTTP请求到Tor隐藏服务

时间:2014-02-25 02:34:23

标签: ruby tor

我花了最近几天寻找这个问题的解决方案,虽然有很多半相关问题,但没有一个答案显示成功的用例通过Tor发送成功的HTTP请求使用Ruby的隐藏服务。

在所有答案中似乎都不清楚的一点是Tor浏览器捆绑包如何充当请求的代理。

我尝试了多种攻击途径,最近的尝试是the PHP code here使用Ruby CURL库调整curl请求到隐藏服务。

这是我使用Curb gem的代码,它实现了Ruby的一些libcurl绑定:

require 'curb'

url = 'http://am4wuhz3zifexz5u.onion' #a known, functioning hidden service

c = Curl::Easy.new(url) do |curl| 
  curl.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0" #the user agent string from the most recent version of the tor browser
  curl.verbose = true
end

c.perform
c.inspect

然后我试图通过socksify运行它,使用Tor浏览器包的代理设置指定的IP地址和端口:

$ socksify_ruby 127.0.0.1 9150 tor-test/tor-test.rb

这产生了以下输出:

* Adding handle: conn: 0x7fb1fe195e00
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7fb1fe195e00) send_pipe: 1, recv_pipe: 0
* Could not resolve host: jhiwjjlqpyawmpjx.onion
* Closing connection 0

我尝试的每种方法都产生了类似的结果:隐藏服务的URI无法解析

任何人都可以帮助我或指出正确的方向吗?我觉得,由于Tor浏览器可以通过编程方式连接到隐藏服务,我们都应该能够:)

1 个答案:

答案 0 :(得分:1)

如果你在“curl”-block中设置它,Curl只会使用代理。

例如:

c = Curl::Easy.new() do |curl| 
    curl.proxy_tunnel = true
    curl.proxy_type = Curl::CURLPROXY_SOCKS5 # also available and default Curl::CURLPROXY_HTTP
    curl.proxy_url = '127.0.0.1:9050' # local tor client/proxy
    curl.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0" #the user agent string from the most recent version of the tor browser
    curl.verbose = true
    curl.url = url # your example url
    curl.perform
    curl.inspect
end

不幸的是,curl不使用代理进行主机名解析。换句话说,我找不到强制curl使用代理进行主机名解析的方法。

但你可以试试

#enable socksify debug
Socksify::debug = true

#own try via direct use of socksify and Net::HTTP
uri = URI.parse('http://am4wuhz3zifexz5u.onion/') #a known, functioning hidden service

# some debug stuff - just ignore ;-)
puts uri
puts uri.host
puts uri.port
puts uri.path

res1 = Net::HTTP.SOCKSProxy('127.0.0.1', 9050).start(uri.host, uri.port) do |http| 
    http.get(uri.path)
end