agencies

파이썬 해킹 입문 (해킹기술 및 개요) 본문

Ⅰ. 프로그래밍

파이썬 해킹 입문 (해킹기술 및 개요)

agencies 2024. 1. 29. 22:03
* 파이썬 2.7.6 (기준)으로 작성되었습니다.

기본 문법

 

#story of "hong gil dong" 
                         
name = "Hong Gil Dong"    
age = 18
weight = 69.3

skill = ["sword", "spear", "bow", "axe"] 
power = [98.5, 89.2, 100, 79.2]

querySkill = raw_input("select weapon: ") 

print "\n"
print "------------------------------------------"
print "1.name:", name 
print "2.age:", age
print "3.weight:", weight

i=0


for each_item in skill:
    if(each_item == querySkill):
        print "4.armed weapon:",each_item, "[ power", power[i],"]" 
        print ">>>i am ready to fight"
    i = i+1
    
print "------------------------------------------"
print "\n"
  1. 주석문 : #으로 시작하는 구문은 프로그램에서 주석으로 처리되며 실행되지 않는다 문단 전체를 주석 처리하려면 작은따옴표(''')나 큰 따옴표(""") 3개로 감싸면 된다
  2. 변수선언 : 파이썬에서 변수는 별도의 형(Type)을 지정하지 않고 이름만을 선언한다
  3. 리스트 : 대괄호([])로 둘러싸인 리스트는 배열처럼 사용할 수 있다 참조 번호는 0부터 시작한다 별도의 형을 지정하지 않으며 문자열과 숫자를 함께 저장할 수 있다
  4. 내장 함수 사용 : raw_input()이라는 내장 함수를 사용했다 명령 창에서 사용자 입력을 받아 querySkill 변수에 값을 저장한다
  5. 문자열과 변숫값 결합 : 쉼표(,) 기호를 사용하면 문자열과 변숫값을 결합할 수 있다
  6. 반복문 : 반복문 for 문은 skill 리스트에 있는 아이템의 개수만큼 반복한다 반복문 블록의 시작은 쌍점(:)으로 명시한다 별도의 종료 표시가 없다 반복문 서브루틴은 들여쓰기로 구분한다
  7. 프로그램 블록 표현 : 공백(Space) 또는 탭(Tab) 키를 사용하여 프로그램 블록을 표현한다 다른 언어에 익숙한 개발자는 처음에 다소 거부감이 들지 모르나 익숙해지면 오히려 문법 오류가 줄어들고 코딩이 간단해지는 것을 느낀다
  8. 분기문과 비교 : if 문을 사용하여 참과 거짓을 판단할 수 있다 분기문 블록의 시작은 쌍점(:)으로 명시한다
  9. 복수 행 프로그램 블록 표현 : 동일 숫자의 공백 또는 탭을 사용하면 동일 블록으로 간주한다
  10. 새로운 프로그램 블록 : 상위 블록보다 하나의 공백 또는 탭을 적게 사용하면 새로운 프로그램 블록에 해당함을 나타낸다

 

*사용자 정의 함수를 사용

#story of "hong gil dong"
skill = ["sword", "spear", "bow", "axe"]
power = [98.5, 89.2, 100, 79.2]

#start of function
def printItem(inSkill, idx=0):
    name = "Hong Gil Dong"
    age = 18
    weight = 69.3
    
    print "\n"
    print "----------------------------------"
    print "1.name:", name
    print "2.age:", age
    print "3.weight:", weight
    
    print "4.armed weapon:",inSkill, "[ power", power[idx],"]"
    print ">>>i am ready to fight"
#end of function

querySkill = raw_input("select weapon: ")

i=0

for each_item in skill:
    if(each_item == querySkill):
        printItem(querySkill,i)
    i = i+1
    
print "----------------------------------"
print "\n"

 

  1. 함수 선언 : 인자로 받은 inSkill과 idx에 해당하는 위치의 power 리스트 값을 출력하는 printItem()함수를 선언한다
  2. 사용자 정의 함수 호출 : 사용자 입력으로 받은 querySkill 값과 skill 리스트 값이 일치하는 인덱스를 함수의 인자로 전달하여 함수를 실행한다

 

*클래스 생성

class Hero:
    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.weight = weight
    def printHero(self):
        print "\n"
        print "-------------------------------------"
        print "1.name:" , self.name
        print "2.age:" , self.age
        print "3.weight:" , self.weight
        
class MyHero(Hero):
    def __init__(self, inSkill, inPower, idx):
        Hero.__init__(self, "hong gil dong", 18, 69.3)
        self.skill = inSkill
        self.power = inPower
        self.idx = idx
    def printSkill(self):
        print "4.armed weapon:" , self.skill + "[ power:" , self.power[self.idx], "]"

skill = ["sword", "spear", "bow", "axe"]
power = [98.5, 89.2, 100, 79.2]

querySkill = raw_input("select weapon: ")

i=0

for each_item in skill:
    if(each_item == querySkill):
        myHero = MyHero(querySkill, power, i)
        myHero.printHero()
        myHero.printSkill()
    i = i+1
    
print "-------------------------------------"
print "\n"

 

  1. 클래스 선언 : Hero 클래스를 선언한다
  2. 생성자 선언 : 클래스 자신을 나타내는 self와 함께 3개의 인자를 받는 생성자를 선언한다
  3. 변수 초기화 : 클래스 변수에 인자를 할당하여 초기화한다
  4. 함수 선언 : 클래스 내부에 printHero() 함수를 선언한다
  5. 변수 사용 : 클래스 변수를 사용한다 self.변수명 형태로 사용한다
  6. 클래스 상속 : Hero 클래스를 상속받는 MyHero 클래스를 선언한다
  7. 생성자 호출 : 상위 클래스의 생성자를 호출하여 객체를 초기화하여 생성한다
  8. 클래스 생성 : MyHero 클래스를 생성한다 생성자에 필요한 인자를 함게 넘겨준다
  9. 클래스 함수 호출 : MyHero 객체에 선언된 함수를 호출하여 동작을 수행한다

 

*예외처리

문법 오류가 없는 프로그램을 작성해도 실행 중에 오류가 발생할 수 있다 프로그램 실행 중에 발생하는 오류 상황을 예외라고 한다 실행 중에 발생할 수 있는 모든 상황을 고려할 수 없으므로 오류가 발생해도 프로그램이 정상적으로 동작할 수 있도록 하는 특별한 장치가 필요하다

 

try:
    a = 10 / 0 #예외 발생 : 나눗셈을 실행하는 도중에 피제수를 0을 사용하여 예외 발생
except:        #예외 처리 : 예외의 종류를 지정하지 않고 예외처리 시작 오류 메시지 출력
    print "1.[exception] divided by zero"
    
print "\n"

try:
    a = 10 / 0
    print "value of a: ",a
except ZeroDivisionError: #예외 종류 명시 : 예외의 종류를 명시하고 예외처리 시작
    print "2.[exception] divided by zero"
    
print "\n"

try:
    a = 10
    b = "a"
    c = a / b
except (TypeError, ZeroDivisionError): #복수 예외 명시 : 여러 개의 예외를 명시하여 처리
    print "3.[exception] type error occurred"
