ipq를 이용한 패킷 변조

kealyung의 이미지

ipq를 이용해서 패킷 변조를 테스트를 하고 있습니다.

현재까지의 진행은

패킷의 길이가 변동이 없는 구조는 잘 작동합니다.

문제가 패킷의 길이가 5바이트 왔을때 제가 추가로 10바이트를 보냈을경우에

10바이트는 받는 거 같은데 다시 보내질 못하는 현상이 발생하고 있습니다.

대략적인 구성입니다.

클라이언트 (telnet을 이용)
에코서버(받은 패킷을 전송)
ipq_test(ipq를 받아서 패킷 변조)

클라이언트(telnet) iqp 에코서버
aaaaa ----> bbbbbbbbbb ----> bbbbbbbbb
aaaaa <-------------------------- bbbbbbbbb (x)

제가 패킷을 추가하는 과정에서 변경한 부분은 checksum을 다시
계산해서 처리를 하였습니다.

이 외에도 다른 처리를 해야 할 부분이 있는지요?

gilgil의 이미지

seq, ack 값을 재계산해 줘야 합니다.
송신자 - 중간자 - 수신자
에서 중간자에서 data크기를 n 옥텟 변경했을 경우
송신자 > 수신자 TCP packet의 seq를 n 증가시켜 줘야 하고
수신자 > 송신자 TCP packet의 ack도 n 증가시켜 줘야 합니다.

이후 TCP flow에서도 계속해서 적용해야 하므로, 중간자에서 TCP flow를 관리해야 합니다.

https://github.com/gilgil1973/snoop90/blob/master/include/process/snoopdatachange.cpp
에 있는 void SnoopDataChange::change(SnoopPacket* packet) 함수를 참고하시기 바랍니다.

kealyung의 이미지

정말 많은 도움 되었습니다.

kealyung의 이미지

패킷 변경 관련하여 알려주신대로 해보았는데 ..

생각보다 쉽지 않네요.

아래는 테스트 로그입니다.

OLD 패킷은 중간자가 받은 패킷이고..NEW 패킷은 중간자가 패킷을 바꾼 상태입니다.

ip헤더 + tcp헤더등을 출력해 봤습니다.

송신자가 aaaaaa\n을 보내고 있고..

중간자가 받아서 bbbbbbbbbb로 변경하는 데이타 입니다.

로직에서 변경한 부분은 패킷길이(앞에서 4번째인 3c ---> 3e로 변경:2바이트 증가)를 변경하였고,

뒤에 데이타를 bbbbbbbb로 변경한 case입니다.

이때 seq 값은 이 패킷 전송 전의 TCP 커넥션에서 받은 SEQ, ACK이기 때문에 변경을 하면

안되는거 아닌가요?

그래서 SEQ 변경 없이 그대로 패킷을 보냈고..

[2014/05/21 10:59:01] ************ OLD PACKET ********************
[2014/05/21 10:59:01] ------------------------------------------------------------------------------
[2014/05/21 10:59:01] offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF
[2014/05/21 10:59:01] ------------------------------------------------------------------------------
[2014/05/21 10:59:01] 0x0000 45 10 00 3c 3b 7d 40 00 40 06 9c 08 96 17 1b 7c E..<;}@.@......|
[2014/05/21 10:59:01] 0x0010 96 17 1b 7c cc e1 2e e3 7e 0a 02 35 02 ea c6 a1 ...|....~..5....
[2014/05/21 10:59:01] 0x0020 80 18 01 01 b8 13 00 00 01 01 08 0a 2b 66 53 97 ............+fS.
[2014/05/21 10:59:01] 0x0030 2b 66 39 50 61 61 61 61 61 61 0d 0a +f9Paaaaaa..
[2014/05/21 10:59:01] ------------------------------------------------------------------------------

