* TCP 헤더 공부 중에 궁금한 점이 있어서 구글링 한 것을 다시 한번 정리하기 위하여 작성!



SIS 공부하면 무조건 공부해야 하는 필수항목 중 하나가 있다.

바로 tcpdump!!! 이 툴 실습을 해보지 않으면 필기에서는 몇문제 정도 틀리고 실기에서는 실무형이나 서술형에서 크나큰 점수를 잃을 수 있기 때문에 SIS 시험을 공부하는 사람이라면 대부분 한번쯤은 다뤄보는 툴이다.

인터넷에 있는 tcpdump 명령어들을 보면 tcp[13] == 2 이러한 명령라인을 봤을 것이다.

난 SIS 시험이 끝났을 때도 이 의미를 모르고 있었다(실기시험에 문제가 안나와서 다행 ㅠㅠ)

하지만 이번에 port scanner 프로젝트를 혼자 진행하면서 TCP 헤더에 대해서 다시 공부하게 되었고, 위 명령어의 의미를 알게 되었다.

일단 저 명령어의 의미는 SYN flag를 뜻한다는 것을 밝혀두고 왜 그런지 한번 알아보도록 하겠다.

아래는 TCP 헤더의 추상적 그림이다.

  
TCP 헤더 그림을 보면 byte offset이 있다. tcp[13]에서 13이란 byte offset을 뜻하는 것이다.

첫번째 source port 영역은 0 ~ 3 offset 이고,

두번째 SequenceNumber 영역은 4 ~ 7 offset 이고,

세번째 Ack Number 영역은 8 ~ 11 offset 이고,

네번째가 12 ~ 15 offset으로 flag가 있는 영역이다.

12 ~ 15 offset 중 13 offset이 TCP flag에 해당하는 번호인 것이다.


tcp[13]을 다시 해석하자면 tcp offset 13번을 뜻하는 것이다.

이제 왜 2가 SYN flag인지 보면, 그림에도 나와있지만 번호가 2로 정해져있다.

이 번호들에 계산방식은 아래와 같다.

그림을 보면 flag들이 C E U A P R S F 순서로 되어 있는데 이 순서는 다음과 같다.

C  E  U  A  P  R  S  F
7   6  5   4  3   2  1  0 


여기서 SYN flag를 선택하면 00000010이 되어 16진수로 바꾸면 2가 되는 것이다.

만약 SYN/ACK flag를 원하면 

00010010이 되어 16진수로 바꾸면 12가 되는 것이다.

결론적으로 tcp[13] == 2는 우리말로 풀어쓰면 아래와 같다.

"tcp헤더의 13 offset에서 SYN flag를 "

해당 그림에도 flag별 번호가 나와 있으니 참고하면 좋겠다.

시험때는 외워가는 것이 남는 것이기 때문에 외워두면 tcpdump 명령어를 보고 어떠한 패킷을 스니핑 하고 싶은지 금방 파악 할 수 있을 것이다.



 
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

http://maj3sty.tistory.com/594

위 주소에서 소개한 바 있는 프로그램 소스를 공개합니다.

위 글에서 알려드렸던 취약점이 패치된 듯 하여 공개하게 됬습니다.

제작언어 : C

환경 : Window XP SP3

참고사항 : 다운로드 프로그램이 아닌 주소 확인 프로그램이며, 동영상 링크가 온전한지 아닌지 판단 기능은 없습니다.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <winsock2.h> 

#define BUFSIZE 1024 

