[SK shieldus Rookies 19기] 5.1. 시스템/네트워크 보안(3) TCP, 3way handshaking, 포트스캔, IP헤더, 스니핑

WoongchiSec·2024년 3월 25일

SK shieldus Rookies

목록 보기
14/23
post-thumbnail

[SK shieldus Rookies 19기] 5.1. 시스템/네트워크 보안(3) TCP, 3way handshaking, 포트스캔, IP헤더, 스니핑

복습

UDP

  • 2byte -> 16bit -> 0 ~ 255365 표현 가능 -> OS 식별 가능 프로그램 -> 왜? 포트 길이가 16biy 라서
  • 출발지 포트, 목적지 포트 : ~에서 ~로 보낸다
    • 중간에 데이터 유실-손실되도 ㄱㅊ은 프로토콜에 많이 사용
    • 게임, 인터넷 스트리밍 방송 응
  • 달랑 주소만 잇음

TCP

  • 목적 : 안정적, 순서대로, 에러없이 전달
    • 연결지향형 프로토콜
    • 3번 왔다갔다해서 연결 -> 데이터 (연결 유지되는 것 : 세션 유지) -> 4번 왔다갔다 연결 정도
    • 저 데이타 안정적 유지되도록 보장 -> GCP
    • 주소뿐 아니라, 시퀀스 넘어, 언논리지먼트 넘버, TCP 플래그
  • 헤더길이 : 가변적 (20바이트 이상)
  • offset 4비트, 남은것 Reserved (나중을 위해 비워둠)

참고: 주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드
https://www.kisa.or.kr/2060204/form?postSeq=12&lang_type=KO&page=1#fnPostAttachDownload

  • 취약점 분석 시 가이드 참고

포트번호

  • 16비트 (0 ~ 65535 : 65535개 표현 가능)
    • 가상적 주소
  • 운영체제가 쓰는 것 -> 응용계층 속하는 프로토콜 -> 고유한 식별자 번호 인식할 때 사용하는 번호

  • TCP 헤더 크기 가변적 => TCP Options 따라 달라짐 -> Offset에서 지정

  • 출발지와 목적지 포트 : 16비트 -> 65,536

  • 일련 번호(sequence number)

    • 전송하는 데이터의 순서를 의미 → 수신측에서 쪼개진 세그먼트의 순서를 파악해서 재조립할 수 있도록 제공
    • 최초로 데이터를 전송할 때는 랜덤한 수로 초기화하고, 이후에는 자신이 보낼 데이터의 1바이트 당 일련번호를 1씩 증가시켜서 데이터의 순서를 표현
  • 확인 or 승인 번호 (knowledgement number)

    • 수신자가 예상하는 다음 일련 번호 의미
    • 데이터 주고 받을 때 -> 상대방 보낸 일련번호 + 자신 받은 데이터 바이트 수 확인 번호로 설정
    • 연결 설정과 연결 해제 과정 -> 상대방이 보낸 일련번호 +1 확인 번호 설정 (핸드쉐이킹 과정에서는 -> 데이터 주고받지 않음)
  • 오프셋

    • 전체 세그먼트 -> 헤더 아닌 데이터 시작 위치 표시
      • 세그먼트 : TCP헤더 + TCP 페이로드
      • 데이터 시작 위치 : TCP 헤더의 끝 -> TCP 헤더의 크기 가변적이므로 필요
  • TCP 플래그

    • : 현재 TCP 세그먼트 속성
    • CWR (Congestion Window Reduced) -> 혼잡 윈도우 크기 감소 신호
    • ECN (Explicit Congestion Notification) -> 혼잡 신호 발생
    • URG (Urgent) -> 긴급 데이터
    • ACK (Acknowledgement) -> 확인 응답 신호
    • PSH (Push) -> 수신측에 데이터 최대한 빠르게 -> 응용프로그램에게 전달
    • RST (Reset) -> 연결 강제로 초기화 요청
    • SYN (Synchronize) -> 연결 생성
    • FIN (Finish) -> 연결 종료
      • SYN, FIN (연결, 해제에서 왔다갔따 하는 건) 데이터 없음 -> 데이터는 연결 이후부터 (데이터에서 왔다갔다할 때)
  • 윈도우 크기

    • : 슬라이딩 윈도우(sliding window) 크기 = 한번에 전송할 수 있는 데이터의 양(크기)
    • 클라이언트 쪽 (내가 서버라구 답함 ㅎㅋ)
  • 오류 검사

    • : 데이터 송수신 중 발생 옹류 검출 위해 사용
  • 긴급 포인트

    • URG 플래그 설정 경우 -> 해당 데이터 우선 처리