else:
    print "4.type is proper"           #정상 처리 : 예외가 발생하지 않을 때 정상 처리 메시지 출력
finally:
    print "5.end of test program"      #무조건 실행 : 예외 여부와 관계없이 메시지 출력

 

모듈

 

모듈의 기초

파이썬에서 모듈은 자주 사용되는 함수를 묶어 놓은 파일이다 모듈 이름은 파일 이름(모듈 이름.py)과 동일하다 모듈을 사용하면 복잡한 기능을 별도의 파일로 분리하여 프로그램 구조를 간단하게 만들 수 있다

 

*modHero.py

#모듈 생성 : modHero.py 파일을 호출하는 프로그램과 같은 디렉터리에 저장
skill = ["sword", "spear", "bow", "axe"] #변수 선언 : 모듈 내부 또는 호출하는 프로그램에서 사용 가능한 변수 선언
power = [98.5, 89.2, 100, 79.2]

def printItem(inSkill, idx=0):           #함수 선언 : 모듈에서 제공하는 기능인 함수를 정의한다
    name = "Hong Gil Dong"
    age = 18
    weight = 69.3
    
    print "\n"
    print "-------------------------------------"
    print "1.name:", name
    print "2.age:", age
    print "3.weight:", weight
    
    print "4.armed weapon:", inSkill, "[ power", power[idx],"]"
    print ">>>i am ready to fight"

*모듈의 호출

import modHero #모듈 불러오기 : modHero 모듈을 명시적으로 불러온다

querySkill = raw_input("select weapon: ")

i=0

for each_item in modHero.skill: #모듈 변수 : modHero 모듈에 선언된 skill 변수를 사용한다
    if(each_item == querySkill):
        modHero.printItem(querySkill, i) #모듈 함수 : modHero 모듈에 선언된 printItem() 함수를 사용한다
    i = i+1
    
print "-------------------------------------"
print "\n"

 

sys 모듈은 경로를 추가해서 프로그램이 다른 폴더에 있는 모듈을 인식할 수 있도록 한다

sys.path.append(디렉터리)와 같은 방식으로 사용할 수 있다

 

 

파일 다루기

 

 

파일 입출력의 기초

지금까지 개발한 예제는 프로그램이 종료되면 모든 데이터가 사라지고 프로그램을 시작하면 다시 데이터를 입력해야 했다 파이썬은 파일을 통해 간단히 데이터를 저장하고 읽을 수 있다

 

*파일 다루기

import os

def makeFile(fileName, message, mode): #함수 생성 : 파일명,메시지,열기모드르 인자로 받아서 파일을 다루는 함수 선언
    a=open(fileName, mode)             #파일 오픈 : 지정된 파일명과 열기 모드로 파일 객체를 생성한다
    a.write(message)                   #파일 쓰기 : 전달받은 메시지를 열기 모드에 따라 파일에 기록한다
    a.close()                          #객체 닫기 : 사용이 종료된 객체를 닫는다
    
def openFile(fileName):                #함수 생성 : 파일명을 인자로 받는 함수를 선언한다
    b=open(fileName, "r")              #파일 오픈 : 지정된 이름에 해당하는 파일을 열기 모드로 여는 파일 객체 생성
    lines = b.readlines()              #내용 읽기 : 파일에 들어 있는 모든 내용을 읽어서 리스트 변수인 lines에 저장
    for line in lines:                 #반복문 : 리스트에 저장된 개수만큼 반복한다
        print(line)
    b.close()
    
makeFile("fileFirst.txt","This is my first file1\n","w") #쓰기 모드 파일 생성 : fileFirst.txt라는 이름의 파일을
makeFile("fileFirst.txt","This is my first file2\n","w") #쓰기 모드로 생성한다 1~3까지 반복하면서 내용을 기록하지만
makeFile("fileFirst.txt","This is my first file3\n","w") #쓰기 모드는 마지막에 기록한 파일만 남게 된다
makeFile("fileSecond.txt","This is my second file1\n","a") #추가 모드 파일 생성 : fileSecond라는 이름의
makeFile("fileSecond.txt","This is my second file2\n","a") #파일을 추가 모드로 생성한다 1~3까지 반복하여
makeFile("fileSecond.txt","This is my second file3\n","a") #기록한 내용 모두가 파일에 저장한다

print("write fileFirst.txt")
print("-----------------------------")
openFile("fileFirst.txt")             #파일 열기 : fileFirst.txt 파일을 열어 내용을 인쇄한다 한 줄만 출력된다
print("-----------------------------")

print("\n")

print("write secondFirst.txt")
print("-----------------------------")
openFile("fileSecond.txt")            #파일 열기 : fileSecond.txt 파일을 열어 내용을 인쇄한다 모두 세 줄이 출력된다
print("-----------------------------")

 

 

문자열 포맷팅

 

문자열 포맷팅의 기초

문자열 포맷팅은 출력하고자 하는 문자열 내부에 어떤 값을 삽입하는 기술이다 삽입되는 값의 형태는 문자열 포맷 코드에 의해서 결정된다

 

코드 설명 포맷
%s 문자열 String
%c 문자 하나 Character
%d 정수 Integer
%f 부동 소수 Floating Pointer
%o 8진수 Octal Number
%x 16진수 Hexadecimal Number

 

*문자열 포맷팅

print("print string: [%s]" % "test")
print("print string: [%10s]" % "test") #일정 길이 문자열 출력 : 6자리 공백의 출력과 test문자열의 출력
print("print character: [%c]" % "t")
print("print character: [%5c]" % "t")  #일정 길이 공백 포함하는 문자 출력 : 한 자리 문자와 4자리 공백 출력
print("print Integer: [%d]" % 17)
print("print Float: [%f]" % 17)        #실수 : 17을 실수형으로 변환해서 출력한다
print("print Octal: [%o]" % 17)        #8진수 : 17을 8진수로 변환한 21을 출력한다
print("print Hexadecimal: [%x]" % 17)  #16진수 : 17을 16진수로 변환한 11을 출력한다

해킹 기술

개요

 

 

해킹은 의도하지 않은 어떤 현상을 초래하는 행위를 의미한다 해킹은 크게 기술적인 방법과 사회공학적인 방법으로 나눌 수 있다 몇가지 예를 들어본다면 컴퓨터에서 정보를 빼낼 때 백도어를 심거나 네트워크 트래픽을 감시하는 방법도 있지만 관리자의 뒤에서 몰래 훔쳐볼 수도 있다 비밀번호도 여러 가지 방법으로 알아낼 수 있다 SQL 인젝션을 통해서 데이터베이스에서 비밀번호를 가져올 수도 있지만 전산팀 쓰레기통을 뒤져서 비밀번호가 적혀 있는 종이를 찾아낼 수도 있다 이처럼 해킹은 이루말할 수 없는 다양한 형태로 이루어진다

 

컴퓨터가 우리 생활에 밀접하게 쓰이면서 다양한 해킹 기법이 소개됐다 해킹이 이루어지는 위치에 따라서 시스템 해킹, 애플리케이션 해킹, 웹 해킹, 네트워크 해킹 그리고 기타 해킹 기술로 나눈다

 

