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

Posted

技术标签:

【中文标题】如何使用 Ruby 构建 HTTP 请求并将其发送到 Tor 隐藏服务【英文标题】:How to Build and Send an HTTP Request to a Tor Hidden Service with Ruby 【发布时间】:2014-03-27 01:02:05 【问题描述】:

过去几天我一直在寻找解决这个问题的方法,尽管有很多半相关的问题,但没有一个答案显示通过 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

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

$ 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】:

如果您在“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

【讨论】:

我最终能够使用与您对 Socksify 建议的解决方案类似的解决方案来使其工作。问题的很大一部分是对 Tor 客户端的误解。正确设置 Tor 客户端后,建立连接和解析 .onion 域就很简单了。

以上是关于如何使用 Ruby 构建 HTTP 请求并将其发送到 Tor 隐藏服务的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby 中发送 HTTP/2 POST 请求

在Ruby中发送HTTP / 2 POST请求

如何在 Ruby 中发送 HTTP PUT 请求?

上传照片并将其作为 json 对象发送

Ruby 发送 JSON 请求

如何请求 API 并将其发送到前台