int main(int argc, char **argv) 
{ 
    WSADATA wsaData; 

    char getHead[]={"GET http://news.naver.com/vod/mms.nhn?office_id="}; 
    char getHead2[]={"&article_id="}; 
    char getFoot[]={" HTTP/1.1\r\n"\ 
        "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*\r\n"\ 
        "Accept-Language: ko\r\n"\ 
        "UA-CPU: x86\r\n"\ 
        "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)\r\n"\ 
        "Host: news.naver.com\r\n"\ 
        "Proxy-Connection: Keep-Alive\r\n"\ 
        "Cookie: nvad_lc=LD,4215000000; NB=G4ZDQOJQGM2DGNZZ; NNB=4UV3GRHN3B7UU; npic=1AjjNYpfgvTZELF1iY62HOuQX7Kfldi8mSfFK3fdbQL5Zdd3gEDM8o6JNyN3ur2+CA==\r\n\r\n"}; 
    char recvms[BUFSIZE]=""; 

    int i, recvlen; 
    int headLen, footLen, headLen2; 
    char *test; 
    SOCKET c_socket; 
    struct hostent *host; 

    SOCKADDR_IN servAddr; 

    if(argc!=3) 
    { 
        printf("Usage : *.exe <office_id> <article_id>\n"); 
        exit(1); 
    } 

    printf("네이버 뉴스 동영상 주소 확인 프로그램\n"); 

    if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) 
        printf("WSAStartup error!!\n"); 
     
     
     
    host=gethostbyname("news.naver.com"); 

    if(!host) 
    { 
        printf("host() error\n\n"); 
        exit(1); 
    } 

    memset(&servAddr, 0, sizeof(servAddr)); 
    servAddr.sin_family=AF_INET; 
    servAddr.sin_addr.s_addr=((IN_ADDR*)host->h_addr_list[0])->s_addr; 
    servAddr.sin_port=htons(80); 

    headLen = strlen(getHead); 
    footLen = strlen(getFoot); 
    headLen2 = strlen(getHead2); 

    for(i=0; i<=0; i++) 
    { 
        c_socket=socket(PF_INET, SOCK_STREAM, 0); 
        if(c_socket == -1) 
        { 
            printf("socket() error\n\n"); 
            i--; 
            continue; 
        } 

        if(connect(c_socket, (SOCKADDR*)&servAddr, sizeof(servAddr))==-1) 
        { 
            printf("connect error()\n\n"); 
            i--; 
            continue; 
        } 

        test = (char*)malloc(headLen+footLen+headLen2+strlen(argv[1])+strlen(argv[2])+1); 
        strcpy(test,getHead); 
        strcat(test,argv[1]); 
        strcat(test,getHead2); 
        strcat(test,argv[2]); 
        strcat(test,getFoot); 

        send(c_socket, test, strlen(test), 0); 
         
        recvlen=recv(c_socket, recvms, BUFSIZE-1, 0); 
        recvms[BUFSIZE] = 0; 

        system("cls"); 
        printf("%s\n\n",recvms); 
        printf("\n\n"); 
        printf("mms주소를 복사하여 넷 트랜스포트와 같은 프로그램으로 동영상을 다운 받으시면 됩니다.\n"); 
        printf("made by MaJ3stY\n"); 
         
        free(test); 
        closesocket(c_socket); 
    } 
     
    return 0; 
} 

/* 

  네이버 뉴스 동영상 주소 확인 프로그램. 
  네이버 뉴스위에 있는 office_id, article_id 값을 프로그램에 입력해주면 그 기사에 해당하는 동영상 주소가 나온다. 
  예 : n.c 052 0000194373 
*/ 
다른곳으로 가져가실 때는 출처를 꼭 밝혀주시기 바랍니다.
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

정말 간단한 건데도 개인적으로는 반드시 알고 있어야 하는 스킬중에 하나라고 생각이 드네요.

와이어샤크에서 제공하는 기능으로 pcap파일에서 파일을 추출해 보는 기능을 소개 해 드리겠습니다.

예제는 hack-me.org 사이트 문제로 하겠습니다.

http://hack-me.org/index.php?p=challs&prob=Extract+file+from+pcap

위 주소로 접속하면 문제를 다운받으실 수 있는데, 그냥 다운로드 누르시면 웹에서 열려버립니다.

로컬로 다운받으시기 위해서는 인터넷 임시파일 폴더에서 로컬로 끌어놓으시면 되요 ^^

자 그럼 시작해보죠 ㅎ

해당 파일을 아래와 같이 와이어샤크로 오픈 합니다.



와이어샤크 탭들 중에

[file] -> [Export] -> [Object] -> [http] 로 가시면 아래와 같이 해당 pcap 패킷들 중에 파일에 접근한 기록을 찾아 파일만 따로 리스트화 해줍니다.


이 pcap 파일에는 prob4 파일이 숨겨져 있네요. 저 파일이 본 문제겠죠.

저장은 Save As 버튼을 눌러주시면 됩니다 ^^
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. hks9999 2011.09.14 22:35 신고

    감사해요 덕분에 잘 배워갑니다 ^^