시스템 해킹은 커널을 중심으로 이루어진다 커널이 관리하는 메모리, 레지스터 등의 영역을 침입해서 데이터를 빼내거나 루트 권한을 획득한다 애플리케이션 해킹은 사용자가 실행하는 프로그램을 중심으로 해킹이 이루어진다 애플리케이션 악성 코드가 담긴 DLL을 주입하거나 디버깅을 통해 키보드 입력을 가로챌 수 있다 웹 해킹은 인터넷 브라우저와 웹 서버의 구조적 취약점을 이용한다 현재 가장 많이 활용되고 있는 해킹 분야다 네트워크 해킹은 인터넷을 기반으로 이루어진다 가장 강력한 Dos 공격부터 네트워크 패킷을 엿보는 스푸핑등이 여기에 속한다 그리고 기타 무선랜 해킹과 사회 공학적 해킹 기법이 존재한다


애플리케이션 해킹

 

개요

PC와 서버에서 운영되고 있는 많은 애플리케이션은 C언어를 기반으로 만들어진다 C언어는 커널에서 제공하는 강력한 API를 직접 호출할 수 있다 이러한 기능은 사용자에게 다양한 편의성을 제공하지만 해커에게는 공격 기술을 제공하기도 한다

 

PC에서 많이 운영되고 있는 보안 솔루션을 살펴보자 키보드 입력과 화면 출력 사이에 전송되는 데이터를 암호화하는 키보드 보안 솔루션은 커널에서 제공하는 메시지 후킹 기능을 사용한다 커널에서 키보드 입력이 감지되면 보안 솔루션은 메시지를 중간에 가로채서 암호화해 준다 해킹에 사용되는 키 로거도 같은 원리를 이용한다 키보드 보안 솔루션이 설치되지 않는 PC에 키 로거가 설치되면 사용자가 입력한 아이디와 비밀번호를 중간에 가로채서 해커에게 그대로 전송한다

 

디버거는 애플리케이션을 개발할 때 반드시 필요한 도구다 프로그래머는 디버거를 이용해서 단계별로 애플리케이션을 실행하고 오류의 원인을 찾아낸다 디버거는 특정 이벤트가 발생하거나 API가 호출되면 하던 일을 잠깐 멈추고 다른 기능을 실행하거나 메모리 상태를 기록할 수 있다 이때 개발자는 이런 디버거의 기능을 이용해서 오류에 대한 원인을 분석하지만 해커는 악성 코드가 실행되도록 유도한다

 

애플리케이션 해킹 기술

  • 메시지 후킹 : 메시지 후킹은 user32.dll의 SetWindowsHookExA() 메서드를 이용한다 윈도우는 키보드,마우스 등에서부터 들어오는 메시지를 훅 체인(Hook Chain)을 통해 처리한다 훅 체인은 메시지를 처리하는 일련의 함수 포인터를 모아놓은 리스트다 훅 체인 상에 강제적으로 프로그래머가 원하는 처리 프로세스에 대한 포인터를 등록하면 메시지가 들어올 때 원하는 작업을 할 수 있다 대표적인 해킹 기법인 키 로거(Key Logger)가 이 방식을 이용한다 키보드 입력 메시지를 중간에 가로채 해커에게 전송하는 것이다
  • API 후킹 : API 후킹은 운영체제에서 제공하는 디버깅 프로세스를 이용한다 먼저 디버거를 이용해서 애플리케이션 특정 명령어에 중단점(Breakpoint)을 설정하고 특정 메서드를 수행하도록 등록한다 애플리케이션은 작업을 수행하다가 중단점을 만나면 등록된 메서드를 실행한다 이 메서드를 콜백 메서드라고 하는데 여기에 해킹 코드를 심어 놓으면 해커가 원하는 동작을 수행할 수 있다 예를 들어 메모장(notepad) 프로세스의 WriteFile() 메서드에 중단점을 설정했다면 저장 메뉴를 클릭하는 시점에 콜백 메서드가 호출된다 여기에 특정 문자를 해커가 원하는 문자로 바꾸는 코드를 삽입하면 사용자가 의도하지 않은 문자가 파일에 저장된다
  • DLL 인젝션 : DLL 인젝션은 동적으로 사용할 수 있는 라이브러리인 DLL을 애플리케이션에 삽입하는 기술이다 모두 3가지 방법이 있는데 첫째는 레지스트리를 사용하는 것이다 먼저 레지스트리의 특정 위치에 원하는 DLL 이름을 입력해 놓는다 user32.dll을 호출하는 애플리케이션의 경우 해당 위치에 입력된 DLL을 메모리에 로딩한다 둘째는 후킹 함수를 사용하는 것이다 즉 특정 이벤트가 발생했을 때 DLL을 로딩하는 후킹 함수로 등록하는 것이다 마지막은 실행 중인 애플리케이션에 원격 스레드를 생성해서 DLL을 삽입하는 것이다 윈도우에서는 CreateRemoteThread()함수를 제공해서 원격 스레드 생성을 지원하고 있다
  • 코드 인젝션 : 코드 인젝션(Code Injection)기법은 스레드를 활용한 DLL 인젝션 기법과 유사하다 차이점은 여기서는 DLL 대신 직접 실행 가능한 셸 코드(Shell Code)를 삽입한다는 것이다 코드 인젝션의 장점은 DLL을 미리 시스템 특정 위치에 저장할 필요가 없고 속도가 빠르며 노출이 쉽지 않다는 점이다 하지만 셸 코드의 특성상 복잡한 해킹 코드를 삽입할 수 없다는 단점 또한 존재한다

웹 해킹

 

 

개요

컴퓨터 시스템은 본질적으로 해킹에 취약하다 컴퓨터가 처음 만들어졌을 때는 보안보다는 기능성에 초점을 두었다 단일 시스템으로 몇십 년 동안 운영되다가 인터넷이 발달하면서 시스템이 사용자 다수에게 노출되게 되었다 이때부터 해커가 시스템을 인지하고 공격하기 시작한것이다 컴퓨터가 제공하는 다양한 기능은 사용자에게 편의성을 제공하지만 반면에 해커에게는 공격을 위한 수단을 제공한다

 

웹은 기본적으로 인터넷 브라우저, 웹 서버, 데이터베이스 이렇게 3개의 요소로 구성된다 각 구성 요소별로 역할이 명확히 분리되어 있다 인터넷 브라우저는 사용자의 입력을 처리하고 웹 서버로부터 받은 데이터를 가공해 화면을 구성한다 웹 서버는 HTTP 요청을 분석해 정해진 기능을 수행한다 데이터 처리가 필요할 경우 데이터베이스를 연결해 관련 작업을 수행한다 데이터베이스는 데이터를 안전하게 관리하면서 자료 입력과 조회 기능을 지원한다

 

해커는 웹이 지원하는 기능을 악용한다 파일 업로드 기능을 이용해서 웹 셸 파일과 악성코드를 업로드한다 업로드한 파일의 위치를 알아내 웹 셸 파일을 실행하면 해커는 웹 서버를 장악할 수 있다 사용자 입력 기능을 이용하면 SQL 인젝션 공격을 할 수 있다 비정상적인 SQL 쿼리문을 입력해 얻을 수 있는 웹 서버의 오류 메시지를 분석하면서 공격한다 파일 내려받기 기능을 이용해 악성 코드를 인터넷상의 불특정 다수 PC에 배포할 수도 있다 브라우저에서 실행 되는 HTML과 스크립트 코드는 XSS 공격과 CSS 공격 수단으로 악용된다

 

