



https://www.kisa.or.kr/2060204/form?postSeq=12&lang_type=KO&page=1#fnPostAttachDownload
16비트(65536개를 표현하는 것이 가능)로 구성된 가상적 주소
운영체제에서 응용 계층에 속하는 프로토콜을 고유한 식별자 번호로 인식할 때 사용하는 번호
IANA(Internet Assigned Numbers Authority) 기구에서 관리
원격지 호스트를 대상으로 어떤 포트를 사용하고 있는지 확인하는 기법
nmap ⇒ 오픈소스 기반의 포트 스캐닝 도구
┌──(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




kali 가상머신에서 https://drive.google.com/drive/folders/1JHymvvQZX1x8xkbGuoRqL9yCqv5Jjowq 공유 폴더에 있는 http.pcapng 파일을 다운로드
네트워크 계층(L3)에서 각 세그먼트/데이터그램 앞에 IP 주소를 추가한 것

일반적으로 IP 헤더는 20바이트 크기를 사용 (IP Option 항목을 이용해 21바이트 이상으로 사용이 가능)
서비스 종류(Type of Service) : 해당 패킷의 전송 우선 순위를 지정 (회선이 혼잡할 경우 패킷의 전송 우선 순위를 부여할 때 사용)
전체 길이 : IP 헤더를 포함한 패킷 전체의 길이
Identification, IP Flags, Fragement Offset : MTU(Maximum Transmission Unit: 최대 전송 단위)에 따른 패킷 분할 정보
생존 시간(TTL, Time To Live) : 해당 패킷이 통과할 수 있는 라우터의 개수
프로토콜 : 상위 계층에 속한 프로토콜 번호 → 수신 측에서 해당 캐핏의 속성을 파악하는데 사용
헤더 오류 검사 : 비활성화 상태
출발지 IP 주소, 목적지 IP 주소 : 32비트의 IP 주소
┌──(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>
https://scapy.readthedocs.io/en/latest/installation.html#windows
>>> 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
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
$ 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.
from scapy.all import *
# tcp = TCP()
# tcp.sport = RnadNum(1024, 65535)
# tcp.dport = "80"
# tcp.flags = "S"
tcp = TCP(sport=RandNum(1024, 65535), dport=80, flags='S')
# ip = IP()
# ip.src = "192.168.40.129"
# ip.dst = "192.168.40.130"
ip = IP(src="192.168.40.129", dst="192.168.40.130")
syn = ip / tcp
syn_ack = sr1(syn)
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)
┌──(kali㉿kali)-[~]
└─$ sudo python3 handshaking.py
[sudo] password for kali:
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
.
Sent 1 packets.