Python2020. 9. 22. 19:11
반응형

[파이썬 ( Python )] 집합 (Set) (12)

 

 

실습 코드
출력 결과

#집합 (Set)
#중복을 허용하지 않고 순서가 없다는게 특징입니다.

Member = {"홍길동", "철수", "맹구", "홍길동"}

print(Member)
#기본적인 Set의 형태와 출력문입니다.
#결과를 보면 중복이 안되는걸 알 수 있습니다.

#개발자
Developer = {"유리", "훈이", "철수", "짱구"}


#공격자
Hacker = {"짱구", "짱아", "흰둥이"}


# 교집합 : 개발과 공격을 모두 가능 한 사람
print(Developer & Hacker)

print(Developer.intersection(Hacker))

# 합집합 : 개발이나 공격이 가능한 사람
print(Developer | Hacker)

print(Developer.union(Hacker))

# 차집합 : 개발은 가능하지만 공격은 할 줄 모르는 사람
print(Developer - Hacker)

print(Developer.difference(Hacker))

# 공격을 할 줄 아는 사람이 늘어난 경우 (추가)
Hacker.add("훈이")

print(Hacker)

# 개발을 안한지 오래되서 개발하는 방법을 까먹어 하지 못하게 된 경우 (삭제)
Developer.remove("유리")

print(Developer)

반응형
Posted by 보안 학생
네트워크2020. 9. 19. 19:47
반응형

Port Scanning (포트 스캐닝) 

ICMP, UDP, TCP (Open,  Half Open,  Ack,  Stealth 등)

 

스캐닝 ( Scanning )이란 ?

- 스캐닝은 특정 대상을 탐색하는 행위로서 주로 ICMP, TCP, UDP 등의 패킷들을 조합하여

서버에 질의를 보내 돌아오는 반응을 확인하여 정보를 수집할 수 있습니다.

- 열려있는 포트, 어떤 서비스를 제공하는지, 데몬 버전, OS 버전, 취약점 등 다양하게

정보를 얻을 수 있습니다.

 

스캐닝의 이해

 

- 왜 사용하는가 ?

주로 해커가 악의적인 공격을 수행하기 위해 타겟의 취약점, 서비스 정보 등 정보를 얻기 위한 사전 작업을 위해 사용합니다.

 

- 어떻게 이용할 수 있는가 ?

핵심은 어떤 포트를 열고 서비스를 진행 중인지 아는 것 입니다.

가령 특정 회사에서 445번 포트를 열고 서비스하고 있는 것을 알게 된다면 SMB 취약점을 이용해 랜섬웨어 공격을 진행 할 수 있습니다.

어떤 포트를 열고 있는지 알게 된다면 해당 취약점을 이용해 공격을 수행 할 수 있습니다.

 

스캐닝을 진행할 때 목적, 상황에 따라 여러 방법으로 나뉘게 되는데, 대표적으로 ICMP, TCP, UDP 3가지 유형의 스캔을 예시로 들어 실습화면과 병행하여 설명하겠습니다.

실습환경은 KaliLinux, CentOS7, Windows 10을 사용하였으며

실습도구로는 Nmap, WhireShark를 사용하였습니다.

 

1. ICMP

Ping을 보내 호스트로부터 응답을 얻어 통신 상태를 확인하기 위해 사용합니다.

주로 Ping, Tracert, Traceroute 명령어를 사용해 통신 상태를 확인하게 되는데,

목적지까지 거쳐가는 라우터(게이트웨이) 경로를 확인하거나, 돌아오는 응답 패킷을 보고 호스트의 OS를 간접적으로 유추가 가능합니다.

-Traceroute는 옵션을 통해 ICMP나 TCP 프로토콜로도 사용할 수 있지만, 기본적으로 UDP 프로토콜을 사용합니다.

 

OS

TTL

Window Size

Linux(Kernel 2.4 ~ 2.6)

64

5840

FreeBSD

64

5720

Windows 7, Server 2008

128

8192

Cisco Router (IOS 12.4)

255

4128

위의 표는 각 OS별 일반적인 기본 TTL값과 Window Size 입니다.

 

아래는 Ping 명령어를 사용한 방법입니다.

상대 호스트 서버가 닫힌 경우

ping을 보내도 호스트에게 연결할 수 없음이라는 메시지가 나타납니다.

 

상대 호스트 서버가 열려 있는 경우

1) KaliLinux -> Windows 10

 

상대 서버가 열려있다면,