거의 모든 기업에서 방화벽, IPS, IDS와 같은 다양한 보안 장비를 도입해 해킹을 차단하고 있다 하지만 웹 서비스를 지원하기 위해 몇 개의 포트는 어쩔 수 없이 인터넷에 노출해야만 한다 이를 보완하기 위해 웹 방화벽과 같은 장비가 등장하고 있지만 웹은 해커들에게 가장 매력적인 공격 대상이 되고 있다

 

웹 해킹 기술

  • XSS : XSS(Cross-Site Scripting)는 게시판 게시물에 악성 코드를 포함하는 스크립트를 심어놓고 게시물을 읽은 사용자 PC에서 개인정보를 추출하는 해킹 기법이다 악성 코드는 대부분 스크립트 코드이며 쿠키를 읽어서 특정 URL로 전송하는 기능을 수행한다 게시물을 읽은 사용자는 자기도 모르는 사이 개인정보가 유출된다 현재는 브라우저 보안 강화와 웹 방화벽과 같은 장비 발달 덕분에 공격 빈도가 많이 줄어들고 있다
  • CSRF : CSRF(Cross-Site Request Forgery)는 게시판에 악성 코드를 삽입하고 사용자가 해당 게시물을 읽었을 때 공격이 수행된다는 점에서 XSS와 유사하다 차이점은 XSS는 사용자 PC에서 개인정보를 유출하지만 CSRF는 사용자 PC를 통해 웹 서버를 공격한다는 점이다 해킹 유형은 웹 서버에 대한 무력화 시도일 수도 있고 정보 유출을 위한 공격일 수도 있다
  • 피싱 : 피싱(Phishing)은 은행이나 증권사이트와 비슷한 웹 사이트를 만들어 놓고 사용자의 금융정보나 개인정보를 탈취하는 기법이다 먼저 해커는 사용자에게 피싱을 위한 이메일을 전송한다 사용자가 이메일을 열어 링크를 클릭하면 피싱을 위한 위장 사이트가 오픈 된다 자신이 잘 아는 사이트로 오인한 사용자는 아이디와 비밀번호를 입력하게 된다 위장 사이트는 사용자 입력 값을 저장하고 해커는 이 정보를 통해 2차 공격을 시도하게 된다
  • 파밍 : 파밍(Pharming)은 DNS를 해킹해서 정상적인 도메인 이름(Domain Name)을 호출해도 위장 사이트가 전송되게 하는 해킹 기술이다 위장 사이트의 IP가 사용자 브라우저에 전송되면 사용자는 해커가 만든 웹 사이트에 개인정보를 입력하게 된다
  • SQL 인젝션 : SQL 인젝션(Injection)은 HTML input 태그를 활용한다 브라우저에 사용자 아이디와 비밀번호를 입력받아 웹 서버로 전달 하면 웹 서버는 데이터베이스에서 아이디, 비밀번호와 일치하는 사용자 정보가 있는지 SQL문을 통해 확인한다 이때 아이디와 비밀번호에 일반적인 값을 넣는 것이 아니라 데이터베이스에 오동작을 유발할 수 있는 값을 입력한다 'OR 1=1; /*와 같은 값을 아이디에 해당하는 변수에 입력하면 데이터베이스는 조건과 관계없이 모든 값을 반환할 수도 있다 다양한 비정상 SQL 문을 반복적으로 입력하면서 데이터를 관찰하면 시스템 해킹이 가능한 적당한 SQL문을 얻을 수 있다
  • 웹 셸 : 웹 셸(Web Shell)은 웹에서 제공하는 파일 업로드 기능을 악용한다 먼저 서버를 원격에서 조정할 수 있는 파일(웹 셸 파일)을 웹 서버를 통해 업로드 한다 해커는 업로드 한 파일 위치를 파악하고 접근 가능한 URL을 찾아낸다 해커는 이 URL을 통해 웹 셸 파일을 실행해서 운영체제를 통제할 수 있는 강력한 권한을 획득할 수 있다 웹 셸은 최근 웹 해킹에서 SQL 인젝션과 더불어 가장 강력한 기법으로 활용되고 있다

네트워크 해킹

 

 

개요

TCP/IP는 본질적으로 해킹에 취약하다 연결 설정 및 통신 과정에 많은 문제를 가지고 있다 첫째 클라이언트에서 서버로 최초 연결을 시도하는 SYN 패킷을 전송하면 서버는 연결을 위해 버퍼 자원을 할당한다 만일 계속 SYN 패킷만 전송하는 클라이언트가 있다면 서버는 통신 버퍼를 모두 소진해 네트워킹이 불가능해진다 둘째 정상적인 통신 연결이 완료된 후에 해커는 클라이언트를 가장해서 통신 세션을 쉽게 가로챌 수 있다 통신 상대방을 인증하기 위해 TCP 헤더에 있는 시퀀스(Sequence) 번호를 확인하는데 제삼자가 이 번호를 쉽게 알아내서 위장할 수 있다 셋째 IP 헤더에 있는 소스(Source) IP 정보는 쉽게 위조 가능하다 소스 IP를 클라이언트 PC가 아닌 공격 대상 시스템 IP로 위조해서 SYN 패킷을 서버에 전송하면 서버는 ACK 패킷을 공격 대상 시스템으로 보내게 된다 일종의 Dos 공격이 가능한 것이다

 

취약한 TCP/IP 프로토콜을 대상으로 하는 많은 공격 기법이 등장했고 이를 방어하기 위한 다양한 장비들이 개발되었다 IPv6 등장과 함께 보안 취약점이 많이 해결되었지만 여러 프로토콜이 협업하여 동작하는 인터넷의 특성 때문에 네트워크 해킹 기술은 계속 진화할 것이다

 