TCP 연결 설정 (3-way handshaking)

  • 모든 통신의 시작은 클라이언트
S.P (소스 포트)D.P (데스피테이션 포트 - 목적지?)
8010535
S (싱크 플래그 1로)

수신자 AN = 송신자 SN + Data Size or 1
송신자 AN = 수 SN + ||

-> 확인했다는 의미로 ACK 보냄 -> 다음 번호로

정상적인 트래픽 전송 과정

비정상적인 트래픽이 전송되는 과정

  • IANA(Internet Assigned Numbers Authority) 기구에서 관리
    • 잘 알려진 포트 번호 (Well-known portNumber)
      • 0 ~ 1023번
      • c:\Windows\system32\drivers\etc\services 경로에서 확인 가능
      • 특정 애플리케이션의 사용 위해 ICANN (Internet Corporation for Assigned Names and Numbers)에서 할당한 포트
      • 보통 서버에서 사용
        • 사용하려면 어떤 포트인지 알고 있어야 함
      • ftp 21/tcp #FTP. control
      • ssh 22/tcp #SSH Remote Login Protocol
        - telnet 23/tcp
        - smtp 25/tcp mail #Simple Mail Transfer Protocol
        - domain 53/tcp #Domain Name Server
        - domain 53/udp #Domain Name Server
        - http 80/tcp www www-http #World Wide Web
        - pop3 110/tcp #Post Office Protocol - Version 3
        - https 443/tcp MCom #HTTP over TLS/SSL
        - cmd 514/tcp
    • cf.
      • 우리 회사 서버 -> 우리회사 직원만 사용하도록 하고 싶음 -> 관리자 페이지
      • 더 안전하게 만들기 위해
        • 관리자 페이지 : 더 많은 기능과 권한
        • name 기반 접속보다 IP 기반 접속이 더 안전
          1. 일반 기능과 분리
          1. 내부망 별도 서비스 IP
          1. 접속 시 제한
          1. 잘 알려지지 않은 port
    • 등록된 포트 번호 (Registered port)
      - 1024 ~ 49151
      • 특정 용도로 사용되기 위해 -> 등록된 포트 번호
        • 1433 MSQSQL
        • 3306 MySQL
        • 8080 HTTP (개발용도)
        • ps : Q : 메신저 만들 때 80번 포트 3306 가능 ? -> 기술적으로는 가능 (미실행중일때?) -> 가급적으로는 쓰지 마라(혼란야기)
    • 사설 or 동적 포트 번호(Dynamic port)
      • 49152 ~ 65535
      • 어느 프로그램에서나 사용할 수 있는 포트
헤더(출발지)목적지(수신자, 서버)
S.P(소스포트)D.p. (서버 서비스포트)
송신자포트 -> 유효한(사용하지 않고 있는) 동적 포트 번호가 설정 -> 누가? OS(운영체제)
크롬, 49155 / 8080, 49155 출발지 주소와 목적지 주소 바뀌어서 왔다갔다 -> 이 때 이용하는 게 동적포트

포트 스캔

원격지 호스트 대상 -> 어떤 포트 사용하고 있는지 확인 기법

  • 사용 도구 : nmap : 오픈소스 기반 -> 포트 스캐닝 도구