Windows 10으로부터 돌아오는 TTL 값이 128을 확인 할 수 있습니다.

상대 서버가 열린 것을 확인하고 추가적으로 Windows 10으로 보내는걸 몰랐다고 가정해도 돌아오는 TTL 값을 통해 Windows OS라는 것을 간접적으로 유추해 볼 수 있습니다.

 

2) Windows 10 -> KaliLinux

 

상대 호스트로부터 돌아오는 TTL 값이 64임을 확인하고

OS가 리눅스 계열임을 유추해 볼 수 있습니다.

 

 

 

2. TCP, UDP 스캔의 원리

TCP 연결 방식과 플래그들을 조합하여 여러 방식으로 타켓을 스캔합니다.

(1) TCP 3-Way HandShake

TCP의 정상적인 연결과정입니다.

SYN 패킷으로 연결을 시도하여 SYN + ACK 패킷으로 응답을 받으면 ACK 패킷을 보내고 세션을 수립합니다.

(2) TCP 4-Way HandShake

TCP의 정상적인 종료 과정입니다.

FIN, ACK 패킷으로 종료를 알리고 그에 맞는 응답을 받아 정상적으로 종료합니다.

 

3. UDP 스캔

UDP 스캔은 열리거나 필터링된 포트는 반응이 없고 닫힌 포트는 ICMP Unreacheable 패킷이 반환된다는 점을 이용한 기법입니다.

Nmap Option중 -sU를 사용하여 UDP Scan을 진행하여 scan이 이루어지는 과정을 WhireShark로 패킷을 캡쳐한 화면입니다.

 

(열린 포트)

포트가 열려있을 때는 패킷이 반환되지 않고 보내기만 하는 것을 확인 할 수 있습니다.

 

(닫힌 포트)

포트가 닫혀 있을 땐 ICMP Unreachable이 반환되는 것을 확인 할 수 있습니다.

 

 

 

 

4. TCP 스캔

1) Open Scan

TCP를 이용한 스캔 방법 중 가장 기본적인 스캔이라 볼 수 있으며, 포트가 열려있는지 확인 할 수 있습니다.

3-Way HandShake 과정을 거처기에 스캔 결과에 대한 신뢰도는 높지만 진행 속도가 느리다는 점과 상대방 시스템에 로그가 남아 실질적으로는 거의 사용되지 않는 방법이라 볼 수 있습니다.

Nmap Option중 -sT를 사용하여 TCP Scan을 진행하여 scan이 이루어지는 과정을 WhireShark로 패킷을 캡쳐한 화면입니다.

(열린 포트)

포트가 열려있다면 SYN을 보내고 SYN + ACK를 받아 ACK를 보내고 RST, ACK로 세션을 종료합니다.

 

 

(닫힌 포트)

포트가 닫혀있다면 SYN 패킷을 보내면 RST + ACK 패킷이 돌아오고 종료되는 것을 확인 할 수 있습니다.

 

 

2) Half Open Scan

Open Scan이 진행되는 방식과 유사하지만, 세션을 완전히 연결하지 않고 포트의 활성화 여부를 판단합니다.

상대방이 구형 장비를 사용하고 있는 경우엔 RST, ACK 패킷을 둘 다 받아야 감시 로그를 생성할 수 있기 때문에 이 방법을 사용하면 스캔 흔적을 지우는게 가능합니다.

Nmap Option중 -sS를 사용하여 TCP Scan을 진행하여 scan이 이루어지는 과정을 WhireShark로 패킷을 캡쳐한 화면입니다.

 

(열린 포트)

스캔을 진행할 때 열린 포트인 경우 Open Scan에서는 최종적으로

전달하던 ACK 패킷을 전달하지 않고 RST 패킷을 보내주면서 연결을 종료합니다.

 

 

(닫힌 포트)

포트가 닫혀 있는 경우엔 Open Scan 방식과 마찬가지로 RST + ACK 패킷이 돌아오면서

세션이 종료 되는 것을 알 수 있습니다.

 

 

 

 

3) TCP Ack Scan

ACK Scan은 1), 2) 방법과 다르게 SYN 보내지않고 ACK패킷을 보내고 이때 포트가 열린 상태든 닫힌 상태든 똑같이 RST 응답을 받습니다. 하지만 방화벽에서 필터링이 이루어진다면 응답이 없거나, ICMP 에러 메시지를 받게 됩니다.

(위의 그림은 방화벽 필터링이 되지 않을 경우입니다. )

