
[SK shieldus Rookies 19기] 5.1. 시스템/네트워크 보안(3) TCP, 3way handshaking, 포트스캔, IP헤더, 스니핑
UDP
TCP
참고: 주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드
https://www.kisa.or.kr/2060204/form?postSeq=12&lang_type=KO&page=1#fnPostAttachDownload
포트번호


TCP 헤더 크기 가변적 => TCP Options 따라 달라짐 -> Offset에서 지정
출발지와 목적지 포트 : 16비트 -> 65,536
일련 번호(sequence number)
확인 or 승인 번호 (knowledgement number)
오프셋
TCP 플래그
윈도우 크기
오류 검사
긴급 포인트

| S.P (소스 포트) | D.P (데스피테이션 포트 - 목적지?) | |
|---|---|---|
| 80 | 10535 | |
| S (싱크 플래그 1로) |
수신자 AN = 송신자 SN + Data Size or 1
송신자 AN = 수 SN + ||
-> 확인했다는 의미로 ACK 보냄 -> 다음 번호로
정상적인 트래픽 전송 과정

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

| 헤더(출발지) | 목적지(수신자, 서버) | |
|---|---|---|
| S.P(소스포트) | D.p. (서버 서비스포트) | |
| 송신자포트 -> 유효한(사용하지 않고 있는) 동적 포트 번호가 설정 -> 누가? OS(운영체제) | ||
| 크롬, 49155 / 80 | 80, 49155 출발지 주소와 목적지 주소 바뀌어서 왔다갔다 -> 이 때 이용하는 게 동적포트 |
원격지 호스트 대상 -> 어떤 포트 사용하고 있는지 확인 기법
`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 심 플레크 -> 에크 -> 싱크
(10) 374 전의 SN + 1 = 373 + 1

| ID | IP flags | Fragment offset |
|---|---|---|
| X D M | ||
| 0 | 0 1 0 | 0 |
| ID | IP flags | Fragment offset |
|---|---|---|
| X D M | ||
| 1234 | 0 0 1 | 0 |
| 1234 | 0 0 1 | 1500 |
| 1234 | 0 0 1 | 3000 |
| 1234 | 0 0 1 | 4500 |
Scapy 이용 3-way Handshaking
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 헤더의 정보를 출력
>>> 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 \
>>> 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 \
>>> 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 패킷이 자동으로 전달되는 이유

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...
저번 예비군으로 지난 교육에서 놓친 칼리 부분에 너무 취약한 것 같다. 우선 수업 따라가구, 여유 생기면 보충하자! 파이팅!
#3wayhandshaking #IP헤더 #SKshieldusrookies #sk쉴더스루키즈 #tcp #스니핑 #클라우드 #포트스캔