`kali 및 beebox 가상머신 실행 -> 호스트 PC -> C:\FullStack\run.bat 실행 후 Tomcat 실행

┌──(kali㉿kali)-[~]
└─$ nmap -p 80 bee.box
           ~~~~~ ~~~~~~~ 
            |     +-- 호스트  
            +-- 스캔할 포트 번호 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-24 21:10 EDT
Nmap scan report for bee.box (192.168.40.130)
Host is up (0.0024s latency).

PORT   STATE SERVICE
80/tcp open  http			⇐ 해당 포트로 서비스 중 

Nmap done: 1 IP address (1 host up) scanned in 0.19 seconds


┌──(kali㉿kali)-[~]
└─$ nmap -p 9999 bee.box
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-24 21:11 EDT
Nmap scan report for bee.box (192.168.40.130)
Host is up (0.0043s latency).

PORT     STATE  SERVICE
9999/tcp closed abyss			⇐ 해당 포트로 서비스하지 않음

Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds

(1) 1 연결 요청 시 설정
(2) 0
(3) 0 (시작이니깐)

(4) 1
(6) 1 (연결 요청 확인)
(5) 768 넘어온 SN +1 = 767 + 1

(7) 0 심 플레크 -> 에크 -> 싱크

  • 에크 플래그 : 앞의 싱크를 잘 받았따
  • 심 플래그 -> 심크 에크 플래그 -> 에크
  • 1
    (9) 1 에크니까 1
    (8) 768 시퀀스 넘버 -> 앞의 AN 그대로 -> 다음 전달할 내용 순번

(10) 374 전의 SN + 1 = 373 + 1

TCP 동작

  • 응용 계층에서 페이로드를 생성 -> 전송 전에 3단계 연결 설정을 수행
    • 응용 계층에서 생성한 페이로드를 응용 계층 버퍼에 임시 보관하고 전송 계층에서 SYN 신호를 담은 세그먼트 한 개를 생성
    • SYN 세그먼트는 네트워크 계층, 데이터 링크 계층, 물리 계층을 통과해서 수신지로 전달
    • 수신측에서는 해당 SYN 신호를 전송 계층까지 끌어올린 후 전송 계층에서 SYN/ACK 신호를 담은 세그먼트를 생성해서 송신지로 전달
    • 송신측에서는 해당 SYN/ACK 신호를 전송 계층까지 끌어올린 후 전송 계층에서 ACK 신호를 담은 세그먼트를 생성해서 수신지로 전달해서 3단계 설정을 완료
  • 3단계 연결 설정이 완료되면 운영체제는 응용 계층 버퍼에 저장했던 TCP 페이로드를 전송 계층으로 전달
  • 전송 계층은 응용 계층에서 전달된 TCP 페이로드를 대상으로 단편화(fragmentation) 를 수행
    • 단편화 : 전송 효율성과 데이터 기밀성을 위해 TCP 페이로드를 여러 개로 분할
      하는 기법
  • 단편화 끝 -> 조각난 페이로드 앞에 -> 출발지 포트, 목적지 포트 담은 헤더 -> 여러 개 세그먼트 생성 -> 네트워크 계층 넘어감 -> 각 패킷 생성

IP 헤더

  • : 네트워크 계층 -> 각 세그먼트/데이터그램 앞 IP주소 추가한 것
    • UDP 인 경우 데이터그램
    • TCP 인 경우 세그먼트

  • 일반적 IP헤더 20바이트 크기 사용 (IP Option 항목 이용 -> 21바이트 이상 사용 가능)
  • 서비스 종류(Type of Service)
    • : 해당 패킷 전송 우선 순위 지정 ( 회선 혼잡할 경우 -> 패킷 전홍 우선 순위 부여 시 사용)
      • 패킷 : 헤더 + 페이로드
  • 전체 길이 : IP 헤더 포함 패킷 전체 길이
  • Identification, IP Flags, Fragment Offset : MTU 따른 패킷 분할 정보
    • MTU : Maximum Transmission Unit : 최대 전송 단위
    • IP Flags : 패킷 분할 여부를 표시
      • D : Do not Fragment
      • M : More fraement
    • MTU 1500 바이트 이더넷 구간 -> 1400 바이트 크기 패킷 통과 경우 -> 패킷 분할 없음
IDIP flagsFragment offset
X D M
00 1 00
  • MTU 1500 바이트 이더넷 구간 5900 바이트 크기 패킷 통과 경우 -> 패킷 분할 발생
IDIP flagsFragment offset
X D M
12340 0 10
12340 0 11500
12340 0 13000
12340 0 14500
  • 생존 시간 (TTL, Time To Live)
    • : 해당 패킷 통과할 수 있는 -> 라우터 개수
  • 프로토콜 : 상위 계층 프로토콜 번호 -> 수신 측 해당 패킷 속성 파악 사용
  • 헤더 오류 검사 : 비활성화 상태
  • 출발지 IP주소, 목적지 IP주소 : 32비트 IP 주소

Scapy 이용 3-way Handshaking

  • https://scapy.net/
  • 파이썬으로 제작된 패킷 조작 프로그램
  • 패킷 캡처, 전송, 수정, 디코딩 등의 다양한 기능을 제공

Kali 가상머신에서 실습

┌──(kali㉿kali)-[~]
└─$ sudo scapy                         
[sudo] password for kali: 
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
                                      
                     aSPY//YASa       
             apyyyyCY//////////YCa       |
            sY//////YSpcs  scpCY//Pp     | Welcome to Scapy
 ayp ayyyyyyySCP//Pp           syY//C    | Version 2.5.0
 AYAsAYYYYYYYY///Ps              cY//S   |
         pCCCCY//p          cSSps y//Y   | https://github.com/secdev/scapy
         SPPPP///a          pP///AC//Y   |
              A//A            cyP////C   | Have fun!
              p///Ac            sC///a   |
              P////YCpc           A//A   | To craft a packet, you have to be a
       scccccp///pSP///p          p//Y   | packet, and learn how to swim in
      sY/////////y  caa           S//P   | the wires and in the waves.
       cayCyayP//Ya              pY/Ya   |        -- Jean-Claude Van Damme
        sY/PsY////YCc          aC//Yp    |
         sc  sccaCY//PCypaapyCP//YSs  
                  spCPY//////YPSps    
                       ccaacs         
                                       using IPython 8.14.0
>>> 


>>> ls()				⇐ 지원하는 프로트콜 목록

>>> ls(TCP)				⇐ 현재 설정된 TCP 헤더 정보를 출력
sport      : ShortEnumField                      = ('20')
dport      : ShortEnumField                      = ('80')
seq        : IntField                            = ('0')
ack        : IntField                            = ('0')
dataofs    : BitField  (4 bits)                  = ('None')
reserved   : BitField  (3 bits)                  = ('0')
flags      : FlagsField                          = ('<Flag 2 (S)>')
window     : ShortField                          = ('8192')
chksum     : XShortField                         = ('None')
urgptr     : ShortField                          = ('0')
options    : TCPOptionsField                     = ("b''")
>>> TCP().display()
###[ TCP ]### 
  sport     = ftp_data
  dport     = http
  seq       = 0
  ack       = 0
  dataofs   = None
  reserved  = 0
  flags     = S
  window    = 8192
  chksum    = None
  urgptr    = 0
  options   = ''


>>> TCP().show()
###[ TCP ]### 
  sport     = ftp_data
  dport     = http
  seq       = 0
  ack       = 0
  dataofs   = None
  reserved  = 0
  flags     = S
  window    = 8192
  chksum    = None
  urgptr    = 0
  options   = ''


>>> lsc()				⇐ 사용 가능한 기능 목록 


>>> help(TCP)				⇐ 도움말


>>> help()

Welcome to Python 3.11's help utility!

If this is your first time using Python, you should definitely check out
the tutorial on the internet at https://docs.python.org/3.11/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics".  Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".

help> 

1 현재 설정된 IP 헤더의 정보를 출력

#1 현재 설정된 IP 헤더의 정보를 출력
>>> IP().show()
###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = hopopt
  chksum    = None
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \

>>> ip = IP()
>>> ip.show()
###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = hopopt
  chksum    = None
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \

2 현재 IP 헤더의 목적지 주소를 변경

>>> ip.dst = "192.168.40.130"		⇐ ping bee.box 를 통해서 확인 bee.box 가상머신의 IP 주소
>>> ip.show()
###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = hopopt
  chksum    = None
  src       = 192.168.40.129			⇐ kali.linux 가상머신의 IP 주소
  dst       = 192.168.40.130			⇐ bee.box 가상먼신의 IP 주소
  \options   \


>>> ip = IP(dst="192.168.40.130")
>>> ip.show()
###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = hopopt
  chksum    = None
  src       = 192.168.40.129
  dst       = 192.168.40.130
  \options   \

3 스니핑(sniffing)

>>> sniff()						⇐ 시간이 조금 경과한 후 Ctrl+C
<Sniffed: TCP:20 UDP:784 ICMP:0 Other:1>		⇐ 스니핑 결과를 요약 출력

>>> sf = sniff()					⇐ Ctrl + C 로 중지
>>> sf.show()
0000 Ether / IP / UDP 3.112.113.156:20003 > 192.168.0.143:53955 / Raw
0001 Ether / IP / UDP 18.183.11.144:20003 > 192.168.0.143:57520 / Raw
0002 Ether / IP / UDP 192.168.0.143:57734 > 18.183.11.144:20003 / Raw
			:
2110 Ether / IP / UDP / DNS Ans "b'googlehosted.l.googleusercontent.com.'"
2111 Ether / IP / TCP 192.168.0.143:53808 > 142.250.206.193:https S			⇐ 연결 요청 
2112 Ether / IP / UDP 18.183.11.144:20003 > 192.168.0.143:57734 / Raw
2113 Ether / IP / UDP 3.112.113.156:20003 > 192.168.0.143:53955 / Raw
2114 Ether / IP / UDP 192.168.0.143:57734 > 18.183.11.144:20003 / Raw
			:
2124 Ether / IP / UDP 104.18.23.107:https > 192.168.0.143:50362 / Raw
2125 Ether / IP / UDP 18.183.11.144:20003 > 192.168.0.143:57520 / Raw
2126 Ether / IP / UDP 192.168.0.143:57734 > 18.183.11.144:20003 / Raw
2127 Ether / IP / UDP 192.168.0.143:49297 > 142.250.206.206:https / Raw
2128 Ether / IP / TCP 142.250.206.193:https > 192.168.0.143:53808 SA			⇐ 연결 수락
2129 Ether / IP / TCP 192.168.0.143:53808 > 142.250.206.193:https A			⇐ 연결 수락 확인
2130 Ether / IP / TCP 192.168.0.143:53808 > 142.250.206.193:https PA / Raw
2131 Ether / IP / UDP 192.168.0.143:53955 > 3.112.113.156:20003 / Raw
2132 Ether / IP / UDP 192.168.0.143:57520 > 18.183.11.144:20003 / Raw
2133 Ether / IP / UDP 192.168.0.143:53955 > 3.112.113.156:20003 / Raw
2134 Ether / IP / UDP 192.168.0.143:57734 > 18.183.11.144:20003 / Raw


>>> sf[2111].show()				⇐ 인덱스 2111번의 패킷 상세 조회
###[ Ethernet ]###
  dst       = 9c:a2:f4:e8:44:3c
  src       = d0:3c:1f:1f:e7:3f
  type      = IPv4
###[ IP ]###
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 52
     id        = 59149
     flags     = DF
     frag      = 0
     ttl       = 128
     proto     = tcp
     chksum    = 0x0
     src       = 192.168.0.143
     dst       = 142.250.206.193
     \options   \

###[ TCP ]###        sport     = 53808
        dport     = https
        seq       = 1752058677
        ack       = 0
        dataofs   = 8
        reserved  = 0
        flags     = S
        window    = 64240
        chksum    = 0x1f1a
        urgptr    = 0
        options   = [('MSS', 1460), ('NOP', None), ('WScale', 8), ('NOP', None), ('NOP', None), ('SAckOK', b'')]

>>>

>>> sf = sniff(count=10)			⇐ 캡쳐할 패킷의 개수를 지정
>>> sf.show()
0000 Ether / IP / UDP 3.112.113.156:20003 > 192.168.0.143:53955 / Raw
0001 Ether / IP / TCP 104.18.22.107:https > 192.168.0.143:57984 PA / Raw
0002 Ether / IP / UDP 192.168.0.143:57734 > 18.183.11.144:20003 / Raw
0003 Ether / IP / UDP 192.168.0.143:57734 > 18.183.11.144:20003 / Raw
0004 Ether / IP / UDP 18.183.11.144:20003 > 192.168.0.143:57520 / Raw
0005 Ether / IP / UDP 192.168.0.143:53955 > 3.112.113.156:20003 / Raw
0006 Ether / IP / UDP 192.168.0.143:57520 > 18.183.11.144:20003 / Raw
0007 Ether / IP / UDP 192.168.0.143:57734 > 18.183.11.144:20003 / Raw
0008 Ether / IP / UDP 192.168.0.143:57734 > 18.183.11.144:20003 / Raw
0009 Ether / IP / TCP 192.168.0.143:57984 > 104.18.22.107:https A

Kali Linux 가상머신에 VSCode를 설치
https://code.visualstudio.com/docs/setup/linux

$ sudo apt-get install wget gpg
$ wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
$ ls
Desktop  Documents  Downloads  help.py  Music  packages.microsoft.gpg  Pictures  Public  Templates  test.py  Videos
$ sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
$ sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
$ rm -f packages.microsoft.gpg

$ sudo apt install apt-transport-https
$ sudo apt update
$ sudo apt install code

Kali Linux 가상머신에 VSCode를 설치

https://code.visualstudio.com/docs/setup/linux

$ sudo apt-get install wget gpg
$ wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
$ ls
Desktop  Documents  Downloads  help.py  Music  packages.microsoft.gpg  Pictures  Public  Templates  test.py  Videos
$ sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
$ sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
$ rm -f packages.microsoft.gpg

$ sudo apt install apt-transport-https
$ sudo apt update
$ sudo apt install code.

kali.linux 가상머신에서 bee.box 가상머신으로 연결(3-way handshaking)하는 것을 Scapy로 구현

$ sudo scapy

>>> tcp = TCP()
>>> tcp.show()
###[ TCP ]### 
  sport     = ftp_data	⇐ 1024 이후의 임의 포트로 설정 
  dport     = http
  seq       = 0
  ack       = 0
  dataofs   = None
  reserved  = 0
  flags     = S		⇐ SYN (연결요청) 
  window    = 8192
  chksum    = None
  urgptr    = 0
  options   = ''

>>> tcp.sport = RandNum(1024, 65535)
>>> tcp.show()
###[ TCP ]### 
  sport     = <RandNum>
  dport     = http
  seq       = 0
  ack       = 0
  dataofs   = None
  reserved  = 0
  flags     = S
  window    = 8192
  chksum    = None
  urgptr    = 0
  options   = ''




>>> ip = IP()
>>> ip.show()
###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = hopopt
  chksum    = None
  src       = 127.0.0.1
  dst       = 127.0.0.1		⇐ bee.box 가상머신의 IP 주소로 변경
  \options   \


>>> ip.dst = "192.168.40.130"	⇐ 다른 터미널에서 ping bee.box 명령으로 확인
>>> ip.show()
###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = hopopt
  chksum    = None
  src       = 192.168.40.129
  dst       = 192.168.40.130
  \options   \


>>> syn = ip / tcp			⇐ TCP 세그먼트에 IP 헤더를 덧붙여 SYN 패킷을 생성
>>> syn.show()
###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = tcp
  chksum    = None
  src       = 192.168.40.129
  dst       = 192.168.40.130
  \options   \
###[ TCP ]### 
     sport     = <RandNum>
     dport     = http
     seq       = 0
     ack       = 0
     dataofs   = None
     reserved  = 0
     flags     = S
     window    = 8192
     chksum    = None
     urgptr    = 0
     options   = ''

>>> syn_ack = sr1(syn)		⇐ 전송하고 첫번째 응답이 올 때까지 대기 
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets


>>> syn_ack.show()
###[ IP ]### 
  version   = 4
  ihl       = 5
  tos       = 0x0
  len       = 44
  id        = 0
  flags     = DF
  frag      = 0
  ttl       = 64
  proto     = tcp
  chksum    = 0x6878
  src       = 192.168.40.130
  dst       = 192.168.40.129
  \options   \
###[ TCP ]### 
     sport     = http
     dport     = 3952
     seq       = 2694158463
     ack       = 1
     dataofs   = 6
     reserved  = 0
     flags     = SA
     window    = 5840
     chksum    = 0x661c
     urgptr    = 0
     options   = [('MSS', 1460)]
###[ Padding ]### 
        load      = '\x00\x00'

>>> ack = ip / TCP(sport=syn_ack[TCP].dport, dport=syn_ack[TCP].sport, flags="A", seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq+1)
>>> send(ack)
.
Sent 1 packets.

위의 과정을 hanshaking.py 파일로 만들어서 실행 (kali linux 가상머신에서)

RST 패킷이 자동으로 전달되는 이유

https://0xbharath.github.io/art-of-packet-crafting-with-scapy/network_recon/service_discovery/index.html

Kali 가상 머신에서 RST 패킷이 나가지 않도록 방화벽에 룰을 추가

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    



$ sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.40.129 -j DROP
iptables: No chain/target/match by that name.           ~~~~~~~~~~~~~~
                                                        kali IP

$ sudo iptables -L                                                            
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  kali.linux           anywhere             tcp flags:RST/RST

Today is...

저번 예비군으로 지난 교육에서 놓친 칼리 부분에 너무 취약한 것 같다. 우선 수업 따라가구, 여유 생기면 보충하자! 파이팅!

profile
It's log on my way to whitehack

1개의 댓글

comment-user-thumbnail
2024년 3월 25일

#3wayhandshaking #IP헤더 #SKshieldusrookies #sk쉴더스루키즈 #tcp #스니핑 #클라우드 #포트스캔

답글 달기