[2014/05/21 10:59:01] ************ NEW PACKET ********************
[2014/05/21 10:59:01] ------------------------------------------------------------------------------
[2014/05/21 10:59:01] offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF
[2014/05/21 10:59:01] ------------------------------------------------------------------------------
[2014/05/21 10:59:01] 0x0000 45 10 00 3e 3b 7d 40 00 40 06 9b 06 96 17 1b 7c E..>;}@.@......|
[2014/05/21 10:59:01] 0x0010 96 17 1b 7c cc e1 2e e3 7e 0a 02 35 02 ea c6 a1 ...|....~..5....
[2014/05/21 10:59:01] 0x0020 80 18 01 01 fd 53 00 00 01 01 08 0a 2b 66 53 97 .....S......+fS.
[2014/05/21 10:59:01] 0x0030 2b 66 39 50 62 62 62 62 62 62 62 62 62 62 +f9Pbbbbbbbbbb
[2014/05/21 10:59:01] ------------------------------------------------------------------------------

여기까지는 제가 보기엔 문제가 없는거 같고..

이제 아래에 보면 수신자가 송신자에게 ACK를 보내는 패킷인데..

ACK 값이 기존 SEQ(7e 0a 02 35) + 패킷길이 10(0A)를 더한 값인

ACK(7e 0a 02 3f) 값을 보내고 있는 상황입니다.

ACK 값도 기존 SEQ + 받은 길이이므로 문제가 없는거 아닌가요?

그런데 왜 ACK값을 바꿔야 하는지요?

전에 알려주신 내용을 보면..
중간자에서 data크기를 n 옥텟 변경했을 경우
송신자 > 수신자 TCP packet의 seq를 n 증가시켜 줘야 하고
수신자 > 송신자 TCP packet의 ack도 n 증가시켜 줘야 합니다.
이 부분도 강제적으로 변경을 해보았지만.. 변경된 패킷에서 seq를 강제적으로 증가를 시켰더니..
수신자에서 받지도 못하는 상황입니다.

[2014/05/21 10:59:01] ************ OLD PACKET ********************
[2014/05/21 10:59:01] ------------------------------------------------------------------------------
[2014/05/21 10:59:01] offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF
[2014/05/21 10:59:01] ------------------------------------------------------------------------------
[2014/05/21 10:59:01] 0x0000 45 00 00 34 ff f3 40 00 40 06 d7 a9 96 17 1b 7c E..4..@.@......|
[2014/05/21 10:59:01] 0x0010 96 17 1b 7c 2e e3 cc e1 02 ea c6 a1 7e 0a 02 3f ...|........~..?
[2014/05/21 10:59:01] 0x0020 80 10 01 00 ce f8 00 00 01 01 08 0a 2b 66 53 a0 ............+fS.
[2014/05/21 10:59:01] 0x0030 2b 66 53 97 +fS.
[2014/05/21 10:59:01] ------------------------------------------------------------------------------
[2014/05/21 10:59:01] ************ NEW PACKET ********************
[2014/05/21 10:59:01] ------------------------------------------------------------------------------
[2014/05/21 10:59:01] offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF
[2014/05/21 10:59:01] ------------------------------------------------------------------------------
[2014/05/21 10:59:01] 0x0000 45 00 00 34 ff f3 40 00 40 06 d7 a9 96 17 1b 7c E..4..@.@......|
[2014/05/21 10:59:01] 0x0010 96 17 1b 7c 2e e3 cc e1 02 ea c6 a1 7e 0a 02 41 ...|........~..A
[2014/05/21 10:59:01] 0x0020 80 10 01 00 ce f6 00 00 01 01 08 0a 2b 66 53 a0 ............+fS.
[2014/05/21 10:59:01] 0x0030 2b 66 53 97 +fS.
[2014/05/21 10:59:01] ------------------------------------------------------------------------------

지금 현재 에러의 증상은 아래처럼 계속적으로 Queue에 데이타가 반복적으로 쌓이는 문제가 있습니다.
패킷 데이타가 변경이 없으면 아래의 증상은 보이지 않는 상태입니다.