네트워크 해킹 기술

  • 포트 스캐닝 : IP는 서버를 식별하는 논리적인 주소다 포트(Port)는 하나의 IP를 여러 개의 애플리케이션이 공유하기 위한 논리적인 단위다 IP는 IP 프로토콜에서 식별자로 사용되고 포트는 TCP/UDP프로토콜에서 식별자로 사용된다 방화벽 또는 서버에서 네트워크 서비스를 위해 포트를 개방하고 있다 대표적인 것인 80과 443포트이다 각각 HTTP와 HTTPS 서비스를 위해 방화벽에서 개방하고 있다 필수적인 포트 외에 관리 편의성을 위해서 몇 개의 포트를 추가로 사용하고 있는데 대표적으로 FTP나 Telnet 서비스를 제공하는 21과 22번 포트가 있다 이처럼 서비스를 위해 방화벽에서 개방하는 포트들은 해킹의 주요 공격 목표가 되고 있다 포트 스캐닝(Port Scanning)은 서비스를 위해 방화벽이나 서버에서 개방한 포트 목록을 알아내는 기술이다 포트 스캐닝에는 다양한 기법이 존재하지만 크게 UDP 기반 기법과 TCP 기반 기법으로 분류된다 UDP 기반 기법은 UDP 패킷을 전송해서 확인하고 TCP 기법은 SYN,FIN등 다양한 패킷을 전송하면서 포트 개방 여부를 확인한다 기법별로 성능과 은닉성의 차이가 있으므로 상황에 알맞은 기술을 선택해서 사용해야 한다
  • 패킷 스니핑 : TCP/IP 통신을 하는 이더넷(Ethernet) 기반 동일 네트워크 환경(하나의 라우터를 사용)에서는 MAC(Media Access Control)주소 기반으로 패킷이 동작한다 하나의 PC에서 다른 PC로 데이터를 전송할 때 전체 PC에 데이터를 브로드캐스트 한다 패킷의 목적지 MAC 주소가 자신의 것과 같으면 받아들여서 처리하고 그렇지 않으면 버리는 방식으로 동작한다 패킷 스니퍼(Packet Sniffer)는 모든 패킷을 버리지 않고 처리해서 동일 네트워크에서 이동하는 모든 데이터의 흐름을 한눈에 파악할 수 있다
  • 세션 하이재킹 : 세션 하이재킹(Session Hijacking)공격은 크게 HTTP 세션 하이재킹과 TCP 세션 하이재킹으로 나뉜다 전자는 웹 서비스 인증 정보를 저장한 쿠키의 SessionID 값을 탈취해서 해킹에 이용하는 방식이고 후자는 TCP 패킷 정보를 탈취하는 방식이다 TCP 프로토콜은 통신 상대방을 인증하기 위해 IP, Port, Sequence Number 3개 요소를 사용한다 TCP 세션 하이재킹은 패킷 스니핑(Packet Sniffing)을 통해 알아낸 인증 정보를 가지고 클라이언트와 서버 사이의 통신을 중간에서 가로챈다 해커는 클라이언트와 서버와의 연결을 잠시 끊고 발신지 IP를 해커 PC로 변경해서 서버와 커넥션을 재설정한다 서버는 통신 연결이 잠시 끊겼다가 다시 연결됐다고 생각하고 해커 PC를 클라이언트로 인식하게 된다 클라이언트와 해커 PC도 같은 방식으로 연결이 설정된다 이제 클라이언트와 서버와의 통신은 모두 해커 PC를 거치게 되고 해커는 모든 정보를 제어할 수 있게 된다
  • 스푸핑 : 스푸핑(Spoofing)의 사전적 의미는 위장하다이다 네트워크 관점에서는 크게 DNS,IP,ARP 3개의 자원에 대해서 위장을 통한 공격이 가능하다 ARP는 IP 주소를 가지고 MAC 주소를 알아내는 프로토콜이다 PC는 내부에 IP와 MAC정보가 저장된 ARP 캐시 테이블을 가지고 있다 통신 상대방을 인지하기 위해 해당 테이블을 조회해서 MAC 정보를 추출한다 ARP 캐시 테이블에서 정보를 찾지 못하면 ARP 프로토콜을 통해 IP에 해당하는 MAC 정보를 찾을 수 있다 ARP 프로토콜은 보안이 고려되지 않았기 때문에 쉽게 해킹할 수 있다 ARP Reply 패킷을 통해 상대방의 ARP 캐시 테이블을 간단하게 조작할 수 있다 ARP 캐시 테이블에는 상대방 IP와 MAC이 매핑 되어 있다 PC A와 PC B에 해당하는 정보를 해커 PC의 MAC 주소로 교체하면 모든 통신은 해커 PC를 거치게 된다
  • DoS : 서비스 거부 공격(DoS,Denial of Service)은 인터넷에서 가장 많이 활용되는 해킹 기법의 하나이다 SYN 패킷의 발신지 주소를 변경하거나 SYN 패킷만 지속적으로 전송하고 대량의 IP 패킷을 작은 단위로 쪼개서 전송하는 등의 행위를 통해 시스템을 서비스 불능 상태로 만들 수 있다 이뿐만 아니라 DoS는 정상적인 패킷을 대량으로 발생시켜 서비스를 마비시킬 수도 있다 현재 많은 DoS 대응 장비들이 발달해서 소수의 PC로 공격 대상 시스템을 서비스 불능 상태로 만들기는 쉽지 않다 이를 극복하기 위해 해커는 바이러스를 배포해서 불특정 다수의 PC를 좀비 PC로 만들고 원격에서 대량의 트래픽을 발생시키도록 제어하는 분산 서비스 거부 공격(DDoS)이 등장했다 분산 서비스 거부 공격(Distributed Denial of Service)은 봇넷을 활용한다 봇넷은 악성 코드가 포함된 파일을 인터넷을 통해 배포해서 다수의 좀비 PC를 확보하고 C&C 서버를 통해 좀비 PC를 통제하는 기술이다 악성 코드는 이메일, 게시판, 토렌트 등 다양한 방법을 통해 배포되고 있지만 이에 대한 대응은 현실적으로 쉽지 않다 아직도 해커들은 봇넷을 활용한 DDoS 공격을 유용한 해킹 수단으로 사용하고 있다 국가기관 및 금융기관에서는 이러한 피해를 예방하기 위해 업무망과 인터넷망을 분리하는 망 분리 사업을 추진하고 있다 망 분리는 인터넷을 통해 PC가 악성 코드에 감염되더라도 영향의 범위가 내부망까지 확대되지 않도록 물리적 또는 논리적으로 네트워크를 분리하는 기술이다

시스템 해킹

 

 

개요

컴퓨터 시스템은 하드웨어, 운영체제, 프로세스로 이루어져 있다 각각의 구성 요소는 인터페이스를 통해 서로 정보를 주고받으면서 유기적으로 동작한다 컴퓨터 시스템은 다양한 기능을 제공하기 위해 복잡한 구조로 되어 있으며 이런 특징은 자연스럽게 내부에 취약점을 가지게 된다 시스템이 진화하면서 많은 취약점이 보완됐지만 해커들은 새로운 공격 루트를 계속 개발하고 있다 시스템 해킹은 이러한 구조적 기능적 취약점을 이용해 정보를 추출하고 의도하지 않은 기능을 유발하는 해킹 기술이다 시스템 해킹은 이해하려면 먼저 컴퓨터 아키텍처와 운영체제에 대한 이해가 선행돼야 한다

 

