401 字
2 分鐘
【30天學習新語言-Ruby】Day 4:使用 HTTP 請求偵測 Web 服務狀態
💡 為什麼要會 HTTP 偵測?
在做滲透測試的時候,只知道 port 開著還不夠, 我們還需要知道這個 port 上跑的是什麼服務, 特別是 Web 服務,因為 Web 通常是攻擊面最大的地方。
今天會用 Ruby 的 net/http
來偵測目標是否為 HTTP/HTTPS 服務,
並且抓取一些基本資訊,像是 Server Header、回應狀態碼等等,
這些資訊對後續的滲透測試都很有幫助。
🎯 大綱
- 學會使用
net/http
發送 HTTP 請求 - 偵測服務是 HTTP 還是 HTTPS
- 抓取 HTTP Response Headers
- 處理連線錯誤和逾時
📚 知識點
require 'net/http'
— Ruby 內建的 HTTP 客戶端URI.parse(url)
— 解析 URL 字串Net::HTTP.get_response()
— 發送 GET 請求response.code
— 取得 HTTP 狀態碼response.each_header
— 遍歷所有 headersTimeout.timeout()
— 設定連線逾時
💻 實作
require 'net/http'require 'uri'require 'timeout'
def check_web_service(target, port) protocols = ['http', 'https']
protocols.each do |protocol| begin url = "#{protocol}://#{target}:#{port}" uri = URI.parse(url)
# 設定 5 秒逾時 Timeout.timeout(5) do response = Net::HTTP.get_response(uri)
puts "#{url} is alive!" puts " Status Code: #{response.code}" puts " Server: #{response['server']}" if response['server'] puts " Content-Type: #{response['content-type']}" if response['content-type']
# 列出其他有趣的 headers interesting_headers = ['x-powered-by', 'x-aspnet-version', 'x-generator'] interesting_headers.each do |header| if response[header] puts " #{header}: #{response[header]}" end end
return true end rescue Timeout::Error puts "#{url} timeout" rescue => e puts "#{url} error: #{e.message}" end end
falseend
# 掃描常見的 Web porttargets = { '127.0.0.1' => [80, 443, 8080, 8443, 3000, 5000]}
targets.each do |ip, ports| puts "\nScanning #{ip}..." ports.each do |port| check_web_service(ip, port) endend
🚀 執行方式
- 建立檔案
web_detector.rb
- 執行指令:
ruby web_detector.rb
- 如果有 Web 服務在跑,會看到類似這樣的輸出:
Scanning 127.0.0.1...http://127.0.0.1:80 is alive! Status Code: 200 Server: nginx/1.18.0 Content-Type: text/htmlhttp://127.0.0.1:3000 is alive! Status Code: 200 Server: WEBrick/1.7.0 x-powered-by: Express
【30天學習新語言-Ruby】Day 4:使用 HTTP 請求偵測 Web 服務狀態
https://owld.tw/posts/30天學習新語言-rubyday-4使用-http-請求偵測-web-服務狀態/