HTTP Request(ZAP, Burp) Parsing on Ruby code

XSpear 관련해서 이런 건의사항이 하나 있었습니다. Burp, ZAP 등에서 사용하는 패킷 데이터를 파일로 저장한 후 옵션을 주어 읽으면 자동으로 URL, Header 등을 파싱해서 사용하는 형태를 말씀하신 것 같습니다.(마치 sqlmap의 그것 처럼)

간단하게 처리를 위한 로직 작성해서 블로그 글로 남겨둡니다. 실제로 XSpear에 적용하기까진 각종 방어코드도 들어갈 것 같기 떄문에 오늘은 어렵겠네요 😵‍💫

Algorithm

1) 개행문자 단위로 잘라냄 2) 맨 첫줄은 메소드와 URL가 담김

  • 첫줄에선 공백으로 한번 더 잘라서 메소드, Path, HTTP/1.1로 구별 3) 다음줄부터 헤더 영역으로 ‘: ‘ 단위로 잘라냄 4) 잘라낸 데이터의 맨 앞은 헤더이름, 뒤엔 헤더 값이 됨 5) 헤더 값 중 ‘: ‘ 이 포함될 수 있으니 처음 잘린 값만 인지

in the Code

r = "GET https://www.hahwul.com/ HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: _ga=GA1.2.1102548207.1555467144; _gid=GA1.2.1362788908.1563875038
Upgrade-Insecure-Requests: 1
Host: www.hahwul.com"

method = ""
path = ""
headers = {}
switch = true

r.each_line do |line|
  if switch
    temp = line.split(" ")
    method = temp[0]
    path = temp[1]
    switch = false
  else
    temp = line.split(": ")
    hn = temp[0]
    hd = line.sub(hn+": ", "")
    headers[hn] = hd
  end
end

# Burp or ZAP
# http, https로 시작하면 zap 아니면 burp 포맷
url = 0 != (path.index('http://').to_i | path.index('https://').to_i) ? path : headers['Host']+path

puts "URL: "+headers['Host']+path
puts "\n"
puts "Method: "+method
puts "\n"
puts "Path: "+path
puts "\n"
puts "Headers\n"+headers.to_s

Test!

ruby test.rb
URL: www.hahwul.comhttps://www.hahwul.com/

Method: GET

Path: https://www.hahwul.com/

Headers
{"User-Agent"=>"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0\n", "Accept"=>"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\n", "Accept-Language"=>"ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3\n", "Connection"=>"keep-alive\n", "Cookie"=>"_ga=GA1.2.1102548207.1555467144; _gid=GA1.2.1362788908.1563875038\n", "Upgrade-Insecure-Requests"=>"1\n", "Host"=>"www.hahwul.com"}