시스템 해킹 기술

  • 루트킷 : 루트킷(Rootkit)은 루트 권한 획득 기능, 시스템 제어를 위한 백도어 기능, 백신 프로그램에 발각되지 않기 위한 위장 기능을 가진 해킹 프로그램이다 루트킷은 유저모드, 커널모드, 부팅모드 3가지 종류가 있다 유저모드는 애플리케이션 수준에서 동작한다 상대적으로 검출이 쉬우며 시스템에 대한 영향도가 낮다 커널 모드는 커널에 별도의 코드를 추가하거나 기존 코드를 대체하는 방식으로 동작한다 개발이 어려운 단점이 있지만 시스템에 치명적인 영향을 미칠 수 있다 부팅 모드는 MBR(Master Boot Record), VBR(Volume Boot Record), 부트섹터에 영향을 준다 파일 시스템 전체를 암호화한다든가 시스템을 부팅 불가능 상태로 만들 수 있는 강력한 기능을 가지고 있다
  • 백도어 : 백도어(Backdoor)는 사용자 PC를 원격에서 제어할 수 있는 프로그램을 말한다 해커는 백도어 클라이언트 기능을 하는 악성 코드를 인터넷 게시판, 이메일, 토렌트 등을 통해 배포한다 사용자가 무의식중에 악성 코드를 PC에 내려받으면 백도어 클라이언트가 설치된다 해커는 백도어 서버를 가동해 클라이언트의 접속을 기다린다 백도어 클라이언트는 설치와 동시에 서버에 접속하고 이때부터 해커는 사용자 PC를 원격에서 제어할 수 있게 된다
  • 레지스트리 공격 : 윈도우에서 사용하는 레지스트리는 일종의 데이터베이스이다 윈도우는 하드웨어 정보, 소프트웨어 정보, 사용자 정보 그리고 동작 제어에 필요한 다양한 정보드를 키(Key) 값(Value) 형태로 레지스트리에 저장하고 있다 윈도우는 레지스트리 제어를 위해 CRUD(Create Read Update Delete)에 관련된 모든 기능을 인터페이스를 통해 지원한다 시스템에 침투한 해커는 인터페이스를 통해 레지스트리를 조작할 수 있으며 사용자 비밀번호 초기화, 방화벽 설정 변경, DLL 인젝션과 같은 다양한 공격을 시도할 수 있다 레지스트리에는 사용자의 인터넷 사용 정보가 보관되어 있는데 이것을 통해 사용자의 생활 방식 추출도 가능하다
  • 버퍼 오버플로 : 버퍼 오버플로(Buffer Overflow) 공격은 프로세스에 비정상적인 데이터 입력을 통해서 메모리에 해커가 의도하는 데이터를 저장하고 실행될 수 있도록 만드는 공격이다 프로세스가 사용하는 메모리 영역인 스택(Stack), 힙(Heap) 그리고 레지스터(Register)에는 프로세스 처리 흐름에 알맞은 데이터가 들어가 있다 이 데이터를 변경하게 되면 프로세스의 처리 순서가 바뀌거나 동작이 멈추게 된다 해커는 입력 값을 변경해 가면서 어떤 데이터가 오류를 발생시키는지 입력 값의 어느 부분에 셸 코드를 심으면 실행할 수 있는지 관찰하면서 공격 코드를 완성해 간다 버퍼 오버플로 공격 코드는 독립적으로 동작하는 프로그램이 아니라 동영상, 음악, 문서 파일과 같이 프로그램으로 실행되는 일종의 파일이다 예를 들어 동영상 플레이어에 대한 버퍼 오버플로 공격을 시도한다고 가정하면 해커는 먼저 오류 코드를 심은 동영상을 인터넷에 배포한다 오류 동영상을 내려받은 사용자가 플레이어를 통해서 파일을 여는 순간 내부에 심어진 셸 코드가 메모리를 비정상 상태로 만들면서 실행되게 한다
  • 경합 조건 공격 : 경합 조건(Race Condition)은 두 프로세스가 하나의 자원을 사용하기 위해 서로 경쟁하는 상황이다 예를 들어 파일 쓰기 작업을 할 때는 먼저 파일 핸들(File Handle)이라는 자원을 얻어야 한다 여러 프로세스가 파일 쓰기 작업을 진행한다면 바로 파일 핸들을 먼저 얻으려고 서로 경쟁할 것이다 경합 조건 공격(Race Condition Attack)은 바로 이러한 상황에서 발생할 수 있는 보안 결함을 이용한다 가장 많이 사용되는 방법은 사용자 계정 정보를 저장한 /etc/passwd 파일에 대한 심볼릭 링크(Symbolic Link)를 이용하는 것이다 먼저 root 권한으로 사용자 입력을 받아 임시 파일(Temp File)을 생성하고 로직을 처리하는 프로세스를 찾아야 한다 해커는 이 프로세스에 사용자 추가를 의미하는 값(hacker::0:0:root:/root:/bin/ksh)을 반복적으로 입력한다 다른 한편으로는 /etc/passwd 파일에 대한 심볼릭 링크(임시 파일과 같은 이름)를 반복적으로 생성하는 프로그램을 실행시킨다 두 프로세스가 파일 핸들을 먼저 얻으려고 경쟁하는 상황에서 프로세스가 심볼릭 링크에 사용자 입력을 저장하는 상황이 발생한다 이때 etc/passwd 파일에 hacker::0:0:root:/root:/bin/ksh이 입력되고 해커 계정은 root 권한을 얻게 된다
  • 형식 문자열 공격 : 형식 문자열(Format String)은 printf 문에서 출력 문자열의 형식을 지정하는 방식이다 예를 들어 문자열을 출력하는 printf("print String: %s",strName) 구문에서는 %s가 문자열을 의미하는 형식 문자열에 해당한다 형식 문자열에 출력하는 인자(strName)가 뒤에 정상적으로 따라온다면 별다른 문제가 없지만 그렇지 않을 때에는 스택에 있는 값을 꺼내 출력하게 된다 이런 원리를 이용하면 해커는 %s %d %x 등 다양한 형식 문자열을 입력 값으로 사용해 스택을 조작할 수 있다 특히 %n과 같은 형식 문자열은 printf()에 의해서 출력된 바이트 수를 정수형 포인터에 저장하는 기능을 가지고 있다 따라서 해커가 실행을 원하는 셸 코드의 반환 주소(Return Address)를 스택에 입력할 수 있는 수단을 제공한다

기타 해킹 기술

 

 

무선 랜 해킹 기술

유선 사용이 불가능한 지역에서는 무선 AP를 통해 인터넷을 사용할 수 있다 무선 랜은 적합한 사용자를 인증하고 전송 데이터를 암호화하기 위해 WEP, WPA, WPA2와 같은 다양한 보안 메커니즘을 지원하고 있다 

 

WEP(Wired Equivalent Privacy)는 무선 랜 보안을 위해 최초에 개발된 알고리즘으로 보안을 위해 RC4 스트림 암호화 기법을 사용한다 RC4에 대한 취약성은 널리 알려졌기 때문에 인터넷에서 쉽게 구할 수 있는 애플리케이션으로 해킹할 수 있다

 

WPA(Wi-Fi Protected Access)는 WEP의 보안 취약성을 보완하기 위해 등장한 인증 프로그램이다 TKIP를 사용해 보안성을 높였지만 최초 인증과정에서 WPA 키를 숨기는 취약점을 내포하고 있다 해커는 인증된 세션을 강제로 종료시키고 재인증을 유도함으로써 WPA 키를 쉽게 탈취할 수 있다 다양한 해킹 도구에서 WPA 해킹을 지원하고 있다

 

WPA2는 AES-CCMP를 사용해서 WPA의 취약성을 보완했다 AES-CCMP 알고리즘은 가변 키 크기를 가지는 수학적 암호화 알고리즘을 사용해 암호 키를 특정 시간이나 일정 크기의 패킷 전송 후 자동으로 변경하는 기능을 가지고 있다 WPA2는 암호 키를 해독하거나 탈취할 수는 없지만 ARP 스푸핑 방식으로 접속자의 정보를 중간에 가로채는 공격에 취약하다 따라서 WIPS(Wireless IPS)와 같은 장비를 사용해 무선 랜 환경에 대한 입체적인 방어 체계를 구축해야 한다

 

