[파이썬 보안] TCP, UDP 통신

애플망고·2023년 5월 19일
0
post-thumbnail

해당 내용은 에이콘 출판사의 Black Hat Python을 읽고 작성하였습니다. 자세한 내용은 책을 참고하시길 바랍니다.

❗️시작하기 전

  • 이 시리즈에서는 파이썬의 기초를 알고 있어야합니다. 파이썬을 배우고 싶다면 위키독스의 점프 투 파이썬을 추천합니다.
  • 이 시리즈에서는 Kali linux를 사용하기에 어느정도 리눅스 사용법을 알고 계셔야합니다.
  • 이 시리즈에서는 네트워크의 기본 지식을 알고 계셔야합니다.
  • 이 시리즈에서는 Kali linux와 Windows 환경을 사용합니다.

🔒 보안이란?

보안은 컴퓨터에서 굉장히 중요한 요소 중 하나다. 보안이 좋지 못한 컴퓨터는 다른 컴퓨터에 비해서 해킹 가능성이 커진다.

해킹은 대부분 악성코드로 인해서 발생한다. 가장 대표적인 것이 웜 바이러스이며, 랜섬웨어 또한 악성코드이다. 이러한 위험에서 벗어나기 위해서는 항상 보안 수준을 높여야 한다.
우리는 공격자가 되어 공격 방법에 대해서 알아보고 그에 대한 방어 방법에 대해서 같이 알아볼 것이다.

🌐 기초 네트워크

공격자의 입장에서 대상 컴퓨터에 접속하려면 네트워크 통신이 필연적으로 필요하다. 대상 컴퓨터에서 항상 접속할 수 있는 상태로 만들어 두지 않기 때문에 우리는 네트워크 도구를 만들고 다룰 줄 알아야 한다.

여기서는 socket 모듈을 사용해서 통신을 만들어 볼 것이다.

TCP 통신

TCP 통신을 하기 위해서 클라이언트가 필요하다.

#TCP_CLIENT.py
import socket

HOST = '0.0.0.0'
PORT = 10101

send_data = input('Type : ')

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))
client.send(send_data.encode('utf-8'))
client.close()

80 포트를 통해서 0.0.0.0 주소로 TCP 통신을 하는 코드이다.

AF_INET : IPv4 사용
SOCK_STREAM : TCP 통신
connect() : 호스트와 포트 설정 후 연결
send() : 데이터 전송

다음 클라이언트와 통신을 할 서버가 필요하다.

#TCP_SERVER.py
import socket

IP = '0.0.0.0'
PORT = 10101

def main():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((IP, PORT))
    server.listen(5)
    print(f'Server is now running. {IP} | {PORT}')
    while True:
        client, address = server.accept()
        print(f'Connected with {address[0]}:{address[1]}')
        data = client.recv(4096)
        print(f'Data : {data.decode("utf-8")}')

if __name__ == '__main__':
    main()

bind() : IP와 PORT 지정
listen() : 요청 대기
accept() : 요청 수락(여러가지 데이터를 수신)
recv() : 데이터 버퍼 사이즈(크기만큼 데이터를 수신)

서버를 먼저 실행한 후 클라이언트를 실행한다. 클라이언트의 send_data 변수에 입력 데이터를 넣고 전송하면 서버에서 데이터를 수신하고 출력하는 코드를 작성해보았다.

UDP 통신

#UDP_CLIENT.py
import socket

HOST = '0.0.0.0'
PORT = 10101

send_data = input('Type : ')

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(send_data.encode(), (HOST, PORT))
data, address = client.recvfrom(4096)
client.close()

SOCK_DGRAM : UDP 통신
recvfrom() : UDP 형식 데이터 수신

UDP 통신에서는 비연결형 프로토콜이기 때문에 connect() 함수를 사용하지 않아도 된다. recvfrom() 함수를 호출해 UDP 형식의 데이터를 수신한다.

현재는 그저 데이터를 주고 받는 수준의 코드를 작성했을 뿐이지만 이 코드를 응용한다면 무궁무진하게 사용할 수 있다.
예시를 들자면 침투를 위해서 네트워크 도구를 만들어 타겟 컴퓨터에 설치할 수 있다. 다음 시리즈에서 공부할 넷캣은 통신을 이용해서 상대 컴퓨터의 운영체제에서 명령어를 수행하고 그 결과값을 반환하여 통신을 통해 받아볼 수 있다.

profile
비전공자의 코딩 도전기

0개의 댓글