해당 내용은 에이콘 출판사의 Black Hat Python을 읽고 작성하였습니다. 자세한 내용은 책을 참고하시길 바랍니다.
보안은 컴퓨터에서 굉장히 중요한 요소 중 하나다. 보안이 좋지 못한 컴퓨터는 다른 컴퓨터에 비해서 해킹 가능성이 커진다.
해킹은 대부분 악성코드로 인해서 발생한다. 가장 대표적인 것이 웜 바이러스이며, 랜섬웨어 또한 악성코드이다. 이러한 위험에서 벗어나기 위해서는 항상 보안 수준을 높여야 한다.
우리는 공격자가 되어 공격 방법에 대해서 알아보고 그에 대한 방어 방법에 대해서 같이 알아볼 것이다.
공격자의 입장에서 대상 컴퓨터에 접속하려면 네트워크 통신이 필연적으로 필요하다. 대상 컴퓨터에서 항상 접속할 수 있는 상태로 만들어 두지 않기 때문에 우리는 네트워크 도구를 만들고 다룰 줄 알아야 한다.
여기서는 socket 모듈을 사용해서 통신을 만들어 볼 것이다.
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_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 형식의 데이터를 수신한다.
현재는 그저 데이터를 주고 받는 수준의 코드를 작성했을 뿐이지만 이 코드를 응용한다면 무궁무진하게 사용할 수 있다.
예시를 들자면 침투를 위해서 네트워크 도구를 만들어 타겟 컴퓨터에 설치할 수 있다. 다음 시리즈에서 공부할 넷캣은 통신을 이용해서 상대 컴퓨터의 운영체제에서 명령어를 수행하고 그 결과값을 반환하여 통신을 통해 받아볼 수 있다.