Post

CLI에서 HTTP RAW REQUEST 해보기

목차


content

“HTTP 완벽 가이드” 라는 책을 보다가 HTTP 연결은 telnet을 통해 가능하다는 이야기가 있어 curl을 통해 raw request를 하는 방법을 생각해보았다.

HTTP

아래 내용을 통해 HTTP Raw Request 연결이 가능하다.

1
echo -en "GET /ip HTTP/1.1\r\nHost: www.iasdf.com\r\n\r\n" | curl "telnet://www.iasdf.com:80"

파일을 하나 만들고

1
2
3
GET /ip HTTP/1.1
Host: www.iasdf.com

이것을 cat으로 출력한 뒤 curl로 리다이렉트 해도 된다.

1
cat test.http | curl "telnet://www.iasdf.com:80"

하지만 패킷을 뜯어보면 \r\n 으로 구분되는 것이 아닌 \n 으로만 구분되는 것을 확인할 수 있다.

따라서 curl 명령어를 좀 바꿔줘야 한다.

cat 명령어에 -A 옵션을 붙이면 라인의 맨 마지막에 $ 문자가 붙는다. 이를 이용해서 \n 문자를 \r\n 문자로 변경해 줄 것이다.

1
2
# 마지막 달러문자를 \r 문자로 변경
cat -A test.http | sed 's/\$$/\r/'

이후 이것을 그대로 curl 요청한다.

1
cat -A test.http | sed 's/\$$/\r/' | curl "telnet://www.iasdf.com:80"

이번엔 제대로 CRLF 문자로 나타나지는 것을 볼 수 있다.

curl - telnet이 아니더라도 netcat (nc) 을 이용해 요청할 수도 있다.

1
echo -en "GET /ip HTTP/1.1\r\nHost: www.iasdf.com\r\n\r\n" | nc www.iasdf.com 80

HTTPS

https는 openssl s_client 를 사용한다.

openssl s_client 에서 -crlf 옵션을 사용하면, LF(\n) 만 있는 내용을 CRLF(\r\n) 으로 변경할 수 있다.

1
2
cat test.http | openssl s_client -keylogfile $HOME/sslkeylog.log -crlf -ign_eof -connect www.iasdf.com:443 <<< EOF
cat -A test.http | sed 's/\$$/\r/' | openssl s_client -keylogfile $HOME/sslkeylog.log -quiet -connect www.iasdf.com:443 <<< EOF

HTTP/2

HTTP/2 는 바이너리 형식의 프로토콜이라 RAW String을 가지고 그대로 요청하는 것에 한계가 있다. (특정한 툴을 사용하거나 HTTP/2 Raw 문자열을 바이너리 형식으로 변경해주는 것을 지원해야 한다.)

따라서 HTTP/2의 경우는 nghttp2 라이브러리의 nghttp 바이너리를 이용하거나 curl의 --http2 옵션을 사용하는 수 밖에 없을 것 같다.

This post is licensed under CC BY 4.0 by the author.