본문 바로가기

Programming/Python Reverse Shell

남의 컴퓨터를 내 마음대로 다룬다? - Python Reverse Shell_003 - Sending Commands to the Client (파이썬 리버스 쉘 - 클라이언트에게 명령어 보내기)

지난 시간까지는 통신을 하기 위한 소켓 생성, 소켓 바인딩, 소켓 수용하는 것 까지 간략히 만들어 보았습니다. 이번 시간에는 멀리 있는 클라이언트 컴퓨터에게 어떤 명령을 전달할지에 관한 부분을 다루어 보도록 하겠습니다.


우선 명령어를 보내기 위한 함수를 정의하겠습니다.

명령어를 일회성으로 보내고 말 것이 아니기에 특정 조건이 들어오기 전까지는 계속 사용하게 할 반복문을 사용하였습니다.

내가(서버) 내릴 명령어를 입력받을 input() 을 넣고 이 값을 cmd(Command)라는 변수에 저장을 하게 하겠습니다.

만약에, 이 cmd 값이 'quit' 라는 입력이 들어오면 상기의 모든 과정을 종료시키게 하려고 합니다. 

if 조건인 cmd == 'quit' 가 만족되면 conn 인 커넥션도 종료하고, 소켓인 s 도 종료하고 sys 도 빠져 나오게 하였습니다.

그리고 이번에는 cmd 값에 어떤 입력값이 들어오면 이루어 질 부분을 정의하도록 하겠습니다. 여기서 cmd 는 01100111001 과 같은 바이트(bytes)로 전달이 되어야합니다. 이는 컴퓨터는 모든 값이 이진비트로 통신을 하기 때문입니다. 그래서 인간이 알고 있는 문자를 바이트로 변환을 해주기 위해 encode() 해줍니다.

이렇게 encode 된 값을 conn 을 통해서 보내주는 펑션 send() 를 사용합니다.

위에서 클라이언트에게 명령어를 보냈습니다. 그러면 클라이언트 컴퓨터에서는 위의 명령을 수행하고 그 결과를 보내올 것입니다. 이를 conn.recv로 받습니다. 그리고 그 버퍼 사이즈를 2048 정도로 정해주고, 인간이 읽을 수 있는 값으로 표현하기 위해 "utf-8"에 따라 문자화로 바꾸어 client_response 변수에 저장하게 합니다.

이렇게 우리가 명령어를 보내고 그 수행 결과를 받아왔으므로, 그 값을 서버(내 컴퓨터)에서 읽을 수 있게 프린트 아웃하게 합니다. 

이제 서버측 명령은 다 이루어 졌습니다. 메인 함수를 정의하고 상기의 함수들을 하나씩 호출하여 실행할 수 있게 합니다.

그리고 최종적으로 이 메인함수를 호출하여 프로그램이 실행되게 합니다.


지금까지 타인의 컴퓨터를 프로그래밍적으로 제어하기 위한 단계 중 서버(내 컴퓨터)에서 실행할 부분을 간략히 다루어 보았습니다. 다음 시간에는 클라이언트(조종당하게 될) 컴퓨터에서 실행될 코드를 다루어 보도록 하겠습니다.