예전에 아시는분이 Winpcap으로 플밍을 하면 재밌다고 하셨는데 그때는 사실 와닿지 않았습니다.

하지만 오늘 깨달았네요 ㅎ

라이브러리를 불러오고 레퍼런스 보면서 짜기만 하면 되니 이것처럼 편한게 어딨을까요 ㅋ



따로 캡쳐한 패킷들을 txt파일로 남기는 기능을 구현하려고 했는데 구현하다보니 소스가 너무 길어져서 뺐어요 ㅋㅋ

역시 C는 소스가 너무 길게 되서 탈.. ㅋㅋㅋ



만들게 된 계기는 vmnet이 꼬여서 패킷을 보려고 ... ㅋㅋㅋㅋ

전 주로 패킷 볼 때 와이어샤크 쓰는데 vmnet을 캡쳐하면 프로그램이 죽어버리더라구요.

이게 왜 그런지 아시는분은 알려주세요... ㅠㅠ

무선네트워크 카드랑 유선네트워크 카드는 다 되는뎅 vm NIC만 안되염 ㅋㅋ
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. Favicon of http://mupa.tistory.com BlogIcon mupa 2009.12.31 00:56 신고

    제 홈피에 답글보고 여기 까지 왔습니다..그러고보니 동종업계였네요..
    Winpcap이라 처음보는건데 그렇게 편한가요??ㅎㅎㅎ

    전 여행 끝나고 2년만에 책상앞에 앉으니 좀 갑갑합니다..
    기초부터 다시 공부해야할듯....흑...ㅜㅜ
    그럼 담에 또 놀러 오겠습니다~~~^^

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2009.12.31 12:24 신고

      ㅎㅎㅎ 방문 감사합니다 ^^

      소켓하고 비슷한건데 라이브러리가 다 있어서 개발환경에

      라이브러리만 추가시켜주고 불러와서 쓰시면 되요 ㅎㅎ

      저도 군대다녀오면 무파님처럼 갑갑하겠죠 ㅠㅠ??

      그럼 다음에 또 뵈요 ^^

심심해서 만들어본건데 효과는 100% ㅋㅋㅋ

실험대상은 VM XP

맨날 테스트 당하는 불쌍한 실험 OS ㅋㅋㅋ



정상적으로 UDP패킷을 보내면 attack!! 메시지가 뜨도록 해놨는데 아주 잘 가고 있다.


VM 네트워크 상태를 보면 그래프가 요동치는 것을 볼 수 있다.

실제로 VM내부에 마우스 조차 움직이지 않는 상황 ㅡㅡ;;

단 한개의 프로세스로 돌렸을 뿐인데 이정도다.

만일 리눅스에서 fork함수로 좀비 프로세스를 만들어서 조금 성능이 좋은 데스크탑 컴퓨터에서 돌린

다면 어떤일이 일어날까, 또 CreateProcess 함수로 윈도에서 프로세스들을 무자비하게 생성해 보

낸다면 어떻게 될까.

상상만해도 무섭다 ㅋㅋㅋ

시간이 나면 CreateProcess 함수로 프로세스를 많이 생성해 해봐야겠다 ㅋㅋ

또 UDP 악성 패킷을 필터하는 프로그램도 만들어봐야겠어요 ㅋㅋ
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. khuti 2009.11.12 13:45 신고

    UDP... 정말 무섭죠 ㅎㅎ;
    잠깐 들렸다 갑니다~

  2. Favicon of http://sun2day.tistory.com BlogIcon Sun2Day 2009.11.12 15:53 신고

    방어하는건.. 그냥 나와있는 방화벽들을 사용해보는게 좋지 않을까요?? ㅇ_ㅇ?;;

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2009.11.12 15:58 신고

      방화벽 쓰는것도 좋지만 전 공부하는겸 해서 만들어보려구요 ㅎㅎ

  3. binoopang 2009.11.12 19:00 신고

    예전에 .. 실수로 무한루프에 fork()를 썼다가 1초만에 시스템 뻣는걸 경험한 적이 있습니다 ㅎㄷㄷ

  4. 2010.06.05 20:18

    비밀댓글입니다

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2010.06.12 17:05 신고

      음... 보여드리고 싶지만 소스가 집에 ㅎㄷㄷ

      그리고 소스가 조금 길어서 ㅠㅠ ㅋㅋ

+ Recent posts

티스토리 툴바