그렇기에 포트의 열림 여부를 확인한다기 보단 상대방쪽에서 방화벽 필터링이 되고 있는지 여부를 확인할 목적으로 사용 됩니다.

 

Nmap Option중 -sA를 사용하여 TCP Scan을 진행하여 scan이 이루어지는 과정을 WhireShark로 패킷을 캡쳐한 화면입니다.

(방화벽 필터링 존재)

방화벽 필터링이 존재하기 때문에 ACK 패킷을 보낸 뒤 ICMP 에러 메시지를 받는 것을 확인 할 수 있습니다.

 

 

(방화벽 필터링 존재 X)

ACK를 보내고 RST로 응답을 받는 것을 보고 상대방쪽에서 방화벽 필터링이 이루어지지 않는 것을 확인 할 수 있습니다.

 

 

 

 

4) TCP Stealth Scan

 

FIN (FIN Flag), X-MAS(FIN, PSH, URG), NULL(모든 Flag 비설정) Scan 방식을 통합하여 Stealth Scan이라 칭합니다.

이 기법은 비정상적인 TCP Flag 조합을 이용한 기법이며, 열린 포트에 대해서는 응답이 없지만 닫힌 포트의 경우는 RST 패킷이 반환되어 돌아옵니다.

비정상적인 패킷에 대해 응답이 없는 점을 노린 스캔 방식이며, 보안탐지 우회를 위해 많이 사용되었으나 현재는 거의 다 탐지됩니다.

 

 

Stealth Scan은 과정과 결과가 비슷하기에 Nmap Option중 -sX를 사용하여 X-MAS만 사용해서 TCP Scan을 진행했습니다.

scan이 이루어지는 과정을 WhireShark로 패킷을 캡쳐한 화면입니다.

(열린 포트)

열린 포트에 대해서 돌아오는 응답이 없는 것을 확인할 수 있습니다.

 

 

(닫힌 포트)

닫힌 포트의 경우 RST+ACK 패킷이 돌아오면서 세션이 종료되는 것을 확인 할 수 있습니다.

 

 

 

 

 

반응형
Posted by 보안 학생
Python2020. 9. 17. 23:47
반응형

[파이썬 ( Python )] Tuple - 튜플 (11)

 

실습 코드
출력 결과

 

#Tuple (튜플)
#튜플은 추가나 삭제 등 수정이 불가능합니다.

Subject = ("자료구조", "알고리즘")

print(Subject[0])
print(Subject[1])
#기본적인 형태와 출력

# name ="홍길동"
# age = "24"
# job = "대학생"
# major ="정보보안"
# 이처럼 번거롭게 변수지정을 하지않고
(name, age, job, major) = ("홍길동", 24, "대학생", "정보보안")

#이처럼 한번에 묶어서 변수선언이 가능하다는 장점이 있습니다.

print("저의 이름은", name, "이고 나이는", age, "살 입니다. 현재 ", job, "신분이며, " , major, "을 전공하고 있습니다. ")

# 이런식으로 활용 가능합니다

반응형
Posted by 보안 학생
Python2020. 9. 16. 22:26
반응형

[파이썬 ( Python )] Dictionary - 딕셔너리 (10)

 

실습 코드

 

출력 결과

 

#딕셔너리

Subject = {1:"컴퓨터공학개론", 2:"고급프로그래밍", 3:"네트워크설계", 4:"소프트웨어개발실습"}
#딕셔너리는 List와 다르게 {}로 선언하고 {key:value} 형태로 구성되어있습니다.

print(Subject[1], Subject[3])
#이렇게 키값으로 출력하면 키값에 해당하는 Value값인 과목명들이 출력됩니다.
#키값은 정수뿐만 아니라 문자열(string)도 가능합니다.
print(Subject.get(2))
#대괄호가 아닌 get을 이용해서도 가져올 수 있다.

#키값 in Subject을 적고 Subject안에 존재하는지 판단 할 수 있습니다.
print(3 in Subject) #Ture
print(6 in Subject) #False

Subject[5] = "빅데이터개론"
#이렇게 대괄호를 사용하여 새로운 키값과 Value를 넣어주면 해당 딕셔너리에 추가 할 수 있습니다.
Subject[3] = "광역네트워크설계"
#기존에 있던 키값에 다른 Value값을 넣게되면 새로 들어온 Value값으로 업데이트 됩니다.