암호 해킹 기술

암호화는 암호화 키(Key)와 암호화 알고리즘을 이용해 원본 데이터를 제삼자가 알아볼 수 없는 형태로 변환하는 기법이다 복호하는 암호화와 반대로 복호화 키와 복호화 알고리즘을 통해 원본 데이터를 복원하는 기법이다 암호화는 키의 형태에 따라 비밀키 암호화와 공개키 암호화로 분류되고 암호화를 수행하는 정보단위에 따라 스트림 암호화와 블록 암호화로 분류된다

 

암호 프로세스의 정당한 참여자가 아닌 제삼자가 비정상적인 방법으로 암 복호화를 시도하는 것을 암호 해킹이라고 하는데 암호문 단독 공격, 기지 평문 공격, 선택 평문 공격, 선택 암호문 공격 이렇게 4가지로 분류한다 암호문 단독 공격은 공격자가 암호문만을 가지고 평문과 암호키를 찾아내는 방식으로 가장 난도가 높은 공격에 해당한다 기지 평문 공격은 암호문과 평문 일부를 가지고 공격하는 방식이다 선택 평문 공격은 공격자가 암호화를 수행할 수 있는 상태에서 공격을 수행한다 마지막으로 선택 암호문 공격은 공격자가 복호화할 수 있는 상태에서 공격을 수행한다

 

비밀번호를 추출하기 위해서 가장 많이 사용하는 방법의 하나는 무차별 대입 공격(Brute Force Attack)이다 이는 모든 가능한 문자의 조합을 가지고 결과를 추출하는 기법으로 미리 정의된 데이터 사전에서 순서대로 값을 추출 후 대입하면서 비밀번호를 알아낸다 엄밀히 말하면 무차별 대입 공격은 암호 해킹 기법에 속하지는 않지만 사전 지식이 없어도 누구나 손쉽게 응용할 수 있는 유용한 수단이다

 

사회공학 해킹 기술

사회공학 해킹은 기술적인 방법이 아닌 사람들 간의 기본적인 신뢰를 기반으로 비밀정보를 획득하는 기법이다 크게 4가지 범주로 나눌 수 있는데 첫째는 신뢰를 이용하는 것이다 친구로 접근해 믿도록 하거나 위급한 상황에 처한 것처럼 가장해 정보를 빼내는 방법이다 둘째는 약점을 이용하는 것이다 권력 지향적인 인간의 욕구, 돈에 대한 욕망, 사생활에서의 약점을 이용한다 셋째는 무능인데 낮은 보안의식 수준을 이용하는 것이다 서류를 정상적으로 파기하지 않고 휴지통에 버린다든가 책상 위에 기밀서류를 방치하는 행위를 통해 중요 정보를 빼낼 수 있다 마지막은 도청이다 어깨너머로 화면을 훔쳐보거나 전화 통화나 회의를 엿듣는 것을 통해 정보를 탈취할 수 있다

 

사회공학 해킹은 별다른 기술 없이도 손쉽게 정보를 탈취할 수 있는 기법이다 하지만 유출되는 정보는 기술적 해킹 기법을 통한 것 못지않게 기업에 치명적일 수 있다 사회공학 해킹은 기술적인 수단으로 방어할 수 없다 지속적인 교육을 통해 사람들의 보안 수준을 향상하고 해킹 사례를 전파함으로써 사고를 사전에 방지할 수 있다


개요

1. 해커에 대해

 

 

해커란 무엇인가?

해킹은 두 가지 의미가 있는데 하나는 개인의 호기심이나 지적 욕구를 충족시키기 위해 컴퓨터 간의 네트워크를 탐험하는 행위이고 다른 하나는 다른 컴퓨터 시스템을 파괴할 목적으로 침입하는 행위이다

해킹은 이처럼 양면성을 가지고 있으며 해킹하는 사람이라는 뜻이 있는 해커도 두 가지 부류로 나뉜다

기업 시스템의 취약점을 점검하고 악의적인 해킹을 방어하는 화이트 해커가 있고 돈벌이를 목적으로 불법으로 정보를 유출하거나 악의적인 목적으로 시스템을 불능 상태로 만드는 크래커가 있다

 

해커가 하는 일?

  • 취약점 점검 : 퍼징 테스트, 포트 스캐닝 등 다양한 기법을 통해 소프트웨어, 네트워크, 보안 장비, 업무 시스템 등에 대해 취약점을 점검한다 점검 결과를 바탕으로 취약점을 보완한다
  • 침투 테스트 : 침투 테스트는 보안 장비로 보호되는 네트워크 내부로 비정상적인 방법을 통해서 들어가는 것이다 기업의 보안 상태를 점검하기 위해 전문 보안 업체에 의뢰해서 이루어진다
  • 보안 관제 : 보안 관제는 대규모 시스템을 관리하는 대기업이나 데이터 센터에서 이루어진다 모니터링 장비를 통해서 시스템의 정상 동작을 점검하고 네트워크 패킷 분석을 통해 침입을 감지한다
  • 보안 솔루션 개발 : 보안 솔루션은 PC에서 실행되는 백신에서부터 방화벽, IPS, IDS 등에 이르기까지 다양하다 보안 솔루션 개발은 공격 유형의 분석에서부터 시작한다 바이러스가 어떻게 만들어지고 어떻게 시스템을 공격해서 정보를 훔쳐 가는지 알아야 효율적인 솔루션을 만들 수 있다
  • 보안 컨설팅 : 다양한 해킹 경험을 바탕으로 기업 정보시스템을 어떻게 안전하게 유지할지에 대해 구체적인 방안을 제시한다
  • 보안 교육 : 지금은 보안뿐 아니라 해킹을 가르치는 다양한 교육 기관이 존재한다 해커는 이러한 기관에서 공격과 방어에 대한 실무적인 교육을 담당하기도 한다
  • 기업 보안 담당자 : 요즘은 기업의 영업 비밀을 보호하는 차원을 넘어서 국가에서 정보보호를 법률로써 강제하고 있다 몇몇 해커들은 풍부한 해킹 경험을 바탕으로 기업에서 법적 규정을 철저하게 준수하고 있는지 점검하는 정보보안 업무를 수행한다
  • 포렌식 전문가 : 디지털 포렌식은 컴퓨터를 매개로 하는 범죄에서 증거를 확보하는 기술이다 업무 대부분이 스마트폰을 포함한 컴퓨터를 기반으로 이루어지기 때문에 경찰이나 기업에서 포렌식 전문가에 대한 수요가 꾸준히 증가하고 있다

크래커는 이와는 반대로 많은 범죄를 저지른다 불법적으로 기업 내부에 침투해 기술 자료를 유출한다거나 개인정보를 훔쳐서 판매하기도 한다 정치적 목적을 위해 특정 사이트를 해킹해서 자신의 메시지를 심어 놓기도 하고 사이트를 동작 불능 상태로 만들기도 한다 단순한 호기심으로 인터넷에서 내려받은 강력한 해킹 도구를 이용해 웹 사이트를 공격하는 초보적인 크래커들도 많다 악의적이든 그렇지 않든 중요한 것은 크래킹 행위는 불법이며 법적으로 처벌을 받을 수 있는 행위임을 명심해야 한다


