#Method #메소드는 클래스 내부에 정의되어 있습니다. #프로그램이 실행되고있을때 클래스에서 생성된 인스턴스와 관련된 동작을 정의합니다
class NoteBook: def __init__(self, brand, name, grade, start): #__init__ << 생성자입니다. 객체를 생성할때 (아래의 노트북같은 것들) 자동으로 호출됩니다. self.brand = brand #brand, name, grade 이와 같은 요소들을 멤버변수라고 합니다. self.name = name #외부에서도 객체.멤버변수 << 이와 같은 방법으로 접근이 가능합니다. self.grade = grade self.start = start #cpu 시작 온도
print("{0}회사에서 가성비 좋은 노트북 {1}을 출시 했습니다! ".format(self.brand, self.name)) print("제품 사양은 {0}등급 입니다!".format(self.grade))
def Hver(self, tem): #수많은 메소드 활용법중 하나. 노트북을 게이밍모드로 변환하여 점차 온도를 tem로 전달받은 단위만큼 올리고 100도가 넘어가면 기능을 상실하게 만듭니다. if self.start == 0: print("{0}제품이 게이밍 모드로 변환되면서 CPU 온도가 높아지고 있습니다.".format(self.name)) self.start += tem print("현재 CPU 온도 [{0}도]".format(self.start)) if self.start >= 100: print("CPU가 녹아버려 기능을 상실했습니다. ")
Asu = NoteBook("Asu", "Gep", "S",0)
#시간이 지날수록 cpu과부화로 온도가 올라가고 있다고 가정합시다. Asu.Hver(10) Asu.Hver(10) Asu.Hver(10) Asu.Hver(50) Asu.Hver(50)
#결과 : cpu온도가 100도가 넘었기에 "CPU가 녹아버려 기능을 상실했습니다." 출력.
#Class #Class는 흔히 '틀'이라고 많이 표현을 합니다. 다향한 함수나, 기능들을 넣어 #효율적으로 같은 형식으로 여러개체를 만들 수도 있고 이것 말고도 활용도가 매우 높습니다.
#예를들어 노트북이란 제품을 소개할때 어떤 회사 제품을 소개하더라도 노트북이라는건 변함이 없죠 ? #그래서 노트북을 소개할 고정적인 요소를 틀로 잡아 효율적으로 사용 할 수 있습니다. class NoteBook: def __init__(self, brand, name, grade): #self는 자기 자신을 뜻하며, __init__ << 생성자입니다. 객체를 생성할때 (아래의 노트북같은 것들) 자동으로 호출됩니다. self.brand = brand #brand, name, grade 이와 같은 요소들을 멤버변수라고 합니다. self.name = name #외부에서도 객체.멤버변수 << 이와 같은 방법으로 접근이 가능합니다. self.grade = grade print("{0}회사에서 가성비 좋은 노트북 {1}을 출시 했습니다! ".format(self.brand, self.name)) print("제품 사양은 {0}등급 입니다!".format(self.grade))
Asu1 = NoteBook("Asu", "VvBook", "B") #클래스로 만들어지는 이것들을 객체라고하며, 해당 클래스의 인스턴스라고 표현 합니다. Asu2 = NoteBook("Asu", "GeeBook", "A") H = NoteBook("H", "VivoBook", "C")
Asu3 = NoteBook("Asu", "GepBook", "S") Asu3.lockskill = True #이렇게 변수를 외부에서 추가적으로 할당 할 수 있습니다. #클래스 외부에서 원하는 변수를 확장할 수 있지만, 확장을 한 객체한에서만 사용할 수 있으며, 다른 객체에선 사용이 불가능합니다. if Asu3.lockskill == True: print("{0}제품은 지문인식 기능을 탑재하고 있습니다.".format(Asu3.name))
#Pickle #Pickle이란? 프로그램상에서 사용하고 있는 데이터를 파일형태로 저장해주는 것입니다.
import pickle MyData_file= open("MyData.pickle", "wb") #MyData.pickle이라는 파일을 만들고 pickle을 사용하기 위해선 원하는 권한뒤에 항상 b를 붙여줘야 합니다.(바이너리 타입를 뜻합니다.) MyData = {"이름":"홍길동", "나이":"미상", "취미":["동해번쩍","서해번쩍"]} #내용 입력 print(MyData) pickle.dump(MyData, MyData_file) #MyData에 있는 정보들을 MyData_file에 저장해줍니다. MyData_file.close()
MyData_file2= open("MyData.pickle", "rb") MyData = pickle.load(MyData_file2) #위에서 데이터가 저장된 MyData.pickle 파일의 내용을 불러와 저장합니다. print(MyData) MyData_file2.close()
#쓰기 Mymemo_file = open("Mymemo.txt", "w", encoding="utf8") # 쓰기 권한 # 파일제목을 변수로 지정하고 open을 통해서 파일을 열고 무슨 권한으로(현재는 쓰기 목적) 열지 정할 수 있습니다. (마지막에 인코딩 꼭 해줘야합니다. 안적으면 한글이 깨져서 보일 수도 있습니다.) print("저는 지금 잠이 옵니다.",file=Mymemo_file) #파일에 들어갈 글을 아무거나 적습니다. print("그래서 곧 자러 갈겁니다.",file=Mymemo_file) #내용을 적고 ,file= 파일명을 적어줍니다. Mymemo_file.close() #파일을 닫아줍니다.
Mymemo_file = open("Mymemo.txt", "a", encoding="utf8") #a는 append로 해당 파일에서 이어서 작성하겠다는 뜻입니다. Mymemo_file.write("\n집에 가고 싶어요") #.write로 작성할땐 자동 줄바꿈이 되지않기에 필요시 수동으로 적어줍니다. Mymemo_file.write("\n피곤하네요") Mymemo_file.close()
Mymemo_file = open("Mymemo.txt", "r", encoding="utf8") print(Mymemo_file.readline())# readline()을 통해 각 줄별로 읽기가 가능합니다. print(Mymemo_file.readline()) print(Mymemo_file.readline()) print(Mymemo_file.readline()) Mymemo_file.close()
#읽을려는 파일이 몇 줄있는지 모를때는 While문을 통해 읽어올 수 있습니다. Mymemo_file = open("Mymemo.txt", "r", encoding="utf8") while True: line = Mymemo_file.readline() if not line: #readline()으로 불러온 값이 없을때 아래의 구문을 실행합니다. break #중단합니다. print(line) Mymemo_file.close()
Mymemo_file = open("Mymemo.txt", "r", encoding="utf8") List = Mymemo_file.readlines() #List형태로 저장 for line in List: print(line, end="")
#출력 #신체 정보 Body = {"전체길이":200, "다리길이":120, "상체길이":80} for body, length in Body.items(): #변수지정 칸에 key와 value으로 같이
지정해주게 되면 튜플에 한 세트로 함께 들어가게 됩니다. print(body.ljust(5), str(length).rjust(4), sep=":", end="cm") print() #sep는 위의 출력문에서 ,로 구분되는 곳에 대신 집어넣을 값을 의미하고,
end는 해당 출력문이 #끝난후에 이어서 작성될 구문을 뜻합니다.
그밑에 print()를 한 이유는 줄바꿈을 해주기 위함입니다. #ljust와 rjust는 좌로 정렬, 우로 정렬이고 ()안의 값을 넣으면 해당 값만큼 공간을
확보한 상태로 좌,우로 정렬해준다라는 뜻이 됩니다.
#어느 이벤트의 응모권이 있습니다 #1,2,3,4,~ #이 번호들을 001,002,003~ 이런식으로 표현하고 싶을때 사용하는 방법입니다. for Number in range(11): print("응모권 " + str(Number).zfill(3) + "번") #zfill(숫자)는 해당 숫자만큼 자리를 확보하고 빈자리들을 모두 0으로 채운다는 뜻입니다.
#입력 A = input("보통 언제쯤 기상하시나요 ? ") print("아하, 당신은 주로 " + A + "에 기상하시는군요!")
해당 글은 VM Ware로 실습한 내용이며, IP 또한 가상으로 할당하였기 때문에 아무 의미 없습니다.
또한 이 기술은 실제 적용이 가능할 수도 있으니, 절대 악의적인 목적이나 호기심으로 진행하지 마시길 바랍니다.
실습을 위한 환경을 구성할때 반드시 본인 컴퓨터와 인터넷으로 구성하고 진행하세요!
악용시 현행 정보통신망 이용촉진 및 정보보호 등에 관한 법률로 처벌 받을 수 있습니다.
정보통신망에 관한 법률 아니더라도 처벌 받습니다 아무튼 그냥 본인 컴퓨터 외에는 하지마세요 !
1 개요
1.1 개요 및 목적
현재 대한민국 스마트폰 사용을 안하는 사람을 찾기 힘들 정도로 보급률이 높아져있습니다. 사용자가 증가함에 따라 무료 인터넷을 사용할 수 있도록 도와주는 무선 인터넷 환경(WI-FI)도 손쉽게 찾아 볼 수 있습니다. 많은 사람들이 데이터가 부족하거나, 아끼기 위해 비밀번호가 안걸려져있는 WI-FI에 접속하여 무료로 인터넷을 사용할 것입니다. 하지만 악의적 의도를 가진 해커가 사람들의 정보를 훔치기 위해 설치해놓은 WI-FI라면 ? 본인도 모르는 사이에 사용자가 전송한 정보를 해커는 Sniffing 할 수 있기 때문에 WI-FI 사용자들은 항상 제공자를 모르는 WI-FI 사용을 자제하고 의심해봐야 합니다.
해킹 도구 사용으로 네트워크 공격 기법을 통해 실제 공격 행위의 시뮬레이션을 수행해보며 특정 장소의 내부 네트워크상의 서비스와 서버에 대해 침투가능성을 능동적으로 판단하여 취약점에 대한 대응방안을 마련하여 네트워크 보안사고를 미연에 방지하는 것에 그 목적이 있습니다.
1.2 실습 환경
- 가상환경 OS (피해자 - Windows Xp, 공격자 - KaliLinux)
- 사용 도구 : SSLStrip
- 적용 기술 (ARP Spoofing, SSL Sniffing, M IT M)
- 무선 WI – FI
1.3 수행 항목
- 피해자가 게이트웨이로 보내는 패킷을 공격자에게 전달하게하고, 게이트웨이
에서 피해자에게 보내는 패킷을 공격자에게 전달하도록 ARP Spoofing을 진행
하여 중간자 공격이 이루어지도록 설정
- SSLStrip을 통해 피해자에게 https를 해제하여 전달하여 Sniffing 공격
- 피해자 로그인 시도할 때 입력한 ID, PASSWORD 정보 탈취
- Log 파일을 통해 탈취한 정보 확인
2 시나리오
2.1 실습 시나리오
실습 시나리오
3 수행결과
3.1 Spoofing
Spoofing이란 사전적 의미로 ‘ 속이다 ‘ 입니다. MAC주소, IP주소, Port 등 네트워크 통신과 관련된 요소
들을 속여 공격하는 것을 말합니다.
이번 모의해킹 진행과정에서 필요한 Spoofing 기법은 ARP Spoofing입니다.
ARP Spoofing은 MAC주소를 속여 통신간에 흐름을 우회하고 왜곡시키는 공격입니다.
3.1.1 취약점 이해
로컬 네트워크에서 사용하는 ARP 프로토콜의 허점을 이용하여 자신의 MAC주소를 다른 컴퓨터의
MAC주소인 것처럼 속입니다.
네트워크 트래픽이 이동할 때 MAC 주소를 기반으로 전송하는데, 공격자는 같은 네트워크상에서
ARP Request BroadCasting을 통해 모든 호스트 IP/MAC주소를 알아 낼 수 있습니다.
ARP 프로토콜은 인증을 요구하지 않기 때문에 이러한 취약점을 이용하여 ARP Reply 패킷을
호스트에게 보내주면서 쉽게 ARP Cache Table을 업데이트 시킬 수 있습니다.
공격자가 위조한 MAC 주소를 각 호스트들의 ARP Cache Table에 업데이트 시키게 되면, 통신이 이루어지는 GateWay에서는 공격자의 MAC 주소와 포트 매핑정보가 Table에 등록되어 호스트가 서버로 보내는 정보가 담긴 트래픽은 공격자에게 전달하고 서버에서도 피해자 호스트에 대한 트래픽을 공격자에게 전달하게 됩니다.
3.1.2 상세분석
[Step #1] ARP Spoofing 진행 전
arp spoofing 진행 전
[Step #2] ARP Spoofing 공격을 위한 Shell 작성
공격 코드
[Step #3] ARP Spoofing을 위한 Shell 실행
공격 실행
[Step #4] 공격 진행 후 ARP Cache Table 변경된 것을 확인
공격자 IP가 추가되고 물리적 주소가 GateWay와 같게 변경 된 것을 확인 할 수 있다.
3.1.3 보안대책
1) 사용중인 공유기의 펌웨어를 항상 업데이트하여 최신 버전으로 유지
2) ARP Virus 방어 기능을 지원하는 공유기 사용
3) ARP Spoofing 공격 탐지 툴 설치 (XArp, ARPWatch 등)
4) MAC주소 정보를 정적으로 설정하여 관리
3.2 Sniffing
Sniffing이란 사전적 의미로 ‘ 킁킁거리다, 냄새를 맡다 ‘ 뜻이 존재합니다. 이와 같이 네트워크상에서
다른 상대방들간에 또는 서버와 통신할 때 전달되는 패킷 교환을 몰래 훔쳐보는 것을 의미합니다.
예시로 군에서 통신이 이루어질 때 제3자가 도청하는 행위가 유사하다 볼 수 있습니다.
3.2.1 취약점 이해
SSL을 사용하여 암호화 통신을 하는 경우 일반적으로 공격자는 해당 정보를 Sniffing 할 수 없습니다. 하지만, 암호화된 데이터는 Client와 Server 인증 과정에서 발생된 패킷들에 의해 부하를 늘리게 되어
많은 웹 페이지에서 전체적으로 SSL을 적용시키지 않고 본인확인 또는 로그인과 같이 특정 주요정보가전송되는 구간에만 부분적으로 SSL을 적용하여 운영하는 경우가 많습니다. 이렇게 부분적으로 SSL을 적용시킨다는 취약점을 이용하여 피해자와 서버간에 통신이 이루어질 때 중간에서 개입하여 SSL Strip을 통해 HTTPS를 HTTP로 변경하여 피해자를 속여 정보를 탈취할 수 있습니다.