print(Subject)
print(Subject.keys())
#key값만 출력합니다.
print(Subject.values())
#value값만 출력합니다.
print(Subject.items())
#key와 value 연결지어 출력합니다.

Subject.clear()
print(Subject)
#List와 마찬가지로 딕셔너리 내용을 지우고 싶을땐 clear를 사용해줍니다.

반응형
Posted by 보안 학생
Python2020. 9. 14. 21:05
반응형

[파이썬 ( Python )] List & 삭제 및 확장 (9)

 

실습 코드 1
출력 결과 1

#리스트 : []

#조별과제 팀을 예시로 하겠습니다.

Team = ["홍길동", "김철수", "유리"]

print(Team)
#기본적인 List 형식입니다.

#유리는 몇번째 멤버인가 ?
print(Team.index("유리"))


#맹구의 조별과제 팀 합류
Team.append("맹구")

print(Team)
#append를 사용하면 List 맨 뒤에 추가할 수 있습니다.

# 훈이가 새로 합류하게 되는데 List에서 위치를 2번째에 위치하도록 하겠습니다.
Team.insert(1, "훈이")

print(Team)
#이처럼 순서를 정해서 추가 하고 싶을때는 insert(원하는자리, 추가내용)을 작성해주시면 됩니다.

#맹구가 마음에 안들어 조별과제 팀에서 제외
Team.pop()

print(Team)
#pop() 함수를 사용하게 되면 List의 맨 뒤에서부터 하나씩 꺼내게 됩니다.
#(자료구조에서 Stack과 Pop부분을 공부하시면 원리를 이해 할 수 있을 것이라 생각합니다.)

Team.append("홍길동")

print(Team)
print(Team.count("홍길동"))
#List에 홍길동이라는 이름이 몇번 들어가있는지 출력

 

실습 코드 1-1
출력 결과 

#숫자 정렬

Number_List = [1,5,7,8,3,2,0]

Number_List.sort()
print(Number_List)
#sort 함수를 사용하게 되면 오름차순으로 정렬할 수 있습니다.

Number_List.reverse()

print(Number_List)
#반대로 reverse 함수를 사용하면 내림차순으로 정렬이 가능합니다.


#List 지우기

Number_List.clear()

print(Number_List)

Team.pop()
# List의 확장
Team2 = ["짱구","짱아","봉미선","신형만"]

print(Team)
print(Team2)

Team.extend(Team2)
print(Team)
#이렇게 extend를 사용하여 List를 확장시킬 수도 있습니다.

반응형
Posted by 보안 학생
Python2020. 9. 13. 20:27
반응형

[파이썬 ( Python )] 탈출 문자 (8)

 

 

실습 코드
출력 결과

 

#탈출 문자

##
# print("안녕하세요,
# 반갑습니다. ") << 이렇게 하면 오류가 발생합니다.
# # 하지만 아래와 같이 줄 바꿈을 넣어 (\n) 작성하면 정상 출력이 됩니다.

print("안녕하세요, \n반갑습니다.")

print("저의 전공은 \"정보보안\" 입니다. ")
# "나 ' 처럼 코드의 기능을 담당하는 특수문자를 일반 문자처럼 출력하고 싶을때는 위와 같이 \를 붙여 작성하면 됩니다.

print("C:\\Users\\Desktop")
# 이처럼 어떤 경로를 출력하고 싶을때 \를 하나만 작성하게 되면 오류가 발생합니다. 위와 같은 방법으로 \붙여 \\로 작성해주시면 정상 출력이 됩니다.

print("지금은\t오후\t8시입니다.")
# \t을 붙여주면 코드를 작성할때 Tab키를 누르는 것처럼 일정 공간만큼 띄워서 출력하게 됩니다.

반응형
Posted by 보안 학생
Python2020. 9. 12. 22:23
반응형

[파이썬 ( Python )] Format (7)

 

format 실습 코드
출력 결과

#문자열 포맷

#첫번째 방법.

print("저는 %d살 입니다." %24)

# %d 자리에 뒤에오는 %값을 넣어서 출력하겠다라는 뜻입니다. C언어 출력문과 비슷하게 생각하면 좋을 것 같습니다.
# %d는 정수형만 올 수 있으며, %c는 char라고 하여 한 문자만 받을 수 있고, %s는 문자열을 받아 출력 할 수 있습니다.
# 이부분은 출력 타입을 따로 알아보시면 이해할 수 있습니다.

print("%s을 전공하고 있습니다." %"정보보안")

