[질문]raw 소켓으로 tcp syn 패킷 전송시 rst 패킷 전송이유

nidle의 이미지

안녕하세요. 우연히 Stealth Scanner 글을 보게되었는데
소스를 실행하다가 의문점이 생겨서 이렇게 글을 올리게되었습니다.

소스: http://hackerschool.org/~research/study/SS_4.htm

위의 글에 있는 소스를 디버깅 해보았습니다. 아래부분에서

sendto( raw_socket, &packet, sizeof(packet), 0x0,(struct sockaddr *)&address, sizeof(address));

syn 패킷을 전송하면 타겟에서 syn, ack 패킷전송 , 수신후 rst패킷전송으로 tcp 3way를 중단하더군요.
글쓰신분도 의도대로 되기는 하는데 소스안에서 rst패킷을 전송하는 부분이 없는듯 한데
왜 자동으로 rst패킷이 타켓으로 보내지는지 궁금합니다.
이렇게 타켓에서 syn, ack 를 받고 rst 를 보내면 raw소켓으로는 tcp 연결을 못하는건가요??

lovemyin의 이미지

우선 RST 패킷은 OS에서 보낸것으로 보이는군요.
그리고 RST 패킷을 수신하면 Reset을 의미하므로 연결이 종료됩니다.
그렇게 때문에 정상적으로 연결이 되지 않구요.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

nidle의 이미지

저도 RST패킷은 커널(?) 에서 보내는 것이 아닐가 생각합니다.
그런데 syn 패킷은 정상패킷이므로 타켓에서도 syn, ack를 보낸것이고
그렇다면 정상적인 3way 인데 커널에서 rst를 보낸 이유가 무엇인지 궁금합니다.
오히려 커널에서 raw소켓으로 sny, ack를 올려주고 다음 행동을 기다리도록 처리해야되는것
아닌가 하는 생각이 들었습니다. 물론 다음 행동이 없으므로 타켓에서는 기다리고 있겠죠...
(글쓰신분도 이렇게 되면 syn flood공격비스무리 하게되므로 rst를 보내서 연결종료를 하도록
의도 하신것 같습니다)
디버깅하면서 패킷을 보았는데 send함수(syn패킷 전송) 이 실행되면 syn, ack 를 받고 자동으로
rst를 보내더군요, 밑에 recive에서는 syn, ack 를보고 포트의 오픈상태를 확인하는정도뿐이니
rst와는 상관없어보이구요..
왜 rst를 보내는 것일까요,,??? 궁금합니다..아직 제가 tcp의 이해가 부족하여 .. ^^
많은 분들의 답변 기다리겠습니다.

익명사용자의 이미지

제목 그대로입니다. syn 패킷은 raw 소켓으로 보내셨고, 이를 받은 시스템에서
syn+ack 로 응답을 해왔을 때 이 패킷을 받은(즉, 최초에 syn을 보낸 시스템)
OS 입장에서는 이유없이 syn+ack 가 날아온것으로 판단할 수 밖에 없습니다.
해서 이를 제거하기 위해 rst 를 보냅니다. 일 예로 리슨하지 않는 포트로의
접속시 (telnet xxx.xxx.xxx.xxx 5647) 해당 포트에 리슨하는게 없으면, rst
를 날려줄겁니다..(ethereal 이나 tcpdump)로 잡아 보세요..
raw 소켓을 이용하여 통신을 하실 생각이신가요? 정확한 용도를 알면 좀 더
조언을 해드릴 수 있을텐데....

nidle의 이미지

tcp에 대해서 공부하면서 raw소켓으로 tcp통신을 직접 동작하도록 하고 있습니다.
소켓 함수들을 사용하면 tcp 연결은 간단히 되지만 막상 bind(), listen(), accept(),connect() 등의
(책에서는 비유를 통한 간단한 설명으로 정확히 어떠한 메카니즘으로 동작하는지 알기 힘드네요)
실제 동작방식을 몰라서 raw소켓으로 tcp를 구현시 어떤 소켓함수를 사용해야되는지 또는 그에 상응하는 동작을
어떻게 구현해야 하는지 잘 모르겠습니다. 몇마디 조언이라도 해주시면 감사하겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.