* 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 명령어를 보고 어떠한 패킷을 스니핑 하고 싶은지 금방 파악 할 수 있을 것이다.



 
저작자 표시 비영리 변경 금지
신고

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 
*/ 
다른곳으로 가져가실 때는 출처를 꼭 밝혀주시기 바랍니다.
저작자 표시 비영리 변경 금지
신고

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

와이어샤크에서 제공하는 기능으로 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 버튼을 눌러주시면 됩니다 ^^
저작자 표시 비영리 변경 금지
신고
  1. hks9999 2011.09.14 22:35 신고

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

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

하지만 오늘 깨달았네요 ㅎ

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



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

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



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

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

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

무선네트워크 카드랑 유선네트워크 카드는 다 되는뎅 vm NIC만 안되염 ㅋㅋ
저작자 표시 비영리 변경 금지
신고
  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 악성 패킷을 필터하는 프로그램도 만들어봐야겠어요 ㅋㅋ
저작자 표시 비영리 변경 금지
신고
  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