[2014/05/21 10:59:02] ************ OLD PACKET ********************
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] 0x0000 45 10 00 3c 3b 7e 40 00 40 06 9c 07 96 17 1b 7c E..<;~@.@......|
[2014/05/21 10:59:02] 0x0010 96 17 1b 7c cc e1 2e e3 7e 0a 02 35 02 ea c6 a1 ...|....~..5....
[2014/05/21 10:59:02] 0x0020 80 18 01 01 9c f9 00 00 01 01 08 0a 2b 66 54 61 ............+fTa
[2014/05/21 10:59:02] 0x0030 2b 66 53 a0 61 61 61 61 61 61 0d 0a +fS.aaaaaa..
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] ************ NEW PACKET ********************
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] 0x0000 45 10 00 3e 3b 7e 40 00 40 06 9b 05 96 17 1b 7c E..>;~@.@......|
[2014/05/21 10:59:02] 0x0010 96 17 1b 7c cc e1 2e e3 7e 0a 02 35 02 ea c6 a1 ...|....~..5....
[2014/05/21 10:59:02] 0x0020 80 18 01 01 e2 39 00 00 01 01 08 0a 2b 66 54 61 .....9......+fTa
[2014/05/21 10:59:02] 0x0030 2b 66 53 a0 62 62 62 62 62 62 62 62 62 62 +fS.bbbbbbbbbb
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] ************ OLD PACKET ********************
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] 0x0000 45 00 00 40 ff f4 40 00 40 06 d7 9c 96 17 1b 7c E..@..@.@......|
[2014/05/21 10:59:02] 0x0010 96 17 1b 7c 2e e3 cc e1 02 ea c6 a1 7e 0a 02 3f ...|........~..?
[2014/05/21 10:59:02] 0x0020 b0 10 01 00 96 cc 00 00 01 01 08 0a 2b 66 54 62 ............+fTb
[2014/05/21 10:59:02] 0x0030 2b 66 54 61 01 01 05 0a 7e 0a 02 35 7e 0a 02 3f +fTa....~..5~..?
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] ************ NEW PACKET ********************
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] offset 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF
[2014/05/21 10:59:02] ------------------------------------------------------------------------------
[2014/05/21 10:59:02] 0x0000 45 00 00 40 ff f4 40 00 40 06 d7 9c 96 17 1b 7c E..@..@.@......|
[2014/05/21 10:59:02] 0x0010 96 17 1b 7c 2e e3 cc e1 02 ea c6 a1 7e 0a 02 41 ...|........~..A
[2014/05/21 10:59:02] 0x0020 b0 10 01 00 96 ca 00 00 01 01 08 0a 2b 66 54 62 ............+fTb
[2014/05/21 10:59:02] 0x0030 2b 66 54 61 01 01 05 0a 7e 0a 02 35 7e 0a 02 3f +fTa....~..5~..?
[2014/05/21 10:59:02] ------------------------------------------------------------------------------

설명하기가 넘 어렵네요.

읽어주셔서 감사합니다.

gilgil의 이미지

이런 내용의 질문은 text로 ctrl+c, ctrl+v하는 방법은 그리 좋지 않습니다.
눈으로 ethernet이 어디고, ip가 어디고, tcp가 어디고... 일일이 찾아 가야 하는 건 분석하기가 어렵죠.

제일 좋은 방법은 pcap file을 가지고 얘기하는 것이 질문자나 답변자에게 용이합니다.
그림이나 동영상을 첨부하면 더욱 좋겠구요.
물론 pcap file을 저장할 때, 부정확한 checksum 표시가 나타나지 않도록 offload 기능도 빼 주는 것도 참고하시기 바랍니다( http://www.gilgil.net/17483 ).

kealyung의 이미지

많은 도움 되었습니다..

감사합니다.

gilgil의 이미지

TCP나 UDP는 checksum 계산을 할 때 data(payload)값을 전부 다 참조를 해야 하는데,
이번과 같은 경우(seq나 ack 값 등 일부만 변경이 된 경우)는 전부 다 볼 필요는 없고, 수정된 부분만 가지고 변경을 시켜 줄 수도 있습니다.
이는 ip, tcp, udp 등 모든 checksum 계산 방식에 사용이 됩니다.

https://github.com/gilgil1973/snoop90/blob/master/include/parse/snoopip.cpp > recalculateChecksum 함수를 참고하시기 바랍니다.

pak2536의 이미지

단순히 ACK, SEQ만 증가시키면 window에서 걸릴 수 있습니다.
이 문제는 생각보다 복잡합니다. 그냥 투명 프록시를 쓰는게 가장 속편할 수 있습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.