2. 왜 파이썬인가?

 

 

파이썬이란

파이썬은 1991년 귀도 반 로섬이라는 프로그래머에 의해서 개발된 고급 범용프로그래밍 언어다 파이썬은 쉽고 직관적인 언어를 지향하면서 동시에 강력한 기능을 지원한다 짧은 시간 안에 효율적인 프로그램을 만들 수 있도록 다양한 특성을 지니고 있다

파이썬은 다양한 프로그래밍 패러다임을 지원한다 객체지향 언어 구조적 언어 절차적 언어 선언적 언어 등 개발자는 기호에 맞는 스타일을 선택해서 개발할 수 있다

파이썬은 인터프리터 언어다 미리 컴파일해서 실행 가능한 형태로 만들어 놓는 컴파일 언어와 다르게 실행 시간에 해석하고 기계어로 변환한다 

요약하면 파이썬은 아름답고 명시적이며 간결하면서 쉽고 가독성 또한 우수한 언어라는 것이다

 

파이썬의 좋은 점

  • 파이썬은 쉽다 : 파이썬은 처음 언어를 접하면서 겪을 수 있는 다양한 어려움을 해결하기 위해 많은 노력을 했다 몇가지 예를 들면 파이썬은 변수형을 선언하지 않고 실행 시간에 동적으로 형이 결정된다 또한 메모리 관리가 필요 없다 인터프리터가 다 알아서 해주기 때문이다 문법도 간단해서 배우기 쉽다
  • 파이썬은 강력하다 : 파이썬은 오픈 소스 언어다 전 세계 개발자가 파이썬을 자발적으로 개선하고 있으며 강력한 라이브러리들이 계속 만들어지고 있다 다른 언어에서 수십 줄의 코딩으로 가능했던 기능들을 파이썬에서는 단지 몇 줄의 코드로 만들 수 있다
  • 파이썬은 유연하다 : 윈도우, 맥, 안드로이드 운영체제에서 모두 파이썬을 사용할 수 있다 단지 운영체제에 맞는 인터프리터를 설치하기만 하면 된다 파이썬은 다른 언어로 개발된 API를 사용할 수 있는 인터페이스를 내장하고 있어 기능을 무한히 확장할 수 있다
  • 파이썬은 개발 속도가 빠르다 : 파이썬은 문법이 간단하고 강력한 라이브러리가 존재하기 때문에 다른 언어에 비해서 빨리 프로그램을 개발할 수 있다 개발 속도는 경쟁이 심하고 타이밍이 중요한 산업분야에서 요구하는 필수적인 요소이다

파이썬 해킹으로 할 수 있는 일

 

 

파이썬 해킹의 장점

해킹을 위해서는 세 가지 분야의 지식이 필요하다 첫 번째는 배경지식이다 언어구조, 운영체제, 네트워크, 컴퓨터구조와 같이 원리를 이해하는 데 필요한 지식이다 두 번째는 해킹 도구를 쓸 수 있어야 한다 취약점을 찾아내서 공격하는 것은 반복적인 일이다 이것을 자동화해주고 복잡한 시스템 구조를 그래픽으로 이해하기 쉽게 나타내 주는 것이 해킹 도구이다 마지막으로 개발 언어를 알아야 한다 아무리 해킹 도구가 강력하다고 할지라도 고난도의 해킹을 하려면 나만의 도구를 만들어야 한다 이때 필요한 것이 개발 언어다 이런 관점에서 파이썬은 다음과 같은 장점을 가지고 있다

  • 해킹을 위한 강력한 모듈을 지원한다 : 파이썬의 강점 중의 하나가 다양한 라이브러리이다 파이썬은 해킹 분야에서도 pydbg, scapy, sqlmap, httplib 등과 같은 다양한 라이브러리를 제공하며 이러한 라이브러리는 현재 해킹에 활발하게 활용되고 있다
  • 다양한 API에 접근할 수 있다 : 파이썬은 ctypes라는 라이브러리를 제공한다 해커는 ctypes을 통해서 윈도우, OS X,리눅스, 솔라리스, FreeBSD, OpenBSD와 같은 다양한 시스템에서 제공하는 DLL과 공유 라이브러리에 접근할 수 있다
  • 많은 해킹 도구에서 파이썬 API를 제공한다 : sqlmap, Nmap, 메타스플로이트등 대표적인 해킹 도구는 파이썬으로 확장할 수 있는 인터페이스를 제공한다 해커는 파이썬을 활용해서 해킹 도구를 보다 더 강력한 도구로 만들 수 있다
  • 쉽게 배울 수 있다 : 쉽게 배울 수 있는 파이썬의 특징은 해킹 측면에서도 커다란 장점으로 다가온다 해커는 3~4개 정도의 언어를 알고 있어야 한다 대표적으로 C언어와 어셈블리어가 있다 두 언어는 시스템과 프로그램 동작을 분석하는 데 핵심적인 역할을 한다 그다음 필요한 것이 자신이 사용할 해킹 도구를 만들 때 필요한 언어다 쉽고 다양한 기능을 지원하는 파이썬이 바로 여기에 딱 들어맞는 해킹 언어다

파이썬 해킹으로 할 수 있는 일

파이썬은 거의 모든 해킹 분야에서 실전에 직접 사용할 수 있는 다양한 모듈을 제공하고 있다

해킹 모듈이 제공되지 않는 분야는 ctypes을 통해 운영체제에서 제공하는 네이티브 API를 호출할 수 있다

한마디로 파이썬으로 해킹할 수 없는 분야는 없다고 보면 된다 애플리케이션, 시스템, 네트워크, 웹 해킹 분야로 나누어서 파이썬으로 할 수 있는 해킹 기법에 대해 알아본다

  • 애플리케이션 해킹 : 동작하는 애플리케이션에 임의의 DLL이나 소스 코드를 삽입할 수 있고 사용자의 키보드 입력을 가로채서 비밀번호를 탈취할 수 있다 또한 이미지 파일에 해킹 코드를 심어 인터넷에 유포할 수도 있다
  • 웹 해킹 : 웹 페이지 안에 들어 있는 링크를 수집하는 웹 크롤러를 만들 수 있고 사용자 입력을 처리하는 부분에 오류 코드를 주입하는 SQL 인젝션을 구현할 수 있다 파이썬으로 간단한 인터넷 브라우저 기능을 구현할 수 있기 때문에 HTTP 패킷을 조작해서 웹 셸 공격에 필요한 파일을 업로드 할 수도 있다
  • 네트워크 해킹 : 열려 있는 포트를 검색하는 풋프린팅이 가능하고 네트워크에 오고 가는 패킷을 수집하고 분석하는 스니핑을 구현할 수 있다 서버의 주소를 위장해서 정보를 알아내는 스푸핑 공격이 가능하며 패킷을 대량으로 발생시켜 서버 기능을 마비시키는 서비스 거부 공격을 실행할 수도 있다
  • 시스템 해킹 : 해커가 사용자 PC를 제어할 수 있는 백도어 개발이 가능하며 PC의 레지스트리를 검색하고 수정할 수 있는 기능을 만들 수 있다 애플리케이션 오류를 이용해서 시스템을 해킹할 수 있는 버퍼 오버플로나 포맷 스트링 공격 또한 가능하다