# 위의 설명과 같이 %s를 사용하여 문자열도 출력이 가능합니다.

print("저는 %d살 %s이며, %s을 전공하고 있습니다. " % (24, "대학생", "정보보안"))

#이렇게 여러개도 같이 포맷하여 출력할 수 있습니다.

#두번째 방법

print("저는 {}살 입니다.".format(24))

#중괄호를 활용하여 출력하는 방법입니다. format() 안에 있는 값을 앞에 있는 {}안에 넣어 출력하는 방식입니다.
print("저는 {}살 {}이며, {}을 전공하고 있습니다. ".format(24,"대학생","정보보안"))

#여러개를 포맷하는 방법은 첫번째 방법과 유사합니다. 값이 똑같이 출력됩니다.

print("저는 {1}살 {0}이며, {2}을 전공하고 있습니다. ".format(24,"대학생","정보보안"))

#중괄호 {}안에 숫자를 넣게 되면 자리값으로 생각하여 format함수에 들어오는 몇 번째 자리에 있는 값을 불러와
#출력한다는 뜻입니다. 출력 결과를 보시면 이해하기 쉬울 것 같습니다.

#세번째 방법

print("저는 {age}살 {job}이며, {major}을 전공하고 있습니다. ".format(age = 24,job = "대학생",major = "정보보안"))

# 위와 같이 두번째 방법과 유사하지만 format안의 값들에게 마치 변수 선언하듯이 작성한 값들을 {}안에 넣어 출력할 수 있습니다.
print("저는 {age}살 {job}이며, {major}을 전공하고 있습니다. ".format(major = "정보보안", job = "대학생", age = 24))

# 변수처럼 사용하기에 순서가 다르게 작성되어도 결과값은 같게 나옵니다.

#네번째 방법 (Python ver3.6 이상부터 가능)

age = 24
job = "대학생"
major = "정보보안"
print(f"저는 {age}살 {job}이며, {major}을 전공하고 있습니다. ")

#문자열 앞에 f를 붙여주고 값이 저장되어 있는 변수를 불러와 위와 같이 사용할 수 있습니다.

반응형
Posted by 보안 학생
Python2020. 9. 12. 22:16
반응형

[파이썬 ( Python )] 문자열 처리 & 출력 (6)

실습 코드
출력 결과

 

#문자열 처리 함수

String = "Hello, Python ?"

print(String.lower())

#이 처럼 출력문에서 해당 문자열 변수뒤에 .lower() 함수를 붙여 사용하면 변수에 저장되어 있는
#문자들을 소문자로 변환하여 출력해줍니다.

print(String.upper())

#반대로 대문자로 출력을 하고 싶은 경우엔 upper() 함수를 사용하면 됩니다.

print(String[0].isupper())

#String변수의 문자열에 첫번째 자리의 문자가 대문자인가요? 라고 물어보는 함수 입니다.
#첫번째 문자가 H이므로 결과값이 True로 반환됩니다. 소문자일 경우엔 False로 나오게 됩니다.

print(len(String))

#len()함수에 문자열 변수를 넣어 출력하게되면 문자열의 길이를 알려줍니다.

print(String.replace("Python", "Android"))

#원하는 문자열 변수뒤에 .replace() 붙여 해당 변수 문자열 중 내용을 바꿔서 출력하고 싶은
#부분을 첫번째로 작성하고, 그 뒤에 바뀔 내용을 작성하면 문자가 수정한 내용으로 출력됩니다.

Where = String.index("o")

print(Where)
#문자열 중에 특정 단어가 몇번째에 위치하고 싶은지 알고 싶을때 문자열 변수뒤에 .index("찾고 싶은 문자")를
#작성 해주시면 몇번째에 위치하는지 알려줍니다.

Where = String.index("o", Where+1)

print(Where)
#이번엔 기존에 저장되어 있던 위치값 말고 그 뒤부터 나오는 문자열의 값을 얻고 싶을땐
#문자열 변수.index("o", Where + 1 ) 이렇게 작성하면 위치값이 저장된 곳에서 한 칸뒤부터
#시작해서 o가 몇번째 자리에 위치하는지 알려줍니다.

print(String.find("l"))

#비슷하게 사용하는 함수로 find가 있습니다. 비교적 find 함수가 주로 더 많이 사용된다고 생각합니다.

print(String.count("l"))

# l 이라는 문자가 해당 문자열에서 몇번 등장하는지 횟수를 알려주는 count 함수입니다

반응형
Posted by 보안 학생