如何使用 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 隐藏服务的主要内容,如果未能解决你的问题,请参考以下文章