packet capture 질문입니다.

powerson의 이미지


안녕하세요.
중간에 bridge로 연결을 하든, TAP 장비를 이용하든 해서 packet을 capture 하려고 합니다. 물론 libpcap, libipq 등을 사용해서 packet capture는 할 수 있는데, 제가 궁금한 것은 libpcap, libipq 등은 TCP reassembly를 지원하지 않기 때문에 capture한 packet list들을 TCP stream으로 어떠한 방법을 사용해서 구성할 수 있는지입니다. libnids를 통해서 할 수 있겠지만, 제가 테스트한 바로는 libnids에서는 일부 TCP 들에 대해서 처리를 못하는 경우가 꽤 발생하는 거 같습니다. 혹시 packet list들을 tcp stream으로 해주는 library라든가, 아님 kernel에서 device driver 등으로 구현할 수 있는 방법들이 있다면, 답변 부탁드리겠습니다.

webispy의 이미지

netfilter 로 가능하지 않을까요?

powerson의 이미지


검색을 하다보니 iptables에서 state match를 이용하면 TCP에 대한 처리를 한다고 해서 적용을 해보았는데, 현재까진 문제가 없었습니다. 그래서 일단 실제로 TCP에 대한 처리를 하는지 살펴보기 위해서 state 처리 코드를 확인해 볼려고 하고 있습니다. webispy님께서 netfilter라고 말씀하신 부분도 같은 맥락이신건가요? 아니면, netfilter를 통해 device driver를 구현해서 처리를 한다는 말씀이신가요? 답변 감사드립니다. ^^

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

kyh1026의 이미지

리눅스에서 netfilter를 이용하는 커널 모듈을 이용하면 패킷을 캡쳐 할 수 있습니다.

static struct nf_hook_ops nfilter={.hook=mywork,
.pf=PF_INET,
.hooknum=NF_IP_NOCAL_IN,
.priority=NF_IP_PRI_FIRST}

IP를 기본으로 들어오는 패킷을 최우선처리하고 처리할때 mywork함수를 호출하라는 내용으로 netfilter를 만들고,

nf_register_hook(&nfilter)로 넷필터 등록이 가능하고,

unsigned int mywork(unsigned int hook_no,
struct sk_buff **pskb,
const struct net_device *dev_in,
const struct net_device *dev_out,
int (*handler)(struct sk_buff*))
hook_no는 후킹위치, pskb 는 sk버퍼를 가리키는 포인터, dev_in, dev_out은 송,수신 디바이스를 가리키는 포인터입니다.

보통 이렇게 해서 mywork에 제어할 내용을 넣어주면 되고요~ ^^

근데 이걸 하려면 일단 리눅스에서 사용하는 sk_buffer에 대해서 아셔야 하고요, wrapping, 커널 모듈에 대해서 아시면

쉽게 하실수 있으실 꺼예요~ ^^

허접한 답변이었지만... 도움이 되었으면 하네요~

모지리의 이미지


쉽지 않은 문제이긴 하지만 번거롭지만 snort 소스를 한번 뒤져 보시는건 어떠실런지..?
직접적인 도움이 되지 못해서 죄송합니다. 그런데 tcp의 경우 큐잉이 되어 어떤 동작을
처리하실려면 오버헤드를 상당히 감수하셔야 될겁니다. 예를 들어 파일 같은 경우말입니다.
이럴 경우 그냥 user app로 처리하시는게 훨씬 절감이 되실거 같기도 합니다.

snort의 경우 user app지만 libipq로 패킷을 직접 받아 들이니 어느정도 원하시는 부분을
얻으실수 있을겁니다.

monovision의 이미지

moblock 이라는 것도 한 번 살펴보세요.
snort 보다 좀 더 단순한 구조를 가지고 있어서 원하시는 부분을 보기에는 더 편할거라고 생각되네요.

powerson의 이미지

앗 감사합니다. 일단, snort는 stream4에서 tcp reassembly를 처리를 하는 것은 알고는 있지만, 제가 이 것만 해야 되는 상황도 아니라서 snort를 분석하고 하는 시간을 줄이고자, 좀더 쉽게 접근할 수 있는 걸 찾고 있는 중입니다. 정 안되면 snort를 분석해야겠지만요. ㅎㅎ 답변 감사합니다. ^^

moblock이란건 찾아봐야겟네요. ^^ 좋은 정보 감사드립니다.

현재까지 시도한건 netfilter extension의 state쪽에 보면, tcp match 부분이 있길래, 이거에 어느정도 기대볼 까 했지만, 테스트해보니, tcp stream에 대한 처리는 이것역시 부족한 것이 좀 많은 거 같네요. 그래서 현재 netfilter hook을 만들어서 처리를 할지 고민중에 잇습니다. ^^ 일단, 이것저것 해보고 결과가 나오면, 말씀드리도록 하겠습니다. 그럼 답변 주신 분들께 감사드립니다. ^^

==
moblock에 대해서 확인 후 수정합니다. moblock은 libipq, libnetfilter_queue 이 두개 중 하나를 선택해서 packet을 capture해주는 놈은 맞습니다만, tcp stream에 대한 reassembly 해주는 기능은 없네요. 이것 역시 iptables의 state 기능을 이용하는 것 이외에는 tcp에 대한 처리가 특별한 것은 없는거 같습니다. 일단, 오늘, 내일 kernel쪽하고, 웹 검색을 해서 netfilter hook에서 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.